Merge branches 'x86/urgent', 'x86/amd-iommu', 'x86/apic', 'x86/cleanups', 'x86/core', 'x86/cpu', 'x86/fixmap', 'x86/gart', 'x86/kprobes', 'x86/memtest', 'x86/modules', 'x86/nmi', 'x86/pat', 'x86/reboot', 'x86/setup', 'x86/step', 'x86/unify-pci', 'x86/uv', 'x86/xen' and 'xen-64bit' into x86/for-linus
This commit is contained in:

@@ -62,7 +62,7 @@ $(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE
|
||||
# Build multiple 32-bit vDSO images to choose from at boot time.
|
||||
#
|
||||
obj-$(VDSO32-y) += vdso32-syms.lds
|
||||
vdso32.so-$(CONFIG_X86_32) += int80
|
||||
vdso32.so-$(VDSO32-y) += int80
|
||||
vdso32.so-$(CONFIG_COMPAT) += syscall
|
||||
vdso32.so-$(VDSO32-y) += sysenter
|
||||
|
||||
|
@@ -193,17 +193,12 @@ static __init void relocate_vdso(Elf32_Ehdr *ehdr)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* These symbols are defined by vdso32.S to mark the bounds
|
||||
* of the ELF DSO images included therein.
|
||||
*/
|
||||
extern const char vdso32_default_start, vdso32_default_end;
|
||||
extern const char vdso32_sysenter_start, vdso32_sysenter_end;
|
||||
static struct page *vdso32_pages[1];
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
#define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SYSENTER32))
|
||||
#define vdso32_syscall() (boot_cpu_has(X86_FEATURE_SYSCALL32))
|
||||
|
||||
/* May not be __init: called during resume */
|
||||
void syscall32_cpu_init(void)
|
||||
@@ -226,6 +221,7 @@ static inline void map_compat_vdso(int map)
|
||||
#else /* CONFIG_X86_32 */
|
||||
|
||||
#define vdso32_sysenter() (boot_cpu_has(X86_FEATURE_SEP))
|
||||
#define vdso32_syscall() (0)
|
||||
|
||||
void enable_sep_cpu(void)
|
||||
{
|
||||
@@ -296,12 +292,15 @@ int __init sysenter_setup(void)
|
||||
gate_vma_init();
|
||||
#endif
|
||||
|
||||
if (!vdso32_sysenter()) {
|
||||
vsyscall = &vdso32_default_start;
|
||||
vsyscall_len = &vdso32_default_end - &vdso32_default_start;
|
||||
} else {
|
||||
if (vdso32_syscall()) {
|
||||
vsyscall = &vdso32_syscall_start;
|
||||
vsyscall_len = &vdso32_syscall_end - &vdso32_syscall_start;
|
||||
} else if (vdso32_sysenter()){
|
||||
vsyscall = &vdso32_sysenter_start;
|
||||
vsyscall_len = &vdso32_sysenter_end - &vdso32_sysenter_start;
|
||||
} else {
|
||||
vsyscall = &vdso32_int80_start;
|
||||
vsyscall_len = &vdso32_int80_end - &vdso32_int80_start;
|
||||
}
|
||||
|
||||
memcpy(syscall_page, vsyscall, vsyscall_len);
|
||||
|
@@ -2,14 +2,17 @@
|
||||
|
||||
__INITDATA
|
||||
|
||||
.globl vdso32_default_start, vdso32_default_end
|
||||
vdso32_default_start:
|
||||
#ifdef CONFIG_X86_32
|
||||
.globl vdso32_int80_start, vdso32_int80_end
|
||||
vdso32_int80_start:
|
||||
.incbin "arch/x86/vdso/vdso32-int80.so"
|
||||
#else
|
||||
vdso32_int80_end:
|
||||
|
||||
.globl vdso32_syscall_start, vdso32_syscall_end
|
||||
vdso32_syscall_start:
|
||||
#ifdef CONFIG_COMPAT
|
||||
.incbin "arch/x86/vdso/vdso32-syscall.so"
|
||||
#endif
|
||||
vdso32_default_end:
|
||||
vdso32_syscall_end:
|
||||
|
||||
.globl vdso32_sysenter_start, vdso32_sysenter_end
|
||||
vdso32_sysenter_start:
|
||||
|
@@ -21,7 +21,8 @@ unsigned int __read_mostly vdso_enabled = 1;
|
||||
extern char vdso_start[], vdso_end[];
|
||||
extern unsigned short vdso_sync_cpuid;
|
||||
|
||||
struct page **vdso_pages;
|
||||
static struct page **vdso_pages;
|
||||
static unsigned vdso_size;
|
||||
|
||||
static inline void *var_ref(void *p, char *name)
|
||||
{
|
||||
@@ -38,6 +39,7 @@ static int __init init_vdso_vars(void)
|
||||
int i;
|
||||
char *vbase;
|
||||
|
||||
vdso_size = npages << PAGE_SHIFT;
|
||||
vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL);
|
||||
if (!vdso_pages)
|
||||
goto oom;
|
||||
@@ -101,20 +103,19 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long addr;
|
||||
int ret;
|
||||
unsigned len = round_up(vdso_end - vdso_start, PAGE_SIZE);
|
||||
|
||||
if (!vdso_enabled)
|
||||
return 0;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
addr = vdso_addr(mm->start_stack, len);
|
||||
addr = get_unmapped_area(NULL, addr, len, 0, 0);
|
||||
addr = vdso_addr(mm->start_stack, vdso_size);
|
||||
addr = get_unmapped_area(NULL, addr, vdso_size, 0, 0);
|
||||
if (IS_ERR_VALUE(addr)) {
|
||||
ret = addr;
|
||||
goto up_fail;
|
||||
}
|
||||
|
||||
ret = install_special_mapping(mm, addr, len,
|
||||
ret = install_special_mapping(mm, addr, vdso_size,
|
||||
VM_READ|VM_EXEC|
|
||||
VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC|
|
||||
VM_ALWAYSDUMP,
|
||||
|
Reference in New Issue
Block a user