Commit ee999a8899ba8c6326cda4e2e70bb52b284cf7bb

Authored by ths
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
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 */
... ...