PERFORCE change 30929 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sat May 10 17:35:06 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=30929
Change 30929 by marcel at marcel_nfs on 2003/05/10 17:34:36
Get ia32 emulation from the ground again. This currently only
works for the break-based syscall path. The EPC-based syscall
path needs explicit support.
Affected files ...
.. //depot/projects/ia64_epc/sys/ia64/ia32/ia32_sysvec.c#5 edit
.. //depot/projects/ia64_epc/sys/ia64/ia32/ia32_util.h#2 edit
Differences ...
==== //depot/projects/ia64_epc/sys/ia64/ia32/ia32_sysvec.c#5 (text+ko) ====
@@ -86,9 +86,9 @@
0x50, /* pushl %eax */
0xcd, 0x80, /* int $0x80 */
0xeb, 0xfe, /* 0: jmp 0b */
- 0, 0, 0, 0
+ 0
};
-static int ia32_szsigcode = sizeof(ia32_sigcode) & ~3;
+static int ia32_szsigcode = sizeof(ia32_sigcode);
struct sysentvec ia32_freebsd_sysvec = {
SYS_MAXSYSCALL,
@@ -107,8 +107,8 @@
"FreeBSD ELF",
elf32_coredump,
NULL,
- MINSIGSTKSZ,
- 4096,
+ IA32_MINSIGSTKSZ,
+ IA32_PAGE_SIZE,
0,
IA32_USRSTACK,
IA32_USRSTACK,
@@ -147,8 +147,8 @@
*/
arginfo = (struct ia32_ps_strings *)IA32_PS_STRINGS;
szsigcode = *(imgp->proc->p_sysent->sv_szsigcode);
- destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
- roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
+ destp = (caddr_t)arginfo - szsigcode - IA32_USRSPACE -
+ roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
/*
* install sigcode
@@ -187,6 +187,7 @@
/*
* vectp also becomes our initial stack base
*/
+ vectp = (void*)((uintptr_t)vectp & ~15);
stack_base = vectp;
stringp = imgp->stringbase;
@@ -246,14 +247,21 @@
struct segment_descriptor desc;
struct vmspace *vmspace = td->td_proc->p_vmspace;
+ /*
+ * Pretend we entered the kernel due to an exception so that the
+ * trapframe gets initialized for exit through exception_restore.
+ */
+ frame->tf_flags = 0;
+
exec_setregs(td, entry, stack, ps_strings);
/*
- * Mark this process as using the ia32 instruction set and
- * enable the high FP registers by default.
+ * Adjust the trapframe according to the ia32 runtime.
*/
frame->tf_special.psr |= IA64_PSR_IS;
- frame->tf_special.psr &= ~IA64_PSR_DFH;
+ frame->tf_special.sp = stack;
+ frame->tf_special.bspstore = (IA32_PS_STRINGS - ia32_szsigcode -
+ IA32_USRSPACE + 15) & ~15;
codesel = LSEL(LUCODE_SEL, SEL_UPL);
datasel = LSEL(LUDATA_SEL, SEL_UPL);
@@ -268,10 +276,9 @@
* Build the GDT and LDT.
*/
gdt = IA32_USRSTACK;
- vm_map_find(&vmspace->vm_map, 0, 0,
- &gdt, PAGE_SIZE, 0,
- VM_PROT_ALL, VM_PROT_ALL, 0);
- ldt = gdt + 4096;
+ vm_map_find(&vmspace->vm_map, 0, 0, &gdt, IA32_PAGE_SIZE << 1, 0,
+ VM_PROT_ALL, VM_PROT_ALL, 0);
+ ldt = gdt + IA32_PAGE_SIZE;
desc.sd_lolimit = 8*NLDT-1;
desc.sd_lobase = ldt & 0xffffff;
==== //depot/projects/ia64_epc/sys/ia64/ia32/ia32_util.h#2 (text+ko) ====
@@ -44,8 +44,11 @@
int ps_nenvstr; /* the number of environment strings */
};
-#define IA32_USRSTACK (4L*1024*1024*1024 - PAGE_SIZE)
-#define IA32_PS_STRINGS (IA32_USRSTACK - sizeof(struct ia32_ps_strings))
+#define IA32_MINSIGSTKSZ 2048
+#define IA32_PAGE_SIZE 4096
+#define IA32_USRSTACK (2L*1024*1024*1024 - IA32_PAGE_SIZE*2)
+#define IA32_PS_STRINGS (IA32_USRSTACK - sizeof(struct ia32_ps_strings))
+#define IA32_USRSPACE IA32_PAGE_SIZE
static __inline caddr_t stackgap_init(void);
static __inline void *stackgap_alloc(caddr_t *, size_t);
@@ -54,7 +57,7 @@
stackgap_init()
{
#define szsigcode (*(curproc->p_sysent->sv_szsigcode))
- return (caddr_t)(((caddr_t)IA32_PS_STRINGS) - szsigcode - SPARE_USRSPACE);
+ return (((caddr_t)IA32_PS_STRINGS) - szsigcode - IA32_USRSPACE);
#undef szsigcode
}
More information about the p4-projects
mailing list