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