mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
um: merge arch/um/sys-{i386,x86_64}
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
858ba94499
commit
6582b7f774
51 changed files with 81 additions and 193 deletions
|
@ -121,8 +121,8 @@ archclean:
|
|||
|
||||
# Generated files
|
||||
|
||||
$(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.s: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(ARCH_DIR)/sys-$(SUBARCH) $@
|
||||
$(ARCH_DIR)/sys-$(HEADER_ARCH)/user-offsets.s: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(ARCH_DIR)/sys-$(HEADER_ARCH) $@
|
||||
|
||||
define filechk_gen-asm-offsets
|
||||
(set -e; \
|
||||
|
@ -137,7 +137,7 @@ define filechk_gen-asm-offsets
|
|||
echo ""; )
|
||||
endef
|
||||
|
||||
include/generated/user_constants.h: $(ARCH_DIR)/sys-$(SUBARCH)/user-offsets.s
|
||||
include/generated/user_constants.h: $(ARCH_DIR)/sys-$(HEADER_ARCH)/user-offsets.s
|
||||
$(call filechk,gen-asm-offsets)
|
||||
|
||||
export SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS HEADER_ARCH DEV_NULL_PATH
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
core-y += arch/um/sys-i386/ arch/x86/crypto/
|
||||
core-y += arch/um/sys-x86/ arch/x86/crypto/
|
||||
|
||||
TOP_ADDR := $(CONFIG_TOP_ADDR)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Copyright 2003 - 2004 Pathscale, Inc
|
||||
# Released under the GPL
|
||||
|
||||
core-y += arch/um/sys-x86_64/ arch/x86/crypto/
|
||||
core-y += arch/um/sys-x86/ arch/x86/crypto/
|
||||
START := 0x60000000
|
||||
|
||||
_extra_flags_ = -fno-builtin -m64
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
#
|
||||
# Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
#
|
||||
|
||||
obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \
|
||||
ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \
|
||||
sys_call_table.o tls.o mem.o
|
||||
|
||||
obj-$(CONFIG_BINFMT_ELF) += elfcore.o
|
||||
|
||||
subarch-obj-y = lib/string_32.o lib/atomic64_32.o lib/atomic64_cx8_32.o
|
||||
subarch-obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += lib/rwsem.o
|
||||
subarch-obj-$(CONFIG_HIGHMEM) += mm/highmem_32.o
|
||||
subarch-obj-$(CONFIG_MODULES) += kernel/module.o
|
||||
|
||||
USER_OBJS := bugs.o ptrace_user.o fault.o
|
||||
|
||||
extra-y += user-offsets.s
|
||||
$(obj)/user-offsets.s: c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS)
|
||||
|
||||
UNPROFILE_OBJS := stub_segv.o
|
||||
CFLAGS_stub_segv.o := $(CFLAGS_NO_HARDENING)
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2006 Jeff Dike (jdike@addtoit.com)
|
||||
* Licensed under the GPL V2
|
||||
*/
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/errno.h>
|
||||
|
||||
/* Mostly copied from i386/x86_86 - eliminated the eip < PAGE_OFFSET because
|
||||
* that's not relevant in skas mode.
|
||||
*/
|
||||
|
||||
int is_valid_bugaddr(unsigned long eip)
|
||||
{
|
||||
unsigned short ud2;
|
||||
|
||||
if (probe_kernel_address((unsigned short __user *)eip, ud2))
|
||||
return 0;
|
||||
|
||||
return ud2 == 0x0b0f;
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
#include "linux/module.h"
|
||||
#include "asm/checksum.h"
|
||||
|
||||
/* Networking helper routines. */
|
||||
EXPORT_SYMBOL(csum_partial);
|
|
@ -1,53 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <signal.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/mman.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
|
||||
#define DEFINE_LONGS(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val/sizeof(unsigned long)))
|
||||
|
||||
#define OFFSET(sym, str, mem) \
|
||||
DEFINE(sym, offsetof(struct str, mem));
|
||||
|
||||
void foo(void)
|
||||
{
|
||||
OFFSET(HOST_SC_TRAPNO, sigcontext, trapno);
|
||||
OFFSET(HOST_SC_ERR, sigcontext, err);
|
||||
OFFSET(HOST_SC_CR2, sigcontext, cr2);
|
||||
|
||||
DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct));
|
||||
DEFINE_LONGS(HOST_FPX_SIZE, sizeof(struct user_fpxregs_struct));
|
||||
|
||||
DEFINE(HOST_IP, EIP);
|
||||
DEFINE(HOST_SP, UESP);
|
||||
DEFINE(HOST_EFLAGS, EFL);
|
||||
DEFINE(HOST_EAX, EAX);
|
||||
DEFINE(HOST_EBX, EBX);
|
||||
DEFINE(HOST_ECX, ECX);
|
||||
DEFINE(HOST_EDX, EDX);
|
||||
DEFINE(HOST_ESI, ESI);
|
||||
DEFINE(HOST_EDI, EDI);
|
||||
DEFINE(HOST_EBP, EBP);
|
||||
DEFINE(HOST_CS, CS);
|
||||
DEFINE(HOST_SS, SS);
|
||||
DEFINE(HOST_DS, DS);
|
||||
DEFINE(HOST_FS, FS);
|
||||
DEFINE(HOST_ES, ES);
|
||||
DEFINE(HOST_GS, GS);
|
||||
DEFINE(UM_FRAME_SIZE, sizeof(struct user_regs_struct));
|
||||
|
||||
/* XXX Duplicated between i386 and x86_64 */
|
||||
DEFINE(UM_POLLIN, POLLIN);
|
||||
DEFINE(UM_POLLPRI, POLLPRI);
|
||||
DEFINE(UM_POLLOUT, POLLOUT);
|
||||
|
||||
DEFINE(UM_PROT_READ, PROT_READ);
|
||||
DEFINE(UM_PROT_WRITE, PROT_WRITE);
|
||||
DEFINE(UM_PROT_EXEC, PROT_EXEC);
|
||||
}
|
45
arch/um/sys-x86/Makefile
Normal file
45
arch/um/sys-x86/Makefile
Normal file
|
@ -0,0 +1,45 @@
|
|||
#
|
||||
# Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
#
|
||||
|
||||
ifeq ($(CONFIG_X86_32),y)
|
||||
BITS := 32
|
||||
else
|
||||
BITS := 64
|
||||
endif
|
||||
|
||||
obj-y = bug.o bugs_$(BITS).o delay_$(BITS).o fault.o ksyms.o ldt.o \
|
||||
ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal_$(BITS).o \
|
||||
stub_$(BITS).o stub_segv_$(BITS).o syscalls_$(BITS).o \
|
||||
sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o mem_$(BITS).o
|
||||
|
||||
ifeq ($(CONFIG_X86_32),y)
|
||||
|
||||
obj-y += checksum_32.o
|
||||
obj-$(CONFIG_BINFMT_ELF) += elfcore.o
|
||||
|
||||
subarch-obj-y = lib/string_32.o lib/atomic64_32.o lib/atomic64_cx8_32.o
|
||||
subarch-obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += lib/rwsem.o
|
||||
subarch-obj-$(CONFIG_HIGHMEM) += mm/highmem_32.o
|
||||
subarch-obj-$(CONFIG_MODULES) += kernel/module.o
|
||||
|
||||
else
|
||||
|
||||
obj-y += vdso/
|
||||
|
||||
subarch-obj-y = lib/csum-partial_64.o lib/memcpy_64.o lib/thunk_64.o \
|
||||
lib/rwsem.o
|
||||
|
||||
endif
|
||||
|
||||
subarch-obj-$(CONFIG_MODULES) += kernel/module.o
|
||||
|
||||
USER_OBJS := bugs_$(BITS).o ptrace_user.o fault.o
|
||||
|
||||
extra-y += user-offsets.s
|
||||
$(obj)/user-offsets.s: c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS)
|
||||
|
||||
UNPROFILE_OBJS := stub_segv.o
|
||||
CFLAGS_stub_segv.o := $(CFLAGS_NO_HARDENING)
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
|
@ -2,10 +2,12 @@
|
|||
#include <asm/string.h>
|
||||
#include <asm/checksum.h>
|
||||
|
||||
#ifndef CONFIG_X86_32
|
||||
/*XXX: we need them because they would be exported by x86_64 */
|
||||
#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
#else
|
||||
EXPORT_SYMBOL(__memcpy);
|
||||
#endif
|
||||
#endif
|
||||
EXPORT_SYMBOL(csum_partial);
|
|
@ -4,7 +4,7 @@
|
|||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include "ptrace_user.h"
|
||||
|
||||
int ptrace_getregs(long pid, unsigned long *regs_out)
|
||||
{
|
|
@ -9,20 +9,41 @@
|
|||
#include <asm/types.h>
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
|
||||
#define DEFINE_LONGS(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val/sizeof(unsigned long)))
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val/sizeof(unsigned long)))
|
||||
|
||||
#define OFFSET(sym, str, mem) \
|
||||
DEFINE(sym, offsetof(struct str, mem));
|
||||
|
||||
void foo(void)
|
||||
{
|
||||
OFFSET(HOST_SC_CR2, sigcontext, cr2);
|
||||
OFFSET(HOST_SC_ERR, sigcontext, err);
|
||||
OFFSET(HOST_SC_TRAPNO, sigcontext, trapno);
|
||||
OFFSET(HOST_SC_ERR, sigcontext, err);
|
||||
OFFSET(HOST_SC_CR2, sigcontext, cr2);
|
||||
|
||||
#ifdef __i386__
|
||||
DEFINE_LONGS(HOST_FP_SIZE, sizeof(struct user_fpregs_struct));
|
||||
DEFINE_LONGS(HOST_FPX_SIZE, sizeof(struct user_fpxregs_struct));
|
||||
|
||||
DEFINE(HOST_IP, EIP);
|
||||
DEFINE(HOST_SP, UESP);
|
||||
DEFINE(HOST_EFLAGS, EFL);
|
||||
DEFINE(HOST_EAX, EAX);
|
||||
DEFINE(HOST_EBX, EBX);
|
||||
DEFINE(HOST_ECX, ECX);
|
||||
DEFINE(HOST_EDX, EDX);
|
||||
DEFINE(HOST_ESI, ESI);
|
||||
DEFINE(HOST_EDI, EDI);
|
||||
DEFINE(HOST_EBP, EBP);
|
||||
DEFINE(HOST_CS, CS);
|
||||
DEFINE(HOST_SS, SS);
|
||||
DEFINE(HOST_DS, DS);
|
||||
DEFINE(HOST_FS, FS);
|
||||
DEFINE(HOST_ES, ES);
|
||||
DEFINE(HOST_GS, GS);
|
||||
#else
|
||||
DEFINE(HOST_FP_SIZE, sizeof(struct _fpstate) / sizeof(unsigned long));
|
||||
DEFINE_LONGS(HOST_RBX, RBX);
|
||||
DEFINE_LONGS(HOST_RCX, RCX);
|
||||
|
@ -52,9 +73,9 @@ void foo(void)
|
|||
|
||||
DEFINE_LONGS(HOST_IP, RIP);
|
||||
DEFINE_LONGS(HOST_SP, RSP);
|
||||
DEFINE(UM_FRAME_SIZE, sizeof(struct user_regs_struct));
|
||||
#endif
|
||||
|
||||
/* XXX Duplicated between i386 and x86_64 */
|
||||
DEFINE(UM_FRAME_SIZE, sizeof(struct user_regs_struct));
|
||||
DEFINE(UM_POLLIN, POLLIN);
|
||||
DEFINE(UM_POLLPRI, POLLPRI);
|
||||
DEFINE(UM_POLLOUT, POLLOUT);
|
|
@ -4,7 +4,7 @@ __INITDATA
|
|||
|
||||
.globl vdso_start, vdso_end
|
||||
vdso_start:
|
||||
.incbin "arch/um/sys-x86_64/vdso/vdso.so"
|
||||
.incbin "arch/um/sys-x86/vdso/vdso.so"
|
||||
vdso_end:
|
||||
|
||||
__FINIT
|
|
@ -1,27 +0,0 @@
|
|||
#
|
||||
# Copyright 2003 PathScale, Inc.
|
||||
#
|
||||
# Licensed under the GPL
|
||||
#
|
||||
|
||||
obj-y = bug.o bugs.o delay.o fault.o ldt.o ptrace.o ptrace_user.o mem.o \
|
||||
setjmp.o signal.o stub.o stub_segv.o syscalls.o syscall_table.o \
|
||||
sysrq.o ksyms.o tls.o
|
||||
|
||||
obj-y += vdso/
|
||||
|
||||
subarch-obj-y = lib/csum-partial_64.o lib/memcpy_64.o lib/thunk_64.o \
|
||||
lib/rwsem.o
|
||||
subarch-obj-$(CONFIG_MODULES) += kernel/module.o
|
||||
|
||||
ldt-y = ../sys-i386/ldt.o
|
||||
|
||||
USER_OBJS := ptrace_user.o
|
||||
|
||||
extra-y += user-offsets.s
|
||||
$(obj)/user-offsets.s: c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS)
|
||||
|
||||
UNPROFILE_OBJS := stub_segv.o
|
||||
CFLAGS_stub_segv.o := $(CFLAGS_NO_HARDENING)
|
||||
|
||||
include arch/um/scripts/Makefile.rules
|
|
@ -1,28 +0,0 @@
|
|||
/*
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
*
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#include "sysdep/ptrace.h"
|
||||
|
||||
/* These two are from asm-um/uaccess.h and linux/module.h, check them. */
|
||||
struct exception_table_entry
|
||||
{
|
||||
unsigned long insn;
|
||||
unsigned long fixup;
|
||||
};
|
||||
|
||||
const struct exception_table_entry *search_exception_tables(unsigned long add);
|
||||
|
||||
int arch_fixup(unsigned long address, struct uml_pt_regs *regs)
|
||||
{
|
||||
const struct exception_table_entry *fixup;
|
||||
|
||||
fixup = search_exception_tables(address);
|
||||
if (fixup != 0) {
|
||||
UPT_IP(regs) = fixup->fixup;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
/*
|
||||
* Copyright 2003 PathScale, Inc.
|
||||
*
|
||||
* Licensed under the GPL
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include "ptrace_user.h"
|
||||
|
||||
int ptrace_getregs(long pid, unsigned long *regs_out)
|
||||
{
|
||||
if (ptrace(PTRACE_GETREGS, pid, 0, regs_out) < 0)
|
||||
return -errno;
|
||||
return(0);
|
||||
}
|
||||
|
||||
int ptrace_setregs(long pid, unsigned long *regs_out)
|
||||
{
|
||||
if (ptrace(PTRACE_SETREGS, pid, 0, regs_out) < 0)
|
||||
return -errno;
|
||||
return(0);
|
||||
}
|
Loading…
Reference in a new issue