Cleanup OpenFirmware driver and prepare it for integration with sparc64 bootloader.
[helenos.git] / arch / ppc64 / loader / asm.S
blob679a924d8ff1945f12ce392ee5e1715c1c54e813
2 # Copyright (C) 2006 Martin Decky
3 # All rights reserved.
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
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.
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.
29 #include "asm.h"
30 #include "regname.h"
32 .text
34 .global halt
35 .global memcpy
36 .global jump_to_kernel
38 halt:
39         b halt
41 memcpy:
42         srwi. r7, r5, 3
43         addi r6, r3, -4
44         addi r4, r4, -4
45         beq     2f
46         
47         andi. r0, r6, 3
48         mtctr r7
49         bne 5f
50         
51         1:
52         
53         lwz r7, 4(r4)
54         lwzu r8, 8(r4)
55         stw r7, 4(r6)
56         stwu r8, 8(r6)
57         bdnz 1b
58         
59         andi. r5, r5, 7
60         
61         2:
62         
63         cmplwi 0, r5, 4
64         blt 3f
65         
66         lwzu r0, 4(r4)
67         addi r5, r5, -4
68         stwu r0, 4(r6)
69         
70         3:
71         
72         cmpwi 0, r5, 0
73         beqlr
74         mtctr r5
75         addi r4, r4, 3
76         addi r6, r6, 3
77         
78         4:
79         
80         lbzu r0, 1(r4)
81         stbu r0, 1(r6)
82         bdnz 4b
83         blr
84         
85         5:
86         
87         subfic r0, r0, 4
88         mtctr r0
89         
90         6:
91         
92         lbz r7, 4(r4)
93         addi r4, r4, 1
94         stb r7, 4(r6)
95         addi r6, r6, 1
96         bdnz 6b
97         subf r5, r0, r5
98         rlwinm. r7, r5, 32-3, 3, 31
99         beq 2b
100         mtctr r7
101         b 1b
104 jump_to_kernel:
105         
106         # r3 = bootinfo (pa)
107         # r4 = bootinfo_size
108         # r5 = trans (pa)
109         # r6 = bytes to copy
110         # r7 = real_mode (pa)
111         
112         # disable interrupts
113         
114         mfmsr r31
115         rlwinm r31, r31, 0, 17, 15
116         mtmsr r31
117         
118         # set real_mode meeting point address
119         
120         mtspr srr0, r7
121         
122         # jumps to real_mode
123         
124         mfmsr r31
125         lis r30, ~0@h
126         ori r30, r30, ~(msr_ir | msr_dr)@l
127         and r31, r31, r30
128         mtspr srr1, r31
129         
130         sync
131         isync
132         rfid
134 .section REALMODE, "ax"
135 .align PAGE_WIDTH
136 .global real_mode
138 real_mode:
139         
140         # copy kernel to proper location
141         #
142         # r5 = trans (pa)
143         # r6 = bytes to copy
144         
145         li r31, PAGE_SIZE >> 2
146         li r30, 0
147         
148         page_copy:
149                 
150                 cmpwi r6, 0
151                 beq copy_end
152                 
153                 # copy page
154                 
155                 mtctr r31
156                 lwz r29, 0(r5)
157                 
158                 copy_loop:
159                         
160                         lwz r28, 0(r29)
161                         stw r28, 0(r30)
162                         
163                         addi r29, r29, 4
164                         addi r30, r30, 4
165                         subi r6, r6, 4
166                         
167                         cmpwi r6, 0
168                         beq copy_end
169                         
170                         bdnz copy_loop
171                 
172                 addi r5, r5, 4
173                 b page_copy
174         
175         copy_end:
176         
177         # initially fill segment registers
179         li r31, 16
180         mtctr r31
181         li r31, 0
182         li r30, 0x2000
184         seg_fill:
185         
186                 mtsrin r30, r31
187                 addi r30, r30, 0x111
188                 addis r31, r31, 0x1000    # move to next SR
189                 
190                 bdnz seg_fill
191         
192         tlbia
193         tlbsync
194         
195         # start the kernel
196         #
197         # r3 = bootinfo (pa)
198         
199         lis r31, KERNEL_START_ADDR@ha
200         addi r31, r31, KERNEL_START_ADDR@l
201         
202         mtspr srr0, r31
203         
204         mfmsr r31
205         ori r31, r31, (msr_ir | msr_dr)@l
206         mtspr srr1, r31
207         
208         sync
209         isync
210         rfid
212 .align PAGE_WIDTH
213 .global trans
214 trans:
215         .space (TRANS_SIZE * TRANS_ITEM_SIZE)