Loading...
Note: File does not exist in v3.1.
1#include <linux/linkage.h>
2#include <asm/asm.h>
3#include <asm/csr.h>
4
5 .altmacro
6 .macro fixup op reg addr lbl
7 LOCAL _epc
8_epc:
9 \op \reg, \addr
10 .section __ex_table,"a"
11 .balign RISCV_SZPTR
12 RISCV_PTR _epc, \lbl
13 .previous
14 .endm
15
16ENTRY(__asm_copy_to_user)
17ENTRY(__asm_copy_from_user)
18
19 /* Enable access to user memory */
20 li t6, SR_SUM
21 csrs CSR_SSTATUS, t6
22
23 add a3, a1, a2
24 /* Use word-oriented copy only if low-order bits match */
25 andi t0, a0, SZREG-1
26 andi t1, a1, SZREG-1
27 bne t0, t1, 2f
28
29 addi t0, a1, SZREG-1
30 andi t1, a3, ~(SZREG-1)
31 andi t0, t0, ~(SZREG-1)
32 /*
33 * a3: terminal address of source region
34 * t0: lowest XLEN-aligned address in source
35 * t1: highest XLEN-aligned address in source
36 */
37 bgeu t0, t1, 2f
38 bltu a1, t0, 4f
391:
40 fixup REG_L, t2, (a1), 10f
41 fixup REG_S, t2, (a0), 10f
42 addi a1, a1, SZREG
43 addi a0, a0, SZREG
44 bltu a1, t1, 1b
452:
46 bltu a1, a3, 5f
47
483:
49 /* Disable access to user memory */
50 csrc CSR_SSTATUS, t6
51 li a0, 0
52 ret
534: /* Edge case: unalignment */
54 fixup lbu, t2, (a1), 10f
55 fixup sb, t2, (a0), 10f
56 addi a1, a1, 1
57 addi a0, a0, 1
58 bltu a1, t0, 4b
59 j 1b
605: /* Edge case: remainder */
61 fixup lbu, t2, (a1), 10f
62 fixup sb, t2, (a0), 10f
63 addi a1, a1, 1
64 addi a0, a0, 1
65 bltu a1, a3, 5b
66 j 3b
67ENDPROC(__asm_copy_to_user)
68ENDPROC(__asm_copy_from_user)
69
70
71ENTRY(__clear_user)
72
73 /* Enable access to user memory */
74 li t6, SR_SUM
75 csrs CSR_SSTATUS, t6
76
77 add a3, a0, a1
78 addi t0, a0, SZREG-1
79 andi t1, a3, ~(SZREG-1)
80 andi t0, t0, ~(SZREG-1)
81 /*
82 * a3: terminal address of target region
83 * t0: lowest doubleword-aligned address in target region
84 * t1: highest doubleword-aligned address in target region
85 */
86 bgeu t0, t1, 2f
87 bltu a0, t0, 4f
881:
89 fixup REG_S, zero, (a0), 11f
90 addi a0, a0, SZREG
91 bltu a0, t1, 1b
922:
93 bltu a0, a3, 5f
94
953:
96 /* Disable access to user memory */
97 csrc CSR_SSTATUS, t6
98 li a0, 0
99 ret
1004: /* Edge case: unalignment */
101 fixup sb, zero, (a0), 11f
102 addi a0, a0, 1
103 bltu a0, t0, 4b
104 j 1b
1055: /* Edge case: remainder */
106 fixup sb, zero, (a0), 11f
107 addi a0, a0, 1
108 bltu a0, a3, 5b
109 j 3b
110ENDPROC(__clear_user)
111
112 .section .fixup,"ax"
113 .balign 4
114 /* Fixup code for __copy_user(10) and __clear_user(11) */
11510:
116 /* Disable access to user memory */
117 csrs CSR_SSTATUS, t6
118 mv a0, a2
119 ret
12011:
121 csrs CSR_SSTATUS, t6
122 mv a0, a1
123 ret
124 .previous