]> git.proxmox.com Git - mirror_qemu.git/blame - include/exec/cpu_ldst_template.h
Revert "audio: fix pc speaker init"
[mirror_qemu.git] / include / exec / cpu_ldst_template.h
CommitLineData
b92e5a22
FB
1/*
2 * Software MMU support
5fafdf24 3 *
efbf29b6
BS
4 * Generate inline load/store functions for one MMU mode and data
5 * size.
6 *
82f11917 7 * Generate a store function as well as signed and unsigned loads.
efbf29b6 8 *
c773828a 9 * Not used directly but included from cpu_ldst.h.
efbf29b6 10 *
b92e5a22
FB
11 * Copyright (c) 2003 Fabrice Bellard
12 *
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.
17 *
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.
22 *
23 * You should have received a copy of the GNU Lesser General Public
8167ee88 24 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
b92e5a22 25 */
dcdaadb6
LV
26
27#if !defined(SOFTMMU_CODE_ACCESS)
0ab8ed18 28#include "trace-root.h"
dcdaadb6
LV
29#endif
30
31#include "trace/mem.h"
32
b92e5a22
FB
33#if DATA_SIZE == 8
34#define SUFFIX q
61382a50 35#define USUFFIX q
b92e5a22 36#define DATA_TYPE uint64_t
282dffc8 37#define SHIFT 3
b92e5a22
FB
38#elif DATA_SIZE == 4
39#define SUFFIX l
61382a50 40#define USUFFIX l
b92e5a22 41#define DATA_TYPE uint32_t
282dffc8 42#define SHIFT 2
b92e5a22
FB
43#elif DATA_SIZE == 2
44#define SUFFIX w
61382a50 45#define USUFFIX uw
b92e5a22
FB
46#define DATA_TYPE uint16_t
47#define DATA_STYPE int16_t
282dffc8 48#define SHIFT 1
b92e5a22
FB
49#elif DATA_SIZE == 1
50#define SUFFIX b
61382a50 51#define USUFFIX ub
b92e5a22
FB
52#define DATA_TYPE uint8_t
53#define DATA_STYPE int8_t
282dffc8 54#define SHIFT 0
b92e5a22
FB
55#else
56#error unsupported data size
57#endif
58
b92e5a22
FB
59#if DATA_SIZE == 8
60#define RES_TYPE uint64_t
61#else
c086b783 62#define RES_TYPE uint32_t
b92e5a22
FB
63#endif
64
859d7612 65#ifdef SOFTMMU_CODE_ACCESS
84b7b8e7 66#define ADDR_READ addr_code
a6c9eac0 67#define MMUSUFFIX _cmmu
282dffc8
PD
68#define URETSUFFIX SUFFIX
69#define SRETSUFFIX SUFFIX
84b7b8e7
FB
70#else
71#define ADDR_READ addr_read
a6c9eac0 72#define MMUSUFFIX _mmu
282dffc8
PD
73#define URETSUFFIX USUFFIX
74#define SRETSUFFIX glue(s, SUFFIX)
84b7b8e7 75#endif
b92e5a22 76
e16c53fa
FB
77/* generic load/store macros */
78
e141ab52 79static inline RES_TYPE
282dffc8
PD
80glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
81 target_ulong ptr,
82 uintptr_t retaddr)
b92e5a22 83{
383beda9 84 CPUTLBEntry *entry;
b92e5a22 85 RES_TYPE res;
c27004ec 86 target_ulong addr;
6ebbf390 87 int mmu_idx;
282dffc8 88 TCGMemOpIdx oi;
61382a50 89
dcdaadb6
LV
90#if !defined(SOFTMMU_CODE_ACCESS)
91 trace_guest_mem_before_exec(
92 ENV_GET_CPU(env), ptr,
93 trace_mem_build_info(SHIFT, false, MO_TE, false));
94#endif
95
c27004ec 96 addr = ptr;
6ebbf390 97 mmu_idx = CPU_MMU_INDEX;
383beda9
RH
98 entry = tlb_entry(env, mmu_idx, addr);
99 if (unlikely(entry->ADDR_READ !=
551bd27f 100 (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
282dffc8
PD
101 oi = make_memop_idx(SHIFT, mmu_idx);
102 res = glue(glue(helper_ret_ld, URETSUFFIX), MMUSUFFIX)(env, addr,
103 oi, retaddr);
b92e5a22 104 } else {
383beda9 105 uintptr_t hostaddr = addr + entry->addend;
35539232 106 res = glue(glue(ld, USUFFIX), _p)((uint8_t *)hostaddr);
b92e5a22
FB
107 }
108 return res;
109}
110
282dffc8
PD
111static inline RES_TYPE
112glue(glue(cpu_ld, USUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
113{
114 return glue(glue(glue(cpu_ld, USUFFIX), MEMSUFFIX), _ra)(env, ptr, 0);
115}
116
b92e5a22 117#if DATA_SIZE <= 2
e141ab52 118static inline int
282dffc8
PD
119glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
120 target_ulong ptr,
121 uintptr_t retaddr)
b92e5a22 122{
383beda9
RH
123 CPUTLBEntry *entry;
124 int res;
c27004ec 125 target_ulong addr;
6ebbf390 126 int mmu_idx;
282dffc8 127 TCGMemOpIdx oi;
61382a50 128
dcdaadb6
LV
129#if !defined(SOFTMMU_CODE_ACCESS)
130 trace_guest_mem_before_exec(
131 ENV_GET_CPU(env), ptr,
132 trace_mem_build_info(SHIFT, true, MO_TE, false));
133#endif
134
c27004ec 135 addr = ptr;
6ebbf390 136 mmu_idx = CPU_MMU_INDEX;
383beda9
RH
137 entry = tlb_entry(env, mmu_idx, addr);
138 if (unlikely(entry->ADDR_READ !=
551bd27f 139 (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
282dffc8
PD
140 oi = make_memop_idx(SHIFT, mmu_idx);
141 res = (DATA_STYPE)glue(glue(helper_ret_ld, SRETSUFFIX),
142 MMUSUFFIX)(env, addr, oi, retaddr);
b92e5a22 143 } else {
383beda9 144 uintptr_t hostaddr = addr + entry->addend;
35539232 145 res = glue(glue(lds, SUFFIX), _p)((uint8_t *)hostaddr);
b92e5a22
FB
146 }
147 return res;
148}
282dffc8
PD
149
150static inline int
151glue(glue(cpu_lds, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr)
152{
153 return glue(glue(glue(cpu_lds, SUFFIX), MEMSUFFIX), _ra)(env, ptr, 0);
154}
b92e5a22
FB
155#endif
156
859d7612 157#ifndef SOFTMMU_CODE_ACCESS
84b7b8e7 158
e16c53fa
FB
159/* generic store macro */
160
e141ab52 161static inline void
282dffc8
PD
162glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(CPUArchState *env,
163 target_ulong ptr,
164 RES_TYPE v, uintptr_t retaddr)
b92e5a22 165{
383beda9 166 CPUTLBEntry *entry;
c27004ec 167 target_ulong addr;
6ebbf390 168 int mmu_idx;
282dffc8 169 TCGMemOpIdx oi;
61382a50 170
dcdaadb6
LV
171#if !defined(SOFTMMU_CODE_ACCESS)
172 trace_guest_mem_before_exec(
173 ENV_GET_CPU(env), ptr,
174 trace_mem_build_info(SHIFT, false, MO_TE, true));
175#endif
176
c27004ec 177 addr = ptr;
6ebbf390 178 mmu_idx = CPU_MMU_INDEX;
383beda9 179 entry = tlb_entry(env, mmu_idx, addr);
403f290c 180 if (unlikely(tlb_addr_write(entry) !=
551bd27f 181 (addr & (TARGET_PAGE_MASK | (DATA_SIZE - 1))))) {
282dffc8
PD
182 oi = make_memop_idx(SHIFT, mmu_idx);
183 glue(glue(helper_ret_st, SUFFIX), MMUSUFFIX)(env, addr, v, oi,
184 retaddr);
b92e5a22 185 } else {
383beda9 186 uintptr_t hostaddr = addr + entry->addend;
35539232 187 glue(glue(st, SUFFIX), _p)((uint8_t *)hostaddr, v);
b92e5a22
FB
188 }
189}
190
282dffc8
PD
191static inline void
192glue(glue(cpu_st, SUFFIX), MEMSUFFIX)(CPUArchState *env, target_ulong ptr,
193 RES_TYPE v)
194{
195 glue(glue(glue(cpu_st, SUFFIX), MEMSUFFIX), _ra)(env, ptr, v, 0);
196}
197
859d7612 198#endif /* !SOFTMMU_CODE_ACCESS */
84b7b8e7 199
b92e5a22
FB
200#undef RES_TYPE
201#undef DATA_TYPE
202#undef DATA_STYPE
203#undef SUFFIX
61382a50 204#undef USUFFIX
b92e5a22 205#undef DATA_SIZE
61382a50 206#undef MMUSUFFIX
84b7b8e7 207#undef ADDR_READ
282dffc8
PD
208#undef URETSUFFIX
209#undef SRETSUFFIX
210#undef SHIFT