target/i386: Verify memory operand for lcall and ljmp
These two opcodes only allow a memory operand. Lacking the check for a register operand, we used the A0 temp without initialization, which led to a tcg abort. Buglink: https://bugs.launchpad.net/qemu/+bug/1921138 Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210324164650.128608-1-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
76f67bac79
commit
10b8eb94c0
@ -5061,6 +5061,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
gen_jr(s, s->T0);
|
||||
break;
|
||||
case 3: /* lcall Ev */
|
||||
if (mod == 3) {
|
||||
goto illegal_op;
|
||||
}
|
||||
gen_op_ld_v(s, ot, s->T1, s->A0);
|
||||
gen_add_A0_im(s, 1 << ot);
|
||||
gen_op_ld_v(s, MO_16, s->T0, s->A0);
|
||||
@ -5088,6 +5091,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
gen_jr(s, s->T0);
|
||||
break;
|
||||
case 5: /* ljmp Ev */
|
||||
if (mod == 3) {
|
||||
goto illegal_op;
|
||||
}
|
||||
gen_op_ld_v(s, ot, s->T1, s->A0);
|
||||
gen_add_A0_im(s, 1 << ot);
|
||||
gen_op_ld_v(s, MO_16, s->T0, s->A0);
|
||||
|
Loading…
Reference in New Issue
Block a user