]>
Commit | Line | Data |
---|---|---|
5fafdf24 | 1 | /* |
6b3a45cc PB |
2 | * Helper routines to provide target memory access for semihosting |
3 | * syscalls in system emulation mode. | |
4 | * | |
5 | * Copyright (c) 2007 CodeSourcery. | |
6 | * | |
8e31bf38 | 7 | * This code is licensed under the GPL |
6b3a45cc | 8 | */ |
175de524 | 9 | |
cb9c377f | 10 | #ifndef SOFTMMU_SEMI_H |
175de524 | 11 | #define SOFTMMU_SEMI_H |
6b3a45cc | 12 | |
44d4a499 PM |
13 | static inline uint64_t softmmu_tget64(CPUArchState *env, target_ulong addr) |
14 | { | |
15 | uint64_t val; | |
16 | ||
17 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, (uint8_t *)&val, 8, 0); | |
18 | return tswap64(val); | |
19 | } | |
20 | ||
9f6f7ca1 | 21 | static inline uint32_t softmmu_tget32(CPUArchState *env, target_ulong addr) |
6b3a45cc PB |
22 | { |
23 | uint32_t val; | |
24 | ||
f17ec444 | 25 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, (uint8_t *)&val, 4, 0); |
6b3a45cc PB |
26 | return tswap32(val); |
27 | } | |
44d4a499 | 28 | |
9f6f7ca1 | 29 | static inline uint32_t softmmu_tget8(CPUArchState *env, target_ulong addr) |
6b3a45cc PB |
30 | { |
31 | uint8_t val; | |
32 | ||
f17ec444 | 33 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, &val, 1, 0); |
6b3a45cc PB |
34 | return val; |
35 | } | |
2f619698 | 36 | |
44d4a499 | 37 | #define get_user_u64(arg, p) ({ arg = softmmu_tget64(env, p); 0; }) |
2f619698 FB |
38 | #define get_user_u32(arg, p) ({ arg = softmmu_tget32(env, p) ; 0; }) |
39 | #define get_user_u8(arg, p) ({ arg = softmmu_tget8(env, p) ; 0; }) | |
40 | #define get_user_ual(arg, p) get_user_u32(arg, p) | |
6b3a45cc | 41 | |
44d4a499 PM |
42 | static inline void softmmu_tput64(CPUArchState *env, |
43 | target_ulong addr, uint64_t val) | |
44 | { | |
45 | val = tswap64(val); | |
46 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, (uint8_t *)&val, 8, 1); | |
47 | } | |
48 | ||
9f6f7ca1 MR |
49 | static inline void softmmu_tput32(CPUArchState *env, |
50 | target_ulong addr, uint32_t val) | |
6b3a45cc PB |
51 | { |
52 | val = tswap32(val); | |
f17ec444 | 53 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, (uint8_t *)&val, 4, 1); |
6b3a45cc | 54 | } |
44d4a499 | 55 | #define put_user_u64(arg, p) ({ softmmu_tput64(env, p, arg) ; 0; }) |
2f619698 FB |
56 | #define put_user_u32(arg, p) ({ softmmu_tput32(env, p, arg) ; 0; }) |
57 | #define put_user_ual(arg, p) put_user_u32(arg, p) | |
6b3a45cc | 58 | |
9f6f7ca1 MR |
59 | static void *softmmu_lock_user(CPUArchState *env, |
60 | target_ulong addr, target_ulong len, int copy) | |
6b3a45cc | 61 | { |
b55266b5 | 62 | uint8_t *p; |
6b3a45cc PB |
63 | /* TODO: Make this something that isn't fixed size. */ |
64 | p = malloc(len); | |
f17ec444 AF |
65 | if (p && copy) { |
66 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, p, len, 0); | |
67 | } | |
6b3a45cc PB |
68 | return p; |
69 | } | |
579a97f7 | 70 | #define lock_user(type, p, len, copy) softmmu_lock_user(env, p, len, copy) |
9f6f7ca1 | 71 | static char *softmmu_lock_user_string(CPUArchState *env, target_ulong addr) |
6b3a45cc PB |
72 | { |
73 | char *p; | |
74 | char *s; | |
75 | uint8_t c; | |
76 | /* TODO: Make this something that isn't fixed size. */ | |
77 | s = p = malloc(1024); | |
15d9e3bc JM |
78 | if (!s) { |
79 | return NULL; | |
80 | } | |
6b3a45cc | 81 | do { |
f17ec444 | 82 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, &c, 1, 0); |
6b3a45cc PB |
83 | addr++; |
84 | *(p++) = c; | |
85 | } while (c); | |
86 | return s; | |
87 | } | |
88 | #define lock_user_string(p) softmmu_lock_user_string(env, p) | |
9349b4f9 | 89 | static void softmmu_unlock_user(CPUArchState *env, void *p, target_ulong addr, |
6b3a45cc PB |
90 | target_ulong len) |
91 | { | |
f17ec444 AF |
92 | if (len) { |
93 | cpu_memory_rw_debug(ENV_GET_CPU(env), addr, p, len, 1); | |
94 | } | |
6b3a45cc PB |
95 | free(p); |
96 | } | |
97 | #define unlock_user(s, args, len) softmmu_unlock_user(env, s, args, len) | |
cb9c377f PB |
98 | |
99 | #endif |