Annotation of sys/arch/arm/arm/copystr.S, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: copystr.S,v 1.2 2006/11/15 19:48:29 miod Exp $ */
2: /* $NetBSD: copystr.S,v 1.8 2002/10/13 14:54:48 bjh21 Exp $ */
3:
4: /*
5: * Copyright (c) 1995 Mark Brinicombe.
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by Mark Brinicombe.
19: * 4. The name of the company nor the name of the author may be used to
20: * endorse or promote products derived from this software without specific
21: * prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
24: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26: * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33: * SUCH DAMAGE.
34: *
35: * copystr.S
36: *
37: * optimised and fault protected copystr functions
38: *
39: * Created : 16/05/95
40: */
41:
42: #include "assym.h"
43: #include <machine/asm.h>
44: #include <sys/errno.h>
45:
46: .text
47: .align 0
48: #ifdef MULTIPROCESSOR
49: .Lcpu_info:
50: .word _C_LABEL(cpu_info)
51: #else
52: .Lcurpcb:
53: .word _C_LABEL(curpcb)
54: #endif
55:
56: /*
57: * r0 - from
58: * r1 - to
59: * r2 - maxlens
60: * r3 - lencopied
61: *
62: * Copy string from r0 to r1
63: */
64: ENTRY(copystr)
65: stmfd sp!, {r4-r5} /* stack is 8 byte aligned */
66: teq r2, #0x00000000
67: mov r5, #0x00000000
68: moveq r0, #ENAMETOOLONG
69: beq 2f
70:
71: 1: ldrb r4, [r0], #0x0001
72: add r5, r5, #0x00000001
73: teq r4, #0x00000000
74: strb r4, [r1], #0x0001
75: teqne r5, r2
76: bne 1b
77:
78: teq r4, #0x00000000
79: moveq r0, #0x00000000
80: movne r0, #ENAMETOOLONG
81:
82: 2: teq r3, #0x00000000
83: strne r5, [r3]
84:
85: ldmfd sp!, {r4-r5} /* stack is 8 byte aligned */
86: mov pc, lr
87:
88: #ifdef __PROG32
89: #define SAVE_REGS stmfd sp!, {r4-r6}
90: #define RESTORE_REGS ldmfd sp!, {r4-r6}
91: #else
92: /* Need to save R14_svc because it'll get trampled if we take a page fault. */
93: #define SAVE_REGS stmfd sp!, {r4-r6, r14}
94: #define RESTORE_REGS ldmfd sp!, {r4-r6, r14}
95: #endif
96:
97: /*
98: * r0 - user space address
99: * r1 - kernel space address
100: * r2 - maxlens
101: * r3 - lencopied
102: *
103: * Copy string from user space to kernel space
104: */
105: ENTRY(copyinstr)
106: SAVE_REGS
107:
108: teq r2, #0x00000000
109: mov r6, #0x00000000
110: moveq r0, #ENAMETOOLONG
111: beq 2f
112:
113: #ifdef MULTIPROCESSOR
114: /* XXX Probably not appropriate for non-Hydra SMPs */
115: stmfd sp!, {r0-r3, r14}
116: bl _C_LABEL(cpu_number)
117: ldr r4, .Lcpu_info
118: ldr r4, [r4, r0, lsl #2]
119: ldr r4, [r4, #CI_CURPCB]
120: ldmfd sp!, {r0-r3, r14}
121: #else
122: ldr r4, .Lcurpcb
123: ldr r4, [r4]
124: #endif
125:
126: #ifdef DEBUG
127: teq r4, #0x00000000
128: beq .Lcopystrpcbfault
129: #endif
130:
131: adr r5, .Lcopystrfault
132: str r5, [r4, #PCB_ONFAULT]
133:
134: 1: ldrbt r5, [r0], #0x0001
135: add r6, r6, #0x00000001
136: teq r5, #0x00000000
137: strb r5, [r1], #0x0001
138: teqne r6, r2
139: bne 1b
140:
141: mov r0, #0x00000000
142: str r0, [r4, #PCB_ONFAULT]
143:
144: teq r5, #0x00000000
145: moveq r0, #0x00000000
146: movne r0, #ENAMETOOLONG
147:
148: 2: teq r3, #0x00000000
149: strne r6, [r3]
150:
151: RESTORE_REGS
152: mov pc, lr
153:
154: /*
155: * r0 - kernel space address
156: * r1 - user space address
157: * r2 - maxlens
158: * r3 - lencopied
159: *
160: * Copy string from kernel space to user space
161: */
162: ENTRY(copyoutstr)
163: SAVE_REGS
164:
165: teq r2, #0x00000000
166: mov r6, #0x00000000
167: moveq r0, #ENAMETOOLONG
168: beq 2f
169:
170: #ifdef MULTIPROCESSOR
171: /* XXX Probably not appropriate for non-Hydra SMPs */
172: stmfd sp!, {r0-r3, r14}
173: bl _C_LABEL(cpu_number)
174: ldr r4, .Lcpu_info
175: ldr r4, [r4, r0, lsl #2]
176: ldr r4, [r4, #CI_CURPCB]
177: ldmfd sp!, {r0-r3, r14}
178: #else
179: ldr r4, .Lcurpcb
180: ldr r4, [r4]
181: #endif
182:
183: #ifdef DEBUG
184: teq r4, #0x00000000
185: beq .Lcopystrpcbfault
186: #endif
187:
188: adr r5, .Lcopystrfault
189: str r5, [r4, #PCB_ONFAULT]
190:
191: 1: ldrb r5, [r0], #0x0001
192: add r6, r6, #0x00000001
193: teq r5, #0x00000000
194: strbt r5, [r1], #0x0001
195: teqne r6, r2
196: bne 1b
197:
198: mov r0, #0x00000000
199: str r0, [r4, #PCB_ONFAULT]
200:
201: teq r5, #0x00000000
202: moveq r0, #0x00000000
203: movne r0, #ENAMETOOLONG
204:
205: 2: teq r3, #0x00000000
206: strne r6, [r3]
207:
208: RESTORE_REGS
209: mov pc, lr
210:
211: /* A fault occurred during the copy */
212: .Lcopystrfault:
213: mov r1, #0x00000000
214: str r1, [r4, #PCB_ONFAULT]
215: RESTORE_REGS
216: mov pc, lr
217:
218: #ifdef DEBUG
219: .Lcopystrpcbfault:
220: mov r2, r1
221: mov r1, r0
222: adr r0, Lcopystrpcbfaulttext
223: bic sp, sp, #7 /* align stack to 8 bytes */
224: b _C_LABEL(panic)
225:
226: Lcopystrpcbfaulttext:
227: .asciz "No valid PCB during copyinoutstr() addr1=%08x addr2=%08x\n"
228: .align 0
229: #endif
CVSweb