1*0b6426baSRichard Henderson /* 2*0b6426baSRichard Henderson * Software MMU support 3*0b6426baSRichard Henderson * 4*0b6426baSRichard Henderson * SPDX-License-Identifier: LGPL-2.1-or-later 5*0b6426baSRichard Henderson */ 6*0b6426baSRichard Henderson 7*0b6426baSRichard Henderson #ifndef CPU_LDST_COMMON_H 8*0b6426baSRichard Henderson #define CPU_LDST_COMMON_H 9*0b6426baSRichard Henderson 10*0b6426baSRichard Henderson #ifndef CONFIG_TCG 11*0b6426baSRichard Henderson #error Can only include this header with TCG 12*0b6426baSRichard Henderson #endif 13*0b6426baSRichard Henderson 14*0b6426baSRichard Henderson #include "exec/memopidx.h" 15*0b6426baSRichard Henderson #include "exec/vaddr.h" 16*0b6426baSRichard Henderson #include "exec/mmu-access-type.h" 17*0b6426baSRichard Henderson #include "qemu/int128.h" 18*0b6426baSRichard Henderson 19*0b6426baSRichard Henderson uint8_t cpu_ldb_mmu(CPUArchState *env, vaddr ptr, MemOpIdx oi, uintptr_t ra); 20*0b6426baSRichard Henderson uint16_t cpu_ldw_mmu(CPUArchState *env, vaddr ptr, MemOpIdx oi, uintptr_t ra); 21*0b6426baSRichard Henderson uint32_t cpu_ldl_mmu(CPUArchState *env, vaddr ptr, MemOpIdx oi, uintptr_t ra); 22*0b6426baSRichard Henderson uint64_t cpu_ldq_mmu(CPUArchState *env, vaddr ptr, MemOpIdx oi, uintptr_t ra); 23*0b6426baSRichard Henderson Int128 cpu_ld16_mmu(CPUArchState *env, vaddr addr, MemOpIdx oi, uintptr_t ra); 24*0b6426baSRichard Henderson 25*0b6426baSRichard Henderson void cpu_stb_mmu(CPUArchState *env, vaddr ptr, uint8_t val, 26*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 27*0b6426baSRichard Henderson void cpu_stw_mmu(CPUArchState *env, vaddr ptr, uint16_t val, 28*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 29*0b6426baSRichard Henderson void cpu_stl_mmu(CPUArchState *env, vaddr ptr, uint32_t val, 30*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 31*0b6426baSRichard Henderson void cpu_stq_mmu(CPUArchState *env, vaddr ptr, uint64_t val, 32*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 33*0b6426baSRichard Henderson void cpu_st16_mmu(CPUArchState *env, vaddr addr, Int128 val, 34*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 35*0b6426baSRichard Henderson 36*0b6426baSRichard Henderson uint32_t cpu_atomic_cmpxchgb_mmu(CPUArchState *env, vaddr addr, 37*0b6426baSRichard Henderson uint32_t cmpv, uint32_t newv, 38*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 39*0b6426baSRichard Henderson uint32_t cpu_atomic_cmpxchgw_le_mmu(CPUArchState *env, vaddr addr, 40*0b6426baSRichard Henderson uint32_t cmpv, uint32_t newv, 41*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 42*0b6426baSRichard Henderson uint32_t cpu_atomic_cmpxchgl_le_mmu(CPUArchState *env, vaddr addr, 43*0b6426baSRichard Henderson uint32_t cmpv, uint32_t newv, 44*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 45*0b6426baSRichard Henderson uint64_t cpu_atomic_cmpxchgq_le_mmu(CPUArchState *env, vaddr addr, 46*0b6426baSRichard Henderson uint64_t cmpv, uint64_t newv, 47*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 48*0b6426baSRichard Henderson uint32_t cpu_atomic_cmpxchgw_be_mmu(CPUArchState *env, vaddr addr, 49*0b6426baSRichard Henderson uint32_t cmpv, uint32_t newv, 50*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 51*0b6426baSRichard Henderson uint32_t cpu_atomic_cmpxchgl_be_mmu(CPUArchState *env, vaddr addr, 52*0b6426baSRichard Henderson uint32_t cmpv, uint32_t newv, 53*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 54*0b6426baSRichard Henderson uint64_t cpu_atomic_cmpxchgq_be_mmu(CPUArchState *env, vaddr addr, 55*0b6426baSRichard Henderson uint64_t cmpv, uint64_t newv, 56*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 57*0b6426baSRichard Henderson 58*0b6426baSRichard Henderson #define GEN_ATOMIC_HELPER(NAME, TYPE, SUFFIX) \ 59*0b6426baSRichard Henderson TYPE cpu_atomic_ ## NAME ## SUFFIX ## _mmu \ 60*0b6426baSRichard Henderson (CPUArchState *env, vaddr addr, TYPE val, \ 61*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 62*0b6426baSRichard Henderson 63*0b6426baSRichard Henderson #ifdef CONFIG_ATOMIC64 64*0b6426baSRichard Henderson #define GEN_ATOMIC_HELPER_ALL(NAME) \ 65*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, b) \ 66*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, w_le) \ 67*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, w_be) \ 68*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, l_le) \ 69*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, l_be) \ 70*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint64_t, q_le) \ 71*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint64_t, q_be) 72*0b6426baSRichard Henderson #else 73*0b6426baSRichard Henderson #define GEN_ATOMIC_HELPER_ALL(NAME) \ 74*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, b) \ 75*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, w_le) \ 76*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, w_be) \ 77*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, l_le) \ 78*0b6426baSRichard Henderson GEN_ATOMIC_HELPER(NAME, uint32_t, l_be) 79*0b6426baSRichard Henderson #endif 80*0b6426baSRichard Henderson 81*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_add) 82*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_sub) 83*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_and) 84*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_or) 85*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_xor) 86*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_smin) 87*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_umin) 88*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_smax) 89*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(fetch_umax) 90*0b6426baSRichard Henderson 91*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(add_fetch) 92*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(sub_fetch) 93*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(and_fetch) 94*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(or_fetch) 95*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(xor_fetch) 96*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(smin_fetch) 97*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(umin_fetch) 98*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(smax_fetch) 99*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(umax_fetch) 100*0b6426baSRichard Henderson 101*0b6426baSRichard Henderson GEN_ATOMIC_HELPER_ALL(xchg) 102*0b6426baSRichard Henderson 103*0b6426baSRichard Henderson #undef GEN_ATOMIC_HELPER_ALL 104*0b6426baSRichard Henderson #undef GEN_ATOMIC_HELPER 105*0b6426baSRichard Henderson 106*0b6426baSRichard Henderson Int128 cpu_atomic_cmpxchgo_le_mmu(CPUArchState *env, vaddr addr, 107*0b6426baSRichard Henderson Int128 cmpv, Int128 newv, 108*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 109*0b6426baSRichard Henderson Int128 cpu_atomic_cmpxchgo_be_mmu(CPUArchState *env, vaddr addr, 110*0b6426baSRichard Henderson Int128 cmpv, Int128 newv, 111*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t retaddr); 112*0b6426baSRichard Henderson 113*0b6426baSRichard Henderson uint8_t cpu_ldb_code_mmu(CPUArchState *env, vaddr addr, 114*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 115*0b6426baSRichard Henderson uint16_t cpu_ldw_code_mmu(CPUArchState *env, vaddr addr, 116*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 117*0b6426baSRichard Henderson uint32_t cpu_ldl_code_mmu(CPUArchState *env, vaddr addr, 118*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 119*0b6426baSRichard Henderson uint64_t cpu_ldq_code_mmu(CPUArchState *env, vaddr addr, 120*0b6426baSRichard Henderson MemOpIdx oi, uintptr_t ra); 121*0b6426baSRichard Henderson 122*0b6426baSRichard Henderson #endif /* CPU_LDST_COMMON_H */ 123