1/* 2 * Routines common to user and system emulation of load/store. 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * 6 * SPDX-License-Identifier: GPL-2.0-or-later 7 * 8 * This work is licensed under the terms of the GNU GPL, version 2 or later. 9 * See the COPYING file in the top-level directory. 10 */ 11/* 12 * Load helpers for tcg-ldst.h 13 */ 14 15tcg_target_ulong helper_ldub_mmu(CPUArchState *env, uint64_t addr, 16 MemOpIdx oi, uintptr_t retaddr) 17{ 18 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_8); 19 return do_ld1_mmu(env_cpu(env), addr, oi, retaddr, MMU_DATA_LOAD); 20} 21 22tcg_target_ulong helper_lduw_mmu(CPUArchState *env, uint64_t addr, 23 MemOpIdx oi, uintptr_t retaddr) 24{ 25 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_16); 26 return do_ld2_mmu(env_cpu(env), addr, oi, retaddr, MMU_DATA_LOAD); 27} 28 29tcg_target_ulong helper_ldul_mmu(CPUArchState *env, uint64_t addr, 30 MemOpIdx oi, uintptr_t retaddr) 31{ 32 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_32); 33 return do_ld4_mmu(env_cpu(env), addr, oi, retaddr, MMU_DATA_LOAD); 34} 35 36uint64_t helper_ldq_mmu(CPUArchState *env, uint64_t addr, 37 MemOpIdx oi, uintptr_t retaddr) 38{ 39 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_64); 40 return do_ld8_mmu(env_cpu(env), addr, oi, retaddr, MMU_DATA_LOAD); 41} 42 43/* 44 * Provide signed versions of the load routines as well. We can of course 45 * avoid this for 64-bit data, or for 32-bit data on 32-bit host. 46 */ 47 48tcg_target_ulong helper_ldsb_mmu(CPUArchState *env, uint64_t addr, 49 MemOpIdx oi, uintptr_t retaddr) 50{ 51 return (int8_t)helper_ldub_mmu(env, addr, oi, retaddr); 52} 53 54tcg_target_ulong helper_ldsw_mmu(CPUArchState *env, uint64_t addr, 55 MemOpIdx oi, uintptr_t retaddr) 56{ 57 return (int16_t)helper_lduw_mmu(env, addr, oi, retaddr); 58} 59 60tcg_target_ulong helper_ldsl_mmu(CPUArchState *env, uint64_t addr, 61 MemOpIdx oi, uintptr_t retaddr) 62{ 63 return (int32_t)helper_ldul_mmu(env, addr, oi, retaddr); 64} 65 66Int128 helper_ld16_mmu(CPUArchState *env, uint64_t addr, 67 MemOpIdx oi, uintptr_t retaddr) 68{ 69 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_128); 70 return do_ld16_mmu(env_cpu(env), addr, oi, retaddr); 71} 72 73Int128 helper_ld_i128(CPUArchState *env, uint64_t addr, uint32_t oi) 74{ 75 return helper_ld16_mmu(env, addr, oi, GETPC()); 76} 77 78/* 79 * Store helpers for tcg-ldst.h 80 */ 81 82void helper_stb_mmu(CPUArchState *env, uint64_t addr, uint32_t val, 83 MemOpIdx oi, uintptr_t ra) 84{ 85 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_8); 86 do_st1_mmu(env_cpu(env), addr, val, oi, ra); 87} 88 89void helper_stw_mmu(CPUArchState *env, uint64_t addr, uint32_t val, 90 MemOpIdx oi, uintptr_t retaddr) 91{ 92 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_16); 93 do_st2_mmu(env_cpu(env), addr, val, oi, retaddr); 94} 95 96void helper_stl_mmu(CPUArchState *env, uint64_t addr, uint32_t val, 97 MemOpIdx oi, uintptr_t retaddr) 98{ 99 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_32); 100 do_st4_mmu(env_cpu(env), addr, val, oi, retaddr); 101} 102 103void helper_stq_mmu(CPUArchState *env, uint64_t addr, uint64_t val, 104 MemOpIdx oi, uintptr_t retaddr) 105{ 106 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_64); 107 do_st8_mmu(env_cpu(env), addr, val, oi, retaddr); 108} 109 110void helper_st16_mmu(CPUArchState *env, uint64_t addr, Int128 val, 111 MemOpIdx oi, uintptr_t retaddr) 112{ 113 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_128); 114 do_st16_mmu(env_cpu(env), addr, val, oi, retaddr); 115} 116 117void helper_st_i128(CPUArchState *env, uint64_t addr, Int128 val, MemOpIdx oi) 118{ 119 helper_st16_mmu(env, addr, val, oi, GETPC()); 120} 121 122/* 123 * Load helpers for cpu_ldst.h 124 */ 125 126static void plugin_load_cb(CPUArchState *env, vaddr addr, 127 uint64_t value_low, 128 uint64_t value_high, 129 MemOpIdx oi) 130{ 131 if (cpu_plugin_mem_cbs_enabled(env_cpu(env))) { 132 qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, 133 value_low, value_high, 134 oi, QEMU_PLUGIN_MEM_R); 135 } 136} 137 138uint8_t cpu_ldb_mmu(CPUArchState *env, vaddr addr, MemOpIdx oi, uintptr_t ra) 139{ 140 uint8_t ret; 141 142 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_UB); 143 ret = do_ld1_mmu(env_cpu(env), addr, oi, ra, MMU_DATA_LOAD); 144 plugin_load_cb(env, addr, ret, 0, oi); 145 return ret; 146} 147 148uint16_t cpu_ldw_mmu(CPUArchState *env, vaddr addr, 149 MemOpIdx oi, uintptr_t ra) 150{ 151 uint16_t ret; 152 153 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_16); 154 ret = do_ld2_mmu(env_cpu(env), addr, oi, ra, MMU_DATA_LOAD); 155 plugin_load_cb(env, addr, ret, 0, oi); 156 return ret; 157} 158 159uint32_t cpu_ldl_mmu(CPUArchState *env, vaddr addr, 160 MemOpIdx oi, uintptr_t ra) 161{ 162 uint32_t ret; 163 164 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_32); 165 ret = do_ld4_mmu(env_cpu(env), addr, oi, ra, MMU_DATA_LOAD); 166 plugin_load_cb(env, addr, ret, 0, oi); 167 return ret; 168} 169 170uint64_t cpu_ldq_mmu(CPUArchState *env, vaddr addr, 171 MemOpIdx oi, uintptr_t ra) 172{ 173 uint64_t ret; 174 175 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_64); 176 ret = do_ld8_mmu(env_cpu(env), addr, oi, ra, MMU_DATA_LOAD); 177 plugin_load_cb(env, addr, ret, 0, oi); 178 return ret; 179} 180 181Int128 cpu_ld16_mmu(CPUArchState *env, vaddr addr, 182 MemOpIdx oi, uintptr_t ra) 183{ 184 Int128 ret; 185 186 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_128); 187 ret = do_ld16_mmu(env_cpu(env), addr, oi, ra); 188 plugin_load_cb(env, addr, int128_getlo(ret), int128_gethi(ret), oi); 189 return ret; 190} 191 192/* 193 * Store helpers for cpu_ldst.h 194 */ 195 196static void plugin_store_cb(CPUArchState *env, vaddr addr, 197 uint64_t value_low, 198 uint64_t value_high, 199 MemOpIdx oi) 200{ 201 if (cpu_plugin_mem_cbs_enabled(env_cpu(env))) { 202 qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, 203 value_low, value_high, 204 oi, QEMU_PLUGIN_MEM_W); 205 } 206} 207 208void cpu_stb_mmu(CPUArchState *env, vaddr addr, uint8_t val, 209 MemOpIdx oi, uintptr_t retaddr) 210{ 211 helper_stb_mmu(env, addr, val, oi, retaddr); 212 plugin_store_cb(env, addr, val, 0, oi); 213} 214 215void cpu_stw_mmu(CPUArchState *env, vaddr addr, uint16_t val, 216 MemOpIdx oi, uintptr_t retaddr) 217{ 218 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_16); 219 do_st2_mmu(env_cpu(env), addr, val, oi, retaddr); 220 plugin_store_cb(env, addr, val, 0, oi); 221} 222 223void cpu_stl_mmu(CPUArchState *env, vaddr addr, uint32_t val, 224 MemOpIdx oi, uintptr_t retaddr) 225{ 226 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_32); 227 do_st4_mmu(env_cpu(env), addr, val, oi, retaddr); 228 plugin_store_cb(env, addr, val, 0, oi); 229} 230 231void cpu_stq_mmu(CPUArchState *env, vaddr addr, uint64_t val, 232 MemOpIdx oi, uintptr_t retaddr) 233{ 234 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_64); 235 do_st8_mmu(env_cpu(env), addr, val, oi, retaddr); 236 plugin_store_cb(env, addr, val, 0, oi); 237} 238 239void cpu_st16_mmu(CPUArchState *env, vaddr addr, Int128 val, 240 MemOpIdx oi, uintptr_t retaddr) 241{ 242 tcg_debug_assert((get_memop(oi) & MO_SIZE) == MO_128); 243 do_st16_mmu(env_cpu(env), addr, val, oi, retaddr); 244 plugin_store_cb(env, addr, int128_getlo(val), int128_gethi(val), oi); 245} 246