@samitouri / QOSamiQemu / commits / f5b03da29f

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