qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

qemu.h (16497B)


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