]>
git.ipfire.org Git - thirdparty/qemu.git/blob - include/exec/cpu_ldst_template.h
4 * Generate inline load/store functions for one MMU mode and data
7 * Generate a store function as well as signed and unsigned loads.
9 * Not used directly but included from cpu_ldst.h.
11 * Copyright (c) 2003 Fabrice Bellard
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2 of the License, or (at your option) any later version.
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
27 #if !defined(SOFTMMU_CODE_ACCESS)
28 #include "trace-root.h"
31 #include "qemu/plugin.h"
32 #include "trace/mem.h"
37 #define DATA_TYPE uint64_t
42 #define DATA_TYPE uint32_t
47 #define DATA_TYPE uint16_t
48 #define DATA_STYPE int16_t
53 #define DATA_TYPE uint8_t
54 #define DATA_STYPE int8_t
57 #error unsupported data size
61 #define RES_TYPE uint64_t
63 #define RES_TYPE uint32_t
66 #ifdef SOFTMMU_CODE_ACCESS
67 #define ADDR_READ addr_code
68 #define MMUSUFFIX _cmmu
69 #define URETSUFFIX USUFFIX
70 #define SRETSUFFIX glue(s, SUFFIX)
72 #define ADDR_READ addr_read
73 #define MMUSUFFIX _mmu
74 #define URETSUFFIX USUFFIX
75 #define SRETSUFFIX glue(s, SUFFIX)
78 /* generic load/store macros */
80 static inline RES_TYPE
81 glue(glue(glue(cpu_ld
, USUFFIX
), MEMSUFFIX
), _ra
)(CPUArchState
*env
,
88 int mmu_idx
= CPU_MMU_INDEX
;
90 #if !defined(SOFTMMU_CODE_ACCESS)
91 uint16_t meminfo
= trace_mem_build_info(SHIFT
, false, MO_TE
, false, mmu_idx
);
92 trace_guest_mem_before_exec(env_cpu(env
), ptr
, meminfo
);
96 entry
= tlb_entry(env
, mmu_idx
, addr
);
97 if (unlikely(entry
->ADDR_READ
!=
98 (addr
& (TARGET_PAGE_MASK
| (DATA_SIZE
- 1))))) {
99 oi
= make_memop_idx(SHIFT
, mmu_idx
);
100 res
= glue(glue(helper_ret_ld
, URETSUFFIX
), MMUSUFFIX
)(env
, addr
,
103 uintptr_t hostaddr
= addr
+ entry
->addend
;
104 res
= glue(glue(ld
, USUFFIX
), _p
)((uint8_t *)hostaddr
);
106 #ifndef SOFTMMU_CODE_ACCESS
107 qemu_plugin_vcpu_mem_cb(env_cpu(env
), ptr
, meminfo
);
112 static inline RES_TYPE
113 glue(glue(cpu_ld
, USUFFIX
), MEMSUFFIX
)(CPUArchState
*env
, target_ulong ptr
)
115 return glue(glue(glue(cpu_ld
, USUFFIX
), MEMSUFFIX
), _ra
)(env
, ptr
, 0);
120 glue(glue(glue(cpu_lds
, SUFFIX
), MEMSUFFIX
), _ra
)(CPUArchState
*env
,
127 int mmu_idx
= CPU_MMU_INDEX
;
129 #if !defined(SOFTMMU_CODE_ACCESS)
130 uint16_t meminfo
= trace_mem_build_info(SHIFT
, true, MO_TE
, false, mmu_idx
);
131 trace_guest_mem_before_exec(env_cpu(env
), ptr
, meminfo
);
135 entry
= tlb_entry(env
, mmu_idx
, addr
);
136 if (unlikely(entry
->ADDR_READ
!=
137 (addr
& (TARGET_PAGE_MASK
| (DATA_SIZE
- 1))))) {
138 oi
= make_memop_idx(SHIFT
, mmu_idx
);
139 res
= (DATA_STYPE
)glue(glue(helper_ret_ld
, SRETSUFFIX
),
140 MMUSUFFIX
)(env
, addr
, oi
, retaddr
);
142 uintptr_t hostaddr
= addr
+ entry
->addend
;
143 res
= glue(glue(lds
, SUFFIX
), _p
)((uint8_t *)hostaddr
);
145 #ifndef SOFTMMU_CODE_ACCESS
146 qemu_plugin_vcpu_mem_cb(env_cpu(env
), ptr
, meminfo
);
152 glue(glue(cpu_lds
, SUFFIX
), MEMSUFFIX
)(CPUArchState
*env
, target_ulong ptr
)
154 return glue(glue(glue(cpu_lds
, SUFFIX
), MEMSUFFIX
), _ra
)(env
, ptr
, 0);
158 #ifndef SOFTMMU_CODE_ACCESS
160 /* generic store macro */
163 glue(glue(glue(cpu_st
, SUFFIX
), MEMSUFFIX
), _ra
)(CPUArchState
*env
,
165 RES_TYPE v
, uintptr_t retaddr
)
169 int mmu_idx
= CPU_MMU_INDEX
;
171 #if !defined(SOFTMMU_CODE_ACCESS)
172 uint16_t meminfo
= trace_mem_build_info(SHIFT
, false, MO_TE
, true, mmu_idx
);
173 trace_guest_mem_before_exec(env_cpu(env
), ptr
, meminfo
);
177 entry
= tlb_entry(env
, mmu_idx
, addr
);
178 if (unlikely(tlb_addr_write(entry
) !=
179 (addr
& (TARGET_PAGE_MASK
| (DATA_SIZE
- 1))))) {
180 oi
= make_memop_idx(SHIFT
, mmu_idx
);
181 glue(glue(helper_ret_st
, SUFFIX
), MMUSUFFIX
)(env
, addr
, v
, oi
,
184 uintptr_t hostaddr
= addr
+ entry
->addend
;
185 glue(glue(st
, SUFFIX
), _p
)((uint8_t *)hostaddr
, v
);
187 #ifndef SOFTMMU_CODE_ACCESS
188 qemu_plugin_vcpu_mem_cb(env_cpu(env
), ptr
, meminfo
);
193 glue(glue(cpu_st
, SUFFIX
), MEMSUFFIX
)(CPUArchState
*env
, target_ulong ptr
,
196 glue(glue(glue(cpu_st
, SUFFIX
), MEMSUFFIX
), _ra
)(env
, ptr
, v
, 0);
199 #endif /* !SOFTMMU_CODE_ACCESS */