cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qemu.h (15168B)


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