blob: c09fee7dec1455082273c9e46b6b2665603f856a [file] [log] [blame]
Jonas Bonn224cd122011-06-04 22:44:40 +03001/*
2 * OpenRISC string.S
3 *
4 * Linux architectural port borrowing liberally from similar works of
5 * others. All original copyrights apply as per the original source
6 * declaration.
7 *
8 * Modifications for the OpenRISC architecture:
9 * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
10 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
16 */
17
18#include <linux/linkage.h>
19#include <asm/errno.h>
20
21 /*
22 * this can be optimized by doing gcc inline assemlby with
23 * proper constraints (no need to save args registers...)
24 *
25 */
26
27
28/*
29 *
30 * int __copy_tofrom_user(void *to, const void *from, unsigned long size);
31 *
32 * NOTE: it returns number of bytes NOT copied !!!
33 *
34 */
35 .global __copy_tofrom_user
36__copy_tofrom_user:
37 l.addi r1,r1,-12
38 l.sw 0(r1),r6
39 l.sw 4(r1),r4
40 l.sw 8(r1),r3
41
42 l.addi r11,r5,0
432: l.sfeq r11,r0
44 l.bf 1f
45 l.addi r11,r11,-1
468: l.lbz r6,0(r4)
479: l.sb 0(r3),r6
48 l.addi r3,r3,1
49 l.j 2b
50 l.addi r4,r4,1
511:
52 l.addi r11,r11,1 // r11 holds the return value
53
54 l.lwz r6,0(r1)
55 l.lwz r4,4(r1)
56 l.lwz r3,8(r1)
57 l.jr r9
58 l.addi r1,r1,12
59
60 .section .fixup, "ax"
6199:
62 l.j 1b
63 l.nop
64 .previous
65
66 .section __ex_table, "a"
67 .long 8b, 99b // read fault
68 .long 9b, 99b // write fault
69 .previous
70
71/*
72 * unsigned long clear_user(void *addr, unsigned long size) ;
73 *
74 * NOTE: it returns number of bytes NOT cleared !!!
75 */
76 .global __clear_user
77__clear_user:
78 l.addi r1,r1,-8
79 l.sw 0(r1),r4
80 l.sw 4(r1),r3
81
822: l.sfeq r4,r0
83 l.bf 1f
84 l.addi r4,r4,-1
859: l.sb 0(r3),r0
86 l.j 2b
87 l.addi r3,r3,1
88
891:
90 l.addi r11,r4,1
91
92 l.lwz r4,0(r1)
93 l.lwz r3,4(r1)
94 l.jr r9
95 l.addi r1,r1,8
96
97 .section .fixup, "ax"
9899:
99 l.j 1b
100 l.nop
101 .previous
102
103 .section __ex_table, "a"
104 .long 9b, 99b // write fault
105 .previous