syscall.c (e5febef5f1811dfd59aa197aad83e96db26a9516) syscall.c (7a3148a955e3350720a01f57163ab230b72aca7e)
1/*
2 * Linux syscalls
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 1751 unchanged lines hidden (view full) ---

1760 for (i = 7; i < 32; i++)
1761 new_env->gpr[i] = 0;
1762 }
1763#elif defined(TARGET_SH4)
1764 if (!newsp)
1765 newsp = env->gregs[15];
1766 new_env->gregs[15] = newsp;
1767 /* XXXXX */
1/*
2 * Linux syscalls
3 *
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 1751 unchanged lines hidden (view full) ---

1760 for (i = 7; i < 32; i++)
1761 new_env->gpr[i] = 0;
1762 }
1763#elif defined(TARGET_SH4)
1764 if (!newsp)
1765 newsp = env->gregs[15];
1766 new_env->gregs[15] = newsp;
1767 /* XXXXX */
1768#elif defined(TARGET_ALPHA)
1769 if (!newsp)
1770 newsp = env->ir[30];
1771 new_env->ir[30] = newsp;
1772 /* ? */
1773 {
1774 int i;
1775 for (i = 7; i < 30; i++)
1776 new_env->ir[i] = 0;
1777 }
1768#else
1769#error unsupported target CPU
1770#endif
1771 new_env->opaque = ts;
1772#ifdef __ia64__
1773 ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
1774#else
1775 ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);

--- 286 unchanged lines hidden (view full) ---

2062 {
2063 int status;
2064 ret = get_errno(waitpid(arg1, &status, arg3));
2065 if (!is_error(ret) && arg2)
2066 tput32(arg2, status);
2067 }
2068 break;
2069#endif
1778#else
1779#error unsupported target CPU
1780#endif
1781 new_env->opaque = ts;
1782#ifdef __ia64__
1783 ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
1784#else
1785 ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);

--- 286 unchanged lines hidden (view full) ---

