Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / arch / powerpc / kernel / vdso32 / datapage.S
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
19 V_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
31 data_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
40 V_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  */
51 V_FUNCTION_BEGIN(__kernel_get_syscall_map)
52   .cfi_startproc
53         mflr    r12
54   .cfi_register lr,r12
55         mr      r4,r3
56         bl      __get_datapage@local
57         mtlr    r12
58         addi    r3,r3,CFG_SYSCALL_MAP32
59         cmpli   cr0,r4,0
60         beqlr
61         li      r0,NR_syscalls
62         stw     r0,0(r4)
63         crclr   cr0*4+so
64         blr
65   .cfi_endproc
66 V_FUNCTION_END(__kernel_get_syscall_map)
67
68 /*
69  * void unsigned long long  __kernel_get_tbfreq(void);
70  *
71  * returns the timebase frequency in HZ
72  */
73 V_FUNCTION_BEGIN(__kernel_get_tbfreq)
74   .cfi_startproc
75         mflr    r12
76   .cfi_register lr,r12
77         bl      __get_datapage@local
78         lwz     r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
79         lwz     r3,CFG_TB_TICKS_PER_SEC(r3)
80         mtlr    r12
81         crclr   cr0*4+so
82         blr
83   .cfi_endproc
84 V_FUNCTION_END(__kernel_get_tbfreq)