Statistics
| Branch: | Revision:

root / linux-user / syscall.c @ 7d13299d

History | View | Annotate | Download (42.3 kB)

1 31e31b8a bellard
/*
2 31e31b8a bellard
 *  Linux syscalls
3 31e31b8a bellard
 * 
4 31e31b8a bellard
 *  Copyright (c) 2003 Fabrice Bellard
5 31e31b8a bellard
 *
6 31e31b8a bellard
 *  This program is free software; you can redistribute it and/or modify
7 31e31b8a bellard
 *  it under the terms of the GNU General Public License as published by
8 31e31b8a bellard
 *  the Free Software Foundation; either version 2 of the License, or
9 31e31b8a bellard
 *  (at your option) any later version.
10 31e31b8a bellard
 *
11 31e31b8a bellard
 *  This program is distributed in the hope that it will be useful,
12 31e31b8a bellard
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 31e31b8a bellard
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 31e31b8a bellard
 *  GNU General Public License for more details.
15 31e31b8a bellard
 *
16 31e31b8a bellard
 *  You should have received a copy of the GNU General Public License
17 31e31b8a bellard
 *  along with this program; if not, write to the Free Software
18 31e31b8a bellard
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 31e31b8a bellard
 */
20 31e31b8a bellard
#include <stdlib.h>
21 31e31b8a bellard
#include <stdio.h>
22 31e31b8a bellard
#include <stdarg.h>
23 31e31b8a bellard
#include <elf.h>
24 31e31b8a bellard
#include <endian.h>
25 31e31b8a bellard
#include <errno.h>
26 31e31b8a bellard
#include <unistd.h>
27 31e31b8a bellard
#include <fcntl.h>
28 31e31b8a bellard
#include <sys/types.h>
29 31e31b8a bellard
#include <sys/wait.h>
30 31e31b8a bellard
#include <sys/time.h>
31 31e31b8a bellard
#include <sys/stat.h>
32 31e31b8a bellard
#include <sys/mount.h>
33 31e31b8a bellard
#include <sys/resource.h>
34 31e31b8a bellard
#include <sys/mman.h>
35 31e31b8a bellard
#include <sys/swap.h>
36 31e31b8a bellard
#include <signal.h>
37 31e31b8a bellard
#include <sched.h>
38 31e31b8a bellard
#include <sys/socket.h>
39 31e31b8a bellard
#include <sys/uio.h>
40 72f03900 bellard
//#include <sys/user.h>
41 31e31b8a bellard
42 31e31b8a bellard
#define termios host_termios
43 31e31b8a bellard
#define winsize host_winsize
44 31e31b8a bellard
#define termio host_termio
45 31e31b8a bellard
46 31e31b8a bellard
#include <linux/termios.h>
47 31e31b8a bellard
#include <linux/unistd.h>
48 31e31b8a bellard
#include <linux/utsname.h>
49 31e31b8a bellard
#include <linux/cdrom.h>
50 31e31b8a bellard
#include <linux/hdreg.h>
51 31e31b8a bellard
#include <linux/soundcard.h>
52 31e31b8a bellard
53 31e31b8a bellard
#include "gemu.h"
54 31e31b8a bellard
55 72f03900 bellard
//#define DEBUG
56 31e31b8a bellard
57 31e31b8a bellard
#ifndef PAGE_SIZE
58 31e31b8a bellard
#define PAGE_SIZE 4096
59 31e31b8a bellard
#define PAGE_MASK ~(PAGE_SIZE - 1)
60 31e31b8a bellard
#endif
61 31e31b8a bellard
62 31e31b8a bellard
struct dirent {
63 31e31b8a bellard
        long            d_ino;
64 31e31b8a bellard
        long            d_off;
65 31e31b8a bellard
        unsigned short  d_reclen;
66 31e31b8a bellard
        char            d_name[256]; /* We must not include limits.h! */
67 31e31b8a bellard
};
68 31e31b8a bellard
69 31e31b8a bellard
#include "syscall_defs.h"
70 31e31b8a bellard
71 31e31b8a bellard
#ifdef TARGET_I386
72 31e31b8a bellard
#include "syscall-i386.h"
73 31e31b8a bellard
#endif
74 31e31b8a bellard
75 31e31b8a bellard
#define __NR_sys_uname __NR_uname
76 72f03900 bellard
#define __NR_sys_getcwd1 __NR_getcwd
77 31e31b8a bellard
#define __NR_sys_statfs __NR_statfs
78 31e31b8a bellard
#define __NR_sys_fstatfs __NR_fstatfs
79 72f03900 bellard
#define __NR_sys_getdents __NR_getdents
80 31e31b8a bellard
81 72f03900 bellard
#ifdef __NR_gettid
82 31e31b8a bellard
_syscall0(int, gettid)
83 72f03900 bellard
#else
84 72f03900 bellard
static int gettid(void) {
85 72f03900 bellard
    return -ENOSYS;
86 72f03900 bellard
}
87 72f03900 bellard
#endif
88 31e31b8a bellard
_syscall1(int,sys_uname,struct new_utsname *,buf)
89 72f03900 bellard
_syscall2(int,sys_getcwd1,char *,buf,size_t,size)
90 72f03900 bellard
_syscall3(int, sys_getdents, uint, fd, struct dirent *, dirp, uint, count);
91 31e31b8a bellard
_syscall5(int, _llseek,  uint,  fd, ulong, hi, ulong, lo,
92 31e31b8a bellard
          loff_t *, res, uint, wh);
93 72f03900 bellard
_syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf)
94 72f03900 bellard
_syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf)
95 31e31b8a bellard
96 31e31b8a bellard
static inline long get_errno(long ret)
97 31e31b8a bellard
{
98 31e31b8a bellard
    if (ret == -1)
99 31e31b8a bellard
        return -errno;
100 31e31b8a bellard
    else
101 31e31b8a bellard
        return ret;
102 31e31b8a bellard
}
103 31e31b8a bellard
104 31e31b8a bellard
static inline int is_error(long ret)
105 31e31b8a bellard
{
106 31e31b8a bellard
    return (unsigned long)ret >= (unsigned long)(-4096);
107 31e31b8a bellard
}
108 31e31b8a bellard
109 31e31b8a bellard
static char *target_brk;
110 31e31b8a bellard
static char *target_original_brk;
111 31e31b8a bellard
112 31e31b8a bellard
void target_set_brk(char *new_brk)
113 31e31b8a bellard
{
114 31e31b8a bellard
    target_brk = new_brk;
115 31e31b8a bellard
    target_original_brk = new_brk;
116 31e31b8a bellard
}
117 31e31b8a bellard
118 31e31b8a bellard
static long do_brk(char *new_brk)
119 31e31b8a bellard
{
120 31e31b8a bellard
    char *brk_page;
121 31e31b8a bellard
    long mapped_addr;
122 31e31b8a bellard
    int        new_alloc_size;
123 31e31b8a bellard
124 31e31b8a bellard
    if (!new_brk)
125 31e31b8a bellard
        return (long)target_brk;
126 31e31b8a bellard
    if (new_brk < target_original_brk)
127 31e31b8a bellard
        return -ENOMEM;
128 31e31b8a bellard
    
129 31e31b8a bellard
    brk_page = (char *)(((unsigned long)target_brk + PAGE_SIZE - 1) & PAGE_MASK);
130 31e31b8a bellard
131 31e31b8a bellard
    /* If the new brk is less than this, set it and we're done... */
132 31e31b8a bellard
    if (new_brk < brk_page) {
133 31e31b8a bellard
        target_brk = new_brk;
134 31e31b8a bellard
            return (long)target_brk;
135 31e31b8a bellard
    }
136 31e31b8a bellard
137 31e31b8a bellard
    /* We need to allocate more memory after the brk... */
138 31e31b8a bellard
    new_alloc_size = ((new_brk - brk_page + 1)+(PAGE_SIZE-1)) & PAGE_MASK;
139 31e31b8a bellard
    mapped_addr = get_errno((long)mmap((caddr_t)brk_page, new_alloc_size, 
140 31e31b8a bellard
                                       PROT_READ|PROT_WRITE,
141 31e31b8a bellard
                                       MAP_ANON|MAP_FIXED|MAP_PRIVATE, 0, 0));
142 31e31b8a bellard
    
143 31e31b8a bellard
    if (is_error(mapped_addr)) {
144 31e31b8a bellard
        return mapped_addr;
145 31e31b8a bellard
    } else {
146 31e31b8a bellard
        target_brk = new_brk;
147 31e31b8a bellard
            return (long)target_brk;
148 31e31b8a bellard
    }
149 31e31b8a bellard
}
150 31e31b8a bellard
151 31e31b8a bellard
static inline fd_set *target_to_host_fds(fd_set *fds, 
152 31e31b8a bellard
                                         target_long *target_fds, int n)
153 31e31b8a bellard
{
154 31e31b8a bellard
#if !defined(BSWP_NEEDED) && !defined(WORD_BIGENDIAN)
155 31e31b8a bellard
    return (fd_set *)target_fds;
156 31e31b8a bellard
#else
157 31e31b8a bellard
    int i, b;
158 31e31b8a bellard
    if (target_fds) {
159 31e31b8a bellard
        FD_ZERO(fds);
160 31e31b8a bellard
        for(i = 0;i < n; i++) {
161 31e31b8a bellard
            b = (tswapl(target_fds[i / TARGET_LONG_BITS]) >>
162 31e31b8a bellard
                 (i & (TARGET_LONG_BITS - 1))) & 1;
163 31e31b8a bellard
            if (b)
164 31e31b8a bellard
                FD_SET(i, fds);
165 31e31b8a bellard
        }
166 31e31b8a bellard
        return fds;
167 31e31b8a bellard
    } else {
168 31e31b8a bellard
        return NULL;
169 31e31b8a bellard
    }
170 31e31b8a bellard
#endif
171 31e31b8a bellard
}
172 31e31b8a bellard
173 31e31b8a bellard
static inline void host_to_target_fds(target_long *target_fds, 
174 31e31b8a bellard
                                      fd_set *fds, int n)
175 31e31b8a bellard
{
176 31e31b8a bellard
#if !defined(BSWP_NEEDED) && !defined(WORD_BIGENDIAN)
177 31e31b8a bellard
    /* nothing to do */
178 31e31b8a bellard
#else
179 31e31b8a bellard
    int i, nw, j, k;
180 31e31b8a bellard
    target_long v;
181 31e31b8a bellard
182 31e31b8a bellard
    if (target_fds) {
183 31e31b8a bellard
        nw = n / TARGET_LONG_BITS;
184 31e31b8a bellard
        k = 0;
185 31e31b8a bellard
        for(i = 0;i < nw; i++) {
186 31e31b8a bellard
            v = 0;
187 31e31b8a bellard
            for(j = 0; j < TARGET_LONG_BITS; j++) {
188 31e31b8a bellard
                v |= ((FD_ISSET(k, fds) != 0) << j);
189 31e31b8a bellard
                k++;
190 31e31b8a bellard
            }
191 31e31b8a bellard
            target_fds[i] = tswapl(v);
192 31e31b8a bellard
        }
193 31e31b8a bellard
    }
194 31e31b8a bellard
#endif
195 31e31b8a bellard
}
196 31e31b8a bellard
197 31e31b8a bellard
/* XXX: incorrect for some archs */
198 31e31b8a bellard
static void host_to_target_old_sigset(target_ulong *old_sigset, 
199 31e31b8a bellard
                                      const sigset_t *sigset)
