Commit dc32cb4b authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Thomas Gleixner
Browse files

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: default avatarThomas Weißschuh <thomas.weissschuh@linutronix.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20241010-vdso-generic-base-v1-8-b64f0842d512@linutronix.de
parent 2bb79470
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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)
{
	return (const struct vdso_rng_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGES_START *
	       PAGE_SIZE + offsetof(struct loongarch_vdso_data, rng_data));
	return &_loongarch_data.rng_data;
}

#endif /* !__ASSEMBLY__ */
+2 −2
Original line number Diff line number Diff line
@@ -91,14 +91,14 @@ static inline bool loongarch_vdso_hres_capable(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
static __always_inline
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 /* !__ASSEMBLY__ */
+1 −17
Original line number Diff line number Diff line
@@ -48,23 +48,7 @@ enum vvar_pages {

#define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT)

static inline unsigned long get_vdso_base(void)
{
	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;
}
extern struct loongarch_vdso_data _loongarch_data __attribute__((visibility("hidden")));

#endif /* __ASSEMBLY__ */

+9 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <asm/ptrace.h>
#include <asm/processor.h>
#include <asm/ftrace.h>
#include <vdso/datapage.h>

static void __used output_ptreg_defines(void)
{
@@ -321,3 +322,11 @@ static void __used output_kvm_defines(void)
	OFFSET(KVM_GPGD, kvm, arch.pgd);
	BLANK();
}

static void __used output_vdso_defines(void)
{
	COMMENT("LoongArch vDSO offsets.");

	DEFINE(__VVAR_PAGES, VVAR_NR_PAGES);
	BLANK();
}
+7 −1
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
 * Author: Huacai Chen <chenhuacai@loongson.cn>
 * 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")

@@ -10,7 +12,11 @@ OUTPUT_ARCH(loongarch)

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;

	.hash		: { *(.hash) }			:text
Loading