hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/x86/kvm/emulate.c
....@@ -1125,23 +1125,27 @@
11251125 }
11261126 }
11271127
1128
-static void emulator_get_fpu(void)
1128
+static unsigned long emulator_get_fpu(void)
11291129 {
1130
- fpregs_lock();
1130
+ unsigned long flags = fpregs_lock();
11311131
11321132 fpregs_assert_state_consistent();
11331133 if (test_thread_flag(TIF_NEED_FPU_LOAD))
11341134 switch_fpu_return();
1135
+
1136
+ return flags;
11351137 }
11361138
1137
-static void emulator_put_fpu(void)
1139
+static void emulator_put_fpu(unsigned long flags)
11381140 {
1139
- fpregs_unlock();
1141
+ fpregs_unlock(flags);
11401142 }
11411143
11421144 static void read_sse_reg(sse128_t *data, int reg)
11431145 {
1144
- emulator_get_fpu();
1146
+ unsigned long flags;
1147
+
1148
+ flags = emulator_get_fpu();
11451149 switch (reg) {
11461150 case 0: asm("movdqa %%xmm0, %0" : "=m"(*data)); break;
11471151 case 1: asm("movdqa %%xmm1, %0" : "=m"(*data)); break;
....@@ -1163,12 +1167,14 @@
11631167 #endif
11641168 default: BUG();
11651169 }
1166
- emulator_put_fpu();
1170
+ emulator_put_fpu(flags);
11671171 }
11681172
11691173 static void write_sse_reg(sse128_t *data, int reg)
11701174 {
1171
- emulator_get_fpu();
1175
+ unsigned long flags;
1176
+
1177
+ flags = emulator_get_fpu();
11721178 switch (reg) {
11731179 case 0: asm("movdqa %0, %%xmm0" : : "m"(*data)); break;
11741180 case 1: asm("movdqa %0, %%xmm1" : : "m"(*data)); break;
....@@ -1190,12 +1196,14 @@
11901196 #endif
11911197 default: BUG();
11921198 }
1193
- emulator_put_fpu();
1199
+ emulator_put_fpu(flags);
11941200 }
11951201
11961202 static void read_mmx_reg(u64 *data, int reg)
11971203 {
1198
- emulator_get_fpu();
1204
+ unsigned long flags;
1205
+
1206
+ flags = emulator_get_fpu();
11991207 switch (reg) {
12001208 case 0: asm("movq %%mm0, %0" : "=m"(*data)); break;
12011209 case 1: asm("movq %%mm1, %0" : "=m"(*data)); break;
....@@ -1207,12 +1215,14 @@
12071215 case 7: asm("movq %%mm7, %0" : "=m"(*data)); break;
12081216 default: BUG();
12091217 }
1210
- emulator_put_fpu();
1218
+ emulator_put_fpu(flags);
12111219 }
12121220
12131221 static void write_mmx_reg(u64 *data, int reg)
12141222 {
1215
- emulator_get_fpu();
1223
+ unsigned long flags;
1224
+
1225
+ flags = emulator_get_fpu();
12161226 switch (reg) {
12171227 case 0: asm("movq %0, %%mm0" : : "m"(*data)); break;
12181228 case 1: asm("movq %0, %%mm1" : : "m"(*data)); break;
....@@ -1224,30 +1234,33 @@
12241234 case 7: asm("movq %0, %%mm7" : : "m"(*data)); break;
12251235 default: BUG();
12261236 }
1227
- emulator_put_fpu();
1237
+ emulator_put_fpu(flags);
12281238 }
12291239
12301240 static int em_fninit(struct x86_emulate_ctxt *ctxt)
12311241 {
1242
+ unsigned long flags;
1243
+
12321244 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
12331245 return emulate_nm(ctxt);
12341246
1235
- emulator_get_fpu();
1247
+ flags = emulator_get_fpu();
12361248 asm volatile("fninit");
1237
- emulator_put_fpu();
1249
+ emulator_put_fpu(flags);
12381250 return X86EMUL_CONTINUE;
12391251 }
12401252
12411253 static int em_fnstcw(struct x86_emulate_ctxt *ctxt)
12421254 {
1255
+ unsigned long flags;
12431256 u16 fcw;
12441257
12451258 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
12461259 return emulate_nm(ctxt);
12471260
1248
- emulator_get_fpu();
1261
+ flags = emulator_get_fpu();
12491262 asm volatile("fnstcw %0": "+m"(fcw));
1250
- emulator_put_fpu();
1263
+ emulator_put_fpu(flags);
12511264
12521265 ctxt->dst.val = fcw;
12531266
....@@ -1256,14 +1269,15 @@
12561269
12571270 static int em_fnstsw(struct x86_emulate_ctxt *ctxt)
12581271 {
1272
+ unsigned long flags;
12591273 u16 fsw;
12601274
12611275 if (ctxt->ops->get_cr(ctxt, 0) & (X86_CR0_TS | X86_CR0_EM))
12621276 return emulate_nm(ctxt);
12631277
1264
- emulator_get_fpu();
1278
+ flags = emulator_get_fpu();
12651279 asm volatile("fnstsw %0": "+m"(fsw));
1266
- emulator_put_fpu();
1280
+ emulator_put_fpu(flags);
12671281
12681282 ctxt->dst.val = fsw;
12691283
....@@ -4182,17 +4196,18 @@
41824196 static int em_fxsave(struct x86_emulate_ctxt *ctxt)
41834197 {
41844198 struct fxregs_state fx_state;
4199
+ unsigned long flags;
41854200 int rc;
41864201
41874202 rc = check_fxsr(ctxt);
41884203 if (rc != X86EMUL_CONTINUE)
41894204 return rc;
41904205
4191
- emulator_get_fpu();
4206
+ flags = emulator_get_fpu();
41924207
41934208 rc = asm_safe("fxsave %[fx]", , [fx] "+m"(fx_state));
41944209
4195
- emulator_put_fpu();
4210
+ emulator_put_fpu(flags);
41964211
41974212 if (rc != X86EMUL_CONTINUE)
41984213 return rc;
....@@ -4224,6 +4239,7 @@
42244239 static int em_fxrstor(struct x86_emulate_ctxt *ctxt)
42254240 {
42264241 struct fxregs_state fx_state;
4242
+ unsigned long flags;
42274243 int rc;
42284244 size_t size;
42294245
....@@ -4236,7 +4252,7 @@
42364252 if (rc != X86EMUL_CONTINUE)
42374253 return rc;
42384254
4239
- emulator_get_fpu();
4255
+ flags = emulator_get_fpu();
42404256
42414257 if (size < __fxstate_size(16)) {
42424258 rc = fxregs_fixup(&fx_state, size);
....@@ -4253,7 +4269,7 @@
42534269 rc = asm_safe("fxrstor %[fx]", : [fx] "m"(fx_state));
42544270
42554271 out:
4256
- emulator_put_fpu();
4272
+ emulator_put_fpu(flags);
42574273
42584274 return rc;
42594275 }
....@@ -5498,11 +5514,12 @@
54985514
54995515 static int flush_pending_x87_faults(struct x86_emulate_ctxt *ctxt)
55005516 {
5517
+ unsigned long flags;
55015518 int rc;
55025519
5503
- emulator_get_fpu();
5520
+ flags = emulator_get_fpu();
55045521 rc = asm_safe("fwait");
5505
- emulator_put_fpu();
5522
+ emulator_put_fpu(flags);
55065523
55075524 if (unlikely(rc != X86EMUL_CONTINUE))
55085525 return emulate_exception(ctxt, MF_VECTOR, 0, false);