mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:38:03 +00:00
LoongArch: vDSO: Use vdso/datapage.h to access vDSO data
vdso/datapage.h provides symbols and functions to ease the access to shared vDSO data from both the kernel and the vDSO. Make use of it to simplify the current code and also prepare for further changes unifying the vDSO data storage between architectures. 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-8-b64f0842d512@linutronix.de
This commit is contained in:
parent
2bb79470e5
commit
dc32cb4ba6
@ -30,8 +30,7 @@ static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, uns
|
|||||||
|
|
||||||
static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void)
|
static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void)
|
||||||
{
|
{
|
||||||
return (const struct vdso_rng_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGES_START *
|
return &_loongarch_data.rng_data;
|
||||||
PAGE_SIZE + offsetof(struct loongarch_vdso_data, rng_data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
@ -91,14 +91,14 @@ static inline bool loongarch_vdso_hres_capable(void)
|
|||||||
|
|
||||||
static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
|
static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
|
||||||
{
|
{
|
||||||
return (const struct vdso_data *)get_vdso_data();
|
return _vdso_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TIME_NS
|
#ifdef CONFIG_TIME_NS
|
||||||
static __always_inline
|
static __always_inline
|
||||||
const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd)
|
const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd)
|
||||||
{
|
{
|
||||||
return (const struct vdso_data *)(get_vdso_data() + VVAR_TIMENS_PAGE_OFFSET * PAGE_SIZE);
|
return _timens_data;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
@ -48,23 +48,7 @@ enum vvar_pages {
|
|||||||
|
|
||||||
#define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT)
|
#define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT)
|
||||||
|
|
||||||
static inline unsigned long get_vdso_base(void)
|
extern struct loongarch_vdso_data _loongarch_data __attribute__((visibility("hidden")));
|
||||||
{
|
|
||||||
unsigned long addr;
|
|
||||||
|
|
||||||
__asm__(
|
|
||||||
" la.pcrel %0, _start\n"
|
|
||||||
: "=r" (addr)
|
|
||||||
:
|
|
||||||
:);
|
|
||||||
|
|
||||||
return addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long get_vdso_data(void)
|
|
||||||
{
|
|
||||||
return get_vdso_base() - VVAR_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/ftrace.h>
|
#include <asm/ftrace.h>
|
||||||
|
#include <vdso/datapage.h>
|
||||||
|
|
||||||
static void __used output_ptreg_defines(void)
|
static void __used output_ptreg_defines(void)
|
||||||
{
|
{
|
||||||
@ -321,3 +322,11 @@ static void __used output_kvm_defines(void)
|
|||||||
OFFSET(KVM_GPGD, kvm, arch.pgd);
|
OFFSET(KVM_GPGD, kvm, arch.pgd);
|
||||||
BLANK();
|
BLANK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __used output_vdso_defines(void)
|
||||||
|
{
|
||||||
|
COMMENT("LoongArch vDSO offsets.");
|
||||||
|
|
||||||
|
DEFINE(__VVAR_PAGES, VVAR_NR_PAGES);
|
||||||
|
BLANK();
|
||||||
|
}
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
* Author: Huacai Chen <chenhuacai@loongson.cn>
|
* Author: Huacai Chen <chenhuacai@loongson.cn>
|
||||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||||
*/
|
*/
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <generated/asm-offsets.h>
|
||||||
|
|
||||||
OUTPUT_FORMAT("elf64-loongarch", "elf64-loongarch", "elf64-loongarch")
|
OUTPUT_FORMAT("elf64-loongarch", "elf64-loongarch", "elf64-loongarch")
|
||||||
|
|
||||||
@ -10,7 +12,11 @@ OUTPUT_ARCH(loongarch)
|
|||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
PROVIDE(_start = .);
|
PROVIDE(_vdso_data = . - __VVAR_PAGES * PAGE_SIZE);
|
||||||
|
#ifdef CONFIG_TIME_NS
|
||||||
|
PROVIDE(_timens_data = _vdso_data + PAGE_SIZE);
|
||||||
|
#endif
|
||||||
|
PROVIDE(_loongarch_data = _vdso_data + 2 * PAGE_SIZE);
|
||||||
. = SIZEOF_HEADERS;
|
. = SIZEOF_HEADERS;
|
||||||
|
|
||||||
.hash : { *(.hash) } :text
|
.hash : { *(.hash) } :text
|
||||||
|
@ -21,7 +21,7 @@ static __always_inline int read_cpu_id(void)
|
|||||||
|
|
||||||
static __always_inline const struct vdso_pcpu_data *get_pcpu_data(void)
|
static __always_inline const struct vdso_pcpu_data *get_pcpu_data(void)
|
||||||
{
|
{
|
||||||
return (struct vdso_pcpu_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGES_START * PAGE_SIZE);
|
return _loongarch_data.pdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern
|
extern
|
||||||
|
Loading…
Reference in New Issue
Block a user