source: mainline/kernel/arch/sparc64/src/asm.S@ 86018c1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 86018c1 was 18baf9c0, checked in by Pavel Rimsky <pavel@…>, 16 years ago

Sources forked into sun4u and sun4v versions such that sun4u and sun4v have separate switch_to_userspace routines.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1#
2# Copyright (c) 2005 Jakub Jermar
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29#include <arch/arch.h>
30#include <arch/stack.h>
31
32.text
33
34.register %g2, #scratch
35.register %g3, #scratch
36
37/*
38 * This is the assembly language version of our _memcpy() generated by gcc.
39 */
40.global memcpy
41memcpy:
42 mov %o0, %o3 ! save dst
43 add %o1, 7, %g1
44 and %g1, -8, %g1
45 cmp %o1, %g1
46 be,pn %xcc, 3f
47 add %o0, 7, %g1
48 mov 0, %g3
490:
50 brz,pn %o2, 2f
51 mov 0, %g2
521:
53 ldub [%g3 + %o1], %g1
54 add %g2, 1, %g2
55 cmp %o2, %g2
56 stb %g1, [%g3 + %o0]
57 bne,pt %xcc, 1b
58 mov %g2, %g3
592:
60 jmp %o7 + 8 ! exit point
61 mov %o3, %o0
623:
63 and %g1, -8, %g1
64 cmp %o0, %g1
65 bne,pt %xcc, 0b
66 mov 0, %g3
67 srlx %o2, 3, %g4
68 brz,pn %g4, 5f
69 mov 0, %g5
704:
71 sllx %g3, 3, %g2
72 add %g5, 1, %g3
73 ldx [%o1 + %g2], %g1
74 mov %g3, %g5
75 cmp %g4, %g3
76 bne,pt %xcc, 4b
77 stx %g1, [%o0 + %g2]
785:
79 and %o2, 7, %o2
80 brz,pn %o2, 2b
81 sllx %g4, 3, %g1
82 mov 0, %g2
83 add %g1, %o0, %o0
84 add %g1, %o1, %g4
85 mov 0, %g3
866:
87 ldub [%g2 + %g4], %g1
88 stb %g1, [%g2 + %o0]
89 add %g3, 1, %g2
90 cmp %o2, %g2
91 bne,pt %xcc, 6b
92 mov %g2, %g3
93
94 jmp %o7 + 8 ! exit point
95 mov %o3, %o0
96
97/*
98 * Almost the same as memcpy() except the loads are from userspace.
99 */
100.global memcpy_from_uspace
101memcpy_from_uspace:
102 mov %o0, %o3 ! save dst
103 add %o1, 7, %g1
104 and %g1, -8, %g1
105 cmp %o1, %g1
106 be,pn %xcc, 3f
107 add %o0, 7, %g1
108 mov 0, %g3
1090:
110 brz,pn %o2, 2f
111 mov 0, %g2
1121:
113 lduba [%g3 + %o1] ASI_AIUS, %g1
114 add %g2, 1, %g2
115 cmp %o2, %g2
116 stb %g1, [%g3 + %o0]
117 bne,pt %xcc, 1b
118 mov %g2, %g3
1192:
120 jmp %o7 + 8 ! exit point
121 mov %o3, %o0
1223:
123 and %g1, -8, %g1
124 cmp %o0, %g1
125 bne,pt %xcc, 0b
126 mov 0, %g3
127 srlx %o2, 3, %g4
128 brz,pn %g4, 5f
129 mov 0, %g5
1304:
131 sllx %g3, 3, %g2
132 add %g5, 1, %g3
133 ldxa [%o1 + %g2] ASI_AIUS, %g1
134 mov %g3, %g5
135 cmp %g4, %g3
136 bne,pt %xcc, 4b
137 stx %g1, [%o0 + %g2]
1385:
139 and %o2, 7, %o2
140 brz,pn %o2, 2b
141 sllx %g4, 3, %g1
142 mov 0, %g2
143 add %g1, %o0, %o0
144 add %g1, %o1, %g4
145 mov 0, %g3
1466:
147 lduba [%g2 + %g4] ASI_AIUS, %g1
148 stb %g1, [%g2 + %o0]
149 add %g3, 1, %g2
150 cmp %o2, %g2
151 bne,pt %xcc, 6b
152 mov %g2, %g3
153
154 jmp %o7 + 8 ! exit point
155 mov %o3, %o0
156
157/*
158 * Almost the same as memcpy() except the stores are to userspace.
159 */
160.global memcpy_to_uspace
161memcpy_to_uspace:
162 mov %o0, %o3 ! save dst
163 add %o1, 7, %g1
164 and %g1, -8, %g1
165 cmp %o1, %g1
166 be,pn %xcc, 3f
167 add %o0, 7, %g1
168 mov 0, %g3
1690:
170 brz,pn %o2, 2f
171 mov 0, %g2
1721:
173 ldub [%g3 + %o1], %g1
174 add %g2, 1, %g2
175 cmp %o2, %g2
176 stba %g1, [%g3 + %o0] ASI_AIUS
177 bne,pt %xcc, 1b
178 mov %g2, %g3
1792:
180 jmp %o7 + 8 ! exit point
181 mov %o3, %o0
1823:
183 and %g1, -8, %g1
184 cmp %o0, %g1
185 bne,pt %xcc, 0b
186 mov 0, %g3
187 srlx %o2, 3, %g4
188 brz,pn %g4, 5f
189 mov 0, %g5
1904:
191 sllx %g3, 3, %g2
192 add %g5, 1, %g3
193 ldx [%o1 + %g2], %g1
194 mov %g3, %g5
195 cmp %g4, %g3
196 bne,pt %xcc, 4b
197 stxa %g1, [%o0 + %g2] ASI_AIUS
1985:
199 and %o2, 7, %o2
200 brz,pn %o2, 2b
201 sllx %g4, 3, %g1
202 mov 0, %g2
203 add %g1, %o0, %o0
204 add %g1, %o1, %g4
205 mov 0, %g3
2066:
207 ldub [%g2 + %g4], %g1
208 stba %g1, [%g2 + %o0] ASI_AIUS
209 add %g3, 1, %g2
210 cmp %o2, %g2
211 bne,pt %xcc, 6b
212 mov %g2, %g3
213
214 jmp %o7 + 8 ! exit point
215 mov %o3, %o0
216
217.global memcpy_from_uspace_failover_address
218.global memcpy_to_uspace_failover_address
219memcpy_from_uspace_failover_address:
220memcpy_to_uspace_failover_address:
221 jmp %o7 + 8 ! exit point
222 mov %g0, %o0 ! return 0 on failure
223
224.global memsetb
225memsetb:
226 ba %xcc, _memsetb
227 nop
228
229.global memsetw
230memsetw:
231 ba %xcc, _memsetw
232 nop
233
Note: See TracBrowser for help on using the repository browser.