late linux-user fixes for Qemu 2.11

-----BEGIN PGP SIGNATURE-----
 
 iQJLBAABCAA1FiEE/4IDyMORmK4FgUHvtEiQ3t48m8AFAloTRsQXHHJpa3Uudm9p
 cGlvQGxpbmFyby5vcmcACgkQtEiQ3t48m8AFrQ//SZRfvk7DASsXvGP55p8Iyql2
 Xw2aaRDlaP5HVJwOnOh1E5wzvERJouvaS2czi2YLTOl9T8pt6mYeyUriU+gBNDQp
 M6hmrvw3yTA6QAcf+s6oIaJeOSY6ymnrTRrnEezbxmDvDyaukcgydlDSh2jk36Ez
 d3R9HLkcLHT4g9wfA6i0DbXI/2jbZQgBOQ0iPyEBzft/dRqflo3qxyzKGRQBLFip
 R2dYl5t0p0gSbc0sIz5cr0R1aCk6JOIua1BqW3t6EClxNt5IKI277JLcI/++cnlW
 BY006iMsrZeR9cRuHsE/1lctqzq0pCZT/XYQmrQdq7XWvKnMWHXfP0Ue5H1UUN1l
 +SnHkQAdW4W12aoC1zgae7YzIrN5jcI5CtuEVZGk7EETt6sJAd8Qs5jcEpGyUViJ
 yh8I99iA5tb1QSCDbEwZTljmA4kyD+tvO4WMOrl9n19QeFXB9qwzFCIpfN/lvuyn
 iZEC94O3IbxfbIpAzrn0ZDgFamusqy8MRrIxmki3QzCdA0m8IUMIfI9qK4X4lOsk
 gSxQnNFuiJLr5AUzQu5OuIeEm9ehwdB3m2UztV8qE5JUKo+slfje9LPNh18TWBf9
 q6bMH5TYm2jvMl6efDN6aVkheMv+T4Yux1kTA4tWbY2zIo9avGgBVprVW+QCq9rP
 L0KJ54c8tjoFcEn1Wow=
 =dddR
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/riku/tags/pull-linux-user-20171120' into staging

late linux-user fixes for Qemu 2.11

# gpg: Signature made Mon 20 Nov 2017 21:19:00 GMT
# gpg:                using RSA key 0xB44890DEDE3C9BC0
# gpg: Good signature from "Riku Voipio <riku.voipio@iki.fi>"
# gpg:                 aka "Riku Voipio <riku.voipio@linaro.org>"
# Primary key fingerprint: FF82 03C8 C391 98AE 0581  41EF B448 90DE DE3C 9BC0

* remotes/riku/tags/pull-linux-user-20171120:
  linux-user: Fix calculation of auxv length
  linux-user: Handle rt_sigaction correctly for SPARC
  linux-user/sparc: Put address for data faults where linux-user expects it
  linux-user/ppc: Report correct fault address for data faults
  linux-user/s390x: Mask si_addr for SIGSEGV
  linux-user: return EINVAL from prctl(PR_*_SECCOMP)
  linux-user: fix 'finshed' typo in comment
  linux-user/syscall.c: Handle SH4's exceptional alignment for p{read, write}64
  linux-user: Handle TARGET_MAP_STACK and TARGET_MAP_HUGETLB
  linux-user/hppa: Fix TARGET_F_RDLCK, TARGET_F_WRLCK, TARGET_F_UNLCK
  linux-user/hppa: Fix TARGET_MAP_TYPE
  linux-user/hppa: Fix typo for TARGET_NR_epoll_wait
  linux-user/hppa: Fix cpu_clone_regs
  linux-user/hppa: Fix TARGET_SA_* defines
  linux-user: Restrict usage of sa_restorer

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-11-21 10:44:44 +00:00
commit 1b4e6e8cf8
8 changed files with 144 additions and 35 deletions

View File

