@samitouri / QOSamiQemu / commits / d14617e561

target/loongarch: Replace legacy ldq_le_phys() -> address_space_ldq_le()

Prefer the address_space_ld/st API over the legacy ld/st_phys() because it allow checking for bus access fault (although the modified code doesn't check that). There is no logical change. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Anton Johansson <anjo@rev.ng> Message-Id: <20260319104944.66690-2-philmd@linaro.org>

Philippe Mathieu-Daudé committed Mar 18, 2026 at 14:54 UTC d14617e561ae2e3cc5b42ae623fb18767e7aefc3
2 files changed +16 -7
target/loongarch/cpu_helper.c
+9 -4
@@ -7,6 +7,7 @@
7 */
8
9 #include "qemu/osdep.h"
10 +#include "system/memory.h"
11 #include "system/tcg.h"
12 #include "cpu.h"
13 #include "accel/tcg/cpu-mmu-index.h"
@@ -145,6 +146,7 @@ static MemTxResult loongarch_cmpxchg_phys(CPUState *cs, hwaddr phys,
146 TLBRet loongarch_ptw(CPULoongArchState *env, MMUContext *context,
147 int access_type, int mmu_idx, int debug)
148 {
149 + const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
150 CPUState *cs = env_cpu(env);
151 hwaddr index = 0, phys = 0;
152 uint64_t palen_mask = loongarch_palen_mask(env);
@@ -174,7 +176,7 @@ TLBRet loongarch_ptw(CPULoongArchState *env, MMUContext *context,
176 /* get next level page directory */
177 index = (address >> dir_base) & ((1 << dir_width) - 1);
178 phys = base | index << 3;
177 - base = ldq_le_phys(cs->as, phys);
179 + base = address_space_ldq_le(cs->as, phys, attrs, NULL);
180 if (level) {
181 if (FIELD_EX64(base, TLBENTRY, HUGE)) {
182 /* base is a huge pte */
@@ -204,10 +206,13 @@ restart:
206 context->pte_buddy[1 - index] = base + BIT_ULL(dir_base);
207 base += (BIT_ULL(dir_base) & address);
208 } else if (cpu_has_ptw(env)) {
209 + uint64_t val;
210 +
211 index &= 1;
212 context->pte_buddy[index] = base;
209 - context->pte_buddy[1 - index] = ldq_le_phys(cs->as,
210 - phys + 8 * (1 - 2 * index));
213 + val = address_space_ldq_le(cs->as, phys + 8 * (1 - 2 * index),
214 + attrs, NULL);
215 + context->pte_buddy[1 - index] = val;
216 }
217
218 context->ps = dir_base;
@@ -239,7 +244,7 @@ restart:
244 ret1 = loongarch_cmpxchg_phys(cs, phys, pte, base);
245 /* PTE updated by other CPU, reload PTE entry */
246 if (ret1 == MEMTX_DECODE_ERROR) {
242 - base = ldq_le_phys(cs->as, phys);
247 + base = address_space_ldq_le(cs->as, phys, attrs, NULL);
248 goto restart;
249 }
250
target/loongarch/tcg/tlb_helper.c
+7 -3
@@ -20,6 +20,7 @@
20 #include "exec/log.h"
21 #include "cpu-csr.h"
22 #include "tcg/tcg_loongarch.h"
23 +#include "system/memory.h"
24
25 typedef bool (*tlb_match)(bool global, int asid, int tlb_asid);
26
@@ -709,7 +710,7 @@ target_ulong helper_lddir(CPULoongArchState *env, target_ulong base,
710 hwaddr index, phys;
711 uint64_t palen_mask = loongarch_palen_mask(env);
712 uint64_t dir_base, dir_width;
712 -
713 + uint64_t val;
714
715 if (unlikely((level == 0) || (level > 4))) {
716 qemu_log_mask(LOG_GUEST_ERROR,
@@ -736,7 +737,9 @@ target_ulong helper_lddir(CPULoongArchState *env, target_ulong base,
737 get_dir_base_width(env, &dir_base, &dir_width, level);
738 index = (badvaddr >> dir_base) & ((1 << dir_width) - 1);
739 phys = base | index << 3;
739 - return ldq_le_phys(cs->as, phys) & palen_mask;
740 + val = address_space_ldq_le(cs->as, phys, MEMTXATTRS_UNSPECIFIED, NULL);
741 +
742 + return val & palen_mask;
743 }
744
745 void helper_ldpte(CPULoongArchState *env, target_ulong base, target_ulong odd,
@@ -802,7 +805,8 @@ void helper_ldpte(CPULoongArchState *env, target_ulong base, target_ulong odd,
805 ptoffset0 = ptindex << 3;
806 ptoffset1 = (ptindex + 1) << 3;
807 phys = base | (odd ? ptoffset1 : ptoffset0);
805 - pte_raw = ldq_le_phys(cs->as, phys);
808 + pte_raw = address_space_ldq_le(cs->as, phys,
809 + MEMTXATTRS_UNSPECIFIED, NULL);
810 tmp0 = loongarch_sanitize_hw_pte(env, pte_raw);
811 ps = ptbase;
812 }