Statistics
| Branch: | Revision:

root / linux-user / qemu.h @ 4683b130

History | View | Annotate | Download (11.5 kB)

1
#ifndef QEMU_H
2
#define QEMU_H
3

    
4
#include <signal.h>
5
#include <string.h>
6

    
7
#include "cpu.h"
8

    
9
#ifdef TARGET_ABI32
10
typedef uint32_t abi_ulong;
11
typedef int32_t abi_long;
12
#define TARGET_ABI_FMT_lx "%08x"
13
#define TARGET_ABI_FMT_ld "%d"
14
#define TARGET_ABI_FMT_lu "%u"
15
#define TARGET_ABI_BITS 32
16
#else
17
typedef target_ulong abi_ulong;
18
typedef target_long abi_long;
19
#define TARGET_ABI_FMT_lx TARGET_FMT_lx
20
#define TARGET_ABI_FMT_ld TARGET_FMT_ld
21
#define TARGET_ABI_FMT_lu TARGET_FMT_lu
22
#define TARGET_ABI_BITS TARGET_LONG_BITS
23
/* for consistency, define ABI32 too */
24
#if TARGET_ABI_BITS == 32
25
#define TARGET_ABI32 1
26
#endif
27
#endif
28

    
29
#include "thunk.h"
30
#include "syscall_defs.h"
31
#include "syscall.h"
32
#include "target_signal.h"
33
#include "gdbstub.h"
34

    
35
/* This struct is used to hold certain information about the image.
36
 * Basically, it replicates in user space what would be certain
37
 * task_struct fields in the kernel
38
 */
39
struct image_info {
40
        abi_ulong       load_addr;
41
        abi_ulong       start_code;
42
        abi_ulong       end_code;
43
        abi_ulong       start_data;
44
        abi_ulong       end_data;
45
        abi_ulong       start_brk;
46
        abi_ulong       brk;
47
        abi_ulong       start_mmap;
48
        abi_ulong       mmap;
49
        abi_ulong       rss;
50
        abi_ulong       start_stack;
51
        abi_ulong       entry;
52
        abi_ulong       code_offset;
53
        abi_ulong       data_offset;
54
        char            **host_argv;
55
        int                personality;
56
};
57

    
58
#ifdef TARGET_I386
59
/* Information about the current linux thread */
60
struct vm86_saved_state {
61
    uint32_t eax; /* return code */
62
    uint32_t ebx;
63
    uint32_t ecx;
64
    uint32_t edx;
65
    uint32_t esi;
66
    uint32_t edi;
67
    uint32_t ebp;
68
    uint32_t esp;
69
    uint32_t eflags;
70
    uint32_t eip;
71
    uint16_t cs, ss, ds, es, fs, gs;
72
};
73
#endif
74

    
75
#ifdef TARGET_ARM
76
/* FPU emulator */
77
#include "nwfpe/fpa11.h"
78
#endif
79

    
80
/* NOTE: we force a big alignment so that the stack stored after is
81
   aligned too */
82
typedef struct TaskState {
83
    struct TaskState *next;
84
#ifdef TARGET_ARM
85
    /* FPA state */
86
    FPA11 fpa;
87
    int swi_errno;
88
#endif
89
#if defined(TARGET_I386) && !defined(TARGET_X86_64)
90
    abi_ulong target_v86;
91
    struct vm86_saved_state vm86_saved_regs;
92
    struct target_vm86plus_struct vm86plus;
93
    uint32_t v86flags;
94
    uint32_t v86mask;
95
#endif
96
#ifdef TARGET_M68K
97
    int sim_syscalls;
98
#endif
99
#if defined(TARGET_ARM) || defined(TARGET_M68K)
100
    /* Extra fields for semihosted binaries.  */
101
    uint32_t stack_base;
102
    uint32_t heap_base;
103
    uint32_t heap_limit;
104
#endif
105
    int used; /* non zero if used */
106
    struct image_info *info;
107
    uint8_t stack[0];
108
} __attribute__((aligned(16))) TaskState;
109

    
110
extern TaskState *first_task_state;
111
extern const char *qemu_uname_release;
112

    
113
/* ??? See if we can avoid exposing so much of the loader internals.  */
114
/*
115
 * MAX_ARG_PAGES defines the number of pages allocated for arguments
116
 * and envelope for the new program. 32 should suffice, this gives
117
 * a maximum env+arg of 128kB w/4KB pages!
118
 */
119
#define MAX_ARG_PAGES 32
120

    
121
/*
122
 * This structure is used to hold the arguments that are
123
 * used when loading binaries.
124
 */
