Date: Sat, 10 May 2003 23:55:49 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 30940 for review Message-ID: <200305110655.h4B6tnO5047885@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=30940 Change 30940 by marcel@marcel_nfs on 2003/05/10 23:55:30 o Do not clear the frame flag as it results in an improper trapframe for returning through EPC. o Clear the scratch registers manually and make sure ndirty is 0. o While here, make the diff unreadably by s/frame/tf/ for consistency. Affected files ... .. //depot/projects/ia64_epc/sys/ia64/ia32/ia32_sysvec.c#6 edit Differences ... ==== //depot/projects/ia64_epc/sys/ia64/ia32/ia32_sysvec.c#6 (text+ko) ==== @@ -240,27 +240,27 @@ static void ia32_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings) { - struct trapframe *frame = td->td_frame; + struct trapframe *tf = td->td_frame; vm_offset_t gdt, ldt; u_int64_t codesel, datasel, ldtsel; u_int64_t codeseg, dataseg, gdtseg, ldtseg; 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); + + /* Non-syscall frames are cleared by exec_setregs() */ + if (tf->tf_flags & FRAME_SYSCALL) { + bzero(&tf->tf_scratch, sizeof(tf->tf_scratch)); + bzero(&tf->tf_scratch_fp, sizeof(tf->tf_scratch_fp)); + } else + tf->tf_special.ndirty = 0; - exec_setregs(td, entry, stack, ps_strings); + tf->tf_special.psr |= IA64_PSR_IS; + tf->tf_special.sp = stack; - /* - * Adjust the trapframe according to the ia32 runtime. - */ - frame->tf_special.psr |= IA64_PSR_IS; - frame->tf_special.sp = stack; - frame->tf_special.bspstore = (IA32_PS_STRINGS - ia32_szsigcode - + /* Point the RSE backstore to something harmless. */ + tf->tf_special.bspstore = (IA32_PS_STRINGS - ia32_szsigcode - IA32_USRSPACE + 15) & ~15; codesel = LSEL(LUCODE_SEL, SEL_UPL); @@ -268,9 +268,9 @@ ldtsel = GSEL(GLDT_SEL, SEL_UPL); /* Setup ia32 segment registers. */ - frame->tf_scratch.gr16 = (datasel << 48) | (datasel << 32) | + tf->tf_scratch.gr16 = (datasel << 48) | (datasel << 32) | (datasel << 16) | datasel; - frame->tf_scratch.gr17 = (ldtsel << 32) | (datasel << 16) | codesel; + tf->tf_scratch.gr17 = (ldtsel << 32) | (datasel << 16) | codesel; /* * Build the GDT and LDT. @@ -319,12 +319,12 @@ + (1L << 62) /* 32 bits */ + (1L << 63); /* page granularity */ - frame->tf_scratch.csd = codeseg; - frame->tf_scratch.ssd = dataseg; - frame->tf_scratch.gr24 = dataseg; /* ESD */ - frame->tf_scratch.gr27 = dataseg; /* DSD */ - frame->tf_scratch.gr28 = dataseg; /* FSD */ - frame->tf_scratch.gr29 = dataseg; /* GSD */ + tf->tf_scratch.csd = codeseg; + tf->tf_scratch.ssd = dataseg; + tf->tf_scratch.gr24 = dataseg; /* ESD */ + tf->tf_scratch.gr27 = dataseg; /* DSD */ + tf->tf_scratch.gr28 = dataseg; /* FSD */ + tf->tf_scratch.gr29 = dataseg; /* GSD */ gdtseg = gdt /* base */ + ((8L*NGDT - 1) << 32) /* limit */ @@ -341,15 +341,15 @@ + (0L << 62) /* 16 bits */ + (0L << 63); /* byte granularity */ - frame->tf_scratch.gr30 = ldtseg; /* LDTD */ - frame->tf_scratch.gr31 = gdtseg; /* GDTD */ + tf->tf_scratch.gr30 = ldtseg; /* LDTD */ + tf->tf_scratch.gr31 = gdtseg; /* GDTD */ /* Set ia32 control registers on this processor. */ ia64_set_cflg(CR0_PE | CR0_PG | ((long)(CR4_XMM | CR4_FXSR) << 32)); ia64_set_eflag(PSL_USER); /* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */ - frame->tf_scratch.gr11 = IA32_PS_STRINGS; + tf->tf_scratch.gr11 = IA32_PS_STRINGS; /* * XXX - Linux emulator
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200305110655.h4B6tnO5047885>