Commit be0e1987 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus-4.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml

Pull UML fixes from Richard Weinberger:
 "This contains four overdue UML regression fixes"

* 'for-linus-4.3-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml:
  um: Fix kernel mode fault condition
  um: Fix waitpid() usage in helper code
  um: Do not rely on libc to provide modify_ldt()
  um: Fix out-of-tree build
parents ce1fad27 56b88a3b
...@@ -70,8 +70,8 @@ KBUILD_AFLAGS += $(ARCH_INCLUDE) ...@@ -70,8 +70,8 @@ KBUILD_AFLAGS += $(ARCH_INCLUDE)
USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \ USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \
$(ARCH_INCLUDE) $(MODE_INCLUDE) $(filter -I%,$(CFLAGS)) \ $(ARCH_INCLUDE) $(MODE_INCLUDE) $(filter -I%,$(CFLAGS)) \
-D_FILE_OFFSET_BITS=64 -idirafter include \ -D_FILE_OFFSET_BITS=64 -idirafter $(srctree)/include \
-D__KERNEL__ -D__UM_HOST__ -idirafter $(obj)/include -D__KERNEL__ -D__UM_HOST__
#This will adjust *FLAGS accordingly to the platform. #This will adjust *FLAGS accordingly to the platform.
include $(ARCH_DIR)/Makefile-os-$(OS) include $(ARCH_DIR)/Makefile-os-$(OS)
......
...@@ -220,7 +220,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, ...@@ -220,7 +220,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
show_regs(container_of(regs, struct pt_regs, regs)); show_regs(container_of(regs, struct pt_regs, regs));
panic("Segfault with no mm"); panic("Segfault with no mm");
} }
else if (!is_user && address < TASK_SIZE) { else if (!is_user && address > PAGE_SIZE && address < TASK_SIZE) {
show_regs(container_of(regs, struct pt_regs, regs)); show_regs(container_of(regs, struct pt_regs, regs));
panic("Kernel tried to access user memory at addr 0x%lx, ip 0x%lx", panic("Kernel tried to access user memory at addr 0x%lx, ip 0x%lx",
address, ip); address, ip);
......
...@@ -96,7 +96,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv) ...@@ -96,7 +96,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
"ret = %d\n", -n); "ret = %d\n", -n);
ret = n; ret = n;
} }
CATCH_EINTR(waitpid(pid, NULL, __WCLONE)); CATCH_EINTR(waitpid(pid, NULL, __WALL));
} }
out_free2: out_free2:
...@@ -129,7 +129,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, ...@@ -129,7 +129,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
return err; return err;
} }
if (stack_out == NULL) { if (stack_out == NULL) {
CATCH_EINTR(pid = waitpid(pid, &status, __WCLONE)); CATCH_EINTR(pid = waitpid(pid, &status, __WALL));
if (pid < 0) { if (pid < 0) {
err = -errno; err = -errno;
printk(UM_KERN_ERR "run_helper_thread - wait failed, " printk(UM_KERN_ERR "run_helper_thread - wait failed, "
...@@ -148,7 +148,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, ...@@ -148,7 +148,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
int helper_wait(int pid) int helper_wait(int pid)
{ {
int ret, status; int ret, status;
int wflags = __WCLONE; int wflags = __WALL;
CATCH_EINTR(ret = waitpid(pid, &status, wflags)); CATCH_EINTR(ret = waitpid(pid, &status, wflags));
if (ret < 0) { if (ret < 0) {
......
...@@ -12,7 +12,10 @@ ...@@ -12,7 +12,10 @@
#include <skas.h> #include <skas.h>
#include <sysdep/tls.h> #include <sysdep/tls.h>
extern int modify_ldt(int func, void *ptr, unsigned long bytecount); static inline int modify_ldt (int func, void *ptr, unsigned long bytecount)
{
return syscall(__NR_modify_ldt, func, ptr, bytecount);
}
static long write_ldt_entry(struct mm_id *mm_idp, int func, static long write_ldt_entry(struct mm_id *mm_idp, int func,
struct user_desc *desc, void **addr, int done) struct user_desc *desc, void **addr, int done)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment