qemu/bsd-user/qemu.h
<<
>>
Prefs
   1#ifndef QEMU_H
   2#define QEMU_H
   3
   4#include <signal.h>
   5#include <string.h>
   6
   7#include "cpu.h"
   8
   9#undef DEBUG_REMAP
  10#ifdef DEBUG_REMAP
  11#include <stdlib.h>
  12#endif /* DEBUG_REMAP */
  13
  14#include "qemu-types.h"
  15
  16enum BSDType {
  17    target_freebsd,
  18    target_netbsd,
  19    target_openbsd,
  20};
  21
  22#include "syscall_defs.h"
  23#include "syscall.h"
  24#include "target_signal.h"
  25#include "gdbstub.h"
  26
  27#if defined(USE_NPTL)
  28#define THREAD __thread
  29#else
  30#define THREAD
  31#endif
  32
  33/* This struct is used to hold certain information about the image.
  34 * Basically, it replicates in user space what would be certain
  35 * task_struct fields in the kernel
  36 */
  37struct image_info {
  38    abi_ulong load_addr;
  39    abi_ulong start_code;
  40    abi_ulong end_code;
  41    abi_ulong start_data;
  42    abi_ulong end_data;
  43    abi_ulong start_brk;
  44    abi_ulong brk;
  45    abi_ulong start_mmap;
  46    abi_ulong mmap;
  47    abi_ulong rss;
  48    abi_ulong start_stack;
  49    abi_ulong entry;
  50    abi_ulong code_offset;
  51    abi_ulong data_offset;
  52    char      **host_argv;
  53    int       personality;
  54};
  55
  56#define MAX_SIGQUEUE_SIZE 1024
  57
  58struct sigqueue {
  59    struct sigqueue *next;
  60    //target_siginfo_t info;
  61};
  62
  63struct emulated_sigtable {
  64    int pending; /* true if signal is pending */
  65    struct sigqueue *first;
  66    struct sigqueue info; /* in order to always have memory for the
  67                             first signal, we put it here */
  68};
  69
  70/* NOTE: we force a big alignment so that the stack stored after is
  71   aligned too */
  72typedef struct TaskState {
  73    struct TaskState *next;
  74    int used; /* non zero if used */
  75    struct image_info *info;
  76
  77    struct emulated_sigtable sigtab[TARGET_NSIG];
  78    struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
  79    struct sigqueue *first_free; /* first free siginfo queue entry */
  80    int signal_pending; /* non zero if a signal may be pending */
  81
  82    uint8_t stack[0];
  83} __attribute__((aligned(16))) TaskState;
  84
  85void init_task_state(TaskState *ts);
  86extern const char *qemu_uname_release;
  87
  88/* ??? See if we can avoid exposing so much of the loader internals.  */
  89/*
  90 * MAX_ARG_PAGES defines the number of pages allocated for arguments
  91 * and envelope for the new program. 32 should suffice, this gives
  92 * a maximum env+arg of 128kB w/4KB pages!
  93 */
  94#define MAX_ARG_PAGES 32
  95
  96/*
  97 * This structure is used to hold the arguments that are
  98 * used when loading binaries.
  99 */
 100struct linux_binprm {
 101        char buf[128];
 102        void *page[MAX_ARG_PAGES];
 103        abi_ulong p;
 104        int fd;
 105        int e_uid, e_gid;
 106        int argc, envc;
 107        char **argv;
 108        char **envp;
 109        char * filename;        /* Name of binary */
 110};
 111
 112void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
 113abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
 114                              abi_ulong stringp, int push_ptr);
 115int loader_exec(const char * filename, char ** argv, char ** envp,
 116             struct target_pt_regs * regs, struct image_info *infop);
 117
 118int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
 119                    struct image_info * info);
 120int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
 121                    struct image_info * info);
 122
 123abi_long memcpy_to_target(abi_ulong dest, const void *src,
 124                          unsigned long len);
 125void target_set_brk(abi_ulong new_brk);
 126abi_long do_brk(abi_ulong new_brk);
 127void syscall_init(void);
 128abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
 129                            abi_long arg2, abi_long arg3, abi_long arg4,
 130                            abi_long arg5, abi_long arg6);
 131abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
 132                           abi_long arg2, abi_long arg3, abi_long arg4,
 133                           abi_long arg5, abi_long arg6);
 134abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
 135                            abi_long arg2, abi_long arg3, abi_long arg4,
 136                            abi_long arg5, abi_long arg6);
 137void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
 138extern THREAD CPUState *thread_env;
 139void cpu_loop(CPUState *env, enum BSDType bsd_type);
 140void init_paths(const char *prefix);
 141const char *path(const char *pathname);
 142char *target_strerror(int err);
 143int get_osversion(void);
 144void fork_start(void);
 145void fork_end(int child);
 146
 147#include "qemu-log.h"
 148
 149/* strace.c */
 150void
 151print_freebsd_syscall(int num,
 152                      abi_long arg1, abi_long arg2, abi_long arg3,
 153                      abi_long arg4, abi_long arg5, abi_long arg6);
 154void print_freebsd_syscall_ret(int num, abi_long ret);
 155void
 156print_netbsd_syscall(int num,
 157                     abi_long arg1, abi_long arg2, abi_long arg3,
 158                     abi_long arg4, abi_long arg5, abi_long arg6);
 159void print_netbsd_syscall_ret(int num, abi_long ret);
 160void
 161print_openbsd_syscall(int num,
 162                      abi_long arg1, abi_long arg2, abi_long arg3,
 163                      abi_long arg4, abi_long arg5, abi_long arg6);
 164void print_openbsd_syscall_ret(int num, abi_long ret);
 165extern int do_strace;
 166
 167/* signal.c */
 168void process_pending_signals(CPUState *cpu_env);
 169void signal_init(void);
 170//int queue_signal(CPUState *env, int sig, target_siginfo_t *info);
 171//void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
 172//void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
 173long do_sigreturn(CPUState *env);
 174long do_rt_sigreturn(CPUState *env);
 175abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
 176
 177/* mmap.c */
 178int target_mprotect(abi_ulong start, abi_ulong len, int prot);
 179abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
 180                     int flags, int fd, abi_ulong offset);
 181int target_munmap(abi_ulong start, abi_ulong len);
 182abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
 183                       abi_ulong new_size, unsigned long flags,
 184                       abi_ulong new_addr);
 185int target_msync(abi_ulong start, abi_ulong len, int flags);
 186extern unsigned long last_brk;
 187void mmap_lock(void);
 188void mmap_unlock(void);
 189#if defined(USE_NPTL)
 190void mmap_fork_start(void);
 191void mmap_fork_end(int child);
 192#endif
 193
 194/* user access */
 195
 196#define VERIFY_READ 0
 197#define VERIFY_WRITE 1 /* implies read access */
 198
 199static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
 200{
 201    return page_check_range((target_ulong)addr, size,
 202                            (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0;
 203}
 204
 205/* NOTE __get_user and __put_user use host pointers and don't check access. */
 206/* These are usually used to access struct data members once the
 207 * struct has been locked - usually with lock_user_struct().
 208 */
 209#define __put_user(x, hptr)\
 210({\
 211    int size = sizeof(*hptr);\
 212    switch(size) {\
 213    case 1:\
 214        *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\
 215        break;\
 216    case 2:\
 217        *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
 218        break;\
 219    case 4:\
 220        *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
 221        break;\
 222    case 8:\
 223        *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
 224        break;\
 225    default:\
 226        abort();\
 227    }\
 228    0;\
 229})
 230
 231#define __get_user(x, hptr) \
 232({\
 233    int size = sizeof(*hptr);\
 234    switch(size) {\
 235    case 1:\
 236        x = (typeof(*hptr))*(uint8_t *)(hptr);\
 237        break;\
 238    case 2:\
 239        x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
 240        break;\
 241    case 4:\
 242        x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
 243        break;\
 244    case 8:\
 245        x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
 246        break;\
 247    default:\
 248        /* avoid warning */\
 249        x = 0;\
 250        abort();\
 251    }\
 252    0;\
 253})
 254
 255/* put_user()/get_user() take a guest address and check access */
 256/* These are usually used to access an atomic data type, such as an int,
 257 * that has been passed by address.  These internally perform locking
 258 * and unlocking on the data type.
 259 */
 260#define put_user(x, gaddr, target_type)                                 \
 261({                                                                      \
 262    abi_ulong __gaddr = (gaddr);                                        \
 263    target_type *__hptr;                                                \
 264    abi_long __ret;                                                     \
 265    if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
 266        __ret = __put_user((x), __hptr);                                \
 267        unlock_user(__hptr, __gaddr, sizeof(target_type));              \
 268    } else                                                              \
 269        __ret = -TARGET_EFAULT;                                         \
 270    __ret;                                                              \
 271})
 272
 273#define get_user(x, gaddr, target_type)                                 \
 274({                                                                      \
 275    abi_ulong __gaddr = (gaddr);                                        \
 276    target_type *__hptr;                                                \
 277    abi_long __ret;                                                     \
 278    if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
 279        __ret = __get_user((x), __hptr);                                \
 280        unlock_user(__hptr, __gaddr, 0);                                \
 281    } else {                                                            \
 282        /* avoid warning */                                             \
 283        (x) = 0;                                                        \
 284        __ret = -TARGET_EFAULT;                                         \
 285    }                                                                   \
 286    __ret;                                                              \
 287})
 288
 289#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
 290#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
 291#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
 292#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
 293#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
 294#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
 295#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
 296#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
 297#define put_user_u8(x, gaddr)  put_user((x), (gaddr), uint8_t)
 298#define put_user_s8(x, gaddr)  put_user((x), (gaddr), int8_t)
 299
 300#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
 301#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
 302#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
 303#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
 304#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
 305#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
 306#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
 307#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
 308#define get_user_u8(x, gaddr)  get_user((x), (gaddr), uint8_t)
 309#define get_user_s8(x, gaddr)  get_user((x), (gaddr), int8_t)
 310
 311/* copy_from_user() and copy_to_user() are usually used to copy data
 312 * buffers between the target and host.  These internally perform
 313 * locking/unlocking of the memory.
 314 */
 315abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
 316abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
 317
 318/* Functions for accessing guest memory.  The tget and tput functions
 319   read/write single values, byteswapping as neccessary.  The lock_user
 320   gets a pointer to a contiguous area of guest memory, but does not perform
 321   and byteswapping.  lock_user may return either a pointer to the guest
 322   memory, or a temporary buffer.  */
 323
 324/* Lock an area of guest memory into the host.  If copy is true then the
 325   host area will have the same contents as the guest.  */
 326static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy)
 327{
 328    if (!access_ok(type, guest_addr, len))
 329        return NULL;
 330#ifdef DEBUG_REMAP
 331    {
 332        void *addr;
 333        addr = malloc(len);
 334        if (copy)
 335            memcpy(addr, g2h(guest_addr), len);
 336        else
 337            memset(addr, 0, len);
 338        return addr;
 339    }
 340#else
 341    return g2h(guest_addr);
 342#endif
 343}
 344
 345/* Unlock an area of guest memory.  The first LEN bytes must be
 346   flushed back to guest memory. host_ptr = NULL is explicitly
 347   allowed and does nothing. */
 348static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
 349                               long len)
 350{
 351
 352#ifdef DEBUG_REMAP
 353    if (!host_ptr)
 354        return;
 355    if (host_ptr == g2h(guest_addr))
 356        return;
 357    if (len > 0)
 358        memcpy(g2h(guest_addr), host_ptr, len);
 359    free(host_ptr);
 360#endif
 361}
 362
 363/* Return the length of a string in target memory or -TARGET_EFAULT if
 364   access error. */
 365abi_long target_strlen(abi_ulong gaddr);
 366
 367/* Like lock_user but for null terminated strings.  */
 368static inline void *lock_user_string(abi_ulong guest_addr)
 369{
 370    abi_long len;
 371    len = target_strlen(guest_addr);
 372    if (len < 0)
 373        return NULL;
 374    return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
 375}
 376
 377/* Helper macros for locking/ulocking a target struct.  */
 378#define lock_user_struct(type, host_ptr, guest_addr, copy)      \
 379    (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
 380#define unlock_user_struct(host_ptr, guest_addr, copy)          \
 381    unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
 382
 383#if defined(USE_NPTL)
 384#include <pthread.h>
 385#endif
 386
 387#endif /* QEMU_H */
 388