1#ifndef QEMU_H
2#define QEMU_H
3
4#include "hostdep.h"
5#include "cpu.h"
6#include "exec/exec-all.h"
7#include "exec/cpu_ldst.h"
8
9#undef DEBUG_REMAP
10#ifdef DEBUG_REMAP
11#endif
12
13#include "exec/user/abitypes.h"
14
15#include "exec/user/thunk.h"
16#include "syscall_defs.h"
17#include "target_syscall.h"
18#include "exec/gdbstub.h"
19
20
21
22
23#define SIGSET_T_SIZE (_NSIG / 8)
24
25
26
27
28
29struct image_info {
30 abi_ulong load_bias;
31 abi_ulong load_addr;
32 abi_ulong start_code;
33 abi_ulong end_code;
34 abi_ulong start_data;
35 abi_ulong end_data;
36 abi_ulong start_brk;
37 abi_ulong brk;
38 abi_ulong reserve_brk;
39 abi_ulong start_mmap;
40 abi_ulong start_stack;
41 abi_ulong stack_limit;
42 abi_ulong entry;
43 abi_ulong code_offset;
44 abi_ulong data_offset;
45 abi_ulong saved_auxv;
46 abi_ulong auxv_len;
47 abi_ulong arg_start;
48 abi_ulong arg_end;
49 abi_ulong arg_strings;
50 abi_ulong env_strings;
51 abi_ulong file_string;
52 uint32_t elf_flags;
53 int personality;
54 abi_ulong alignment;
55
56
57 abi_ulong loadmap_addr;
58 uint16_t nsegs;
59 void *loadsegs;
60 abi_ulong pt_dynamic_addr;
61 abi_ulong interpreter_loadmap_addr;
62 abi_ulong interpreter_pt_dynamic_addr;
63 struct image_info *other_info;
64#ifdef TARGET_MIPS
65 int fp_abi;
66 int interp_fp_abi;
67#endif
68};
69
70#ifdef TARGET_I386
71
72struct vm86_saved_state {
73 uint32_t eax;
74 uint32_t ebx;
75 uint32_t ecx;
76 uint32_t edx;
77 uint32_t esi;
78 uint32_t edi;
79 uint32_t ebp;
80 uint32_t esp;
81 uint32_t eflags;
82 uint32_t eip;
83 uint16_t cs, ss, ds, es, fs, gs;
84};
85#endif
86
87#if defined(TARGET_ARM) && defined(TARGET_ABI32)
88
89#include "nwfpe/fpa11.h"
90#endif
91
92#define MAX_SIGQUEUE_SIZE 1024
93
94struct emulated_sigtable {
95 int pending;
96 target_siginfo_t info;
97};
98
99
100
101typedef struct TaskState {
102 pid_t ts_tid;
103#ifdef TARGET_ARM
104# ifdef TARGET_ABI32
105
106 FPA11 fpa;
107# endif
108 int swi_errno;
109#endif
110#if defined(TARGET_I386) && !defined(TARGET_X86_64)
111 abi_ulong target_v86;
112 struct vm86_saved_state vm86_saved_regs;
113 struct target_vm86plus_struct vm86plus;
114 uint32_t v86flags;
115 uint32_t v86mask;
116#endif
117 abi_ulong child_tidptr;
118#ifdef TARGET_M68K
119 abi_ulong tp_value;
120#endif
121#if defined(TARGET_ARM) || defined(TARGET_M68K)
122
123 abi_ulong heap_base;
124 abi_ulong heap_limit;
125#endif
126 abi_ulong stack_base;
127 int used;
128 struct image_info *info;
129 struct linux_binprm *bprm;
130
131 struct emulated_sigtable sync_signal;
132 struct emulated_sigtable sigtab[TARGET_NSIG];
133
134
135
136
137
138 sigset_t signal_mask;
139
140
141
142 sigset_t sigsuspend_mask;
143
144 int in_sigsuspend;
145
146
147
148
149
150
151
152 int signal_pending;
153
154
155 struct target_sigaltstack sigaltstack_used;
156} __attribute__((aligned(16))) TaskState;
157
158extern char *exec_path;
159void init_task_state(TaskState *ts);
160void task_settid(TaskState *);
161void stop_all_tasks(void);
162extern const char *qemu_uname_release;
163extern unsigned long mmap_min_addr;
164
165
166
167
168
169#define BPRM_BUF_SIZE 1024
170
171
172
173
174
175struct linux_binprm {
176 char buf[BPRM_BUF_SIZE] __attribute__((aligned));
177 abi_ulong p;
178 int fd;
179 int e_uid, e_gid;
180 int argc, envc;
181 char **argv;
182 char **envp;
183 char * filename;
184 int (*core_dump)(int, const CPUArchState *);
185};
186
187typedef struct IOCTLEntry IOCTLEntry;
188
189typedef abi_long do_ioctl_fn(const IOCTLEntry *ie, uint8_t *buf_temp,
190 int fd, int cmd, abi_long arg);
191
192struct IOCTLEntry {
193 int target_cmd;
194 unsigned int host_cmd;
195 const char *name;
196 int access;
197 do_ioctl_fn *do_ioctl;
198 const argtype arg_type[5];
199};
200
201extern IOCTLEntry ioctl_entries[];
202
203#define IOC_R 0x0001
204#define IOC_W 0x0002
205#define IOC_RW (IOC_R | IOC_W)
206
207void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
208abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
209 abi_ulong stringp, int push_ptr);
210int loader_exec(int fdexec, const char *filename, char **argv, char **envp,
211 struct target_pt_regs * regs, struct image_info *infop,
212 struct linux_binprm *);
213
214
215
216
217
218
219int info_is_fdpic(struct image_info *info);
220
221uint32_t get_elf_eflags(int fd);
222int load_elf_binary(struct linux_binprm *bprm, struct image_info *info);
223int load_flt_binary(struct linux_binprm *bprm, struct image_info *info);
224
225abi_long memcpy_to_target(abi_ulong dest, const void *src,
226 unsigned long len);
227void target_set_brk(abi_ulong new_brk);
228abi_long do_brk(abi_ulong new_brk);
229void syscall_init(void);
230abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
231 abi_long arg2, abi_long arg3, abi_long arg4,
232 abi_long arg5, abi_long arg6, abi_long arg7,
233 abi_long arg8);
234extern __thread CPUState *thread_cpu;
235void cpu_loop(CPUArchState *env);
236const char *target_strerror(int err);
237int get_osversion(void);
238void init_qemu_uname_release(void);
239void fork_start(void);
240void fork_end(int child);
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261void probe_guest_base(const char *image_name,
262 abi_ulong loaddr, abi_ulong hiaddr);
263
264#include "qemu/log.h"
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373#ifdef HAVE_SAFE_SYSCALL
374
375extern long safe_syscall_base(int *pending, long number, ...);
376
377#define safe_syscall(...) \
378 ({ \
379 long ret_; \
380 int *psp_ = &((TaskState *)thread_cpu->opaque)->signal_pending; \
381 ret_ = safe_syscall_base(psp_, __VA_ARGS__); \
382 if (is_error(ret_)) { \
383 errno = -ret_; \
384 ret_ = -1; \
385 } \
386 ret_; \
387 })
388
389#else
390
391
392
393
394
395#define safe_syscall syscall
396
397#endif
398
399
400int host_to_target_waitstatus(int status);
401
402
403void print_syscall(int num,
404 abi_long arg1, abi_long arg2, abi_long arg3,
405 abi_long arg4, abi_long arg5, abi_long arg6);
406void print_syscall_ret(int num, abi_long ret,
407 abi_long arg1, abi_long arg2, abi_long arg3,
408 abi_long arg4, abi_long arg5, abi_long arg6);
409
410
411
412
413
414
415
416
417
418void print_taken_signal(int target_signum, const target_siginfo_t *tinfo);
419
420
421void process_pending_signals(CPUArchState *cpu_env);
422void signal_init(void);
423int queue_signal(CPUArchState *env, int sig, int si_type,
424 target_siginfo_t *info);
425void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
426void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
427int target_to_host_signal(int sig);
428int host_to_target_signal(int sig);
429long do_sigreturn(CPUArchState *env);
430long do_rt_sigreturn(CPUArchState *env);
431abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
432int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
433abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx,
434 abi_ulong unew_ctx, abi_long ctx_size);
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453int block_signals(void);
454
455#ifdef TARGET_I386
456
457void save_v86_state(CPUX86State *env);
458void handle_vm86_trap(CPUX86State *env, int trapno);
459void handle_vm86_fault(CPUX86State *env);
460int do_vm86(CPUX86State *env, long subfunction, abi_ulong v86_addr);
461#elif defined(TARGET_SPARC64)
462void sparc64_set_context(CPUSPARCState *env);
463void sparc64_get_context(CPUSPARCState *env);
464#endif
465
466
467int target_mprotect(abi_ulong start, abi_ulong len, int prot);
468abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
469 int flags, int fd, abi_ulong offset);
470int target_munmap(abi_ulong start, abi_ulong len);
471abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
472 abi_ulong new_size, unsigned long flags,
473 abi_ulong new_addr);
474extern unsigned long last_brk;
475extern abi_ulong mmap_next_start;
476abi_ulong mmap_find_vma(abi_ulong, abi_ulong, abi_ulong);
477void mmap_fork_start(void);
478void mmap_fork_end(int child);
479
480
481extern unsigned long guest_stack_size;
482
483
484
485#define VERIFY_READ 0
486#define VERIFY_WRITE 1
487
488static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
489{
490 return guest_addr_valid(addr) &&
491 (size == 0 || guest_addr_valid(addr + size - 1)) &&
492 page_check_range((target_ulong)addr, size,
493 (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0;
494}
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513#if defined(__clang__) && __has_warning("-Waddress-of-packed-member")
514#define PRAGMA_DISABLE_PACKED_WARNING \
515 _Pragma("GCC diagnostic push"); \
516 _Pragma("GCC diagnostic ignored \"-Waddress-of-packed-member\"")
517
518#define PRAGMA_REENABLE_PACKED_WARNING \
519 _Pragma("GCC diagnostic pop")
520
521#else
522#define PRAGMA_DISABLE_PACKED_WARNING
523#define PRAGMA_REENABLE_PACKED_WARNING
524#endif
525
526#define __put_user_e(x, hptr, e) \
527 do { \
528 PRAGMA_DISABLE_PACKED_WARNING; \
529 (__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p, \
530 __builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \
531 __builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \
532 __builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \
533 ((hptr), (x)), (void)0); \
534 PRAGMA_REENABLE_PACKED_WARNING; \
535 } while (0)
536
537#define __get_user_e(x, hptr, e) \
538 do { \
539 PRAGMA_DISABLE_PACKED_WARNING; \
540 ((x) = (typeof(*hptr))( \
541 __builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \
542 __builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \
543 __builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \
544 __builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \
545 (hptr)), (void)0); \
546 PRAGMA_REENABLE_PACKED_WARNING; \
547 } while (0)
548
549
550#ifdef TARGET_WORDS_BIGENDIAN
551# define __put_user(x, hptr) __put_user_e(x, hptr, be)
552# define __get_user(x, hptr) __get_user_e(x, hptr, be)
553#else
554# define __put_user(x, hptr) __put_user_e(x, hptr, le)
555# define __get_user(x, hptr) __get_user_e(x, hptr, le)
556#endif
557
558
559
560
561
562
563#define put_user(x, gaddr, target_type) \
564({ \
565 abi_ulong __gaddr = (gaddr); \
566 target_type *__hptr; \
567 abi_long __ret = 0; \
568 if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
569 __put_user((x), __hptr); \
570 unlock_user(__hptr, __gaddr, sizeof(target_type)); \
571 } else \
572 __ret = -TARGET_EFAULT; \
573 __ret; \
574})
575
576#define get_user(x, gaddr, target_type) \
577({ \
578 abi_ulong __gaddr = (gaddr); \
579 target_type *__hptr; \
580 abi_long __ret = 0; \
581 if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
582 __get_user((x), __hptr); \
583 unlock_user(__hptr, __gaddr, 0); \
584 } else { \
585 \
586 (x) = 0; \
587 __ret = -TARGET_EFAULT; \
588 } \
589 __ret; \
590})
591
592#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
593#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
594#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
595#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
596#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
597#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
598#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
599#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
600#define put_user_u8(x, gaddr) put_user((x), (gaddr), uint8_t)
601#define put_user_s8(x, gaddr) put_user((x), (gaddr), int8_t)
602
603#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
604#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
605#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
606#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
607#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
608#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
609#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
610#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
611#define get_user_u8(x, gaddr) get_user((x), (gaddr), uint8_t)
612#define get_user_s8(x, gaddr) get_user((x), (gaddr), int8_t)
613
614
615
616
617
618abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
619abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
620
621
622
623
624
625
626
627
628
629static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy)
630{
631 if (!access_ok(type, guest_addr, len))
632 return NULL;
633#ifdef DEBUG_REMAP
634 {
635 void *addr;
636 addr = g_malloc(len);
637 if (copy)
638 memcpy(addr, g2h(guest_addr), len);
639 else
640 memset(addr, 0, len);
641 return addr;
642 }
643#else
644 return g2h(guest_addr);
645#endif
646}
647
648
649
650
651static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
652 long len)
653{
654
655#ifdef DEBUG_REMAP
656 if (!host_ptr)
657 return;
658 if (host_ptr == g2h(guest_addr))
659 return;
660 if (len > 0)
661 memcpy(g2h(guest_addr), host_ptr, len);
662 g_free(host_ptr);
663#endif
664}
665
666
667
668abi_long target_strlen(abi_ulong gaddr);
669
670
671static inline void *lock_user_string(abi_ulong guest_addr)
672{
673 abi_long len;
674 len = target_strlen(guest_addr);
675 if (len < 0)
676 return NULL;
677 return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
678}
679
680
681#define lock_user_struct(type, host_ptr, guest_addr, copy) \
682 (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
683#define unlock_user_struct(host_ptr, guest_addr, copy) \
684 unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
685
686#include <pthread.h>
687
688static inline int is_error(abi_long ret)
689{
690 return (abi_ulong)ret >= (abi_ulong)(-4096);
691}
692
693#if TARGET_ABI_BITS == 32
694static inline uint64_t target_offset64(uint32_t word0, uint32_t word1)
695{
696#ifdef TARGET_WORDS_BIGENDIAN
697 return ((uint64_t)word0 << 32) | word1;
698#else
699 return ((uint64_t)word1 << 32) | word0;
700#endif
701}
702#else
703static inline uint64_t target_offset64(uint64_t word0, uint64_t word1)
704{
705 return word0;
706}
707#endif
708
709
710
711
712
713
714
715void preexit_cleanup(CPUArchState *env, int code);
716
717
718
719
720
721#include "target_cpu.h"
722#include "target_structs.h"
723
724#endif
725