diff options
author | Alex Smith <alex.smith@imgtec.com> | 2015-10-21 04:54:38 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2015-11-11 02:36:36 -0500 |
commit | ebb5e78cc63417a35254a791de66e1cc84f963cc (patch) | |
tree | 49814946abe594cb8e7a11ce8d0a5fdaabb49d31 /arch/mips/kernel/signal32.c | |
parent | 22773aa9b95657f0adc2b5342428d9da7a6d5d02 (diff) |
MIPS: Initial implementation of a VDSO
Add an initial implementation of a proper (i.e. an ELF shared library)
VDSO. With this commit it does not export any symbols, it only replaces
the current signal return trampoline page. A later commit will add user
implementations of gettimeofday()/clock_gettime().
To support both new toolchains and old ones which don't generate ABI
flags section, we define its content manually and then use a tool
(genvdso) to patch up the section to have the correct name and type.
genvdso also extracts symbol offsets ({,rt_}sigreturn) needed by the
kernel, and generates a C file containing a "struct mips_vdso_image"
containing both the VDSO data and these offsets. This C file is
compiled into the kernel.
On 64-bit kernels we require a different VDSO for each supported ABI,
so we may build up to 3 different VDSOs. The VDSO to use is selected by
the mips_abi structure.
A kernel/user shared data page is created and mapped below the VDSO
image. This is currently empty, but will be used by the user time
function implementations which are added later.
[markos.chandras@imgtec.com:
- Add more comments
- Move abi detection in genvdso.h since it's the get_symbol function
that needs it.
- Add an R6 specific way to calculate the base address of VDSO in order
to avoid the branch instruction which affects performance.
- Do not patch .gnu.attributes since it's not needed for dynamic linking.
- Simplify Makefile a little bit.
- checkpatch fixes
- Restrict VDSO support for binutils < 2.25 for pre-R6
- Include atomic64.h for O32 variant on MIPS64]
Signed-off-by: Alex Smith <alex.smith@imgtec.com>
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Cc: Matthew Fortune <matthew.fortune@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/11337/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/signal32.c')
-rw-r--r-- | arch/mips/kernel/signal32.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index f7e89524e316..4909639aa35b 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <asm/ucontext.h> | 31 | #include <asm/ucontext.h> |
32 | #include <asm/fpu.h> | 32 | #include <asm/fpu.h> |
33 | #include <asm/war.h> | 33 | #include <asm/war.h> |
34 | #include <asm/vdso.h> | ||
35 | #include <asm/dsp.h> | 34 | #include <asm/dsp.h> |
36 | 35 | ||
37 | #include "signal-common.h" | 36 | #include "signal-common.h" |
@@ -406,14 +405,12 @@ static int setup_rt_frame_32(void *sig_return, struct ksignal *ksig, | |||
406 | */ | 405 | */ |
407 | struct mips_abi mips_abi_32 = { | 406 | struct mips_abi mips_abi_32 = { |
408 | .setup_frame = setup_frame_32, | 407 | .setup_frame = setup_frame_32, |
409 | .signal_return_offset = | ||
410 | offsetof(struct mips_vdso, o32_signal_trampoline), | ||
411 | .setup_rt_frame = setup_rt_frame_32, | 408 | .setup_rt_frame = setup_rt_frame_32, |
412 | .rt_signal_return_offset = | ||
413 | offsetof(struct mips_vdso, o32_rt_signal_trampoline), | ||
414 | .restart = __NR_O32_restart_syscall, | 409 | .restart = __NR_O32_restart_syscall, |
415 | 410 | ||
416 | .off_sc_fpregs = offsetof(struct sigcontext32, sc_fpregs), | 411 | .off_sc_fpregs = offsetof(struct sigcontext32, sc_fpregs), |
417 | .off_sc_fpc_csr = offsetof(struct sigcontext32, sc_fpc_csr), | 412 | .off_sc_fpc_csr = offsetof(struct sigcontext32, sc_fpc_csr), |
418 | .off_sc_used_math = offsetof(struct sigcontext32, sc_used_math), | 413 | .off_sc_used_math = offsetof(struct sigcontext32, sc_used_math), |
414 | |||
415 | .vdso = &vdso_image_o32, | ||
419 | }; | 416 | }; |