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 --- |