PERFORCE change 29737 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 25 14:45:28 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=29737
Change 29737 by peter at 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);
More information about the p4-projects
mailing list