summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2014-02-21 11:47:28 +0000
committerPeter Maydell <peter.maydell@linaro.org>2014-02-21 11:47:28 +0000
commit9bd9d5e3573ea0465b8eb5700e867674054d27f3 (patch)
treebf6a3d41697b14986a0b690d9ad0aec868e5f236
parent774d566cdbebb916af9760dac629aa7c1adf9d3d (diff)
parent69d4c703a549f0630793a67b16a8fc6bc14c8654 (diff)
downloadqemu-9bd9d5e3573ea0465b8eb5700e867674054d27f3.tar.gz
qemu-9bd9d5e3573ea0465b8eb5700e867674054d27f3.tar.bz2
qemu-9bd9d5e3573ea0465b8eb5700e867674054d27f3.zip
Merge remote-tracking branch 'remotes/riku/linux-user-for-upstream' into staging
* remotes/riku/linux-user-for-upstream: linux-user: Fix error handling in target_to_host_semarray() linux-user: Implement BLKPG ioctl linux-user: Fix error handling in lock_iovec() linux-user/signal.c: Don't pass sigaction uninitialised sa_flags linux-user/elfload.c: Avoid calling g_free() on uninitialized data linux-user: sync syscall numbers upto 3.13 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--linux-user/alpha/syscall_nr.h7
-rw-r--r--linux-user/arm/syscall_nr.h6
-rw-r--r--linux-user/cris/syscall_nr.h1
-rw-r--r--linux-user/elfload.c16
-rw-r--r--linux-user/i386/syscall_nr.h6
-rw-r--r--linux-user/ioctls.h1
-rw-r--r--linux-user/m68k/syscall_nr.h5
-rw-r--r--linux-user/microblaze/syscall_nr.h7
-rw-r--r--linux-user/mips/syscall_nr.h6
-rw-r--r--linux-user/mips64/syscall_nr.h13
-rw-r--r--linux-user/openrisc/syscall_nr.h6
-rw-r--r--linux-user/ppc/syscall_nr.h6
-rw-r--r--linux-user/s390x/syscall_nr.h7
-rw-r--r--linux-user/sh4/syscall_nr.h6
-rw-r--r--linux-user/signal.c1
-rw-r--r--linux-user/sparc/syscall_nr.h7
-rw-r--r--linux-user/sparc64/syscall_nr.h7
-rw-r--r--linux-user/syscall.c20
-rw-r--r--linux-user/syscall_defs.h1
-rw-r--r--linux-user/syscall_types.h13
-rw-r--r--linux-user/x86_64/syscall_nr.h7
21 files changed, 136 insertions, 13 deletions
diff --git a/linux-user/alpha/syscall_nr.h b/linux-user/alpha/syscall_nr.h
index d52d76e08e..625f301674 100644
--- a/linux-user/alpha/syscall_nr.h
+++ b/linux-user/alpha/syscall_nr.h
@@ -433,3 +433,10 @@
#define TARGET_NR_open_by_handle_at 498
#define TARGET_NR_clock_adjtime 499
#define TARGET_NR_syncfs 500
+#define TARGET_NR_setns 501
+#define TARGET_NR_accept4 502
+#define TARGET_NR_sendmmsg 503
+#define TARGET_NR_process_vm_readv 504
+#define TARGET_NR_process_vm_writev 505
+#define TARGET_NR_kcmp 506
+#define TARGET_NR_finit_module 507
diff --git a/linux-user/arm/syscall_nr.h b/linux-user/arm/syscall_nr.h
index 42d68550dc..bef847cfae 100644
--- a/linux-user/arm/syscall_nr.h
+++ b/linux-user/arm/syscall_nr.h
@@ -378,3 +378,9 @@
#define TARGET_NR_open_by_handle_at (371)
#define TARGET_NR_clock_adjtime (372)
#define TARGET_NR_syncfs (373)
+#define TARGET_NR_sendmmsg (374)
+#define TARGET_NR_setns (375)
+#define TARGET_NR_process_vm_readv (376)
+#define TARGET_NR_process_vm_writev (377)
+#define TARGET_NR_kcmp (378)
+#define TARGET_NR_finit_module (379)
diff --git a/linux-user/cris/syscall_nr.h b/linux-user/cris/syscall_nr.h
index 98f1a0b415..694bd02fa5 100644
--- a/linux-user/cris/syscall_nr.h
+++ b/linux-user/cris/syscall_nr.h
@@ -335,3 +335,4 @@
#define TARGET_NR_inotify_init1 332
#define TARGET_NR_preadv 333
#define TARGET_NR_pwritev 334
+#define TARGET_NR_setns 335
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 5902f162b4..c0687e3b38 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -2636,6 +2636,16 @@ static void fill_thread_info(struct elf_note_info *info, const CPUArchState *env
info->notes_size += note_size(&ets->notes[0]);
}
+static void init_note_info(struct elf_note_info *info)
+{
+ /* Initialize the elf_note_info structure so that it is at
+ * least safe to call free_note_info() on it. Must be
+ * called before calling fill_note_info().
+ */
+ memset(info, 0, sizeof (*info));
+ QTAILQ_INIT(&info->thread_list);
+}
+
static int fill_note_info(struct elf_note_info *info,
long signr, const CPUArchState *env)
{
@@ -2644,10 +2654,6 @@ static int fill_note_info(struct elf_note_info *info,
TaskState *ts = (TaskState *)env->opaque;
int i;
- (void) memset(info, 0, sizeof (*info));
-
- QTAILQ_INIT(&info->thread_list);
-
info->notes = g_malloc0(NUMNOTES * sizeof (struct memelfnote));
if (info->notes == NULL)
return (-ENOMEM);
@@ -2781,6 +2787,8 @@ static int elf_core_dump(int signr, const CPUArchState *env)
int segs = 0;
int fd = -1;
+ init_note_info(&info);
+
errno = 0;
getrlimit(RLIMIT_CORE, &dumpsize);
if (dumpsize.rlim_cur == 0)
diff --git a/linux-user/i386/syscall_nr.h b/linux-user/i386/syscall_nr.h
index f0803050d8..c8f7302194 100644
--- a/linux-user/i386/syscall_nr.h
+++ b/linux-user/i386/syscall_nr.h
@@ -347,3 +347,9 @@
#define TARGET_NR_open_by_handle_at 342
#define TARGET_NR_clock_adjtime 343
#define TARGET_NR_syncfs 344
+#define TARGET_NR_sendmmsg 345
+#define TARGET_NR_setns 346
+#define TARGET_NR_process_vm_readv 347
+#define TARGET_NR_process_vm_writev 348
+#define TARGET_NR_kcmp 349
+#define TARGET_NR_finit_module 350
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index 7381012d3d..309fb21759 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -77,6 +77,7 @@
IOCTL(BLKRAGET, IOC_R, MK_PTR(TYPE_LONG))
IOCTL(BLKSSZGET, IOC_R, MK_PTR(TYPE_LONG))
IOCTL(BLKBSZGET, IOC_R, MK_PTR(TYPE_INT))
+ IOCTL(BLKPG, IOC_W, MK_PTR(MK_STRUCT(STRUCT_blkpg_ioctl_arg)))
#ifdef FIBMAP
IOCTL(FIBMAP, IOC_W | IOC_R, MK_PTR(TYPE_LONG))
#endif
diff --git a/linux-user/m68k/syscall_nr.h b/linux-user/m68k/syscall_nr.h
index 4d0937e505..25f8521ec3 100644
--- a/linux-user/m68k/syscall_nr.h
+++ b/linux-user/m68k/syscall_nr.h
@@ -344,3 +344,8 @@
#define TARGET_NR_open_by_handle_at 341
#define TARGET_NR_clock_adjtime 342
#define TARGET_NR_syncfs 343
+#define TARGET_NR_setns 344
+#define TARGET_NR_process_vm_readv 345
+#define TARGET_NR_process_vm_writev 346
+#define TARGET_NR_kcmp 347
+#define TARGET_NR_finit_module 348
diff --git a/linux-user/microblaze/syscall_nr.h b/linux-user/microblaze/syscall_nr.h
index f1fe0e7d8f..6f530f9d1e 100644
--- a/linux-user/microblaze/syscall_nr.h
+++ b/linux-user/microblaze/syscall_nr.h
@@ -376,4 +376,9 @@
#define TARGET_NR_open_by_handle_at 372
#define TARGET_NR_clock_adjtime 373
#define TARGET_NR_syncfs 374
-
+#define TARGET_NR_setns 375
+#define TARGET_NR_sendmmsg 376
+#define TARGET_NR_process_vm_readv 377
+#define TARGET_NR_process_vm_writev 378
+#define TARGET_NR_kcmp 379
+#define TARGET_NR_finit_module 380
diff --git a/linux-user/mips/syscall_nr.h b/linux-user/mips/syscall_nr.h
index fbdc348ffc..2d1a13ee2f 100644
--- a/linux-user/mips/syscall_nr.h
+++ b/linux-user/mips/syscall_nr.h
@@ -345,3 +345,9 @@
#define TARGET_NR_open_by_handle_at (TARGET_NR_Linux + 340)
#define TARGET_NR_clock_adjtime (TARGET_NR_Linux + 341)
#define TARGET_NR_syncfs (TARGET_NR_Linux + 342)
+#define TARGET_NR_sendmmsg (TARGET_NR_Linux + 343)
+#define TARGET_NR_setns (TARGET_NR_Linux + 344)
+#define TARGET_NR_process_vm_readv (TARGET_NR_Linux + 345)
+#define TARGET_NR_process_vm_writev (TARGET_NR_Linux + 346)
+#define TARGET_NR_kcmp (TARGET_NR_Linux + 347)
+#define TARGET_NR_finit_module (TARGET_NR_Linux + 348)
diff --git a/linux-user/mips64/syscall_nr.h b/linux-user/mips64/syscall_nr.h
index 0f4a6b107b..004232a8a2 100644
--- a/linux-user/mips64/syscall_nr.h
+++ b/linux-user/mips64/syscall_nr.h
@@ -310,6 +310,12 @@
#define TARGET_NR_open_by_handle_at (TARGET_NR_Linux + 304)
#define TARGET_NR_clock_adjtime (TARGET_NR_Linux + 305)
#define TARGET_NR_syncfs (TARGET_NR_Linux + 306)
+#define TARGET_NR_sendmmsg (TARGET_NR_Linux + 307)
+#define TARGET_NR_setns (TARGET_NR_Linux + 308)
+#define TARGET_NR_process_vm_readv (TARGET_NR_Linux + 309)
+#define TARGET_NR_process_vm_writev (TARGET_NR_Linux + 310)
+#define TARGET_NR_kcmp (TARGET_NR_Linux + 311)
+#define TARGET_NR_finit_module (TARGET_NR_Linux + 312)
#else
/*
* Linux 64-bit syscalls are in the range from 5000 to 5999.
@@ -617,4 +623,11 @@
#define TARGET_NR_open_by_handle_at (TARGET_NR_Linux + 299)
#define TARGET_NR_clock_adjtime (TARGET_NR_Linux + 300)
#define TARGET_NR_syncfs (TARGET_NR_Linux + 301)
+#define TARGET_NR_sendmmsg (TARGET_NR_Linux + 302)
+#define TARGET_NR_setns (TARGET_NR_Linux + 303)
+#define TARGET_NR_process_vm_readv (TARGET_NR_Linux + 304)
+#define TARGET_NR_process_vm_writev (TARGET_NR_Linux + 305)
+#define TARGET_NR_kcmp (TARGET_NR_Linux + 306)
+#define TARGET_NR_finit_module (TARGET_NR_Linux + 307)
+#define TARGET_NR_getdents64 (TARGET_NR_Linux + 308)
#endif
diff --git a/linux-user/openrisc/syscall_nr.h b/linux-user/openrisc/syscall_nr.h
index f4ac91ef71..4c386eae98 100644
--- a/linux-user/openrisc/syscall_nr.h
+++ b/linux-user/openrisc/syscall_nr.h
@@ -378,9 +378,13 @@
#define TARGET_NR_syncfs 267
#define TARGET_NR_setns 268
#define TARGET_NR_sendmmsg 269
+#define TARGET_NR_process_vm_readv 270
+#define TARGET_NR_process_vm_writev 271
+#define TARGET_NR_kcmp 272
+#define TARGET_NR_finit_module 273
#undef TARGET_NR_syscalls
-#define TARGET_NR_syscalls 270
+#define TARGET_NR_syscalls 274
/*
* All syscalls below here should go away really,
diff --git a/linux-user/ppc/syscall_nr.h b/linux-user/ppc/syscall_nr.h
index 0673b7d169..1e1736e11d 100644
--- a/linux-user/ppc/syscall_nr.h
+++ b/linux-user/ppc/syscall_nr.h
@@ -362,3 +362,9 @@
#define TARGET_NR_open_by_handle_at 346
#define TARGET_NR_clock_adjtime 347
#define TARGET_NR_syncfs 348
+#define TARGET_NR_sendmmsg 349
+#define TARGET_NR_setns 350
+#define TARGET_NR_process_vm_readv 351
+#define TARGET_NR_process_vm_writev 352
+#define TARGET_NR_finit_module 353
+#define TARGET_NR_kcmp 354
diff --git a/linux-user/s390x/syscall_nr.h b/linux-user/s390x/syscall_nr.h
index d4529ac03c..7c0b8b2eaa 100644
--- a/linux-user/s390x/syscall_nr.h
+++ b/linux-user/s390x/syscall_nr.h
@@ -265,6 +265,12 @@
#define TARGET_NR_open_by_handle_at 336
#define TARGET_NR_clock_adjtime 337
#define TARGET_NR_syncfs 338
+#define TARGET_NR_setns 339
+#define TARGET_NR_process_vm_readv 340
+#define TARGET_NR_process_vm_writev 341
+#define TARGET_NR_s390_runtime_instr 342
+#define TARGET_NR_kcmp 343
+#define TARGET_NR_finit_module 344
/*
* There are some system calls that are not present on 64 bit, some
@@ -355,4 +361,3 @@
#define TARGET_NR_newfstatat 293
#endif
-
diff --git a/linux-user/sh4/syscall_nr.h b/linux-user/sh4/syscall_nr.h
index 365db586c7..bdf8742c69 100644
--- a/linux-user/sh4/syscall_nr.h
+++ b/linux-user/sh4/syscall_nr.h
@@ -366,3 +366,9 @@
#define TARGET_NR_open_by_handle_at 360
#define TARGET_NR_clock_adjtime 361
#define TARGET_NR_syncfs 362
+#define TARGET_NR_sendmmsg 363
+#define TARGET_NR_setns 364
+#define TARGET_NR_process_vm_readv 365
+#define TARGET_NR_process_vm_writev 366
+#define TARGET_NR_kcmp 367
+#define TARGET_NR_finit_module 368
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 82e8592546..04638e2ead 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -420,6 +420,7 @@ static void QEMU_NORETURN force_sig(int target_sig)
* it to arrive. */
sigfillset(&act.sa_mask);
act.sa_handler = SIG_DFL;
+ act.sa_flags = 0;
sigaction(host_sig, &act, NULL);
/* For some reason raise(host_sig) doesn't send the signal when
diff --git a/linux-user/sparc/syscall_nr.h b/linux-user/sparc/syscall_nr.h
index 534e6e9963..181cd32653 100644
--- a/linux-user/sparc/syscall_nr.h
+++ b/linux-user/sparc/syscall_nr.h
@@ -302,3 +302,10 @@
#define TARGET_NR_open_by_handle_at 333
#define TARGET_NR_clock_adjtime 334
#define TARGET_NR_syncfs 335
+#define TARGET_NR_sendmmsg 336
+#define TARGET_NR_setns 337
+#define TARGET_NR_process_vm_readv 338
+#define TARGET_NR_process_vm_writev 339
+#define TARGET_NR_kern_features 340
+#define TARGET_NR_kcmp 341
+#define TARGET_NR_finit_module 342
diff --git a/linux-user/sparc64/syscall_nr.h b/linux-user/sparc64/syscall_nr.h
index 70988b2ec9..34a984cc88 100644
--- a/linux-user/sparc64/syscall_nr.h
+++ b/linux-user/sparc64/syscall_nr.h
@@ -334,3 +334,10 @@
#define TARGET_NR_open_by_handle_at 333
#define TARGET_NR_clock_adjtime 334
#define TARGET_NR_syncfs 335
+#define TARGET_NR_sendmmsg 336
+#define TARGET_NR_setns 337
+#define TARGET_NR_process_vm_readv 338
+#define TARGET_NR_process_vm_writev 339
+#define TARGET_NR_kern_features 340
+#define TARGET_NR_kcmp 341
+#define TARGET_NR_finit_module 342
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index f3700876a3..1407b7a546 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -107,6 +107,7 @@ int __clone2(int (*fn)(void *), void *child_stack_base,
#include <linux/reboot.h>
#include <linux/route.h>
#include <linux/filter.h>
+#include <linux/blkpg.h>
#include "linux_loop.h"
#include "cpu-uname.h"
@@ -1707,6 +1708,7 @@ static struct iovec *lock_iovec(int type, abi_ulong target_addr,
struct iovec *vec;
abi_ulong total_len, max_len;
int i;
+ int err = 0;
if (count == 0) {
errno = 0;
@@ -1726,7 +1728,7 @@ static struct iovec *lock_iovec(int type, abi_ulong target_addr,
target_vec = lock_user(VERIFY_READ, target_addr,
count * sizeof(struct target_iovec), 1);
if (target_vec == NULL) {
- errno = EFAULT;
+ err = EFAULT;
goto fail2;
}
@@ -1740,7 +1742,7 @@ static struct iovec *lock_iovec(int type, abi_ulong target_addr,
abi_long len = tswapal(target_vec[i].iov_len);
if (len < 0) {
- errno = EINVAL;
+ err = EINVAL;
goto fail;
} else if (len == 0) {
/* Zero length pointer is ignored. */
@@ -1748,7 +1750,7 @@ static struct iovec *lock_iovec(int type, abi_ulong target_addr,
} else {
vec[i].iov_base = lock_user(type, base, len, copy);
if (!vec[i].iov_base) {
- errno = EFAULT;
+ err = EFAULT;
goto fail;
}
if (len > max_len - total_len) {
@@ -1763,9 +1765,10 @@ static struct iovec *lock_iovec(int type, abi_ulong target_addr,
return vec;
fail:
- free(vec);
- fail2:
unlock_user(target_vec, target_addr, 0);
+ fail2:
+ free(vec);
+ errno = err;
return NULL;
}
@@ -2427,10 +2430,15 @@ static inline abi_long target_to_host_semarray(int semid, unsigned short **host_
nsems = semid_ds.sem_nsems;
*host_array = malloc(nsems*sizeof(unsigned short));
+ if (!*host_array) {
+ return -TARGET_ENOMEM;
+ }
array = lock_user(VERIFY_READ, target_addr,
nsems*sizeof(unsigned short), 1);
- if (!array)
+ if (!array) {
+ free(*host_array);
return -TARGET_EFAULT;
+ }
for(i=0; i<nsems; i++) {
__get_user((*host_array)[i], &array[i]);
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index ae30476217..3c8869e073 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -901,6 +901,7 @@ struct target_pollfd {
#define TARGET_BLKSECTSET TARGET_IO(0x12,102)/* set max sectors per request (ll_rw_blk.c) */
#define TARGET_BLKSECTGET TARGET_IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */
#define TARGET_BLKSSZGET TARGET_IO(0x12,104)/* get block device sector size */
+#define TARGET_BLKPG TARGET_IO(0x12,105)/* Partition table and disk geometry handling */
/* A jump here: 108-111 have been used for various private purposes. */
#define TARGET_BLKBSZGET TARGET_IOR(0x12, 112, abi_ulong)
#define TARGET_BLKBSZSET TARGET_IOW(0x12, 113, abi_ulong)
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
index 44b6a58820..9d0c92d054 100644
--- a/linux-user/syscall_types.h
+++ b/linux-user/syscall_types.h
@@ -240,3 +240,16 @@ STRUCT(fiemap,
TYPE_INT, /* fm_mapped_extents */
TYPE_INT, /* fm_extent_count */
TYPE_INT) /* fm_reserved */
+
+STRUCT(blkpg_partition,
+ TYPE_LONGLONG, /* start */
+ TYPE_LONGLONG, /* length */
+ TYPE_INT, /* pno */
+ MK_ARRAY(TYPE_CHAR, BLKPG_DEVNAMELTH), /* devname */
+ MK_ARRAY(TYPE_CHAR, BLKPG_VOLNAMELTH)) /* volname */
+
+STRUCT(blkpg_ioctl_arg,
+ TYPE_INT, /* op */
+ TYPE_INT, /* flags */
+ TYPE_INT, /* datalen */
+ MK_PTR(MK_STRUCT(STRUCT_blkpg_partition))) /* data */
diff --git a/linux-user/x86_64/syscall_nr.h b/linux-user/x86_64/syscall_nr.h
index 947e961ce4..7c59e3a09e 100644
--- a/linux-user/x86_64/syscall_nr.h
+++ b/linux-user/x86_64/syscall_nr.h
@@ -305,3 +305,10 @@
#define TARGET_NR_open_by_handle_at 304
#define TARGET_NR_clock_adjtime 305
#define TARGET_NR_syncfs 306
+#define TARGET_NR_sendmmsg 307
+#define TARGET_NR_setns 308
+#define TARGET_NR_getcpu 309
+#define TARGET_NR_process_vm_readv 310
+#define TARGET_NR_process_vm_writev 311
+#define TARGET_NR_kcmp 312
+#define TARGET_NR_finit_module 313