200 31e31b8a bellard
{
201 31e31b8a bellard
    *old_sigset = tswap32(*(unsigned long *)sigset & 0xffffffff);
202 31e31b8a bellard
}
203 31e31b8a bellard
204 31e31b8a bellard
static void target_to_host_old_sigset(sigset_t *sigset, 
205 31e31b8a bellard
                                      const target_ulong *old_sigset)
206 31e31b8a bellard
{
207 31e31b8a bellard
    sigemptyset(sigset);
208 31e31b8a bellard
    *(unsigned long *)sigset = tswapl(*old_sigset);
209 31e31b8a bellard
}
210 31e31b8a bellard
211 31e31b8a bellard
212 31e31b8a bellard
static long do_select(long n, 
213 31e31b8a bellard
                      target_long *target_rfds, target_long *target_wfds, 
214 31e31b8a bellard
                      target_long *target_efds, struct target_timeval *target_tv)
215 31e31b8a bellard
{
216 31e31b8a bellard
    fd_set rfds, wfds, efds;
217 31e31b8a bellard
    fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
218 31e31b8a bellard
    struct timeval tv, *tv_ptr;
219 31e31b8a bellard
    long ret;
220 31e31b8a bellard
221 31e31b8a bellard
    rfds_ptr = target_to_host_fds(&rfds, target_rfds, n);
222 31e31b8a bellard
    wfds_ptr = target_to_host_fds(&wfds, target_wfds, n);
223 31e31b8a bellard
    efds_ptr = target_to_host_fds(&efds, target_efds, n);
224 31e31b8a bellard
            
225 31e31b8a bellard
    if (target_tv) {
226 31e31b8a bellard
        tv.tv_sec = tswapl(target_tv->tv_sec);
227 31e31b8a bellard
        tv.tv_usec = tswapl(target_tv->tv_usec);
228 31e31b8a bellard
        tv_ptr = &tv;
229 31e31b8a bellard
    } else {
230 31e31b8a bellard
        tv_ptr = NULL;
231 31e31b8a bellard
    }
232 31e31b8a bellard
    ret = get_errno(select(n, rfds_ptr, wfds_ptr, efds_ptr, tv_ptr));
233 31e31b8a bellard
    if (!is_error(ret)) {
234 31e31b8a bellard
        host_to_target_fds(target_rfds, rfds_ptr, n);
235 31e31b8a bellard
        host_to_target_fds(target_wfds, wfds_ptr, n);
236 31e31b8a bellard
        host_to_target_fds(target_efds, efds_ptr, n);
237 31e31b8a bellard
238 31e31b8a bellard
        if (target_tv) {
239 31e31b8a bellard
            target_tv->tv_sec = tswapl(tv.tv_sec);
240 31e31b8a bellard
            target_tv->tv_usec = tswapl(tv.tv_usec);
241 31e31b8a bellard
        }
242 31e31b8a bellard
    }
243 31e31b8a bellard
    return ret;
244 31e31b8a bellard
}
245 31e31b8a bellard
246 31e31b8a bellard
static long do_socketcall(int num, long *vptr)
247 31e31b8a bellard
{
248 31e31b8a bellard
    long ret;
249 31e31b8a bellard
250 31e31b8a bellard
    switch(num) {
251 31e31b8a bellard
    case SOCKOP_socket:
252 31e31b8a bellard
        ret = get_errno(socket(vptr[0], vptr[1], vptr[2]));
253 31e31b8a bellard
        break;
254 31e31b8a bellard
    case SOCKOP_bind:
255 31e31b8a bellard
        ret = get_errno(bind(vptr[0], (struct sockaddr *)vptr[1], vptr[2]));
256 31e31b8a bellard
        break;
257 31e31b8a bellard
    case SOCKOP_connect:
258 31e31b8a bellard
        ret = get_errno(connect(vptr[0], (struct sockaddr *)vptr[1], vptr[2]));
259 31e31b8a bellard
        break;
260 31e31b8a bellard
    case SOCKOP_listen:
261 31e31b8a bellard
        ret = get_errno(listen(vptr[0], vptr[1]));
262 31e31b8a bellard
        break;
263 31e31b8a bellard
    case SOCKOP_accept:
264 31e31b8a bellard
        {
265 31e31b8a bellard
            socklen_t size;
266 31e31b8a bellard
            size = tswap32(*(int32_t *)vptr[2]);
267 31e31b8a bellard
            ret = get_errno(accept(vptr[0], (struct sockaddr *)vptr[1], &size));
268 31e31b8a bellard
            if (!is_error(ret)) 
269 31e31b8a bellard
                *(int32_t *)vptr[2] = size;
270 31e31b8a bellard
        }
271 31e31b8a bellard
        break;
272 31e31b8a bellard
    case SOCKOP_getsockname:
273 31e31b8a bellard
        {
274 31e31b8a bellard
            socklen_t size;
275 31e31b8a bellard
            size = tswap32(*(int32_t *)vptr[2]);
276 31e31b8a bellard
            ret = get_errno(getsockname(vptr[0], (struct sockaddr *)vptr[1], &size));
277 31e31b8a bellard
            if (!is_error(ret)) 
278 31e31b8a bellard
                *(int32_t *)vptr[2] = size;
279 31e31b8a bellard
        }
280 31e31b8a bellard
        break;
281 31e31b8a bellard
    case SOCKOP_getpeername:
282 31e31b8a bellard
        {
283 31e31b8a bellard
            socklen_t size;
284 31e31b8a bellard
            size = tswap32(*(int32_t *)vptr[2]);
285 31e31b8a bellard
            ret = get_errno(getpeername(vptr[0], (struct sockaddr *)vptr[1], &size));
286 31e31b8a bellard
            if (!is_error(ret)) 
287 31e31b8a bellard
                *(int32_t *)vptr[2] = size;
288 31e31b8a bellard
        }
289 31e31b8a bellard
        break;
290 31e31b8a bellard
    case SOCKOP_socketpair:
291 31e31b8a bellard
        {
292 31e31b8a bellard
            int tab[2];
293 31e31b8a bellard
            int32_t *target_tab = (int32_t *)vptr[3];
294 31e31b8a bellard
            ret = get_errno(socketpair(vptr[0], vptr[1], vptr[2], tab));
295 31e31b8a bellard
            if (!is_error(ret)) {
296 31e31b8a bellard
                target_tab[0] = tswap32(tab[0]);
297 31e31b8a bellard
                target_tab[1] = tswap32(tab[1]);
298 31e31b8a bellard
            }
299 31e31b8a bellard
        }
300 31e31b8a bellard
        break;
301 31e31b8a bellard
    case SOCKOP_send:
302 31e31b8a bellard
        ret = get_errno(send(vptr[0], (void *)vptr[1], vptr[2], vptr[3]));
303 31e31b8a bellard
        break;
304 31e31b8a bellard
    case SOCKOP_recv:
305 31e31b8a bellard
        ret = get_errno(recv(vptr[0], (void *)vptr[1], vptr[2], vptr[3]));
306 31e31b8a bellard
        break;
307 31e31b8a bellard
    case SOCKOP_sendto:
308 31e31b8a bellard
        ret = get_errno(sendto(vptr[0], (void *)vptr[1], vptr[2], vptr[3], 
309 31e31b8a bellard
                               (struct sockaddr *)vptr[4], vptr[5]));
310 31e31b8a bellard
        break;
311 31e31b8a bellard
    case SOCKOP_recvfrom:
312 31e31b8a bellard
        {
313 31e31b8a bellard
            socklen_t size;
314 31e31b8a bellard
            size = tswap32(*(int32_t *)vptr[5]);
315 31e31b8a bellard
            ret = get_errno(recvfrom(vptr[0], (void *)vptr[1], vptr[2], 
316 31e31b8a bellard
                                     vptr[3], (struct sockaddr *)vptr[4], &size));
317 31e31b8a bellard
            if (!is_error(ret)) 
318 31e31b8a bellard
                *(int32_t *)vptr[5] = size;
319 31e31b8a bellard
        }
320 31e31b8a bellard
        break;
321 31e31b8a bellard
    case SOCKOP_shutdown:
322 31e31b8a bellard
        ret = get_errno(shutdown(vptr[0], vptr[1]));
323 31e31b8a bellard
        break;
324 31e31b8a bellard
    case SOCKOP_sendmsg:
325 31e31b8a bellard
    case SOCKOP_recvmsg:
326 31e31b8a bellard
    case SOCKOP_setsockopt:
327 31e31b8a bellard
    case SOCKOP_getsockopt:
328 31e31b8a bellard
    default:
329 31e31b8a bellard
        gemu_log("Unsupported socketcall: %d\n", num);
330 31e31b8a bellard
        ret = -ENOSYS;
331 31e31b8a bellard
        break;
332 31e31b8a bellard
    }
333 31e31b8a bellard
    return ret;
334 31e31b8a bellard
}
335 31e31b8a bellard
336 31e31b8a bellard
/* kernel structure types definitions */
337 31e31b8a bellard
#define IFNAMSIZ        16
338 31e31b8a bellard
339 31e31b8a bellard
#define STRUCT(name, list...) STRUCT_ ## name,
340 31e31b8a bellard
#define STRUCT_SPECIAL(name) STRUCT_ ## name,
341 31e31b8a bellard
enum {
342 31e31b8a bellard
#include "syscall_types.h"
343 31e31b8a bellard
};
344 31e31b8a bellard
#undef STRUCT
345 31e31b8a bellard
#undef STRUCT_SPECIAL
346 31e31b8a bellard
347 31e31b8a bellard
#define STRUCT(name, list...) const argtype struct_ ## name ## _def[] = { list, TYPE_NULL };
348 31e31b8a bellard
#define STRUCT_SPECIAL(name)
349 31e31b8a bellard
#include "syscall_types.h"
350 31e31b8a bellard
#undef STRUCT
351 31e31b8a bellard
#undef STRUCT_SPECIAL
352 31e31b8a bellard
353 31e31b8a bellard
typedef struct IOCTLEntry {
354 31e31b8a bellard
    int target_cmd;
355 31e31b8a bellard
    int host_cmd;
356 31e31b8a bellard
    const char *name;
357 31e31b8a bellard
    int access;
358 31e31b8a bellard
    const argtype arg_type[3];
359 31e31b8a bellard
} IOCTLEntry;
360 31e31b8a bellard
361 31e31b8a bellard
#define IOC_R 0x0001
362 31e31b8a bellard
#define IOC_W 0x0002
363 31e31b8a bellard
#define IOC_RW (IOC_R | IOC_W)
364 31e31b8a bellard
365 31e31b8a bellard
#define MAX_STRUCT_SIZE 4096
366 31e31b8a bellard
367 31e31b8a bellard
const IOCTLEntry ioctl_entries[] = {
368 31e31b8a bellard
#define IOCTL(cmd, access, types...) \
369 31e31b8a bellard
    { TARGET_ ## cmd, cmd, #cmd, access, { types } },
370 31e31b8a bellard
#include "ioctls.h"
371 31e31b8a bellard
    { 0, 0, },
372 31e31b8a bellard
};
373 31e31b8a bellard
374 31e31b8a bellard
static long do_ioctl(long fd, long cmd, long arg)
375 31e31b8a bellard
{
376 31e31b8a bellard
    const IOCTLEntry *ie;
377 31e31b8a bellard
    const argtype *arg_type;
378 31e31b8a bellard
    long ret;
379 31e31b8a bellard
    uint8_t buf_temp[MAX_STRUCT_SIZE];
380 31e31b8a bellard
381 31e31b8a bellard
    ie = ioctl_entries;
382 31e31b8a bellard
    for(;;) {
383 31e31b8a bellard
        if (ie->target_cmd == 0) {
384 31e31b8a bellard
            gemu_log("Unsupported ioctl: cmd=0x%04lx\n", cmd);
385 31e31b8a bellard
            return -ENOSYS;
386 31e31b8a bellard
        }
387 31e31b8a bellard
        if (ie->target_cmd == cmd)
388 31e31b8a bellard
            break;
389 31e31b8a bellard
        ie++;
390 31e31b8a bellard
    }
391 31e31b8a bellard
    arg_type = ie->arg_type;
392 72f03900 bellard
#ifdef DEBUG
393 72f03900 bellard
    gemu_log("ioctl: cmd=0x%04lx (%s)\n", cmd, ie->name);
394 72f03900 bellard
#endif
395 31e31b8a bellard
    switch(arg_type[0]) {
396 31e31b8a bellard
    case TYPE_NULL:
397 31e31b8a bellard
        /* no argument */
398 31e31b8a bellard
        ret = get_errno(ioctl(fd, ie->host_cmd));
399 31e31b8a bellard
        break;
400 31e31b8a bellard
    case TYPE_PTRVOID:
401 31e31b8a bellard
    case TYPE_INT:
402 31e31b8a bellard
        /* int argment */
403 31e31b8a bellard
        ret = get_errno(ioctl(fd, ie->host_cmd, arg));
404 31e31b8a bellard
        break;
405 31e31b8a bellard
    case TYPE_PTR:
406 31e31b8a bellard
        arg_type++;
407 31e31b8a bellard
        switch(ie->access) {
408 31e31b8a bellard
        case IOC_R:
409 31e31b8a bellard
            ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
410 31e31b8a bellard
            if (!is_error(ret)) {
411 31e31b8a bellard
                thunk_convert((void *)arg, buf_temp, arg_type, THUNK_TARGET);
412 31e31b8a bellard
            }
413 31e31b8a bellard
            break;
414 31e31b8a bellard
        case IOC_W:
415 31e31b8a bellard
            thunk_convert(buf_temp, (void *)arg, arg_type, THUNK_HOST);
416 31e31b8a bellard
            ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
417 31e31b8a bellard
            break;
418 31e31b8a bellard
        default:
419 31e31b8a bellard
        case IOC_RW:
420 31e31b8a bellard
            thunk_convert(buf_temp, (void *)arg, arg_type, THUNK_HOST);
421 31e31b8a bellard
            ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
422 31e31b8a bellard
            if (!is_error(ret)) {
423 31e31b8a bellard
                thunk_convert((void *)arg, buf_temp, arg_type, THUNK_TARGET);
424 31e31b8a bellard
            }
425 31e31b8a bellard
            break;
426 31e31b8a bellard
        }
427 31e31b8a bellard
        break;
428 31e31b8a bellard
    default:
429 31e31b8a bellard
        gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n", cmd, arg_type[0]);
430 31e31b8a bellard
        ret = -ENOSYS;
431 31e31b8a bellard
        break;
432 31e31b8a bellard
    }
433 31e31b8a bellard
    return ret;
434 31e31b8a bellard
}
435 31e31b8a bellard
436 31e31b8a bellard
bitmask_transtbl iflag_tbl[] = {
437 31e31b8a bellard
        { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK },
438 31e31b8a bellard
        { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT },
439 31e31b8a bellard
        { TARGET_IGNPAR, TARGET_IGNPAR, IGNPAR, IGNPAR },
440 31e31b8a bellard
        { TARGET_PARMRK, TARGET_PARMRK, PARMRK, PARMRK },
441 31e31b8a bellard
        { TARGET_INPCK, TARGET_INPCK, INPCK, INPCK },
442 31e31b8a bellard
        { TARGET_ISTRIP, TARGET_ISTRIP, ISTRIP, ISTRIP },
443 31e31b8a bellard
        { TARGET_INLCR, TARGET_INLCR, INLCR, INLCR },
444 31e31b8a bellard
        { TARGET_IGNCR, TARGET_IGNCR, IGNCR, IGNCR },
445 31e31b8a bellard
        { TARGET_ICRNL, TARGET_ICRNL, ICRNL, ICRNL },
446 31e31b8a bellard
        { TARGET_IUCLC, TARGET_IUCLC, IUCLC, IUCLC },
447 31e31b8a bellard
        { TARGET_IXON, TARGET_IXON, IXON, IXON },
448 31e31b8a bellard
        { TARGET_IXANY, TARGET_IXANY, IXANY, IXANY },
449 31e31b8a bellard
        { TARGET_IXOFF, TARGET_IXOFF, IXOFF, IXOFF },
450 31e31b8a bellard
        { TARGET_IMAXBEL, TARGET_IMAXBEL, IMAXBEL, IMAXBEL },
451 31e31b8a bellard
        { 0, 0, 0, 0 }
452 31e31b8a bellard
};
453 31e31b8a bellard
454 31e31b8a bellard
bitmask_transtbl oflag_tbl[] = {
455 31e31b8a bellard
        { TARGET_OPOST, TARGET_OPOST, OPOST, OPOST },
456 31e31b8a bellard
        { TARGET_OLCUC, TARGET_OLCUC, OLCUC, OLCUC },
457 31e31b8a bellard
        { TARGET_ONLCR, TARGET_ONLCR, ONLCR, ONLCR },
458 31e31b8a bellard
        { TARGET_OCRNL, TARGET_OCRNL, OCRNL, OCRNL },
459 31e31b8a bellard
        { TARGET_ONOCR, TARGET_ONOCR, ONOCR, ONOCR },
460 31e31b8a bellard
        { TARGET_ONLRET, TARGET_ONLRET, ONLRET, ONLRET },
461 31e31b8a bellard
        { TARGET_OFILL, TARGET_OFILL, OFILL, OFILL },
462 31e31b8a bellard
        { TARGET_OFDEL, TARGET_OFDEL, OFDEL, OFDEL },
463 31e31b8a bellard
        { TARGET_NLDLY, TARGET_NL0, NLDLY, NL0 },
464 31e31b8a bellard
        { TARGET_NLDLY, TARGET_NL1, NLDLY, NL1 },
465 31e31b8a bellard
        { TARGET_CRDLY, TARGET_CR0, CRDLY, CR0 },
466 31e31b8a bellard
        { TARGET_CRDLY, TARGET_CR1, CRDLY, CR1 },
467 31e31b8a bellard
        { TARGET_CRDLY, TARGET_CR2, CRDLY, CR2 },
468 31e31b8a bellard
        { TARGET_CRDLY, TARGET_CR3, CRDLY, CR3 },
469 31e31b8a bellard
        { TARGET_TABDLY, TARGET_TAB0, TABDLY, TAB0 },
470 31e31b8a bellard
        { TARGET_TABDLY, TARGET_TAB1, TABDLY, TAB1 },
471 31e31b8a bellard
        { TARGET_TABDLY, TARGET_TAB2, TABDLY, TAB2 },
472 31e31b8a bellard
        { TARGET_TABDLY, TARGET_TAB3, TABDLY, TAB3 },
473 31e31b8a bellard
        { TARGET_BSDLY, TARGET_BS0, BSDLY, BS0 },
474 31e31b8a bellard
        { TARGET_BSDLY, TARGET_BS1, BSDLY, BS1 },
475 31e31b8a bellard
        { TARGET_VTDLY, TARGET_VT0, VTDLY, VT0 },
476 31e31b8a bellard
        { TARGET_VTDLY, TARGET_VT1, VTDLY, VT1 },
477 31e31b8a bellard
        { TARGET_FFDLY, TARGET_FF0, FFDLY, FF0 },
478 31e31b8a bellard
        { TARGET_FFDLY, TARGET_FF1, FFDLY, FF1 },
479 31e31b8a bellard
        { 0, 0, 0, 0 }
480 31e31b8a bellard
};
481 31e31b8a bellard
482 31e31b8a bellard
bitmask_transtbl cflag_tbl[] = {
483 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B0, CBAUD, B0 },
484 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B50, CBAUD, B50 },
485 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B75, CBAUD, B75 },
486 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B110, CBAUD, B110 },
487 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B134, CBAUD, B134 },
488 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B150, CBAUD, B150 },
489 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B200, CBAUD, B200 },
490 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B300, CBAUD, B300 },
491 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B600, CBAUD, B600 },
492 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B1200, CBAUD, B1200 },
493 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B1800, CBAUD, B1800 },
494 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B2400, CBAUD, B2400 },
495 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B4800, CBAUD, B4800 },
496 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B9600, CBAUD, B9600 },
497 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B19200, CBAUD, B19200 },
498 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B38400, CBAUD, B38400 },
499 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B57600, CBAUD, B57600 },
500 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B115200, CBAUD, B115200 },
501 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B230400, CBAUD, B230400 },
502 31e31b8a bellard
        { TARGET_CBAUD, TARGET_B460800, CBAUD, B460800 },
