pull-loongarch-20250828
-----BEGIN PGP SIGNATURE----- iLMEAAEIAB0WIQTKRzxE1qCcGJoZP81FK5aFKyaCFgUCaLBJawAKCRBFK5aFKyaC FhiGBACdQ1hkGp79sFrwi0h6GaP4NdbG8jx0vNGwPOqvbIc6Frn4bSyATNZI76k+ /B2KTGLe4fU95QeXCJ937N1mNqcbagxFVeCaqSS71wuSfVKZBWLvGi8CckCqWU57 GeUCQTOgA+E94C93G0pdgtyi2r7ambPnqTNifghkdoSN52Ta1Q== =pUq/ -----END PGP SIGNATURE----- Merge tag 'pull-loongarch-20250828' of https://github.com/gaosong715/qemu into staging pull-loongarch-20250828 # -----BEGIN PGP SIGNATURE----- # # iLMEAAEIAB0WIQTKRzxE1qCcGJoZP81FK5aFKyaCFgUCaLBJawAKCRBFK5aFKyaC # FhiGBACdQ1hkGp79sFrwi0h6GaP4NdbG8jx0vNGwPOqvbIc6Frn4bSyATNZI76k+ # /B2KTGLe4fU95QeXCJ937N1mNqcbagxFVeCaqSS71wuSfVKZBWLvGi8CckCqWU57 # GeUCQTOgA+E94C93G0pdgtyi2r7ambPnqTNifghkdoSN52Ta1Q== # =pUq/ # -----END PGP SIGNATURE----- # gpg: Signature made Thu 28 Aug 2025 10:19:55 PM AEST # gpg: using RSA key CA473C44D6A09C189A193FCD452B96852B268216 # gpg: Good signature from "Song Gao <gaosong@loongson.cn>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: CA47 3C44 D6A0 9C18 9A19 3FCD 452B 9685 2B26 8216 * tag 'pull-loongarch-20250828' of https://github.com/gaosong715/qemu: hw/intc/loongarch_pch_pic: Fix ubsan warning and endianness issue target/loongarch: Guard 64-bit-only insn translation with TRANS64 macro Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
59f504bb43
9 changed files with 54 additions and 45 deletions
|
|
@ -110,10 +110,10 @@ static uint64_t pch_pic_read(void *opaque, hwaddr addr, uint64_t field_mask)
|
|||
val = s->int_polarity;
|
||||
break;
|
||||
case PCH_PIC_HTMSI_VEC ... PCH_PIC_HTMSI_VEC_END:
|
||||
val = *(uint64_t *)(s->htmsi_vector + addr - PCH_PIC_HTMSI_VEC);
|
||||
val = ldq_le_p(&s->htmsi_vector[addr - PCH_PIC_HTMSI_VEC]);
|
||||
break;
|
||||
case PCH_PIC_ROUTE_ENTRY ... PCH_PIC_ROUTE_ENTRY_END:
|
||||
val = *(uint64_t *)(s->route_entry + addr - PCH_PIC_ROUTE_ENTRY);
|
||||
val = ldq_le_p(&s->route_entry[addr - PCH_PIC_ROUTE_ENTRY]);
|
||||
break;
|
||||
default:
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
|
|
@ -129,7 +129,8 @@ static void pch_pic_write(void *opaque, hwaddr addr, uint64_t value,
|
|||
{
|
||||
LoongArchPICCommonState *s = LOONGARCH_PIC_COMMON(opaque);
|
||||
uint32_t offset;
|
||||
uint64_t old, mask, data, *ptemp;
|
||||
uint64_t old, mask, data;
|
||||
void *ptemp;
|
||||
|
||||
offset = addr & 7;
|
||||
addr -= offset;
|
||||
|
|
@ -168,12 +169,12 @@ static void pch_pic_write(void *opaque, hwaddr addr, uint64_t value,
|
|||
s->int_polarity = (s->int_polarity & ~mask) | data;
|
||||
break;
|
||||
case PCH_PIC_HTMSI_VEC ... PCH_PIC_HTMSI_VEC_END:
|
||||
ptemp = (uint64_t *)(s->htmsi_vector + addr - PCH_PIC_HTMSI_VEC);
|
||||
*ptemp = (*ptemp & ~mask) | data;
|
||||
ptemp = &s->htmsi_vector[addr - PCH_PIC_HTMSI_VEC];
|
||||
stq_le_p(ptemp, (ldq_le_p(ptemp) & ~mask) | data);
|
||||
break;
|
||||
case PCH_PIC_ROUTE_ENTRY ... PCH_PIC_ROUTE_ENTRY_END:
|
||||
ptemp = (uint64_t *)(s->route_entry + addr - PCH_PIC_ROUTE_ENTRY);
|
||||
*ptemp = (*ptemp & ~mask) | data;
|
||||
ptemp = (uint64_t *)&s->route_entry[addr - PCH_PIC_ROUTE_ENTRY];
|
||||
stq_le_p(ptemp, (ldq_le_p(ptemp) & ~mask) | data);
|
||||
break;
|
||||
default:
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
|
|
|
|||
|
|
@ -74,38 +74,38 @@ TRANS(sc_w, ALL, gen_sc, MO_TESL)
|
|||
TRANS(ll_d, 64, gen_ll, MO_TEUQ)
|
||||
TRANS(sc_d, 64, gen_sc, MO_TEUQ)
|
||||
TRANS(amswap_w, LAM, gen_am, tcg_gen_atomic_xchg_tl, MO_TESL)
|
||||
TRANS(amswap_d, LAM, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
|
||||
TRANS64(amswap_d, LAM, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
|
||||
TRANS(amadd_w, LAM, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TESL)
|
||||
TRANS(amadd_d, LAM, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TEUQ)
|
||||
TRANS64(amadd_d, LAM, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TEUQ)
|
||||
TRANS(amand_w, LAM, gen_am, tcg_gen_atomic_fetch_and_tl, MO_TESL)
|
||||
TRANS(amand_d, LAM, gen_am, tcg_gen_atomic_fetch_and_tl, MO_TEUQ)
|
||||
TRANS64(amand_d, LAM, gen_am, tcg_gen_atomic_fetch_and_tl, MO_TEUQ)
|
||||
TRANS(amor_w, LAM, gen_am, tcg_gen_atomic_fetch_or_tl, MO_TESL)
|
||||
TRANS(amor_d, LAM, gen_am, tcg_gen_atomic_fetch_or_tl, MO_TEUQ)
|
||||
TRANS64(amor_d, LAM, gen_am, tcg_gen_atomic_fetch_or_tl, MO_TEUQ)
|
||||
TRANS(amxor_w, LAM, gen_am, tcg_gen_atomic_fetch_xor_tl, MO_TESL)
|
||||
TRANS(amxor_d, LAM, gen_am, tcg_gen_atomic_fetch_xor_tl, MO_TEUQ)
|
||||
TRANS64(amxor_d, LAM, gen_am, tcg_gen_atomic_fetch_xor_tl, MO_TEUQ)
|
||||
TRANS(ammax_w, LAM, gen_am, tcg_gen_atomic_fetch_smax_tl, MO_TESL)
|
||||
TRANS(ammax_d, LAM, gen_am, tcg_gen_atomic_fetch_smax_tl, MO_TEUQ)
|
||||
TRANS64(ammax_d, LAM, gen_am, tcg_gen_atomic_fetch_smax_tl, MO_TEUQ)
|
||||
TRANS(ammin_w, LAM, gen_am, tcg_gen_atomic_fetch_smin_tl, MO_TESL)
|
||||
TRANS(ammin_d, LAM, gen_am, tcg_gen_atomic_fetch_smin_tl, MO_TEUQ)
|
||||
TRANS64(ammin_d, LAM, gen_am, tcg_gen_atomic_fetch_smin_tl, MO_TEUQ)
|
||||
TRANS(ammax_wu, LAM, gen_am, tcg_gen_atomic_fetch_umax_tl, MO_TESL)
|
||||
TRANS(ammax_du, LAM, gen_am, tcg_gen_atomic_fetch_umax_tl, MO_TEUQ)
|
||||
TRANS64(ammax_du, LAM, gen_am, tcg_gen_atomic_fetch_umax_tl, MO_TEUQ)
|
||||
TRANS(ammin_wu, LAM, gen_am, tcg_gen_atomic_fetch_umin_tl, MO_TESL)
|
||||
TRANS(ammin_du, LAM, gen_am, tcg_gen_atomic_fetch_umin_tl, MO_TEUQ)
|
||||
TRANS64(ammin_du, LAM, gen_am, tcg_gen_atomic_fetch_umin_tl, MO_TEUQ)
|
||||
TRANS(amswap_db_w, LAM, gen_am, tcg_gen_atomic_xchg_tl, MO_TESL)
|
||||
TRANS(amswap_db_d, LAM, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
|
||||
TRANS64(amswap_db_d, LAM, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
|
||||
TRANS(amadd_db_w, LAM, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TESL)
|
||||
TRANS(amadd_db_d, LAM, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TEUQ)
|
||||
TRANS64(amadd_db_d, LAM, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TEUQ)
|
||||
TRANS(amand_db_w, LAM, gen_am, tcg_gen_atomic_fetch_and_tl, MO_TESL)
|
||||
TRANS(amand_db_d, LAM, gen_am, tcg_gen_atomic_fetch_and_tl, MO_TEUQ)
|
||||
TRANS64(amand_db_d, LAM, gen_am, tcg_gen_atomic_fetch_and_tl, MO_TEUQ)
|
||||
TRANS(amor_db_w, LAM, gen_am, tcg_gen_atomic_fetch_or_tl, MO_TESL)
|
||||
TRANS(amor_db_d, LAM, gen_am, tcg_gen_atomic_fetch_or_tl, MO_TEUQ)
|
||||
TRANS64(amor_db_d, LAM, gen_am, tcg_gen_atomic_fetch_or_tl, MO_TEUQ)
|
||||
TRANS(amxor_db_w, LAM, gen_am, tcg_gen_atomic_fetch_xor_tl, MO_TESL)
|
||||
TRANS(amxor_db_d, LAM, gen_am, tcg_gen_atomic_fetch_xor_tl, MO_TEUQ)
|
||||
TRANS64(amxor_db_d, LAM, gen_am, tcg_gen_atomic_fetch_xor_tl, MO_TEUQ)
|
||||
TRANS(ammax_db_w, LAM, gen_am, tcg_gen_atomic_fetch_smax_tl, MO_TESL)
|
||||
TRANS(ammax_db_d, LAM, gen_am, tcg_gen_atomic_fetch_smax_tl, MO_TEUQ)
|
||||
TRANS64(ammax_db_d, LAM, gen_am, tcg_gen_atomic_fetch_smax_tl, MO_TEUQ)
|
||||
TRANS(ammin_db_w, LAM, gen_am, tcg_gen_atomic_fetch_smin_tl, MO_TESL)
|
||||
TRANS(ammin_db_d, LAM, gen_am, tcg_gen_atomic_fetch_smin_tl, MO_TEUQ)
|
||||
TRANS64(ammin_db_d, LAM, gen_am, tcg_gen_atomic_fetch_smin_tl, MO_TEUQ)
|
||||
TRANS(ammax_db_wu, LAM, gen_am, tcg_gen_atomic_fetch_umax_tl, MO_TESL)
|
||||
TRANS(ammax_db_du, LAM, gen_am, tcg_gen_atomic_fetch_umax_tl, MO_TEUQ)
|
||||
TRANS64(ammax_db_du, LAM, gen_am, tcg_gen_atomic_fetch_umax_tl, MO_TEUQ)
|
||||
TRANS(ammin_db_wu, LAM, gen_am, tcg_gen_atomic_fetch_umin_tl, MO_TESL)
|
||||
TRANS(ammin_db_du, LAM, gen_am, tcg_gen_atomic_fetch_umin_tl, MO_TEUQ)
|
||||
TRANS64(ammin_db_du, LAM, gen_am, tcg_gen_atomic_fetch_umin_tl, MO_TEUQ)
|
||||
|
|
|
|||
|
|
@ -69,6 +69,10 @@ static bool trans_rdtimeh_w(DisasContext *ctx, arg_rdtimeh_w *a)
|
|||
|
||||
static bool trans_rdtime_d(DisasContext *ctx, arg_rdtime_d *a)
|
||||
{
|
||||
if (!avail_64(ctx)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return gen_rdtime(ctx, a, 0, 0);
|
||||
}
|
||||
|
||||
|
|
@ -100,8 +104,8 @@ static bool gen_crc(DisasContext *ctx, arg_rrr *a,
|
|||
TRANS(crc_w_b_w, CRC, gen_crc, gen_helper_crc32, tcg_constant_tl(1))
|
||||
TRANS(crc_w_h_w, CRC, gen_crc, gen_helper_crc32, tcg_constant_tl(2))
|
||||
TRANS(crc_w_w_w, CRC, gen_crc, gen_helper_crc32, tcg_constant_tl(4))
|
||||
TRANS(crc_w_d_w, CRC, gen_crc, gen_helper_crc32, tcg_constant_tl(8))
|
||||
TRANS64(crc_w_d_w, CRC, gen_crc, gen_helper_crc32, tcg_constant_tl(8))
|
||||
TRANS(crcc_w_b_w, CRC, gen_crc, gen_helper_crc32c, tcg_constant_tl(1))
|
||||
TRANS(crcc_w_h_w, CRC, gen_crc, gen_helper_crc32c, tcg_constant_tl(2))
|
||||
TRANS(crcc_w_w_w, CRC, gen_crc, gen_helper_crc32c, tcg_constant_tl(4))
|
||||
TRANS(crcc_w_d_w, CRC, gen_crc, gen_helper_crc32c, tcg_constant_tl(8))
|
||||
TRANS64(crcc_w_d_w, CRC, gen_crc, gen_helper_crc32c, tcg_constant_tl(8))
|
||||
|
|
|
|||
|
|
@ -183,16 +183,16 @@ TRANS(fmaxa_s, FP_SP, gen_fff, gen_helper_fmaxa_s)
|
|||
TRANS(fmaxa_d, FP_DP, gen_fff, gen_helper_fmaxa_d)
|
||||
TRANS(fmina_s, FP_SP, gen_fff, gen_helper_fmina_s)
|
||||
TRANS(fmina_d, FP_DP, gen_fff, gen_helper_fmina_d)
|
||||
TRANS(fscaleb_s, FP_SP, gen_fff, gen_helper_fscaleb_s)
|
||||
TRANS(fscaleb_d, FP_DP, gen_fff, gen_helper_fscaleb_d)
|
||||
TRANS64(fscaleb_s, FP_SP, gen_fff, gen_helper_fscaleb_s)
|
||||
TRANS64(fscaleb_d, FP_DP, gen_fff, gen_helper_fscaleb_d)
|
||||
TRANS(fsqrt_s, FP_SP, gen_ff, gen_helper_fsqrt_s)
|
||||
TRANS(fsqrt_d, FP_DP, gen_ff, gen_helper_fsqrt_d)
|
||||
TRANS(frecip_s, FP_SP, gen_ff, gen_helper_frecip_s)
|
||||
TRANS(frecip_d, FP_DP, gen_ff, gen_helper_frecip_d)
|
||||
TRANS(frsqrt_s, FP_SP, gen_ff, gen_helper_frsqrt_s)
|
||||
TRANS(frsqrt_d, FP_DP, gen_ff, gen_helper_frsqrt_d)
|
||||
TRANS(flogb_s, FP_SP, gen_ff, gen_helper_flogb_s)
|
||||
TRANS(flogb_d, FP_DP, gen_ff, gen_helper_flogb_d)
|
||||
TRANS64(flogb_s, FP_SP, gen_ff, gen_helper_flogb_s)
|
||||
TRANS64(flogb_d, FP_DP, gen_ff, gen_helper_flogb_d)
|
||||
TRANS(fclass_s, FP_SP, gen_ff, gen_helper_fclass_s)
|
||||
TRANS(fclass_d, FP_DP, gen_ff, gen_helper_fclass_d)
|
||||
TRANS(fmadd_s, FP_SP, gen_muladd, gen_helper_fmuladd_s, 0)
|
||||
|
|
|
|||
|
|
@ -29,5 +29,5 @@ TRANS(ffint_s_w, FP_SP, gen_ff, gen_helper_ffint_s_w)
|
|||
TRANS(ffint_s_l, FP_SP, gen_ff, gen_helper_ffint_s_l)
|
||||
TRANS(ffint_d_w, FP_DP, gen_ff, gen_helper_ffint_d_w)
|
||||
TRANS(ffint_d_l, FP_DP, gen_ff, gen_helper_ffint_d_l)
|
||||
TRANS(frint_s, FP_SP, gen_ff, gen_helper_frint_s)
|
||||
TRANS(frint_d, FP_DP, gen_ff, gen_helper_frint_d)
|
||||
TRANS64(frint_s, FP_SP, gen_ff, gen_helper_frint_s)
|
||||
TRANS64(frint_d, FP_DP, gen_ff, gen_helper_frint_d)
|
||||
|
|
|
|||
|
|
@ -148,11 +148,11 @@ TRANS(fldx_s, FP_SP, gen_floadx, MO_TEUL)
|
|||
TRANS(fldx_d, FP_DP, gen_floadx, MO_TEUQ)
|
||||
TRANS(fstx_s, FP_SP, gen_fstorex, MO_TEUL)
|
||||
TRANS(fstx_d, FP_DP, gen_fstorex, MO_TEUQ)
|
||||
TRANS(fldgt_s, FP_SP, gen_fload_gt, MO_TEUL)
|
||||
TRANS(fldgt_d, FP_DP, gen_fload_gt, MO_TEUQ)
|
||||
TRANS(fldle_s, FP_SP, gen_fload_le, MO_TEUL)
|
||||
TRANS(fldle_d, FP_DP, gen_fload_le, MO_TEUQ)
|
||||
TRANS(fstgt_s, FP_SP, gen_fstore_gt, MO_TEUL)
|
||||
TRANS(fstgt_d, FP_DP, gen_fstore_gt, MO_TEUQ)
|
||||
TRANS(fstle_s, FP_SP, gen_fstore_le, MO_TEUL)
|
||||
TRANS(fstle_d, FP_DP, gen_fstore_le, MO_TEUQ)
|
||||
TRANS64(fldgt_s, FP_SP, gen_fload_gt, MO_TEUL)
|
||||
TRANS64(fldgt_d, FP_DP, gen_fload_gt, MO_TEUQ)
|
||||
TRANS64(fldle_s, FP_SP, gen_fload_le, MO_TEUL)
|
||||
TRANS64(fldle_d, FP_DP, gen_fload_le, MO_TEUQ)
|
||||
TRANS64(fstgt_s, FP_SP, gen_fstore_gt, MO_TEUL)
|
||||
TRANS64(fstgt_d, FP_DP, gen_fstore_gt, MO_TEUQ)
|
||||
TRANS64(fstle_s, FP_SP, gen_fstore_le, MO_TEUL)
|
||||
TRANS64(fstle_d, FP_DP, gen_fstore_le, MO_TEUQ)
|
||||
|
|
|
|||
|
|
@ -233,11 +233,11 @@ static bool gen_iocsrwr(DisasContext *ctx, arg_rr *a,
|
|||
TRANS(iocsrrd_b, IOCSR, gen_iocsrrd, gen_helper_iocsrrd_b)
|
||||
TRANS(iocsrrd_h, IOCSR, gen_iocsrrd, gen_helper_iocsrrd_h)
|
||||
TRANS(iocsrrd_w, IOCSR, gen_iocsrrd, gen_helper_iocsrrd_w)
|
||||
TRANS(iocsrrd_d, IOCSR, gen_iocsrrd, gen_helper_iocsrrd_d)
|
||||
TRANS64(iocsrrd_d, IOCSR, gen_iocsrrd, gen_helper_iocsrrd_d)
|
||||
TRANS(iocsrwr_b, IOCSR, gen_iocsrwr, gen_helper_iocsrwr_b)
|
||||
TRANS(iocsrwr_h, IOCSR, gen_iocsrwr, gen_helper_iocsrwr_h)
|
||||
TRANS(iocsrwr_w, IOCSR, gen_iocsrwr, gen_helper_iocsrwr_w)
|
||||
TRANS(iocsrwr_d, IOCSR, gen_iocsrwr, gen_helper_iocsrwr_d)
|
||||
TRANS64(iocsrwr_d, IOCSR, gen_iocsrwr, gen_helper_iocsrwr_d)
|
||||
|
||||
static void check_mmu_idx(DisasContext *ctx)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ TRANS(sra_w, ALL, gen_rrr, EXT_SIGN, EXT_NONE, EXT_SIGN, gen_sra_w)
|
|||
TRANS(sll_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sll_d)
|
||||
TRANS(srl_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_srl_d)
|
||||
TRANS(sra_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sra_d)
|
||||
TRANS(rotr_w, 64, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_rotr_w)
|
||||
TRANS(rotr_w, ALL, gen_rrr, EXT_ZERO, EXT_NONE, EXT_SIGN, gen_rotr_w)
|
||||
TRANS(rotr_d, 64, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rotr_d)
|
||||
TRANS(slli_w, ALL, gen_rri_c, EXT_NONE, EXT_SIGN, tcg_gen_shli_tl)
|
||||
TRANS(slli_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_shli_tl)
|
||||
|
|
@ -86,5 +86,5 @@ TRANS(srli_w, ALL, gen_rri_c, EXT_ZERO, EXT_SIGN, tcg_gen_shri_tl)
|
|||
TRANS(srli_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_shri_tl)
|
||||
TRANS(srai_w, ALL, gen_rri_c, EXT_NONE, EXT_NONE, gen_sari_w)
|
||||
TRANS(srai_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_sari_tl)
|
||||
TRANS(rotri_w, 64, gen_rri_v, EXT_NONE, EXT_NONE, gen_rotr_w)
|
||||
TRANS(rotri_w, ALL, gen_rri_v, EXT_NONE, EXT_NONE, gen_rotr_w)
|
||||
TRANS(rotri_d, 64, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_rotri_tl)
|
||||
|
|
|
|||
|
|
@ -14,6 +14,10 @@
|
|||
static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
|
||||
{ return avail_##AVAIL(ctx) && FUNC(ctx, a, __VA_ARGS__); }
|
||||
|
||||
#define TRANS64(NAME, AVAIL, FUNC, ...) \
|
||||
static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
|
||||
{ return avail_64(ctx) && avail_##AVAIL(ctx) && FUNC(ctx, a, __VA_ARGS__); }
|
||||
|
||||
#define avail_ALL(C) true
|
||||
#define avail_64(C) (FIELD_EX32((C)->cpucfg1, CPUCFG1, ARCH) == \
|
||||
CPUCFG1_ARCH_LA64)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue