Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c52d0d30 authored by David Daney's avatar David Daney Committed by Ralf Baechle
Browse files

MIPS: Preliminary VDSO



This is a preliminary patch to add a vdso to all user processes.  Still
missing are ELF headers and .eh_frame information.  But it is enough to
allow us to move signal trampolines off of the stack.  Note that emulation
of branch delay slots in the FPU emulator still requires the stack.

We allocate a single page (the vdso) and write all possible signal
trampolines into it.  The stack is moved down by one page and the vdso is
mapped into this space.

Signed-off-by: default avatarDavid Daney <ddaney@caviumnetworks.com>
To: linux-mips@linux-mips.org
Patchwork: http://patchwork.linux-mips.org/patch/975/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 58b9e223
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -368,4 +368,8 @@ extern const char *__elf_platform;
#define ELF_ET_DYN_BASE         (TASK_SIZE / 3 * 2)
#endif

#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
struct linux_binprm;
extern int arch_setup_additional_pages(struct linux_binprm *bprm,
				       int uses_interp);
#endif /* _ASM_ELF_H */
+4 −1
Original line number Diff line number Diff line
#ifndef __ASM_MMU_H
#define __ASM_MMU_H

typedef unsigned long mm_context_t[NR_CPUS];
typedef struct {
	unsigned long asid[NR_CPUS];
	void *vdso;
} mm_context_t;

#endif /* __ASM_MMU_H */
+1 −1
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ extern unsigned long smtc_asid_mask;

#endif

#define cpu_context(cpu, mm)	((mm)->context[cpu])
#define cpu_context(cpu, mm)	((mm)->context.asid[cpu])
#define cpu_asid(cpu, mm)	(cpu_context((cpu), (mm)) & ASID_MASK)
#define asid_cache(cpu)		(cpu_data[cpu].asid_cache)

+9 −2
Original line number Diff line number Diff line
@@ -33,13 +33,19 @@ extern void (*cpu_wait)(void);

extern unsigned int vced_count, vcei_count;

/*
 * A special page (the vdso) is mapped into all processes at the very
 * top of the virtual memory space.
 */
#define SPECIAL_PAGES_SIZE PAGE_SIZE

#ifdef CONFIG_32BIT
/*
 * User space process size: 2GB. This is hardcoded into a few places,
 * so don't change it unless you know what you are doing.
 */
#define TASK_SIZE	0x7fff8000UL
#define STACK_TOP	TASK_SIZE
#define STACK_TOP	((TASK_SIZE & PAGE_MASK) - SPECIAL_PAGES_SIZE)

/*
 * This decides where the kernel will search for a free chunk of vm
@@ -59,7 +65,8 @@ extern unsigned int vced_count, vcei_count;
#define TASK_SIZE32	0x7fff8000UL
#define TASK_SIZE	0x10000000000UL
#define STACK_TOP	\
      (test_thread_flag(TIF_32BIT_ADDR) ? TASK_SIZE32 : TASK_SIZE)
	(((test_thread_flag(TIF_32BIT_ADDR) ?				\
	   TASK_SIZE32 : TASK_SIZE) & PAGE_MASK) - SPECIAL_PAGES_SIZE)

/*
 * This decides where the kernel will search for a free chunk of vm
+29 −0
Original line number Diff line number Diff line
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2009 Cavium Networks
 */

#ifndef __ASM_VDSO_H
#define __ASM_VDSO_H

#include <linux/types.h>


#ifdef CONFIG_32BIT
struct mips_vdso {
	u32 signal_trampoline[2];
	u32 rt_signal_trampoline[2];
};
#else  /* !CONFIG_32BIT */
struct mips_vdso {
	u32 o32_signal_trampoline[2];
	u32 o32_rt_signal_trampoline[2];
	u32 rt_signal_trampoline[2];
	u32 n32_rt_signal_trampoline[2];
};
#endif /* CONFIG_32BIT */

#endif /* __ASM_VDSO_H */
Loading