* [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements
@ 2012-06-07 22:24 Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling Richard Henderson
` (9 more replies)
0 siblings, 10 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Changes v2-v3:
Fix fcntl translation table in O_CLOEXEC patch. The O_LARGEFILE
entry could result in an end-of-table {0,0,0,0} marker.
Handle sigprocmask and getpriority properly for alpha.
Changes v1-v2:
Dropped -stracefile patch. That clearly needs more iteration in
order to make everyone happy. I don't want the rest of this to
get caught up in that.
Two patches that fix all of the mmap problems I've been able to
find in the glibc testsuite. The iconv tests that load lots of
shared libraries are particularly good at triggering both problems.
Handle O_CLOEXEC et al properly.
Handle pipe2 properly.
r~
Richard Henderson (9):
alpha-linux-user: Fix signal handling
alpha-linux-user: Work around hosted mmap allocation problems
alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly
linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH
linux-user: Allocate the right amount of space for non-fixed file
maps
linux-user: Translate pipe2 flags; add to strace
alpha-linux-user: Fix a3 error return with v0 error bypass.
alpha-linux-user: Properly handle the non-rt sigprocmask syscall.
alpha-linux-user: Fix the getpriority syscall
linux-user/alpha/syscall_nr.h | 2 +-
linux-user/main.c | 15 ++--
linux-user/mmap.c | 30 ++++--
linux-user/strace.c | 12 ++-
linux-user/strace.list | 3 +
linux-user/syscall.c | 108 +++++++++++++++----
linux-user/syscall_defs.h | 236 +++++++++++++++++++++++------------------
target-alpha/cpu.h | 11 ++
8 files changed, 273 insertions(+), 144 deletions(-)
--
1.7.7.6
^ permalink raw reply [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-22 14:10 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems Richard Henderson
` (8 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Proper signal numbers were not defined, and EXCP_INTERRUPT
was unhandled, leading to all sorts of subtle confusion.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/main.c | 3 +++
linux-user/syscall_defs.h | 41 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 43 insertions(+), 1 deletions(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index 49108b8..e81abb2 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -2833,6 +2833,9 @@ void cpu_loop(CPUAlphaState *env)
case EXCP_STQ_C:
do_store_exclusive(env, env->error_code, trapnr - EXCP_STL_C);
break;
+ case EXCP_INTERRUPT:
+ /* Just indicate that signals should be handled asap. */
+ break;
default:
printf ("Unhandled trap: 0x%x\n", trapnr);
cpu_dump_state(env, stderr, fprintf, 0);
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index a79b67d..02fe4f6 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -363,7 +363,46 @@ int do_sigaction(int sig, const struct target_sigaction *act,
#define TARGET_SA_RESTORER 0x04000000
#endif
-#if defined(TARGET_SPARC)
+#if defined(TARGET_ALPHA)
+
+#define TARGET_SIGHUP 1
+#define TARGET_SIGINT 2
+#define TARGET_SIGQUIT 3
+#define TARGET_SIGILL 4
+#define TARGET_SIGTRAP 5
+#define TARGET_SIGABRT 6
+#define TARGET_SIGSTKFLT 7 /* actually SIGEMT */
+#define TARGET_SIGFPE 8
+#define TARGET_SIGKILL 9
+#define TARGET_SIGBUS 10
+#define TARGET_SIGSEGV 11
+#define TARGET_SIGSYS 12
+#define TARGET_SIGPIPE 13
+#define TARGET_SIGALRM 14
+#define TARGET_SIGTERM 15
+#define TARGET_SIGURG 16
+#define TARGET_SIGSTOP 17
+#define TARGET_SIGTSTP 18
+#define TARGET_SIGCONT 19
+#define TARGET_SIGCHLD 20
+#define TARGET_SIGTTIN 21
+#define TARGET_SIGTTOU 22
+#define TARGET_SIGIO 23
+#define TARGET_SIGXCPU 24
+#define TARGET_SIGXFSZ 25
+#define TARGET_SIGVTALRM 26
+#define TARGET_SIGPROF 27
+#define TARGET_SIGWINCH 28
+#define TARGET_SIGPWR 29 /* actually SIGINFO */
+#define TARGET_SIGUSR1 30
+#define TARGET_SIGUSR2 31
+#define TARGET_SIGRTMIN 32
+
+#define TARGET_SIG_BLOCK 1
+#define TARGET_SIG_UNBLOCK 2
+#define TARGET_SIG_SETMASK 3
+
+#elif defined(TARGET_SPARC)
#define TARGET_SIGHUP 1
#define TARGET_SIGINT 2
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-12 14:12 ` Andreas Färber
2012-06-07 22:24 ` [Qemu-devel] [PATCH 3/9] alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly Richard Henderson
` (7 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
target-alpha/cpu.h | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h
index 99f9ee1..0d87fa7 100644
--- a/target-alpha/cpu.h
+++ b/target-alpha/cpu.h
@@ -40,9 +40,20 @@
#define TARGET_PAGE_BITS 13
+#ifdef CONFIG_USER_ONLY
+/* ??? The kernel likes to give addresses in high memory. If the host has
+ more virtual address space than the guest, this can lead to impossible
+ allocations. Honor the long-standing assumption that only kernel addrs
+ are negative, but otherwise allow allocations anywhere. This could lead
+ to tricky emulation problems for programs doing tagged addressing, but
+ that's far fewer than encounter the impossible allocation problem. */
+#define TARGET_PHYS_ADDR_SPACE_BITS 63
+#define TARGET_VIRT_ADDR_SPACE_BITS 63
+#else
/* ??? EV4 has 34 phys addr bits, EV5 has 40, EV6 has 44. */
#define TARGET_PHYS_ADDR_SPACE_BITS 44
#define TARGET_VIRT_ADDR_SPACE_BITS (30 + TARGET_PAGE_BITS)
+#endif
/* Alpha major type */
enum {
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 3/9] alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH Richard Henderson
` (6 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
We weren't aggregating the exceptions, nor raising signals properly.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/syscall.c | 61 +++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 51 insertions(+), 10 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 539af3f..1cbbfbf 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -7699,13 +7699,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = -TARGET_EOPNOTSUPP;
switch (arg1) {
case TARGET_SSI_IEEE_FP_CONTROL:
- case TARGET_SSI_IEEE_RAISE_EXCEPTION:
{
uint64_t swcr, fpcr, orig_fpcr;
- if (get_user_u64 (swcr, arg2))
+ if (get_user_u64 (swcr, arg2)) {
goto efault;
- orig_fpcr = cpu_alpha_load_fpcr (cpu_env);
+ }
+ orig_fpcr = cpu_alpha_load_fpcr(cpu_env);
fpcr = orig_fpcr & FPCR_DYN_MASK;
/* Copied from linux ieee_swcr_to_fpcr. */
@@ -7719,16 +7719,57 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
fpcr |= (swcr & SWCR_MAP_UMZ ? FPCR_UNDZ | FPCR_UNFD : 0);
fpcr |= (~swcr & SWCR_TRAP_ENABLE_DNO) << 41;
- cpu_alpha_store_fpcr (cpu_env, fpcr);
+ cpu_alpha_store_fpcr(cpu_env, fpcr);
ret = 0;
+ }
+ break;
+
+ case TARGET_SSI_IEEE_RAISE_EXCEPTION:
+ {
+ uint64_t exc, fpcr, orig_fpcr;
+ int si_code;
+
+ if (get_user_u64(exc, arg2)) {
+ goto efault;
+ }
- if (arg1 == TARGET_SSI_IEEE_RAISE_EXCEPTION) {
- /* Old exceptions are not signaled. */
- fpcr &= ~(orig_fpcr & FPCR_STATUS_MASK);
+ orig_fpcr = cpu_alpha_load_fpcr(cpu_env);
- /* If any exceptions set by this call, and are unmasked,
- send a signal. */
- /* ??? FIXME */
+ /* We only add to the exception status here. */
+ fpcr = orig_fpcr | ((exc & SWCR_STATUS_MASK) << 35);
+
+ cpu_alpha_store_fpcr(cpu_env, fpcr);
+ ret = 0;
+
+ /* Old exceptions are not signaled. */
+ fpcr &= ~(orig_fpcr & FPCR_STATUS_MASK);
+
+ /* If any exceptions set by this call,
+ and are unmasked, send a signal. */
+ si_code = 0;
+ if ((fpcr & (FPCR_INE | FPCR_INED)) == FPCR_INE) {
+ si_code = TARGET_FPE_FLTRES;
+ }
+ if ((fpcr & (FPCR_UNF | FPCR_UNFD)) == FPCR_UNF) {
+ si_code = TARGET_FPE_FLTUND;
+ }
+ if ((fpcr & (FPCR_OVF | FPCR_OVFD)) == FPCR_OVF) {
+ si_code = TARGET_FPE_FLTOVF;
+ }
+ if ((fpcr & (FPCR_DZE | FPCR_DZED)) == FPCR_DZE) {
+ si_code = TARGET_FPE_FLTDIV;
+ }
+ if ((fpcr & (FPCR_INV | FPCR_INVD)) == FPCR_INV) {
+ si_code = TARGET_FPE_FLTINV;
+ }
+ if (si_code != 0) {
+ target_siginfo_t info;
+ info.si_signo = SIGFPE;
+ info.si_errno = 0;
+ info.si_code = si_code;
+ info._sifields._sigfault._addr
+ = ((CPUArchState *)cpu_env)->pc;
+ queue_signal((CPUArchState *)cpu_env, info.si_signo, &info);
}
}
break;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (2 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 3/9] alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-22 14:15 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 5/9] linux-user: Allocate the right amount of space for non-fixed file maps Richard Henderson
` (5 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
And tidy up syscall_defs.h a little bit. For each target, only
define the bits in arch/target/include/asm/fcntl.h, leaving the
others to a new asm-generic section below.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/strace.c | 12 +++-
linux-user/syscall.c | 15 +++-
linux-user/syscall_defs.h | 195 +++++++++++++++++++++-----------------------
3 files changed, 118 insertions(+), 104 deletions(-)
diff --git a/linux-user/strace.c b/linux-user/strace.c
index 05a0d3e..6ec90e8 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -371,11 +371,21 @@ UNUSED static struct flags open_flags[] = {
FLAG_TARGET(O_NOCTTY),
FLAG_TARGET(O_NOFOLLOW),
FLAG_TARGET(O_NONBLOCK), /* also O_NDELAY */
- FLAG_TARGET(O_SYNC),
+ FLAG_TARGET(O_DSYNC),
+ FLAG_TARGET(__O_SYNC),
FLAG_TARGET(O_TRUNC),
#ifdef O_DIRECT
FLAG_TARGET(O_DIRECT),
#endif
+#ifdef O_NOATIME
+ FLAG_TARGET(O_NOATIME),
+#endif
+#ifdef O_CLOEXEC
+ FLAG_TARGET(O_CLOEXEC),
+#endif
+#ifdef O_PATH
+ FLAG_TARGET(O_PATH),
+#endif
FLAG_END,
};
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1cbbfbf..8a454cc 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -261,14 +261,27 @@ static bitmask_transtbl fcntl_flags_tbl[] = {
{ 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_DSYNC, O_SYNC, O_DSYNC, },
{ 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, },
#if defined(O_DIRECT)
{ TARGET_O_DIRECT, TARGET_O_DIRECT, O_DIRECT, O_DIRECT, },
#endif
+#if defined(O_NOATIME)
+ { TARGET_O_NOATIME, TARGET_O_NOATIME, O_NOATIME, O_NOATIME },
+#endif
+#if defined(O_CLOEXEC)
+ { TARGET_O_CLOEXEC, TARGET_O_CLOEXEC, O_CLOEXEC, O_CLOEXEC },
+#endif
+#if defined(O_PATH)
+ { TARGET_O_PATH, TARGET_O_PATH, O_PATH, O_PATH },
+#endif
+ /* Don't terminate the list prematurely on 64-bit host+guest. */
+#if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
+ { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, },
+#endif
{ 0, 0, 0, 0 }
};
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 02fe4f6..974d6f5 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2012,135 +2012,126 @@ struct target_statfs64 {
#define TARGET_F_DUPFD_CLOEXEC (TARGET_F_LINUX_SPECIFIC_BASE + 6)
#define TARGET_F_NOTIFY (TARGET_F_LINUX_SPECIFIC_BASE+2)
-#if defined (TARGET_ARM)
-#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 TARGET_O_NONBLOCK
-#define TARGET_O_SYNC 010000
-#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */
+#if defined(TARGET_ALPHA)
+#define TARGET_O_NONBLOCK 04
+#define TARGET_O_APPEND 010
+#define TARGET_O_CREAT 01000 /* not fcntl */
+#define TARGET_O_TRUNC 02000 /* not fcntl */
+#define TARGET_O_EXCL 04000 /* not fcntl */
+#define TARGET_O_NOCTTY 010000 /* not fcntl */
+#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */
+#define TARGET_O_DSYNC 040000
+#define TARGET_O_LARGEFILE 0 /* not necessary, always 64-bit */
+#define TARGET_O_DIRECTORY 0100000 /* must be a directory */
+#define TARGET_O_NOFOLLOW 0200000 /* don't follow links */
+#define TARGET_O_DIRECT 02000000 /* direct disk access hint */
+#define TARGET_O_NOATIME 04000000
+#define TARGET_O_CLOEXEC 010000000
+#define TARGET___O_SYNC 020000000
+#define TARGET_O_PATH 040000000
+#elif defined (TARGET_ARM)
#define TARGET_O_DIRECTORY 040000 /* must be a directory */
#define TARGET_O_NOFOLLOW 0100000 /* don't follow links */
#define TARGET_O_DIRECT 0200000 /* direct disk access hint */
#define TARGET_O_LARGEFILE 0400000
+#elif defined(TARGET_MIPS)
+#define TARGET_O_APPEND 0x0008
+#define TARGET_O_DSYNC 0x0010
+#define TARGET_O_NONBLOCK 0x0080
+#define TARGET_O_CREAT 0x0100 /* not fcntl */
+#define TARGET_O_TRUNC 0x0200 /* not fcntl */
+#define TARGET_O_EXCL 0x0400 /* not fcntl */
+#define TARGET_O_NOCTTY 0x0800 /* not fcntl */
+#define TARGET_FASYNC 0x1000 /* fcntl, for BSD compatibility */
+#define TARGET_O_LARGEFILE 0x2000 /* allow large file opens */
+#define TARGET___O_SYNC 0x4000
+#define TARGET_O_DIRECT 0x8000 /* direct disk access hint */
#elif 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 TARGET_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 */
-#elif defined (TARGET_MICROBLAZE)
-#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 TARGET_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 */
#elif defined (TARGET_SPARC)
-#define TARGET_O_RDONLY 0x0000
-#define TARGET_O_WRONLY 0x0001
-#define TARGET_O_RDWR 0x0002
-#define TARGET_O_ACCMODE 0x0003
-#define TARGET_O_APPEND 0x0008
-#define TARGET_FASYNC 0x0040 /* fcntl, for BSD compatibility */
-#define TARGET_O_CREAT 0x0200 /* not fcntl */
-#define TARGET_O_TRUNC 0x0400 /* not fcntl */
-#define TARGET_O_EXCL 0x0800 /* not fcntl */
-#define TARGET_O_SYNC 0x2000
-#define TARGET_O_NONBLOCK 0x4000
-#define TARGET_O_NDELAY (0x0004 | TARGET_O_NONBLOCK)
-#define TARGET_O_NOCTTY 0x8000 /* not fcntl */
-#define TARGET_O_DIRECTORY 0x10000 /* must be a directory */
-#define TARGET_O_NOFOLLOW 0x20000 /* don't follow links */
+#define TARGET_O_APPEND 0x0008
+#define TARGET_FASYNC 0x0040 /* fcntl, for BSD compatibility */
+#define TARGET_O_CREAT 0x0200 /* not fcntl */
+#define TARGET_O_TRUNC 0x0400 /* not fcntl */
+#define TARGET_O_EXCL 0x0800 /* not fcntl */
+#define TARGET_O_DSYNC 0x2000
+#define TARGET_O_NONBLOCK 0x4000
+# ifdef TARGET_SPARC64
+# define TARGET_O_NDELAY 0x0004
+# else
+# define TARGET_O_NDELAY (0x0004 | TARGET_O_NONBLOCK)
+# endif
+#define TARGET_O_NOCTTY 0x8000 /* not fcntl */
#define TARGET_O_LARGEFILE 0x40000
-#define TARGET_O_DIRECT 0x100000 /* direct disk access hint */
-#elif defined(TARGET_MIPS)
-#define TARGET_O_ACCMODE 0x0003
-#define TARGET_O_RDONLY 0x0000
-#define TARGET_O_WRONLY 0x0001
-#define TARGET_O_RDWR 0x0002
-#define TARGET_O_APPEND 0x0008
-#define TARGET_O_SYNC 0x0010
-#define TARGET_O_NONBLOCK 0x0080
-#define TARGET_O_CREAT 0x0100 /* not fcntl */
-#define TARGET_O_TRUNC 0x0200 /* not fcntl */
-#define TARGET_O_EXCL 0x0400 /* not fcntl */
-#define TARGET_O_NOCTTY 0x0800 /* not fcntl */
-#define TARGET_FASYNC 0x1000 /* fcntl, for BSD compatibility */
-#define TARGET_O_LARGEFILE 0x2000 /* allow large file opens */
-#define TARGET_O_DIRECT 0x8000 /* direct disk access hint */
-#define TARGET_O_DIRECTORY 0x10000 /* must be a directory */
-#define TARGET_O_NOFOLLOW 0x20000 /* don't follow links */
-#define TARGET_O_NOATIME 0x40000
-#define TARGET_O_NDELAY TARGET_O_NONBLOCK
-#elif defined(TARGET_ALPHA)
-#define TARGET_O_ACCMODE 0x0003
-#define TARGET_O_RDONLY 0x0000
-#define TARGET_O_WRONLY 0x0001
-#define TARGET_O_RDWR 0x0002
-#define TARGET_O_APPEND 0x0008
-#define TARGET_O_SYNC 0x4000
-#define TARGET_O_NONBLOCK 0x0004
-#define TARGET_O_CREAT 0x0200 /* not fcntl */
-#define TARGET_O_TRUNC 0x0400 /* not fcntl */
-#define TARGET_O_EXCL 0x0800 /* not fcntl */
-#define TARGET_O_NOCTTY 0x1000 /* not fcntl */
-#define TARGET_FASYNC 0x2000 /* fcntl, for BSD compatibility */
-#define TARGET_O_LARGEFILE 0x0000 /* not necessary, always 64-bit */
-#define TARGET_O_DIRECT 0x80000 /* direct disk access hint */
-#define TARGET_O_DIRECTORY 0x8000 /* must be a directory */
-#define TARGET_O_NOFOLLOW 0x10000 /* don't follow links */
-#define TARGET_O_NOATIME 0x100000
-#define TARGET_O_NDELAY TARGET_O_NONBLOCK
-#else
+#define TARGET_O_DIRECT 0x100000 /* direct disk access hint */
+#define TARGET_O_NOATIME 0x200000
+#define TARGET_O_CLOEXEC 0x400000
+#define TARGET___O_SYNC 0x800000
+#define TARGET_O_PATH 0x1000000
+#endif
+
+/* <asm-generic/fcntl.h> values follow. */
#define TARGET_O_ACCMODE 0003
#define TARGET_O_RDONLY 00
#define TARGET_O_WRONLY 01
#define TARGET_O_RDWR 02
+#ifndef TARGET_O_CREAT
#define TARGET_O_CREAT 0100 /* not fcntl */
+#endif
+#ifndef TARGET_O_EXCL
#define TARGET_O_EXCL 0200 /* not fcntl */
+#endif
+#ifndef TARGET_O_NOCTTY
#define TARGET_O_NOCTTY 0400 /* not fcntl */
+#endif
+#ifndef TARGET_O_TRUNC
#define TARGET_O_TRUNC 01000 /* not fcntl */
+#endif
+#ifndef TARGET_O_APPEND
#define TARGET_O_APPEND 02000
+#endif
+#ifndef TARGET_O_NONBLOCK
#define TARGET_O_NONBLOCK 04000
-#define TARGET_O_NDELAY TARGET_O_NONBLOCK
-#define TARGET_O_SYNC 010000
+#endif
+#ifndef TARGET_O_DSYNC
+#define TARGET_O_DSYNC 010000
+#endif
+#ifndef TARGET_FASYNC
#define TARGET_FASYNC 020000 /* fcntl, for BSD compatibility */
+#endif
+#ifndef TARGET_O_DIRECT
#define TARGET_O_DIRECT 040000 /* direct disk access hint */
+#endif
+#ifndef TARGET_O_LARGEFILE
#define TARGET_O_LARGEFILE 0100000
+#endif
+#ifndef TARGET_O_DIRECTORY
#define TARGET_O_DIRECTORY 0200000 /* must be a directory */
+#endif
+#ifndef TARGET_O_NOFOLLOW
#define TARGET_O_NOFOLLOW 0400000 /* don't follow links */
#endif
+#ifndef TARGET_O_NOATIME
+#define TARGET_O_NOATIME 01000000
+#endif
+#ifndef TARGET_O_CLOEXEC
+#define TARGET_O_CLOEXEC 02000000
+#endif
+#ifndef TARGET___O_SYNC
+#define TARGET___O_SYNC 04000000
+#endif
+#ifndef TARGET_O_PATH
+#define TARGET_O_PATH 010000000
+#endif
+#ifndef TARGET_O_NDELAY
+#define TARGET_O_NDELAY TARGET_O_NONBLOCK
+#endif
+#ifndef TARGET_O_SYNC
+#define TARGET_O_SYNC (TARGET___O_SYNC | TARGET_O_DSYNC)
+#endif
struct target_flock {
short l_type;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 5/9] linux-user: Allocate the right amount of space for non-fixed file maps
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (3 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace Richard Henderson
` (4 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
If we let the kernel handle the implementation of mmap_find_vma,
via an anon mmap, we must use the size as indicated by the user
and not the size truncated to the filesize.
This happens often in ld.so, where we initially mmap the file to
the size of the text+data+bss to reserve an area, then mmap+fixed
over the top to properly handle data and bss.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/mmap.c | 30 +++++++++++++++++++-----------
1 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/linux-user/mmap.c b/linux-user/mmap.c
index d9468fe..b412e3f 100644
--- a/linux-user/mmap.c
+++ b/linux-user/mmap.c
@@ -382,7 +382,6 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
int flags, int fd, abi_ulong offset)
{
abi_ulong ret, end, real_start, real_end, retaddr, host_offset, host_len;
- unsigned long host_start;
mmap_lock();
#ifdef DEBUG_MMAP
@@ -421,6 +420,19 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
if (len == 0)
goto the_end;
real_start = start & qemu_host_page_mask;
+ host_offset = offset & qemu_host_page_mask;
+
+ /* If the user is asking for the kernel to find a location, do that
+ before we truncate the length for mapping files below. */
+ if (!(flags & MAP_FIXED)) {
+ host_len = len + offset - host_offset;
+ host_len = HOST_PAGE_ALIGN(host_len);
+ start = mmap_find_vma(real_start, host_len);
+ if (start == (abi_ulong)-1) {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
/* When mapping files into a memory area larger than the file, accesses
to pages beyond the file size will cause a SIGBUS.
@@ -453,27 +465,23 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
}
if (!(flags & MAP_FIXED)) {
- abi_ulong mmap_start;
+ unsigned long host_start;
void *p;
- host_offset = offset & qemu_host_page_mask;
+
host_len = len + offset - host_offset;
host_len = HOST_PAGE_ALIGN(host_len);
- mmap_start = mmap_find_vma(real_start, host_len);
- if (mmap_start == (abi_ulong)-1) {
- errno = ENOMEM;
- goto fail;
- }
+
/* Note: we prefer to control the mapping address. It is
especially important if qemu_host_page_size >
qemu_real_host_page_size */
- p = mmap(g2h(mmap_start),
- host_len, prot, flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
+ p = mmap(g2h(start), host_len, prot,
+ flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
if (p == MAP_FAILED)
goto fail;
/* update start so that it points to the file position at 'offset' */
host_start = (unsigned long)p;
if (!(flags & MAP_ANONYMOUS)) {
- p = mmap(g2h(mmap_start), len, prot,
+ p = mmap(g2h(start), len, prot,
flags | MAP_FIXED, fd, host_offset);
host_start += offset - host_offset;
}
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (4 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 5/9] linux-user: Allocate the right amount of space for non-fixed file maps Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-22 14:18 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 7/9] alpha-linux-user: Fix a3 error return with v0 error bypass Richard Henderson
` (3 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/strace.list | 3 +++
linux-user/syscall.c | 3 ++-
2 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/linux-user/strace.list b/linux-user/strace.list
index a7eeaef..af3c6a0 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -1527,3 +1527,6 @@
#ifdef TARGET_NR_sync_file_range2
{ TARGET_NR_sync_file_range2, "sync_file_range2", NULL, NULL, NULL },
#endif
+#ifdef TARGET_NR_pipe2
+{ TARGET_NR_pipe2, "pipe2", NULL, NULL, NULL },
+#endif
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 8a454cc..1a12f14 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5595,7 +5595,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
#ifdef TARGET_NR_pipe2
case TARGET_NR_pipe2:
- ret = do_pipe(cpu_env, arg1, arg2, 1);
+ ret = do_pipe(cpu_env, arg1,
+ target_to_host_bitmask(arg2, fcntl_flags_tbl), 1);
break;
#endif
case TARGET_NR_times:
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 7/9] alpha-linux-user: Fix a3 error return with v0 error bypass.
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (5 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall Richard Henderson
` (2 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
We were failing to initialize a3 for syscalls that bypass the
negative return value error check.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/main.c | 12 +++++-------
1 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/linux-user/main.c b/linux-user/main.c
index e81abb2..605018a 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -2758,13 +2758,11 @@ void cpu_loop(CPUAlphaState *env)
break;
}
/* Syscall writes 0 to V0 to bypass error check, similar
- to how this is handled internal to Linux kernel. */
- if (env->ir[IR_V0] == 0) {
- env->ir[IR_V0] = sysret;
- } else {
- env->ir[IR_V0] = (sysret < 0 ? -sysret : sysret);
- env->ir[IR_A3] = (sysret < 0);
- }
+ to how this is handled internal to Linux kernel.
+ (Ab)use trapnr temporarily as boolean indicating error. */
+ trapnr = (env->ir[IR_V0] != 0 && sysret < 0);
+ env->ir[IR_V0] = (trapnr ? -sysret : sysret);
+ env->ir[IR_A3] = trapnr;
break;
case 0x86:
/* IMB */
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall.
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (6 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 7/9] alpha-linux-user: Fix a3 error return with v0 error bypass Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-22 14:27 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall Richard Henderson
2012-06-12 13:48 ` [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
9 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Name the syscall properly for QEMU, kernel source notwithstanding.
Fix syntax errors in the code thus enabled within do_syscall.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/alpha/syscall_nr.h | 2 +-
linux-user/syscall.c | 9 +++++----
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/linux-user/alpha/syscall_nr.h b/linux-user/alpha/syscall_nr.h
index f6284db..49648a1 100644
--- a/linux-user/alpha/syscall_nr.h
+++ b/linux-user/alpha/syscall_nr.h
@@ -46,7 +46,7 @@
#define TARGET_NR_open 45
#define TARGET_NR_osf_old_sigaction 46 /* not implemented */
#define TARGET_NR_getxgid 47
-#define TARGET_NR_osf_sigprocmask 48
+#define TARGET_NR_sigprocmask 48
#define TARGET_NR_osf_getlogin 49 /* not implemented */
#define TARGET_NR_osf_setlogin 50 /* not implemented */
#define TARGET_NR_acct 51
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1a12f14..bc77b79 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5880,12 +5880,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
mask = arg2;
target_to_host_old_sigset(&set, &mask);
- ret = get_errno(sigprocmask(how, &set, &oldset));
-
- if (!is_error(ret)) {
+ ret = sigprocmask(how, &set, &oldset);
+ if (is_error(ret)) {
+ ret = get_errno(ret);
+ } else {
host_to_target_old_sigset(&mask, &oldset);
ret = mask;
- ((CPUAlphaState *)cpu_env)->[IR_V0] = 0; /* force no error */
+ ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0; /* force no error */
}
#else
sigset_t set, oldset, *set_ptr;
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (7 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall Richard Henderson
@ 2012-06-07 22:24 ` Richard Henderson
2012-06-12 13:48 ` [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
9 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-07 22:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Alpha uses unbiased priority values in the syscall, with the a3
return value signaling error conditions. Therefore, properly
interpret the libc getpriority as needed for the guest rather
than passing the host value through unchanged.
Signed-off-by: Richard Henderson <rth@twiddle.net>
---
linux-user/syscall.c | 20 +++++++++++++++-----
1 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index bc77b79..bc65c32 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -218,7 +218,6 @@ _syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count)
#if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
_syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint, count);
#endif
-_syscall2(int, sys_getpriority, int, which, int, who);
#if defined(TARGET_NR__llseek) && defined(__NR_llseek)
_syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo,
loff_t *, res, uint, wh);
@@ -6447,10 +6446,21 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break;
#endif
case TARGET_NR_getpriority:
- /* libc does special remapping of the return value of
- * sys_getpriority() so it's just easiest to call
- * sys_getpriority() directly rather than through libc. */
- ret = get_errno(sys_getpriority(arg1, arg2));
+ /* Note that negative values are valid for getpriority, so we must
+ differentiate based on errno settings. */
+ errno = 0;
+ ret = getpriority(arg1, arg2);
+ if (ret == -1 && errno != 0) {
+ ret = get_errno(errno);
+ break;
+ }
+#ifdef TARGET_ALPHA
+ /* Return value is the unbiased priority. Signal no error. */
+ ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0;
+#else
+ /* Return value is a biased priority to avoid negative numbers. */
+ ret = 20 - ret;
+#endif
break;
case TARGET_NR_setpriority:
ret = get_errno(setpriority(arg1, arg2, arg3));
--
1.7.7.6
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
` (8 preceding siblings ...)
2012-06-07 22:24 ` [Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall Richard Henderson
@ 2012-06-12 13:48 ` Richard Henderson
9 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-12 13:48 UTC (permalink / raw)
To: qemu-devel; +Cc: Riku Voipio
Ping?
r~
On 2012-06-07 15:24, Richard Henderson wrote:
> Changes v2-v3:
> Fix fcntl translation table in O_CLOEXEC patch. The O_LARGEFILE
> entry could result in an end-of-table {0,0,0,0} marker.
>
> Handle sigprocmask and getpriority properly for alpha.
>
> Changes v1-v2:
> Dropped -stracefile patch. That clearly needs more iteration in
> order to make everyone happy. I don't want the rest of this to
> get caught up in that.
>
> Two patches that fix all of the mmap problems I've been able to
> find in the glibc testsuite. The iconv tests that load lots of
> shared libraries are particularly good at triggering both problems.
>
> Handle O_CLOEXEC et al properly.
>
> Handle pipe2 properly.
>
>
> r~
>
>
> Richard Henderson (9):
> alpha-linux-user: Fix signal handling
> alpha-linux-user: Work around hosted mmap allocation problems
> alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly
> linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH
> linux-user: Allocate the right amount of space for non-fixed file
> maps
> linux-user: Translate pipe2 flags; add to strace
> alpha-linux-user: Fix a3 error return with v0 error bypass.
> alpha-linux-user: Properly handle the non-rt sigprocmask syscall.
> alpha-linux-user: Fix the getpriority syscall
>
> linux-user/alpha/syscall_nr.h | 2 +-
> linux-user/main.c | 15 ++--
> linux-user/mmap.c | 30 ++++--
> linux-user/strace.c | 12 ++-
> linux-user/strace.list | 3 +
> linux-user/syscall.c | 108 +++++++++++++++----
> linux-user/syscall_defs.h | 236 +++++++++++++++++++++++------------------
> target-alpha/cpu.h | 11 ++
> 8 files changed, 273 insertions(+), 144 deletions(-)
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-07 22:24 ` [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems Richard Henderson
@ 2012-06-12 14:12 ` Andreas Färber
2012-06-12 14:27 ` Richard Henderson
0 siblings, 1 reply; 21+ messages in thread
From: Andreas Färber @ 2012-06-12 14:12 UTC (permalink / raw)
To: Richard Henderson
Cc: Peter Maydell, Paul Brook, Riku Voipio, qemu-devel, Alexander Graf
Am 08.06.2012 00:24, schrieb Richard Henderson:
> Signed-off-by: Richard Henderson <rth@twiddle.net>
> ---
> target-alpha/cpu.h | 11 +++++++++++
> 1 files changed, 11 insertions(+), 0 deletions(-)
>
> diff --git a/target-alpha/cpu.h b/target-alpha/cpu.h
> index 99f9ee1..0d87fa7 100644
> --- a/target-alpha/cpu.h
> +++ b/target-alpha/cpu.h
> @@ -40,9 +40,20 @@
>
> #define TARGET_PAGE_BITS 13
>
> +#ifdef CONFIG_USER_ONLY
> +/* ??? The kernel likes to give addresses in high memory. If the host has
> + more virtual address space than the guest, this can lead to impossible
> + allocations. Honor the long-standing assumption that only kernel addrs
> + are negative, but otherwise allow allocations anywhere. This could lead
> + to tricky emulation problems for programs doing tagged addressing, but
> + that's far fewer than encounter the impossible allocation problem. */
> +#define TARGET_PHYS_ADDR_SPACE_BITS 63
> +#define TARGET_VIRT_ADDR_SPACE_BITS 63
> +#else
> /* ??? EV4 has 34 phys addr bits, EV5 has 40, EV6 has 44. */
> #define TARGET_PHYS_ADDR_SPACE_BITS 44
> #define TARGET_VIRT_ADDR_SPACE_BITS (30 + TARGET_PAGE_BITS)
> +#endif
>
> /* Alpha major type */
> enum {
This looks fishy to me... why should the kernel use a bigger address
space than hardware? For arm on x86_64 such a workaround was not
necessary iirc.
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-12 14:12 ` Andreas Färber
@ 2012-06-12 14:27 ` Richard Henderson
2012-06-12 14:53 ` Alexander Graf
0 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-12 14:27 UTC (permalink / raw)
To: Andreas Färber
Cc: Peter Maydell, Alexander Graf, Riku Voipio, Paul Brook, qemu-devel
On 2012-06-12 07:12, Andreas Färber wrote:
> This looks fishy to me... why should the kernel use a bigger address
> space than hardware? For arm on x86_64 such a workaround was not
> necessary iirc.
I can tell you what I observe. That with a certain sequence of
allocations the x86_64 kernel will quit accepting an address "near"
(1<<38) as a hint for where to allocate memory and begin returning
an addresses near (1<<48). Further, the logic in find_mmap_vma tries
about 5 times (with different hints) to get a target-page-aligned
address at a lower address, all of which fail: the kernel continues
to return the (1<<48) address. At which point one wonders why we
should keep refusing the (1<<48) address when the target is in fact
64-bit capable.
I believe the host vs target page size difference plays a part in
this, which is why you wouldn't see this on arm.
All of the other targets with page size larger than 4k are 64 bit,
and set TARGET_VIRT_ADDR_SPACE_BITS to 64. So Alpha was unique in
being an 8k page size with T_B_A_S_B < 48, and so probably unique
in being able to tickle this problem.
r~
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-12 14:27 ` Richard Henderson
@ 2012-06-12 14:53 ` Alexander Graf
2012-06-12 14:57 ` Richard Henderson
0 siblings, 1 reply; 21+ messages in thread
From: Alexander Graf @ 2012-06-12 14:53 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, Peter Maydell, Riku Voipio, Andreas Färber, Paul Brook
On 12.06.2012, at 16:27, Richard Henderson <rth@twiddle.net> wrote:
> On 2012-06-12 07:12, Andreas Färber wrote:
>> This looks fishy to me... why should the kernel use a bigger address
>> space than hardware? For arm on x86_64 such a workaround was not
>> necessary iirc.
>
> I can tell you what I observe. That with a certain sequence of
> allocations the x86_64 kernel will quit accepting an address "near"
> (1<<38) as a hint for where to allocate memory and begin returning
> an addresses near (1<<48).
Hrm, does -R work for you? :)
Alex
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-12 14:53 ` Alexander Graf
@ 2012-06-12 14:57 ` Richard Henderson
2012-06-12 15:11 ` Alexander Graf
0 siblings, 1 reply; 21+ messages in thread
From: Richard Henderson @ 2012-06-12 14:57 UTC (permalink / raw)
To: Alexander Graf
Cc: Peter Maydell, Paul Brook, Riku Voipio, qemu-devel, Andreas Färber
On 2012-06-12 07:53, Alexander Graf wrote:
>
>
> On 12.06.2012, at 16:27, Richard Henderson <rth@twiddle.net> wrote:
>
>> On 2012-06-12 07:12, Andreas Färber wrote:
>>> This looks fishy to me... why should the kernel use a bigger address
>>> space than hardware? For arm on x86_64 such a workaround was not
>>> necessary iirc.
>>
>> I can tell you what I observe. That with a certain sequence of
>> allocations the x86_64 kernel will quit accepting an address "near"
>> (1<<38) as a hint for where to allocate memory and begin returning
>> an addresses near (1<<48).
>
> Hrm, does -R work for you? :)
Lol.
Actually I've tried it a couple of times: -R 32G. And, no, it
doesn't work very well. ;-)
r~
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-12 14:57 ` Richard Henderson
@ 2012-06-12 15:11 ` Alexander Graf
2012-06-12 15:27 ` Richard Henderson
0 siblings, 1 reply; 21+ messages in thread
From: Alexander Graf @ 2012-06-12 15:11 UTC (permalink / raw)
To: Richard Henderson
Cc: Peter Maydell, Paul Brook, Riku Voipio, qemu-devel, Andreas Färber
On 12.06.2012, at 16:57, Richard Henderson <rth@twiddle.net> wrote:
> On 2012-06-12 07:53, Alexander Graf wrote:
>>
>>
>> On 12.06.2012, at 16:27, Richard Henderson <rth@twiddle.net> wrote:
>>
>>> On 2012-06-12 07:12, Andreas Färber wrote:
>>>> This looks fishy to me... why should the kernel use a bigger address
>>>> space than hardware? For arm on x86_64 such a workaround was not
>>>> necessary iirc.
>>>
>>> I can tell you what I observe. That with a certain sequence of
>>> allocations the x86_64 kernel will quit accepting an address "near"
>>> (1<<38) as a hint for where to allocate memory and begin returning
>>> an addresses near (1<<48).
>>
>> Hrm, does -R work for you? :)
>
> Lol.
>
> Actually I've tried it a couple of times: -R 32G.
32G is way too much. Do you have to preallocate such a big address space? Usually 1G should be good enough for most programs, no?
Alex
> And, no, it
> doesn't work very well. ;-)
>
>
> r~
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems
2012-06-12 15:11 ` Alexander Graf
@ 2012-06-12 15:27 ` Richard Henderson
0 siblings, 0 replies; 21+ messages in thread
From: Richard Henderson @ 2012-06-12 15:27 UTC (permalink / raw)
To: Alexander Graf
Cc: Peter Maydell, Riku Voipio, Paul Brook, Andreas Färber, qemu-devel
On 2012-06-12 08:11, Alexander Graf wrote:
> 32G is way too much. Do you have to preallocate such a big address
> space? Usually 1G should be good enough for most programs, no?
The default start to .text is 6G for alpha executables, so anything
less than that + reasonable room will fail for obvious reasons.
One would think that e.g. 8G would be good enough, giving 2G above
the executable for brk and shared library mapping, but... failure.
Alternately, there's some other problem with -R that needs to be
investigated.
That said, problems with ld.so erroring out with ENOMEM went away
with this patch, so...
r~
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling
2012-06-07 22:24 ` [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling Richard Henderson
@ 2012-06-22 14:10 ` Peter Maydell
0 siblings, 0 replies; 21+ messages in thread
From: Peter Maydell @ 2012-06-22 14:10 UTC (permalink / raw)
To: Richard Henderson; +Cc: Riku Voipio, qemu-devel
On 7 June 2012 23:24, Richard Henderson <rth@twiddle.net> wrote:
> Proper signal numbers were not defined, and EXCP_INTERRUPT
> was unhandled, leading to all sorts of subtle confusion.
>
> Signed-off-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
-- PMM
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH
2012-06-07 22:24 ` [Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH Richard Henderson
@ 2012-06-22 14:15 ` Peter Maydell
0 siblings, 0 replies; 21+ messages in thread
From: Peter Maydell @ 2012-06-22 14:15 UTC (permalink / raw)
To: Richard Henderson; +Cc: Riku Voipio, qemu-devel
On 7 June 2012 23:24, Richard Henderson <rth@twiddle.net> wrote:
> And tidy up syscall_defs.h a little bit. For each target, only
> define the bits in arch/target/include/asm/fcntl.h, leaving the
> others to a new asm-generic section below.
This patch is doing two things at once -- could you separate
the refactoring and the "support more O_*" bits, please?
-- PMM
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace
2012-06-07 22:24 ` [Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace Richard Henderson
@ 2012-06-22 14:18 ` Peter Maydell
0 siblings, 0 replies; 21+ messages in thread
From: Peter Maydell @ 2012-06-22 14:18 UTC (permalink / raw)
To: Richard Henderson; +Cc: Riku Voipio, qemu-devel
On 7 June 2012 23:24, Richard Henderson <rth@twiddle.net> wrote:
> Signed-off-by: Richard Henderson <rth@twiddle.net>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
-- PMM
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall.
2012-06-07 22:24 ` [Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall Richard Henderson
@ 2012-06-22 14:27 ` Peter Maydell
0 siblings, 0 replies; 21+ messages in thread
From: Peter Maydell @ 2012-06-22 14:27 UTC (permalink / raw)
To: Richard Henderson; +Cc: Riku Voipio, qemu-devel
On 7 June 2012 23:24, Richard Henderson <rth@twiddle.net> wrote:
> @@ -5880,12 +5880,13 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
> mask = arg2;
> target_to_host_old_sigset(&set, &mask);
>
> - ret = get_errno(sigprocmask(how, &set, &oldset));
> -
> - if (!is_error(ret)) {
> + ret = sigprocmask(how, &set, &oldset);
> + if (is_error(ret)) {
> + ret = get_errno(ret);
> + } else {
This looks kinda bogus. get_errno() is supposed to be used on
something which is a (value-or-negative-for-target-errno) value,
eg what you get out of get_errno(). If you're just testing the
straight return value from the host sigprocmask() then
"if (ret == -1)" or similar would be better.
-- PMM
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2012-06-22 14:27 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-07 22:24 [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 1/9] alpha-linux-user: Fix signal handling Richard Henderson
2012-06-22 14:10 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems Richard Henderson
2012-06-12 14:12 ` Andreas Färber
2012-06-12 14:27 ` Richard Henderson
2012-06-12 14:53 ` Alexander Graf
2012-06-12 14:57 ` Richard Henderson
2012-06-12 15:11 ` Alexander Graf
2012-06-12 15:27 ` Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 3/9] alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH Richard Henderson
2012-06-22 14:15 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 5/9] linux-user: Allocate the right amount of space for non-fixed file maps Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace Richard Henderson
2012-06-22 14:18 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 7/9] alpha-linux-user: Fix a3 error return with v0 error bypass Richard Henderson
2012-06-07 22:24 ` [Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall Richard Henderson
2012-06-22 14:27 ` Peter Maydell
2012-06-07 22:24 ` [Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall Richard Henderson
2012-06-12 13:48 ` [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements Richard Henderson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.