503 31e31b8a bellard
        { TARGET_CSIZE, TARGET_CS5, CSIZE, CS5 },
504 31e31b8a bellard
        { TARGET_CSIZE, TARGET_CS6, CSIZE, CS6 },
505 31e31b8a bellard
        { TARGET_CSIZE, TARGET_CS7, CSIZE, CS7 },
506 31e31b8a bellard
        { TARGET_CSIZE, TARGET_CS8, CSIZE, CS8 },
507 31e31b8a bellard
        { TARGET_CSTOPB, TARGET_CSTOPB, CSTOPB, CSTOPB },
508 31e31b8a bellard
        { TARGET_CREAD, TARGET_CREAD, CREAD, CREAD },
509 31e31b8a bellard
        { TARGET_PARENB, TARGET_PARENB, PARENB, PARENB },
510 31e31b8a bellard
        { TARGET_PARODD, TARGET_PARODD, PARODD, PARODD },
511 31e31b8a bellard
        { TARGET_HUPCL, TARGET_HUPCL, HUPCL, HUPCL },
512 31e31b8a bellard
        { TARGET_CLOCAL, TARGET_CLOCAL, CLOCAL, CLOCAL },
513 31e31b8a bellard
        { TARGET_CRTSCTS, TARGET_CRTSCTS, CRTSCTS, CRTSCTS },
