~vcs-imports/qemu/git

« back to all changes in this revision

Viewing changes to bsd-user/qemu.h

  • Committer: bellard
  • Date: 2004-04-22 00:10:48 UTC
  • Revision ID: git-v1:f0cbd3ec9f4a3de1a9ef94deda09704543889f44
initial user mode network support


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@733 c046a42c-6fe2-441c-8c8c-71466251a162

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#ifndef QEMU_H
2
 
#define QEMU_H
3
 
 
4
 
#include <signal.h>
5
 
#include <string.h>
6
 
 
7
 
#include "cpu.h"
8
 
 
9
 
#undef DEBUG_REMAP
10
 
#ifdef DEBUG_REMAP
11
 
#include <stdlib.h>
12
 
#endif /* DEBUG_REMAP */
13
 
 
14
 
#ifdef TARGET_ABI32
15
 
typedef uint32_t abi_ulong;
16
 
typedef int32_t abi_long;
17
 
#define TARGET_ABI_FMT_lx "%08x"
18
 
#define TARGET_ABI_FMT_ld "%d"
19
 
#define TARGET_ABI_FMT_lu "%u"
20
 
#define TARGET_ABI_BITS 32
21
 
#else
22
 
typedef target_ulong abi_ulong;
23
 
typedef target_long abi_long;
24
 
#define TARGET_ABI_FMT_lx TARGET_FMT_lx
25
 
#define TARGET_ABI_FMT_ld TARGET_FMT_ld
26
 
#define TARGET_ABI_FMT_lu TARGET_FMT_lu
27
 
#define TARGET_ABI_BITS TARGET_LONG_BITS
28
 
/* for consistency, define ABI32 too */
29
 
#if TARGET_ABI_BITS == 32
30
 
#define TARGET_ABI32 1
31
 
#endif
32
 
#endif
33
 
 
34
 
enum BSDType {
35
 
    target_freebsd,
36
 
    target_netbsd,
37
 
    target_openbsd,
38
 
};
39
 
 
40
 
#include "syscall_defs.h"
41
 
#include "syscall.h"
42
 
#include "target_signal.h"
43
 
#include "gdbstub.h"
44
 
 
45
 
#if defined(USE_NPTL)
46
 
#define THREAD __thread
47
 
#else
48
 
#define THREAD
49
 
#endif
50
 
 
51
 
/* This struct is used to hold certain information about the image.
52
 
 * Basically, it replicates in user space what would be certain
53
 
 * task_struct fields in the kernel
54
 
 */
55
 
struct image_info {
56
 
    abi_ulong load_addr;
57
 
    abi_ulong start_code;
58
 
    abi_ulong end_code;
59
 
    abi_ulong start_data;
60
 
    abi_ulong end_data;
61
 
    abi_ulong start_brk;
62
 
    abi_ulong brk;
63
 
    abi_ulong start_mmap;
64
 
    abi_ulong mmap;
65
 
    abi_ulong rss;
66
 
    abi_ulong start_stack;
67
 
    abi_ulong entry;
68
 
    abi_ulong code_offset;
69
 
    abi_ulong data_offset;
70
 
    char      **host_argv;
71
 
    int       personality;
72
 
};
73
 
 
74
 
#define MAX_SIGQUEUE_SIZE 1024
75
 
 
76
 
struct sigqueue {
77
 
    struct sigqueue *next;
78
 
    //target_siginfo_t info;
79
 
};
80
 
 
81
 
struct emulated_sigtable {
82
 
    int pending; /* true if signal is pending */
83
 
    struct sigqueue *first;
84
 
    struct sigqueue info; /* in order to always have memory for the
85
 
                             first signal, we put it here */
86
 
};
87
 
 
88
 
/* NOTE: we force a big alignment so that the stack stored after is
89
 
   aligned too */
90
 
