source: mainline/arch/ia64/src/asm.S@ 41d33ac

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

Complete implementation of memcpy_from_uspace() and memcpy_to_uspace().
The memcpy() variants are based on the assembler output of the generic
_memcpy().

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[9db5b66]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
[b994a60]29#include <arch/register.h>
30
[9db5b66]31.text
32
[e3c762cd]33/** Copy memory from/to userspace.
[ffdfcf0]34 *
35 * This memcpy() has been taken from the assembler output of
36 * the generic _memcpy() and modified to have the failover part.
[e3c762cd]37 *
38 * @param in0 Destination address.
39 * @param in1 Source address.
40 * @param in2 Number of byte to copy.
41 */
[9db5b66]42.global memcpy
[e3c762cd]43.global memcpy_from_uspace
44.global memcpy_to_uspace
45.global memcpy_from_uspace_failover_address
46.global memcpy_to_uspace_failover_address
[9db5b66]47memcpy:
[e3c762cd]48memcpy_from_uspace:
49memcpy_to_uspace:
[ffdfcf0]50 alloc loc0 = ar.pfs, 3, 1, 0, 0
51
52 shr.u r18 = in2, 3
53 mov r8 = in1 ;; /* prepare to return in1 on success */
54 cmp.ne p6, p7 = 0, r18 ;;
55(p7) mov r17 = r0
56(p7) br.cond.dptk 1f ;;
57 mov r16 = r0
58 mov r17 = r0 ;;
59
600:
61 shladd r14 = r17, 3, r0
62 adds r16 = 1, r16 ;;
63 add r15 = r14, r8
64 sxt4 r17 = r16
65 add r14 = r14, in0 ;;
66 ld8 r15 = [r15]
67 cmp.gtu p6, p7 = r18, r17 ;;
68 st8 [r14] = r15
69(p6) br.cond.dptk 0b
70
711:
72 and in2 = 7, in2 ;;
73 cmp.eq p6, p7 = 0, in2 ;;
74(p6) mov ar.pfs = loc0
75(p6) br.ret.dptk.many rp
76 shladd r14 = r17, 3, r0
77 mov r16 = r0
78 mov r17 = r0 ;;
79 add in0 = in0, r14
80 add r18 = r8, r14 ;;
81
822:
83 add r14 = r16, r18
84 adds r17 = 1, r17
85 add r15 = in0, r16 ;;
86 ld1 r14 = [r14]
87 sxt4 r16 = r17 ;;
88 st1 [r15] = r14
89 cmp.gtu p6, p7 = in2, r16
90(p6) br.cond.dptk 2b
91
92 mov ar.pfs = loc0
93 br.ret.sptk.many rp
[e3c762cd]94
95memcpy_from_uspace_failover_address:
96memcpy_to_uspace_failover_address:
[ffdfcf0]97 mov r8 = r0 /* return 0 on failure */
98 mov ar.pfs = loc0
99 br.ret.sptk.many rp
[2b50d7c]100
101.global memsetb
102memsetb:
103 br _memsetb
104
105.global cpu_halt
106cpu_halt:
107 br cpu_halt
108
109.global panic_printf
110panic_printf:
111 {
112 br.call.sptk.many b0=printf
113 }
[0d8d27c]114 br halt
[b994a60]115
116/** Switch to userspace - low level code.
117 *
118 * @param in0 Userspace entry point address.
119 * @param in1 Userspace stack pointer address.
120 * @param in2 Userspace register stack pointer address.
[0f250f9]121 * @param in3 Userspace address of thread uspace_arg_t structure.
122 * @param in4 Value to be stored in IPSR.
123 * @param in5 Value to be stored in RSC.
[b994a60]124 */
125.global switch_to_userspace
126switch_to_userspace:
[0f250f9]127 alloc loc0 = ar.pfs, 6, 3, 0, 0
[1065603e]128 rsm (PSR_IC_MASK | PSR_I_MASK) /* disable interruption collection and interrupts */
[b994a60]129 srlz.d ;;
130 srlz.i ;;
131
[0f250f9]132 mov cr.ipsr = in4
[b994a60]133 mov cr.iip = in0
134 mov r12 = in1
135
136 xor r1 = r1, r1
137
138 mov loc1 = cr.ifs
139 movl loc2 = PFM_MASK ;;
140 and loc1 = loc2, loc1 ;;
141 mov cr.ifs = loc1 ;; /* prevent decrementing BSP by rfi */
142
143 invala
144
145 mov loc1 = ar.rsc ;;
146 and loc1 = ~3, loc1 ;;
147 mov ar.rsc = loc1 ;; /* put RSE into enforced lazy mode */
148
149 flushrs ;;
150
151 mov ar.bspstore = in2 ;;
[0f250f9]152 mov ar.rsc = in5 ;;
153
154 mov r8 = in3
[b994a60]155
156 rfi ;;
Note: See TracBrowser for help on using the repository browser.