Commit ffa65c3b700c5f94d5b22a685ff992fb1353b1c1
1 parent
2d603d22
fcntl flags convertion (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@538 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
86 additions
and
1 deletions
linux-user/syscall.c
| @@ -1130,6 +1130,24 @@ static bitmask_transtbl mmap_flags_tbl[] = { | @@ -1130,6 +1130,24 @@ static bitmask_transtbl mmap_flags_tbl[] = { | ||
| 1130 | { 0, 0, 0, 0 } | 1130 | { 0, 0, 0, 0 } |
| 1131 | }; | 1131 | }; |
| 1132 | 1132 | ||
| 1133 | +static bitmask_transtbl fcntl_flags_tbl[] = { | ||
| 1134 | + { TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, }, | ||
| 1135 | + { TARGET_O_ACCMODE, TARGET_O_RDWR, O_ACCMODE, O_RDWR, }, | ||
| 1136 | + { TARGET_O_CREAT, TARGET_O_CREAT, O_CREAT, O_CREAT, }, | ||
| 1137 | + { TARGET_O_EXCL, TARGET_O_EXCL, O_EXCL, O_EXCL, }, | ||
| 1138 | + { TARGET_O_NOCTTY, TARGET_O_NOCTTY, O_NOCTTY, O_NOCTTY, }, | ||
| 1139 | + { TARGET_O_TRUNC, TARGET_O_TRUNC, O_TRUNC, O_TRUNC, }, | ||
| 1140 | + { TARGET_O_APPEND, TARGET_O_APPEND, O_APPEND, O_APPEND, }, | ||
| 1141 | + { TARGET_O_NONBLOCK, TARGET_O_NONBLOCK, O_NONBLOCK, O_NONBLOCK, }, | ||
| 1142 | + { TARGET_O_SYNC, TARGET_O_SYNC, O_SYNC, O_SYNC, }, | ||
| 1143 | + { TARGET_FASYNC, TARGET_FASYNC, FASYNC, FASYNC, }, | ||
| 1144 | + { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, }, | ||
| 1145 | + { TARGET_O_NOFOLLOW, TARGET_O_NOFOLLOW, O_NOFOLLOW, O_NOFOLLOW, }, | ||
| 1146 | + { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, }, | ||
| 1147 | + { TARGET_O_DIRECT, TARGET_O_DIRECT, O_DIRECT, O_DIRECT, }, | ||
| 1148 | + { 0, 0, 0, 0 } | ||
| 1149 | +}; | ||
| 1150 | + | ||
| 1133 | #if defined(TARGET_I386) | 1151 | #if defined(TARGET_I386) |
| 1134 | 1152 | ||
| 1135 | /* NOTE: there is really one LDT for all the threads */ | 1153 | /* NOTE: there is really one LDT for all the threads */ |
| @@ -1353,6 +1371,15 @@ static long do_fcntl(int fd, int cmd, unsigned long arg) | @@ -1353,6 +1371,15 @@ static long do_fcntl(int fd, int cmd, unsigned long arg) | ||
| 1353 | errno = EINVAL; | 1371 | errno = EINVAL; |
| 1354 | break; | 1372 | break; |
| 1355 | 1373 | ||
| 1374 | + case F_GETFL: | ||
| 1375 | + ret = fcntl(fd, cmd, arg); | ||
| 1376 | + ret = host_to_target_bitmask(ret, fcntl_flags_tbl); | ||
| 1377 | + break; | ||
| 1378 | + | ||
| 1379 | + case F_SETFL: | ||
| 1380 | + ret = fcntl(fd, cmd, target_to_host_bitmask(arg, fcntl_flags_tbl)); | ||
| 1381 | + break; | ||
| 1382 | + | ||
| 1356 | default: | 1383 | default: |
| 1357 | ret = fcntl(fd, cmd, arg); | 1384 | ret = fcntl(fd, cmd, arg); |
| 1358 | break; | 1385 | break; |
| @@ -1464,7 +1491,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1464,7 +1491,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 1464 | ret = get_errno(write(arg1, (void *)arg2, arg3)); | 1491 | ret = get_errno(write(arg1, (void *)arg2, arg3)); |
| 1465 | break; | 1492 | break; |
| 1466 | case TARGET_NR_open: | 1493 | case TARGET_NR_open: |
| 1467 | - ret = get_errno(open(path((const char *)arg1), arg2, arg3)); | 1494 | + ret = get_errno(open(path((const char *)arg1), |
| 1495 | + target_to_host_bitmask(arg2, fcntl_flags_tbl), | ||
| 1496 | + arg3)); | ||
| 1468 | break; | 1497 | break; |
| 1469 | case TARGET_NR_close: | 1498 | case TARGET_NR_close: |
| 1470 | ret = get_errno(close(arg1)); | 1499 | ret = get_errno(close(arg1)); |
| @@ -2750,10 +2779,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -2750,10 +2779,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
| 2750 | 2779 | ||
| 2751 | case TARGET_NR_pivot_root: | 2780 | case TARGET_NR_pivot_root: |
| 2752 | goto unimplemented; | 2781 | goto unimplemented; |
| 2782 | +#ifdef TARGET_NR_mincore | ||
| 2753 | case TARGET_NR_mincore: | 2783 | case TARGET_NR_mincore: |
| 2754 | goto unimplemented; | 2784 | goto unimplemented; |
| 2785 | +#endif | ||
| 2786 | +#ifdef TARGET_NR_madvise | ||
| 2755 | case TARGET_NR_madvise: | 2787 | case TARGET_NR_madvise: |
| 2756 | goto unimplemented; | 2788 | goto unimplemented; |
| 2789 | +#endif | ||
| 2757 | #if TARGET_LONG_BITS == 32 | 2790 | #if TARGET_LONG_BITS == 32 |
| 2758 | case TARGET_NR_fcntl64: | 2791 | case TARGET_NR_fcntl64: |
| 2759 | { | 2792 | { |
linux-user/syscall_defs.h
| @@ -414,7 +414,14 @@ typedef struct target_siginfo { | @@ -414,7 +414,14 @@ typedef struct target_siginfo { | ||
| 414 | /* | 414 | /* |
| 415 | * SIGILL si_codes | 415 | * SIGILL si_codes |
| 416 | */ | 416 | */ |
| 417 | +#define TARGET_ILL_ILLOPC (1) /* illegal opcode */ | ||
| 417 | #define TARGET_ILL_ILLOPN (2) /* illegal operand */ | 418 | #define TARGET_ILL_ILLOPN (2) /* illegal operand */ |
| 419 | +#define TARGET_ILL_ILLADR (3) /* illegal addressing mode */ | ||
| 420 | +#define TARGET_ILL_ILLTRP (4) /* illegal trap */ | ||
| 421 | +#define TARGET_ILL_PRVOPC (5) /* privileged opcode */ | ||
| 422 | +#define TARGET_ILL_PRVREG (6) /* privileged register */ | ||
| 423 | +#define TARGET_ILL_COPROC (7) /* coprocessor error */ | ||
| 424 | +#define TARGET_ILL_BADSTK (8) /* internal stack error */ | ||
| 418 | 425 | ||
| 419 | /* | 426 | /* |
| 420 | * SIGFPE si_codes | 427 | * SIGFPE si_codes |
| @@ -436,6 +443,13 @@ typedef struct target_siginfo { | @@ -436,6 +443,13 @@ typedef struct target_siginfo { | ||
| 436 | #define TARGET_SEGV_ACCERR (2) /* invalid permissions for mapped object */ | 443 | #define TARGET_SEGV_ACCERR (2) /* invalid permissions for mapped object */ |
| 437 | 444 | ||
| 438 | /* | 445 | /* |
| 446 | + * SIGBUS si_codes | ||
| 447 | + */ | ||
| 448 | +#define TARGET_BUS_ADRALN (1) /* invalid address alignment */ | ||
| 449 | +#define TARGET_BUS_ADRERR (2) /* non-existant physical address */ | ||
| 450 | +#define TARGET_BUS_OBJERR (3) /* object specific hardware error */ | ||
| 451 | + | ||
| 452 | +/* | ||
| 439 | * SIGTRAP si_codes | 453 | * SIGTRAP si_codes |
| 440 | */ | 454 | */ |
| 441 | #define TARGET_TRAP_BRKPT (1) /* process breakpoint */ | 455 | #define TARGET_TRAP_BRKPT (1) /* process breakpoint */ |
| @@ -891,6 +905,44 @@ struct target_stat64 { | @@ -891,6 +905,44 @@ struct target_stat64 { | ||
| 891 | #define TARGET_F_SETLK64 13 | 905 | #define TARGET_F_SETLK64 13 |
| 892 | #define TARGET_F_SETLKW64 14 | 906 | #define TARGET_F_SETLKW64 14 |
| 893 | 907 | ||
| 908 | +#if defined (TARGET_PPC) | ||
| 909 | +#define TARGET_O_ACCMODE 0003 | ||
| 910 | +#define TARGET_O_RDONLY 00 | ||
| 911 | +#define TARGET_O_WRONLY 01 | ||
| 912 | +#define TARGET_O_RDWR 02 | ||
| 913 | +#define TARGET_O_CREAT 0100 /* not fcntl */ | ||
| 914 | +#define TARGET_O_EXCL 0200 /* not fcntl */ | ||
| 915 | +#define TARGET_O_NOCTTY 0400 /* not fcntl */ | ||
| 916 | +#define TARGET_O_TRUNC 01000 /* not fcntl */ | ||
| 917 | +#define TARGET_O_APPEND 02000 | ||
| 918 | +#define TARGET_O_NONBLOCK 04000 | ||
| 919 | +#define TARGET_O_NDELAY O_NONBLOCK | ||
| 920 | +#define TARGET_O_SYNC 010000 | ||
| 921 | +#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */ | ||
| 922 | +#define TARGET_O_DIRECTORY 040000 /* must be a directory */ | ||
| 923 | +#define TARGET_O_NOFOLLOW 0100000 /* don't follow links */ | ||
| 924 | +#define TARGET_O_LARGEFILE 0200000 | ||
| 925 | +#define TARGET_O_DIRECT 0400000 /* direct disk access hint */ | ||
| 926 | +#else | ||
| 927 | +#define TARGET_O_ACCMODE 0003 | ||
| 928 | +#define TARGET_O_RDONLY 00 | ||
| 929 | +#define TARGET_O_WRONLY 01 | ||
| 930 | +#define TARGET_O_RDWR 02 | ||
| 931 | +#define TARGET_O_CREAT 0100 /* not fcntl */ | ||
| 932 | +#define TARGET_O_EXCL 0200 /* not fcntl */ | ||
| 933 | +#define TARGET_O_NOCTTY 0400 /* not fcntl */ | ||
| 934 | +#define TARGET_O_TRUNC 01000 /* not fcntl */ | ||
| 935 | +#define TARGET_O_APPEND 02000 | ||
| 936 | +#define TARGET_O_NONBLOCK 04000 | ||
| 937 | +#define TARGET_O_NDELAY O_NONBLOCK | ||
| 938 | +#define TARGET_O_SYNC 010000 | ||
| 939 | +#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */ | ||
| 940 | +#define TARGET_O_DIRECT 040000 /* direct disk access hint */ | ||
| 941 | +#define TARGET_O_LARGEFILE 0100000 | ||
| 942 | +#define TARGET_O_DIRECTORY 0200000 /* must be a directory */ | ||
| 943 | +#define TARGET_O_NOFOLLOW 0400000 /* don't follow links */ | ||
| 944 | +#endif | ||
| 945 | + | ||
| 894 | struct target_flock { | 946 | struct target_flock { |
| 895 | short l_type; | 947 | short l_type; |
| 896 | short l_whence; | 948 | short l_whence; |