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