Skip site navigation (1)Skip section navigation (2)
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>