diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2016-07-11 16:48:11 +0100 |
---|---|---|
committer | Riku Voipio <riku.voipio@linaro.org> | 2016-09-21 14:28:52 +0300 |
commit | ee8e76141b4dd00f8e97fda274876a17f9a46bbe (patch) | |
tree | 97fad83fed31bae2f164c1a525e13b468e12cfbc /linux-user/sparc | |
parent | 0ef9ea290ed9319cb788ea40be06dd18b32ba05a (diff) | |
download | qemu-ee8e76141b4dd00f8e97fda274876a17f9a46bbe.zip qemu-ee8e76141b4dd00f8e97fda274876a17f9a46bbe.tar.gz qemu-ee8e76141b4dd00f8e97fda274876a17f9a46bbe.tar.bz2 |
linux-user: Use correct target SHMLBA in shmat()
The shmat() handling needs to do target-specific handling
of the attach address for shmat():
* if the SHM_RND flag is passed, the address is rounded
down to a SHMLBA boundary
* if SHM_RND is not passed, then the call is failed EINVAL
if the address is not a multiple of SHMLBA
Since SHMLBA is target-specific, we need to do this
checking and rounding in QEMU and can't leave it up to the
host syscall.
Allow targets to define TARGET_FORCE_SHMLBA and provide
a target_shmlba() function if appropriate, and update
do_shmat() to honour them.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
Diffstat (limited to 'linux-user/sparc')
-rw-r--r-- | linux-user/sparc/target_syscall.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/linux-user/sparc/target_syscall.h b/linux-user/sparc/target_syscall.h index 326f674..f97aa6b 100644 --- a/linux-user/sparc/target_syscall.h +++ b/linux-user/sparc/target_syscall.h @@ -22,4 +22,20 @@ struct target_pt_regs { #define TARGET_MLOCKALL_MCL_CURRENT 0x2000 #define TARGET_MLOCKALL_MCL_FUTURE 0x4000 +/* For SPARC SHMLBA is determined at runtime in the kernel, and + * libc has to runtime-detect it using the hwcaps (see glibc + * sysdeps/unix/sysv/linux/sparc/getshmlba; we follow the same + * logic here, though we know we're not the sparc v9 64-bit case). + */ +#define TARGET_FORCE_SHMLBA + +static inline abi_ulong target_shmlba(CPUSPARCState *env) +{ + if (!(env->def->features & CPU_FEATURE_FLUSH)) { + return 64 * 1024; + } else { + return 256 * 1024; + } +} + #endif /* SPARC_TARGET_SYSCALL_H */ |