source: mainline/kernel/arch/ia64/src/asm.S@ 849ed54

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 849ed54 was c640876, checked in by Jakub Jermar <jakub@…>, 16 years ago

Fix one RAW dependency.

  • Property mode set to 100644
File size: 4.5 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/register.h>
30
31.text
32
33/** Copy memory from/to userspace.
34 *
35 * This memcpy() has been taken from the assembler output of
36 * the generic _memcpy() and modified to have the failover part.
37 *
38 * @param in0 Destination address.
39 * @param in1 Source address.
40 * @param in2 Number of byte to copy.
41 */
42.global memcpy
43.global memcpy_from_uspace
44.global memcpy_to_uspace
45.global memcpy_from_uspace_failover_address
46.global memcpy_to_uspace_failover_address
47memcpy:
48memcpy_from_uspace:
49memcpy_to_uspace:
50 alloc loc0 = ar.pfs, 3, 1, 0, 0
51
52 adds r14 = 7, in1
53 mov r2 = ar.lc
54 mov r8 = in0 ;;
55 and r14 = -8, r14 ;;
56 cmp.ne p6, p7 = r14, in1
57(p7) br.cond.dpnt 3f ;;
580:
59 cmp.ne p6, p7 = 0, in2
60(p7) br.cond.dpnt 2f ;;
61(p6) adds r14 = -1, in2
62(p6) mov r16 = r0
63(p6) mov r17 = r0 ;;
64(p6) mov ar.lc = r14
651:
66 add r14 = r16, in1
67 add r15 = r16, in0
68 adds r17 = 1, r17 ;;
69 ld1 r14 = [r14]
70 mov r16 = r17 ;;
71 st1 [r15] = r14
72 br.cloop.sptk.few 1b ;;
732:
74 mov ar.lc = r2
75 mov ar.pfs = loc0
76 br.ret.sptk.many rp
773:
78 adds r14 = 7, in0 ;;
79 and r14 = -8, r14 ;;
80 cmp.eq p6, p7 = r14, in0
81(p7) br.cond.dptk 0b
82 shr.u r18 = in2, 3 ;;
83 cmp.ne p6, p7 = 0, r18
84(p7) br.cond.dpnt 5f ;;
85(p6) adds r14 = -1, r18
86(p6) mov r16 = r0
87(p6) mov r17 = r0 ;;
88(p6) mov ar.lc = r14
894:
90 shladd r14 = r16, 3, r0
91 adds r16 = 1, r17 ;;
92 add r15 = in1, r14
93 add r14 = in0, r14
94 mov r17 = r16 ;;
95 ld8 r15 = [r15] ;;
96 st8 [r14] = r15
97 br.cloop.sptk.few 4b
985:
99 and r15 = 7, in2
100 shladd r14 = r18, 3, r0
101 mov r16 = r0
102 mov r18 = r0 ;;
103 cmp.eq p6, p7 = 0, r15
104 add in0 = r14, in0
105 adds r15 = -1, r15
106 add r17 = r14, in1
107(p6) br.cond.dpnt 2b ;;
108 mov ar.lc = r15
1096:
110 add r14 = r16, r17
111 add r15 = r16, in0
112 adds r16 = 1, r18 ;;
113 ld1 r14 = [r14]
114 mov r18 = r16 ;;
115 st1 [r15] = r14
116 br.cloop.sptk.few 6b ;;
117 mov ar.lc = r2
118 mov ar.pfs = loc0
119 br.ret.sptk.many rp
120
121memcpy_from_uspace_failover_address:
122memcpy_to_uspace_failover_address:
123 mov r8 = r0 /* return 0 on failure */
124 mov ar.pfs = loc0
125 br.ret.sptk.many rp
126
127.global memsetb
128memsetb:
129 br _memsetb
130
131.global memsetw
132memsetw:
133 br _memsetw
134
135.global cpu_halt
136cpu_halt:
137 br cpu_halt
138
139.global panic_printf
140panic_printf:
141 {
142 br.call.sptk.many b0=printf
143 }
144 br halt
145
146/** Switch to userspace - low level code.
147 *
148 * @param in0 Userspace entry point address.
149 * @param in1 Userspace stack pointer address.
150 * @param in2 Userspace register stack pointer address.
151 * @param in3 Userspace address of thread uspace_arg_t structure.
152 * @param in4 Value to be stored in IPSR.
153 * @param in5 Value to be stored in RSC.
154 */
155.global switch_to_userspace
156switch_to_userspace:
157 alloc loc0 = ar.pfs, 6, 3, 0, 0
158 rsm (PSR_IC_MASK | PSR_I_MASK) /* disable interruption collection and interrupts */
159 srlz.d ;;
160 srlz.i ;;
161
162 mov cr.ipsr = in4
163 mov cr.iip = in0
164 mov r12 = in1
165
166 xor r1 = r1, r1
167
168 /* r2 is defined to hold pcb_ptr - set it to 0 */
169 xor r2 = r2, r2
170
171 mov loc1 = cr.ifs
172 movl loc2 = PFM_MASK ;;
173 and loc1 = loc2, loc1 ;;
174 mov cr.ifs = loc1 ;; /* prevent decrementing BSP by rfi */
175
176 invala
177
178 mov loc1 = ar.rsc ;;
179 and loc1 = ~3, loc1 ;;
180 mov ar.rsc = loc1 ;; /* put RSE into enforced lazy mode */
181
182 flushrs ;;
183
184 mov ar.bspstore = in2 ;;
185 mov ar.rsc = in5 ;;
186
187 mov r8 = in3
188
189 rfi ;;
Note: See TracBrowser for help on using the repository browser.