Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Apr 2003 14:45:25 -0700 (PDT)
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 29737 for review
Message-ID:  <200304252145.h3PLjPT0054066@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=29737

Change 29737 by peter@peter_daintree on 2003/04/25 14:45:09

	enable syscall instruction.  Note that MSR_LSTAR isn't set, so that
	when compatability mode is enabled, it must point to something.

Affected files ...

.. //depot/projects/hammer/sys/x86_64/x86_64/exception.s#25 edit
.. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#83 edit

Differences ...

==== //depot/projects/hammer/sys/x86_64/x86_64/exception.s#25 (text+ko) ====

@@ -251,7 +251,7 @@
 	movq	TF_RIP(%rsp),%rcx	/* original %rip */
 	sti
 	#swapgs
-	sysret
+	sysretq
 
 ENTRY(fork_trampoline)
 	movq	%r12, %rdi		/* function */

==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#83 (text+ko) ====

@@ -643,7 +643,7 @@
 	IDTVEC(bnd), IDTVEC(ill), IDTVEC(dna), IDTVEC(fpusegm),
 	IDTVEC(tss), IDTVEC(missing), IDTVEC(stk), IDTVEC(prot),
 	IDTVEC(page), IDTVEC(mchk), IDTVEC(rsvd), IDTVEC(fpu), IDTVEC(align),
-	IDTVEC(xmm), IDTVEC(int0x80_syscall);
+	IDTVEC(xmm), IDTVEC(int0x80_syscall), IDTVEC(fast_syscall);
 
 void
 sdtossd(sd, ssd)
@@ -1118,7 +1118,11 @@
 	int gsel_tss, off, x;
 	struct region_descriptor r_gdt, r_idt;
 	struct pcpu *pc;
+	u_int64_t msr;
 
+	/* Turn on PTE NX (no execute) bit */
+	msr = rdmsr(MSR_EFER) | EFER_NXE;
+	wrmsr(MSR_EFER, msr);
 	create_pagetables();
 
 	/* XXX do %cr0 as well */
@@ -1242,6 +1246,14 @@
 	gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
 	ltr(gsel_tss);
 
+	/* Set up the fast syscall stuff */
+	msr = rdmsr(MSR_EFER) | EFER_SCE;
+	wrmsr(MSR_EFER, msr);
+	wrmsr(MSR_LSTAR, (uint64_t)IDTVEC(fast_syscall));
+	msr = ((u_int64_t)GSEL(GCODE_SEL, SEL_KPL) << 32) |
+	      ((u_int64_t)GSEL(GUCODE_SEL, SEL_UPL) << 48);
+	wrmsr(MSR_STAR, msr);
+
 	getmemsize(kmdp, physfree);
 	init_param2(physmem);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304252145.h3PLjPT0054066>