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

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

Replace non-canonical B instructions with BA %xcc.
Fix one occurrence of deprecated Bicc instruction.

  • Property mode set to 100644
File size: 3.8 KB
RevLine 
[b7b5f83]1#
[df4ed85]2# Copyright (c) 2006 Martin Decky
3# Copyright (c) 2006 Jakub Jermar
[b7b5f83]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
[a5f76758]30#include <stack.h>
31#include <register.h>
[2e672fd]32
[da349da0]33.register %g2, #scratch
34.register %g3, #scratch
35
[b7b5f83]36.text
37
38.global halt
39.global memcpy
40.global jump_to_kernel
41
42halt:
[a1a83e5e]43 ba %xcc, halt
[b7b5f83]44 nop
45
46memcpy:
[da349da0]47 mov %o0, %o3 ! save dst
[c82950a]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
[da349da0]66 mov %o3, %o0
[c82950a]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
[da349da0]100 mov %o3, %o0
[b7b5f83]101
102jump_to_kernel:
[0af4f9e]103 /*
[1eb154f]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.
[965dc18]108 */
109
110 /*
111 * US3 processors have a write-invalidate cache, so explicitly
112 * invalidating it is not required. Whether to invalidate I-cache
113 * or not is decided according to the value of the global
114 * "subarchitecture" variable (set in the bootstrap).
115 */
116 set subarchitecture, %g2
117 ldub [%g2], %g2
118 cmp %g2, 3
[a1a83e5e]119 be %xcc, 1f
[965dc18]120 nop
1210:
122 call icache_flush
123 nop
1241:
125 membar #StoreStore
126
127 /*
128 * Flush the instruction pipeline.
129 */
[1eb154f]130 flush %i7
[0af4f9e]131
[94d614e]132 mov %o0, %l1
133 mov %o1, %o0
134 mov %o2, %o1
[45b26dad]135 mov %o3, %o2
[94d614e]136 jmp %l1 ! jump to kernel
137 nop
[2e672fd]138
[1eb154f]139#define ICACHE_SIZE 8192
140#define ICACHE_LINE_SIZE 32
141#define ICACHE_SET_BIT (1 << 13)
142#define ASI_ICACHE_TAG 0x67
143
144# Flush I-cache
145icache_flush:
146 set ((ICACHE_SIZE - ICACHE_LINE_SIZE) | ICACHE_SET_BIT), %g1
147 stxa %g0, [%g1] ASI_ICACHE_TAG
1480: membar #Sync
149 subcc %g1, ICACHE_LINE_SIZE, %g1
150 bnz,pt %xcc, 0b
151 stxa %g0, [%g1] ASI_ICACHE_TAG
152 membar #Sync
153 retl
154 ! SF Erratum #51
155 nop
[2e672fd]156.global ofw
157ofw:
158 save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp
159 set ofw_cif, %l0
160 ldx [%l0], %l0
161
162 rdpr %pstate, %l1
163 and %l1, ~PSTATE_AM_BIT, %l2
164 wrpr %l2, 0, %pstate
165
166 jmpl %l0, %o7
167 mov %i0, %o0
168
169 wrpr %l1, 0, %pstate
170
171 ret
172 restore %o0, 0, %o0
Note: See TracBrowser for help on using the repository browser.