target/i386: emulate: propagate errors all the way and stop early
This ended up being a bigger patch than I thought it'd be... Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr> Link: https://lore.kernel.org/r/20260223233950.96076-29-mohamed@unpredictable.fr Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Mohamed Mediouni committed
Feb 24, 2026 at 00:39 UTC
f5b03da29f9eb2fe88d96fcf17dab730f19c184e
2 files changed
+160
-85
target/i386/emulate/x86_emu.c
+151
-76
@@ -47,7 +47,9 @@
47
48
#define EXEC_2OP_FLAGS_CMD(env, decode, cmd, FLAGS_FUNC, save_res) \
49
{ \
50
- fetch_operands(env, decode, 2, true, true, false); \
50
+ if (fetch_operands(env, decode, 2, true, true, false)) {\
51
+ return 1; \
52
+ }\
53
switch (decode->operand_size) { \
54
case 1: \
55
{ \
@@ -55,7 +57,7 @@
57
uint8_t v2 = (uint8_t)decode->op[1].val; \
58
uint8_t diff = v1 cmd v2; \
59
if (save_res) { \
58
- write_val_ext(env, &decode->op[0], diff, 1); \
60
+ if (write_val_ext(env, &decode->op[0], diff, 1)) { return 1; } \
61
} \
62
FLAGS_FUNC##8(env, v1, v2, diff); \
63
break; \
@@ -66,7 +68,7 @@
68
uint16_t v2 = (uint16_t)decode->op[1].val; \
69
uint16_t diff = v1 cmd v2; \
70
if (save_res) { \
69
- write_val_ext(env, &decode->op[0], diff, 2); \
71
+ if (write_val_ext(env, &decode->op[0], diff, 2)) { return 1; } \
72
} \
73
FLAGS_FUNC##16(env, v1, v2, diff); \
74
break; \
@@ -77,7 +79,7 @@
79
uint32_t v2 = (uint32_t)decode->op[1].val; \
80
uint32_t diff = v1 cmd v2; \
81
if (save_res) { \
80
- write_val_ext(env, &decode->op[0], diff, 4); \
82
+ if (write_val_ext(env, &decode->op[0], diff, 4)) { return 1; } \
83
} \
84
FLAGS_FUNC##32(env, v1, v2, diff); \
85
break; \
@@ -167,13 +169,20 @@ void write_val_to_reg(void *reg_ptr, target_ulong val, int size)
169
}
170
}
171
170
-void write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_ulong val, int size)
172
+bool write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_ulong val, int size)
173
{
174
if (decode->type == X86_VAR_REG) {
175
write_val_to_reg(decode->regptr, val, size);
176
} else {
175
- x86_write_mem(env_cpu(env), &val, decode->addr, size);
177
+ MMUTranslateResult res = x86_write_mem(env_cpu(env), &val, decode->addr, size);
178
+ if (res) {
179
+ if (res == MMU_TRANSLATE_GPA_UNMAPPED) {
180
+ return 0;
181
+ }
182
+ return 1;
183
+ }
184
}
185
+ return 0;
186
}
187
188
uint8_t *read_mmio(CPUX86State *env, target_ulong ptr, int bytes)
@@ -218,20 +227,19 @@ static bool read_val_from_mem(CPUX86State *env, target_long ptr, int size, targe
227
return 0;
228
}
229
221
-target_ulong read_val_ext(CPUX86State *env, struct x86_decode_op *decode, int size)
230
+bool read_val_ext(CPUX86State *env, struct x86_decode_op *decode, int size, target_ulong* val)
231
{
223
- target_ulong val;
232
if (decode->type == X86_VAR_REG) {
225
- return read_val_from_reg(decode->regptr, size);
233
+ *val = read_val_from_reg(decode->regptr, size);
234
} else {
227
- if (read_val_from_mem(env, decode->addr, size, &val)) {
228
- error_report("target/i386/emulate: read_val_ext: reading from unmapped address.");
235
+ if (read_val_from_mem(env, decode->addr, size, val)) {
236
+ return 1;
237
}
230
- return val;
238
}
239
+ return 0;
240
}
241
234
-static void fetch_operands(CPUX86State *env, struct x86_decode *decode,
242
+static bool fetch_operands(CPUX86State *env, struct x86_decode *decode,
243
int n, bool val_op0, bool val_op1, bool val_op2)
244
{
245
int i;
@@ -251,8 +259,10 @@ static void fetch_operands(CPUX86State *env, struct x86_decode *decode,
259
case X86_VAR_RM:
260
calc_modrm_operand(env, decode, &decode->op[i]);
261
if (calc_val[i]) {
254
- decode->op[i].val = read_val_ext(env, &decode->op[i],
255
- decode->operand_size);
262
+ if (read_val_ext(env, &decode->op[i],decode->operand_size,
263
+ &decode->op[i].val)) {
264
+ return 1;
265
+ }
266
}
267
break;
268
case X86_VAR_OFFSET:
@@ -260,68 +270,81 @@ static void fetch_operands(CPUX86State *env, struct x86_decode *decode,
270
decode->op[i].addr,
271
R_DS);
272
if (calc_val[i]) {
263
- decode->op[i].val = read_val_ext(env, &decode->op[i],
264
- decode->operand_size);
273
+ if (read_val_ext(env, &decode->op[i], decode->operand_size,
274
+ &decode->op[i].val)) {
275
+ return 1;
276
+ }
277
}
278
break;
279
default:
280
break;
281
}
282
}
283
+ return 0;
284
}
285
273
-static void exec_mov(CPUX86State *env, struct x86_decode *decode)
286
+static bool exec_mov(CPUX86State *env, struct x86_decode *decode)
287
{
288
fetch_operands(env, decode, 2, false, true, false);
276
- write_val_ext(env, &decode->op[0], decode->op[1].val,
277
- decode->operand_size);
289
+ if (write_val_ext(env, &decode->op[0], decode->op[1].val,
290
+ decode->operand_size)) {
291
+ return 1;
292
+ }
293
294
env->eip += decode->len;
295
+ return 0;
296
}
297
282
-static void exec_add(CPUX86State *env, struct x86_decode *decode)
298
+static bool exec_add(CPUX86State *env, struct x86_decode *decode)
299
{
300
EXEC_2OP_FLAGS_CMD(env, decode, +, SET_FLAGS_OSZAPC_ADD, true);
301
env->eip += decode->len;
302
+ return 0;
303
}
304
288
-static void exec_or(CPUX86State *env, struct x86_decode *decode)
305
+static bool exec_or(CPUX86State *env, struct x86_decode *decode)
306
{
307
EXEC_2OP_FLAGS_CMD(env, decode, |, SET_FLAGS_OSZAPC_LOGIC, true);
308
env->eip += decode->len;
309
+ return 0;
310
}
311
294
-static void exec_adc(CPUX86State *env, struct x86_decode *decode)
312
+static bool exec_adc(CPUX86State *env, struct x86_decode *decode)
313
{
314
EXEC_2OP_FLAGS_CMD(env, decode, +get_CF(env)+, SET_FLAGS_OSZAPC_ADD, true);
315
env->eip += decode->len;
316
+ return 0;
317
}
318
300
-static void exec_sbb(CPUX86State *env, struct x86_decode *decode)
319
+static bool exec_sbb(CPUX86State *env, struct x86_decode *decode)
320
{
321
EXEC_2OP_FLAGS_CMD(env, decode, -get_CF(env)-, SET_FLAGS_OSZAPC_SUB, true);
322
env->eip += decode->len;
323
+ return 0;
324
}
325
306
-static void exec_and(CPUX86State *env, struct x86_decode *decode)
326
+static bool exec_and(CPUX86State *env, struct x86_decode *decode)
327
{
328
EXEC_2OP_FLAGS_CMD(env, decode, &, SET_FLAGS_OSZAPC_LOGIC, true);
329
env->eip += decode->len;
330
+ return 0;
331
}
332
312
-static void exec_sub(CPUX86State *env, struct x86_decode *decode)
333
+static bool exec_sub(CPUX86State *env, struct x86_decode *decode)
334
{
335
EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, true);
336
env->eip += decode->len;
337
+ return 0;
338
}
339
318
-static void exec_xor(CPUX86State *env, struct x86_decode *decode)
340
+static bool exec_xor(CPUX86State *env, struct x86_decode *decode)
341
{
342
EXEC_2OP_FLAGS_CMD(env, decode, ^, SET_FLAGS_OSZAPC_LOGIC, true);
343
env->eip += decode->len;
344
+ return 0;
345
}
346
324
-static void exec_neg(CPUX86State *env, struct x86_decode *decode)
347
+static bool exec_neg(CPUX86State *env, struct x86_decode *decode)
348
{
349
/*EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false);*/
350
int32_t val;
@@ -342,15 +365,17 @@ static void exec_neg(CPUX86State *env, struct x86_decode *decode)
365
366
/*lflags_to_rflags(env);*/
367
env->eip += decode->len;
368
+ return 0;
369
}
370
347
-static void exec_cmp(CPUX86State *env, struct x86_decode *decode)
371
+static bool exec_cmp(CPUX86State *env, struct x86_decode *decode)
372
{
373
EXEC_2OP_FLAGS_CMD(env, decode, -, SET_FLAGS_OSZAPC_SUB, false);
374
env->eip += decode->len;
375
+ return 0;
376
}
377
353
-static void exec_inc(CPUX86State *env, struct x86_decode *decode)
378
+static bool exec_inc(CPUX86State *env, struct x86_decode *decode)
379
{
380
decode->op[1].type = X86_VAR_IMMEDIATE;
381
decode->op[1].val = 0;
@@ -358,33 +383,37 @@ static void exec_inc(CPUX86State *env, struct x86_decode *decode)
383
EXEC_2OP_FLAGS_CMD(env, decode, +1+, SET_FLAGS_OSZAP_ADD, true);
384
385
env->eip += decode->len;
386
+ return 0;
387
}
388
363
-static void exec_dec(CPUX86State *env, struct x86_decode *decode)
389
+static bool exec_dec(CPUX86State *env, struct x86_decode *decode)
390
{
391
decode->op[1].type = X86_VAR_IMMEDIATE;
392
decode->op[1].val = 0;
393
394
EXEC_2OP_FLAGS_CMD(env, decode, -1-, SET_FLAGS_OSZAP_SUB, true);
395
env->eip += decode->len;
396
+ return 0;
397
}
398
372
-static void exec_tst(CPUX86State *env, struct x86_decode *decode)
399
+static bool exec_tst(CPUX86State *env, struct x86_decode *decode)
400
{
401
EXEC_2OP_FLAGS_CMD(env, decode, &, SET_FLAGS_OSZAPC_LOGIC, false);
402
env->eip += decode->len;
403
+ return 0;
404
}
405
378
-static void exec_not(CPUX86State *env, struct x86_decode *decode)
406
+static bool exec_not(CPUX86State *env, struct x86_decode *decode)
407
{
408
fetch_operands(env, decode, 1, true, false, false);
409
410
write_val_ext(env, &decode->op[0], ~decode->op[0].val,
411
decode->operand_size);
412
env->eip += decode->len;
413
+ return 0;
414
}
415
387
-void exec_movzx(CPUX86State *env, struct x86_decode *decode)
416
+bool exec_movzx(CPUX86State *env, struct x86_decode *decode)
417
{
418
int src_op_size;
419
int op_size = decode->operand_size;
@@ -398,13 +427,16 @@ void exec_movzx(CPUX86State *env, struct x86_decode *decode)
427
}
428
decode->operand_size = src_op_size;
429
calc_modrm_operand(env, decode, &decode->op[1]);
401
- decode->op[1].val = read_val_ext(env, &decode->op[1], src_op_size);
430
+ if (read_val_ext(env, &decode->op[1], src_op_size, &decode->op[1].val)) {
431
+ return 1;
432
+ }
433
write_val_ext(env, &decode->op[0], decode->op[1].val, op_size);
434
435
env->eip += decode->len;
436
+ return 0;
437
}
438
407
-static void exec_out(CPUX86State *env, struct x86_decode *decode)
439
+static bool exec_out(CPUX86State *env, struct x86_decode *decode)
440
{
441
switch (decode->opcode[0]) {
442
case 0xe6:
@@ -426,9 +458,10 @@ static void exec_out(CPUX86State *env, struct x86_decode *decode)
458
break;
459
}
460
env->eip += decode->len;
461
+ return 0;
462
}
463
431
-static void exec_in(CPUX86State *env, struct x86_decode *decode)
464
+static bool exec_in(CPUX86State *env, struct x86_decode *decode)
465
{
466
target_ulong val = 0;
467
switch (decode->opcode[0]) {
@@ -463,6 +496,7 @@ static void exec_in(CPUX86State *env, struct x86_decode *decode)
496
}
497
498
env->eip += decode->len;
499
+ return 0;
500
}
501
502
static inline void string_increment_reg(CPUX86State *env, int reg,
@@ -523,7 +557,7 @@ static bool exec_ins_single(CPUX86State *env, struct x86_decode *decode)
557
return 0;
558
}
559
526
-static void exec_ins(CPUX86State *env, struct x86_decode *decode)
560
+static bool exec_ins(CPUX86State *env, struct x86_decode *decode)
561
{
562
bool res;
563
if (decode->rep) {
@@ -533,9 +567,10 @@ static void exec_ins(CPUX86State *env, struct x86_decode *decode)
567
}
568
569
if (res) {
536
- return;
570
+ return 1;
571
}
572
env->eip += decode->len;
573
+ return 0;
574
}
575
576
static bool exec_outs_single(CPUX86State *env, struct x86_decode *decode)
@@ -551,7 +586,7 @@ static bool exec_outs_single(CPUX86State *env, struct x86_decode *decode)
586
return 0;
587
}
588
554
-static void exec_outs(CPUX86State *env, struct x86_decode *decode)
589
+static bool exec_outs(CPUX86State *env, struct x86_decode *decode)
590
{
591
bool res;
592
if (decode->rep) {
@@ -561,9 +596,10 @@ static void exec_outs(CPUX86State *env, struct x86_decode *decode)
596
}
597
598
if (res) {
564
- return;
599
+ return 1;
600
}
601
env->eip += decode->len;
602
+ return 0;
603
}
604
605
static bool exec_movs_single(CPUX86State *env, struct x86_decode *decode)
@@ -590,7 +626,7 @@ static bool exec_movs_single(CPUX86State *env, struct x86_decode *decode)
626
return 0;
627
}
628
593
-static void exec_movs(CPUX86State *env, struct x86_decode *decode)
629
+static bool exec_movs(CPUX86State *env, struct x86_decode *decode)
630
{
631
bool res;
632
if (decode->rep) {
@@ -600,9 +636,10 @@ static void exec_movs(CPUX86State *env, struct x86_decode *decode)
636
}
637
638
if (res) {
603
- return;
639
+ return 1;
640
}
641
env->eip += decode->len;
642
+ return 0;
643
}
644
645
static bool exec_cmps_single(CPUX86State *env, struct x86_decode *decode)
@@ -630,7 +667,7 @@ static bool exec_cmps_single(CPUX86State *env, struct x86_decode *decode)
667
return 0;
668
}
669
633
-static void exec_cmps(CPUX86State *env, struct x86_decode *decode)
670
+static bool exec_cmps(CPUX86State *env, struct x86_decode *decode)
671
{
672
if (decode->rep) {
673
string_rep(env, decode, exec_cmps_single, decode->rep);
@@ -638,6 +675,7 @@ static void exec_cmps(CPUX86State *env, struct x86_decode *decode)
675
exec_cmps_single(env, decode);
676
}
677
env->eip += decode->len;
678
+ return 0;
679
}
680
681
@@ -660,7 +698,7 @@ static bool exec_stos_single(CPUX86State *env, struct x86_decode *decode)
698
}
699
700
663
-static void exec_stos(CPUX86State *env, struct x86_decode *decode)
701
+static bool exec_stos(CPUX86State *env, struct x86_decode *decode)
702
{
703
if (decode->rep) {
704
string_rep(env, decode, exec_stos_single, 0);
@@ -669,6 +707,7 @@ static void exec_stos(CPUX86State *env, struct x86_decode *decode)
707
}
708
709
env->eip += decode->len;
710
+ return 0;
711
}
712
713
static bool exec_scas_single(CPUX86State *env, struct x86_decode *decode)
@@ -685,7 +724,7 @@ static bool exec_scas_single(CPUX86State *env, struct x86_decode *decode)
724
return 0;
725
}
726
688
-static void exec_scas(CPUX86State *env, struct x86_decode *decode)
727
+static bool exec_scas(CPUX86State *env, struct x86_decode *decode)
728
{
729
decode->op[0].type = X86_VAR_REG;
730
decode->op[0].reg = R_EAX;
@@ -696,6 +735,7 @@ static void exec_scas(CPUX86State *env, struct x86_decode *decode)
735
}
736
737
env->eip += decode->len;
738
+ return 0;
739
}
740
741
static bool exec_lods_single(CPUX86State *env, struct x86_decode *decode)
@@ -711,7 +751,7 @@ static bool exec_lods_single(CPUX86State *env, struct x86_decode *decode)
751
return 0;
752
}
753
714
-static void exec_lods(CPUX86State *env, struct x86_decode *decode)
754
+static bool exec_lods(CPUX86State *env, struct x86_decode *decode)
755
{
756
if (decode->rep) {
757
string_rep(env, decode, exec_lods_single, 0);
@@ -720,6 +760,7 @@ static void exec_lods(CPUX86State *env, struct x86_decode *decode)
760
}
761
762
env->eip += decode->len;
763
+ return 0;
764
}
765
766
void x86_emul_raise_exception(CPUX86State *env, int exception_index, int error_code)
@@ -730,23 +771,25 @@ void x86_emul_raise_exception(CPUX86State *env, int exception_index, int error_c
771
env->exception_injected = 1;
772
}
773
733
-static void exec_rdmsr(CPUX86State *env, struct x86_decode *decode)
774
+static bool exec_rdmsr(CPUX86State *env, struct x86_decode *decode)
775
{
776
emul_ops->simulate_rdmsr(env_cpu(env));
777
env->eip += decode->len;
778
+ return 0;
779
}
780
739
-static void exec_wrmsr(CPUX86State *env, struct x86_decode *decode)
781
+static bool exec_wrmsr(CPUX86State *env, struct x86_decode *decode)
782
{
783
emul_ops->simulate_wrmsr(env_cpu(env));
784
env->eip += decode->len;
785
+ return 0;
786
}
787
788
/*
789
* flag:
790
* 0 - bt, 1 - btc, 2 - bts, 3 - btr
791
*/
749
-static void do_bt(CPUX86State *env, struct x86_decode *decode, int flag)
792
+static bool do_bt(CPUX86State *env, struct x86_decode *decode, int flag)
793
{
794
int32_t displacement;
795
uint8_t index;
@@ -755,7 +798,9 @@ static void do_bt(CPUX86State *env, struct x86_decode *decode, int flag)
798
799
VM_PANIC_ON(decode->rex.rex);
800
758
- fetch_operands(env, decode, 2, false, true, false);
801
+ if (fetch_operands(env, decode, 2, false, true, false)) {
802
+ return 1;
803
+ }
804
index = decode->op[1].val & mask;
805
806
if (decode->op[0].type != X86_VAR_REG) {
@@ -769,14 +814,16 @@ static void do_bt(CPUX86State *env, struct x86_decode *decode, int flag)
814
VM_PANIC("bt 64bit\n");
815
}
816
}
772
- decode->op[0].val = read_val_ext(env, &decode->op[0],
773
- decode->operand_size);
817
+ if (read_val_ext(env, &decode->op[0],
818
+ decode->operand_size, &decode->op[0].val)) {
819
+ return 1;
820
+ }
821
cf = (decode->op[0].val >> index) & 0x01;
822
823
switch (flag) {
824
case 0:
825
set_CF(env, cf);
779
- return;
826
+ return 0;
827
case 1:
828
decode->op[0].val ^= (1u << index);
829
break;
@@ -787,41 +834,58 @@ static void do_bt(CPUX86State *env, struct x86_decode *decode, int flag)
834
decode->op[0].val &= ~(1u << index);
835
break;
836
}
790
- write_val_ext(env, &decode->op[0], decode->op[0].val,
791
- decode->operand_size);
837
+ if (write_val_ext(env, &decode->op[0], decode->op[0].val,
838
+ decode->operand_size)) {
839
+ return 1;
840
+ }
841
set_CF(env, cf);
842
+ return 0;
843
}
844
795
-static void exec_bt(CPUX86State *env, struct x86_decode *decode)
845
+static bool exec_bt(CPUX86State *env, struct x86_decode *decode)
846
{
797
- do_bt(env, decode, 0);
847
+ if (do_bt(env, decode, 0)) {
848
+ return 1;
849
+ }
850
env->eip += decode->len;
851
+ return 0;
852
}
853
801
-static void exec_btc(CPUX86State *env, struct x86_decode *decode)
854
+static bool exec_btc(CPUX86State *env, struct x86_decode *decode)
855
{
803
- do_bt(env, decode, 1);
856
+ if (do_bt(env, decode, 1)) {
857
+ return 1;
858
+ }
859
env->eip += decode->len;
860
+ return 0;
861
}
862
807
-static void exec_btr(CPUX86State *env, struct x86_decode *decode)
863
+static bool exec_btr(CPUX86State *env, struct x86_decode *decode)
864
{
809
- do_bt(env, decode, 3);
865
+ if (do_bt(env, decode, 3)) {
866
+ return 1;
867
+ }
868
env->eip += decode->len;
869
+ return 0;
870
}
871
813
-static void exec_bts(CPUX86State *env, struct x86_decode *decode)
872
+static bool exec_bts(CPUX86State *env, struct x86_decode *decode)
873
{
815
- do_bt(env, decode, 2);
874
+ if (do_bt(env, decode, 2)) {
875
+ return 1;
876
+ }
877
env->eip += decode->len;
878
+ return 0;
879
}
880
819
-void exec_shl(CPUX86State *env, struct x86_decode *decode)
881
+bool exec_shl(CPUX86State *env, struct x86_decode *decode)
882
{
883
uint8_t count;
884
int of = 0, cf = 0;
885
824
- fetch_operands(env, decode, 2, true, true, false);
886
+ if (fetch_operands(env, decode, 2, true, true, false)) {
887
+ return 1;
888
+ }
889
890
count = decode->op[1].val;
891
count &= 0x1f; /* count is masked to 5 bits*/
@@ -878,12 +942,14 @@ void exec_shl(CPUX86State *env, struct x86_decode *decode)
942
exit:
943
/* lflags_to_rflags(env); */
944
env->eip += decode->len;
945
+ return 0;
946
}
947
883
-void exec_movsx(CPUX86State *env, struct x86_decode *decode)
948
+bool exec_movsx(CPUX86State *env, struct x86_decode *decode)
949
{
950
int src_op_size;
951
int op_size = decode->operand_size;
952
+ target_ulong val;
953
954
fetch_operands(env, decode, 2, false, false, false);
955
@@ -895,15 +961,18 @@ void exec_movsx(CPUX86State *env, struct x86_decode *decode)
961
962
decode->operand_size = src_op_size;
963
calc_modrm_operand(env, decode, &decode->op[1]);
898
- decode->op[1].val = sign(read_val_ext(env, &decode->op[1], src_op_size),
899
- src_op_size);
964
+ if (read_val_ext(env, &decode->op[1], src_op_size, &val)) {
965
+ return 1;
966
+ }
967
+ decode->op[1].val = sign(val, src_op_size);
968
969
write_val_ext(env, &decode->op[0], decode->op[1].val, op_size);
970
971
env->eip += decode->len;
972
+ return 0;
973
}
974
906
-void exec_ror(CPUX86State *env, struct x86_decode *decode)
975
+bool exec_ror(CPUX86State *env, struct x86_decode *decode)
976
{
977
uint8_t count;
978
@@ -979,9 +1048,10 @@ void exec_ror(CPUX86State *env, struct x86_decode *decode)
1048
}
1049
}
1050
env->eip += decode->len;
1051
+ return 0;
1052
}
1053
984
-void exec_rol(CPUX86State *env, struct x86_decode *decode)
1054
+bool exec_rol(CPUX86State *env, struct x86_decode *decode)
1055
{
1056
uint8_t count;
1057
@@ -1060,10 +1130,11 @@ void exec_rol(CPUX86State *env, struct x86_decode *decode)
1130
}
1131
}
1132
env->eip += decode->len;
1133
+ return 0;
1134
}
1135
1136
1066
-void exec_rcl(CPUX86State *env, struct x86_decode *decode)
1137
+bool exec_rcl(CPUX86State *env, struct x86_decode *decode)
1138
{
1139
uint8_t count;
1140
int of = 0, cf = 0;
@@ -1146,9 +1217,10 @@ void exec_rcl(CPUX86State *env, struct x86_decode *decode)
1217
}
1218
}
1219
env->eip += decode->len;
1220
+ return 0;
1221
}
1222
1151
-void exec_rcr(CPUX86State *env, struct x86_decode *decode)
1223
+bool exec_rcr(CPUX86State *env, struct x86_decode *decode)
1224
{
1225
uint8_t count;
1226
int of = 0, cf = 0;
@@ -1221,9 +1293,10 @@ void exec_rcr(CPUX86State *env, struct x86_decode *decode)
1293
}
1294
}
1295
env->eip += decode->len;
1296
+ return 0;
1297
}
1298
1226
-static void exec_xchg(CPUX86State *env, struct x86_decode *decode)
1299
+static bool exec_xchg(CPUX86State *env, struct x86_decode *decode)
1300
{
1301
fetch_operands(env, decode, 2, true, true, false);
1302
@@ -1233,20 +1306,22 @@ static void exec_xchg(CPUX86State *env, struct x86_decode *decode)
1306
decode->operand_size);
1307
1308
env->eip += decode->len;
1309
+ return 0;
1310
}
1311
1238
-static void exec_xadd(CPUX86State *env, struct x86_decode *decode)
1312
+static bool exec_xadd(CPUX86State *env, struct x86_decode *decode)
1313
{
1314
EXEC_2OP_FLAGS_CMD(env, decode, +, SET_FLAGS_OSZAPC_ADD, true);
1315
write_val_ext(env, &decode->op[1], decode->op[0].val,
1316
decode->operand_size);
1317
1318
env->eip += decode->len;
1319
+ return 0;
1320
}
1321
1322
static struct cmd_handler {
1323
enum x86_decode_cmd cmd;
1249
- void (*handler)(CPUX86State *env, struct x86_decode *ins);
1324
+ bool (*handler)(CPUX86State *env, struct x86_decode *ins);
1325
} handlers[] = {
1326
{X86_DECODE_CMD_INVL, NULL,},
1327
{X86_DECODE_CMD_MOV, exec_mov},
target/i386/emulate/x86_emu.h
+9
-9
@@ -44,15 +44,15 @@ target_ulong read_reg(CPUX86State *env, int reg, int size);
44
void write_reg(CPUX86State *env, int reg, target_ulong val, int size);
45
target_ulong read_val_from_reg(void *reg_ptr, int size);
46
void write_val_to_reg(void *reg_ptr, target_ulong val, int size);
47
-void write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_ulong val, int size);
47
+bool write_val_ext(CPUX86State *env, struct x86_decode_op *decode, target_ulong val, int size);
48
uint8_t *read_mmio(CPUX86State *env, target_ulong ptr, int bytes);
49
-target_ulong read_val_ext(CPUX86State *env, struct x86_decode_op *decode, int size);
49
+bool read_val_ext(CPUX86State *env, struct x86_decode_op *decode, int size, target_ulong* val);
50
51
-void exec_movzx(CPUX86State *env, struct x86_decode *decode);
52
-void exec_shl(CPUX86State *env, struct x86_decode *decode);
53
-void exec_movsx(CPUX86State *env, struct x86_decode *decode);
54
-void exec_ror(CPUX86State *env, struct x86_decode *decode);
55
-void exec_rol(CPUX86State *env, struct x86_decode *decode);
56
-void exec_rcl(CPUX86State *env, struct x86_decode *decode);
57
-void exec_rcr(CPUX86State *env, struct x86_decode *decode);
51
+bool exec_movzx(CPUX86State *env, struct x86_decode *decode);
52
+bool exec_shl(CPUX86State *env, struct x86_decode *decode);
53
+bool exec_movsx(CPUX86State *env, struct x86_decode *decode);
54
+bool exec_ror(CPUX86State *env, struct x86_decode *decode);
55
+bool exec_rol(CPUX86State *env, struct x86_decode *decode);
56
+bool exec_rcl(CPUX86State *env, struct x86_decode *decode);
57
+bool exec_rcr(CPUX86State *env, struct x86_decode *decode);
58
#endif