514 31e31b8a bellard
        { 0, 0, 0, 0 }
515 31e31b8a bellard
};
516 31e31b8a bellard
517 31e31b8a bellard
bitmask_transtbl lflag_tbl[] = {
518 31e31b8a bellard
        { TARGET_ISIG, TARGET_ISIG, ISIG, ISIG },
519 31e31b8a bellard
        { TARGET_ICANON, TARGET_ICANON, ICANON, ICANON },
520 31e31b8a bellard
        { TARGET_XCASE, TARGET_XCASE, XCASE, XCASE },
521 31e31b8a bellard
        { TARGET_ECHO, TARGET_ECHO, ECHO, ECHO },
522 31e31b8a bellard
        { TARGET_ECHOE, TARGET_ECHOE, ECHOE, ECHOE },
523 31e31b8a bellard
        { TARGET_ECHOK, TARGET_ECHOK, ECHOK, ECHOK },
524 31e31b8a bellard
        { TARGET_ECHONL, TARGET_ECHONL, ECHONL, ECHONL },
525 31e31b8a bellard
        { TARGET_NOFLSH, TARGET_NOFLSH, NOFLSH, NOFLSH },
526 31e31b8a bellard
        { TARGET_TOSTOP, TARGET_TOSTOP, TOSTOP, TOSTOP },
527 31e31b8a bellard
        { TARGET_ECHOCTL, TARGET_ECHOCTL, ECHOCTL, ECHOCTL },
528 31e31b8a bellard
        { TARGET_ECHOPRT, TARGET_ECHOPRT, ECHOPRT, ECHOPRT },
529 31e31b8a bellard
        { TARGET_ECHOKE, TARGET_ECHOKE, ECHOKE, ECHOKE },
530 31e31b8a bellard
        { TARGET_FLUSHO, TARGET_FLUSHO, FLUSHO, FLUSHO },
531 31e31b8a bellard
        { TARGET_PENDIN, TARGET_PENDIN, PENDIN, PENDIN },
532 31e31b8a bellard
        { TARGET_IEXTEN, TARGET_IEXTEN, IEXTEN, IEXTEN },
533 31e31b8a bellard
        { 0, 0, 0, 0 }
534 31e31b8a bellard
};
535 31e31b8a bellard
536 31e31b8a bellard
static void target_to_host_termios (void *dst, const void *src)
537 31e31b8a bellard
{
538 31e31b8a bellard
    struct host_termios *host = dst;
539 31e31b8a bellard
    const struct target_termios *target = src;
540 31e31b8a bellard
    
541 31e31b8a bellard
    host->c_iflag = 
542 31e31b8a bellard
        target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl);
543 31e31b8a bellard
    host->c_oflag = 
544 31e31b8a bellard
        target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl);
545 31e31b8a bellard
    host->c_cflag = 
546 31e31b8a bellard
        target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl);
547 31e31b8a bellard
    host->c_lflag = 
548 31e31b8a bellard
        target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl);
549 31e31b8a bellard
    host->c_line = target->c_line;
550 31e31b8a bellard
    
551 31e31b8a bellard
    host->c_cc[VINTR] = target->c_cc[TARGET_VINTR]; 
552 31e31b8a bellard
    host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT]; 
553 31e31b8a bellard
    host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];       
554 31e31b8a bellard
    host->c_cc[VKILL] = target->c_cc[TARGET_VKILL]; 
555 31e31b8a bellard
    host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];   
556 31e31b8a bellard
    host->c_cc[VTIME] = target->c_cc[TARGET_VTIME]; 
557 31e31b8a bellard
    host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];   
558 31e31b8a bellard
    host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC]; 
559 31e31b8a bellard
    host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];       
560 31e31b8a bellard
    host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP]; 
561 31e31b8a bellard
    host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP]; 
562 31e31b8a bellard
    host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];   
563 31e31b8a bellard
    host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];   
564 31e31b8a bellard
    host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];   
565 31e31b8a bellard
    host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];     
566 31e31b8a bellard
    host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];       
567 31e31b8a bellard
    host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2]; 
568 31e31b8a bellard
}
569 31e31b8a bellard
  
570 31e31b8a bellard
static void host_to_target_termios (void *dst, const void *src)
571 31e31b8a bellard
{
572 31e31b8a bellard
    struct target_termios *target = dst;
573 31e31b8a bellard
    const struct host_termios *host = src;
574 31e31b8a bellard
575 31e31b8a bellard
    target->c_iflag = 
576 31e31b8a bellard
        tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));
577 31e31b8a bellard
    target->c_oflag = 
578 31e31b8a bellard
        tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));
579 31e31b8a bellard
    target->c_cflag = 
580 31e31b8a bellard
        tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));
581 31e31b8a bellard
    target->c_lflag = 
582 31e31b8a bellard
        tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));
583 31e31b8a bellard
    target->c_line = host->c_line;
584 31e31b8a bellard
  
585 31e31b8a bellard
    target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
586 31e31b8a bellard
    target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
587 31e31b8a bellard
    target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
588 31e31b8a bellard
    target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
589 31e31b8a bellard
    target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
590 31e31b8a bellard
    target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
591 31e31b8a bellard
    target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
592 31e31b8a bellard
    target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
593 31e31b8a bellard
    target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
594 31e31b8a bellard
    target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
595 31e31b8a bellard
    target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
596 31e31b8a bellard
    target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
597 31e31b8a bellard
    target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
598 31e31b8a bellard
    target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
599 31e31b8a bellard
    target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
600 31e31b8a bellard
    target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
601 31e31b8a bellard
    target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
602 31e31b8a bellard
}
603 31e31b8a bellard
604 31e31b8a bellard
StructEntry struct_termios_def = {
605 31e31b8a bellard
    .convert = { host_to_target_termios, target_to_host_termios },
606 31e31b8a bellard
    .size = { sizeof(struct target_termios), sizeof(struct host_termios) },
607 31e31b8a bellard
    .align = { __alignof__(struct target_termios), __alignof__(struct host_termios) },
608 31e31b8a bellard
};
609 31e31b8a bellard
610 31e31b8a bellard
void syscall_init(void)
611 31e31b8a bellard
{
612 31e31b8a bellard
#define STRUCT(name, list...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def); 
613 31e31b8a bellard
#define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def); 
614 31e31b8a bellard
#include "syscall_types.h"
615 31e31b8a bellard
#undef STRUCT
616 31e31b8a bellard
#undef STRUCT_SPECIAL
617 31e31b8a bellard
}
618 31e31b8a bellard
                                 
619 31e31b8a bellard
long do_syscall(int num, long arg1, long arg2, long arg3, 
620 31e31b8a bellard
                long arg4, long arg5, long arg6)