@ -1732,6 +1732,8 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
#ifdef ELF_HWCAP2 #ifdef ELF_HWCAP2
size += 2; size += 2;
#endif #endif
info->auxv_len = size * n;
size += envc + argc + 2; size += envc + argc + 2;
size += 1; /* argc itself */ size += 1; /* argc itself */
size *= n; size *= n;
@ -1760,7 +1762,6 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
put_user_ual(val, u_auxv); u_auxv += n; \ put_user_ual(val, u_auxv); u_auxv += n; \
} while(0) } while(0)
/* There must be exactly DLINFO_ITEMS entries here. */
#ifdef ARCH_DLINFO #ifdef ARCH_DLINFO
/* /*
* ARCH_DLINFO must come first so platform specific code can enforce * ARCH_DLINFO must come first so platform specific code can enforce
@ -1768,6 +1769,9 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
*/ */
ARCH_DLINFO; ARCH_DLINFO;
#endif #endif
/* There must be exactly DLINFO_ITEMS entries here, or the assert
* on info->auxv_len will trigger.
*/
NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff)); NEW_AUX_ENT(AT_PHDR, (abi_ulong)(info->load_addr + exec->e_phoff));
NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr))); NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum)); NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
@ -1793,7 +1797,10 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
NEW_AUX_ENT (AT_NULL, 0); NEW_AUX_ENT (AT_NULL, 0);
#undef NEW_AUX_ENT #undef NEW_AUX_ENT
info->auxv_len = u_argv - info->saved_auxv; /* Check that our initial calculation of the auxv length matches how much
* we actually put into it.
*/
assert(info->auxv_len == u_auxv - info->saved_auxv);
put_user_ual(argc, u_argc); put_user_ual(argc, u_argc);

View File

@ -228,7 +228,7 @@
#define TARGET_NR_lookup_dcookie 223 #define TARGET_NR_lookup_dcookie 223
#define TARGET_NR_epoll_create 224 #define TARGET_NR_epoll_create 224
#define TARGET_NR_epoll_ctl 225 #define TARGET_NR_epoll_ctl 225
#define TARGET_NR_epill_wait 226 #define TARGET_NR_epoll_wait 226
#define TARGET_NR_remap_file_pages 227 #define TARGET_NR_remap_file_pages 227
#define TARGET_NR_semtimedop 228 #define TARGET_NR_semtimedop 228
#define TARGET_NR_mq_open 229 #define TARGET_NR_mq_open 229

View File

@ -24,7 +24,11 @@ static inline void cpu_clone_regs(CPUHPPAState *env, target_ulong newsp)
if (newsp) { if (newsp) {
env->gr[30] = newsp; env->gr[30] = newsp;
} }
/* Indicate child in return value. */
env->gr[28] = 0; env->gr[28] = 0;
/* Return from the syscall. */
env->iaoq_f = env->gr[31];
env->iaoq_b = env->gr[31] + 4;
} }
static inline void cpu_set_tls(CPUHPPAState *env, target_ulong newtls) static inline void cpu_set_tls(CPUHPPAState *env, target_ulong newtls)

View File

