x86 vDSO: ia32 vsyscall removal
This removes all the old vsyscall code from arch/x86/ia32/ that is no longer used because arch/x86/vdso/ code has replaced it. Signed-off-by: Roland McGrath <roland@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
af65d64845
commit
16f4bc738d
|
@ -117,9 +117,6 @@ install: vdso_install
|
|||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@
|
||||
|
||||
vdso_install:
|
||||
ifeq ($(CONFIG_IA32_EMULATION),y)
|
||||
$(Q)$(MAKE) $(build)=arch/x86/ia32 $@
|
||||
endif
|
||||
$(Q)$(MAKE) $(build)=arch/x86/vdso $@
|
||||
|
||||
archclean:
|
||||
|
|
|
@ -12,40 +12,3 @@ obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
|
|||
|
||||
audit-class-$(CONFIG_AUDIT) := audit.o
|
||||
obj-$(CONFIG_IA32_EMULATION) += $(audit-class-y)
|
||||
|
||||
$(obj)/syscall32_syscall.o: \
|
||||
$(foreach F,sysenter syscall,$(obj)/vsyscall-$F.so)
|
||||
|
||||
# Teach kbuild about targets
|
||||
targets := $(foreach F,$(addprefix vsyscall-,sysenter syscall),\
|
||||
$F.o $F.so $F.so.dbg)
|
||||
|
||||
# The DSO images are built using a special linker script
|
||||
quiet_cmd_syscall = SYSCALL $@
|
||||
cmd_syscall = $(CC) -m32 -nostdlib -shared \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv) \
|
||||
-Wl,-soname=linux-gate.so.1 -o $@ \
|
||||
-Wl,-T,$(filter-out FORCE,$^)
|
||||
|
||||
$(obj)/%.so: OBJCOPYFLAGS := -S
|
||||
$(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
$(obj)/vsyscall-sysenter.so.dbg $(obj)/vsyscall-syscall.so.dbg: \
|
||||
$(obj)/vsyscall-%.so.dbg: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE
|
||||
$(call if_changed,syscall)
|
||||
|
||||
AFLAGS_vsyscall-sysenter.o = -m32 -Wa,-32
|
||||
AFLAGS_vsyscall-syscall.o = -m32 -Wa,-32
|
||||
|
||||
vdsos := vdso32-sysenter.so vdso32-syscall.so
|
||||
|
||||
quiet_cmd_vdso_install = INSTALL $@
|
||||
cmd_vdso_install = cp $(@:vdso32-%.so=$(obj)/vsyscall-%.so.dbg) \
|
||||
$(MODLIB)/vdso/$@
|
||||
|
||||
$(vdsos):
|
||||
@mkdir -p $(MODLIB)/vdso
|
||||
$(call cmd,vdso_install)
|
||||
|
||||
vdso_install: $(vdsos)
|
||||
|
|
|
@ -1,90 +0,0 @@
|
|||
/*
|
||||
* Copyright 2002,2003 Andi Kleen, SuSE Labs
|
||||
*
|
||||
* vsyscall handling for 32bit processes. Map a stub page into it on
|
||||
* demand because 32bit cannot reach the kernel's fixmaps
|
||||
*/
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/security.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/ia32_unistd.h>
|
||||
#include <asm/vsyscall32.h>
|
||||
|
||||
extern unsigned char syscall32_syscall[], syscall32_syscall_end[];
|
||||
extern unsigned char syscall32_sysenter[], syscall32_sysenter_end[];
|
||||
extern int sysctl_vsyscall32;
|
||||
|
||||
static struct page *syscall32_pages[1];
|
||||
static int use_sysenter = -1;
|
||||
|
||||
struct linux_binprm;
|
||||
|
||||
/* Setup a VMA at program startup for the vsyscall page */
|
||||
int syscall32_setup_pages(struct linux_binprm *bprm, int exstack)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
int ret;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
/*
|
||||
* MAYWRITE to allow gdb to COW and set breakpoints
|
||||
*
|
||||
* Make sure the vDSO gets into every core dump.
|
||||
* Dumping its contents makes post-mortem fully interpretable later
|
||||
* without matching up the same kernel and hardware config to see
|
||||
* what PC values meant.
|
||||
*/
|
||||
/* Could randomize here */
|
||||
ret = install_special_mapping(mm, VSYSCALL32_BASE, PAGE_SIZE,
|
||||
VM_READ|VM_EXEC|
|
||||
VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC|
|
||||
VM_ALWAYSDUMP,
|
||||
syscall32_pages);
|
||||
if (ret == 0) {
|
||||
current->mm->context.vdso = (void __user *)VSYSCALL32_BASE;
|
||||
current_thread_info()->sysenter_return = VSYSCALL32_SYSEXIT;
|
||||
}
|
||||
up_write(&mm->mmap_sem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __init init_syscall32(void)
|
||||
{
|
||||
char *syscall32_page = (void *)get_zeroed_page(GFP_KERNEL);
|
||||
|
||||
if (!syscall32_page)
|
||||
panic("Cannot allocate syscall32 page");
|
||||
syscall32_pages[0] = virt_to_page(syscall32_page);
|
||||
if (use_sysenter > 0) {
|
||||
memcpy(syscall32_page, syscall32_sysenter,
|
||||
syscall32_sysenter_end - syscall32_sysenter);
|
||||
} else {
|
||||
memcpy(syscall32_page, syscall32_syscall,
|
||||
syscall32_syscall_end - syscall32_syscall);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
__initcall(init_syscall32);
|
||||
|
||||
/* May not be __init: called during resume */
|
||||
void syscall32_cpu_init(void)
|
||||
{
|
||||
if (use_sysenter < 0)
|
||||
use_sysenter = (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL);
|
||||
|
||||
/*
|
||||
* Load these always in case some future AMD CPU supports
|
||||
* SYSENTER from compat mode too.
|
||||
*/
|
||||
checking_wrmsrl(MSR_IA32_SYSENTER_CS, (u64)__KERNEL_CS);
|
||||
checking_wrmsrl(MSR_IA32_SYSENTER_ESP, 0ULL);
|
||||
checking_wrmsrl(MSR_IA32_SYSENTER_EIP, (u64)ia32_sysenter_target);
|
||||
|
||||
wrmsrl(MSR_CSTAR, ia32_cstar_target);
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
/* 32bit VDSOs mapped into user space. */
|
||||
|
||||
.section ".init.data","aw"
|
||||
|
||||
.globl syscall32_syscall
|
||||
.globl syscall32_syscall_end
|
||||
|
||||
syscall32_syscall:
|
||||
.incbin "arch/x86/ia32/vsyscall-syscall.so"
|
||||
syscall32_syscall_end:
|
||||
|
||||
.globl syscall32_sysenter
|
||||
.globl syscall32_sysenter_end
|
||||
|
||||
syscall32_sysenter:
|
||||
.incbin "arch/x86/ia32/vsyscall-sysenter.so"
|
||||
syscall32_sysenter_end:
|
|
@ -1,142 +0,0 @@
|
|||
/*
|
||||
* Common code for the sigreturn entry points on the vsyscall page.
|
||||
* This code uses SYSCALL_ENTER_KERNEL (either syscall or int $0x80)
|
||||
* to enter the kernel.
|
||||
* This file is #include'd by vsyscall-*.S to define them after the
|
||||
* vsyscall entry point. The addresses we get for these entry points
|
||||
* by doing ".balign 32" must match in both versions of the page.
|
||||
*/
|
||||
|
||||
.code32
|
||||
.section .text.sigreturn,"ax"
|
||||
.balign 32
|
||||
.globl __kernel_sigreturn
|
||||
.type __kernel_sigreturn,@function
|
||||
__kernel_sigreturn:
|
||||
.LSTART_sigreturn:
|
||||
popl %eax
|
||||
movl $__NR_ia32_sigreturn, %eax
|
||||
SYSCALL_ENTER_KERNEL
|
||||
.LEND_sigreturn:
|
||||
.size __kernel_sigreturn,.-.LSTART_sigreturn
|
||||
|
||||
.section .text.rtsigreturn,"ax"
|
||||
.balign 32
|
||||
.globl __kernel_rt_sigreturn
|
||||
.type __kernel_rt_sigreturn,@function
|
||||
__kernel_rt_sigreturn:
|
||||
.LSTART_rt_sigreturn:
|
||||
movl $__NR_ia32_rt_sigreturn, %eax
|
||||
SYSCALL_ENTER_KERNEL
|
||||
.LEND_rt_sigreturn:
|
||||
.size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
|
||||
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAMES:
|
||||
.long .LENDCIES-.LSTARTCIES
|
||||
.LSTARTCIES:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zRS" /* NUL-terminated augmentation string */
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address register column */
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0x0c /* DW_CFA_def_cfa */
|
||||
.uleb128 4
|
||||
.uleb128 4
|
||||
.byte 0x88 /* DW_CFA_offset, column 0x8 */
|
||||
.uleb128 1
|
||||
.align 4
|
||||
.LENDCIES:
|
||||
|
||||
.long .LENDFDE2-.LSTARTFDE2 /* Length FDE */
|
||||
.LSTARTFDE2:
|
||||
.long .LSTARTFDE2-.LSTARTFRAMES /* CIE pointer */
|
||||
/* HACK: The dwarf2 unwind routines will subtract 1 from the
|
||||
return address to get an address in the middle of the
|
||||
presumed call instruction. Since we didn't get here via
|
||||
a call, we need to include the nop before the real start
|
||||
to make up for it. */
|
||||
.long .LSTART_sigreturn-1-. /* PC-relative start address */
|
||||
.long .LEND_sigreturn-.LSTART_sigreturn+1
|
||||
.uleb128 0 /* Augmentation length */
|
||||
/* What follows are the instructions for the table generation.
|
||||
We record the locations of each register saved. This is
|
||||
complicated by the fact that the "CFA" is always assumed to
|
||||
be the value of the stack pointer in the caller. This means
|
||||
that we must define the CFA of this body of code to be the
|
||||
saved value of the stack pointer in the sigcontext. Which
|
||||
also means that there is no fixed relation to the other
|
||||
saved registers, which means that we must use DW_CFA_expression
|
||||
to compute their addresses. It also means that when we
|
||||
adjust the stack with the popl, we have to do it all over again. */
|
||||
|
||||
#define do_cfa_expr(offset) \
|
||||
.byte 0x0f; /* DW_CFA_def_cfa_expression */ \
|
||||
.uleb128 1f-0f; /* length */ \
|
||||
0: .byte 0x74; /* DW_OP_breg4 */ \
|
||||
.sleb128 offset; /* offset */ \
|
||||
.byte 0x06; /* DW_OP_deref */ \
|
||||
1:
|
||||
|
||||
#define do_expr(regno, offset) \
|
||||
.byte 0x10; /* DW_CFA_expression */ \
|
||||
.uleb128 regno; /* regno */ \
|
||||
.uleb128 1f-0f; /* length */ \
|
||||
0: .byte 0x74; /* DW_OP_breg4 */ \
|
||||
.sleb128 offset; /* offset */ \
|
||||
1:
|
||||
|
||||
do_cfa_expr(IA32_SIGCONTEXT_esp+4)
|
||||
do_expr(0, IA32_SIGCONTEXT_eax+4)
|
||||
do_expr(1, IA32_SIGCONTEXT_ecx+4)
|
||||
do_expr(2, IA32_SIGCONTEXT_edx+4)
|
||||
do_expr(3, IA32_SIGCONTEXT_ebx+4)
|
||||
do_expr(5, IA32_SIGCONTEXT_ebp+4)
|
||||
do_expr(6, IA32_SIGCONTEXT_esi+4)
|
||||
do_expr(7, IA32_SIGCONTEXT_edi+4)
|
||||
do_expr(8, IA32_SIGCONTEXT_eip+4)
|
||||
|
||||
.byte 0x42 /* DW_CFA_advance_loc 2 -- nop; popl eax. */
|
||||
|
||||
do_cfa_expr(IA32_SIGCONTEXT_esp)
|
||||
do_expr(0, IA32_SIGCONTEXT_eax)
|
||||
do_expr(1, IA32_SIGCONTEXT_ecx)
|
||||
do_expr(2, IA32_SIGCONTEXT_edx)
|
||||
do_expr(3, IA32_SIGCONTEXT_ebx)
|
||||
do_expr(5, IA32_SIGCONTEXT_ebp)
|
||||
do_expr(6, IA32_SIGCONTEXT_esi)
|
||||
do_expr(7, IA32_SIGCONTEXT_edi)
|
||||
do_expr(8, IA32_SIGCONTEXT_eip)
|
||||
|
||||
.align 4
|
||||
.LENDFDE2:
|
||||
|
||||
.long .LENDFDE3-.LSTARTFDE3 /* Length FDE */
|
||||
.LSTARTFDE3:
|
||||
.long .LSTARTFDE3-.LSTARTFRAMES /* CIE pointer */
|
||||
/* HACK: See above wrt unwind library assumptions. */
|
||||
.long .LSTART_rt_sigreturn-1-. /* PC-relative start address */
|
||||
.long .LEND_rt_sigreturn-.LSTART_rt_sigreturn+1
|
||||
.uleb128 0 /* Augmentation */
|
||||
/* What follows are the instructions for the table generation.
|
||||
We record the locations of each register saved. This is
|
||||
slightly less complicated than the above, since we don't
|
||||
modify the stack pointer in the process. */
|
||||
|
||||
do_cfa_expr(IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_esp)
|
||||
do_expr(0, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_eax)
|
||||
do_expr(1, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ecx)
|
||||
do_expr(2, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_edx)
|
||||
do_expr(3, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ebx)
|
||||
do_expr(5, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ebp)
|
||||
do_expr(6, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_esi)
|
||||
do_expr(7, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_edi)
|
||||
do_expr(8, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_eip)
|
||||
|
||||
.align 4
|
||||
.LENDFDE3:
|
||||
|
||||
#include "../vdso/vdso32/note.S"
|
|
@ -1,69 +0,0 @@
|
|||
/*
|
||||
* Code for the vsyscall page. This version uses the syscall instruction.
|
||||
*/
|
||||
|
||||
#include <asm/ia32_unistd.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/segment.h>
|
||||
|
||||
.code32
|
||||
.text
|
||||
.section .text.vsyscall,"ax"
|
||||
.globl __kernel_vsyscall
|
||||
.type __kernel_vsyscall,@function
|
||||
__kernel_vsyscall:
|
||||
.LSTART_vsyscall:
|
||||
push %ebp
|
||||
.Lpush_ebp:
|
||||
movl %ecx, %ebp
|
||||
syscall
|
||||
movl $__USER32_DS, %ecx
|
||||
movl %ecx, %ss
|
||||
movl %ebp, %ecx
|
||||
popl %ebp
|
||||
.Lpop_ebp:
|
||||
ret
|
||||
.LEND_vsyscall:
|
||||
.size __kernel_vsyscall,.-.LSTART_vsyscall
|
||||
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAME:
|
||||
.long .LENDCIE-.LSTARTCIE
|
||||
.LSTARTCIE:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zR" /* NUL-terminated augmentation string */
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address register column */
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0x0c /* DW_CFA_def_cfa */
|
||||
.uleb128 4
|
||||
.uleb128 4
|
||||
.byte 0x88 /* DW_CFA_offset, column 0x8 */
|
||||
.uleb128 1
|
||||
.align 4
|
||||
.LENDCIE:
|
||||
|
||||
.long .LENDFDE1-.LSTARTFDE1 /* Length FDE */
|
||||
.LSTARTFDE1:
|
||||
.long .LSTARTFDE1-.LSTARTFRAME /* CIE pointer */
|
||||
.long .LSTART_vsyscall-. /* PC-relative start address */
|
||||
.long .LEND_vsyscall-.LSTART_vsyscall
|
||||
.uleb128 0 /* Augmentation length */
|
||||
/* What follows are the instructions for the table generation.
|
||||
We have to record all changes of the stack pointer. */
|
||||
.byte 0x40 + .Lpush_ebp-.LSTART_vsyscall /* DW_CFA_advance_loc */
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.uleb128 8
|
||||
.byte 0x85, 0x02 /* DW_CFA_offset %ebp -8 */
|
||||
.byte 0x40 + .Lpop_ebp-.Lpush_ebp /* DW_CFA_advance_loc */
|
||||
.byte 0xc5 /* DW_CFA_restore %ebp */
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.uleb128 4
|
||||
.align 4
|
||||
.LENDFDE1:
|
||||
|
||||
#define SYSCALL_ENTER_KERNEL syscall
|
||||
#include "vsyscall-sigreturn.S"
|
|
@ -1,95 +0,0 @@
|
|||
/*
|
||||
* Code for the vsyscall page. This version uses the sysenter instruction.
|
||||
*/
|
||||
|
||||
#include <asm/ia32_unistd.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
.code32
|
||||
.text
|
||||
.section .text.vsyscall,"ax"
|
||||
.globl __kernel_vsyscall
|
||||
.type __kernel_vsyscall,@function
|
||||
__kernel_vsyscall:
|
||||
.LSTART_vsyscall:
|
||||
push %ecx
|
||||
.Lpush_ecx:
|
||||
push %edx
|
||||
.Lpush_edx:
|
||||
push %ebp
|
||||
.Lenter_kernel:
|
||||
movl %esp,%ebp
|
||||
sysenter
|
||||
.space 7,0x90
|
||||
jmp .Lenter_kernel
|
||||
/* 16: System call normal return point is here! */
|
||||
pop %ebp
|
||||
.Lpop_ebp:
|
||||
pop %edx
|
||||
.Lpop_edx:
|
||||
pop %ecx
|
||||
.Lpop_ecx:
|
||||
ret
|
||||
.LEND_vsyscall:
|
||||
.size __kernel_vsyscall,.-.LSTART_vsyscall
|
||||
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAME:
|
||||
.long .LENDCIE-.LSTARTCIE
|
||||
.LSTARTCIE:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zR" /* NUL-terminated augmentation string */
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address register column */
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0x0c /* DW_CFA_def_cfa */
|
||||
.uleb128 4
|
||||
.uleb128 4
|
||||
.byte 0x88 /* DW_CFA_offset, column 0x8 */
|
||||
.uleb128 1
|
||||
.align 4
|
||||
.LENDCIE:
|
||||
|
||||
.long .LENDFDE1-.LSTARTFDE1 /* Length FDE */
|
||||
.LSTARTFDE1:
|
||||
.long .LSTARTFDE1-.LSTARTFRAME /* CIE pointer */
|
||||
.long .LSTART_vsyscall-. /* PC-relative start address */
|
||||
.long .LEND_vsyscall-.LSTART_vsyscall
|
||||
.uleb128 0 /* Augmentation length */
|
||||
/* What follows are the instructions for the table generation.
|
||||
We have to record all changes of the stack pointer. */
|
||||
.byte 0x04 /* DW_CFA_advance_loc4 */
|
||||
.long .Lpush_ecx-.LSTART_vsyscall
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.byte 0x08 /* RA at offset 8 now */
|
||||
.byte 0x04 /* DW_CFA_advance_loc4 */
|
||||
.long .Lpush_edx-.Lpush_ecx
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.byte 0x0c /* RA at offset 12 now */
|
||||
.byte 0x04 /* DW_CFA_advance_loc4 */
|
||||
.long .Lenter_kernel-.Lpush_edx
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.byte 0x10 /* RA at offset 16 now */
|
||||
.byte 0x85, 0x04 /* DW_CFA_offset %ebp -16 */
|
||||
/* Finally the epilogue. */
|
||||
.byte 0x04 /* DW_CFA_advance_loc4 */
|
||||
.long .Lpop_ebp-.Lenter_kernel
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.byte 0x12 /* RA at offset 12 now */
|
||||
.byte 0xc5 /* DW_CFA_restore %ebp */
|
||||
.byte 0x04 /* DW_CFA_advance_loc4 */
|
||||
.long .Lpop_edx-.Lpop_ebp
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.byte 0x08 /* RA at offset 8 now */
|
||||
.byte 0x04 /* DW_CFA_advance_loc4 */
|
||||
.long .Lpop_ecx-.Lpop_edx
|
||||
.byte 0x0e /* DW_CFA_def_cfa_offset */
|
||||
.byte 0x04 /* RA at offset 4 now */
|
||||
.align 4
|
||||
.LENDFDE1:
|
||||
|
||||
#define SYSCALL_ENTER_KERNEL int $0x80
|
||||
#include "vsyscall-sigreturn.S"
|
|
@ -1,80 +0,0 @@
|
|||
/*
|
||||
* Linker script for vsyscall DSO. The vsyscall page is an ELF shared
|
||||
* object prelinked to its virtual address. This script controls its layout.
|
||||
*/
|
||||
|
||||
/* This must match <asm/fixmap.h>. */
|
||||
VSYSCALL_BASE = 0xffffe000;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = VSYSCALL_BASE + SIZEOF_HEADERS;
|
||||
|
||||
.hash : { *(.hash) } :text
|
||||
.gnu.hash : { *(.gnu.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
|
||||
/* This linker script is used both with -r and with -shared.
|
||||
For the layouts to match, we need to skip more than enough
|
||||
space for the dynamic symbol table et al. If this amount
|
||||
is insufficient, ld -shared will barf. Just increase it here. */
|
||||
. = VSYSCALL_BASE + 0x400;
|
||||
|
||||
.text.vsyscall : { *(.text.vsyscall) } :text =0x90909090
|
||||
|
||||
/* This is an 32bit object and we cannot easily get the offsets
|
||||
into the 64bit kernel. Just hardcode them here. This assumes
|
||||
that all the stubs don't need more than 0x100 bytes. */
|
||||
. = VSYSCALL_BASE + 0x500;
|
||||
|
||||
.text.sigreturn : { *(.text.sigreturn) } :text =0x90909090
|
||||
|
||||
. = VSYSCALL_BASE + 0x600;
|
||||
|
||||
.text.rtsigreturn : { *(.text.rtsigreturn) } :text =0x90909090
|
||||
|
||||
.note : { *(.note.*) } :text :note
|
||||
.eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr
|
||||
.eh_frame : { KEEP (*(.eh_frame)) } :text
|
||||
.dynamic : { *(.dynamic) } :text :dynamic
|
||||
.useless : {
|
||||
*(.got.plt) *(.got)
|
||||
*(.data .data.* .gnu.linkonce.d.*)
|
||||
*(.dynbss)
|
||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||
} :text
|
||||
}
|
||||
|
||||
/*
|
||||
* We must supply the ELF program headers explicitly to get just one
|
||||
* PT_LOAD segment, and set the flags explicitly to make segments read-only.
|
||||
*/
|
||||
PHDRS
|
||||
{
|
||||
text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */
|
||||
dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
|
||||
note PT_NOTE FLAGS(4); /* PF_R */
|
||||
eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */
|
||||
}
|
||||
|
||||
/*
|
||||
* This controls what symbols we export from the DSO.
|
||||
*/
|
||||
VERSION
|
||||
{
|
||||
LINUX_2.5 {
|
||||
global:
|
||||
__kernel_vsyscall;
|
||||
__kernel_sigreturn;
|
||||
__kernel_rt_sigreturn;
|
||||
|
||||
local: *;
|
||||
};
|
||||
}
|
||||
|
||||
/* The ELF entry point can be used to set the AT_SYSINFO value. */
|
||||
ENTRY(__kernel_vsyscall);
|
|
@ -9,7 +9,6 @@ header-y += prctl.h
|
|||
header-y += ptrace-abi.h
|
||||
header-y += sigcontext32.h
|
||||
header-y += ucontext.h
|
||||
header-y += vsyscall32.h
|
||||
|
||||
unifdef-y += e820.h
|
||||
unifdef-y += ist.h
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
#ifndef _ASM_VSYSCALL32_H
|
||||
#define _ASM_VSYSCALL32_H 1
|
||||
|
||||
/* Values need to match arch/x86_64/ia32/vsyscall.lds */
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#define VSYSCALL32_BASE 0xffffe000
|
||||
#define VSYSCALL32_SYSEXIT (VSYSCALL32_BASE + 0x410)
|
||||
#else
|
||||
#define VSYSCALL32_BASE 0xffffe000UL
|
||||
#define VSYSCALL32_END (VSYSCALL32_BASE + PAGE_SIZE)
|
||||
#define VSYSCALL32_EHDR ((const struct elf32_hdr *) VSYSCALL32_BASE)
|
||||
|
||||
#define VSYSCALL32_VSYSCALL ((void *)VSYSCALL32_BASE + 0x400)
|
||||
#define VSYSCALL32_SYSEXIT ((void *)VSYSCALL32_BASE + 0x410)
|
||||
#define VSYSCALL32_SIGRETURN ((void __user *)VSYSCALL32_BASE + 0x500)
|
||||
#define VSYSCALL32_RTSIGRETURN ((void __user *)VSYSCALL32_BASE + 0x600)
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue