commit e6a20ee66da70b356f7582ec6d074935ae27be86 Author: Dan Cross Date: Thu Sep 23 13:42:22 2021 +0000 Implement safe rdmsr for amd64 Port the safe version of rdmsr to k10. Tested: Builds under plan9. Signed-off-by: Dan Cross diff --git a/sys/src/9k/k10/l64v.s b/sys/src/9k/k10/l64v.s index 813ceb98b..73e61e7ff 100644 --- a/sys/src/9k/k10/l64v.s +++ b/sys/src/9k/k10/l64v.s @@ -175,11 +175,17 @@ TEXT rdtsc(SB), 1, $-4 /* Time Stamp Counter */ TEXT rdmsr(SB), 1, $-4 /* Model-Specific Register */ MOVL RARG, CX +TEXT mayberdmsr(SB), 0, $-4 RDMSR +_rdmsrret: XCHGL DX, AX /* swap lo/hi, zero-extend */ SHLQ $32, AX /* hi<<32 */ ORQ DX, AX /* (hi<<32)|lo */ RET +TEXT rdmsrfail(SB), 0, $-4 + MOVL $0xffffffff, AX + MOVL AX, DX + JMP _rdmsrret TEXT wrmsr(SB), 1, $-4 MOVL RARG, CX diff --git a/sys/src/9k/k10/trap.c b/sys/src/9k/k10/trap.c index 772d17763..51c1e2627 100644 --- a/sys/src/9k/k10/trap.c +++ b/sys/src/9k/k10/trap.c @@ -15,6 +15,7 @@ extern int notify(Ureg*); static void debugbpt(Ureg*, void*); +static void faultgpf(Ureg*, void*); static void faultamd64(Ureg*, void*); static void doublefault(Ureg*, void*); static void unexpected(Ureg*, void*); @@ -190,6 +191,7 @@ trapinit(void) * Syscall() is called directly without going through trap(). */ trapenable(IdtBP, debugbpt, 0, "#BP"); + trapenable(IdtGP, faultgpf, 0, "#GP"); trapenable(IdtPF, faultamd64, 0, "#PF"); trapenable(IdtDF, doublefault, 0, "#DF"); trapenable(Idt0F, unexpected, 0, "#15"); @@ -528,6 +530,17 @@ unexpected(Ureg* ureg, void*) iprint("unexpected trap %llud; ignoring\n", ureg->type); } +extern void mayberdmsr(void); +extern void rdmsrfail(void); + +static void +faultgpf(Ureg* ureg, void*) +{ + if(ureg->ip != (u64int)mayberdmsr) + panic("unhandled GPF at 0x%016llux", ureg->ip); + ureg->ip = (u64int)rdmsrfail; +} + static void faultamd64(Ureg* ureg, void*) {