typedef struct TaskState {
91
 
    struct TaskState *next;
92
 
    int used; /* non zero if used */
93
 
    struct image_info *info;
94
 
 
95
 
    struct emulated_sigtable sigtab[TARGET_NSIG];
96
 
    struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
97
 
    struct sigqueue *first_free; /* first free siginfo queue entry */
98
 
    int signal_pending; /* non zero if a signal may be pending */
99
 
 
100
 
    uint8_t stack[0];
101
 
} __attribute__((aligned(16))) TaskState;
102
 
 
103
 
void init_task_state(TaskState *ts);
104
 
extern const char *qemu_uname_release;
105
 
 
106
 
/* ??? See if we can avoid exposing so much of the loader internals.  */
107
 
/*
108
 
 * MAX_ARG_PAGES defines the number of pages allocated for arguments
109
 
 * and envelope for the new program. 32 should suffice, this gives
110
 
 * a maximum env+arg of 128kB w/4KB pages!
111
 
 */
112
 
#define MAX_ARG_PAGES 32
113
 
 
114
 
/*
115
 
 * This structure is used to hold the arguments that are
116
 
 * used when loading binaries.
117
 
 */
118
 
struct linux_binprm {
119
 
        char buf[128];
120
 
        void *page[MAX_ARG_PAGES];
121
 
        abi_ulong p;
122
 
        int fd;
123
 
        int e_uid, e_gid;
124
 
        int argc, envc;
125
 
        char **argv;
126
 
        char **envp;
127
 
        char * filename;        /* Name of binary */
128
 
};
129
 
 
130
 
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
131
 
abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
132
 
                              abi_ulong stringp, int push_ptr);
133
 
int loader_exec(const char * filename, char ** argv, char ** envp,
134
 
             struct target_pt_regs * regs, struct image_info *infop);
135
 
 
136
 
int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
137
 
                    struct image_info * info);
138
 
int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
139
 
                    struct image_info * info);
140
 
 
141
 
abi_long memcpy_to_target(abi_ulong dest, const void *src,
142
 
                          unsigned long len);
143
 
void target_set_brk(abi_ulong new_brk);
144
 
abi_long do_brk(abi_ulong new_brk);
145
 
void syscall_init(void);
146
 
abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
147
 
                            abi_long arg2, abi_long arg3, abi_long arg4,
148
 
                            abi_long arg5, abi_long arg6);
149
 
abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
150
 
                           abi_long arg2, abi_long arg3, abi_long arg4,
151
 
                           abi_long arg5, abi_long arg6);
152
 
abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
153
 
                            abi_long arg2, abi_long arg3, abi_long arg4,
154
 
                            abi_long arg5, abi_long arg6);
155
 
void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
156
 
extern THREAD CPUState *thread_env;
157
 
void cpu_loop(CPUState *env, enum BSDType bsd_type);
158
 
void init_paths(const char *prefix);
159
 
const char *path(const char *pathname);
160
 
char *target_strerror(int err);
161
 
int get_osversion(void);
162
 
void fork_start(void);
163
 
void fork_end(int child);
164
 
 
165
 
#include "qemu-log.h"
166
 
 
167
 
/* strace.c */
168
 
void
169
 
print_freebsd_syscall(int num,
170
 
                      abi_long arg1, abi_long arg2, abi_long arg3,
171
 
                      abi_long arg4, abi_long arg5, abi_long arg6);
172
 
void print_freebsd_syscall_ret(int num, abi_long ret);
173
 
void
174
 
print_netbsd_syscall(int num,
175
 
                     abi_long arg1, abi_long arg2, abi_long arg3,
176
 
                     abi_long arg4, abi_long arg5, abi_long arg6);
177
 
void print_netbsd_syscall_ret(int num, abi_long ret);
178
 
void
179
 
print_openbsd_syscall(int num,
180
 
                      abi_long arg1, abi_long arg2, abi_long arg3,
181
 
                      abi_long arg4, abi_long arg5, abi_long arg6);
182
 
void print_openbsd_syscall_ret(int num, abi_long ret);
183
 
extern int do_strace;
184
 
 
185
 
/* signal.c */
186
 
void process_pending_signals(CPUState *cpu_env);
187
 
