Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: Nam Cao <namcao@linutronix.de>
Signed-off-by: Nam Cao <namcao@linutronix.de>
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Link: https://lore.kernel.org/all/20250204-vdso-store-rng-v3-14-13a4669dfc8c@linutronix.de

authored by

Thomas Weißschuh and committed by
Thomas Gleixner
223970df 69896119

+89 -198
+2
arch/powerpc/Kconfig
··· 159 159 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST 160 160 select ARCH_HAS_UACCESS_FLUSHCACHE 161 161 select ARCH_HAS_UBSAN 162 + select ARCH_HAS_VDSO_ARCH_DATA 162 163 select ARCH_HAVE_NMI_SAFE_CMPXCHG 163 164 select ARCH_HAVE_EXTRA_ELF_NOTES if SPU_BASE 164 165 select ARCH_KEEP_MEMBLOCK ··· 210 209 select GENERIC_PTDUMP 211 210 select GENERIC_SMP_IDLE_THREAD 212 211 select GENERIC_TIME_VSYSCALL 212 + select GENERIC_VDSO_DATA_STORE 213 213 select GENERIC_VDSO_TIME_NS 214 214 select HAS_IOPORT if PCI 215 215 select HAVE_ARCH_AUDITSYSCALL
+1
arch/powerpc/include/asm/vdso.h
··· 3 3 #define _ASM_POWERPC_VDSO_H 4 4 5 5 #define VDSO_VERSION_STRING LINUX_2.6.15 6 + #define __VDSO_PAGES 4 6 7 7 8 #ifndef __ASSEMBLY__ 8 9
+37
arch/powerpc/include/asm/vdso/arch_data.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2002 Peter Bergner <bergner@vnet.ibm.com>, IBM 4 + * Copyright (C) 2005 Benjamin Herrenschmidy <benh@kernel.crashing.org>, 5 + * IBM Corp. 6 + */ 7 + #ifndef _ASM_POWERPC_VDSO_ARCH_DATA_H 8 + #define _ASM_POWERPC_VDSO_ARCH_DATA_H 9 + 10 + #include <linux/unistd.h> 11 + #include <linux/types.h> 12 + 13 + #define SYSCALL_MAP_SIZE ((NR_syscalls + 31) / 32) 14 + 15 + #ifdef CONFIG_PPC64 16 + 17 + struct vdso_arch_data { 18 + __u64 tb_ticks_per_sec; /* Timebase tics / sec */ 19 + __u32 dcache_block_size; /* L1 d-cache block size */ 20 + __u32 icache_block_size; /* L1 i-cache block size */ 21 + __u32 dcache_log_block_size; /* L1 d-cache log block size */ 22 + __u32 icache_log_block_size; /* L1 i-cache log block size */ 23 + __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ 24 + __u32 compat_syscall_map[SYSCALL_MAP_SIZE]; /* Map of compat syscalls */ 25 + }; 26 + 27 + #else /* CONFIG_PPC64 */ 28 + 29 + struct vdso_arch_data { 30 + __u64 tb_ticks_per_sec; /* Timebase tics / sec */ 31 + __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ 32 + __u32 compat_syscall_map[0]; /* No compat syscalls on PPC32 */ 33 + }; 34 + 35 + #endif /* CONFIG_PPC64 */ 36 + 37 + #endif /* _ASM_POWERPC_VDSO_ARCH_DATA_H */
+6 -5
arch/powerpc/include/asm/vdso/getrandom.h
··· 43 43 (unsigned long)len, (unsigned long)flags); 44 44 } 45 45 46 - static __always_inline struct vdso_rng_data *__arch_get_vdso_rng_data(void) 46 + static __always_inline const struct vdso_rng_data *__arch_get_vdso_u_rng_data(void) 47 47 { 48 - struct vdso_arch_data *data; 48 + struct vdso_rng_data *data; 49 49 50 50 asm ( 51 51 " bcl 20, 31, .+4 ;" 52 52 "0: mflr %0 ;" 53 - " addis %0, %0, (_vdso_datapage - 0b)@ha ;" 54 - " addi %0, %0, (_vdso_datapage - 0b)@l ;" 53 + " addis %0, %0, (vdso_u_rng_data - 0b)@ha ;" 54 + " addi %0, %0, (vdso_u_rng_data - 0b)@l ;" 55 55 : "=r" (data) : : "lr" 56 56 ); 57 57 58 - return &data->rng_data; 58 + return data; 59 59 } 60 + #define __arch_get_vdso_u_rng_data __arch_get_vdso_u_rng_data 60 61 61 62 ssize_t __c_kernel_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state, 62 63 size_t opaque_len);
+10 -19
arch/powerpc/include/asm/vdso/gettimeofday.h
··· 94 94 #endif 95 95 96 96 static __always_inline u64 __arch_get_hw_counter(s32 clock_mode, 97 - const struct vdso_data *vd) 97 + const struct vdso_time_data *vd) 98 98 { 99 99 return get_tb(); 100 100 } 101 101 102 - const struct vdso_data *__arch_get_vdso_data(void); 103 - 104 - #ifdef CONFIG_TIME_NS 105 - static __always_inline 106 - const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd) 107 - { 108 - return (void *)vd + (1U << CONFIG_PAGE_SHIFT); 109 - } 110 - #endif 111 - 112 - static inline bool vdso_clocksource_ok(const struct vdso_data *vd) 102 + static inline bool vdso_clocksource_ok(const struct vdso_time_data *vd) 113 103 { 114 104 return true; 115 105 } ··· 125 135 126 136 #ifdef __powerpc64__ 127 137 int __c_kernel_clock_gettime(clockid_t clock, struct __kernel_timespec *ts, 128 - const struct vdso_data *vd); 138 + const struct vdso_time_data *vd); 129 139 int __c_kernel_clock_getres(clockid_t clock_id, struct __kernel_timespec *res, 130 - const struct vdso_data *vd); 140 + const struct vdso_time_data *vd); 131 141 #else 132 142 int __c_kernel_clock_gettime(clockid_t clock, struct old_timespec32 *ts, 133 - const struct vdso_data *vd); 143 + const struct vdso_time_data *vd); 134 144 int __c_kernel_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts, 135 - const struct vdso_data *vd); 145 + const struct vdso_time_data *vd); 136 146 int __c_kernel_clock_getres(clockid_t clock_id, struct old_timespec32 *res, 137 - const struct vdso_data *vd); 147 + const struct vdso_time_data *vd); 138 148 #endif 139 149 int __c_kernel_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz, 140 - const struct vdso_data *vd); 150 + const struct vdso_time_data *vd); 141 151 __kernel_old_time_t __c_kernel_time(__kernel_old_time_t *time, 142 - const struct vdso_data *vd); 152 + const struct vdso_time_data *vd); 153 + 143 154 #endif /* __ASSEMBLY__ */ 144 155 145 156 #endif /* _ASM_POWERPC_VDSO_GETTIMEOFDAY_H */
-13
arch/powerpc/include/asm/vdso/vsyscall.h
··· 6 6 7 7 #include <asm/vdso_datapage.h> 8 8 9 - static __always_inline 10 - struct vdso_data *__arch_get_k_vdso_data(void) 11 - { 12 - return vdso_data->data; 13 - } 14 - #define __arch_get_k_vdso_data __arch_get_k_vdso_data 15 - 16 - static __always_inline 17 - struct vdso_rng_data *__arch_get_k_vdso_rng_data(void) 18 - { 19 - return &vdso_data->rng_data; 20 - } 21 - 22 9 /* The asm-generic header needs to be included after the definitions above */ 23 10 #include <asm-generic/vdso/vsyscall.h> 24 11
+3 -41
arch/powerpc/include/asm/vdso_datapage.h
··· 11 11 12 12 #ifndef __ASSEMBLY__ 13 13 14 - #include <linux/unistd.h> 15 - #include <linux/time.h> 16 14 #include <vdso/datapage.h> 17 - 18 - #define SYSCALL_MAP_SIZE ((NR_syscalls + 31) / 32) 19 - 20 - #ifdef CONFIG_PPC64 21 - 22 - struct vdso_arch_data { 23 - __u64 tb_ticks_per_sec; /* Timebase tics / sec */ 24 - __u32 dcache_block_size; /* L1 d-cache block size */ 25 - __u32 icache_block_size; /* L1 i-cache block size */ 26 - __u32 dcache_log_block_size; /* L1 d-cache log block size */ 27 - __u32 icache_log_block_size; /* L1 i-cache log block size */ 28 - __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ 29 - __u32 compat_syscall_map[SYSCALL_MAP_SIZE]; /* Map of compat syscalls */ 30 - 31 - struct vdso_rng_data rng_data; 32 - 33 - struct vdso_data data[CS_BASES] __aligned(1 << CONFIG_PAGE_SHIFT); 34 - }; 35 - 36 - #else /* CONFIG_PPC64 */ 37 - 38 - struct vdso_arch_data { 39 - __u64 tb_ticks_per_sec; /* Timebase tics / sec */ 40 - __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ 41 - __u32 compat_syscall_map[0]; /* No compat syscalls on PPC32 */ 42 - struct vdso_rng_data rng_data; 43 - 44 - struct vdso_data data[CS_BASES] __aligned(1 << CONFIG_PAGE_SHIFT); 45 - }; 46 - 47 - #endif /* CONFIG_PPC64 */ 48 - 49 - extern struct vdso_arch_data *vdso_data; 50 15 51 16 #else /* __ASSEMBLY__ */ 52 17 53 - .macro get_datapage ptr offset=0 18 + .macro get_datapage ptr symbol 54 19 bcl 20, 31, .+4 55 20 999: 56 21 mflr \ptr 57 - addis \ptr, \ptr, (_vdso_datapage - 999b + \offset)@ha 58 - addi \ptr, \ptr, (_vdso_datapage - 999b + \offset)@l 22 + addis \ptr, \ptr, (\symbol - 999b)@ha 23 + addi \ptr, \ptr, (\symbol - 999b)@l 59 24 .endm 60 - 61 - #include <asm/asm-offsets.h> 62 - #include <asm/page.h> 63 25 64 26 #endif /* __ASSEMBLY__ */ 65 27
-1
arch/powerpc/kernel/asm-offsets.c
··· 334 334 #endif /* ! CONFIG_PPC64 */ 335 335 336 336 /* datapage offsets for use by vdso */ 337 - OFFSET(VDSO_DATA_OFFSET, vdso_arch_data, data); 338 337 OFFSET(CFG_TB_TICKS_PER_SEC, vdso_arch_data, tb_ticks_per_sec); 339 338 #ifdef CONFIG_PPC64 340 339 OFFSET(CFG_ICACHE_BLOCKSZ, vdso_arch_data, icache_block_size);
+1 -1
arch/powerpc/kernel/time.c
··· 950 950 sys_tz.tz_dsttime = 0; 951 951 } 952 952 953 - vdso_data->tb_ticks_per_sec = tb_ticks_per_sec; 953 + vdso_k_arch_data->tb_ticks_per_sec = tb_ticks_per_sec; 954 954 #ifdef CONFIG_PPC64_PROC_SYSTEMCFG 955 955 systemcfg->tb_ticks_per_sec = tb_ticks_per_sec; 956 956 #endif
+11 -104
arch/powerpc/kernel/vdso.c
··· 17 17 #include <linux/elf.h> 18 18 #include <linux/security.h> 19 19 #include <linux/syscalls.h> 20 - #include <linux/time_namespace.h> 20 + #include <linux/vdso_datastore.h> 21 21 #include <vdso/datapage.h> 22 22 23 23 #include <asm/syscall.h> ··· 32 32 #include <asm/vdso_datapage.h> 33 33 #include <asm/setup.h> 34 34 35 + static_assert(__VDSO_PAGES == VDSO_NR_PAGES); 36 + 35 37 /* The alignment of the vDSO */ 36 38 #define VDSO_ALIGNMENT (1 << 16) 37 39 ··· 41 39 extern char vdso64_start, vdso64_end; 42 40 43 41 long sys_ni_syscall(void); 44 - 45 - /* 46 - * The vdso data page (aka. systemcfg for old ppc64 fans) is here. 47 - * Once the early boot kernel code no longer needs to muck around 48 - * with it, it will become dynamically allocated 49 - */ 50 - static union { 51 - struct vdso_arch_data data; 52 - u8 page[2 * PAGE_SIZE]; 53 - } vdso_data_store __page_aligned_data; 54 - struct vdso_arch_data *vdso_data = &vdso_data_store.data; 55 - 56 - enum vvar_pages { 57 - VVAR_BASE_PAGE_OFFSET, 58 - VVAR_TIME_PAGE_OFFSET, 59 - VVAR_TIMENS_PAGE_OFFSET, 60 - VVAR_NR_PAGES, 61 - }; 62 42 63 43 static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struct *new_vma, 64 44 unsigned long text_size) ··· 80 96 mm->context.vdso = NULL; 81 97 } 82 98 83 - static vm_fault_t vvar_fault(const struct vm_special_mapping *sm, 84 - struct vm_area_struct *vma, struct vm_fault *vmf); 85 - 86 - static struct vm_special_mapping vvar_spec __ro_after_init = { 87 - .name = "[vvar]", 88 - .fault = vvar_fault, 89 - }; 90 - 91 99 static struct vm_special_mapping vdso32_spec __ro_after_init = { 92 100 .name = "[vdso]", 93 101 .mremap = vdso32_mremap, ··· 92 116 .close = vdso_close, 93 117 }; 94 118 95 - #ifdef CONFIG_TIME_NS 96 - struct vdso_data *arch_get_vdso_data(void *vvar_page) 97 - { 98 - return vvar_page; 99 - } 100 - 101 - /* 102 - * The vvar mapping contains data for a specific time namespace, so when a task 103 - * changes namespace we must unmap its vvar data for the old namespace. 104 - * Subsequent faults will map in data for the new namespace. 105 - * 106 - * For more details see timens_setup_vdso_data(). 107 - */ 108 - int vdso_join_timens(struct task_struct *task, struct time_namespace *ns) 109 - { 110 - struct mm_struct *mm = task->mm; 111 - VMA_ITERATOR(vmi, mm, 0); 112 - struct vm_area_struct *vma; 113 - 114 - mmap_read_lock(mm); 115 - for_each_vma(vmi, vma) { 116 - if (vma_is_special_mapping(vma, &vvar_spec)) 117 - zap_vma_pages(vma); 118 - } 119 - mmap_read_unlock(mm); 120 - 121 - return 0; 122 - } 123 - #endif 124 - 125 - static vm_fault_t vvar_fault(const struct vm_special_mapping *sm, 126 - struct vm_area_struct *vma, struct vm_fault *vmf) 127 - { 128 - struct page *timens_page = find_timens_vvar_page(vma); 129 - unsigned long pfn; 130 - 131 - switch (vmf->pgoff) { 132 - case VVAR_BASE_PAGE_OFFSET: 133 - pfn = virt_to_pfn(vdso_data); 134 - break; 135 - case VVAR_TIME_PAGE_OFFSET: 136 - if (timens_page) 137 - pfn = page_to_pfn(timens_page); 138 - else 139 - pfn = virt_to_pfn(vdso_data->data); 140 - break; 141 - #ifdef CONFIG_TIME_NS 142 - case VVAR_TIMENS_PAGE_OFFSET: 143 - /* 144 - * If a task belongs to a time namespace then a namespace 145 - * specific VVAR is mapped with the VVAR_DATA_PAGE_OFFSET and 146 - * the real VVAR page is mapped with the VVAR_TIMENS_PAGE_OFFSET 147 - * offset. 148 - * See also the comment near timens_setup_vdso_data(). 149 - */ 150 - if (!timens_page) 151 - return VM_FAULT_SIGBUS; 152 - pfn = virt_to_pfn(vdso_data->data); 153 - break; 154 - #endif /* CONFIG_TIME_NS */ 155 - default: 156 - return VM_FAULT_SIGBUS; 157 - } 158 - 159 - return vmf_insert_pfn(vma, vmf->address, pfn); 160 - } 161 - 162 119 /* 163 120 * This is called from binfmt_elf, we create the special vma for the 164 121 * vDSO and insert it into the mm struct tree ··· 100 191 { 101 192 unsigned long vdso_size, vdso_base, mappings_size; 102 193 struct vm_special_mapping *vdso_spec; 103 - unsigned long vvar_size = VVAR_NR_PAGES * PAGE_SIZE; 194 + unsigned long vvar_size = VDSO_NR_PAGES * PAGE_SIZE; 104 195 struct mm_struct *mm = current->mm; 105 196 struct vm_area_struct *vma; 106 197 ··· 126 217 /* Add required alignment. */ 127 218 vdso_base = ALIGN(vdso_base, VDSO_ALIGNMENT); 128 219 129 - vma = _install_special_mapping(mm, vdso_base, vvar_size, 130 - VM_READ | VM_MAYREAD | VM_IO | 131 - VM_DONTDUMP | VM_PFNMAP, &vvar_spec); 220 + vma = vdso_install_vvar_mapping(mm, vdso_base); 132 221 if (IS_ERR(vma)) 133 222 return PTR_ERR(vma); 134 223 ··· 206 299 207 300 for (i = 0; i < NR_syscalls; i++) { 208 301 if (sys_call_table[i] != (void *)&sys_ni_syscall) 209 - vdso_data->syscall_map[i >> 5] |= 0x80000000UL >> (i & 0x1f); 302 + vdso_k_arch_data->syscall_map[i >> 5] |= 0x80000000UL >> (i & 0x1f); 210 303 if (IS_ENABLED(CONFIG_COMPAT) && 211 304 compat_sys_call_table[i] != (void *)&sys_ni_syscall) 212 - vdso_data->compat_syscall_map[i >> 5] |= 0x80000000UL >> (i & 0x1f); 305 + vdso_k_arch_data->compat_syscall_map[i >> 5] |= 0x80000000UL >> (i & 0x1f); 213 306 } 214 307 } 215 308 ··· 259 352 static int __init vdso_init(void) 260 353 { 261 354 #ifdef CONFIG_PPC64 262 - vdso_data->dcache_block_size = ppc64_caches.l1d.block_size; 263 - vdso_data->icache_block_size = ppc64_caches.l1i.block_size; 264 - vdso_data->dcache_log_block_size = ppc64_caches.l1d.log_block_size; 265 - vdso_data->icache_log_block_size = ppc64_caches.l1i.log_block_size; 355 + vdso_k_arch_data->dcache_block_size = ppc64_caches.l1d.block_size; 356 + vdso_k_arch_data->icache_block_size = ppc64_caches.l1i.block_size; 357 + vdso_k_arch_data->dcache_log_block_size = ppc64_caches.l1d.log_block_size; 358 + vdso_k_arch_data->icache_log_block_size = ppc64_caches.l1i.log_block_size; 266 359 #endif /* CONFIG_PPC64 */ 267 360 268 361 vdso_setup_syscall_map();
+1 -1
arch/powerpc/kernel/vdso/cacheflush.S
··· 30 30 #ifdef CONFIG_PPC64 31 31 mflr r12 32 32 .cfi_register lr,r12 33 - get_datapage r10 33 + get_datapage r10 vdso_u_arch_data 34 34 mtlr r12 35 35 .cfi_restore lr 36 36 #endif
+2 -2
arch/powerpc/kernel/vdso/datapage.S
··· 28 28 mflr r12 29 29 .cfi_register lr,r12 30 30 mr. r4,r3 31 - get_datapage r3 31 + get_datapage r3 vdso_u_arch_data 32 32 mtlr r12 33 33 #ifdef __powerpc64__ 34 34 addi r3,r3,CFG_SYSCALL_MAP64 ··· 52 52 .cfi_startproc 53 53 mflr r12 54 54 .cfi_register lr,r12 55 - get_datapage r3 55 + get_datapage r3 vdso_u_arch_data 56 56 #ifndef __powerpc64__ 57 57 lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3) 58 58 #endif
+2 -2
arch/powerpc/kernel/vdso/gettimeofday.S
··· 33 33 .cfi_rel_offset r2, PPC_MIN_STKFRM + STK_GOT 34 34 #endif 35 35 .ifeq \call_time 36 - get_datapage r5 VDSO_DATA_OFFSET 36 + get_datapage r5 vdso_u_time_data 37 37 .else 38 - get_datapage r4 VDSO_DATA_OFFSET 38 + get_datapage r4 vdso_u_time_data 39 39 .endif 40 40 bl CFUNC(DOTSYM(\funct)) 41 41 PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
+3 -1
arch/powerpc/kernel/vdso/vdso32.lds.S
··· 6 6 #include <asm/vdso.h> 7 7 #include <asm/page.h> 8 8 #include <asm-generic/vmlinux.lds.h> 9 + #include <vdso/datapage.h> 9 10 10 11 #ifdef __LITTLE_ENDIAN__ 11 12 OUTPUT_FORMAT("elf32-powerpcle", "elf32-powerpcle", "elf32-powerpcle") ··· 17 16 18 17 SECTIONS 19 18 { 20 - PROVIDE(_vdso_datapage = . - 3 * PAGE_SIZE); 19 + VDSO_VVAR_SYMS 20 + 21 21 . = SIZEOF_HEADERS; 22 22 23 23 .hash : { *(.hash) } :text
+3 -1
arch/powerpc/kernel/vdso/vdso64.lds.S
··· 6 6 #include <asm/vdso.h> 7 7 #include <asm/page.h> 8 8 #include <asm-generic/vmlinux.lds.h> 9 + #include <vdso/datapage.h> 9 10 10 11 #ifdef __LITTLE_ENDIAN__ 11 12 OUTPUT_FORMAT("elf64-powerpcle", "elf64-powerpcle", "elf64-powerpcle") ··· 17 16 18 17 SECTIONS 19 18 { 20 - PROVIDE(_vdso_datapage = . - 3 * PAGE_SIZE); 19 + VDSO_VVAR_SYMS 20 + 21 21 . = SIZEOF_HEADERS; 22 22 23 23 .hash : { *(.hash) } :text
+7 -7
arch/powerpc/kernel/vdso/vgettimeofday.c
··· 7 7 8 8 #ifdef __powerpc64__ 9 9 int __c_kernel_clock_gettime(clockid_t clock, struct __kernel_timespec *ts, 10 - const struct vdso_data *vd) 10 + const struct vdso_time_data *vd) 11 11 { 12 12 return __cvdso_clock_gettime_data(vd, clock, ts); 13 13 } 14 14 15 15 int __c_kernel_clock_getres(clockid_t clock_id, struct __kernel_timespec *res, 16 - const struct vdso_data *vd) 16 + const struct vdso_time_data *vd) 17 17 { 18 18 return __cvdso_clock_getres_data(vd, clock_id, res); 19 19 } 20 20 #else 21 21 int __c_kernel_clock_gettime(clockid_t clock, struct old_timespec32 *ts, 22 - const struct vdso_data *vd) 22 + const struct vdso_time_data *vd) 23 23 { 24 24 return __cvdso_clock_gettime32_data(vd, clock, ts); 25 25 } 26 26 27 27 int __c_kernel_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts, 28 - const struct vdso_data *vd) 28 + const struct vdso_time_data *vd) 29 29 { 30 30 return __cvdso_clock_gettime_data(vd, clock, ts); 31 31 } 32 32 33 33 int __c_kernel_clock_getres(clockid_t clock_id, struct old_timespec32 *res, 34 - const struct vdso_data *vd) 34 + const struct vdso_time_data *vd) 35 35 { 36 36 return __cvdso_clock_getres_time32_data(vd, clock_id, res); 37 37 } 38 38 #endif 39 39 40 40 int __c_kernel_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz, 41 - const struct vdso_data *vd) 41 + const struct vdso_time_data *vd) 42 42 { 43 43 return __cvdso_gettimeofday_data(vd, tv, tz); 44 44 } 45 45 46 - __kernel_old_time_t __c_kernel_time(__kernel_old_time_t *time, const struct vdso_data *vd) 46 + __kernel_old_time_t __c_kernel_time(__kernel_old_time_t *time, const struct vdso_time_data *vd) 47 47 { 48 48 return __cvdso_time_data(vd, time); 49 49 }