2072 {
2073 int status;
2074 ret = get_errno(waitpid(arg1, &status, arg3));
2075 if (!is_error(ret) && arg2)
2076 tput32(arg2, status);
2077 }
2078 break;
2079#endif
2080#ifdef TARGET_NR_creat /* not on alpha */
2070 case TARGET_NR_creat:
2071 p = lock_user_string(arg1);
2072 ret = get_errno(creat(p, arg2));
2073 unlock_user(p, arg1, 0);
2074 break;
2081 case TARGET_NR_creat:
2082 p = lock_user_string(arg1);
2083 ret = get_errno(creat(p, arg2));
2084 unlock_user(p, arg1, 0);
2085 break;
2086#endif
2075 case TARGET_NR_link:
2076 {
2077 void * p2;
2078 p = lock_user_string(arg1);
2079 p2 = lock_user_string(arg2);
2080 ret = get_errno(link(p, p2));
2081 unlock_user(p2, arg2, 0);
2082 unlock_user(p, arg1, 0);

--- 91 unchanged lines hidden (view full) ---

2174#endif
2175#ifdef TARGET_NR_oldstat
2176 case TARGET_NR_oldstat:
2177 goto unimplemented;
2178#endif
2179 case TARGET_NR_lseek:
2180 ret = get_errno(lseek(arg1, arg2, arg3));
2181 break;
2087 case TARGET_NR_link:
2088 {
2089 void * p2;
2090 p = lock_user_string(arg1);
2091 p2 = lock_user_string(arg2);
2092 ret = get_errno(link(p, p2));
2093 unlock_user(p2, arg2, 0);
2094 unlock_user(p, arg1, 0);

--- 91 unchanged lines hidden (view full) ---

2186#endif
2187#ifdef TARGET_NR_oldstat
2188 case TARGET_NR_oldstat:
2189 goto unimplemented;
2190#endif
2191 case TARGET_NR_lseek:
2192 ret = get_errno(lseek(arg1, arg2, arg3));
2193 break;
2194#ifdef TARGET_NR_getxpid
2195 case TARGET_NR_getxpid:
2196#else
2182 case TARGET_NR_getpid:
2197 case TARGET_NR_getpid:
2198#endif
2183 ret = get_errno(getpid());
2184 break;
2185 case TARGET_NR_mount:
2186 {
2187 /* need to look at the data field */
2188 void *p2, *p3;
2189 p = lock_user_string(arg1);
2190 p2 = lock_user_string(arg2);

--- 6 unchanged lines hidden (view full) ---

2197 }
2198#ifdef TARGET_NR_umount
2199 case TARGET_NR_umount:
2200 p = lock_user_string(arg1);
2201 ret = get_errno(umount(p));
2202 unlock_user(p, arg1, 0);
2203 break;
2204#endif
2199 ret = get_errno(getpid());
2200 break;
2201 case TARGET_NR_mount:
2202 {
2203 /* need to look at the data field */
2204 void *p2, *p3;
2205 p = lock_user_string(arg1);
2206 p2 = lock_user_string(arg2);

--- 6 unchanged lines hidden (view full) ---

2213 }
2214#ifdef TARGET_NR_umount
2215 case TARGET_NR_umount:
2216 p = lock_user_string(arg1);
2217 ret = get_errno(umount(p));
2218 unlock_user(p, arg1, 0);
2219 break;
2220#endif
2221#ifdef TARGET_NR_stime /* not on alpha */
2205 case TARGET_NR_stime:
2206 {
2207 time_t host_time;
2208 host_time = tgetl(arg1);
2209 ret = get_errno(stime(&host_time));
2210 }
2211 break;
2222 case TARGET_NR_stime:
2223 {
2224 time_t host_time;
2225 host_time = tgetl(arg1);
2226 ret = get_errno(stime(&host_time));
2227 }
2228 break;
2229#endif
2212 case TARGET_NR_ptrace:
2213 goto unimplemented;
2230 case TARGET_NR_ptrace:
2231 goto unimplemented;
2232#ifdef TARGET_NR_alarm /* not on alpha */
2214 case TARGET_NR_alarm:
2215 ret = alarm(arg1);
2216 break;
2233 case TARGET_NR_alarm:
2234 ret = alarm(arg1);
2235 break;
2236#endif
2217#ifdef TARGET_NR_oldfstat
2218 case TARGET_NR_oldfstat:
2219 goto unimplemented;
2220#endif
2237#ifdef TARGET_NR_oldfstat
2238 case TARGET_NR_oldfstat:
2239 goto unimplemented;
2240#endif
2241#ifdef TARGET_NR_pause /* not on alpha */
2221 case TARGET_NR_pause:
2222 ret = get_errno(pause());
2223 break;
2242 case TARGET_NR_pause:
2243 ret = get_errno(pause());
2244 break;
2245#endif
2224#ifdef TARGET_NR_utime
2225 case TARGET_NR_utime:
2226 {
2227 struct utimbuf tbuf, *host_tbuf;
2228 struct target_utimbuf *target_tbuf;
2229 if (arg2) {
2230 lock_user_struct(target_tbuf, arg2, 1);
2231 tbuf.actime = tswapl(target_tbuf->actime);

--- 33 unchanged lines hidden (view full) ---

2265 case TARGET_NR_gtty:
2266 goto unimplemented;
2267#endif
2268 case TARGET_NR_access:
2269 p = lock_user_string(arg1);
2270 ret = get_errno(access(p, arg2));
2271 unlock_user(p, arg1, 0);
2272 break;
2246#ifdef TARGET_NR_utime
2247 case TARGET_NR_utime:
2248 {
2249 struct utimbuf tbuf, *host_tbuf;
2250 struct target_utimbuf *target_tbuf;
2251 if (arg2) {
2252 lock_user_struct(target_tbuf, arg2, 1);
2253 tbuf.actime = tswapl(target_tbuf->actime);

--- 33 unchanged lines hidden (view full) ---

2287 case TARGET_NR_gtty:
2288 goto unimplemented;
2289#endif
2290 case TARGET_NR_access:
2291 p = lock_user_string(arg1);
2292 ret = get_errno(access(p, arg2));
2293 unlock_user(p, arg1, 0);
2294 break;
2295#ifdef TARGET_NR_nice /* not on alpha */
2273 case TARGET_NR_nice:
2274 ret = get_errno(nice(arg1));
2275 break;
2296 case TARGET_NR_nice:
2297 ret = get_errno(nice(arg1));
2298 break;
2299#endif
2276#ifdef TARGET_NR_ftime
2277 case TARGET_NR_ftime:
2278 goto unimplemented;
2279#endif
2280 case TARGET_NR_sync:
2281 sync();
2282 ret = 0;
2283 break;

--- 57 unchanged lines hidden (view full) ---

2341 case TARGET_NR_signal:
2342 goto unimplemented;
2343#endif
2344 case TARGET_NR_acct:
2345 p = lock_user_string(arg1);
2346 ret = get_errno(acct(path(p)));
2347 unlock_user(p, arg1, 0);
2348 break;
2300#ifdef TARGET_NR_ftime
2301 case TARGET_NR_ftime:
2302 goto unimplemented;
2303#endif
2304 case TARGET_NR_sync:
2305 sync();
2306 ret = 0;
2307 break;

--- 57 unchanged lines hidden (view full) ---

2365 case TARGET_NR_signal:
2366 goto unimplemented;
2367#endif
2368 case TARGET_NR_acct:
2369 p = lock_user_string(arg1);
2370 ret = get_errno(acct(path(p)));
2371 unlock_user(p, arg1, 0);
2372 break;
2373#ifdef TARGET_NR_umount2 /* not on alpha */
2349 case TARGET_NR_umount2:
2350 p = lock_user_string(arg1);
2351 ret = get_errno(umount2(p, arg2));
2352 unlock_user(p, arg1, 0);
2353 break;
2374 case TARGET_NR_umount2:
2375 p = lock_user_string(arg1);
2376 ret = get_errno(umount2(p, arg2));
2377 unlock_user(p, arg1, 0);
2378 break;
2379#endif
2354#ifdef TARGET_NR_lock
2355 case TARGET_NR_lock:
2356 goto unimplemented;
2357#endif
2358 case TARGET_NR_ioctl:
2359 ret = do_ioctl(arg1, arg2, arg3);
2360 break;
2361 case TARGET_NR_fcntl:

--- 22 unchanged lines hidden (view full) ---

2384 ret = get_errno(chroot(p));
2385 unlock_user(p, arg1, 0);
2386 break;
2387 case TARGET_NR_ustat:
2388 goto unimplemented;
2389 case TARGET_NR_dup2:
2390 ret = get_errno(dup2(arg1, arg2));
2391 break;
2380#ifdef TARGET_NR_lock
2381 case TARGET_NR_lock:
2382 goto unimplemented;
2383#endif
2384 case TARGET_NR_ioctl:
2385 ret = do_ioctl(arg1, arg2, arg3);
2386 break;
2387 case TARGET_NR_fcntl:

--- 22 unchanged lines hidden (view full) ---

2410 ret = get_errno(chroot(p));
2411 unlock_user(p, arg1, 0);
2412 break;
2413 case TARGET_NR_ustat:
2414 goto unimplemented;
2415 case TARGET_NR_dup2:
2416 ret = get_errno(dup2(arg1, arg2));
2417 break;
2418#ifdef TARGET_NR_getppid /* not on alpha */
2392 case TARGET_NR_getppid:
2393 ret = get_errno(getppid());
2394 break;
2419 case TARGET_NR_getppid:
2420 ret = get_errno(getppid());
2421 break;
2422#endif
2395 case TARGET_NR_getpgrp:
2396 ret = get_errno(getpgrp());
2397 break;
2398 case TARGET_NR_setsid:
2399 ret = get_errno(setsid());
2400 break;
2401#ifdef TARGET_NR_sigaction
2402 case TARGET_NR_sigaction:

--- 66 unchanged lines hidden (view full) ---

2469 oact = NULL;
2470 ret = get_errno(do_sigaction(arg1, act, oact));
2471 if (arg2)
2472 unlock_user_struct(act, arg2, 0);
2473 if (arg3)
2474 unlock_user_struct(oact, arg3, 1);
2475 }
2476 break;
2423 case TARGET_NR_getpgrp:
2424 ret = get_errno(getpgrp());
2425 break;
2426 case TARGET_NR_setsid:
2427 ret = get_errno(setsid());
2428 break;
2429#ifdef TARGET_NR_sigaction
2430 case TARGET_NR_sigaction:

--- 66 unchanged lines hidden (view full) ---

2497 oact = NULL;
2498 ret = get_errno(do_sigaction(arg1, act, oact));
2499 if (arg2)
2500 unlock_user_struct(act, arg2, 0);
2501 if (arg3)
2502 unlock_user_struct(oact, arg3, 1);
2503 }
2504 break;
2505#ifdef TARGET_NR_sgetmask /* not on alpha */
2477 case TARGET_NR_sgetmask:
2478 {
2479 sigset_t cur_set;
2480 target_ulong target_set;
2481 sigprocmask(0, NULL, &cur_set);
2482 host_to_target_old_sigset(&target_set, &cur_set);
2483 ret = target_set;
2484 }
2485 break;
2506 case TARGET_NR_sgetmask:
2507 {
2508 sigset_t cur_set;
2509 target_ulong target_set;
2510 sigprocmask(0, NULL, &cur_set);
2511 host_to_target_old_sigset(&target_set, &cur_set);
2512 ret = target_set;
2513 }
2514 break;
2515#endif
2516#ifdef TARGET_NR_ssetmask /* not on alpha */
2486 case TARGET_NR_ssetmask:
2487 {
2488 sigset_t set, oset, cur_set;
2489 target_ulong target_set = arg1;
2490 sigprocmask(0, NULL, &cur_set);
2491 target_to_host_old_sigset(&set, &target_set);
2492 sigorset(&set, &set, &cur_set);
2493 sigprocmask(SIG_SETMASK, &set, &oset);
2494 host_to_target_old_sigset(&target_set, &oset);
2495 ret = target_set;
2496 }
2497 break;
2517 case TARGET_NR_ssetmask:
2518 {
2519 sigset_t set, oset, cur_set;
2520 target_ulong target_set = arg1;
2521 sigprocmask(0, NULL, &cur_set);
2522 target_to_host_old_sigset(&set, &target_set);
2523 sigorset(&set, &set, &cur_set);
2524 sigprocmask(SIG_SETMASK, &set, &oset);
2525 host_to_target_old_sigset(&target_set, &oset);
2526 ret = target_set;
2527 }
2528 break;
2529#endif
2498#ifdef TARGET_NR_sigprocmask
2499 case TARGET_NR_sigprocmask:
2500 {
2501 int how = arg1;
2502 sigset_t set, oldset, *set_ptr;
2503
2504 if (arg2) {
2505 switch(how) {

--- 745 unchanged lines hidden (view full) ---

3251#endif
3252 case TARGET_NR_personality:
3253 ret = get_errno(personality(arg1));
3254 break;
3255#ifdef TARGET_NR_afs_syscall
3256 case TARGET_NR_afs_syscall:
3257 goto unimplemented;
3258#endif
2530#ifdef TARGET_NR_sigprocmask
2531 case TARGET_NR_sigprocmask:
2532 {
2533 int how = arg1;
2534 sigset_t set, oldset, *set_ptr;
2535
2536 if (arg2) {
2537 switch(how) {

--- 745 unchanged lines hidden (view full) ---

3283#endif
3284 case TARGET_NR_personality:
3285 ret = get_errno(personality(arg1));
3286 break;
3287#ifdef TARGET_NR_afs_syscall
3288 case TARGET_NR_afs_syscall:
3289 goto unimplemented;
3290#endif
3291#ifdef TARGET_NR__llseek /* Not on alpha */
3259 case TARGET_NR__llseek:
3260 {
3261#if defined (__x86_64__)
3262 ret = get_errno(lseek(arg1, ((uint64_t )arg2 << 32) | arg3, arg5));
3263 tput64(arg4, ret);
3264#else
3265 int64_t res;
3266 ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
3267 tput64(arg4, res);
3268#endif
3269 }
3270 break;
3292 case TARGET_NR__llseek:
3293 {
3294#if defined (__x86_64__)
3295 ret = get_errno(lseek(arg1, ((uint64_t )arg2 << 32) | arg3, arg5));
3296 tput64(arg4, ret);
3297#else
3298 int64_t res;
3299 ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
3300 tput64(arg4, res);
3301#endif
3302 }
3303 break;
3304#endif
3271 case TARGET_NR_getdents:
3272#if TARGET_LONG_SIZE != 4
3273 goto unimplemented;
3274#warning not supported
3275#elif TARGET_LONG_SIZE == 4 && HOST_LONG_SIZE == 8
3276 {
3277 struct target_dirent *target_dirp;
3278 struct dirent *dirp;

--- 147 unchanged lines hidden (view full) ---

3426 lock_iovec(vec, arg2, count, 1);
3427 ret = get_errno(writev(arg1, vec, count));
3428 unlock_iovec(vec, arg2, count, 0);
3429 }
3430 break;
3431 case TARGET_NR_getsid:
3432 ret = get_errno(getsid(arg1));
3433 break;
3305 case TARGET_NR_getdents:
3306#if TARGET_LONG_SIZE != 4
3307 goto unimplemented;
3308#warning not supported
3309#elif TARGET_LONG_SIZE == 4 && HOST_LONG_SIZE == 8
3310 {
3311 struct target_dirent *target_dirp;
3312 struct dirent *dirp;

--- 147 unchanged lines hidden (view full) ---

3460 lock_iovec(vec, arg2, count, 1);
3461 ret = get_errno(writev(arg1, vec, count));
3462 unlock_iovec(vec, arg2, count, 0);
3463 }
3464 break;
3465 case TARGET_NR_getsid:
3466 ret = get_errno(getsid(arg1));
3467 break;
3468#if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
3434 case TARGET_NR_fdatasync:
3435 ret = get_errno(fdatasync(arg1));
3436 break;
3469 case TARGET_NR_fdatasync:
3470 ret = get_errno(fdatasync(arg1));
3471 break;
3472#endif
3437 case TARGET_NR__sysctl:
3438 /* We don't implement this, but ENODIR is always a safe
3439 return value. */
3440 return -ENOTDIR;
3441 case TARGET_NR_sched_setparam:
3442 {
3443 struct sched_param *target_schp;
3444 struct sched_param schp;

--- 703 unchanged lines hidden ---
3473 case TARGET_NR__sysctl:
3474 /* We don't implement this, but ENODIR is always a safe
3475 return value. */
3476 return -ENOTDIR;
3477 case TARGET_NR_sched_setparam:
3478 {
3479 struct sched_param *target_schp;
3480 struct sched_param schp;

--- 703 unchanged lines hidden ---