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,6 +53,8 @@
53 #include <mach/ndr.h> 53 #include <mach/ndr.h>
54 #include <mach/mig_errors.h> 54 #include <mach/mig_errors.h>
55 55
  56 +#include <sys/xattr.h>
  57 +
56 #include "qemu.h" 58 #include "qemu.h"
57 59
58 //#define DEBUG_SYSCALL 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,21 +453,49 @@ long do_mach_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint3
451 case -31: 453 case -31:
452 DPRINTF("mach_msg_trap(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", 454 DPRINTF("mach_msg_trap(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",
453 arg1, arg2, arg3, arg4, arg5, arg6, arg7); 455 arg1, arg2, arg3, arg4, arg5, arg6, arg7);
454 -  
455 ret = target_mach_msg_trap((mach_msg_header_t *)arg1, arg2, arg3, arg4, arg5, arg6, arg7); 456 ret = target_mach_msg_trap((mach_msg_header_t *)arg1, arg2, arg3, arg4, arg5, arg6, arg7);
456 -  
457 break; 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 case -36: 473 case -36:
459 DPRINTF("semaphore_wait_trap(0x%x)\n", arg1); 474 DPRINTF("semaphore_wait_trap(0x%x)\n", arg1);
460 extern int semaphore_wait_trap(int); // XXX: is there any header for that? 475 extern int semaphore_wait_trap(int); // XXX: is there any header for that?
461 ret = semaphore_wait_trap(arg1); 476 ret = semaphore_wait_trap(arg1);
462 break; 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 case -43: 485 case -43:
464 DPRINTF("map_fd(0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", 486 DPRINTF("map_fd(0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",
465 arg1, arg2, arg3, arg4, arg5); 487 arg1, arg2, arg3, arg4, arg5);
466 ret = map_fd(arg1, arg2, (void*)arg3, arg4, arg5); 488 ret = map_fd(arg1, arg2, (void*)arg3, arg4, arg5);
467 tswap32s((uint32_t*)arg3); 489 tswap32s((uint32_t*)arg3);
468 break; 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 case -89: 499 case -89:
470 DPRINTF("mach_timebase_info(0x%x)\n", arg1); 500 DPRINTF("mach_timebase_info(0x%x)\n", arg1);
471 struct mach_timebase_info info; 501 struct mach_timebase_info info;
darwin-user/syscalls.h
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 ENTRY("getppid", SYS_getppid, getppid, 0, CALL_DIRECT, VOID) /* 39 */ 42 ENTRY("getppid", SYS_getppid, getppid, 0, CALL_DIRECT, VOID) /* 39 */
43 ENTRY("", 40, no_syscall, 0, CALL_INDIRECT, VOID) /* 40 old lstat */ 43 ENTRY("", 40, no_syscall, 0, CALL_INDIRECT, VOID) /* 40 old lstat */
44 ENTRY("dup", SYS_dup, dup, 1, CALL_DIRECT, INT) /* 41 */ 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 ENTRY("getegid", SYS_getegid, getegid, 0, CALL_NOERRNO, VOID) /* 43 */ 46 ENTRY("getegid", SYS_getegid, getegid, 0, CALL_NOERRNO, VOID) /* 43 */
47 ENTRY("profil", SYS_profil, profil, 4, CALL_DIRECT, PTR, SIZE, INT, INT) /* 44 */ 47 ENTRY("profil", SYS_profil, profil, 4, CALL_DIRECT, PTR, SIZE, INT, INT) /* 44 */
48 ENTRY("ktrace", SYS_ktrace, no_syscall, 4, CALL_INDIRECT, VOID) /* 45 */ 48 ENTRY("ktrace", SYS_ktrace, no_syscall, 4, CALL_INDIRECT, VOID) /* 45 */
@@ -247,7 +247,7 @@ @@ -247,7 +247,7 @@
247 ENTRY("fsetxattr", SYS_fsetxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 237 */ 247 ENTRY("fsetxattr", SYS_fsetxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 237 */
248 ENTRY("removexattr", SYS_removexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 238 */ 248 ENTRY("removexattr", SYS_removexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 238 */
249 ENTRY("fremovexattr", SYS_fremovexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 239 */ 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 ENTRY("flistxattr", SYS_flistxattr, no_syscall, 4, CALL_INDIRECT, VOID) /* 241 */ 251 ENTRY("flistxattr", SYS_flistxattr, no_syscall, 4, CALL_INDIRECT, VOID) /* 241 */
252 ENTRY("fsctl", SYS_fsctl, fsctl, 4, CALL_DIRECT, PTR, UINT, PTR, UINT) /* 242 */ 252 ENTRY("fsctl", SYS_fsctl, fsctl, 4, CALL_DIRECT, PTR, UINT, PTR, UINT) /* 242 */
253 ENTRY("initgroups", SYS_initgroups, unimpl_unix_syscall, 3, CALL_INDIRECT, UINT, PTR, INT) /* 243 */ 253 ENTRY("initgroups", SYS_initgroups, unimpl_unix_syscall, 3, CALL_INDIRECT, UINT, PTR, INT) /* 243 */