mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
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>
This commit is contained in:
@@ -1,29 +1,70 @@
|
||||
/*
|
||||
* 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) 2015 Imagination Technologies
|
||||
* Author: Alex Smith <alex.smith@imgtec.com>
|
||||
*
|
||||
* Copyright (C) 2009 Cavium Networks
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_VDSO_H
|
||||
#define __ASM_VDSO_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/mm_types.h>
|
||||
|
||||
/**
|
||||
* struct mips_vdso_image - Details of a VDSO image.
|
||||
* @data: Pointer to VDSO image data (page-aligned).
|
||||
* @size: Size of the VDSO image data (page-aligned).
|
||||
* @off_sigreturn: Offset of the sigreturn() trampoline.
|
||||
* @off_rt_sigreturn: Offset of the rt_sigreturn() trampoline.
|
||||
* @mapping: Special mapping structure.
|
||||
*
|
||||
* This structure contains details of a VDSO image, including the image data
|
||||
* and offsets of certain symbols required by the kernel. It is generated as
|
||||
* part of the VDSO build process, aside from the mapping page array, which is
|
||||
* populated at runtime.
|
||||
*/
|
||||
struct mips_vdso_image {
|
||||
void *data;
|
||||
unsigned long size;
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
struct mips_vdso {
|
||||
u32 signal_trampoline[2];
|
||||
u32 rt_signal_trampoline[2];
|
||||
unsigned long off_sigreturn;
|
||||
unsigned long off_rt_sigreturn;
|
||||
|
||||
struct vm_special_mapping mapping;
|
||||
};
|
||||
#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];
|
||||
|
||||
/*
|
||||
* The following structures are auto-generated as part of the build for each
|
||||
* ABI by genvdso, see arch/mips/vdso/Makefile.
|
||||
*/
|
||||
|
||||
extern struct mips_vdso_image vdso_image;
|
||||
|
||||
#ifdef CONFIG_MIPS32_O32
|
||||
extern struct mips_vdso_image vdso_image_o32;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MIPS32_N32
|
||||
extern struct mips_vdso_image vdso_image_n32;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* union mips_vdso_data - Data provided by the kernel for the VDSO.
|
||||
*
|
||||
* This structure contains data needed by functions within the VDSO. It is
|
||||
* populated by the kernel and mapped read-only into user memory.
|
||||
*
|
||||
* Note: Care should be taken when modifying as the layout must remain the same
|
||||
* for both 64- and 32-bit (for 32-bit userland on 64-bit kernel).
|
||||
*/
|
||||
union mips_vdso_data {
|
||||
struct {
|
||||
};
|
||||
|
||||
u8 page[PAGE_SIZE];
|
||||
};
|
||||
#endif /* CONFIG_32BIT */
|
||||
|
||||
#endif /* __ASM_VDSO_H */
|
||||
|
||||
Reference in New Issue
Block a user