162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef _VDSO_DATAPAGE_H 362306a36Sopenharmony_ci#define _VDSO_DATAPAGE_H 462306a36Sopenharmony_ci#ifdef __KERNEL__ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci/* 762306a36Sopenharmony_ci * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM 862306a36Sopenharmony_ci * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>, 962306a36Sopenharmony_ci * IBM Corp. 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 1462306a36Sopenharmony_ci * Note about this structure: 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * This structure was historically called systemcfg and exposed to 1762306a36Sopenharmony_ci * userland via /proc/ppc64/systemcfg. Unfortunately, this became an 1862306a36Sopenharmony_ci * ABI issue as some proprietary software started relying on being able 1962306a36Sopenharmony_ci * to mmap() it, thus we have to keep the base layout at least for a 2062306a36Sopenharmony_ci * few kernel versions. 2162306a36Sopenharmony_ci * 2262306a36Sopenharmony_ci * However, since ppc32 doesn't suffer from this backward handicap, 2362306a36Sopenharmony_ci * a simpler version of the data structure is used there with only the 2462306a36Sopenharmony_ci * fields actually used by the vDSO. 2562306a36Sopenharmony_ci * 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* 2962306a36Sopenharmony_ci * If the major version changes we are incompatible. 3062306a36Sopenharmony_ci * Minor version changes are a hint. 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_ci#define SYSTEMCFG_MAJOR 1 3362306a36Sopenharmony_ci#define SYSTEMCFG_MINOR 1 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#include <linux/unistd.h> 3862306a36Sopenharmony_ci#include <linux/time.h> 3962306a36Sopenharmony_ci#include <vdso/datapage.h> 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define SYSCALL_MAP_SIZE ((NR_syscalls + 31) / 32) 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci * So here is the ppc64 backward compatible version 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#ifdef CONFIG_PPC64 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct vdso_arch_data { 5062306a36Sopenharmony_ci __u8 eye_catcher[16]; /* Eyecatcher: SYSTEMCFG:PPC64 0x00 */ 5162306a36Sopenharmony_ci struct { /* Systemcfg version numbers */ 5262306a36Sopenharmony_ci __u32 major; /* Major number 0x10 */ 5362306a36Sopenharmony_ci __u32 minor; /* Minor number 0x14 */ 5462306a36Sopenharmony_ci } version; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci /* Note about the platform flags: it now only contains the lpar 5762306a36Sopenharmony_ci * bit. The actual platform number is dead and buried 5862306a36Sopenharmony_ci */ 5962306a36Sopenharmony_ci __u32 platform; /* Platform flags 0x18 */ 6062306a36Sopenharmony_ci __u32 processor; /* Processor type 0x1C */ 6162306a36Sopenharmony_ci __u64 processorCount; /* # of physical processors 0x20 */ 6262306a36Sopenharmony_ci __u64 physicalMemorySize; /* Size of real memory(B) 0x28 */ 6362306a36Sopenharmony_ci __u64 tb_orig_stamp; /* (NU) Timebase at boot 0x30 */ 6462306a36Sopenharmony_ci __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ 6562306a36Sopenharmony_ci __u64 tb_to_xs; /* (NU) Inverse of TB to 2^20 0x40 */ 6662306a36Sopenharmony_ci __u64 stamp_xsec; /* (NU) 0x48 */ 6762306a36Sopenharmony_ci __u64 tb_update_count; /* (NU) Timebase atomicity ctr 0x50 */ 6862306a36Sopenharmony_ci __u32 tz_minuteswest; /* (NU) Min. west of Greenwich 0x58 */ 6962306a36Sopenharmony_ci __u32 tz_dsttime; /* (NU) Type of dst correction 0x5C */ 7062306a36Sopenharmony_ci __u32 dcache_size; /* L1 d-cache size 0x60 */ 7162306a36Sopenharmony_ci __u32 dcache_line_size; /* L1 d-cache line size 0x64 */ 7262306a36Sopenharmony_ci __u32 icache_size; /* L1 i-cache size 0x68 */ 7362306a36Sopenharmony_ci __u32 icache_line_size; /* L1 i-cache line size 0x6C */ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci /* those additional ones don't have to be located anywhere 7662306a36Sopenharmony_ci * special as they were not part of the original systemcfg 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci __u32 dcache_block_size; /* L1 d-cache block size */ 7962306a36Sopenharmony_ci __u32 icache_block_size; /* L1 i-cache block size */ 8062306a36Sopenharmony_ci __u32 dcache_log_block_size; /* L1 d-cache log block size */ 8162306a36Sopenharmony_ci __u32 icache_log_block_size; /* L1 i-cache log block size */ 8262306a36Sopenharmony_ci __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ 8362306a36Sopenharmony_ci __u32 compat_syscall_map[SYSCALL_MAP_SIZE]; /* Map of compat syscalls */ 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci struct vdso_data data[CS_BASES]; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#else /* CONFIG_PPC64 */ 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* 9162306a36Sopenharmony_ci * And here is the simpler 32 bits version 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_cistruct vdso_arch_data { 9462306a36Sopenharmony_ci __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ 9562306a36Sopenharmony_ci __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ 9662306a36Sopenharmony_ci __u32 compat_syscall_map[0]; /* No compat syscalls on PPC32 */ 9762306a36Sopenharmony_ci struct vdso_data data[CS_BASES]; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#endif /* CONFIG_PPC64 */ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciextern struct vdso_arch_data *vdso_data; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#else /* __ASSEMBLY__ */ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci.macro get_datapage ptr 10762306a36Sopenharmony_ci bcl 20, 31, .+4 10862306a36Sopenharmony_ci999: 10962306a36Sopenharmony_ci mflr \ptr 11062306a36Sopenharmony_ci addis \ptr, \ptr, (_vdso_datapage - 999b)@ha 11162306a36Sopenharmony_ci addi \ptr, \ptr, (_vdso_datapage - 999b)@l 11262306a36Sopenharmony_ci.endm 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#endif /* __KERNEL__ */ 11762306a36Sopenharmony_ci#endif /* _SYSTEMCFG_H */ 118