]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/powerpc/aim/locore32.S
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / powerpc / aim / locore32.S
1 /* $FreeBSD$ */
2 /* $NetBSD: locore.S,v 1.24 2000/05/31 05:09:17 thorpej Exp $ */
3
4 /*-
5  * Copyright (C) 2001 Benno Rice
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY Benno Rice ``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 TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 /*-
29  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
30  * Copyright (C) 1995, 1996 TooLs GmbH.
31  * All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
36  * 1. Redistributions of source code must retain the above copyright
37  *    notice, this list of conditions and the following disclaimer.
38  * 2. Redistributions in binary form must reproduce the above copyright
39  *    notice, this list of conditions and the following disclaimer in the
40  *    documentation and/or other materials provided with the distribution.
41  * 3. All advertising materials mentioning features or use of this software
42  *    must display the following acknowledgement:
43  *      This product includes software developed by TooLs GmbH.
44  * 4. The name of TooLs GmbH may not be used to endorse or promote products
45  *    derived from this software without specific prior written permission.
46  *
47  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
48  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
50  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
51  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
52  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
53  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
54  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
55  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
56  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57  */
58
59 #include "assym.s"
60
61 #include <sys/syscall.h>
62
63 #include <machine/trap.h>
64 #include <machine/param.h>
65 #include <machine/spr.h>
66 #include <machine/asm.h>
67 #include "opt_platform.h"
68
69 #include "opt_kdtrace.h"
70
71 /* Locate the per-CPU data structure */
72 #define GET_CPUINFO(r)  \
73         mfsprg0  r
74
75 /*
76  * Compiled KERNBASE location and the kernel load address
77  */
78         .globl  kernbase
79         .set    kernbase, KERNBASE
80
81 #define TMPSTKSZ        8192            /* 8K temporary stack */
82
83 /*
84  * Globals
85  */
86         .data
87         .align  4
88 GLOBAL(tmpstk)
89         .space  TMPSTKSZ
90 GLOBAL(esym)
91         .long   0                       /* end of symbol table */
92
93 #define INTRCNT_COUNT   256             /* max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */
94 GLOBAL(intrnames)
95         .space  INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
96 GLOBAL(sintrnames)
97         .long   INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
98
99         .align 4
100 GLOBAL(intrcnt)
101         .space  INTRCNT_COUNT * 4 * 2
102 GLOBAL(sintrcnt)
103         .long   INTRCNT_COUNT * 4 * 2
104
105         .text
106         .globl  btext
107 btext:
108
109 /*
110  * This symbol is here for the benefit of kvm_mkdb, and is supposed to
111  * mark the start of kernel text.
112  */
113         .globl  kernel_text
114 kernel_text:
115
116 /*
117  * Startup entry.  Note, this must be the first thing in the text
118  * segment!
119  */
120         .text
121         .globl  __start
122 __start:
123         li      8,0
124         li      9,0x100
125         mtctr   9
126 1:
127         dcbf    0,8
128         icbi    0,8
129         addi    8,8,0x20
130         bdnz    1b
131         sync
132         isync
133 #ifdef WII
134 #include <powerpc/wii/locore.S>
135 #endif
136         /* Zero bss, in case we were started by something unhelpful */
137         li      0,0
138         lis     8,_edata@ha
139         addi    8,8,_edata@l
140         lis     9,_end@ha
141         addi    9,9,_end@l
142 2:      stw     0,0(8)
143         addi    8,8,4
144         cmplw   8,9
145         blt     2b
146         
147         /* Save the argument pointer and length */
148         mr      20,6
149         mr      21,7
150
151         lis     8,openfirmware_entry@ha
152         stw     5,openfirmware_entry@l(8) /* save client interface handler */
153
154         lis     1,(tmpstk+TMPSTKSZ-16)@ha
155         addi    1,1,(tmpstk+TMPSTKSZ-16)@l
156
157         mfmsr   0
158         lis     9,ofmsr@ha
159         stwu    0,ofmsr@l(9)
160
161         mfsprg0 0                       /* save SPRG0-3 */
162         stw     0,4(9)                  /* ofmsr[1] = sprg0 */
163         mfsprg1 0
164         stw     0,8(9)                  /* ofmsr[2] = sprg1 */
165         mfsprg2 0
166         stw     0,12(9)                 /* ofmsr[3] = sprg2 */
167         mfsprg3 0
168         stw     0,16(9)                 /* ofmsr[4] = sprg3 */
169         
170         bl      OF_initial_setup
171
172         lis     3,kernel_text@ha
173         addi    3,3,kernel_text@l
174
175         lis     4,end@ha
176         addi    4,4,end@l
177         add     4,4,3
178         mr      5,4
179
180         /* Restore the argument pointer and length */
181         mr      6,20
182         mr      7,21
183
184         bl      powerpc_init
185         mr      %r1, %r3
186         li      %r3, 0
187         stw     %r3, 0(%r1)
188         bl      mi_startup
189         b       OF_exit
190
191 /*
192  * int setfault()
193  *
194  * Similar to setjmp to setup for handling faults on accesses to user memory.
195  * Any routine using this may only call bcopy, either the form below,
196  * or the (currently used) C code optimized, so it doesn't use any non-volatile
197  * registers.
198  */
199         .globl  setfault
200 setfault:
201         mflr    0
202         mfcr    12
203         mfsprg  4,0
204         lwz     4,TD_PCB(2)     /* curthread = r2 */
205         stw     3,PCB_ONFAULT(4)
206         stw     0,0(3)
207         stw     1,4(3)
208         stw     2,8(3)
209         stmw    12,12(3)
210         xor     3,3,3
211         blr
212
213 #include <powerpc/aim/trap_subr32.S>