Commit | Line | Data |
---|---|---|
2874c5fd | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
a7f290da BH |
2 | #ifndef _VDSO_DATAPAGE_H |
3 | #define _VDSO_DATAPAGE_H | |
88ced031 | 4 | #ifdef __KERNEL__ |
a7f290da BH |
5 | |
6 | /* | |
7 | * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM | |
8 | * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>, | |
9 | * IBM Corp. | |
a7f290da BH |
10 | */ |
11 | ||
12 | ||
13 | /* | |
14 | * Note about this structure: | |
15 | * | |
16 | * This structure was historically called systemcfg and exposed to | |
17 | * userland via /proc/ppc64/systemcfg. Unfortunately, this became an | |
18 | * ABI issue as some proprietary software started relying on being able | |
19 | * to mmap() it, thus we have to keep the base layout at least for a | |
20 | * few kernel versions. | |
21 | * | |
22 | * However, since ppc32 doesn't suffer from this backward handicap, | |
23 | * a simpler version of the data structure is used there with only the | |
24 | * fields actually used by the vDSO. | |
25 | * | |
26 | */ | |
27 | ||
28 | /* | |
29 | * If the major version changes we are incompatible. | |
30 | * Minor version changes are a hint. | |
31 | */ | |
32 | #define SYSTEMCFG_MAJOR 1 | |
33 | #define SYSTEMCFG_MINOR 1 | |
34 | ||
35 | #ifndef __ASSEMBLY__ | |
36 | ||
37 | #include <linux/unistd.h> | |
597bc5c0 | 38 | #include <linux/time.h> |
ab037dd8 | 39 | #include <vdso/datapage.h> |
a7f290da | 40 | |
f43194e4 | 41 | #define SYSCALL_MAP_SIZE ((NR_syscalls + 31) / 32) |
a7f290da BH |
42 | |
43 | /* | |
44 | * So here is the ppc64 backward compatible version | |
45 | */ | |
46 | ||
47 | #ifdef CONFIG_PPC64 | |
48 | ||
ab037dd8 | 49 | struct vdso_arch_data { |
a7f290da BH |
50 | __u8 eye_catcher[16]; /* Eyecatcher: SYSTEMCFG:PPC64 0x00 */ |
51 | struct { /* Systemcfg version numbers */ | |
52 | __u32 major; /* Major number 0x10 */ | |
53 | __u32 minor; /* Minor number 0x14 */ | |
54 | } version; | |
55 | ||
e8222502 | 56 | /* Note about the platform flags: it now only contains the lpar |
25985edc | 57 | * bit. The actual platform number is dead and buried |
e8222502 | 58 | */ |
a7f290da BH |
59 | __u32 platform; /* Platform flags 0x18 */ |
60 | __u32 processor; /* Processor type 0x1C */ | |
61 | __u64 processorCount; /* # of physical processors 0x20 */ | |
62 | __u64 physicalMemorySize; /* Size of real memory(B) 0x28 */ | |
ab037dd8 | 63 | __u64 tb_orig_stamp; /* (NU) Timebase at boot 0x30 */ |
a7f290da | 64 | __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ |
ab037dd8 CL |
65 | __u64 tb_to_xs; /* (NU) Inverse of TB to 2^20 0x40 */ |
66 | __u64 stamp_xsec; /* (NU) 0x48 */ | |
67 | __u64 tb_update_count; /* (NU) Timebase atomicity ctr 0x50 */ | |
68 | __u32 tz_minuteswest; /* (NU) Min. west of Greenwich 0x58 */ | |
69 | __u32 tz_dsttime; /* (NU) Type of dst correction 0x5C */ | |
a7f290da BH |
70 | __u32 dcache_size; /* L1 d-cache size 0x60 */ |
71 | __u32 dcache_line_size; /* L1 d-cache line size 0x64 */ | |
72 | __u32 icache_size; /* L1 i-cache size 0x68 */ | |
73 | __u32 icache_line_size; /* L1 i-cache line size 0x6C */ | |
74 | ||
75 | /* those additional ones don't have to be located anywhere | |
76 | * special as they were not part of the original systemcfg | |
77 | */ | |
fbe48175 OJ |
78 | __u32 dcache_block_size; /* L1 d-cache block size */ |
79 | __u32 icache_block_size; /* L1 i-cache block size */ | |
80 | __u32 dcache_log_block_size; /* L1 d-cache log block size */ | |
81 | __u32 icache_log_block_size; /* L1 i-cache log block size */ | |
1bb30b7a CL |
82 | __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ |
83 | __u32 compat_syscall_map[SYSCALL_MAP_SIZE]; /* Map of compat syscalls */ | |
ab037dd8 CL |
84 | |
85 | struct vdso_data data[CS_BASES]; | |
53cee505 | 86 | struct vdso_rng_data rng_data; |
a7f290da BH |
87 | }; |
88 | ||
89 | #else /* CONFIG_PPC64 */ | |
90 | ||
91 | /* | |
92 | * And here is the simpler 32 bits version | |
93 | */ | |
ab037dd8 | 94 | struct vdso_arch_data { |
a7f290da | 95 | __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ |
1bb30b7a CL |
96 | __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ |
97 | __u32 compat_syscall_map[0]; /* No compat syscalls on PPC32 */ | |
ab037dd8 | 98 | struct vdso_data data[CS_BASES]; |
53cee505 | 99 | struct vdso_rng_data rng_data; |
a7f290da BH |
100 | }; |
101 | ||
102 | #endif /* CONFIG_PPC64 */ | |
103 | ||
ab037dd8 | 104 | extern struct vdso_arch_data *vdso_data; |
a7f290da | 105 | |
ec0895f0 CL |
106 | #else /* __ASSEMBLY__ */ |
107 | ||
550e6074 | 108 | .macro get_datapage ptr |
ec0895f0 | 109 | bcl 20, 31, .+4 |
591857b6 | 110 | 999: |
ec0895f0 | 111 | mflr \ptr |
591857b6 | 112 | addis \ptr, \ptr, (_vdso_datapage - 999b)@ha |
591857b6 | 113 | addi \ptr, \ptr, (_vdso_datapage - 999b)@l |
ec0895f0 CL |
114 | .endm |
115 | ||
c7304938 CL |
116 | #include <asm/asm-offsets.h> |
117 | #include <asm/page.h> | |
118 | ||
119 | .macro get_realdatapage ptr scratch | |
120 | get_datapage \ptr | |
121 | #ifdef CONFIG_TIME_NS | |
122 | lwz \scratch, VDSO_CLOCKMODE_OFFSET(\ptr) | |
123 | xoris \scratch, \scratch, VDSO_CLOCKMODE_TIMENS@h | |
124 | xori \scratch, \scratch, VDSO_CLOCKMODE_TIMENS@l | |
125 | cntlzw \scratch, \scratch | |
126 | rlwinm \scratch, \scratch, PAGE_SHIFT - 5, 1 << PAGE_SHIFT | |
127 | add \ptr, \ptr, \scratch | |
128 | #endif | |
129 | .endm | |
130 | ||
a7f290da BH |
131 | #endif /* __ASSEMBLY__ */ |
132 | ||
88ced031 | 133 | #endif /* __KERNEL__ */ |
a7f290da | 134 | #endif /* _SYSTEMCFG_H */ |