@ -1420,7 +1420,7 @@ void cpu_loop(CPUPPCState *env)
info.si_code = TARGET_SEGV_MAPERR; info.si_code = TARGET_SEGV_MAPERR;
break; break;
} }
info._sifields._sigfault._addr = env->nip; info._sifields._sigfault._addr = env->spr[SPR_DAR];
queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info);
break; break;
case POWERPC_EXCP_ISI: /* Instruction storage exception */ case POWERPC_EXCP_ISI: /* Instruction storage exception */
@ -3238,6 +3238,10 @@ void cpu_loop(CPUAlphaState *env)
#endif /* TARGET_ALPHA */ #endif /* TARGET_ALPHA */
#ifdef TARGET_S390X #ifdef TARGET_S390X
/* s390x masks the fault address it reports in si_addr for SIGSEGV and SIGBUS */
#define S390X_FAIL_ADDR_MASK -4096LL
void cpu_loop(CPUS390XState *env) void cpu_loop(CPUS390XState *env)
{ {
CPUState *cs = CPU(s390_env_get_cpu(env)); CPUState *cs = CPU(s390_env_get_cpu(env));
@ -3294,7 +3298,7 @@ void cpu_loop(CPUS390XState *env)
sig = TARGET_SIGSEGV; sig = TARGET_SIGSEGV;
/* XXX: check env->error_code */ /* XXX: check env->error_code */
n = TARGET_SEGV_MAPERR; n = TARGET_SEGV_MAPERR;
addr = env->__excp_addr; addr = env->__excp_addr & S390X_FAIL_ADDR_MASK;
goto do_signal; goto do_signal;
case PGM_EXECUTE: case PGM_EXECUTE:
case PGM_SPECIFICATION: case PGM_SPECIFICATION:

View File

@ -777,7 +777,7 @@ int do_sigaction(int sig, const struct target_sigaction *act,
if (oact) { if (oact) {
__put_user(k->_sa_handler, &oact->_sa_handler); __put_user(k->_sa_handler, &oact->_sa_handler);
__put_user(k->sa_flags, &oact->sa_flags); __put_user(k->sa_flags, &oact->sa_flags);
#if !defined(TARGET_MIPS) #ifdef TARGET_ARCH_HAS_SA_RESTORER
__put_user(k->sa_restorer, &oact->sa_restorer); __put_user(k->sa_restorer, &oact->sa_restorer);
#endif #endif
/* Not swapped. */ /* Not swapped. */
@ -787,7 +787,7 @@ int do_sigaction(int sig, const struct target_sigaction *act,
/* FIXME: This is not threadsafe. */ /* FIXME: This is not threadsafe. */
__get_user(k->_sa_handler, &act->_sa_handler); __get_user(k->_sa_handler, &act->_sa_handler);
__get_user(k->sa_flags, &act->sa_flags); __get_user(k->sa_flags, &act->sa_flags);
#if !defined(TARGET_MIPS) #ifdef TARGET_ARCH_HAS_SA_RESTORER
__get_user(k->sa_restorer, &act->sa_restorer); __get_user(k->sa_restorer, &act->sa_restorer);
#endif #endif
/* To be swapped in target_to_host_sigset. */ /* To be swapped in target_to_host_sigset. */

View File

@ -671,18 +671,32 @@ static inline int next_free_host_timer(void)
/* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */ /* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */
#ifdef TARGET_ARM #ifdef TARGET_ARM
static inline int regpairs_aligned(void *cpu_env) { static inline int regpairs_aligned(void *cpu_env, int num)
{
return ((((CPUARMState *)cpu_env)->eabi) == 1) ; return ((((CPUARMState *)cpu_env)->eabi) == 1) ;
} }
#elif defined(TARGET_MIPS) && (TARGET_ABI_BITS == 32) #elif defined(TARGET_MIPS) && (TARGET_ABI_BITS == 32)
static inline int regpairs_aligned(void *cpu_env) { return 1; } static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
#elif defined(TARGET_PPC) && !defined(TARGET_PPC64) #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
/* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pairs /* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pairs
* of registers which translates to the same as ARM/MIPS, because we start with * of registers which translates to the same as ARM/MIPS, because we start with
* r3 as arg1 */ * r3 as arg1 */
static inline int regpairs_aligned(void *cpu_env) { return 1; } static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
#elif defined(TARGET_SH4)
/* SH4 doesn't align register pairs, except for p{read,write}64 */
static inline int regpairs_aligned(void *cpu_env, int num)
{
switch (num) {
case TARGET_NR_pread64:
case TARGET_NR_pwrite64:
return 1;
default:
return 0;
}
}
#else #else
static inline int regpairs_aligned(void *cpu_env) { return 0; } static inline int regpairs_aligned(void *cpu_env, int num) { return 0; }
#endif #endif
#define ERRNO_TABLE_SIZE 1200 #define ERRNO_TABLE_SIZE 1200
@ -5872,17 +5886,26 @@ static const StructEntry struct_termios_def = {
}; };
static bitmask_transtbl mmap_flags_tbl[] = { static bitmask_transtbl mmap_flags_tbl[] = {
{ TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED }, { TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED },
{ TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE }, { TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE },
{ TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED }, { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED },
{ TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS, MAP_ANONYMOUS, MAP_ANONYMOUS }, { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS,
{ TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN, MAP_GROWSDOWN, MAP_GROWSDOWN }, MAP_ANONYMOUS, MAP_ANONYMOUS },
{ TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, MAP_DENYWRITE, MAP_DENYWRITE }, { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN,
{ TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, MAP_EXECUTABLE, MAP_EXECUTABLE }, MAP_GROWSDOWN, MAP_GROWSDOWN },
{ TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED }, { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE,
{ TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE, MAP_NORESERVE, MAP_DENYWRITE, MAP_DENYWRITE },
MAP_NORESERVE }, { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE,
{ 0, 0, 0, 0 } MAP_EXECUTABLE, MAP_EXECUTABLE },
{ TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED },
{ TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE,
MAP_NORESERVE, MAP_NORESERVE },
{ TARGET_MAP_HUGETLB, TARGET_MAP_HUGETLB, MAP_HUGETLB, MAP_HUGETLB },
/* MAP_STACK had been ignored by the kernel for quite some time.
Recognize it for the target insofar as we do not want to pass
it through to the host. */
{ TARGET_MAP_STACK, TARGET_MAP_STACK, 0, 0 },
{ 0, 0, 0, 0 }
}; };
#if defined(TARGET_I386) #if defined(TARGET_I386)
@ -6235,7 +6258,7 @@ static void *clone_func(void *arg)
pthread_mutex_lock(&info->mutex); pthread_mutex_lock(&info->mutex);
pthread_cond_broadcast(&info->cond); pthread_cond_broadcast(&info->cond);
pthread_mutex_unlock(&info->mutex); pthread_mutex_unlock(&info->mutex);
/* Wait until the parent has finshed initializing the tls state. */ /* Wait until the parent has finished initializing the tls state. */
pthread_mutex_lock(&clone_lock); pthread_mutex_lock(&clone_lock);
pthread_mutex_unlock(&clone_lock); pthread_mutex_unlock(&clone_lock);
cpu_loop(env); cpu_loop(env);
@ -6861,7 +6884,7 @@ static inline abi_long target_truncate64(void *cpu_env, const char *arg1,
abi_long arg3, abi_long arg3,
abi_long arg4) abi_long arg4)
{ {
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, TARGET_NR_truncate64)) {
arg2 = arg3; arg2 = arg3;
arg3 = arg4; arg3 = arg4;
} }
@ -6875,7 +6898,7 @@ static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1,
abi_long arg3, abi_long arg3,
abi_long arg4) abi_long arg4)
{ {
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, TARGET_NR_ftruncate64)) {
arg2 = arg3; arg2 = arg3;
arg3 = arg4; arg3 = arg4;
} }
@ -8556,8 +8579,16 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
case TARGET_NR_rt_sigaction: case TARGET_NR_rt_sigaction:
{ {
#if defined(TARGET_ALPHA) #if defined(TARGET_ALPHA)
struct target_sigaction act, oact, *pact = 0; /* For Alpha and SPARC this is a 5 argument syscall, with
* a 'restorer' parameter which must be copied into the
* sa_restorer field of the sigaction struct.
* For Alpha that 'restorer' is arg5; for SPARC it is arg4,
* and arg5 is the sigsetsize.
* Alpha also has a separate rt_sigaction struct that it uses
* here; SPARC uses the usual sigaction struct.
*/
struct target_rt_sigaction *rt_act; struct target_rt_sigaction *rt_act;
struct target_sigaction act, oact, *pact = 0;
if (arg4 != sizeof(target_sigset_t)) { if (arg4 != sizeof(target_sigset_t)) {
ret = -TARGET_EINVAL; ret = -TARGET_EINVAL;
@ -8583,18 +8614,29 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
unlock_user_struct(rt_act, arg3, 1); unlock_user_struct(rt_act, arg3, 1);
} }
#else #else
#ifdef TARGET_SPARC
target_ulong restorer = arg4;
target_ulong sigsetsize = arg5;
#else
target_ulong sigsetsize = arg4;
#endif
struct target_sigaction *act; struct target_sigaction *act;
struct target_sigaction *oact; struct target_sigaction *oact;
if (arg4 != sizeof(target_sigset_t)) { if (sigsetsize != sizeof(target_sigset_t)) {
ret = -TARGET_EINVAL; ret = -TARGET_EINVAL;
break; break;
} }
if (arg2) { if (arg2) {
if (!lock_user_struct(VERIFY_READ, act, arg2, 1)) if (!lock_user_struct(VERIFY_READ, act, arg2, 1)) {
goto efault; goto efault;
} else }
#ifdef TARGET_SPARC
act->sa_restorer = restorer;
#endif
} else {
act = NULL; act = NULL;
}
if (arg3) { if (arg3) {
if (!lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) { if (!lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) {
ret = -TARGET_EFAULT; ret = -TARGET_EFAULT;
@ -10482,6 +10524,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
break; break;
} }
#endif #endif
case PR_GET_SECCOMP:
case PR_SET_SECCOMP:
/* Disable seccomp to prevent the target disabling syscalls we
* need. */
ret = -TARGET_EINVAL;
break;
default: default:
/* Most prctl options have no pointer arguments */ /* Most prctl options have no pointer arguments */
ret = get_errno(prctl(arg1, arg2, arg3, arg4, arg5)); ret = get_errno(prctl(arg1, arg2, arg3, arg4, arg5));
@ -10499,7 +10547,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#endif #endif
#ifdef TARGET_NR_pread64 #ifdef TARGET_NR_pread64
case TARGET_NR_pread64: case TARGET_NR_pread64:
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, num)) {
arg4 = arg5; arg4 = arg5;
arg5 = arg6; arg5 = arg6;
} }
@ -10509,7 +10557,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
unlock_user(p, arg2, ret); unlock_user(p, arg2, ret);
break; break;
case TARGET_NR_pwrite64: case TARGET_NR_pwrite64:
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, num)) {
arg4 = arg5; arg4 = arg5;
arg5 = arg6; arg5 = arg6;
} }
@ -11279,7 +11327,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
arg6 = ret; arg6 = ret;
#else #else
/* 6 args: fd, offset (high, low), len (high, low), advice */ /* 6 args: fd, offset (high, low), len (high, low), advice */
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, num)) {
/* offset is in (3,4), len in (5,6) and advice in 7 */ /* offset is in (3,4), len in (5,6) and advice in 7 */
arg2 = arg3; arg2 = arg3;
arg3 = arg4; arg3 = arg4;
@ -11298,7 +11346,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#ifdef TARGET_NR_fadvise64 #ifdef TARGET_NR_fadvise64
case TARGET_NR_fadvise64: case TARGET_NR_fadvise64:
/* 5 args: fd, offset (high, low), len, advice */ /* 5 args: fd, offset (high, low), len, advice */
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, num)) {
/* offset is in (3,4), len in 5 and advice in 6 */ /* offset is in (3,4), len in 5 and advice in 6 */
arg2 = arg3; arg2 = arg3;
arg3 = arg4; arg3 = arg4;
@ -11411,7 +11459,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
#ifdef TARGET_NR_readahead #ifdef TARGET_NR_readahead
case TARGET_NR_readahead: case TARGET_NR_readahead:
#if TARGET_ABI_BITS == 32 #if TARGET_ABI_BITS == 32
if (regpairs_aligned(cpu_env)) { if (regpairs_aligned(cpu_env, num)) {
arg2 = arg3; arg2 = arg3;
arg3 = arg4; arg3 = arg4;
arg4 = arg5; arg4 = arg5;

View File

@ -445,6 +445,7 @@ int do_sigaction(int sig, const struct target_sigaction *act,
#define TARGET_SA_RESTART 2u #define TARGET_SA_RESTART 2u
#define TARGET_SA_NODEFER 0x20u #define TARGET_SA_NODEFER 0x20u
#define TARGET_SA_RESETHAND 4u #define TARGET_SA_RESETHAND 4u
#define TARGET_ARCH_HAS_SA_RESTORER 1
#elif defined(TARGET_MIPS) #elif defined(TARGET_MIPS)
#define TARGET_SA_NOCLDSTOP 0x00000001 #define TARGET_SA_NOCLDSTOP 0x00000001
#define TARGET_SA_NOCLDWAIT 0x00010000 #define TARGET_SA_NOCLDWAIT 0x00010000
@ -472,6 +473,14 @@ int do_sigaction(int sig, const struct target_sigaction *act,
#define TARGET_SA_RESETHAND 0x00000010 #define TARGET_SA_RESETHAND 0x00000010
#define TARGET_SA_NOCLDWAIT 0x00000020 /* not supported yet */ #define TARGET_SA_NOCLDWAIT 0x00000020 /* not supported yet */
#define TARGET_SA_SIGINFO 0x00000040 #define TARGET_SA_SIGINFO 0x00000040
#elif defined(TARGET_HPPA)
#define TARGET_SA_ONSTACK 0x00000001
#define TARGET_SA_RESETHAND 0x00000004
#define TARGET_SA_NOCLDSTOP 0x00000008
#define TARGET_SA_SIGINFO 0x00000010
#define TARGET_SA_NODEFER 0x00000020
#define TARGET_SA_RESTART 0x00000040
#define TARGET_SA_NOCLDWAIT 0x00000080
#else #else
#define TARGET_SA_NOCLDSTOP 0x00000001 #define TARGET_SA_NOCLDSTOP 0x00000001
#define TARGET_SA_NOCLDWAIT 0x00000002 /* not supported yet */ #define TARGET_SA_NOCLDWAIT 0x00000002 /* not supported yet */
@ -483,6 +492,10 @@ int do_sigaction(int sig, const struct target_sigaction *act,
#define TARGET_SA_RESTORER 0x04000000 #define TARGET_SA_RESTORER 0x04000000
#endif #endif
#ifdef TARGET_SA_RESTORER
#define TARGET_ARCH_HAS_SA_RESTORER 1
#endif
#if defined(TARGET_ALPHA) #if defined(TARGET_ALPHA)
#define TARGET_SIGHUP 1 #define TARGET_SIGHUP 1
@ -718,19 +731,27 @@ struct target_sigaction {
abi_ulong _sa_handler; abi_ulong _sa_handler;
#endif #endif
target_sigset_t sa_mask; target_sigset_t sa_mask;
#ifdef TARGET_ARCH_HAS_SA_RESTORER
/* ??? This is always present, but ignored unless O32. */
abi_ulong sa_restorer;
#endif
}; };
#else #else
struct target_old_sigaction { struct target_old_sigaction {
abi_ulong _sa_handler; abi_ulong _sa_handler;
abi_ulong sa_mask; abi_ulong sa_mask;
abi_ulong sa_flags; abi_ulong sa_flags;
#ifdef TARGET_ARCH_HAS_SA_RESTORER
abi_ulong sa_restorer; abi_ulong sa_restorer;
#endif
}; };
struct target_sigaction { struct target_sigaction {
abi_ulong _sa_handler; abi_ulong _sa_handler;
abi_ulong sa_flags; abi_ulong sa_flags;
#ifdef TARGET_ARCH_HAS_SA_RESTORER
abi_ulong sa_restorer; abi_ulong sa_restorer;
#endif
target_sigset_t sa_mask; target_sigset_t sa_mask;
}; };
#endif #endif
@ -1315,7 +1336,11 @@ struct target_winsize {
/* Common */ /* Common */
#define TARGET_MAP_SHARED 0x01 /* Share changes */ #define TARGET_MAP_SHARED 0x01 /* Share changes */
#define TARGET_MAP_PRIVATE 0x02 /* Changes are private */ #define TARGET_MAP_PRIVATE 0x02 /* Changes are private */
#define TARGET_MAP_TYPE 0x0f /* Mask for type of mapping */ #if defined(TARGET_HPPA)
#define TARGET_MAP_TYPE 0x03 /* Mask for type of mapping */
#else
#define TARGET_MAP_TYPE 0x0f /* Mask for type of mapping */
#endif
/* Target specific */ /* Target specific */
#if defined(TARGET_MIPS) #if defined(TARGET_MIPS)
@ -1328,6 +1353,8 @@ struct target_winsize {
#define TARGET_MAP_NORESERVE 0x0400 /* don't check for reservations */ #define TARGET_MAP_NORESERVE 0x0400 /* don't check for reservations */
#define TARGET_MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ #define TARGET_MAP_POPULATE 0x10000 /* populate (prefault) pagetables */
#define TARGET_MAP_NONBLOCK 0x20000 /* do not block on IO */ #define TARGET_MAP_NONBLOCK 0x20000 /* do not block on IO */
#define TARGET_MAP_STACK 0x40000 /* ignored */
#define TARGET_MAP_HUGETLB 0x80000 /* create a huge page mapping */
#elif defined(TARGET_PPC) #elif defined(TARGET_PPC)
#define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */ #define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */
#define TARGET_MAP_ANONYMOUS 0x20 /* don't use a file */ #define TARGET_MAP_ANONYMOUS 0x20 /* don't use a file */
@ -1338,6 +1365,8 @@ struct target_winsize {
#define TARGET_MAP_NORESERVE 0x0040 /* don't check for reservations */ #define TARGET_MAP_NORESERVE 0x0040 /* don't check for reservations */
#define TARGET_MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define TARGET_MAP_POPULATE 0x8000 /* populate (prefault) pagetables */
#define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */ #define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */
#define TARGET_MAP_STACK 0x20000 /* ignored */
#define TARGET_MAP_HUGETLB 0x40000 /* create a huge page mapping */
#elif defined(TARGET_ALPHA) #elif defined(TARGET_ALPHA)
#define TARGET_MAP_ANONYMOUS 0x10 /* don't use a file */ #define TARGET_MAP_ANONYMOUS 0x10 /* don't use a file */
#define TARGET_MAP_FIXED 0x100 /* Interpret addr exactly */ #define TARGET_MAP_FIXED 0x100 /* Interpret addr exactly */
@ -1348,6 +1377,8 @@ struct target_winsize {
#define TARGET_MAP_NORESERVE 0x10000 /* no check for reservations */ #define TARGET_MAP_NORESERVE 0x10000 /* no check for reservations */
#define TARGET_MAP_POPULATE 0x20000 /* pop (prefault) pagetables */ #define TARGET_MAP_POPULATE 0x20000 /* pop (prefault) pagetables */
#define TARGET_MAP_NONBLOCK 0x40000 /* do not block on IO */ #define TARGET_MAP_NONBLOCK 0x40000 /* do not block on IO */
#define TARGET_MAP_STACK 0x80000 /* ignored */
#define TARGET_MAP_HUGETLB 0x100000 /* create a huge page mapping */
#elif defined(TARGET_HPPA) #elif defined(TARGET_HPPA)
#define TARGET_MAP_ANONYMOUS 0x10 /* don't use a file */ #define TARGET_MAP_ANONYMOUS 0x10 /* don't use a file */
#define TARGET_MAP_FIXED 0x04 /* Interpret addr exactly */ #define TARGET_MAP_FIXED 0x04 /* Interpret addr exactly */
@ -1358,6 +1389,8 @@ struct target_winsize {
#define TARGET_MAP_NORESERVE 0x04000 /* no check for reservations */ #define TARGET_MAP_NORESERVE 0x04000 /* no check for reservations */
#define TARGET_MAP_POPULATE 0x10000 /* pop (prefault) pagetables */ #define TARGET_MAP_POPULATE 0x10000 /* pop (prefault) pagetables */
#define TARGET_MAP_NONBLOCK 0x20000 /* do not block on IO */ #define TARGET_MAP_NONBLOCK 0x20000 /* do not block on IO */
#define TARGET_MAP_STACK 0x40000 /* ignored */
#define TARGET_MAP_HUGETLB 0x80000 /* create a huge page mapping */
#else #else
#define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */ #define TARGET_MAP_FIXED 0x10 /* Interpret addr exactly */
#define TARGET_MAP_ANONYMOUS 0x20 /* don't use a file */ #define TARGET_MAP_ANONYMOUS 0x20 /* don't use a file */
@ -1368,6 +1401,8 @@ struct target_winsize {
#define TARGET_MAP_NORESERVE 0x4000 /* don't check for reservations */ #define TARGET_MAP_NORESERVE 0x4000 /* don't check for reservations */
#define TARGET_MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define TARGET_MAP_POPULATE 0x8000 /* populate (prefault) pagetables */
#define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */ #define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */
#define TARGET_MAP_STACK 0x20000 /* ignored */
#define TARGET_MAP_HUGETLB 0x40000 /* create a huge page mapping */
#define TARGET_MAP_UNINITIALIZED 0x4000000 /* for anonymous mmap, memory could be uninitialized */ #define TARGET_MAP_UNINITIALIZED 0x4000000 /* for anonymous mmap, memory could be uninitialized */
#endif #endif
@ -2336,6 +2371,9 @@ struct target_statfs64 {
#define TARGET_F_SETOWN 24 /* for sockets. */ #define TARGET_F_SETOWN 24 /* for sockets. */
#define TARGET_F_GETOWN 23 /* for sockets. */ #define TARGET_F_GETOWN 23 /* for sockets. */
#elif defined(TARGET_HPPA) #elif defined(TARGET_HPPA)
#define TARGET_F_RDLCK 1
#define TARGET_F_WRLCK 2
#define TARGET_F_UNLCK 3
#define TARGET_F_GETLK 5 #define TARGET_F_GETLK 5
#define TARGET_F_SETLK 6 #define TARGET_F_SETLK 6
#define TARGET_F_SETLKW 7 #define TARGET_F_SETLKW 7

View File

@ -30,10 +30,18 @@
int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, int sparc_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw,
int mmu_idx) int mmu_idx)
{ {
SPARCCPU *cpu = SPARC_CPU(cs);
CPUSPARCState *env = &cpu->env;
if (rw & 2) { if (rw & 2) {
cs->exception_index = TT_TFAULT; cs->exception_index = TT_TFAULT;
} else { } else {
cs->exception_index = TT_DFAULT; cs->exception_index = TT_DFAULT;
#ifdef TARGET_SPARC64
env->dmmu.mmuregs[4] = address;
#else
env->mmuregs[4] = address;
#endif
} }
return 1; return 1;
} }