125
struct linux_binprm {
126
        char buf[128];
127
        void *page[MAX_ARG_PAGES];
128
        abi_ulong p;
129
        int fd;
130
        int e_uid, e_gid;
131
        int argc, envc;
132
        char **argv;
133
        char **envp;
134
        char * filename;        /* Name of binary */
135
};
136

    
137
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
138
abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
139
                              abi_ulong stringp, int push_ptr);
140
int loader_exec(const char * filename, char ** argv, char ** envp,
141
             struct target_pt_regs * regs, struct image_info *infop);
142

    
143
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
144
                    struct image_info * info);
145
int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
146
                    struct image_info * info);
147
#ifdef TARGET_HAS_ELFLOAD32
148
int load_elf_binary_multi(struct linux_binprm *bprm,
149
                          struct target_pt_regs *regs,
150
                          struct image_info *info);
151
#endif
152

    
153
abi_long memcpy_to_target(abi_ulong dest, const void *src,
154
                          unsigned long len);
155
void target_set_brk(abi_ulong new_brk);
156
abi_long do_brk(abi_ulong new_brk);
157
void syscall_init(void);
158
abi_long do_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);
161
void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
162
extern CPUState *global_env;
163
void cpu_loop(CPUState *env);
164
void init_paths(const char *prefix);
165
const char *path(const char *pathname);
166
char *target_strerror(int err);
167

    
168
extern int loglevel;
169
extern FILE *logfile;
170

    
171
/* strace.c */
172
void print_syscall(int num,
173
                   abi_long arg1, abi_long arg2, abi_long arg3,
174
                   abi_long arg4, abi_long arg5, abi_long arg6);
175
void print_syscall_ret(int num, abi_long arg1);
176
extern int do_strace;
177

    
178
/* signal.c */
179
void process_pending_signals(void *cpu_env);
180
void signal_init(void);
181
int queue_signal(int sig, target_siginfo_t *info);
182
void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
183
void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
184
long do_sigreturn(CPUState *env);
185
long do_rt_sigreturn(CPUState *env);
186
abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
187

    
188
#ifdef TARGET_I386
189
/* vm86.c */
190
void save_v86_state(CPUX86State *env);
191
void handle_vm86_trap(CPUX86State *env, int trapno);
192
void handle_vm86_fault(CPUX86State *env);
193
int do_vm86(CPUX86State *env, long subfunction, abi_ulong v86_addr);
194
#elif defined(TARGET_SPARC64)
195
void sparc64_set_context(CPUSPARCState *env);
196
void sparc64_get_context(CPUSPARCState *env);
197
#endif
198

    
199
/* mmap.c */
200
int target_mprotect(abi_ulong start, abi_ulong len, int prot);
201
abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
202
                     int flags, int fd, abi_ulong offset);
203
int target_munmap(abi_ulong start, abi_ulong len);
204
abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
205
                       abi_ulong new_size, unsigned long flags,
206
                       abi_ulong new_addr);
