symbian-qemu-0.9.1-12/qemu-symbian-svp/softmmu-semi.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2  * Helper routines to provide target memory access for semihosting
       
     3  * syscalls in system emulation mode.
       
     4  *
       
     5  * Copyright (c) 2007 CodeSourcery.
       
     6  *
       
     7  * This code is licenced under the GPL
       
     8  */
       
     9 
       
    10 static inline uint32_t softmmu_tget32(CPUState *env, uint32_t addr)
       
    11 {
       
    12     uint32_t val;
       
    13 
       
    14     cpu_memory_rw_debug(env, addr, (uint8_t *)&val, 4, 0);
       
    15     return tswap32(val);
       
    16 }
       
    17 static inline uint32_t softmmu_tget8(CPUState *env, uint32_t addr)
       
    18 {
       
    19     uint8_t val;
       
    20 
       
    21     cpu_memory_rw_debug(env, addr, &val, 1, 0);
       
    22     return val;
       
    23 }
       
    24 
       
    25 #define get_user_u32(arg, p) ({ arg = softmmu_tget32(env, p) ; 0; })
       
    26 #define get_user_u8(arg, p) ({ arg = softmmu_tget8(env, p) ; 0; })
       
    27 #define get_user_ual(arg, p) get_user_u32(arg, p)
       
    28 
       
    29 static inline void softmmu_tput32(CPUState *env, uint32_t addr, uint32_t val)
       
    30 {
       
    31     val = tswap32(val);
       
    32     cpu_memory_rw_debug(env, addr, (uint8_t *)&val, 4, 1);
       
    33 }
       
    34 #define put_user_u32(arg, p) ({ softmmu_tput32(env, p, arg) ; 0; })
       
    35 #define put_user_ual(arg, p) put_user_u32(arg, p)
       
    36 
       
    37 static void *softmmu_lock_user(CPUState *env, uint32_t addr, uint32_t len,
       
    38                                int copy)
       
    39 {
       
    40     uint8_t *p;
       
    41     /* TODO: Make this something that isn't fixed size.  */
       
    42     p = malloc(len);
       
    43     if (copy)
       
    44         cpu_memory_rw_debug(env, addr, p, len, 0);
       
    45     return p;
       
    46 }
       
    47 #define lock_user(type, p, len, copy) softmmu_lock_user(env, p, len, copy)
       
    48 static char *softmmu_lock_user_string(CPUState *env, uint32_t addr)
       
    49 {
       
    50     char *p;
       
    51     char *s;
       
    52     uint8_t c;
       
    53     /* TODO: Make this something that isn't fixed size.  */
       
    54     s = p = malloc(1024);
       
    55     do {
       
    56         cpu_memory_rw_debug(env, addr, &c, 1, 0);
       
    57         addr++;
       
    58         *(p++) = c;
       
    59     } while (c);
       
    60     return s;
       
    61 }
       
    62 #define lock_user_string(p) softmmu_lock_user_string(env, p)
       
    63 static int softmmu_target_strlen(CPUState *env, target_ulong addr)
       
    64 {
       
    65     uint8_t c;
       
    66     int len;
       
    67 
       
    68     len = 0;
       
    69     do {
       
    70         cpu_memory_rw_debug(env, addr + len, &c, 1, 0);
       
    71         len++;
       
    72     } while (c);
       
    73 
       
    74     return len - 1;
       
    75 }
       
    76 #define target_strlen(p) softmmu_target_strlen(env, p)
       
    77 
       
    78 static void softmmu_unlock_user(CPUState *env, void *p, target_ulong addr,
       
    79                                 target_ulong len)
       
    80 {
       
    81     if (len)
       
    82         cpu_memory_rw_debug(env, addr, p, len, 1);
       
    83     free(p);
       
    84 }
       
    85 #define unlock_user(s, args, len) softmmu_unlock_user(env, s, args, len)