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,
436 CPUArchState *env);
437int do_sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
438abi_long do_swapcontext(CPUArchState *env, abi_ulong uold_ctx,
439 abi_ulong unew_ctx, abi_long ctx_size);
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458int block_signals(void);
459
460#ifdef TARGET_I386
461
462void save_v86_state(CPUX86State *env);
463void handle_vm86_trap(CPUX86State *env, int trapno);
464void handle_vm86_fault(CPUX86State *env);
465int do_vm86(CPUX86State *env, long subfunction, abi_ulong v86_addr);
466#elif defined(TARGET_SPARC64)
467void sparc64_set_context(CPUSPARCState *env);
468void sparc64_get_context(CPUSPARCState *env);
469#endif
470
471
472int target_mprotect(abi_ulong start, abi_ulong len, int prot);
473abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
474 int flags, int fd, abi_ulong offset);
475int target_munmap(abi_ulong start, abi_ulong len);
476abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
477 abi_ulong new_size, unsigned long flags,
478 abi_ulong new_addr);
479extern unsigned long last_brk;
480extern abi_ulong mmap_next_start;
481abi_ulong mmap_find_vma(abi_ulong, abi_ulong, abi_ulong);
482void mmap_fork_start(void);
483void mmap_fork_end(int child);
484
485
486extern unsigned long guest_stack_size;
487
488
489
490#define VERIFY_READ PAGE_READ
491#define VERIFY_WRITE (PAGE_READ | PAGE_WRITE)
492
493static inline bool access_ok_untagged(int type, abi_ulong addr, abi_ulong size)
494{
495 if (size == 0
496 ? !guest_addr_valid_untagged(addr)
497 : !guest_range_valid_untagged(addr, size)) {
498 return false;
499 }
500 return page_check_range((target_ulong)addr, size, type) == 0;
501}
502
503static inline bool access_ok(CPUState *cpu, int type,
504 abi_ulong addr, abi_ulong size)
505{
506 return access_ok_untagged(type, cpu_untagged_addr(cpu, addr), size);
507}
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526#if defined(__clang__) && __has_warning("-Waddress-of-packed-member")
527#define PRAGMA_DISABLE_PACKED_WARNING \
528 _Pragma("GCC diagnostic push"); \
529 _Pragma("GCC diagnostic ignored \"-Waddress-of-packed-member\"")
530
531#define PRAGMA_REENABLE_PACKED_WARNING \
532 _Pragma("GCC diagnostic pop")
533
534#else
535#define PRAGMA_DISABLE_PACKED_WARNING
536#define PRAGMA_REENABLE_PACKED_WARNING
537#endif
538
539#define __put_user_e(x, hptr, e) \
540 do { \
541 PRAGMA_DISABLE_PACKED_WARNING; \
542 (__builtin_choose_expr(sizeof(*(hptr)) == 1, stb_p, \
543 __builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \
544 __builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \
545 __builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \
546 ((hptr), (x)), (void)0); \
547 PRAGMA_REENABLE_PACKED_WARNING; \
548 } while (0)
549
550#define __get_user_e(x, hptr, e) \
551 do { \
552 PRAGMA_DISABLE_PACKED_WARNING; \
553 ((x) = (typeof(*hptr))( \
554 __builtin_choose_expr(sizeof(*(hptr)) == 1, ldub_p, \
555 __builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \
556 __builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \
557 __builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \
558 (hptr)), (void)0); \
559 PRAGMA_REENABLE_PACKED_WARNING; \
560 } while (0)
561
562
563#ifdef TARGET_WORDS_BIGENDIAN
564# define __put_user(x, hptr) __put_user_e(x, hptr, be)
565# define __get_user(x, hptr) __get_user_e(x, hptr, be)
566#else
567# define __put_user(x, hptr) __put_user_e(x, hptr, le)
568# define __get_user(x, hptr) __get_user_e(x, hptr, le)
569#endif
570
571
572
573
574
575
576#define put_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_WRITE, __gaddr, sizeof(target_type), 0))) { \
582 __put_user((x), __hptr); \
583 unlock_user(__hptr, __gaddr, sizeof(target_type)); \
584 } else \
585 __ret = -TARGET_EFAULT; \
586 __ret; \
587})
588
589#define get_user(x, gaddr, target_type) \
590({ \
591 abi_ulong __gaddr = (gaddr); \
592 target_type *__hptr; \
593 abi_long __ret = 0; \
594 if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
595 __get_user((x), __hptr); \
596 unlock_user(__hptr, __gaddr, 0); \
597 } else { \
598 \
599 (x) = 0; \
600 __ret = -TARGET_EFAULT; \
601 } \
602 __ret; \
603})
604
605#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
606#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
607#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
608#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
609#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
610#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
611#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
612#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
613#define put_user_u8(x, gaddr) put_user((x), (gaddr), uint8_t)
614#define put_user_s8(x, gaddr) put_user((x), (gaddr), int8_t)
615
616#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
617#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
618#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
619#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
620#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
621#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
622#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
623#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
624#define get_user_u8(x, gaddr) get_user((x), (gaddr), uint8_t)
625#define get_user_s8(x, gaddr) get_user((x), (gaddr), int8_t)
626
627
628
629
630
631int copy_from_user(void *hptr, abi_ulong gaddr, ssize_t len);
632int copy_to_user(abi_ulong gaddr, void *hptr, ssize_t len);
633
634
635
636
637
638
639
640
641
642void *lock_user(int type, abi_ulong guest_addr, ssize_t len, bool copy);
643
644
645
646
647#ifndef DEBUG_REMAP
648static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
649 ssize_t len)
650{
651
652}
653#else
654void unlock_user(void *host_ptr, abi_ulong guest_addr, ssize_t len);
655#endif
656
657
658
659ssize_t target_strlen(abi_ulong gaddr);
660
661
662void *lock_user_string(abi_ulong guest_addr);
663
664
665#define lock_user_struct(type, host_ptr, guest_addr, copy) \
666 (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
667#define unlock_user_struct(host_ptr, guest_addr, copy) \
668 unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
669
670#include <pthread.h>
671
672static inline int is_error(abi_long ret)
673{
674 return (abi_ulong)ret >= (abi_ulong)(-4096);
675}
676
677#if TARGET_ABI_BITS == 32
678static inline uint64_t target_offset64(uint32_t word0, uint32_t word1)
679{
680#ifdef TARGET_WORDS_BIGENDIAN
681 return ((uint64_t)word0 << 32) | word1;
682#else
683 return ((uint64_t)word1 << 32) | word0;
684#endif
685}
686#else
687static inline uint64_t target_offset64(uint64_t word0, uint64_t word1)
688{
689 return word0;
690}
691#endif
692
693void print_termios(void *arg);
694
695
696#ifdef TARGET_ARM
697static inline int regpairs_aligned(void *cpu_env, int num)
698{
699 return ((((CPUARMState *)cpu_env)->eabi) == 1) ;
700}
701#elif defined(TARGET_MIPS) && (TARGET_ABI_BITS == 32)
702static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
703#elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
704
705
706
707
708
709static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
710#elif defined(TARGET_SH4)
711
712static inline int regpairs_aligned(void *cpu_env, int num)
713{
714 switch (num) {
715 case TARGET_NR_pread64:
716 case TARGET_NR_pwrite64:
717 return 1;
718
719 default:
720 return 0;
721 }
722}
723#elif defined(TARGET_XTENSA)
724static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
725#elif defined(TARGET_HEXAGON)
726static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
727#else
728static inline int regpairs_aligned(void *cpu_env, int num) { return 0; }
729#endif
730
731
732
733
734
735
736
737void preexit_cleanup(CPUArchState *env, int code);
738
739
740
741
742
743#include "target_cpu.h"
744#include "target_structs.h"
745
746#endif
747