diff --git a/linux-user/syscall.c b/linux-user/syscall.c index abd5ce4e90..52e1c6b533 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -1130,6 +1130,24 @@ static bitmask_transtbl mmap_flags_tbl[] = { { 0, 0, 0, 0 } }; +static bitmask_transtbl fcntl_flags_tbl[] = { + { TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, }, + { TARGET_O_ACCMODE, TARGET_O_RDWR, O_ACCMODE, O_RDWR, }, + { TARGET_O_CREAT, TARGET_O_CREAT, O_CREAT, O_CREAT, }, + { TARGET_O_EXCL, TARGET_O_EXCL, O_EXCL, O_EXCL, }, + { TARGET_O_NOCTTY, TARGET_O_NOCTTY, O_NOCTTY, O_NOCTTY, }, + { TARGET_O_TRUNC, TARGET_O_TRUNC, O_TRUNC, O_TRUNC, }, + { TARGET_O_APPEND, TARGET_O_APPEND, O_APPEND, O_APPEND, }, + { TARGET_O_NONBLOCK, TARGET_O_NONBLOCK, O_NONBLOCK, O_NONBLOCK, }, + { TARGET_O_SYNC, TARGET_O_SYNC, O_SYNC, O_SYNC, }, + { TARGET_FASYNC, TARGET_FASYNC, FASYNC, FASYNC, }, + { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, }, + { TARGET_O_NOFOLLOW, TARGET_O_NOFOLLOW, O_NOFOLLOW, O_NOFOLLOW, }, + { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, }, + { TARGET_O_DIRECT, TARGET_O_DIRECT, O_DIRECT, O_DIRECT, }, + { 0, 0, 0, 0 } +}; + #if defined(TARGET_I386) /* 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) errno = EINVAL; break; + case F_GETFL: + ret = fcntl(fd, cmd, arg); + ret = host_to_target_bitmask(ret, fcntl_flags_tbl); + break; + + case F_SETFL: + ret = fcntl(fd, cmd, target_to_host_bitmask(arg, fcntl_flags_tbl)); + break; + default: ret = fcntl(fd, cmd, arg); break; @@ -1464,7 +1491,9 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, ret = get_errno(write(arg1, (void *)arg2, arg3)); break; case TARGET_NR_open: - ret = get_errno(open(path((const char *)arg1), arg2, arg3)); + ret = get_errno(open(path((const char *)arg1), + target_to_host_bitmask(arg2, fcntl_flags_tbl), + arg3)); break; case TARGET_NR_close: ret = get_errno(close(arg1)); @@ -2750,10 +2779,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, case TARGET_NR_pivot_root: goto unimplemented; +#ifdef TARGET_NR_mincore case TARGET_NR_mincore: goto unimplemented; +#endif +#ifdef TARGET_NR_madvise case TARGET_NR_madvise: goto unimplemented; +#endif #if TARGET_LONG_BITS == 32 case TARGET_NR_fcntl64: { diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h index a0a04aab32..4e36a222d6 100644 --- a/linux-user/syscall_defs.h +++ b/linux-user/syscall_defs.h @@ -414,7 +414,14 @@ typedef struct target_siginfo { /* * SIGILL si_codes */ +#define TARGET_ILL_ILLOPC (1) /* illegal opcode */ #define TARGET_ILL_ILLOPN (2) /* illegal operand */ +#define TARGET_ILL_ILLADR (3) /* illegal addressing mode */ +#define TARGET_ILL_ILLTRP (4) /* illegal trap */ +#define TARGET_ILL_PRVOPC (5) /* privileged opcode */ +#define TARGET_ILL_PRVREG (6) /* privileged register */ +#define TARGET_ILL_COPROC (7) /* coprocessor error */ +#define TARGET_ILL_BADSTK (8) /* internal stack error */ /* * SIGFPE si_codes @@ -435,6 +442,13 @@ typedef struct target_siginfo { #define TARGET_SEGV_MAPERR (1) /* address not mapped to object */ #define TARGET_SEGV_ACCERR (2) /* invalid permissions for mapped object */ +/* + * SIGBUS si_codes + */ +#define TARGET_BUS_ADRALN (1) /* invalid address alignment */ +#define TARGET_BUS_ADRERR (2) /* non-existant physical address */ +#define TARGET_BUS_OBJERR (3) /* object specific hardware error */ + /* * SIGTRAP si_codes */ @@ -891,6 +905,44 @@ struct target_stat64 { #define TARGET_F_SETLK64 13 #define TARGET_F_SETLKW64 14 +#if defined (TARGET_PPC) +#define TARGET_O_ACCMODE 0003 +#define TARGET_O_RDONLY 00 +#define TARGET_O_WRONLY 01 +#define TARGET_O_RDWR 02 +#define TARGET_O_CREAT 0100 /* not fcntl */ +#define TARGET_O_EXCL 0200 /* not fcntl */ +#define TARGET_O_NOCTTY 0400 /* not fcntl */ +#define TARGET_O_TRUNC 01000 /* not fcntl */ +#define TARGET_O_APPEND 02000 +#define TARGET_O_NONBLOCK 04000 +#define TARGET_O_NDELAY O_NONBLOCK +#define TARGET_O_SYNC 010000 +#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */ +#define TARGET_O_DIRECTORY 040000 /* must be a directory */ +#define TARGET_O_NOFOLLOW 0100000 /* don't follow links */ +#define TARGET_O_LARGEFILE 0200000 +#define TARGET_O_DIRECT 0400000 /* direct disk access hint */ +#else +#define TARGET_O_ACCMODE 0003 +#define TARGET_O_RDONLY 00 +#define TARGET_O_WRONLY 01 +#define TARGET_O_RDWR 02 +#define TARGET_O_CREAT 0100 /* not fcntl */ +#define TARGET_O_EXCL 0200 /* not fcntl */ +#define TARGET_O_NOCTTY 0400 /* not fcntl */ +#define TARGET_O_TRUNC 01000 /* not fcntl */ +#define TARGET_O_APPEND 02000 +#define TARGET_O_NONBLOCK 04000 +#define TARGET_O_NDELAY O_NONBLOCK +#define TARGET_O_SYNC 010000 +#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */ +#define TARGET_O_DIRECT 040000 /* direct disk access hint */ +#define TARGET_O_LARGEFILE 0100000 +#define TARGET_O_DIRECTORY 0200000 /* must be a directory */ +#define TARGET_O_NOFOLLOW 0400000 /* don't follow links */ +#endif + struct target_flock { short l_type; short l_whence;