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