PERFORCE change 29755 for review
Peter Wemm
peter at FreeBSD.org
Fri Apr 25 18:22:05 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=29755
Change 29755 by peter at peter_daintree on 2003/04/25 18:21:54
Add a stub 32 bit 'syscall' entry point so that we can point
MSR_CSTAR to it. Note that GUCODE32_SEL exists but does not
have the 'p' (present) bit set, so theoretically this is
impossible.
Affected files ...
.. //depot/projects/hammer/sys/x86_64/x86_64/exception.s#31 edit
.. //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#86 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/x86_64/exception.s#31 (text+ko) ====
@@ -259,6 +259,14 @@
andq $~PCB_FULLCTX,PCB_FLAGS(%rax)
jmp doreti
+/*
+ * Here for CYA insurance, in case a "syscall" instruction gets
+ * issued from 32 bit compatability mode. MSR_CSTAR has to point
+ * to *something* if EFER_SCE is enabled.
+ */
+IDTVEC(fast_syscall32)
+ sysret
+
ENTRY(fork_trampoline)
movq %r12, %rdi /* function */
movq %rbx, %rsi /* arg1 */
==== //depot/projects/hammer/sys/x86_64/x86_64/machdep.c#86 (text+ko) ====
@@ -151,7 +151,7 @@
struct kva_md_info kmi;
static struct trapframe proc0_tf;
-struct pcpu __pcpu;
+static struct pcpu __pcpu;
struct mtx icu_lock;
@@ -653,7 +653,8 @@
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(fast_syscall);
+ IDTVEC(xmm), IDTVEC(int0x80_syscall),
+ IDTVEC(fast_syscall), IDTVEC(fast_syscall32);
void
sdtossd(sd, ssd)
@@ -1260,6 +1261,7 @@
msr = rdmsr(MSR_EFER) | EFER_SCE;
wrmsr(MSR_EFER, msr);
wrmsr(MSR_LSTAR, (u_int64_t)IDTVEC(fast_syscall));
+ wrmsr(MSR_CSTAR, (u_int64_t)IDTVEC(fast_syscall32));
msr = ((u_int64_t)GSEL(GCODE_SEL, SEL_KPL) << 32) |
((u_int64_t)GSEL(GUCODE32_SEL, SEL_UPL) << 48);
wrmsr(MSR_STAR, msr);
More information about the p4-projects
mailing list