source: mainline/boot/arch/sparc64/loader/asm.S@ da349da0

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

memcpy(), memmove() and similar functions return dst instead of src.
Fix all implementations, including those in assembly. ppc32 assembly
version didn't seem to be affected by this.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1#
2# Copyright (c) 2006 Martin Decky
3# Copyright (c) 2006 Jakub Jermar
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# - Redistributions of source code must retain the above copyright
11# notice, this list of conditions and the following disclaimer.
12# - Redistributions in binary form must reproduce the above copyright
13# notice, this list of conditions and the following disclaimer in the
14# documentation and/or other materials provided with the distribution.
15# - The name of the author may not be used to endorse or promote products
16# derived from this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28#
29
30#include <stack.h>
31#include <register.h>
32
33.register %g2, #scratch
34.register %g3, #scratch
35
36.text
37
38.global halt
39.global memcpy
40.global jump_to_kernel
41
42halt:
43 b halt
44 nop
45
46memcpy:
47 mov %o0, %o3 ! save dst
48 add %o1, 7, %g1
49 and %g1, -8, %g1
50 cmp %o1, %g1
51 be,pn %xcc, 3f
52 add %o0, 7, %g1
53 mov 0, %g3
540:
55 brz,pn %o2, 2f
56 mov 0, %g2
571:
58 ldub [%g3 + %o1], %g1
59 add %g2, 1, %g2
60 cmp %o2, %g2
61 stb %g1, [%g3 + %o0]
62 bne,pt %xcc, 1b
63 mov %g2, %g3
642:
65 jmp %o7 + 8 ! exit point
66 mov %o3, %o0
673:
68 and %g1, -8, %g1
69 cmp %o0, %g1
70 bne,pt %xcc, 0b
71 mov 0, %g3
72 srlx %o2, 3, %g4
73 brz,pn %g4, 5f
74 mov 0, %g5
754:
76 sllx %g3, 3, %g2
77 add %g5, 1, %g3
78 ldx [%o1 + %g2], %g1
79 mov %g3, %g5
80 cmp %g4, %g3
81 bne,pt %xcc, 4b
82 stx %g1, [%o0 + %g2]
835:
84 and %o2, 7, %o2
85 brz,pn %o2, 2b
86 sllx %g4, 3, %g1
87 mov 0, %g2
88 add %g1, %o0, %o0
89 add %g1, %o1, %g4
90 mov 0, %g3
916:
92 ldub [%g2 + %g4], %g1
93 stb %g1, [%g2 + %o0]
94 add %g3, 1, %g2
95 cmp %o2, %g2
96 bne,pt %xcc, 6b
97 mov %g2, %g3
98
99 jmp %o7 + 8 ! exit point
100 mov %o3, %o0
101
102jump_to_kernel:
103 /*
104 * We have copied code and now we need to guarantee cache coherence.
105 * 1. Make sure that the code we have moved has drained to main memory.
106 * 2. Invalidate I-cache.
107 * 3. Flush instruction pipeline.
108 */
109 call icache_flush
110 membar #StoreStore
111 flush %i7
112
113 mov %o0, %l1
114 mov %o1, %o0
115 mov %o2, %o1
116 mov %o3, %o2
117 jmp %l1 ! jump to kernel
118 nop
119
120#define ICACHE_SIZE 8192
121#define ICACHE_LINE_SIZE 32
122#define ICACHE_SET_BIT (1 << 13)
123#define ASI_ICACHE_TAG 0x67
124
125# Flush I-cache
126icache_flush:
127 set ((ICACHE_SIZE - ICACHE_LINE_SIZE) | ICACHE_SET_BIT), %g1
128 stxa %g0, [%g1] ASI_ICACHE_TAG
1290: membar #Sync
130 subcc %g1, ICACHE_LINE_SIZE, %g1
131 bnz,pt %xcc, 0b
132 stxa %g0, [%g1] ASI_ICACHE_TAG
133 membar #Sync
134 retl
135 ! SF Erratum #51
136 nop
137
138.global ofw
139ofw:
140 save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp
141 set ofw_cif, %l0
142 ldx [%l0], %l0
143
144 rdpr %pstate, %l1
145 and %l1, ~PSTATE_AM_BIT, %l2
146 wrpr %l2, 0, %pstate
147
148 jmpl %l0, %o7
149 mov %i0, %o0
150
151 wrpr %l1, 0, %pstate
152
153 ret
154 restore %o0, 0, %o0
Note: See TracBrowser for help on using the repository browser.