target/arm: Fix VST2 helper store alignment checks
This patch adds alignment checks in the store operations in the VST2 instruction. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1154 Signed-off-by: William Kosasih <kosasihwilliam4@gmail.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20250703085604.154449-12-kosasihwilliam4@gmail.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
28b3745991
commit
c9bc9f57ff
1 changed files with 9 additions and 3 deletions
|
|
@ -669,6 +669,8 @@ DO_VST4W(vst43w, 6, 7, 8, 9)
|
|||
static const uint8_t off[4] = { O1, O2, O3, O4 }; \
|
||||
uint32_t addr, data; \
|
||||
uint8_t *qd; \
|
||||
int mmu_idx = arm_to_core_mmu_idx(arm_mmu_idx(env)); \
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUL | MO_ALIGN, mmu_idx); \
|
||||
for (beat = 0; beat < 4; beat++, mask >>= 4) { \
|
||||
if ((mask & 1) == 0) { \
|
||||
/* ECI says skip this beat */ \
|
||||
|
|
@ -680,7 +682,7 @@ DO_VST4W(vst43w, 6, 7, 8, 9)
|
|||
qd = (uint8_t *)aa32_vfp_qreg(env, qnidx + (e & 1)); \
|
||||
data = (data << 8) | qd[H1(off[beat] + (e >> 1))]; \
|
||||
} \
|
||||
cpu_stl_le_data_ra(env, addr, data, GETPC()); \
|
||||
cpu_stl_mmu(env, addr, data, oi, GETPC()); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
|
@ -694,6 +696,8 @@ DO_VST4W(vst43w, 6, 7, 8, 9)
|
|||
uint32_t addr, data; \
|
||||
int e; \
|
||||
uint16_t *qd; \
|
||||
int mmu_idx = arm_to_core_mmu_idx(arm_mmu_idx(env)); \
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUL | MO_ALIGN, mmu_idx); \
|
||||
for (beat = 0; beat < 4; beat++, mask >>= 4) { \
|
||||
if ((mask & 1) == 0) { \
|
||||
/* ECI says skip this beat */ \
|
||||
|
|
@ -705,7 +709,7 @@ DO_VST4W(vst43w, 6, 7, 8, 9)
|
|||
qd = (uint16_t *)aa32_vfp_qreg(env, qnidx + e); \
|
||||
data = (data << 16) | qd[H2(off[beat])]; \
|
||||
} \
|
||||
cpu_stl_le_data_ra(env, addr, data, GETPC()); \
|
||||
cpu_stl_mmu(env, addr, data, oi, GETPC()); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
|
@ -718,6 +722,8 @@ DO_VST4W(vst43w, 6, 7, 8, 9)
|
|||
static const uint8_t off[4] = { O1, O2, O3, O4 }; \
|
||||
uint32_t addr, data; \
|
||||
uint32_t *qd; \
|
||||
int mmu_idx = arm_to_core_mmu_idx(arm_mmu_idx(env)); \
|
||||
MemOpIdx oi = make_memop_idx(MO_TEUL | MO_ALIGN, mmu_idx); \
|
||||
for (beat = 0; beat < 4; beat++, mask >>= 4) { \
|
||||
if ((mask & 1) == 0) { \
|
||||
/* ECI says skip this beat */ \
|
||||
|
|
@ -726,7 +732,7 @@ DO_VST4W(vst43w, 6, 7, 8, 9)
|
|||
addr = base + off[beat]; \
|
||||
qd = (uint32_t *)aa32_vfp_qreg(env, qnidx + (beat & 1)); \
|
||||
data = qd[H4(off[beat] >> 3)]; \
|
||||
cpu_stl_le_data_ra(env, addr, data, GETPC()); \
|
||||
cpu_stl_mmu(env, addr, data, oi, GETPC()); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue