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