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