|
151 | 151 | #define PRECISION_S 0
|
152 | 152 | #define PRECISION_D 1
|
153 | 153 |
|
154 |
| -#define DECLARE_UNPRIVILEGED_LOAD_FUNCTION(type, insn) \ |
155 |
| -static inline type load_##type(const type *addr) \ |
156 |
| -{ \ |
157 |
| - type val; \ |
158 |
| - asm (#insn " %0, %1" \ |
159 |
| - : "=&r" (val) : "m" (*addr)); \ |
160 |
| - return val; \ |
161 |
| -} |
| 154 | +static inline u8 load_u8(const u8 *addr) |
| 155 | +{ |
| 156 | + u8 val; |
162 | 157 |
|
163 |
| -#define DECLARE_UNPRIVILEGED_STORE_FUNCTION(type, insn) \ |
164 |
| -static inline void store_##type(type *addr, type val) \ |
165 |
| -{ \ |
166 |
| - asm volatile (#insn " %0, %1\n" \ |
167 |
| - : : "r" (val), "m" (*addr)); \ |
168 |
| -} |
| 158 | + asm volatile("lbu %0, %1" : "=&r" (val) : "m" (*addr)); |
169 | 159 |
|
170 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u8, lbu) |
171 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u16, lhu) |
172 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(s8, lb) |
173 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(s16, lh) |
174 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(s32, lw) |
175 |
| -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u8, sb) |
176 |
| -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u16, sh) |
177 |
| -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u32, sw) |
178 |
| -#if defined(CONFIG_64BIT) |
179 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u32, lwu) |
180 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u64, ld) |
181 |
| -DECLARE_UNPRIVILEGED_STORE_FUNCTION(u64, sd) |
182 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(ulong, ld) |
183 |
| -#else |
184 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(u32, lw) |
185 |
| -DECLARE_UNPRIVILEGED_LOAD_FUNCTION(ulong, lw) |
186 |
| - |
187 |
| -static inline u64 load_u64(const u64 *addr) |
188 |
| -{ |
189 |
| - return load_u32((u32 *)addr) |
190 |
| - + ((u64)load_u32((u32 *)addr + 1) << 32); |
| 160 | + return val; |
191 | 161 | }
|
192 | 162 |
|
193 |
| -static inline void store_u64(u64 *addr, u64 val) |
| 163 | +static inline void store_u8(u8 *addr, u8 val) |
194 | 164 | {
|
195 |
| - store_u32((u32 *)addr, val); |
196 |
| - store_u32((u32 *)addr + 1, val >> 32); |
| 165 | + asm volatile ("sb %0, %1\n" : : "r" (val), "m" (*addr)); |
197 | 166 | }
|
198 |
| -#endif |
199 | 167 |
|
200 | 168 | static inline ulong get_insn(ulong mepc)
|
201 | 169 | {
|
|
0 commit comments