Merge remote-tracking branch 'remotes/riku/linux-user-for-upstream' into staging

* remotes/riku/linux-user-for-upstream:
  User mode support for Linux ELF files with no section header
  linux-user: Return correct errno for unsupported netlink socket
  linux-user: Don't overrun guest buffer in sched_getaffinity
  linux-user/uname: Return correct uname string for x86_64
  linux-user: fix gcc-4.9 compiler error on __{get,put]}_user
  signal/ppc/do_setcontext remove __get_user return check
  signal/sparc64_set_context: remove __get_user checks
  signal/ppc/{save,restore}_user_regs remove __put/get error checks
  signal/all/setup_frame remove __put_user checks
  signal/all/do_sigreturn - remove __get_user checks
  signal/all/do_sigaltstack remove __get_user value check
  signal/sparc/restore_fpu_state: remove
  signal/all: remove return value from restore_sigcontext
  signal/all: remove return value from setup_sigcontext
  signal/all: remove return value from copy_siginfo_to_user
  signal/x86/setup_frame: __put_user cleanup
  signal/all: remove __get/__put_user return value reading

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2014-06-17 16:08:06 +01:00
commit 0360fbd076
5 changed files with 524 additions and 734 deletions

View File

@ -1292,7 +1292,6 @@ static bool elf_check_ehdr(struct elfhdr *ehdr)
return (elf_check_arch(ehdr->e_machine) return (elf_check_arch(ehdr->e_machine)
&& ehdr->e_ehsize == sizeof(struct elfhdr) && ehdr->e_ehsize == sizeof(struct elfhdr)
&& ehdr->e_phentsize == sizeof(struct elf_phdr) && ehdr->e_phentsize == sizeof(struct elf_phdr)
&& ehdr->e_shentsize == sizeof(struct elf_shdr)
&& (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN)); && (ehdr->e_type == ET_EXEC || ehdr->e_type == ET_DYN));
} }

View File

@ -299,7 +299,7 @@ static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
__builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 2, stw_##e##_p, \
__builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 4, stl_##e##_p, \
__builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \ __builtin_choose_expr(sizeof(*(hptr)) == 8, stq_##e##_p, abort)))) \
((hptr), (x)), 0) ((hptr), (x)), (void)0)
#define __get_user_e(x, hptr, e) \ #define __get_user_e(x, hptr, e) \
((x) = (typeof(*hptr))( \ ((x) = (typeof(*hptr))( \
@ -307,7 +307,7 @@ static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
__builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 2, lduw_##e##_p, \
__builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \ __builtin_choose_expr(sizeof(*(hptr)) == 4, ldl_##e##_p, \
__builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \ __builtin_choose_expr(sizeof(*(hptr)) == 8, ldq_##e##_p, abort)))) \
(hptr)), 0) (hptr)), (void)0)
#ifdef TARGET_WORDS_BIGENDIAN #ifdef TARGET_WORDS_BIGENDIAN
# define __put_user(x, hptr) __put_user_e(x, hptr, be) # define __put_user(x, hptr) __put_user_e(x, hptr, be)
@ -326,9 +326,9 @@ static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
({ \ ({ \
abi_ulong __gaddr = (gaddr); \ abi_ulong __gaddr = (gaddr); \
target_type *__hptr; \ target_type *__hptr; \
abi_long __ret; \ abi_long __ret = 0; \
if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \ if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
__ret = __put_user((x), __hptr); \ __put_user((x), __hptr); \
unlock_user(__hptr, __gaddr, sizeof(target_type)); \ unlock_user(__hptr, __gaddr, sizeof(target_type)); \
} else \ } else \
__ret = -TARGET_EFAULT; \ __ret = -TARGET_EFAULT; \
@ -339,9 +339,9 @@ static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
({ \ ({ \
abi_ulong __gaddr = (gaddr); \ abi_ulong __gaddr = (gaddr); \
target_type *__hptr; \ target_type *__hptr; \
abi_long __ret; \ abi_long __ret = 0; \
if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \ if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
__ret = __get_user((x), __hptr); \ __get_user((x), __hptr); \
unlock_user(__hptr, __gaddr, 0); \ unlock_user(__hptr, __gaddr, 0); \
} else { \ } else { \
/* avoid warning */ \ /* avoid warning */ \

File diff suppressed because it is too large Load Diff

View File

@ -1856,7 +1856,7 @@ static abi_long do_socket(int domain, int type, int protocol)
} }
if (domain == PF_NETLINK) if (domain == PF_NETLINK)
return -EAFNOSUPPORT; /* do not NETLINK socket connections possible */ return -TARGET_EAFNOSUPPORT;
ret = get_errno(socket(domain, type, protocol)); ret = get_errno(socket(domain, type, protocol));
if (ret >= 0) { if (ret >= 0) {
ret = sock_flags_fixup(ret, target_type); ret = sock_flags_fixup(ret, target_type);
@ -7438,6 +7438,22 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask)); ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask));
if (!is_error(ret)) { if (!is_error(ret)) {
if (ret > arg2) {
/* More data returned than the caller's buffer will fit.
* This only happens if sizeof(abi_long) < sizeof(long)
* and the caller passed us a buffer holding an odd number
* of abi_longs. If the host kernel is actually using the
* extra 4 bytes then fail EINVAL; otherwise we can just
* ignore them and only copy the interesting part.
*/
int numcpus = sysconf(_SC_NPROCESSORS_CONF);
if (numcpus > arg2 * 8) {
ret = -TARGET_EINVAL;
break;
}
ret = arg2;
}
if (copy_to_user(arg3, mask, ret)) { if (copy_to_user(arg3, mask, ret)) {
goto efault; goto efault;
} }

View File

@ -52,9 +52,7 @@ const char *cpu_to_uname_machine(void *cpu_env)
/* earliest emulated CPU is ARMv5TE; qemu can emulate the 1026, but not its /* earliest emulated CPU is ARMv5TE; qemu can emulate the 1026, but not its
* Jazelle support */ * Jazelle support */
return "armv5te" utsname_suffix; return "armv5te" utsname_suffix;
#elif defined(TARGET_X86_64) #elif defined(TARGET_I386) && !defined(TARGET_X86_64)
return "x86-64";
#elif defined(TARGET_I386)
/* see arch/x86/kernel/cpu/bugs.c: check_bugs(), 386, 486, 586, 686 */ /* see arch/x86/kernel/cpu/bugs.c: check_bugs(), 386, 486, 586, 686 */
CPUState *cpu = ENV_GET_CPU((CPUX86State *)cpu_env); CPUState *cpu = ENV_GET_CPU((CPUX86State *)cpu_env);
int family = object_property_get_int(OBJECT(cpu), "family", NULL); int family = object_property_get_int(OBJECT(cpu), "family", NULL);