207
int target_msync(abi_ulong start, abi_ulong len, int flags);
208

    
209
/* user access */
210

    
211
#define VERIFY_READ 0
212
#define VERIFY_WRITE 1 /* implies read access */
213

    
214
static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
215
{
216
    return page_check_range((target_ulong)addr, size,
217
                            (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0;
218
}
219

    
220
/* NOTE __get_user and __put_user use host pointers and don't check access. */
221
/* These are usually used to access struct data members once the
222
 * struct has been locked - usually with lock_user_struct().
223
 */
224
#define __put_user(x, hptr)\
225
({\
226
    int size = sizeof(*hptr);\
227
    switch(size) {\
228
    case 1:\
229
        *(uint8_t *)(hptr) = (typeof(*hptr))(x);\
230
        break;\
231
    case 2:\
232
        *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
233
        break;\
234
    case 4:\
235
        *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
236
        break;\
237
    case 8:\
238
        *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
239
        break;\
240
    default:\
241
        abort();\
242
    }\
243
    0;\
244
})
245

    
246
#define __get_user(x, hptr) \
247
({\
248
    int size = sizeof(*hptr);\
249
    switch(size) {\
250
    case 1:\
251
        x = (typeof(*hptr))*(uint8_t *)(hptr);\
252
        break;\
253
    case 2:\
254
        x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
255
        break;\
256
    case 4:\
257
        x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
258
        break;\
259
    case 8:\
260
        x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
261
        break;\
262
    default:\
263
        abort();\
264
    }\
265
    0;\
266
})
267

    
268
/* put_user()/get_user() take a guest address and check access */
269
/* These are usually used to access an atomic data type, such as an int,
270
 * that has been passed by address.  These internally perform locking
271
 * and unlocking on the data type.
272
 */
273
#define put_user(x, gaddr, target_type)                                        \
274
({                                                                        \
275
    abi_ulong __gaddr = (gaddr);                                        \
276
    target_type *__hptr;                                                \
277
    abi_long __ret;                                                        \
278
    if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
279
        __ret = __put_user((x), __hptr);                                \
280
        unlock_user(__hptr, __gaddr, sizeof(target_type));                \
281
    } else                                                                \
282
        __ret = -TARGET_EFAULT;                                                \
283
    __ret;                                                                \
284
})
285

    
286
#define get_user(x, gaddr, target_type)                                        \
287
({                                                                        \
288
    abi_ulong __gaddr = (gaddr);                                        \
289
    target_type *__hptr;                                                \
290
    abi_long __ret;                                                        \
291
    if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
292
        __ret = __get_user((x), __hptr);                                \
293
        unlock_user(__hptr, __gaddr, 0);                                \
294
    } else                                                                \
295
        __ret = -TARGET_EFAULT;                                                \
296
    __ret;                                                                \
297
})
298

    
299
/* copy_from_user() and copy_to_user() are usually used to copy data
300
 * buffers between the target and host.  These internally perform
301
 * locking/unlocking of the memory.
302
 */
303
abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
304
abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
305

    
306
/* Functions for accessing guest memory.  The tget and tput functions
307
   read/write single values, byteswapping as neccessary.  The lock_user
308
   gets a pointer to a contiguous area of guest memory, but does not perform
309
   and byteswapping.  lock_user may return either a pointer to the guest
310
   memory, or a temporary buffer.  */
311

    
312
/* Lock an area of guest memory into the host.  If copy is true then the
313
   host area will have the same contents as the guest.  */
314
static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy)
315
{
316
    if (!access_ok(type, guest_addr, len))
317
        return NULL;
318
#ifdef DEBUG_REMAP
319
    {
320
        void *addr;
321
        addr = malloc(len);
322
        if (copy)
323
            memcpy(addr, g2h(guest_addr), len);
324
        else
325
            memset(addr, 0, len);
326
        return addr;
327
    }
328
#else
329
    return g2h(guest_addr);
330
#endif
331
}
332

    
333
/* Unlock an area of guest memory.  The first LEN bytes must be
334
   flushed back to guest memory. host_ptr = NULL is explicitely
335
   allowed and does nothing. */
336
static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
337
                               long len)
338
{
339

    
340
#ifdef DEBUG_REMAP
341
    if (!host_ptr)
342
        return;
343
    if (host_ptr == g2h(guest_addr))
344
        return;
345
    if (len > 0)
346
        memcpy(g2h(guest_ptr), host_ptr, len);
347
    free(host_ptr);
348
#endif
349
}
350

    
351
/* Return the length of a string in target memory or -TARGET_EFAULT if
352
   access error. */
353
abi_long target_strlen(abi_ulong gaddr);
354

    
355
/* Like lock_user but for null terminated strings.  */
356
static inline void *lock_user_string(abi_ulong guest_addr)
357
{
358
    abi_long len;
359
    len = target_strlen(guest_addr);
360
    if (len < 0)
361
        return NULL;
362
    return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
363
}
364

    
365
/* Helper macros for locking/ulocking a target struct.  */
366
#define lock_user_struct(type, host_ptr, guest_addr, copy)        \
367
    (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
368
#define unlock_user_struct(host_ptr, guest_addr, copy)                \
369
    unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
370

    
371
#define tget8(addr) ldub(addr)
372
#define tput8(addr, val) stb(addr, val)
373
#define tget16(addr) lduw(addr)
374
#define tput16(addr, val) stw(addr, val)
375
#define tget32(addr) ldl(addr)
376
#define tput32(addr, val) stl(addr, val)
377
#define tget64(addr) ldq(addr)
378
#define tput64(addr, val) stq(addr, val)
379
#if TARGET_ABI_BITS == 64
380
#define tgetl(addr) ldq(addr)
381
#define tputl(addr, val) stq(addr, val)
382
#else
383
#define tgetl(addr) ldl(addr)
384
#define tputl(addr, val) stl(addr, val)
385
#endif
386

    
387
#endif /* QEMU_H */