Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
1da177e4 LT |
2 | /* |
3 | * linux/arch/arm/lib/csumpartialcopyuser.S | |
4 | * | |
5 | * Copyright (C) 1995-1998 Russell King | |
6 | * | |
1da177e4 | 7 | * 27/03/03 Ian Molton Clean up CONFIG_CPU |
1da177e4 LT |
8 | */ |
9 | #include <linux/linkage.h> | |
10 | #include <asm/assembler.h> | |
11 | #include <asm/errno.h> | |
e6ae744d | 12 | #include <asm/asm-offsets.h> |
1da177e4 LT |
13 | |
14 | .text | |
15 | ||
7af5b901 LW |
16 | #if defined(CONFIG_CPU_SW_DOMAIN_PAN) |
17 | ||
a5e090ac RK |
18 | .macro save_regs |
19 | mrc p15, 0, ip, c3, c0, 0 | |
20 | stmfd sp!, {r1, r2, r4 - r8, ip, lr} | |
21 | uaccess_enable ip | |
22 | .endm | |
23 | ||
24 | .macro load_regs | |
25 | ldmfd sp!, {r1, r2, r4 - r8, ip, lr} | |
26 | mcr p15, 0, ip, c3, c0, 0 | |
27 | ret lr | |
28 | .endm | |
7af5b901 LW |
29 | |
30 | #elif defined(CONFIG_CPU_TTBR0_PAN) | |
31 | ||
32 | .macro save_regs | |
33 | mrc p15, 0, ip, c2, c0, 2 @ read TTBCR | |
34 | stmfd sp!, {r1, r2, r4 - r8, ip, lr} | |
35 | uaccess_enable ip | |
36 | .endm | |
37 | ||
38 | .macro load_regs | |
39 | ldmfd sp!, {r1, r2, r4 - r8, ip, lr} | |
40 | mcr p15, 0, ip, c2, c0, 2 @ restore TTBCR | |
41 | ret lr | |
42 | .endm | |
43 | ||
a5e090ac | 44 | #else |
7af5b901 | 45 | |
1da177e4 | 46 | .macro save_regs |
22acc4e6 | 47 | stmfd sp!, {r1, r2, r4 - r8, lr} |
1da177e4 LT |
48 | .endm |
49 | ||
90303b10 | 50 | .macro load_regs |
22acc4e6 | 51 | ldmfd sp!, {r1, r2, r4 - r8, pc} |
1da177e4 | 52 | .endm |
7af5b901 | 53 | |
a5e090ac | 54 | #endif |
1da177e4 LT |
55 | |
56 | .macro load1b, reg1 | |
8b592783 | 57 | ldrusr \reg1, r0, 1 |
1da177e4 LT |
58 | .endm |
59 | ||
60 | .macro load2b, reg1, reg2 | |
8b592783 CM |
61 | ldrusr \reg1, r0, 1 |
62 | ldrusr \reg2, r0, 1 | |
1da177e4 LT |
63 | .endm |
64 | ||
65 | .macro load1l, reg1 | |
8b592783 | 66 | ldrusr \reg1, r0, 4 |
1da177e4 LT |
67 | .endm |
68 | ||
69 | .macro load2l, reg1, reg2 | |
8b592783 CM |
70 | ldrusr \reg1, r0, 4 |
71 | ldrusr \reg2, r0, 4 | |
1da177e4 LT |
72 | .endm |
73 | ||
74 | .macro load4l, reg1, reg2, reg3, reg4 | |
8b592783 CM |
75 | ldrusr \reg1, r0, 4 |
76 | ldrusr \reg2, r0, 4 | |
77 | ldrusr \reg3, r0, 4 | |
78 | ldrusr \reg4, r0, 4 | |
1da177e4 LT |
79 | .endm |
80 | ||
81 | /* | |
82 | * unsigned int | |
1d60be3c AV |
83 | * csum_partial_copy_from_user(const char *src, char *dst, int len) |
84 | * r0 = src, r1 = dst, r2 = len | |
85 | * Returns : r0 = checksum or 0 | |
1da177e4 LT |
86 | */ |
87 | ||
88 | #define FN_ENTRY ENTRY(csum_partial_copy_from_user) | |
93ed3970 | 89 | #define FN_EXIT ENDPROC(csum_partial_copy_from_user) |
1da177e4 LT |
90 | |
91 | #include "csumpartialcopygeneric.S" | |
92 | ||
93 | /* | |
1d60be3c AV |
94 | * We report fault by returning 0 csum - impossible in normal case, since |
95 | * we start with 0xffffffff for initial sum. | |
1da177e4 | 96 | */ |
c4a84ae3 | 97 | .pushsection .text.fixup,"ax" |
1da177e4 | 98 | .align 4 |
1d60be3c | 99 | 9001: mov r0, #0 |
90303b10 | 100 | load_regs |
4260415f | 101 | .popsection |