Rollup patch to run 2.6.15-rc1 on x86-64 PLD Linux.
Here is the set of changes that got me a working 2.6.15-rc1 x86-64 UML under PLD Linux. This includes several patches from Jeff (two of which I had to apply by hand because the hunks didn't match any known Linux kernel).
There shouldn't be anything new here, I just wanted to make sure that everything needed was listed in one place. Here's hoping -rc2 works out of the box. :)
Rob
Tylko w linux-2.6.15-rc1/: allno.config
arch/um/include/sysdep-i386/stub.h +9 -0
@@ -16,6 +16,15 @@#define STUB_MMAP_NR __NR_mmap2#define MMAP_OFFSET (o) ((o) >> PAGE_SHIFT) +static inline long stub_syscall0 (long syscall) +{ +long ret; + + __asm__volatile ("int $0x80" :"=a" (ret) :"0" (syscall)); + +return ret; +} +static inline long stub_syscall1 (long syscall,long arg1) {long ret;
arch/um/include/sysdep-x86_64/stub.h +11 -1
@@ -6,7 +6,6 @@#ifndef __SYSDEP_STUB_H#define __SYSDEP_STUB_H -#include <asm/ptrace.h> #include <asm/unistd.h> #include <sysdep/ptrace_user.h>
@@ -20,6 +19,17 @@#define __syscall_clobber "r11","rcx","memory"#define __syscall "syscall" +static inline long stub_syscall0 (long syscall) +{ +long ret; + + __asm__ volatile (__syscall + : "=a" (ret) + : "0" (syscall) : __syscall_clobber ); + +return ret; +} +static inline long stub_syscall2 (long syscall,long arg1,long arg2) {long ret;
arch/um/Kconfig.x86_64 +1 -1
@@ -9,7 +9,7 @@ #XXX: this is so in the underlying arch, but it's wrong!!! config RWSEM_GENERIC_SPINLOCK bool - default y + default n config SEMAPHORE_SLEEPERS bool
arch/um/kernel/skas/clone.c +8 -4
@@ -9,9 +9,13 @@#include "stub-data.h" #include "uml-config.h" #include "sysdep/stub.h" +#include "kern_constants.h" /* This is in a separate file because it needs to be compiled with any * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled +* +* Use UM_KERN_PAGE_SIZE instead of PAGE_SIZE because that calls getpagesize +* on some systems. */ void __attribute__ ((__section__ (".__syscall_stub" )))stub_clone_handler (void )
@@ -20,7 +24,7 @@struct stub_data *from = (struct stub_data *)UML_CONFIG_STUB_DATA ; err =stub_syscall2 (__NR_clone,CLONE_PARENT |CLONE_FILES |SIGCHLD , -UML_CONFIG_STUB_DATA +PAGE_SIZE /2 - +UML_CONFIG_STUB_DATA +UM_KERN_PAGE_SIZE /2 -sizeof (void *));if (err !=0 ) goto out;
@@ -34,9 +38,9 @@if (err) goto out; - err =stub_syscall6 (STUB_MMAP_NR ,UML_CONFIG_STUB_DATA ,PAGE_SIZE , -PROT_READ |PROT_WRITE ,MAP_FIXED |MAP_SHARED , - from->fd, from->offset); + err =stub_syscall6 (STUB_MMAP_NR ,UML_CONFIG_STUB_DATA , +UM_KERN_PAGE_SIZE ,PROT_READ |PROT_WRITE , +MAP_FIXED |MAP_SHARED , from->fd, from->offset); out:/* save current result. Parent: pid; child: retcode of mmap */ from->err = err;
arch/um/Makefile +1 -1
@@ -107,7 +107,7 @@ prepare: $(ARCH_DIR)/include/kern_constants.h LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static -LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib +LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64 CPP_MODE-$(CONFIG_MODE_TT) := -DMODE_TT CONFIG_KERNEL_STACK_ORDER ?= 2
arch/um/sys-i386/Makefile +1 -1
@@ -5,7 +5,7 @@ obj-$(CONFIG_HIGHMEM) += highmem.o obj-$(CONFIG_MODULES) += module.o -USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o +USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o stub_segv.o SYMLINKS = bitops.c semaphore.c highmem.c module.c
arch/um/sys-i386/stub_segv.c +10 -5
@@ -3,9 +3,11 @@* Licensed under the GPL */ +#include <sys/select.h> /* The only way I can see to get sigset_t */ #include <asm/signal.h> #include <asm/unistd.h> #include "uml-config.h" +#include "sysdep/stub.h" #include "sysdep/sigcontext.h" #include "sysdep/faultinfo.h"
@@ -17,13 +19,16 @@GET_FAULTINFO_FROM_SC (*((struct faultinfo *)UML_CONFIG_STUB_DATA ), sc); - __asm__("movl %0, %%eax ; int $0x80" : :"g" (__NR_getpid)); - __asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;" -"int $0x80" : :"g" (__NR_kill),"g" (SIGUSR1 )); +// __asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid)); +// __asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;" +// "int $0x80": : "g" (__NR_kill), "g" (SIGUSR1)); /* Load pointer to sigcontext into esp, since we need to leave * the stack in its original form when we do the sigreturn here, by * hand. */ - __asm__("mov %0,%%esp ; movl %1, %%eax ; " -"int $0x80" : :"a" (sc),"g" (__NR_sigreturn)); + __asm__("mov %0,%%esp" : :"a" (sc)); +stub_syscall0 (__NR_sigreturn); + +// __asm__("mov %0,%%esp ; movl %1, %%eax ; " +// "int $0x80" : : "a" (sc), "g" (__NR_sigreturn)); }
arch/um/sys-x86_64/Makefile +1 -1
@@ -12,7 +12,7 @@ obj-y := ksyms.o obj-$(CONFIG_MODULES) += module.o um_module.o -USER_OBJS := ptrace_user.o sigcontext.o +USER_OBJS := ptrace_user.o sigcontext.o stub_segv.o SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c ldt.c memcpy.S \ thunk.S module.c
arch/um/sys-x86_64/stub_segv.c +8 -7
@@ -3,13 +3,14 @@* Licensed under the GPL */ -#include <asm/signal.h> #include <linux/compiler.h> +#include <signal.h> #include <asm/unistd.h> -#include <asm/ucontext.h> +#include <asm/sigcontext.h> #include "uml-config.h" #include "sysdep/sigcontext.h" #include "sysdep/faultinfo.h" +#include "sysdep/stub.h" #include <stddef.h> /* Copied from sys-x86_64/signal.c - Can't find an equivalent definition
@@ -31,15 +32,15 @@ stub_segv_handler(int sig) {struct ucontext *uc; +int pid; __asm__("movq %%rdx, %0" :"=g" (uc) :);GET_FAULTINFO_FROM_SC (*((struct faultinfo *)UML_CONFIG_STUB_DATA ), &uc->uc_mcontext); - __asm__("movq %0, %%rax ; syscall" : :"g" (__NR_getpid)); - __asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;" -"syscall" : :"g" (__NR_kill),"g" (SIGUSR1 ) : -"%rdi" ,"%rax" ,"%rsi" ); + pid =stub_syscall0 (__NR_getpid); +stub_syscall2 (__NR_kill, pid,SIGUSR1 ); +/* sys_sigreturn expects that the stack pointer will be 8 bytes into * the signal frame. So, we use the ucontext pointer, which we know * already, to get the signal frame pointer, and add 8 to that.
@@ -47,5 +48,5 @@ __asm__("movq %0, %%rsp" : : "g" ((unsigned long) container_of(uc, struct rt_sigframe, uc) +8 )); - __asm__("movq %0, %%rax ; syscall" : :"g" (__NR_rt_sigreturn)); +stub_syscall0 (__NR_rt_sigreturn); }