Commit ba9950c8 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

[PATCH] uml: small fixes left over from rc4

Some changes that I sent in didn't make 2.6.12-rc4 for some reason.  This
adds them back.  We have
	an x86_64 definition of TOP_ADDR
	a reimplementation of the x86_64 csum_partial_copy_from_user
	some syntax fixes in arch/um/kernel/ptrace.c
	removal of a CFLAGS definition in the x86_64 Makefile
	some include changes in the x86_64 ptrace.c and user-offsets.h
	a syntax fix in elf-x86_64.h
Also moved an include in the i386 and x86_64 Makefiles to make the symlinks
work, and some small fixes from Al Viro.
Signed-off-by: default avatarJeff Dike <jdike@addtoit.com>
Cc: <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 46f4e1b7
...@@ -6,6 +6,10 @@ config 64BIT ...@@ -6,6 +6,10 @@ config 64BIT
bool bool
default y default y
config TOP_ADDR
hex
default 0x80000000
config 3_LEVEL_PGTABLES config 3_LEVEL_PGTABLES
bool bool
default y default y
......
...@@ -31,7 +31,6 @@ extern int sysemu_supported; ...@@ -31,7 +31,6 @@ extern int sysemu_supported;
#ifdef UML_CONFIG_MODE_SKAS #ifdef UML_CONFIG_MODE_SKAS
#include "skas_ptregs.h" #include "skas_ptregs.h"
#include "sysdep/faultinfo.h"
#define REGS_IP(r) ((r)[HOST_IP]) #define REGS_IP(r) ((r)[HOST_IP])
#define REGS_SP(r) ((r)[HOST_SP]) #define REGS_SP(r) ((r)[HOST_SP])
...@@ -59,6 +58,7 @@ extern int sysemu_supported; ...@@ -59,6 +58,7 @@ extern int sysemu_supported;
#define PTRACE_SYSEMU_SINGLESTEP 32 #define PTRACE_SYSEMU_SINGLESTEP 32
#endif #endif
#include "sysdep/faultinfo.h"
#include "choose-mode.h" #include "choose-mode.h"
union uml_pt_regs { union uml_pt_regs {
......
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
#include "linux/in6.h" #include "linux/in6.h"
#include "asm/uaccess.h" #include "asm/uaccess.h"
extern unsigned int csum_partial_copy_from(const unsigned char *src, unsigned char *dst, int len,
int sum, int *err_ptr);
extern unsigned csum_partial(const unsigned char *buff, unsigned len, extern unsigned csum_partial(const unsigned char *buff, unsigned len,
unsigned sum); unsigned sum);
...@@ -31,10 +29,15 @@ unsigned int csum_partial_copy_nocheck(const unsigned char *src, unsigned char * ...@@ -31,10 +29,15 @@ unsigned int csum_partial_copy_nocheck(const unsigned char *src, unsigned char *
} }
static __inline__ static __inline__
unsigned int csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst, unsigned int csum_partial_copy_from_user(const unsigned char *src,
int len, int sum, int *err_ptr) unsigned char *dst, int len, int sum,
int *err_ptr)
{ {
return csum_partial_copy_from(src, dst, len, sum, err_ptr); if(copy_from_user(dst, src, len)){
*err_ptr = -EFAULT;
return(-1);
}
return csum_partial(dst, len, sum);
} }
/** /**
...@@ -137,15 +140,6 @@ static inline unsigned add32_with_carry(unsigned a, unsigned b) ...@@ -137,15 +140,6 @@ static inline unsigned add32_with_carry(unsigned a, unsigned b)
return a; return a;
} }
#endif extern unsigned short ip_compute_csum(unsigned char * buff, int len);
/* #endif
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
...@@ -135,6 +135,7 @@ extern int mode_tt; ...@@ -135,6 +135,7 @@ extern int mode_tt;
__CHOOSE_MODE(SC_EFLAGS(UPT_SC(r)), REGS_EFLAGS((r)->skas.regs)) __CHOOSE_MODE(SC_EFLAGS(UPT_SC(r)), REGS_EFLAGS((r)->skas.regs))
#define UPT_SC(r) ((r)->tt.sc) #define UPT_SC(r) ((r)->tt.sc)
#define UPT_SYSCALL_NR(r) __CHOOSE_MODE((r)->tt.syscall, (r)->skas.syscall) #define UPT_SYSCALL_NR(r) __CHOOSE_MODE((r)->tt.syscall, (r)->skas.syscall)
#define UPT_SYSCALL_RET(r) UPT_RAX(r)
extern int user_context(unsigned long sp); extern int user_context(unsigned long sp);
...@@ -196,32 +197,32 @@ struct syscall_args { ...@@ -196,32 +197,32 @@ struct syscall_args {
#define UPT_SET(regs, reg, val) \ #define UPT_SET(regs, reg, val) \
({ unsigned long val; \ ({ unsigned long __upt_val = val; \
switch(reg){ \ switch(reg){ \
case R8: UPT_R8(regs) = val; break; \ case R8: UPT_R8(regs) = __upt_val; break; \
case R9: UPT_R9(regs) = val; break; \ case R9: UPT_R9(regs) = __upt_val; break; \
case R10: UPT_R10(regs) = val; break; \ case R10: UPT_R10(regs) = __upt_val; break; \
case R11: UPT_R11(regs) = val; break; \ case R11: UPT_R11(regs) = __upt_val; break; \
case R12: UPT_R12(regs) = val; break; \ case R12: UPT_R12(regs) = __upt_val; break; \
case R13: UPT_R13(regs) = val; break; \ case R13: UPT_R13(regs) = __upt_val; break; \
case R14: UPT_R14(regs) = val; break; \ case R14: UPT_R14(regs) = __upt_val; break; \
case R15: UPT_R15(regs) = val; break; \ case R15: UPT_R15(regs) = __upt_val; break; \
case RIP: UPT_IP(regs) = val; break; \ case RIP: UPT_IP(regs) = __upt_val; break; \
case RSP: UPT_SP(regs) = val; break; \ case RSP: UPT_SP(regs) = __upt_val; break; \
case RAX: UPT_RAX(regs) = val; break; \ case RAX: UPT_RAX(regs) = __upt_val; break; \
case RBX: UPT_RBX(regs) = val; break; \ case RBX: UPT_RBX(regs) = __upt_val; break; \
case RCX: UPT_RCX(regs) = val; break; \ case RCX: UPT_RCX(regs) = __upt_val; break; \
case RDX: UPT_RDX(regs) = val; break; \ case RDX: UPT_RDX(regs) = __upt_val; break; \
case RSI: UPT_RSI(regs) = val; break; \ case RSI: UPT_RSI(regs) = __upt_val; break; \
case RDI: UPT_RDI(regs) = val; break; \ case RDI: UPT_RDI(regs) = __upt_val; break; \
case RBP: UPT_RBP(regs) = val; break; \ case RBP: UPT_RBP(regs) = __upt_val; break; \
case ORIG_RAX: UPT_ORIG_RAX(regs) = val; break; \ case ORIG_RAX: UPT_ORIG_RAX(regs) = __upt_val; break; \
case CS: UPT_CS(regs) = val; break; \ case CS: UPT_CS(regs) = __upt_val; break; \
case DS: UPT_DS(regs) = val; break; \ case DS: UPT_DS(regs) = __upt_val; break; \
case ES: UPT_ES(regs) = val; break; \ case ES: UPT_ES(regs) = __upt_val; break; \
case FS: UPT_FS(regs) = val; break; \ case FS: UPT_FS(regs) = __upt_val; break; \
case GS: UPT_GS(regs) = val; break; \ case GS: UPT_GS(regs) = __upt_val; break; \
case EFLAGS: UPT_EFLAGS(regs) = val; break; \ case EFLAGS: UPT_EFLAGS(regs) = __upt_val; break; \
default : \ default : \
panic("Bad register in UPT_SET : %d\n", reg); \ panic("Bad register in UPT_SET : %d\n", reg); \
break; \ break; \
...@@ -245,14 +246,3 @@ struct syscall_args { ...@@ -245,14 +246,3 @@ struct syscall_args {
CHOOSE_MODE((&(r)->tt.faultinfo), (&(r)->skas.faultinfo)) CHOOSE_MODE((&(r)->tt.faultinfo), (&(r)->skas.faultinfo))
#endif #endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/
...@@ -28,9 +28,9 @@ static inline void set_singlestepping(struct task_struct *child, int on) ...@@ -28,9 +28,9 @@ static inline void set_singlestepping(struct task_struct *child, int on)
child->thread.singlestep_syscall = 0; child->thread.singlestep_syscall = 0;
#ifdef SUBARCH_SET_SINGLESTEPPING #ifdef SUBARCH_SET_SINGLESTEPPING
SUBARCH_SET_SINGLESTEPPING(child, on) SUBARCH_SET_SINGLESTEPPING(child, on);
#endif #endif
} }
/* /*
* Called by kernel/ptrace.c when detaching.. * Called by kernel/ptrace.c when detaching..
...@@ -83,7 +83,7 @@ long sys_ptrace(long request, long pid, long addr, long data) ...@@ -83,7 +83,7 @@ long sys_ptrace(long request, long pid, long addr, long data)
} }
#ifdef SUBACH_PTRACE_SPECIAL #ifdef SUBACH_PTRACE_SPECIAL
SUBARCH_PTRACE_SPECIAL(child,request,addr,data) SUBARCH_PTRACE_SPECIAL(child,request,addr,data);
#endif #endif
ret = ptrace_check_attach(child, request == PTRACE_KILL); ret = ptrace_check_attach(child, request == PTRACE_KILL);
......
...@@ -73,6 +73,8 @@ SECTIONS ...@@ -73,6 +73,8 @@ SECTIONS
.got : { *(.got.plt) *(.got) } .got : { *(.got.plt) *(.got) }
.dynamic : { *(.dynamic) } .dynamic : { *(.dynamic) }
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
/* We want the small data sections together, so single-instruction offsets /* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */ we can shorten the on-disk segment size. */
......
...@@ -9,11 +9,11 @@ USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o ...@@ -9,11 +9,11 @@ USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
SYMLINKS = bitops.c semaphore.c highmem.c module.c SYMLINKS = bitops.c semaphore.c highmem.c module.c
include arch/um/scripts/Makefile.rules
bitops.c-dir = lib bitops.c-dir = lib
semaphore.c-dir = kernel semaphore.c-dir = kernel
highmem.c-dir = mm highmem.c-dir = mm
module.c-dir = kernel module.c-dir = kernel
subdir- := util subdir- := util
include arch/um/scripts/Makefile.rules
...@@ -14,11 +14,11 @@ obj-$(CONFIG_MODULES) += module.o um_module.o ...@@ -14,11 +14,11 @@ obj-$(CONFIG_MODULES) += module.o um_module.o
USER_OBJS := ptrace_user.o sigcontext.o USER_OBJS := ptrace_user.o sigcontext.o
include arch/um/scripts/Makefile.rules
SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c memcpy.S \ SYMLINKS = bitops.c csum-copy.S csum-partial.c csum-wrappers.c memcpy.S \
semaphore.c thunk.S module.c semaphore.c thunk.S module.c
include arch/um/scripts/Makefile.rules
bitops.c-dir = lib bitops.c-dir = lib
csum-copy.S-dir = lib csum-copy.S-dir = lib
csum-partial.c-dir = lib csum-partial.c-dir = lib
...@@ -28,6 +28,4 @@ semaphore.c-dir = kernel ...@@ -28,6 +28,4 @@ semaphore.c-dir = kernel
thunk.S-dir = lib thunk.S-dir = lib
module.c-dir = kernel module.c-dir = kernel
CFLAGS_csum-partial.o := -Dcsum_partial=arch_csum_partial
subdir- := util subdir- := util
...@@ -16,5 +16,4 @@ EXPORT_SYMBOL(__up_wakeup); ...@@ -16,5 +16,4 @@ EXPORT_SYMBOL(__up_wakeup);
EXPORT_SYMBOL(__memcpy); EXPORT_SYMBOL(__memcpy);
/* Networking helper routines. */ /* Networking helper routines. */
/*EXPORT_SYMBOL(csum_partial_copy_from); EXPORT_SYMBOL(ip_compute_csum);
EXPORT_SYMBOL(csum_partial_copy_to);*/
...@@ -5,10 +5,11 @@ ...@@ -5,10 +5,11 @@
*/ */
#define __FRAME_OFFSETS #define __FRAME_OFFSETS
#include "asm/ptrace.h" #include <asm/ptrace.h>
#include "linux/sched.h" #include <linux/sched.h>
#include "linux/errno.h" #include <linux/errno.h>
#include "asm/elf.h" #include <asm/uaccess.h>
#include <asm/elf.h>
/* XXX x86_64 */ /* XXX x86_64 */
unsigned long not_ss; unsigned long not_ss;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "asm/unistd.h" #include "asm/unistd.h"
#include "asm/prctl.h" /* XXX This should get the constants from libc */ #include "asm/prctl.h" /* XXX This should get the constants from libc */
#include "choose-mode.h" #include "choose-mode.h"
#include "kern.h"
asmlinkage long sys_uname64(struct new_utsname __user * name) asmlinkage long sys_uname64(struct new_utsname __user * name)
{ {
......
...@@ -3,6 +3,14 @@ ...@@ -3,6 +3,14 @@
#include <signal.h> #include <signal.h>
#define __FRAME_OFFSETS #define __FRAME_OFFSETS
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/types.h>
/* For some reason, x86_64 defines u64 and u32 only in <pci/types.h>, which I
* refuse to include here, even though they're used throughout the headers.
* These are used in asm/user.h, and that include can't be avoided because of
* the sizeof(struct user_regs_struct) below.
*/
typedef __u64 u64;
typedef __u32 u32;
#include <asm/user.h> #include <asm/user.h>
#define DEFINE(sym, val) \ #define DEFINE(sym, val) \
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#ifndef __UM_ELF_I386_H #ifndef __UM_ELF_I386_H
#define __UM_ELF_I386_H #define __UM_ELF_I386_H
#include "user.h" #include <asm/user.h>
#define R_386_NONE 0 #define R_386_NONE 0
#define R_386_32 1 #define R_386_32 1
......
...@@ -8,6 +8,27 @@ ...@@ -8,6 +8,27 @@
#include <asm/user.h> #include <asm/user.h>
/* x86-64 relocation types, taken from asm-x86_64/elf.h */
#define R_X86_64_NONE 0 /* No reloc */
#define R_X86_64_64 1 /* Direct 64 bit */
#define R_X86_64_PC32 2 /* PC relative 32 bit signed */
#define R_X86_64_GOT32 3 /* 32 bit GOT entry */
#define R_X86_64_PLT32 4 /* 32 bit PLT address */
#define R_X86_64_COPY 5 /* Copy symbol at runtime */
#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
#define R_X86_64_RELATIVE 8 /* Adjust by program base */
#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative
offset to GOT */
#define R_X86_64_32 10 /* Direct 32 bit zero extended */
#define R_X86_64_32S 11 /* Direct 32 bit sign extended */
#define R_X86_64_16 12 /* Direct 16 bit zero extended */
#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
#define R_X86_64_8 14 /* Direct 8 bit sign extended */
#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
#define R_X86_64_NUM 16
typedef unsigned long elf_greg_t; typedef unsigned long elf_greg_t;
#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t)) #define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t))
...@@ -44,7 +65,8 @@ typedef struct { } elf_fpregset_t; ...@@ -44,7 +65,8 @@ typedef struct { } elf_fpregset_t;
} while (0) } while (0)
#ifdef TIF_IA32 /* XXX */ #ifdef TIF_IA32 /* XXX */
clear_thread_flag(TIF_IA32); \ #error XXX, indeed
clear_thread_flag(TIF_IA32);
#endif #endif
#define USE_ELF_CORE_DUMP #define USE_ELF_CORE_DUMP
......
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