mirror of https://gitee.com/openkylin/qemu.git
tcg/s390: Fix sign of patch_reloc addend
We were passing in -2 instead of +2, but then ignoring the actual contents of addend in the calculation. Signed-off-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
829e1376d9
commit
e692a3492d
|
@ -360,21 +360,22 @@ uint64_t s390_facilities;
|
|||
static void patch_reloc(tcg_insn_unit *code_ptr, int type,
|
||||
intptr_t value, intptr_t addend)
|
||||
{
|
||||
intptr_t pcrel2 = (tcg_insn_unit *)value - (code_ptr - 1);
|
||||
tcg_debug_assert(addend == -2);
|
||||
intptr_t pcrel2;
|
||||
|
||||
value += addend;
|
||||
pcrel2 = (tcg_insn_unit *)value - code_ptr;
|
||||
|
||||
switch (type) {
|
||||
case R_390_PC16DBL:
|
||||
tcg_debug_assert(pcrel2 == (int16_t)pcrel2);
|
||||
assert(pcrel2 == (int16_t)pcrel2);
|
||||
tcg_patch16(code_ptr, pcrel2);
|
||||
break;
|
||||
case R_390_PC32DBL:
|
||||
tcg_debug_assert(pcrel2 == (int32_t)pcrel2);
|
||||
assert(pcrel2 == (int32_t)pcrel2);
|
||||
tcg_patch32(code_ptr, pcrel2);
|
||||
break;
|
||||
default:
|
||||
tcg_abort();
|
||||
break;
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1270,11 +1271,11 @@ static void tgen_branch(TCGContext *s, int cc, TCGLabel *l)
|
|||
tgen_gotoi(s, cc, l->u.value_ptr);
|
||||
} else if (USE_LONG_BRANCHES) {
|
||||
tcg_out16(s, RIL_BRCL | (cc << 4));
|
||||
tcg_out_reloc(s, s->code_ptr, R_390_PC32DBL, l, -2);
|
||||
tcg_out_reloc(s, s->code_ptr, R_390_PC32DBL, l, 2);
|
||||
s->code_ptr += 2;
|
||||
} else {
|
||||
tcg_out16(s, RI_BRC | (cc << 4));
|
||||
tcg_out_reloc(s, s->code_ptr, R_390_PC16DBL, l, -2);
|
||||
tcg_out_reloc(s, s->code_ptr, R_390_PC16DBL, l, 2);
|
||||
s->code_ptr += 1;
|
||||
}
|
||||
}
|
||||
|
@ -1289,7 +1290,7 @@ static void tgen_compare_branch(TCGContext *s, S390Opcode opc, int cc,
|
|||
} else {
|
||||
/* We need to keep the offset unchanged for retranslation. */
|
||||
off = s->code_ptr[1];
|
||||
tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, l, -2);
|
||||
tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, l, 2);
|
||||
}
|
||||
|
||||
tcg_out16(s, (opc & 0xff00) | (r1 << 4) | r2);
|
||||
|
@ -1307,7 +1308,7 @@ static void tgen_compare_imm_branch(TCGContext *s, S390Opcode opc, int cc,
|
|||
} else {
|
||||
/* We need to keep the offset unchanged for retranslation. */
|
||||
off = s->code_ptr[1];
|
||||
tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, l, -2);
|
||||
tcg_out_reloc(s, s->code_ptr + 1, R_390_PC16DBL, l, 2);
|
||||
}
|
||||
|
||||
tcg_out16(s, (opc & 0xff00) | (r1 << 4) | cc);
|
||||
|
@ -1571,7 +1572,7 @@ static void tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||
TCGMemOpIdx oi = lb->oi;
|
||||
TCGMemOp opc = get_memop(oi);
|
||||
|
||||
patch_reloc(lb->label_ptr[0], R_390_PC16DBL, (intptr_t)s->code_ptr, -2);
|
||||
patch_reloc(lb->label_ptr[0], R_390_PC16DBL, (intptr_t)s->code_ptr, 2);
|
||||
|
||||
tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_R2, TCG_AREG0);
|
||||
if (TARGET_LONG_BITS == 64) {
|
||||
|
@ -1592,7 +1593,7 @@ static void tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||
TCGMemOpIdx oi = lb->oi;
|
||||
TCGMemOp opc = get_memop(oi);
|
||||
|
||||
patch_reloc(lb->label_ptr[0], R_390_PC16DBL, (intptr_t)s->code_ptr, -2);
|
||||
patch_reloc(lb->label_ptr[0], R_390_PC16DBL, (intptr_t)s->code_ptr, 2);
|
||||
|
||||
tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_R2, TCG_AREG0);
|
||||
if (TARGET_LONG_BITS == 64) {
|
||||
|
|
Loading…
Reference in New Issue