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

powerpc/vdso: Switch to generic storage implementation



The generic storage implementation provides the same features as the
custom one. However it can be shared between architectures, making
maintenance easier.

Co-developed-by: default avatarNam Cao <namcao@linutronix.de>
Signed-off-by: default avatarNam Cao <namcao@linutronix.de>
Signed-off-by: default avatarThomas Weißschuh <thomas.weissschuh@linutronix.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Link: https://lore.kernel.org/all/20250204-vdso-store-rng-v3-14-13a4669dfc8c@linutronix.de
parent 69896119
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -159,6 +159,7 @@ config PPC
	select ARCH_HAS_TICK_BROADCAST		if GENERIC_CLOCKEVENTS_BROADCAST
	select ARCH_HAS_UACCESS_FLUSHCACHE
	select ARCH_HAS_UBSAN
	select ARCH_HAS_VDSO_ARCH_DATA
	select ARCH_HAVE_NMI_SAFE_CMPXCHG
	select ARCH_HAVE_EXTRA_ELF_NOTES        if SPU_BASE
	select ARCH_KEEP_MEMBLOCK
@@ -209,6 +210,7 @@ config PPC
	select GENERIC_PTDUMP
	select GENERIC_SMP_IDLE_THREAD
	select GENERIC_TIME_VSYSCALL
	select GENERIC_VDSO_DATA_STORE
	select GENERIC_VDSO_TIME_NS
	select HAS_IOPORT			if PCI
	select HAVE_ARCH_AUDITSYSCALL
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
#define _ASM_POWERPC_VDSO_H

#define VDSO_VERSION_STRING	LINUX_2.6.15
#define __VDSO_PAGES		4

#ifndef __ASSEMBLY__

+37 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM
 * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>,
 * 		      IBM Corp.
 */
#ifndef _ASM_POWERPC_VDSO_ARCH_DATA_H
#define _ASM_POWERPC_VDSO_ARCH_DATA_H

#include <linux/unistd.h>
#include <linux/types.h>

#define SYSCALL_MAP_SIZE      ((NR_syscalls + 31) / 32)

#ifdef CONFIG_PPC64

struct vdso_arch_data {
	__u64 tb_ticks_per_sec;			/* Timebase tics / sec */
	__u32 dcache_block_size;		/* L1 d-cache block size     */
	__u32 icache_block_size;		/* L1 i-cache block size     */
	__u32 dcache_log_block_size;		/* L1 d-cache log block size */
	__u32 icache_log_block_size;		/* L1 i-cache log block size */
	__u32 syscall_map[SYSCALL_MAP_SIZE];	/* Map of syscalls  */
	__u32 compat_syscall_map[SYSCALL_MAP_SIZE];	/* Map of compat syscalls */
};

#else /* CONFIG_PPC64 */

struct vdso_arch_data {
	__u64 tb_ticks_per_sec;		/* Timebase tics / sec */
	__u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */
	__u32 compat_syscall_map[0];	/* No compat syscalls on PPC32 */
};

#endif /* CONFIG_PPC64 */

#endif /* _ASM_POWERPC_VDSO_ARCH_DATA_H */
+6 −5
Original line number Diff line number Diff line
@@ -43,20 +43,21 @@ static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsig
			    (unsigned long)len, (unsigned long)flags);
}

static __always_inline struct vdso_rng_data *__arch_get_vdso_rng_data(void)
static __always_inline const struct vdso_rng_data *__arch_get_vdso_u_rng_data(void)
{
	struct vdso_arch_data *data;
	struct vdso_rng_data *data;

	asm (
		"	bcl	20, 31, .+4 ;"
		"0:	mflr	%0 ;"
		"	addis	%0, %0, (_vdso_datapage - 0b)@ha ;"
		"	addi	%0, %0, (_vdso_datapage - 0b)@l  ;"
		"	addis	%0, %0, (vdso_u_rng_data - 0b)@ha ;"
		"	addi	%0, %0, (vdso_u_rng_data - 0b)@l  ;"
		: "=r" (data) : : "lr"
	);

	return &data->rng_data;
	return data;
}
#define __arch_get_vdso_u_rng_data __arch_get_vdso_u_rng_data

ssize_t __c_kernel_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state,
			     size_t opaque_len);
+10 −19
Original line number Diff line number Diff line
@@ -94,22 +94,12 @@ int clock_getres32_fallback(clockid_t _clkid, struct old_timespec32 *_ts)
#endif

static __always_inline u64 __arch_get_hw_counter(s32 clock_mode,
						 const struct vdso_data *vd)
						 const struct vdso_time_data *vd)
{
	return get_tb();
}

const struct vdso_data *__arch_get_vdso_data(void);

#ifdef CONFIG_TIME_NS
static __always_inline
const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd)
{
	return (void *)vd + (1U << CONFIG_PAGE_SHIFT);
}
#endif

static inline bool vdso_clocksource_ok(const struct vdso_data *vd)
static inline bool vdso_clocksource_ok(const struct vdso_time_data *vd)
{
	return true;
}
@@ -135,21 +125,22 @@ static __always_inline u64 vdso_shift_ns(u64 ns, unsigned long shift)

#ifdef __powerpc64__
int __c_kernel_clock_gettime(clockid_t clock, struct __kernel_timespec *ts,
			     const struct vdso_data *vd);
			     const struct vdso_time_data *vd);
int __c_kernel_clock_getres(clockid_t clock_id, struct __kernel_timespec *res,
			    const struct vdso_data *vd);
			    const struct vdso_time_data *vd);
#else
int __c_kernel_clock_gettime(clockid_t clock, struct old_timespec32 *ts,
			     const struct vdso_data *vd);
			     const struct vdso_time_data *vd);
int __c_kernel_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts,
			       const struct vdso_data *vd);
			       const struct vdso_time_data *vd);
int __c_kernel_clock_getres(clockid_t clock_id, struct old_timespec32 *res,
			    const struct vdso_data *vd);
			    const struct vdso_time_data *vd);
#endif
int __c_kernel_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz,
			    const struct vdso_data *vd);
			    const struct vdso_time_data *vd);
__kernel_old_time_t __c_kernel_time(__kernel_old_time_t *time,
				    const struct vdso_data *vd);
				    const struct vdso_time_data *vd);

#endif /* __ASSEMBLY__ */

#endif /* _ASM_POWERPC_VDSO_GETTIMEOFDAY_H */
Loading