mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 09:01:36 -04:00
x86/vdso: Allocate vvar page from C code
Allocate the vvar page through the standard union vdso_data_store and remove the custom linker script logic. Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/all/20241010-vdso-generic-base-v1-14-b64f0842d512@linutronix.de
This commit is contained in:
committed by
Thomas Gleixner
parent
7821571be9
commit
7175126a6d
@@ -20,25 +20,19 @@
|
||||
#include <asm/vgtod.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/vvar.h>
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <clocksource/hyperv_timer.h>
|
||||
|
||||
#undef _ASM_X86_VVAR_H
|
||||
#define EMIT_VVAR(name, offset) \
|
||||
const size_t name ## _offset = offset;
|
||||
#include <asm/vvar.h>
|
||||
|
||||
struct vdso_data *arch_get_vdso_data(void *vvar_page)
|
||||
{
|
||||
return (struct vdso_data *)(vvar_page + _vdso_data_offset);
|
||||
return (struct vdso_data *)vvar_page;
|
||||
}
|
||||
#undef EMIT_VVAR
|
||||
|
||||
DEFINE_VVAR(struct vdso_data, _vdso_data);
|
||||
static union vdso_data_store vdso_data_store __page_aligned_data;
|
||||
struct vdso_data *vdso_data = vdso_data_store.data;
|
||||
|
||||
unsigned int vclocks_used __read_mostly;
|
||||
|
||||
@@ -153,7 +147,7 @@ static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
|
||||
if (sym_offset == image->sym_vvar_page) {
|
||||
struct page *timens_page = find_timens_vvar_page(vma);
|
||||
|
||||
pfn = __pa_symbol(&__vvar_page) >> PAGE_SHIFT;
|
||||
pfn = __pa_symbol(vdso_data) >> PAGE_SHIFT;
|
||||
|
||||
/*
|
||||
* If a task belongs to a time namespace then a namespace
|
||||
@@ -200,7 +194,7 @@ static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
|
||||
if (!timens_page)
|
||||
return VM_FAULT_SIGBUS;
|
||||
|
||||
pfn = __pa_symbol(&__vvar_page) >> PAGE_SHIFT;
|
||||
pfn = __pa_symbol(vdso_data) >> PAGE_SHIFT;
|
||||
return vmf_insert_pfn(vma, vmf->address, pfn);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,20 +8,22 @@
|
||||
#include <asm/vgtod.h>
|
||||
#include <asm/vvar.h>
|
||||
|
||||
extern struct vdso_data *vdso_data;
|
||||
|
||||
/*
|
||||
* Update the vDSO data page to keep in sync with kernel timekeeping.
|
||||
*/
|
||||
static __always_inline
|
||||
struct vdso_data *__x86_get_k_vdso_data(void)
|
||||
{
|
||||
return _vdso_data;
|
||||
return vdso_data;
|
||||
}
|
||||
#define __arch_get_k_vdso_data __x86_get_k_vdso_data
|
||||
|
||||
static __always_inline
|
||||
struct vdso_rng_data *__x86_get_k_vdso_rng_data(void)
|
||||
{
|
||||
return (void *)&__vvar_page + __VDSO_RND_DATA_OFFSET;
|
||||
return (void *)vdso_data + __VDSO_RND_DATA_OFFSET;
|
||||
}
|
||||
#define __arch_get_k_vdso_rng_data __x86_get_k_vdso_rng_data
|
||||
|
||||
|
||||
@@ -193,29 +193,6 @@ SECTIONS
|
||||
|
||||
ORC_UNWIND_TABLE
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__vvar_page = .;
|
||||
|
||||
.vvar : AT(ADDR(.vvar) - LOAD_OFFSET) {
|
||||
/* work around gold bug 13023 */
|
||||
__vvar_beginning_hack = .;
|
||||
|
||||
/* Place all vvars at the offsets in asm/vvar.h. */
|
||||
#define EMIT_VVAR(name, offset) \
|
||||
. = __vvar_beginning_hack + offset; \
|
||||
*(.vvar_ ## name)
|
||||
#include <asm/vvar.h>
|
||||
#undef EMIT_VVAR
|
||||
|
||||
/*
|
||||
* Pad the rest of the page with zeros. Otherwise the loader
|
||||
* can leave garbage here.
|
||||
*/
|
||||
. = __vvar_beginning_hack + PAGE_SIZE;
|
||||
} :data
|
||||
|
||||
. = ALIGN(__vvar_page + PAGE_SIZE, PAGE_SIZE);
|
||||
|
||||
/* Init code and data - will be freed after init */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) {
|
||||
|
||||
@@ -89,7 +89,6 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = {
|
||||
"init_per_cpu__.*|"
|
||||
"__end_rodata_hpage_align|"
|
||||
#endif
|
||||
"__vvar_page|"
|
||||
"_end)$"
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user