mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-18 11:46:13 +07:00
[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: Jeff Dike <jdike@addtoit.com> Cc: <viro@parcelfarce.linux.theplanet.co.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
46f4e1b7d5
commit
ba9950c820
@ -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;
|
|||||||
#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;
|
|||||||
#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 @@
|
|||||||
#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 *
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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;
|
|||||||
__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 {
|
|||||||
|
|
||||||
|
|
||||||
#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 {
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#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
|
|||||||
|
|
||||||
.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
|
|||||||
|
|
||||||
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
|
|||||||
|
|
||||||
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
|
|||||||
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);
|
|||||||
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 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#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 @@
|
|||||||
#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 @@
|
|||||||
#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 @@
|
|||||||
#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 @@
|
|||||||
|
|
||||||
#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;
|
|||||||
} 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
|
||||||
|
Loading…
Reference in New Issue
Block a user