1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * OpenRISC string.S |
4 | * |
5 | * Linux architectural port borrowing liberally from similar works of |
6 | * others. All original copyrights apply as per the original source |
7 | * declaration. |
8 | * |
9 | * Modifications for the OpenRISC architecture: |
10 | * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> |
11 | * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> |
12 | */ |
13 | |
14 | #include <linux/linkage.h> |
15 | #include <asm/errno.h> |
16 | |
17 | /* |
18 | * this can be optimized by doing gcc inline assemlby with |
19 | * proper constraints (no need to save args registers...) |
20 | * |
21 | */ |
22 | |
23 | |
24 | /* |
25 | * |
26 | * int __copy_tofrom_user(void *to, const void *from, unsigned long size); |
27 | * |
28 | * NOTE: it returns number of bytes NOT copied !!! |
29 | * |
30 | */ |
31 | .global __copy_tofrom_user |
32 | __copy_tofrom_user: |
33 | l.addi r1,r1,-12 |
34 | l.sw 0(r1),r6 |
35 | l.sw 4(r1),r4 |
36 | l.sw 8(r1),r3 |
37 | |
38 | l.addi r11,r5,0 |
39 | 2: l.sfeq r11,r0 |
40 | l.bf 1f |
41 | l.addi r11,r11,-1 |
42 | 8: l.lbz r6,0(r4) |
43 | 9: l.sb 0(r3),r6 |
44 | l.addi r3,r3,1 |
45 | l.j 2b |
46 | l.addi r4,r4,1 |
47 | 1: |
48 | l.addi r11,r11,1 // r11 holds the return value |
49 | |
50 | l.lwz r6,0(r1) |
51 | l.lwz r4,4(r1) |
52 | l.lwz r3,8(r1) |
53 | l.jr r9 |
54 | l.addi r1,r1,12 |
55 | |
56 | .section .fixup, "ax" |
57 | 99: |
58 | l.j 1b |
59 | l.nop |
60 | .previous |
61 | |
62 | .section __ex_table, "a" |
63 | .long 8b, 99b // read fault |
64 | .long 9b, 99b // write fault |
65 | .previous |
66 | |
67 | /* |
68 | * unsigned long clear_user(void *addr, unsigned long size) ; |
69 | * |
70 | * NOTE: it returns number of bytes NOT cleared !!! |
71 | */ |
72 | .global __clear_user |
73 | __clear_user: |
74 | l.addi r1,r1,-8 |
75 | l.sw 0(r1),r4 |
76 | l.sw 4(r1),r3 |
77 | |
78 | 2: l.sfeq r4,r0 |
79 | l.bf 1f |
80 | l.addi r4,r4,-1 |
81 | 9: l.sb 0(r3),r0 |
82 | l.j 2b |
83 | l.addi r3,r3,1 |
84 | |
85 | 1: |
86 | l.addi r11,r4,1 |
87 | |
88 | l.lwz r4,0(r1) |
89 | l.lwz r3,4(r1) |
90 | l.jr r9 |
91 | l.addi r1,r1,8 |
92 | |
93 | .section .fixup, "ax" |
94 | 99: |
95 | l.j 1b |
96 | l.nop |
97 | .previous |
98 | |
99 | .section __ex_table, "a" |
100 | .long 9b, 99b // write fault |
101 | .previous |
102 | |