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