621 31e31b8a bellard
{
622 31e31b8a bellard
    long ret;
623 31e31b8a bellard
    struct stat st;
624 72f03900 bellard
    struct kernel_statfs *stfs;
625 31e31b8a bellard
    
626 72f03900 bellard
#ifdef DEBUG
627 72f03900 bellard
    gemu_log("syscall %d\n", num);
628 72f03900 bellard
#endif
629 31e31b8a bellard
    switch(num) {
630 31e31b8a bellard
    case TARGET_NR_exit:
631 7d13299d bellard
#ifdef HAVE_GPROF
632 7d13299d bellard
        _mcleanup();
633 7d13299d bellard
#endif
634 31e31b8a bellard
        _exit(arg1);
635 31e31b8a bellard
        ret = 0; /* avoid warning */
636 31e31b8a bellard
        break;
637 31e31b8a bellard
    case TARGET_NR_read:
638 31e31b8a bellard
        ret = get_errno(read(arg1, (void *)arg2, arg3));
639 31e31b8a bellard
        break;
640 31e31b8a bellard
    case TARGET_NR_write:
641 31e31b8a bellard
        ret = get_errno(write(arg1, (void *)arg2, arg3));
642 31e31b8a bellard
        break;
643 31e31b8a bellard
    case TARGET_NR_open:
644 31e31b8a bellard
        ret = get_errno(open((const char *)arg1, arg2, arg3));
645 31e31b8a bellard
        break;
646 31e31b8a bellard
    case TARGET_NR_close:
647 31e31b8a bellard
        ret = get_errno(close(arg1));
648 31e31b8a bellard
        break;
649 31e31b8a bellard
    case TARGET_NR_brk:
650 31e31b8a bellard
        ret = do_brk((char *)arg1);
651 31e31b8a bellard
        break;
652 31e31b8a bellard
    case TARGET_NR_fork:
653 31e31b8a bellard
        ret = get_errno(fork());
654 31e31b8a bellard
        break;
655 31e31b8a bellard
    case TARGET_NR_waitpid:
656 31e31b8a bellard
        {
657 31e31b8a bellard
            int *status = (int *)arg2;
658 31e31b8a bellard
            ret = get_errno(waitpid(arg1, status, arg3));
659 31e31b8a bellard
            if (!is_error(ret) && status)
660 31e31b8a bellard
                tswapls((long *)&status);
661 31e31b8a bellard
        }
662 31e31b8a bellard
        break;
663 31e31b8a bellard
    case TARGET_NR_creat:
664 31e31b8a bellard
        ret = get_errno(creat((const char *)arg1, arg2));
665 31e31b8a bellard
        break;
666 31e31b8a bellard
    case TARGET_NR_link:
667 31e31b8a bellard
        ret = get_errno(link((const char *)arg1, (const char *)arg2));
668 31e31b8a bellard
        break;
669 31e31b8a bellard
    case TARGET_NR_unlink:
670 31e31b8a bellard
        ret = get_errno(unlink((const char *)arg1));
671 31e31b8a bellard
        break;
672 31e31b8a bellard
    case TARGET_NR_execve:
673 31e31b8a bellard
        ret = get_errno(execve((const char *)arg1, (void *)arg2, (void *)arg3));
674 31e31b8a bellard
        break;
675 31e31b8a bellard
    case TARGET_NR_chdir:
676 31e31b8a bellard
        ret = get_errno(chdir((const char *)arg1));
677 31e31b8a bellard
        break;
678 31e31b8a bellard
    case TARGET_NR_time:
679 31e31b8a bellard
        {
680 31e31b8a bellard
            int *time_ptr = (int *)arg1;
681 31e31b8a bellard
            ret = get_errno(time((time_t *)time_ptr));
682 31e31b8a bellard
            if (!is_error(ret) && time_ptr)
683 31e31b8a bellard
                tswap32s(time_ptr);
684 31e31b8a bellard
        }
685 31e31b8a bellard
        break;
686 31e31b8a bellard
    case TARGET_NR_mknod:
687 31e31b8a bellard
        ret = get_errno(mknod((const char *)arg1, arg2, arg3));
688 31e31b8a bellard
        break;
689 31e31b8a bellard
    case TARGET_NR_chmod:
690 31e31b8a bellard
        ret = get_errno(chmod((const char *)arg1, arg2));
691 31e31b8a bellard
        break;
692 31e31b8a bellard
    case TARGET_NR_lchown:
693 31e31b8a bellard
        ret = get_errno(chown((const char *)arg1, arg2, arg3));
694 31e31b8a bellard
        break;
695 31e31b8a bellard
    case TARGET_NR_break:
696 31e31b8a bellard
        goto unimplemented;
697 31e31b8a bellard
    case TARGET_NR_oldstat:
698 31e31b8a bellard
        goto unimplemented;
699 31e31b8a bellard
    case TARGET_NR_lseek:
700 31e31b8a bellard
        ret = get_errno(lseek(arg1, arg2, arg3));
701 31e31b8a bellard
        break;
702 31e31b8a bellard
    case TARGET_NR_getpid:
703 31e31b8a bellard
        ret = get_errno(getpid());
704 31e31b8a bellard
        break;
705 31e31b8a bellard
    case TARGET_NR_mount:
706 31e31b8a bellard
        /* need to look at the data field */
707 31e31b8a bellard
        goto unimplemented;
708 31e31b8a bellard
    case TARGET_NR_umount:
709 31e31b8a bellard
        ret = get_errno(umount((const char *)arg1));
710 31e31b8a bellard
        break;
711 31e31b8a bellard
    case TARGET_NR_setuid:
712 31e31b8a bellard
        ret = get_errno(setuid(arg1));
713 31e31b8a bellard
        break;
714 31e31b8a bellard
    case TARGET_NR_getuid:
715 31e31b8a bellard
        ret = get_errno(getuid());
716 31e31b8a bellard
        break;
717 31e31b8a bellard
    case TARGET_NR_stime:
718 31e31b8a bellard
        {
719 31e31b8a bellard
            int *time_ptr = (int *)arg1;
720 31e31b8a bellard
            if (time_ptr)
721 31e31b8a bellard
                tswap32s(time_ptr);
722 31e31b8a bellard
            ret = get_errno(stime((time_t *)time_ptr));
723 31e31b8a bellard
        }
724 31e31b8a bellard
        break;
725 31e31b8a bellard
    case TARGET_NR_ptrace:
726 31e31b8a bellard
        goto unimplemented;
727 31e31b8a bellard
    case TARGET_NR_alarm:
728 31e31b8a bellard
        ret = alarm(arg1);
729 31e31b8a bellard
        break;
730 31e31b8a bellard
    case TARGET_NR_oldfstat:
731 31e31b8a bellard
        goto unimplemented;
732 31e31b8a bellard
    case TARGET_NR_pause:
733 31e31b8a bellard
        ret = get_errno(pause());
734 31e31b8a bellard
        break;
735 31e31b8a bellard
    case TARGET_NR_utime:
736 31e31b8a bellard
        goto unimplemented;
737 31e31b8a bellard
    case TARGET_NR_stty:
738 31e31b8a bellard
        goto unimplemented;
739 31e31b8a bellard
    case TARGET_NR_gtty:
740 31e31b8a bellard
        goto unimplemented;
741 31e31b8a bellard
    case TARGET_NR_access:
742 31e31b8a bellard
        ret = get_errno(access((const char *)arg1, arg2));
743 31e31b8a bellard
        break;
744 31e31b8a bellard
    case TARGET_NR_nice:
745 31e31b8a bellard
        ret = get_errno(nice(arg1));
746 31e31b8a bellard
        break;
747 31e31b8a bellard
    case TARGET_NR_ftime:
748 31e31b8a bellard
        goto unimplemented;
749 31e31b8a bellard
    case TARGET_NR_sync:
750 31e31b8a bellard
        ret = get_errno(sync());
751 31e31b8a bellard
        break;
752 31e31b8a bellard
    case TARGET_NR_kill:
753 31e31b8a bellard
        ret = get_errno(kill(arg1, arg2));
754 31e31b8a bellard
        break;
755 31e31b8a bellard
    case TARGET_NR_rename:
756 31e31b8a bellard
        ret = get_errno(rename((const char *)arg1, (const char *)arg2));
757 31e31b8a bellard
        break;
758 31e31b8a bellard
    case TARGET_NR_mkdir:
759 31e31b8a bellard
        ret = get_errno(mkdir((const char *)arg1, arg2));
760 31e31b8a bellard
        break;
761 31e31b8a bellard
    case TARGET_NR_rmdir:
762 31e31b8a bellard
        ret = get_errno(rmdir((const char *)arg1));
763 31e31b8a bellard
        break;
764 31e31b8a bellard
    case TARGET_NR_dup:
765 31e31b8a bellard
        ret = get_errno(dup(arg1));
766 31e31b8a bellard
        break;
767 31e31b8a bellard
    case TARGET_NR_pipe:
768 31e31b8a bellard
        {
769 31e31b8a bellard
            int *pipe_ptr = (int *)arg1;
770 31e31b8a bellard
            ret = get_errno(pipe(pipe_ptr));
771 31e31b8a bellard
            if (!is_error(ret)) {
772 31e31b8a bellard
                tswap32s(&pipe_ptr[0]);
773 31e31b8a bellard
                tswap32s(&pipe_ptr[1]);
774 31e31b8a bellard
            }
775 31e31b8a bellard
        }
776 31e31b8a bellard
        break;
777 31e31b8a bellard
    case TARGET_NR_times:
778 31e31b8a bellard
        goto unimplemented;
779 31e31b8a bellard
    case TARGET_NR_prof:
780 31e31b8a bellard
        goto unimplemented;
781 31e31b8a bellard
    case TARGET_NR_setgid:
782 31e31b8a bellard
        ret = get_errno(setgid(arg1));
783 31e31b8a bellard
        break;
784 31e31b8a bellard
    case TARGET_NR_getgid:
785 31e31b8a bellard
        ret = get_errno(getgid());
786 31e31b8a bellard
        break;
787 31e31b8a bellard
    case TARGET_NR_signal:
788 31e31b8a bellard
        goto unimplemented;
789 31e31b8a bellard
    case TARGET_NR_geteuid:
790 31e31b8a bellard
        ret = get_errno(geteuid());
791 31e31b8a bellard
        break;
792 31e31b8a bellard
    case TARGET_NR_getegid:
793 31e31b8a bellard
        ret = get_errno(getegid());
794 31e31b8a bellard
        break;
795 31e31b8a bellard
    case TARGET_NR_acct:
796 31e31b8a bellard
        goto unimplemented;
797 31e31b8a bellard
    case TARGET_NR_umount2:
798 31e31b8a bellard
        ret = get_errno(umount2((const char *)arg1, arg2));
799 31e31b8a bellard
        break;
800 31e31b8a bellard
    case TARGET_NR_lock:
801 31e31b8a bellard
        goto unimplemented;
802 31e31b8a bellard
    case TARGET_NR_ioctl:
803 31e31b8a bellard
        ret = do_ioctl(arg1, arg2, arg3);
804 31e31b8a bellard
        break;
805 31e31b8a bellard
    case TARGET_NR_fcntl:
806 31e31b8a bellard
        switch(arg2) {
807 31e31b8a bellard
        case F_GETLK:
808 31e31b8a bellard
        case F_SETLK:
809 31e31b8a bellard
        case F_SETLKW:
810 31e31b8a bellard
            goto unimplemented;
811 31e31b8a bellard
        default:
812 31e31b8a bellard
            ret = get_errno(fcntl(arg1, arg2, arg3));
813 31e31b8a bellard
            break;
814 31e31b8a bellard
        }
815 31e31b8a bellard
        break;
816 31e31b8a bellard
    case TARGET_NR_mpx:
817 31e31b8a bellard
        goto unimplemented;
818 31e31b8a bellard
    case TARGET_NR_setpgid:
819 31e31b8a bellard
        ret = get_errno(setpgid(arg1, arg2));
820 31e31b8a bellard
        break;
821 31e31b8a bellard
    case TARGET_NR_ulimit:
822 31e31b8a bellard
        goto unimplemented;
823 31e31b8a bellard
    case TARGET_NR_oldolduname:
824 31e31b8a bellard
        goto unimplemented;
825 31e31b8a bellard
    case TARGET_NR_umask:
826 31e31b8a bellard
        ret = get_errno(umask(arg1));
827 31e31b8a bellard
        break;
828 31e31b8a bellard
    case TARGET_NR_chroot:
829 31e31b8a bellard
        ret = get_errno(chroot((const char *)arg1));
830 31e31b8a bellard
        break;
831 31e31b8a bellard
    case TARGET_NR_ustat:
832 31e31b8a bellard
        goto unimplemented;
833 31e31b8a bellard
    case TARGET_NR_dup2:
834 31e31b8a bellard
        ret = get_errno(dup2(arg1, arg2));
835 31e31b8a bellard
        break;
836 31e31b8a bellard
    case TARGET_NR_getppid:
837 31e31b8a bellard
        ret = get_errno(getppid());
838 31e31b8a bellard
        break;
839 31e31b8a bellard
    case TARGET_NR_getpgrp:
840 31e31b8a bellard
        ret = get_errno(getpgrp());
841 31e31b8a bellard
        break;
842 31e31b8a bellard
    case TARGET_NR_setsid:
843 31e31b8a bellard
        ret = get_errno(setsid());
844 31e31b8a bellard
        break;
845 31e31b8a bellard
    case TARGET_NR_sigaction:
846 31e31b8a bellard
#if 0
847 31e31b8a bellard
        {
848 31e31b8a bellard
            int signum = arg1;
849 31e31b8a bellard
            struct target_old_sigaction *tact = arg2, *toldact = arg3;
850 31e31b8a bellard
            ret = get_errno(setsid());
851 31e31b8a bellard
            
852 31e31b8a bellard

853 31e31b8a bellard
        }
854 31e31b8a bellard
        break;
855 31e31b8a bellard
#else
856 31e31b8a bellard
        goto unimplemented;
857 31e31b8a bellard
#endif
858 31e31b8a bellard
    case TARGET_NR_sgetmask:
859 31e31b8a bellard
        goto unimplemented;
860 31e31b8a bellard
    case TARGET_NR_ssetmask:
861 31e31b8a bellard
        goto unimplemented;
862 31e31b8a bellard
    case TARGET_NR_setreuid:
863 31e31b8a bellard
        ret = get_errno(setreuid(arg1, arg2));
864 31e31b8a bellard
        break;
865 31e31b8a bellard
    case TARGET_NR_setregid:
866 31e31b8a bellard
        ret = get_errno(setregid(arg1, arg2));
867 31e31b8a bellard
        break;
868 31e31b8a bellard
    case TARGET_NR_sigsuspend:
869 31e31b8a bellard
        goto unimplemented;
870 31e31b8a bellard
    case TARGET_NR_sigpending:
871 31e31b8a bellard
        goto unimplemented;
872 31e31b8a bellard
    case TARGET_NR_sethostname:
873 31e31b8a bellard
        ret = get_errno(sethostname((const char *)arg1, arg2));
874 31e31b8a bellard
        break;
875 31e31b8a bellard
    case TARGET_NR_setrlimit:
876 31e31b8a bellard
        goto unimplemented;
877 31e31b8a bellard
    case TARGET_NR_getrlimit:
878 31e31b8a bellard
        goto unimplemented;
879 31e31b8a bellard
    case TARGET_NR_getrusage:
880 31e31b8a bellard
        goto unimplemented;
881 31e31b8a bellard
    case TARGET_NR_gettimeofday:
882 31e31b8a bellard
        {
883 31e31b8a bellard
            struct target_timeval *target_tv = (void *)arg1;
884 31e31b8a bellard
            struct timeval tv;
885 31e31b8a bellard
            ret = get_errno(gettimeofday(&tv, NULL));
886 31e31b8a bellard
            if (!is_error(ret)) {
887 31e31b8a bellard
                target_tv->tv_sec = tswapl(tv.tv_sec);
888 31e31b8a bellard
                target_tv->tv_usec = tswapl(tv.tv_usec);
889 31e31b8a bellard
            }
890 31e31b8a bellard
        }
891 31e31b8a bellard
        break;
892 31e31b8a bellard
    case TARGET_NR_settimeofday:
893 31e31b8a bellard
        {
894 31e31b8a bellard
            struct target_timeval *target_tv = (void *)arg1;
895 31e31b8a bellard
            struct timeval tv;
896 31e31b8a bellard
            tv.tv_sec = tswapl(target_tv->tv_sec);
897 31e31b8a bellard
            tv.tv_usec = tswapl(target_tv->tv_usec);
898 31e31b8a bellard
            ret = get_errno(settimeofday(&tv, NULL));
899 31e31b8a bellard
        }
900 31e31b8a bellard
        break;
901 31e31b8a bellard
    case TARGET_NR_getgroups:
902 31e31b8a bellard
        goto unimplemented;
903 31e31b8a bellard
    case TARGET_NR_setgroups:
904 31e31b8a bellard
        goto unimplemented;
905 31e31b8a bellard
    case TARGET_NR_select:
906 31e31b8a bellard
        goto unimplemented;
907 31e31b8a bellard
    case TARGET_NR_symlink:
908 31e31b8a bellard
        ret = get_errno(symlink((const char *)arg1, (const char *)arg2));
909 31e31b8a bellard
        break;
910 31e31b8a bellard
    case TARGET_NR_oldlstat:
911 31e31b8a bellard
        goto unimplemented;
912 31e31b8a bellard
    case TARGET_NR_readlink:
913 31e31b8a bellard
        ret = get_errno(readlink((const char *)arg1, (char *)arg2, arg3));
914 31e31b8a bellard
        break;
915 31e31b8a bellard
    case TARGET_NR_uselib:
916 31e31b8a bellard
        goto unimplemented;
917 31e31b8a bellard
    case TARGET_NR_swapon:
918 31e31b8a bellard
        ret = get_errno(swapon((const char *)arg1, arg2));
919 31e31b8a bellard
        break;
920 31e31b8a bellard
    case TARGET_NR_reboot:
921 31e31b8a bellard
        goto unimplemented;
922 31e31b8a bellard
    case TARGET_NR_readdir:
923 31e31b8a bellard
        goto unimplemented;
924 31e31b8a bellard
#ifdef TARGET_I386
925 31e31b8a bellard
    case TARGET_NR_mmap:
926 31e31b8a bellard
        {
927 31e31b8a bellard
            uint32_t v1, v2, v3, v4, v5, v6, *vptr;
928 31e31b8a bellard
            vptr = (uint32_t *)arg1;
929 31e31b8a bellard
            v1 = tswap32(vptr[0]);
930 31e31b8a bellard
            v2 = tswap32(vptr[1]);
931 31e31b8a bellard
            v3 = tswap32(vptr[2]);
932 31e31b8a bellard
            v4 = tswap32(vptr[3]);
933 31e31b8a bellard
            v5 = tswap32(vptr[4]);
934 31e31b8a bellard
            v6 = tswap32(vptr[5]);
935 31e31b8a bellard
            ret = get_errno((long)mmap((void *)v1, v2, v3, v4, v5, v6));
936 31e31b8a bellard
        }
937 31e31b8a bellard
        break;
938 31e31b8a bellard
#endif
939 31e31b8a bellard
#ifdef TARGET_I386
940 31e31b8a bellard
    case TARGET_NR_mmap2:
941 31e31b8a bellard
#else
942 31e31b8a bellard
    case TARGET_NR_mmap:
943 31e31b8a bellard
#endif
944 31e31b8a bellard
        ret = get_errno((long)mmap((void *)arg1, arg2, arg3, arg4, arg5, arg6));
945 31e31b8a bellard
        break;
946 31e31b8a bellard
    case TARGET_NR_munmap:
947 31e31b8a bellard
        ret = get_errno(munmap((void *)arg1, arg2));
948 31e31b8a bellard
        break;
949 31e31b8a bellard
    case TARGET_NR_truncate:
950 31e31b8a bellard
        ret = get_errno(truncate((const char *)arg1, arg2));
951 31e31b8a bellard
        break;
952 31e31b8a bellard
    case TARGET_NR_ftruncate:
953 31e31b8a bellard
        ret = get_errno(ftruncate(arg1, arg2));
954 31e31b8a bellard
        break;
955 31e31b8a bellard
    case TARGET_NR_fchmod:
956 31e31b8a bellard
        ret = get_errno(fchmod(arg1, arg2));
957 31e31b8a bellard
        break;
958 31e31b8a bellard
    case TARGET_NR_fchown:
959 31e31b8a bellard
        ret = get_errno(fchown(arg1, arg2, arg3));
960 31e31b8a bellard
        break;
961 31e31b8a bellard
    case TARGET_NR_getpriority:
962 31e31b8a bellard
        ret = get_errno(getpriority(arg1, arg2));
963 31e31b8a bellard
        break;
964 31e31b8a bellard
    case TARGET_NR_setpriority:
965 31e31b8a bellard
        ret = get_errno(setpriority(arg1, arg2, arg3));
966 31e31b8a bellard
        break;
967 31e31b8a bellard
    case TARGET_NR_profil:
968 31e31b8a bellard
        goto unimplemented;
969 31e31b8a bellard
    case TARGET_NR_statfs:
970 31e31b8a bellard
        stfs = (void *)arg2;
971 31e31b8a bellard
        ret = get_errno(sys_statfs((const char *)arg1, stfs));
972 31e31b8a bellard
    convert_statfs:
973 31e31b8a bellard
        if (!is_error(ret)) {
974 31e31b8a bellard
            tswap32s(&stfs->f_type);
975 31e31b8a bellard
            tswap32s(&stfs->f_bsize);
976 31e31b8a bellard
            tswap32s(&stfs->f_blocks);
977 31e31b8a bellard
            tswap32s(&stfs->f_bfree);
978 31e31b8a bellard
            tswap32s(&stfs->f_bavail);
979 31e31b8a bellard
            tswap32s(&stfs->f_files);
980 31e31b8a bellard
            tswap32s(&stfs->f_ffree);
981 31e31b8a bellard
            tswap32s(&stfs->f_fsid.val[0]);
982 31e31b8a bellard
            tswap32s(&stfs->f_fsid.val[1]);
983 31e31b8a bellard
            tswap32s(&stfs->f_namelen);
984 31e31b8a bellard
        }
985 31e31b8a bellard
        break;
986 31e31b8a bellard
    case TARGET_NR_fstatfs:
987 31e31b8a bellard
        stfs = (void *)arg2;
988 31e31b8a bellard
        ret = get_errno(sys_fstatfs(arg1, stfs));
989 31e31b8a bellard
        goto convert_statfs;
990 31e31b8a bellard
    case TARGET_NR_ioperm:
991 31e31b8a bellard
        goto unimplemented;
992 31e31b8a bellard
    case TARGET_NR_socketcall:
993 31e31b8a bellard
        ret = do_socketcall(arg1, (long *)arg2);
994 31e31b8a bellard
        break;
995 31e31b8a bellard
    case TARGET_NR_syslog:
996 31e31b8a bellard
        goto unimplemented;
997 31e31b8a bellard
    case TARGET_NR_setitimer:
998 31e31b8a bellard
        goto unimplemented;
999 31e31b8a bellard
    case TARGET_NR_getitimer:
1000 31e31b8a bellard
        goto unimplemented;
1001 31e31b8a bellard
    case TARGET_NR_stat:
1002 31e31b8a bellard
        ret = get_errno(stat((const char *)arg1, &st));
1003 31e31b8a bellard
        goto do_stat;
1004 31e31b8a bellard
    case TARGET_NR_lstat:
1005 31e31b8a bellard
        ret = get_errno(lstat((const char *)arg1, &st));
1006 31e31b8a bellard
        goto do_stat;
1007 31e31b8a bellard
    case TARGET_NR_fstat:
1008 31e31b8a bellard
        {
1009 31e31b8a bellard
            ret = get_errno(fstat(arg1, &st));
1010 31e31b8a bellard
        do_stat:
1011 31e31b8a bellard
            if (!is_error(ret)) {
1012 31e31b8a bellard
                struct target_stat *target_st = (void *)arg2;
1013 31e31b8a bellard
                target_st->st_dev = tswap16(st.st_dev);
1014 31e31b8a bellard
                target_st->st_ino = tswapl(st.st_ino);
1015 31e31b8a bellard
                target_st->st_mode = tswap16(st.st_mode);
1016 31e31b8a bellard
                target_st->st_nlink = tswap16(st.st_nlink);
1017 31e31b8a bellard
                target_st->st_uid = tswap16(st.st_uid);
1018 31e31b8a bellard
                target_st->st_gid = tswap16(st.st_gid);
1019 31e31b8a bellard
                target_st->st_rdev = tswap16(st.st_rdev);
1020 31e31b8a bellard
                target_st->st_size = tswapl(st.st_size);
1021 31e31b8a bellard
                target_st->st_blksize = tswapl(st.st_blksize);
1022 31e31b8a bellard
                target_st->st_blocks = tswapl(st.st_blocks);
1023 31e31b8a bellard
                target_st->st_atime = tswapl(st.st_atime);
1024 31e31b8a bellard
                target_st->st_mtime = tswapl(st.st_mtime);
1025 31e31b8a bellard
                target_st->st_ctime = tswapl(st.st_ctime);
1026 31e31b8a bellard
            }
1027 31e31b8a bellard
        }
1028 31e31b8a bellard
        break;
1029 31e31b8a bellard
    case TARGET_NR_olduname:
1030 31e31b8a bellard
        goto unimplemented;
1031 31e31b8a bellard
    case TARGET_NR_iopl:
1032 31e31b8a bellard
        goto unimplemented;
1033 31e31b8a bellard
    case TARGET_NR_vhangup:
1034 31e31b8a bellard
        ret = get_errno(vhangup());
1035 31e31b8a bellard
        break;
1036 31e31b8a bellard
    case TARGET_NR_idle:
1037 31e31b8a bellard
        goto unimplemented;
1038 31e31b8a bellard
    case TARGET_NR_vm86old:
1039 31e31b8a bellard
        goto unimplemented;
1040 31e31b8a bellard
    case TARGET_NR_wait4:
1041 31e31b8a bellard
        {
1042 31e31b8a bellard
            int status;
1043 31e31b8a bellard
            target_long *status_ptr = (void *)arg2;
1044 31e31b8a bellard
            struct rusage rusage, *rusage_ptr;
1045 31e31b8a bellard
            struct target_rusage *target_rusage = (void *)arg4;
1046 31e31b8a bellard
            if (target_rusage)
1047 31e31b8a bellard
                rusage_ptr = &rusage;
1048 31e31b8a bellard
            else
1049 31e31b8a bellard
                rusage_ptr = NULL;
1050 31e31b8a bellard
            ret = get_errno(wait4(arg1, &status, arg3, rusage_ptr));
1051 31e31b8a bellard
            if (!is_error(ret)) {
1052 31e31b8a bellard
                if (status_ptr)
1053 31e31b8a bellard
                    *status_ptr = tswap32(status);
1054 31e31b8a bellard
                if (target_rusage) {
1055 31e31b8a bellard
                    target_rusage->ru_utime.tv_sec = tswapl(rusage.ru_utime.tv_sec);
1056 31e31b8a bellard
                    target_rusage->ru_utime.tv_usec = tswapl(rusage.ru_utime.tv_usec);
1057 31e31b8a bellard
                    target_rusage->ru_stime.tv_sec = tswapl(rusage.ru_stime.tv_sec);
1058 31e31b8a bellard
                    target_rusage->ru_stime.tv_usec = tswapl(rusage.ru_stime.tv_usec);
1059 31e31b8a bellard
                    target_rusage->ru_maxrss = tswapl(rusage.ru_maxrss);
1060 31e31b8a bellard
                    target_rusage->ru_ixrss = tswapl(rusage.ru_ixrss);
1061 31e31b8a bellard
                    target_rusage->ru_idrss = tswapl(rusage.ru_idrss);
1062 31e31b8a bellard
                    target_rusage->ru_isrss = tswapl(rusage.ru_isrss);
1063 31e31b8a bellard
                    target_rusage->ru_minflt = tswapl(rusage.ru_minflt);
1064 31e31b8a bellard
                    target_rusage->ru_majflt = tswapl(rusage.ru_majflt);
1065 31e31b8a bellard
                    target_rusage->ru_nswap = tswapl(rusage.ru_nswap);
1066 31e31b8a bellard
                    target_rusage->ru_inblock = tswapl(rusage.ru_inblock);
1067 31e31b8a bellard
                    target_rusage->ru_oublock = tswapl(rusage.ru_oublock);
1068 31e31b8a bellard
                    target_rusage->ru_msgsnd = tswapl(rusage.ru_msgsnd);
1069 31e31b8a bellard
                    target_rusage->ru_msgrcv = tswapl(rusage.ru_msgrcv);
1070 31e31b8a bellard
                    target_rusage->ru_nsignals = tswapl(rusage.ru_nsignals);
1071 31e31b8a bellard
                    target_rusage->ru_nvcsw = tswapl(rusage.ru_nvcsw);
1072 31e31b8a bellard
                    target_rusage->ru_nivcsw = tswapl(rusage.ru_nivcsw);
1073 31e31b8a bellard
                }
1074 31e31b8a bellard
            }
1075 31e31b8a bellard
        }
1076 31e31b8a bellard
        break;
1077 31e31b8a bellard
    case TARGET_NR_swapoff:
1078 31e31b8a bellard
        ret = get_errno(swapoff((const char *)arg1));
1079 31e31b8a bellard
        break;
1080 31e31b8a bellard
    case TARGET_NR_sysinfo:
1081 31e31b8a bellard
        goto unimplemented;
1082 31e31b8a bellard
    case TARGET_NR_ipc:
1083 31e31b8a bellard
        goto unimplemented;
1084 31e31b8a bellard
    case TARGET_NR_fsync:
1085 31e31b8a bellard
        ret = get_errno(fsync(arg1));
1086 31e31b8a bellard
        break;
1087 31e31b8a bellard
    case TARGET_NR_sigreturn:
1088 31e31b8a bellard
        goto unimplemented;
1089 31e31b8a bellard
    case TARGET_NR_clone:
1090 31e31b8a bellard
        goto unimplemented;
1091 31e31b8a bellard
    case TARGET_NR_setdomainname:
1092 31e31b8a bellard
        ret = get_errno(setdomainname((const char *)arg1, arg2));
1093 31e31b8a bellard
        break;
1094 31e31b8a bellard
    case TARGET_NR_uname:
1095 31e31b8a bellard
        /* no need to transcode because we use the linux syscall */
1096 31e31b8a bellard
        ret = get_errno(sys_uname((struct new_utsname *)arg1));
1097 31e31b8a bellard
        break;
1098 31e31b8a bellard
    case TARGET_NR_modify_ldt:
1099 31e31b8a bellard
        goto unimplemented;
1100 31e31b8a bellard
    case TARGET_NR_adjtimex:
1101 31e31b8a bellard
        goto unimplemented;
1102 31e31b8a bellard
    case TARGET_NR_mprotect:
1103 31e31b8a bellard
        ret = get_errno(mprotect((void *)arg1, arg2, arg3));
1104 31e31b8a bellard
        break;
1105 31e31b8a bellard
    case TARGET_NR_sigprocmask:
1106 31e31b8a bellard
        {
1107 31e31b8a bellard
            int how = arg1;
1108 31e31b8a bellard
            sigset_t set, oldset, *set_ptr;
1109 31e31b8a bellard
            target_ulong *pset = (void *)arg2, *poldset = (void *)arg3;
1110 31e31b8a bellard
            
1111 31e31b8a bellard
            switch(how) {
1112 31e31b8a bellard
            case TARGET_SIG_BLOCK:
1113 31e31b8a bellard
                how = SIG_BLOCK;
1114 31e31b8a bellard
                break;
1115 31e31b8a bellard
            case TARGET_SIG_UNBLOCK:
1116 31e31b8a bellard
                how = SIG_UNBLOCK;
1117 31e31b8a bellard
                break;
1118 31e31b8a bellard
            case TARGET_SIG_SETMASK:
1119 31e31b8a bellard
                how = SIG_SETMASK;
1120 31e31b8a bellard
                break;
1121 31e31b8a bellard
            default:
1122 31e31b8a bellard
                ret = -EINVAL;
1123 31e31b8a bellard
                goto fail;
1124 31e31b8a bellard
            }
1125 31e31b8a bellard
            
1126 31e31b8a bellard
            if (pset) {
1127 31e31b8a bellard
                target_to_host_old_sigset(&set, pset);
1128 31e31b8a bellard
                set_ptr = &set;
1129 31e31b8a bellard
            } else {
1130 31e31b8a bellard
                set_ptr = NULL;
1131 31e31b8a bellard
            }
1132 31e31b8a bellard
            ret = get_errno(sigprocmask(arg1, set_ptr, &oldset));
1133 31e31b8a bellard
            if (!is_error(ret) && poldset) {
1134 31e31b8a bellard
                host_to_target_old_sigset(poldset, &oldset);
1135 31e31b8a bellard
            }
1136 31e31b8a bellard
        }
1137 31e31b8a bellard
        break;
1138 31e31b8a bellard
    case TARGET_NR_create_module:
1139 31e31b8a bellard
    case TARGET_NR_init_module:
1140 31e31b8a bellard
    case TARGET_NR_delete_module:
1141 31e31b8a bellard
    case TARGET_NR_get_kernel_syms:
1142 31e31b8a bellard
        goto unimplemented;
1143 31e31b8a bellard
    case TARGET_NR_quotactl:
1144 31e31b8a bellard
        goto unimplemented;
1145 31e31b8a bellard
    case TARGET_NR_getpgid:
1146 31e31b8a bellard
        ret = get_errno(getpgid(arg1));
1147 31e31b8a bellard
        break;
1148 31e31b8a bellard
    case TARGET_NR_fchdir:
1149 31e31b8a bellard
        ret = get_errno(fchdir(arg1));
1150 31e31b8a bellard
        break;
1151 31e31b8a bellard
    case TARGET_NR_bdflush:
1152 31e31b8a bellard
        goto unimplemented;
1153 31e31b8a bellard
    case TARGET_NR_sysfs:
1154 31e31b8a bellard
        goto unimplemented;
1155 31e31b8a bellard
    case TARGET_NR_personality:
1156 31e31b8a bellard
        ret = get_errno(mprotect((void *)arg1, arg2, arg3));
1157 31e31b8a bellard
        break;
1158 31e31b8a bellard
    case TARGET_NR_afs_syscall:
1159 31e31b8a bellard
        goto unimplemented;
1160 31e31b8a bellard
    case TARGET_NR_setfsuid:
1161 31e31b8a bellard
        goto unimplemented;
1162 31e31b8a bellard
    case TARGET_NR_setfsgid:
1163 31e31b8a bellard
        goto unimplemented;
1164 31e31b8a bellard
    case TARGET_NR__llseek:
1165 31e31b8a bellard
        {
1166 31e31b8a bellard
            int64_t res;
1167 31e31b8a bellard
            ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
1168 31e31b8a bellard
            *(int64_t *)arg4 = tswap64(res);
1169 31e31b8a bellard
        }
1170 31e31b8a bellard
        break;
1171 31e31b8a bellard
    case TARGET_NR_getdents:
1172 31e31b8a bellard
#if TARGET_LONG_SIZE != 4
1173 31e31b8a bellard
#error not supported
1174 31e31b8a bellard
#endif
1175 31e31b8a bellard
        {
1176 31e31b8a bellard
            struct dirent *dirp = (void *)arg2;
1177 31e31b8a bellard
            long count = arg3;
1178 72f03900 bellard
            ret = get_errno(sys_getdents(arg1, dirp, count));
1179 31e31b8a bellard
            if (!is_error(ret)) {
1180 31e31b8a bellard
                struct dirent *de;
1181 31e31b8a bellard
                int len = ret;
1182 31e31b8a bellard
                int reclen;
1183 31e31b8a bellard
                de = dirp;
1184 31e31b8a bellard
                while (len > 0) {
1185 31e31b8a bellard
                    reclen = tswap16(de->d_reclen);
1186 31e31b8a bellard
                    if (reclen > len)
1187 31e31b8a bellard
                        break;
1188 31e31b8a bellard
                    de->d_reclen = reclen;
1189 31e31b8a bellard
                    tswapls(&de->d_ino);
1190 31e31b8a bellard
                    tswapls(&de->d_off);
1191 31e31b8a bellard
                    de = (struct dirent *)((char *)de + reclen);
1192 31e31b8a bellard
                    len -= reclen;
1193 31e31b8a bellard
                }
1194 31e31b8a bellard
            }
1195 31e31b8a bellard
        }
1196 31e31b8a bellard
        break;
1197 31e31b8a bellard
    case TARGET_NR__newselect:
1198 31e31b8a bellard
        ret = do_select(arg1, (void *)arg2, (void *)arg3, (void *)arg4, 
1199 31e31b8a bellard
                        (void *)arg5);
1200 31e31b8a bellard
        break;
1201 31e31b8a bellard
    case TARGET_NR_flock:
1202 31e31b8a bellard
        goto unimplemented;
1203 31e31b8a bellard
    case TARGET_NR_msync:
1204 31e31b8a bellard
        ret = get_errno(msync((void *)arg1, arg2, arg3));
1205 31e31b8a bellard
        break;
1206 31e31b8a bellard
    case TARGET_NR_readv:
1207 31e31b8a bellard
        {
1208 31e31b8a bellard
            int count = arg3;
1209 31e31b8a bellard
            int i;
1210 31e31b8a bellard
            struct iovec *vec;
1211 31e31b8a bellard
            struct target_iovec *target_vec = (void *)arg2;
1212 31e31b8a bellard
1213 31e31b8a bellard
            vec = alloca(count * sizeof(struct iovec));
1214 31e31b8a bellard
            for(i = 0;i < count; i++) {
1215 31e31b8a bellard
                vec[i].iov_base = (void *)tswapl(target_vec[i].iov_base);
1216 31e31b8a bellard
                vec[i].iov_len = tswapl(target_vec[i].iov_len);
1217 31e31b8a bellard
            }
1218 31e31b8a bellard
            ret = get_errno(readv(arg1, vec, count));
1219 31e31b8a bellard
        }
1220 31e31b8a bellard
        break;
1221 31e31b8a bellard
    case TARGET_NR_writev:
1222 31e31b8a bellard
        {
1223 31e31b8a bellard
            int count = arg3;
1224 31e31b8a bellard
            int i;
1225 31e31b8a bellard
            struct iovec *vec;
1226 31e31b8a bellard
            struct target_iovec *target_vec = (void *)arg2;
1227 31e31b8a bellard
1228 31e31b8a bellard
            vec = alloca(count * sizeof(struct iovec));
1229 31e31b8a bellard
            for(i = 0;i < count; i++) {
1230 31e31b8a bellard
                vec[i].iov_base = (void *)tswapl(target_vec[i].iov_base);
1231 31e31b8a bellard
                vec[i].iov_len = tswapl(target_vec[i].iov_len);
1232 31e31b8a bellard
            }
1233 31e31b8a bellard
            ret = get_errno(writev(arg1, vec, count));
1234 31e31b8a bellard
        }
1235 31e31b8a bellard
        break;
1236 31e31b8a bellard
    case TARGET_NR_getsid:
1237 31e31b8a bellard
        ret = get_errno(getsid(arg1));
1238 31e31b8a bellard
        break;
1239 31e31b8a bellard
    case TARGET_NR_fdatasync:
1240 31e31b8a bellard
        goto unimplemented;
1241 31e31b8a bellard
    case TARGET_NR__sysctl:
1242 31e31b8a bellard
        goto unimplemented;
1243 31e31b8a bellard
    case TARGET_NR_mlock:
1244 31e31b8a bellard
        ret = get_errno(mlock((void *)arg1, arg2));
1245 31e31b8a bellard
        break;
1246 31e31b8a bellard
    case TARGET_NR_munlock:
1247 31e31b8a bellard
        ret = get_errno(munlock((void *)arg1, arg2));
1248 31e31b8a bellard
        break;
1249 31e31b8a bellard
    case TARGET_NR_mlockall:
1250 31e31b8a bellard
        ret = get_errno(mlockall(arg1));
1251 31e31b8a bellard
        break;
1252 31e31b8a bellard
    case TARGET_NR_munlockall:
1253 31e31b8a bellard
        ret = get_errno(munlockall());
1254 31e31b8a bellard
        break;
1255 31e31b8a bellard
    case TARGET_NR_sched_setparam:
1256 31e31b8a bellard
        goto unimplemented;
1257 31e31b8a bellard
    case TARGET_NR_sched_getparam:
1258 31e31b8a bellard
        goto unimplemented;
1259 31e31b8a bellard
    case TARGET_NR_sched_setscheduler:
1260 31e31b8a bellard
        goto unimplemented;
1261 31e31b8a bellard
    case TARGET_NR_sched_getscheduler:
1262 31e31b8a bellard
        goto unimplemented;
1263 31e31b8a bellard
    case TARGET_NR_sched_yield:
1264 31e31b8a bellard
        ret = get_errno(sched_yield());
1265 31e31b8a bellard
        break;
1266 31e31b8a bellard
    case TARGET_NR_sched_get_priority_max:
1267 31e31b8a bellard
    case TARGET_NR_sched_get_priority_min:
1268 31e31b8a bellard
    case TARGET_NR_sched_rr_get_interval:
1269 31e31b8a bellard
    case TARGET_NR_nanosleep:
1270 31e31b8a bellard
    case TARGET_NR_mremap:
1271 31e31b8a bellard
    case TARGET_NR_setresuid:
1272 31e31b8a bellard
    case TARGET_NR_getresuid:
1273 31e31b8a bellard
    case TARGET_NR_vm86:
1274 31e31b8a bellard
    case TARGET_NR_query_module:
1275 31e31b8a bellard
    case TARGET_NR_poll:
1276 31e31b8a bellard
    case TARGET_NR_nfsservctl:
1277 31e31b8a bellard
    case TARGET_NR_setresgid:
1278 31e31b8a bellard
    case TARGET_NR_getresgid:
1279 31e31b8a bellard
    case TARGET_NR_prctl:
1280 31e31b8a bellard
    case TARGET_NR_rt_sigreturn:
1281 31e31b8a bellard
    case TARGET_NR_rt_sigaction:
1282 31e31b8a bellard
    case TARGET_NR_rt_sigprocmask:
1283 31e31b8a bellard
    case TARGET_NR_rt_sigpending:
1284 31e31b8a bellard
    case TARGET_NR_rt_sigtimedwait:
1285 31e31b8a bellard
    case TARGET_NR_rt_sigqueueinfo:
1286 31e31b8a bellard
    case TARGET_NR_rt_sigsuspend:
1287 31e31b8a bellard
    case TARGET_NR_pread:
1288 31e31b8a bellard
    case TARGET_NR_pwrite:
1289 31e31b8a bellard
        goto unimplemented;
1290 31e31b8a bellard
    case TARGET_NR_chown:
1291 31e31b8a bellard
        ret = get_errno(chown((const char *)arg1, arg2, arg3));
1292 31e31b8a bellard
        break;
1293 31e31b8a bellard
    case TARGET_NR_getcwd:
1294 72f03900 bellard
        ret = get_errno(sys_getcwd1((char *)arg1, arg2));
1295 31e31b8a bellard
        break;
1296 31e31b8a bellard
    case TARGET_NR_capget:
1297 31e31b8a bellard
    case TARGET_NR_capset:
1298 31e31b8a bellard
    case TARGET_NR_sigaltstack:
1299 31e31b8a bellard
    case TARGET_NR_sendfile:
1300 31e31b8a bellard
    case TARGET_NR_getpmsg:
1301 31e31b8a bellard
    case TARGET_NR_putpmsg:
1302 31e31b8a bellard
    case TARGET_NR_vfork:
1303 31e31b8a bellard
        ret = get_errno(vfork());
1304 31e31b8a bellard
        break;
1305 31e31b8a bellard
    case TARGET_NR_ugetrlimit:
1306 31e31b8a bellard
    case TARGET_NR_truncate64:
1307 31e31b8a bellard
    case TARGET_NR_ftruncate64:
1308 31e31b8a bellard
    case TARGET_NR_stat64:
1309 31e31b8a bellard
    case TARGET_NR_lstat64:
1310 31e31b8a bellard
    case TARGET_NR_fstat64:
1311 31e31b8a bellard
    case TARGET_NR_lchown32:
1312 31e31b8a bellard
    case TARGET_NR_getuid32:
1313 31e31b8a bellard
    case TARGET_NR_getgid32:
1314 31e31b8a bellard
    case TARGET_NR_geteuid32:
1315 31e31b8a bellard
    case TARGET_NR_getegid32:
1316 31e31b8a bellard
    case TARGET_NR_setreuid32:
1317 31e31b8a bellard
    case TARGET_NR_setregid32:
1318 31e31b8a bellard
    case TARGET_NR_getgroups32:
1319 31e31b8a bellard
    case TARGET_NR_setgroups32:
1320 31e31b8a bellard
    case TARGET_NR_fchown32:
1321 31e31b8a bellard
    case TARGET_NR_setresuid32:
1322 31e31b8a bellard
    case TARGET_NR_getresuid32:
1323 31e31b8a bellard
    case TARGET_NR_setresgid32:
1324 31e31b8a bellard
    case TARGET_NR_getresgid32:
1325 31e31b8a bellard
    case TARGET_NR_chown32:
1326 31e31b8a bellard
    case TARGET_NR_setuid32:
1327 31e31b8a bellard
    case TARGET_NR_setgid32:
1328 31e31b8a bellard
    case TARGET_NR_setfsuid32:
1329 31e31b8a bellard
    case TARGET_NR_setfsgid32:
1330 31e31b8a bellard
    case TARGET_NR_pivot_root:
1331 31e31b8a bellard
    case TARGET_NR_mincore:
1332 31e31b8a bellard
    case TARGET_NR_madvise:
1333 31e31b8a bellard
    case TARGET_NR_getdents64:
1334 31e31b8a bellard
    case TARGET_NR_fcntl64:
1335 31e31b8a bellard
    case TARGET_NR_security:
1336 31e31b8a bellard
        goto unimplemented;
1337 31e31b8a bellard
    case TARGET_NR_gettid:
1338 31e31b8a bellard
        ret = get_errno(gettid());
1339 31e31b8a bellard
        break;
1340 31e31b8a bellard
    case TARGET_NR_readahead:
1341 31e31b8a bellard
    case TARGET_NR_setxattr:
1342 31e31b8a bellard
    case TARGET_NR_lsetxattr:
1343 31e31b8a bellard
    case TARGET_NR_fsetxattr:
1344 31e31b8a bellard
    case TARGET_NR_getxattr:
1345 31e31b8a bellard
    case TARGET_NR_lgetxattr:
1346 31e31b8a bellard
    case TARGET_NR_fgetxattr:
1347 31e31b8a bellard
    case TARGET_NR_listxattr:
1348 31e31b8a bellard
    case TARGET_NR_llistxattr:
1349 31e31b8a bellard
    case TARGET_NR_flistxattr:
1350 31e31b8a bellard
    case TARGET_NR_removexattr:
1351 31e31b8a bellard
    case TARGET_NR_lremovexattr:
1352 31e31b8a bellard
    case TARGET_NR_fremovexattr:
1353 31e31b8a bellard
        goto unimplemented;
1354 31e31b8a bellard
    default:
1355 31e31b8a bellard
    unimplemented:
1356 31e31b8a bellard
        gemu_log("Unsupported syscall: %d\n", num);
1357 31e31b8a bellard
        ret = -ENOSYS;
1358 31e31b8a bellard
        break;
1359 31e31b8a bellard
    }
1360 31e31b8a bellard
 fail:
1361 31e31b8a bellard
    return ret;
1362 31e31b8a bellard
}