18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci#ifndef _VDSO_DATAPAGE_H
38c2ecf20Sopenharmony_ci#define _VDSO_DATAPAGE_H
48c2ecf20Sopenharmony_ci#ifdef __KERNEL__
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci/*
78c2ecf20Sopenharmony_ci * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM
88c2ecf20Sopenharmony_ci * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>,
98c2ecf20Sopenharmony_ci * 		      IBM Corp.
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/*
148c2ecf20Sopenharmony_ci * Note about this structure:
158c2ecf20Sopenharmony_ci *
168c2ecf20Sopenharmony_ci * This structure was historically called systemcfg and exposed to
178c2ecf20Sopenharmony_ci * userland via /proc/ppc64/systemcfg. Unfortunately, this became an
188c2ecf20Sopenharmony_ci * ABI issue as some proprietary software started relying on being able
198c2ecf20Sopenharmony_ci * to mmap() it, thus we have to keep the base layout at least for a
208c2ecf20Sopenharmony_ci * few kernel versions.
218c2ecf20Sopenharmony_ci *
228c2ecf20Sopenharmony_ci * However, since ppc32 doesn't suffer from this backward handicap,
238c2ecf20Sopenharmony_ci * a simpler version of the data structure is used there with only the
248c2ecf20Sopenharmony_ci * fields actually used by the vDSO.
258c2ecf20Sopenharmony_ci *
268c2ecf20Sopenharmony_ci */
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci/*
298c2ecf20Sopenharmony_ci * If the major version changes we are incompatible.
308c2ecf20Sopenharmony_ci * Minor version changes are a hint.
318c2ecf20Sopenharmony_ci */
328c2ecf20Sopenharmony_ci#define SYSTEMCFG_MAJOR 1
338c2ecf20Sopenharmony_ci#define SYSTEMCFG_MINOR 1
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#include <linux/unistd.h>
388c2ecf20Sopenharmony_ci#include <linux/time.h>
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci#define SYSCALL_MAP_SIZE      ((NR_syscalls + 31) / 32)
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/*
438c2ecf20Sopenharmony_ci * So here is the ppc64 backward compatible version
448c2ecf20Sopenharmony_ci */
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#ifdef CONFIG_PPC64
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cistruct vdso_data {
498c2ecf20Sopenharmony_ci	__u8  eye_catcher[16];		/* Eyecatcher: SYSTEMCFG:PPC64	0x00 */
508c2ecf20Sopenharmony_ci	struct {			/* Systemcfg version numbers	     */
518c2ecf20Sopenharmony_ci		__u32 major;		/* Major number			0x10 */
528c2ecf20Sopenharmony_ci		__u32 minor;		/* Minor number			0x14 */
538c2ecf20Sopenharmony_ci	} version;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	/* Note about the platform flags: it now only contains the lpar
568c2ecf20Sopenharmony_ci	 * bit. The actual platform number is dead and buried
578c2ecf20Sopenharmony_ci	 */
588c2ecf20Sopenharmony_ci	__u32 platform;			/* Platform flags		0x18 */
598c2ecf20Sopenharmony_ci	__u32 processor;		/* Processor type		0x1C */
608c2ecf20Sopenharmony_ci	__u64 processorCount;		/* # of physical processors	0x20 */
618c2ecf20Sopenharmony_ci	__u64 physicalMemorySize;	/* Size of real memory(B)	0x28 */
628c2ecf20Sopenharmony_ci	__u64 tb_orig_stamp;		/* Timebase at boot		0x30 */
638c2ecf20Sopenharmony_ci	__u64 tb_ticks_per_sec;		/* Timebase tics / sec		0x38 */
648c2ecf20Sopenharmony_ci	__u64 tb_to_xs;			/* Inverse of TB to 2^20	0x40 */
658c2ecf20Sopenharmony_ci	__u64 stamp_xsec;		/*				0x48 */
668c2ecf20Sopenharmony_ci	__u64 tb_update_count;		/* Timebase atomicity ctr	0x50 */
678c2ecf20Sopenharmony_ci	__u32 tz_minuteswest;		/* Minutes west of Greenwich	0x58 */
688c2ecf20Sopenharmony_ci	__u32 tz_dsttime;		/* Type of dst correction	0x5C */
698c2ecf20Sopenharmony_ci	__u32 dcache_size;		/* L1 d-cache size		0x60 */
708c2ecf20Sopenharmony_ci	__u32 dcache_line_size;		/* L1 d-cache line size		0x64 */
718c2ecf20Sopenharmony_ci	__u32 icache_size;		/* L1 i-cache size		0x68 */
728c2ecf20Sopenharmony_ci	__u32 icache_line_size;		/* L1 i-cache line size		0x6C */
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	/* those additional ones don't have to be located anywhere
758c2ecf20Sopenharmony_ci	 * special as they were not part of the original systemcfg
768c2ecf20Sopenharmony_ci	 */
778c2ecf20Sopenharmony_ci	__u32 dcache_block_size;		/* L1 d-cache block size     */
788c2ecf20Sopenharmony_ci	__u32 icache_block_size;		/* L1 i-cache block size     */
798c2ecf20Sopenharmony_ci	__u32 dcache_log_block_size;		/* L1 d-cache log block size */
808c2ecf20Sopenharmony_ci	__u32 icache_log_block_size;		/* L1 i-cache log block size */
818c2ecf20Sopenharmony_ci	__u32 stamp_sec_fraction;		/* fractional seconds of stamp_xtime */
828c2ecf20Sopenharmony_ci	__s32 wtom_clock_nsec;			/* Wall to monotonic clock nsec */
838c2ecf20Sopenharmony_ci	__s64 wtom_clock_sec;			/* Wall to monotonic clock sec */
848c2ecf20Sopenharmony_ci	__s64 stamp_xtime_sec;			/* xtime secs as at tb_orig_stamp */
858c2ecf20Sopenharmony_ci	__s64 stamp_xtime_nsec;			/* xtime nsecs as at tb_orig_stamp */
868c2ecf20Sopenharmony_ci	__u32 hrtimer_res;			/* hrtimer resolution */
878c2ecf20Sopenharmony_ci   	__u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls  */
888c2ecf20Sopenharmony_ci   	__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
898c2ecf20Sopenharmony_ci};
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci#else /* CONFIG_PPC64 */
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci/*
948c2ecf20Sopenharmony_ci * And here is the simpler 32 bits version
958c2ecf20Sopenharmony_ci */
968c2ecf20Sopenharmony_cistruct vdso_data {
978c2ecf20Sopenharmony_ci	__u64 tb_orig_stamp;		/* Timebase at boot		0x30 */
988c2ecf20Sopenharmony_ci	__u64 tb_ticks_per_sec;		/* Timebase tics / sec		0x38 */
998c2ecf20Sopenharmony_ci	__u64 tb_to_xs;			/* Inverse of TB to 2^20	0x40 */
1008c2ecf20Sopenharmony_ci	__u64 stamp_xsec;		/*				0x48 */
1018c2ecf20Sopenharmony_ci	__u32 tb_update_count;		/* Timebase atomicity ctr	0x50 */
1028c2ecf20Sopenharmony_ci	__u32 tz_minuteswest;		/* Minutes west of Greenwich	0x58 */
1038c2ecf20Sopenharmony_ci	__u32 tz_dsttime;		/* Type of dst correction	0x5C */
1048c2ecf20Sopenharmony_ci	__s32 wtom_clock_sec;			/* Wall to monotonic clock */
1058c2ecf20Sopenharmony_ci	__s32 wtom_clock_nsec;
1068c2ecf20Sopenharmony_ci	__s32 stamp_xtime_sec;		/* xtime seconds as at tb_orig_stamp */
1078c2ecf20Sopenharmony_ci	__s32 stamp_xtime_nsec;		/* xtime nsecs as at tb_orig_stamp */
1088c2ecf20Sopenharmony_ci	__u32 stamp_sec_fraction;	/* fractional seconds of stamp_xtime */
1098c2ecf20Sopenharmony_ci	__u32 hrtimer_res;		/* hrtimer resolution */
1108c2ecf20Sopenharmony_ci   	__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
1118c2ecf20Sopenharmony_ci};
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci#endif /* CONFIG_PPC64 */
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ciextern struct vdso_data *vdso_data;
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci#else /* __ASSEMBLY__ */
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci.macro get_datapage ptr, tmp
1208c2ecf20Sopenharmony_ci	bcl	20, 31, .+4
1218c2ecf20Sopenharmony_ci	mflr	\ptr
1228c2ecf20Sopenharmony_ci	addi	\ptr, \ptr, (__kernel_datapage_offset - (.-4))@l
1238c2ecf20Sopenharmony_ci	lwz	\tmp, 0(\ptr)
1248c2ecf20Sopenharmony_ci	add	\ptr, \tmp, \ptr
1258c2ecf20Sopenharmony_ci.endm
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci#endif /* __KERNEL__ */
1308c2ecf20Sopenharmony_ci#endif /* _SYSTEMCFG_H */
131