void signal_init(void);
188
 
//int queue_signal(CPUState *env, int sig, target_siginfo_t *info);
189
 
//void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
190
 
//void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
191
 
long do_sigreturn(CPUState *env);
192
 
long do_rt_sigreturn(CPUState *env);
193
 
abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
194
 
 
195
 
/* mmap.c */
196
 
int target_mprotect(abi_ulong start, abi_ulong len, int prot);
197
 
abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
198
 
                     int flags, int fd, abi_ulong offset);
199
 
int target_munmap(abi_ulong start, abi_ulong len);
200
 
abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
201
 
                       abi_ulong new_size, unsigned long flags,
202
 
                       abi_ulong new_addr);
203
 
int target_msync(abi_ulong start, abi_ulong len, int flags);
204
 
extern unsigned long last_brk;
205
 
void mmap_lock(void);
206
 
void mmap_unlock(void);
207
 
#if defined(USE_NPTL)
208
 
void mmap_fork_start(void);
209
 
void mmap_fork_end(int child);
210
 
#endif
211
 
 
212
 
/* user access */
213
 
 
214
 
#define VERIFY_READ 0
215
 
#define VERIFY_WRITE 1 /* implies read access */
216
 
 
217
 
static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
218
 
{
219
 
    return page_check_range((target_ulong)addr, size,
220
 
                            (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0;
221
 
}
222
 
 
223
 
/* NOTE __get_user and __put_user use host pointers and don't check access. */
224
 
/* These are usually used to access struct data members once the
225
 
 * struct has been locked - usually with lock_user_struct().
226
 
 */
227
 
#define __put_user(x, hptr)\
228
 
({\
229
 
    int size = sizeof(*hptr);\
230
 
    switch(size) {\
231
 
    case 1:\
232
 
        *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\
233
 
        break;\
234
 
    case 2:\
235
 
        *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
236
 
        break;\
237
 
    case 4:\
238
 
        *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
239
 
        break;\
240
 
    case 8:\
241
 
        *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
242
 
        break;\
243
 
    default:\
244
 
        abort();\
245
 
    }\
246
 
    0;\
247
 
})
248
 
 
249
 
#define __get_user(x, hptr) \
250
 
({\
251
 
    int size = sizeof(*hptr);\
252
 
    switch(size) {\
253
 
    case 1:\
254
 
        x = (typeof(*hptr))*(uint8_t *)(hptr);\
255
 
        break;\
256
 
    case 2:\
257
 
        x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
258
 
        break;\
259
 
    case 4:\
260
 
        x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
261
 
        break;\
262
 
    case 8:\
263
 
        x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
264
 
        break;\
265
 
    default:\
266
 
        /* avoid warning */\
267
 
        x = 0;\
268
 
        abort();\
269
 
    }\
270
 
    0;\
271
 
})
272
 
 
273
 
/* put_user()/get_user() take a guest address and check access */
274
 
/* These are usually used to access an atomic data type, such as an int,
275
 
 * that has been passed by address.  These internally perform locking
276
 
 * and unlocking on the data type.
277
 
 */
278
 
#define put_user(x, gaddr, target_type)                                 \
279
 
({                                                                      \
280
 
    abi_ulong __gaddr = (gaddr);                                        \
281
 
    target_type *__hptr;                                                \
282
 
    abi_long __ret;                                                     \
283
 
    if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
284
 
        __ret = __put_user((x), __hptr);                                \
285
 
        unlock_user(__hptr, __gaddr, sizeof(target_type));              \
286
 
    } else                                                              \
287
 
        __ret = -TARGET_EFAULT;                                         \
288
 
    __ret;                                                              \
289
 
})
290
 
 
291
 
#define get_user(x, gaddr, target_type)                                 \
292
 
({                                                                      \
293
 
    abi_ulong __gaddr = (gaddr);                                        \
294
 
    target_type *__hptr;                                                \
295
 
    abi_long __ret;                                                     \
296
 
    if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
297
 
        __ret = __get_user((x), __hptr);                                \
298
 
        unlock_user(__hptr, __gaddr, 0);                                \
299
 
    } else {                                                            \
300
 
        /* avoid warning */                                             \
301
 
        (x) = 0;                                                        \
302
 
        __ret = -TARGET_EFAULT;                                         \
303
 
    }                                                                   \
304
 
    __ret;                                                              \
305
 
})
306
 
 
307
 
