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#include "qemu/osdep.h"
  21#include "cpu.h"
  22#include "qemu/units.h"
  23#include "exec/cpu_ldst.h"
  24#include "exec/exec-all.h"
  25
  26#undef DEBUG_REMAP
  27
  28#include "exec/user/abitypes.h"
  29
  30extern char **environ;
  31
  32enum BSDType {
  33    target_freebsd,
  34    target_netbsd,
  35    target_openbsd,
  36};
  37extern enum BSDType bsd_type;
  38
  39#include "exec/user/thunk.h"
  40#include "target_arch.h"
  41#include "syscall_defs.h"
  42#include "target_syscall.h"
  43#include "target_os_vmparam.h"
  44#include "target_os_signal.h"
  45#include "exec/gdbstub.h"
  46
  47/*
  48 * This struct is used to hold certain information about the image.  Basically,
  49 * it replicates in user space what would be certain task_struct fields in the
  50 * kernel
  51 */
  52struct image_info {
  53    abi_ulong load_bias;
  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    abi_ulong arg_start;
  69    abi_ulong arg_end;
  70    uint32_t  elf_flags;
  71};
  72
  73#define MAX_SIGQUEUE_SIZE 1024
  74
  75struct qemu_sigqueue {
  76    struct qemu_sigqueue *next;
  77    target_siginfo_t info;
  78};
  79
  80struct emulated_sigtable {
  81    int pending; /* true if signal is pending */
  82    struct qemu_sigqueue *first;
  83    struct qemu_sigqueue info;  /* Put first signal info here */
  84};
  85
  86/*
  87 * NOTE: we force a big alignment so that the stack stored after is aligned too
  88 */
  89typedef struct TaskState {
  90    pid_t ts_tid;     /* tid (or pid) of this task */
  91
  92    struct TaskState *next;
  93    struct bsd_binprm *bprm;
  94    struct image_info *info;
  95
  96    struct emulated_sigtable sigtab[TARGET_NSIG];
  97    struct qemu_sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
  98    struct qemu_sigqueue *first_free; /* first free siginfo queue entry */
  99    int signal_pending; /* non zero if a signal may be pending */
 100
 101    uint8_t stack[];
 102} __attribute__((aligned(16))) TaskState;
 103
 104void init_task_state(TaskState *ts);
 105void stop_all_tasks(void);
 106extern const char *qemu_uname_release;
 107
 108/*
 109 * TARGET_ARG_MAX defines the number of bytes allocated for arguments
 110 * and envelope for the new program. 256k should suffice for a reasonable
 111 * maxiumum env+arg in 32-bit environments, bump it up to 512k for !ILP32
 112 * platforms.
 113 */
 114#if TARGET_ABI_BITS > 32
 115#define TARGET_ARG_MAX (512 * KiB)
 116#else
 117#define TARGET_ARG_MAX (256 * KiB)
 118#endif
 119#define MAX_ARG_PAGES (TARGET_ARG_MAX / TARGET_PAGE_SIZE)
 120
 121/*
 122 * This structure is used to hold the arguments that are
 123 * used when loading binaries.
 124 */
 125struct bsd_binprm {
 126        char buf[128];
 127        void *page[MAX_ARG_PAGES];
 128        abi_ulong p;
 129        abi_ulong stringp;
 130        int fd;
 131        int e_uid, e_gid;
 132        int argc, envc;
 133        char **argv;
 134        char **envp;
 135        char *filename;         /* (Given) Name of binary */
 136        char *fullpath;         /* Full path of binary */
 137        int (*core_dump)(int, CPUArchState *);
 138};
 139
 140void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
 141abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
 142                              abi_ulong stringp);
 143int loader_exec(const char *filename, char **argv, char **envp,
 144                struct target_pt_regs *regs, struct image_info *infop,
 145                struct bsd_binprm *bprm);
 146
 147int load_elf_binary(struct bsd_binprm *bprm, struct target_pt_regs *regs,
 148                    struct image_info *info);
 149int load_flt_binary(struct bsd_binprm *bprm, struct target_pt_regs *regs,
 150                    struct image_info *info);
 151int is_target_elf_binary(int fd);
 152
 153abi_long memcpy_to_target(abi_ulong dest, const void *src,
 154                          unsigned long len);
 155void target_set_brk(abi_ulong new_brk);
 156abi_long do_brk(abi_ulong new_brk);
 157void syscall_init(void);
 158abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
 159                            abi_long arg2, abi_long arg3, abi_long arg4,
 160                            abi_long arg5, abi_long arg6, abi_long arg7,
 161                            abi_long arg8);
 162abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
 163                           abi_long arg2, abi_long arg3, abi_long arg4,
 164                           abi_long arg5, abi_long arg6);
 165abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
 166                            abi_long arg2, abi_long arg3, abi_long arg4,
 167                            abi_long arg5, abi_long arg6);
 168void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
 169extern __thread CPUState *thread_cpu;
 170void cpu_loop(CPUArchState *env);
 171char *target_strerror(int err);
 172int get_osversion(void);
 173void fork_start(void);
 174void fork_end(int child);
 175
 176#include "qemu/log.h"
 177
 178/* strace.c */
 179struct syscallname {
 180    int nr;
 181    const char *name;
 182    const char *format;
 183    void (*call)(const struct syscallname *,
 184                 abi_long, abi_long, abi_long,
 185                 abi_long, abi_long, abi_long);
 186    void (*result)(const struct syscallname *, abi_long);
 187};
 188
 189void
 190print_freebsd_syscall(int num,
 191                      abi_long arg1, abi_long arg2, abi_long arg3,
 192                      abi_long arg4, abi_long arg5, abi_long arg6);
 193void print_freebsd_syscall_ret(int num, abi_long ret);
 194void
 195print_netbsd_syscall(int num,
 196                     abi_long arg1, abi_long arg2, abi_long arg3,
 197                     abi_long arg4, abi_long arg5, abi_long arg6);
 198void print_netbsd_syscall_ret(int num, abi_long ret);
 199void
 200print_openbsd_syscall(int num,
 201                      abi_long arg1, abi_long arg2, abi_long arg3,
 202                      abi_long arg4, abi_long arg5, abi_long arg6);
 203void print_openbsd_syscall_ret(int num, abi_long ret);
 204extern int do_strace;
 205
 206/* signal.c */
 207void process_pending_signals(CPUArchState *cpu_env);
 208void signal_init(void);
 209long do_sigreturn(CPUArchState *env);
 210long do_rt_sigreturn(CPUArchState *env);
 211void queue_signal(CPUArchState *env, int sig, target_siginfo_t *info);
 212abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
 213
 214/* mmap.c */
 215int target_mprotect(abi_ulong start, abi_ulong len, int prot);
 216abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
 217                     int flags, int fd, off_t offset);
 218int target_munmap(abi_ulong start, abi_ulong len);
 219abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
 220                       abi_ulong new_size, unsigned long flags,
 221                       abi_ulong new_addr);
 222int target_msync(abi_ulong start, abi_ulong len, int flags);
 223extern unsigned long last_brk;
 224extern abi_ulong mmap_next_start;
 225abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size);
 226void mmap_fork_start(void);
 227void mmap_fork_end(int child);
 228
 229/* main.c */
 230extern char qemu_proc_pathname[];
 231extern unsigned long target_maxtsiz;
 232extern unsigned long target_dfldsiz;
 233extern unsigned long target_maxdsiz;
 234extern unsigned long target_dflssiz;
 235extern unsigned long target_maxssiz;
 236extern unsigned long target_sgrowsiz;
 237
 238/* syscall.c */
 239abi_long get_errno(abi_long ret);
 240bool is_error(abi_long ret);
 241
 242/* os-sys.c */
 243abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2);
 244
 245/* user access */
 246
 247#define VERIFY_READ  PAGE_READ
 248#define VERIFY_WRITE (PAGE_READ | PAGE_WRITE)
 249
 250static inline bool access_ok(int type, abi_ulong addr, abi_ulong size)
 251{
 252    return page_check_range((target_ulong)addr, size, type) == 0;
 253}
 254
 255/*
 256 * NOTE __get_user and __put_user use host pointers and don't check access.
 257 *
 258 * These are usually used to access struct data members once the struct has been
 259 * locked - usually with lock_user_struct().
 260 */
 261#define __put_user(x, hptr)\
 262({\
 263    int size = sizeof(*hptr);\
 264    switch (size) {\
 265    case 1:\
 266        *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\
 267        break;\
 268    case 2:\
 269        *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
 270        break;\
 271    case 4:\
 272        *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
 273        break;\
 274    case 8:\
 275        *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
 276        break;\
 277    default:\
 278        abort();\
 279    } \
 280    0;\
 281})
 282
 283#define __get_user(x, hptr) \
 284({\
 285    int size = sizeof(*hptr);\
 286    switch (size) {\
 287    case 1:\
 288        x = (typeof(*hptr))*(uint8_t *)(hptr);\
 289        break;\
 290    case 2:\
 291        x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
 292        break;\
 293    case 4:\
 294        x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
 295        break;\
 296    case 8:\
 297        x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
 298        break;\
 299    default:\
 300        x = 0;\
 301        abort();\
 302    } \
 303    0;\
 304})
 305
 306/*
 307 * put_user()/get_user() take a guest address and check access
 308 *
 309 * These are usually used to access an atomic data type, such as an int, that
 310 * has been passed by address.  These internally perform locking and unlocking
 311 * on the data type.
 312 */
 313#define put_user(x, gaddr, target_type)                                 \
 314({                                                                      \
 315    abi_ulong __gaddr = (gaddr);                                        \
 316    target_type *__hptr;                                                \
 317    abi_long __ret;                                                     \
 318    __hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0);  \
 319    if (__hptr) {                                                       \
 320        __ret = __put_user((x), __hptr);                                \
 321        unlock_user(__hptr, __gaddr, sizeof(target_type));              \
 322    } else                                                              \
 323        __ret = -TARGET_EFAULT;                                         \
 324    __ret;                                                              \
 325})
 326
 327#define get_user(x, gaddr, target_type)                                 \
 328({                                                                      \
 329    abi_ulong __gaddr = (gaddr);                                        \
 330    target_type *__hptr;                                                \
 331    abi_long __ret;                                                     \
 332    __hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1);   \
 333    if (__hptr) {                                                       \
 334        __ret = __get_user((x), __hptr);                                \
 335        unlock_user(__hptr, __gaddr, 0);                                \
 336    } else {                                                            \
 337        (x) = 0;                                                        \
 338        __ret = -TARGET_EFAULT;                                         \
 339    }                                                                   \
 340    __ret;                                                              \
 341})
 342
 343#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
 344#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
 345#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
 346#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
 347#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
 348#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
 349#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
 350#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
 351#define put_user_u8(x, gaddr)  put_user((x), (gaddr), uint8_t)
 352#define put_user_s8(x, gaddr)  put_user((x), (gaddr), int8_t)
 353
 354#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
 355#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
 356#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
 357#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
 358#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
 359#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
 360#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
 361#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
 362#define get_user_u8(x, gaddr)  get_user((x), (gaddr), uint8_t)
 363#define get_user_s8(x, gaddr)  get_user((x), (gaddr), int8_t)
 364
 365/*
 366 * copy_from_user() and copy_to_user() are usually used to copy data
 367 * buffers between the target and host.  These internally perform
 368 * locking/unlocking of the memory.
 369 */
 370abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
 371abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
 372
 373/*
 374 * Functions for accessing guest memory.  The tget and tput functions
 375 * read/write single values, byteswapping as necessary.  The lock_user function
 376 * gets a pointer to a contiguous area of guest memory, but does not perform
 377 * any byteswapping.  lock_user may return either a pointer to the guest
 378 * memory, or a temporary buffer.
 379 */
 380
 381/*
 382 * Lock an area of guest memory into the host.  If copy is true then the
 383 * host area will have the same contents as the guest.
 384 */
 385static inline void *lock_user(int type, abi_ulong guest_addr, long len,
 386                              int copy)
 387{
 388    if (!access_ok(type, guest_addr, len)) {
 389        return NULL;
 390    }
 391#ifdef DEBUG_REMAP
 392    {
 393        void *addr;
 394        addr = g_malloc(len);
 395        if (copy) {
 396            memcpy(addr, g2h_untagged(guest_addr), len);
 397        } else {
 398            memset(addr, 0, len);
 399        }
 400        return addr;
 401    }
 402#else
 403    return g2h_untagged(guest_addr);
 404#endif
 405}
 406
 407/*
 408 * Unlock an area of guest memory.  The first LEN bytes must be flushed back to
 409 * guest memory. host_ptr = NULL is explicitly allowed and does nothing.
 410 */
 411static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
 412                               long len)
 413{
 414
 415#ifdef DEBUG_REMAP
 416    if (!host_ptr) {
 417        return;
 418    }
 419    if (host_ptr == g2h_untagged(guest_addr)) {
 420        return;
 421    }
 422    if (len > 0) {
 423        memcpy(g2h_untagged(guest_addr), host_ptr, len);
 424    }
 425    g_free(host_ptr);
 426#endif
 427}
 428
 429/*
 430 * Return the length of a string in target memory or -TARGET_EFAULT if access
 431 * error.
 432 */
 433abi_long target_strlen(abi_ulong gaddr);
 434
 435/* Like lock_user but for null terminated strings.  */
 436static inline void *lock_user_string(abi_ulong guest_addr)
 437{
 438    abi_long len;
 439    len = target_strlen(guest_addr);
 440    if (len < 0) {
 441        return NULL;
 442    }
 443    return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
 444}
 445
 446/* Helper macros for locking/unlocking a target struct.  */
 447#define lock_user_struct(type, host_ptr, guest_addr, copy)      \
 448    (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
 449#define unlock_user_struct(host_ptr, guest_addr, copy)          \
 450    unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
 451
 452#include <pthread.h>
 453
 454#endif /* QEMU_H */
 455