1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Access to the shared data page by the vDSO & syscall map 4 * 5 * Copyright (C) 2004 Benjamin Herrenschmuidt (benh@kernel.crashing.org), IBM Corp. 6 */ 7 8#include <asm/processor.h> 9#include <asm/ppc_asm.h> 10#include <asm/asm-offsets.h> 11#include <asm/unistd.h> 12#include <asm/vdso.h> 13 14 .text 15.global __kernel_datapage_offset; 16__kernel_datapage_offset: 17 .long 0 18 19V_FUNCTION_BEGIN(__get_datapage) 20 .cfi_startproc 21 /* We don't want that exposed or overridable as we want other objects 22 * to be able to bl directly to here 23 */ 24 .protected __get_datapage 25 .hidden __get_datapage 26 27 mflr r0 28 .cfi_register lr,r0 29 30 bcl 20,31,data_page_branch 31data_page_branch: 32 mflr r3 33 mtlr r0 34 addi r3, r3, __kernel_datapage_offset-data_page_branch 35 lwz r0,0(r3) 36 .cfi_restore lr 37 add r3,r0,r3 38 blr 39 .cfi_endproc 40V_FUNCTION_END(__get_datapage) 41 42/* 43 * void *__kernel_get_syscall_map(unsigned int *syscall_count) ; 44 * 45 * returns a pointer to the syscall map. the map is agnostic to the 46 * size of "long", unlike kernel bitops, it stores bits from top to 47 * bottom so that memory actually contains a linear bitmap 48 * check for syscall N by testing bit (0x80000000 >> (N & 0x1f)) of 49 * 32 bits int at N >> 5. 50 */ 51V_FUNCTION_BEGIN(__kernel_get_syscall_map) 52 .cfi_startproc 53 mflr r12 54 .cfi_register lr,r12 55 mr r4,r3 56 bl V_LOCAL_FUNC(__get_datapage) 57 mtlr r12 58 addi r3,r3,CFG_SYSCALL_MAP64 59 cmpldi cr0,r4,0 60 crclr cr0*4+so 61 beqlr 62 li r0,NR_syscalls 63 stw r0,0(r4) 64 blr 65 .cfi_endproc 66V_FUNCTION_END(__kernel_get_syscall_map) 67 68 69/* 70 * void unsigned long __kernel_get_tbfreq(void); 71 * 72 * returns the timebase frequency in HZ 73 */ 74V_FUNCTION_BEGIN(__kernel_get_tbfreq) 75 .cfi_startproc 76 mflr r12 77 .cfi_register lr,r12 78 bl V_LOCAL_FUNC(__get_datapage) 79 ld r3,CFG_TB_TICKS_PER_SEC(r3) 80 mtlr r12 81 crclr cr0*4+so 82 blr 83 .cfi_endproc 84V_FUNCTION_END(__kernel_get_tbfreq) 85