source: mainline/kernel/arch/ppc32/src/asm.S

Last change on this file was 28a5ebd, checked in by Martin Decky <martin@…>, 5 years ago

Use char32_t instead of wchat_t to represent UTF-32 strings

The intention of the native HelenOS string API has been always to
support Unicode in the UTF-8 and UTF-32 encodings as the sole character
representations and ignore the obsolete mess of older single-byte and
multibyte character encodings. Before C11, the wchar_t type has been
slightly misused for the purpose of the UTF-32 strings. The newer
char32_t type is obviously a much more suitable option. The standard
defines char32_t as uint_least32_t, thus we can take the liberty to fix
it to uint32_t.

To maintain compatilibity with the C Standard, the putwchar(wchar_t)
functions has been replaced by our custom putuchar(char32_t) functions
where appropriate.

  • Property mode set to 100644
File size: 5.6 KB
RevLine 
[eedf4c5]1/*
2 * Copyright (c) 2005 Martin Decky
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 */
[efa9b73]28
[b66cc97]29#include <abi/asmtool.h>
[37c8975]30#include <arch/asm/regname.h>
[c0699467]31#include <arch/msr.h>
[beb16cfa]32#include <arch/istate_struct.h>
[10caad0]33
[efa9b73]34.text
35
[b66cc97]36FUNCTION_BEGIN(userspace_asm)
[eedf4c5]37 /*
38 * r3 = uspace_uarg
39 * r4 = stack
40 * r5 = entry
41 */
[a35b458]42
[eedf4c5]43 /* Disable interrupts */
[a35b458]44
[e692a27]45 mfmsr r31
46 rlwinm r31, r31, 0, 17, 15
47 mtmsr r31
[5a42886]48 isync
[a35b458]49
[eedf4c5]50 /* Set entry point */
[a35b458]51
[e692a27]52 mtsrr0 r5
[a35b458]53
[52c0b8c]54 /* Set privileged state, enable interrupts */
[a35b458]55
[ffe276f]56 ori r31, r31, MSR_PR
57 ori r31, r31, MSR_EE
[e692a27]58 mtsrr1 r31
[a35b458]59
[eedf4c5]60 /* Set stack */
[a35b458]61
[e692a27]62 mr sp, r4
[a35b458]63
[eedf4c5]64 /* %r6 is defined to hold pcb_ptr - set it to 0 */
[a35b458]65
[c1b455e]66 xor r6, r6, r6
[a35b458]67
[eedf4c5]68 /* Jump to userspace */
[a35b458]69
[e692a27]70 rfi
[b66cc97]71FUNCTION_END(userspace_asm)
[e692a27]72
[b66cc97]73SYMBOL(iret)
[eedf4c5]74 /* Disable interrupts */
[a35b458]75
[e34a141]76 mfmsr r31
77 rlwinm r31, r31, 0, 17, 15
78 mtmsr r31
[5a42886]79 isync
[a35b458]80
[beb16cfa]81 lwz r0, ISTATE_OFFSET_R0(sp)
82 lwz r2, ISTATE_OFFSET_R2(sp)
83 lwz r3, ISTATE_OFFSET_R3(sp)
84 lwz r4, ISTATE_OFFSET_R4(sp)
85 lwz r5, ISTATE_OFFSET_R5(sp)
86 lwz r6, ISTATE_OFFSET_R6(sp)
87 lwz r7, ISTATE_OFFSET_R7(sp)
88 lwz r8, ISTATE_OFFSET_R8(sp)
89 lwz r9, ISTATE_OFFSET_R9(sp)
90 lwz r10, ISTATE_OFFSET_R10(sp)
91 lwz r11, ISTATE_OFFSET_R11(sp)
92 lwz r13, ISTATE_OFFSET_R13(sp)
93 lwz r14, ISTATE_OFFSET_R14(sp)
94 lwz r15, ISTATE_OFFSET_R15(sp)
95 lwz r16, ISTATE_OFFSET_R16(sp)
96 lwz r17, ISTATE_OFFSET_R17(sp)
97 lwz r18, ISTATE_OFFSET_R18(sp)
98 lwz r19, ISTATE_OFFSET_R19(sp)
99 lwz r20, ISTATE_OFFSET_R20(sp)
100 lwz r21, ISTATE_OFFSET_R21(sp)
101 lwz r22, ISTATE_OFFSET_R22(sp)
102 lwz r23, ISTATE_OFFSET_R23(sp)
103 lwz r24, ISTATE_OFFSET_R24(sp)
104 lwz r25, ISTATE_OFFSET_R25(sp)
105 lwz r26, ISTATE_OFFSET_R26(sp)
106 lwz r27, ISTATE_OFFSET_R27(sp)
107 lwz r28, ISTATE_OFFSET_R28(sp)
108 lwz r29, ISTATE_OFFSET_R29(sp)
109 lwz r30, ISTATE_OFFSET_R30(sp)
110 lwz r31, ISTATE_OFFSET_R31(sp)
[a35b458]111
[beb16cfa]112 lwz r12, ISTATE_OFFSET_CR(sp)
[e34a141]113 mtcr r12
[a35b458]114
[beb16cfa]115 lwz r12, ISTATE_OFFSET_PC(sp)
[e34a141]116 mtsrr0 r12
[a35b458]117
[beb16cfa]118 lwz r12, ISTATE_OFFSET_SRR1(sp)
[e34a141]119 mtsrr1 r12
[a35b458]120
[beb16cfa]121 lwz r12, ISTATE_OFFSET_LR(sp)
[e34a141]122 mtlr r12
[a35b458]123
[beb16cfa]124 lwz r12, ISTATE_OFFSET_CTR(sp)
[762a824]125 mtctr r12
[a35b458]126
[beb16cfa]127 lwz r12, ISTATE_OFFSET_XER(sp)
[762a824]128 mtxer r12
[a35b458]129
[beb16cfa]130 lwz r12, ISTATE_OFFSET_R12(sp)
131 lwz sp, ISTATE_OFFSET_SP(sp)
[a35b458]132
[e34a141]133 rfi
[762a824]134
[b66cc97]135SYMBOL(iret_syscall)
[eedf4c5]136 /* Disable interrupts */
[a35b458]137
[e34a141]138 mfmsr r31
139 rlwinm r31, r31, 0, 17, 15
140 mtmsr r31
[5a42886]141 isync
[a35b458]142
[beb16cfa]143 lwz r0, ISTATE_OFFSET_R0(sp)
144 lwz r2, ISTATE_OFFSET_R2(sp)
145 lwz r4, ISTATE_OFFSET_R4(sp)
146 lwz r5, ISTATE_OFFSET_R5(sp)
147 lwz r6, ISTATE_OFFSET_R6(sp)
148 lwz r7, ISTATE_OFFSET_R7(sp)
149 lwz r8, ISTATE_OFFSET_R8(sp)
150 lwz r9, ISTATE_OFFSET_R9(sp)
151 lwz r10, ISTATE_OFFSET_R10(sp)
152 lwz r11, ISTATE_OFFSET_R11(sp)
153 lwz r13, ISTATE_OFFSET_R13(sp)
154 lwz r14, ISTATE_OFFSET_R14(sp)
155 lwz r15, ISTATE_OFFSET_R15(sp)
156 lwz r16, ISTATE_OFFSET_R16(sp)
157 lwz r17, ISTATE_OFFSET_R17(sp)
158 lwz r18, ISTATE_OFFSET_R18(sp)
159 lwz r19, ISTATE_OFFSET_R19(sp)
160 lwz r20, ISTATE_OFFSET_R20(sp)
161 lwz r21, ISTATE_OFFSET_R21(sp)
162 lwz r22, ISTATE_OFFSET_R22(sp)
163 lwz r23, ISTATE_OFFSET_R23(sp)
164 lwz r24, ISTATE_OFFSET_R24(sp)
165 lwz r25, ISTATE_OFFSET_R25(sp)
166 lwz r26, ISTATE_OFFSET_R26(sp)
167 lwz r27, ISTATE_OFFSET_R27(sp)
168 lwz r28, ISTATE_OFFSET_R28(sp)
169 lwz r29, ISTATE_OFFSET_R29(sp)
170 lwz r30, ISTATE_OFFSET_R30(sp)
171 lwz r31, ISTATE_OFFSET_R31(sp)
[a35b458]172
[beb16cfa]173 lwz r12, ISTATE_OFFSET_CR(sp)
[e34a141]174 mtcr r12
[a35b458]175
[beb16cfa]176 lwz r12, ISTATE_OFFSET_PC(sp)
[e34a141]177 mtsrr0 r12
[a35b458]178
[beb16cfa]179 lwz r12, ISTATE_OFFSET_SRR1(sp)
[e34a141]180 mtsrr1 r12
[a35b458]181
[beb16cfa]182 lwz r12, ISTATE_OFFSET_LR(sp)
[e34a141]183 mtlr r12
[a35b458]184
[beb16cfa]185 lwz r12, ISTATE_OFFSET_CTR(sp)
[e34a141]186 mtctr r12
[a35b458]187
[beb16cfa]188 lwz r12, ISTATE_OFFSET_XER(sp)
[e34a141]189 mtxer r12
[a35b458]190
[beb16cfa]191 lwz r12, ISTATE_OFFSET_R12(sp)
192 lwz sp, ISTATE_OFFSET_SP(sp)
[a35b458]193
[91d5ad6]194 rfi
[b60c582]195
[b66cc97]196FUNCTION_BEGIN(memcpy_from_uspace)
197FUNCTION_BEGIN(memcpy_to_uspace)
[6f8a426]198 srwi. r7, r5, 3
199 addi r6, r3, -4
200 addi r4, r4, -4
[ffe276f]201 beq 2f
[a35b458]202
[6f8a426]203 andi. r0, r6, 3
204 mtctr r7
205 bne 5f
[a35b458]206
[6f8a426]207 1:
[a35b458]208
[ffe276f]209 lwz r7, 4(r4)
210 lwzu r8, 8(r4)
211 stw r7, 4(r6)
212 stwu r8, 8(r6)
213 bdnz 1b
[a35b458]214
[ffe276f]215 andi. r5, r5, 7
[a35b458]216
[6f8a426]217 2:
[a35b458]218
[ffe276f]219 cmplwi 0, r5, 4
220 blt 3f
[a35b458]221
[ffe276f]222 lwzu r0, 4(r4)
223 addi r5, r5, -4
224 stwu r0, 4(r6)
[a35b458]225
[6f8a426]226 3:
[a35b458]227
[ffe276f]228 cmpwi 0, r5, 0
229 beqlr
230 mtctr r5
231 addi r4, r4, 3
232 addi r6, r6, 3
[a35b458]233
[6f8a426]234 4:
[a35b458]235
[ffe276f]236 lbzu r0, 1(r4)
237 stbu r0, 1(r6)
238 bdnz 4b
239 blr
[a35b458]240
[6f8a426]241 5:
[a35b458]242
[ffe276f]243 subfic r0, r0, 4
244 mtctr r0
[a35b458]245
[6f8a426]246 6:
[a35b458]247
[ffe276f]248 lbz r7, 4(r4)
249 addi r4, r4, 1
250 stb r7, 4(r6)
251 addi r6, r6, 1
252 bdnz 6b
253 subf r5, r0, r5
254 rlwinm. r7, r5, 32-3, 3, 31
255 beq 2b
256 mtctr r7
257 b 1b
[b66cc97]258FUNCTION_END(memcpy_from_uspace)
259FUNCTION_END(memcpy_to_uspace)
[e3c762cd]260
[b66cc97]261SYMBOL(memcpy_from_uspace_failover_address)
262SYMBOL(memcpy_to_uspace_failover_address)
[eedf4c5]263 /* Return zero, failure */
[ac0e791]264 xor r3, r3, r3
265 blr
[da52547]266
[28a5ebd]267FUNCTION_BEGIN(early_putuchar)
[da52547]268 blr
[28a5ebd]269FUNCTION_END(early_putuchar)
Note: See TracBrowser for help on using the repository browser.