#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
308
 
#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
309
 
#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
310
 
#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
311
 
#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
312
 
#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
313
 
#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
314
 
#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
315
 
#define put_user_u8(x, gaddr)  put_user((x), (gaddr), uint8_t)
316
 
#define put_user_s8(x, gaddr)  put_user((x), (gaddr), int8_t)
317
 
 
318
 
#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
319
 
#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
320
 
#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
321
 
#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
322
 
#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
323
 
#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
324
 
#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
325
 
#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
326
 
#define get_user_u8(x, gaddr)  get_user((x), (gaddr), uint8_t)
327
 
#define get_user_s8(x, gaddr)  get_user((x), (gaddr), int8_t)
328
 
 
329
 
/* copy_from_user() and copy_to_user() are usually used to copy data
330
 
 * buffers between the target and host.  These internally perform
331
 
 * locking/unlocking of the memory.
332
 
 */
333
 
abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
334
 
abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
335
 
 
336
 
/* Functions for accessing guest memory.  The tget and tput functions
337
 
   read/write single values, byteswapping as neccessary.  The lock_user
338
 
   gets a pointer to a contiguous area of guest memory, but does not perform
339
 
   and byteswapping.  lock_user may return either a pointer to the guest
340
 
   memory, or a temporary buffer.  */
341
 
 
342
 
/* Lock an area of guest memory into the host.  If copy is true then the
343
 
   host area will have the same contents as the guest.  */
344
 
static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy)
345
 
{
346
 
    if (!access_ok(type, guest_addr, len))
347
 
        return NULL;
348
 
#ifdef DEBUG_REMAP
349
 
    {
350
 
        void *addr;
351
 
        addr = malloc(len);
352
 
        if (copy)
353
 
            memcpy(addr, g2h(guest_addr), len);
354
 
        else
355
 
            memset(addr, 0, len);
356
 
        return addr;
357
 
    }
358
 
#else
359
 
    return g2h(guest_addr);
360
 
#endif
361
 
}
362
 
 
363
 
/* Unlock an area of guest memory.  The first LEN bytes must be
364
 
   flushed back to guest memory. host_ptr = NULL is explicitly
365
 
   allowed and does nothing. */
366
 
static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
367
 
                               long len)
368
 
{
369
 
 
370
 
#ifdef DEBUG_REMAP
371
 
    if (!host_ptr)
372
 
        return;
373
 
    if (host_ptr == g2h(guest_addr))
374
 
        return;
375
 
    if (len > 0)
376
 
        memcpy(g2h(guest_addr), host_ptr, len);
377
 
    free(host_ptr);
378
 
#endif
379
 
}
380
 
 
381
 
/* Return the length of a string in target memory or -TARGET_EFAULT if
382
 
   access error. */
383
 
abi_long target_strlen(abi_ulong gaddr);
384
 
 
385
 
/* Like lock_user but for null terminated strings.  */
386
 
static inline void *lock_user_string(abi_ulong guest_addr)
387
 
{
388
 
    abi_long len;
389
 
    len = target_strlen(guest_addr);
390
 
    if (len < 0)
391
 
        return NULL;
392
 
    return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
393
 
}
394
 
 
395
 
/* Helper macros for locking/ulocking a target struct.  */
396
 
#define lock_user_struct(type, host_ptr, guest_addr, copy)      \
397
 
    (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
398
 
#define unlock_user_struct(host_ptr, guest_addr, copy)          \
399
 
    unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
400
 
 
401
 
#if defined(USE_NPTL)
402
 
#include <pthread.h>
403
 
#endif
404
 
 
405
 
#endif /* QEMU_H */