From 2f529f9b558ca1c1bd74be7437a84e4711743404 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 01 Nov 2024 02:11:33 +0000 Subject: [PATCH] add xenomai --- kernel/arch/x86/kvm/emulate.c | 65 ++++++++++++++++++++------------ 1 files changed, 41 insertions(+), 24 deletions(-) diff --git a/kernel/arch/x86/kvm/emulate.c b/kernel/arch/x86/kvm/emulate.c index 63efccc..4301a49 100644 --- a/kernel/arch/x86/kvm/emulate.c +++ b/kernel/arch/x86/kvm/emulate.c @@ -1125,23 +1125,27 @@ } } -static void emulator_get_fpu(void) +static unsigned long emulator_get_fpu(void) { - fpregs_lock(); + unsigned long flags = fpregs_lock(); fpregs_assert_state_consistent(); if (test_thread_flag(TIF_NEED_FPU_LOAD)) switch_fpu_return(); + + return flags; } -static void emulator_put_fpu(void) +static void emulator_put_fpu(unsigned long flags) { - fpregs_unlock(); + fpregs_unlock(flags); } static void read_sse_reg(sse128_t *data, int reg) { - emulator_get_fpu(); + unsigned long flags; + + flags = emulator_get_fpu(); switch (reg) { case 0: asm("movdqa %%xmm0, %0" : "=m"(*data)); break; case 1: asm("movdqa %%xmm1, %0" : "=m"(*data)); break; @@ -1163,12 +1167,14 @@ #endif default: BUG(); } - emulator_put_fpu(); + emulator_put_fpu(flags); } static void write_sse_reg(sse128_t *data, int reg) { - emulator_get_fpu(); + unsigned long flags; + + flags = emulator_get_fpu(); switch (reg) { case 0: asm("movdqa %0, %%xmm0" : : "m"(*data)); break; case 1: asm("movdqa %0, %%xmm1" : : "m"(*data)); break; @@ -1190,12 +1196,14 @@ #endif default: BUG(); } - emulator_put_fpu(); + emulator_put_fpu(flags); } static void read_mmx_reg(u64 *data, int reg) { - emulator_get_fpu(); + unsigned long flags; + + flags = emulator_get_fpu(); switch (reg) { case 0: asm("movq %%mm0, %0" : "=m"(*data)); break; case 1: asm("movq %%mm1, %0" : "=m"(*data)); break; @@ -1207,12 +1215,14 @@ case 7: asm("movq %%mm7, %0" : "=m"(*data)); break; default: BUG(); } - emulator_put_fpu(); + emulator_put_fpu(flags); } static void write_mmx_reg(u64 *data, int reg) { - emulator_get_fpu(); + unsigned long flags; + + flags = emulator_get_fpu(); switch (reg) { case 0: asm("movq %0, %%mm0" : : "m"(*data)); break; case 1: asm("movq %0, %%mm1" : : "m"(*data)); break; @@ -1224,30 +1234,33 @@ case 7: asm("movq %0, %%mm7" : : "m"(*data)); break; default: BUG(); } - emulator_put_fpu(); + emulator_put_fpu(flags); } static int em_fninit(struct x86_emulate_ctxt *ctxt) { + unsigned long flags; + if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) return emulate_nm(ctxt); - emulator_get_fpu(); + flags = emulator_get_fpu(); asm volatile("fninit"); - emulator_put_fpu(); + emulator_put_fpu(flags); return X86EMUL_CONTINUE; } static int em_fnstcw(struct x86_emulate_ctxt *ctxt) { + unsigned long flags; u16 fcw; if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) return emulate_nm(ctxt); - emulator_get_fpu(); + flags = emulator_get_fpu(); asm volatile("fnstcw %0": "+m"(fcw)); - emulator_put_fpu(); + emulator_put_fpu(flags); ctxt->dst.val = fcw; @@ -1256,14 +1269,15 @@ static int em_fnstsw(struct x86_emulate_ctxt *ctxt) { + unsigned long flags; u16 fsw; if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM)) return emulate_nm(ctxt); - emulator_get_fpu(); + flags = emulator_get_fpu(); asm volatile("fnstsw %0": "+m"(fsw)); - emulator_put_fpu(); + emulator_put_fpu(flags); ctxt->dst.val = fsw; @@ -4182,17 +4196,18 @@ static int em_fxsave(struct x86_emulate_ctxt *ctxt) { struct fxregs_state fx_state; + unsigned long flags; int rc; rc = check_fxsr(ctxt); if (rc != X86EMUL_CONTINUE) return rc; - emulator_get_fpu(); + flags = emulator_get_fpu(); rc = asm_safe("fxsave %[fx]", , [fx] "+m"(fx_state)); - emulator_put_fpu(); + emulator_put_fpu(flags); if (rc != X86EMUL_CONTINUE) return rc; @@ -4224,6 +4239,7 @@ static int em_fxrstor(struct x86_emulate_ctxt *ctxt) { struct fxregs_state fx_state; + unsigned long flags; int rc; size_t size; @@ -4236,7 +4252,7 @@ if (rc != X86EMUL_CONTINUE) return rc; - emulator_get_fpu(); + flags = emulator_get_fpu(); if (size < __fxstate_size(16)) { rc = fxregs_fixup(&fx_state, size); @@ -4253,7 +4269,7 @@ rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state)); out: - emulator_put_fpu(); + emulator_put_fpu(flags); return rc; } @@ -5498,11 +5514,12 @@ static int flush_pending_x87_faults(struct x86_emulate_ctxt *ctxt) { + unsigned long flags; int rc; - emulator_get_fpu(); + flags = emulator_get_fpu(); rc = asm_safe("fwait"); - emulator_put_fpu(); + emulator_put_fpu(flags); if (unlikely(rc != X86EMUL_CONTINUE)) return emulate_exception(ctxt, MF_VECTOR, 0, false); -- Gitblit v1.6.2