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