Commit ee999a8899ba8c6326cda4e2e70bb52b284cf7bb
1 parent
b5906f95
Handling more darwin-user syscalls, by Ilya Shar.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2502 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
34 additions
and
4 deletions
darwin-user/syscall.c
... | ... | @@ -53,6 +53,8 @@ |
53 | 53 | #include <mach/ndr.h> |
54 | 54 | #include <mach/mig_errors.h> |
55 | 55 | |
56 | +#include <sys/xattr.h> | |
57 | + | |
56 | 58 | #include "qemu.h" |
57 | 59 | |
58 | 60 | //#define DEBUG_SYSCALL |
... | ... | @@ -451,21 +453,49 @@ long do_mach_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint3 |
451 | 453 | case -31: |
452 | 454 | DPRINTF("mach_msg_trap(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", |
453 | 455 | arg1, arg2, arg3, arg4, arg5, arg6, arg7); |
454 | - | |
455 | 456 | ret = target_mach_msg_trap((mach_msg_header_t *)arg1, arg2, arg3, arg4, arg5, arg6, arg7); |
456 | - | |
457 | 457 | break; |
458 | +/* may need more translation if target arch is different from host */ | |
459 | +#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__)) | |
460 | + case -33: | |
461 | + DPRINTF("semaphore_signal_trap(0x%x)\n", arg1); | |
462 | + ret = semaphore_signal_trap(arg1); | |
463 | + break; | |
464 | + case -34: | |
465 | + DPRINTF("semaphore_signal_all_trap(0x%x)\n", arg1); | |
466 | + ret = semaphore_signal_all_trap(arg1); | |
467 | + break; | |
468 | + case -35: | |
469 | + DPRINTF("semaphore_signal_thread_trap(0x%x)\n", arg1, arg2); | |
470 | + ret = semaphore_signal_thread_trap(arg1,arg2); | |
471 | + break; | |
472 | +#endif | |
458 | 473 | case -36: |
459 | 474 | DPRINTF("semaphore_wait_trap(0x%x)\n", arg1); |
460 | 475 | extern int semaphore_wait_trap(int); // XXX: is there any header for that? |
461 | 476 | ret = semaphore_wait_trap(arg1); |
462 | 477 | break; |
478 | +/* may need more translation if target arch is different from host */ | |
479 | +#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__)) | |
480 | + case -37: | |
481 | + DPRINTF("semaphore_wait_signal_trap(0x%x, 0x%x)\n", arg1, arg2); | |
482 | + ret = semaphore_wait_signal_trap(arg1,arg2); | |
483 | + break; | |
484 | +#endif | |
463 | 485 | case -43: |
464 | 486 | DPRINTF("map_fd(0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", |
465 | 487 | arg1, arg2, arg3, arg4, arg5); |
466 | 488 | ret = map_fd(arg1, arg2, (void*)arg3, arg4, arg5); |
467 | 489 | tswap32s((uint32_t*)arg3); |
468 | 490 | break; |
491 | +/* may need more translation if target arch is different from host */ | |
492 | +#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__)) | |
493 | + case -61: | |
494 | + DPRINTF("syscall_thread_switch(0x%x, 0x%x, 0x%x)\n", | |
495 | + arg1, arg2, arg3); | |
496 | + ret = syscall_thread_switch(arg1, arg2, arg3); // just a hint to the scheduler; can drop? | |
497 | + break; | |
498 | +#endif | |
469 | 499 | case -89: |
470 | 500 | DPRINTF("mach_timebase_info(0x%x)\n", arg1); |
471 | 501 | struct mach_timebase_info info; | ... | ... |
darwin-user/syscalls.h
... | ... | @@ -42,7 +42,7 @@ |
42 | 42 | ENTRY("getppid", SYS_getppid, getppid, 0, CALL_DIRECT, VOID) /* 39 */ |
43 | 43 | ENTRY("", 40, no_syscall, 0, CALL_INDIRECT, VOID) /* 40 old lstat */ |
44 | 44 | ENTRY("dup", SYS_dup, dup, 1, CALL_DIRECT, INT) /* 41 */ |
45 | - ENTRY("pipe", SYS_pipe, unimpl_unix_syscall, 0, CALL_INDIRECT, PTR) /* 42 */ | |
45 | + ENTRY("pipe", SYS_pipe, pipe, 0, CALL_INDIRECT, PTR) /* 42 */ | |
46 | 46 | ENTRY("getegid", SYS_getegid, getegid, 0, CALL_NOERRNO, VOID) /* 43 */ |
47 | 47 | ENTRY("profil", SYS_profil, profil, 4, CALL_DIRECT, PTR, SIZE, INT, INT) /* 44 */ |
48 | 48 | ENTRY("ktrace", SYS_ktrace, no_syscall, 4, CALL_INDIRECT, VOID) /* 45 */ |
... | ... | @@ -247,7 +247,7 @@ |
247 | 247 | ENTRY("fsetxattr", SYS_fsetxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 237 */ |
248 | 248 | ENTRY("removexattr", SYS_removexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 238 */ |
249 | 249 | ENTRY("fremovexattr", SYS_fremovexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 239 */ |
250 | - ENTRY("listxattr", SYS_listxattr, no_syscall, 4, CALL_INDIRECT, VOID) /* 240 */ | |
250 | + ENTRY("listxattr", SYS_listxattr, listxattr, 4, CALL_INDIRECT, VOID) /* 240 */ | |
251 | 251 | ENTRY("flistxattr", SYS_flistxattr, no_syscall, 4, CALL_INDIRECT, VOID) /* 241 */ |
252 | 252 | ENTRY("fsctl", SYS_fsctl, fsctl, 4, CALL_DIRECT, PTR, UINT, PTR, UINT) /* 242 */ |
253 | 253 | ENTRY("initgroups", SYS_initgroups, unimpl_unix_syscall, 3, CALL_INDIRECT, UINT, PTR, INT) /* 243 */ | ... | ... |