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