]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/powerpc/aim/locore64.S
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / powerpc / aim / locore64.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
68 #include "opt_kdtrace.h"
69
70 /* Locate the per-CPU data structure */
71 #define GET_CPUINFO(r)  \
72         mfsprg0  r
73
74 /*
75  * Compiled KERNBASE location and the kernel load address
76  */
77         .globl  kernbase
78         .set    kernbase, KERNBASE
79
80 #define TMPSTKSZ        16384           /* 16K temporary stack */
81
82 /*
83  * Globals
84  */
85         .data
86         .align  4
87 GLOBAL(tmpstk)
88         .space  TMPSTKSZ
89 GLOBAL(esym)
90         .llong  0                       /* end of symbol table */
91
92 #define INTRCNT_COUNT   256             /* max(HROWPIC_IRQMAX,OPENPIC_IRQMAX) */
93 GLOBAL(intrnames)
94         .space  INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
95 GLOBAL(sintrnames)
96         .quad   INTRCNT_COUNT * (MAXCOMLEN + 1) * 2
97
98         .align 4
99 GLOBAL(intrcnt)
100         .space  INTRCNT_COUNT * 4 * 2
101 GLOBAL(sintrcnt)
102         .quad   INTRCNT_COUNT * 4 * 2
103
104         .text
105         .globl  btext
106 btext:
107
108 /*
109  * This symbol is here for the benefit of kvm_mkdb, and is supposed to
110  * mark the start of kernel text.
111  */
112         .globl  kernel_text
113 kernel_text:
114
115 /*
116  * Startup entry.  Note, this must be the first thing in the text
117  * segment!
118  */
119         .text
120 ASENTRY_NOPROF(__start)
121         li      8,0
122         li      9,0x100
123         mtctr   9
124 1:
125         dcbf    0,8
126         icbi    0,8
127         addi    8,8,0x20
128         bdnz    1b
129         sync
130         isync
131
132         /* Save the argument pointer and length */
133         mr      20,6
134         mr      21,7
135
136         lis     8,openfirmware_entry@ha
137         std     5,openfirmware_entry@l(8) /* save client interface handler */
138
139         /* Set up the stack pointer */
140         lis     1,(tmpstk+TMPSTKSZ-48)@ha
141         addi    1,1,(tmpstk+TMPSTKSZ-48)@l
142
143         /* Set up the TOC pointer */
144         lis     2,tocbase@ha
145         ld      2,tocbase@l(2)
146
147         mfmsr   0
148         lis     9,ofmsr@ha
149         stdu    0,ofmsr@l(9)
150
151         mfsprg0 0                       /* save SPRG0-3 */
152         std     0,8(9)                  /* ofmsr[1] = sprg0 */
153         mfsprg1 0
154         std     0,16(9)                 /* ofmsr[2] = sprg1 */
155         mfsprg2 0
156         std     0,24(9)                 /* ofmsr[3] = sprg2 */
157         mfsprg3 0
158         std     0,32(9)                 /* ofmsr[4] = sprg3 */
159
160         /* Switch to 64-bit mode */
161         mfmsr   9
162         li      8,1
163         insrdi  9,8,1,0
164         mtmsrd  9
165         
166         bl      OF_initial_setup
167         nop
168
169         lis     3,kernbase@ha
170         addi    3,3,kernbase@l
171
172         lis     4,end@ha
173         addi    4,4,end@l
174         add     4,4,3
175         mr      5,4
176
177         /* Restore the argument pointer and length */
178         mr      6,20
179         mr      7,21
180
181         bl      powerpc_init
182         nop
183         mr      %r1, %r3
184         li      %r3, 0
185         std     %r3, 0(%r1)
186         bl      mi_startup
187         nop
188         b       OF_exit
189         nop
190
191 /*
192  * PPC64 ABI TOC base
193  */
194
195         .align  3
196         .globl  tocbase
197 tocbase:
198         .llong  .TOC.@tocbase
199
200 /*
201  * int setfault()
202  *
203  * Similar to setjmp to setup for handling faults on accesses to user memory.
204  * Any routine using this may only call bcopy, either the form below,
205  * or the (currently used) C code optimized, so it doesn't use any non-volatile
206  * registers.
207  */
208 ASENTRY_NOPROF(setfault)
209         mflr    0
210         mfcr    12
211         mfsprg  4,0
212         ld      4,TD_PCB(13)    /* curthread = r13 */
213         std     3,PCB_ONFAULT(4)
214         std     0,0(3)
215         std     1,8(3)
216         std     2,16(3)
217
218         std     %r12,24(%r3)    /* Save the non-volatile GP regs. */
219         std     %r13,24+1*8(%r3)        
220         std     %r14,24+2*8(%r3)        
221         std     %r15,24+3*8(%r3)        
222         std     %r16,24+4*8(%r3)        
223         std     %r17,24+5*8(%r3)        
224         std     %r18,24+6*8(%r3)        
225         std     %r19,24+7*8(%r3)        
226         std     %r20,24+8*8(%r3)        
227         std     %r21,24+9*8(%r3)        
228         std     %r22,24+10*8(%r3)       
229         std     %r23,24+11*8(%r3)       
230         std     %r24,24+12*8(%r3)       
231         std     %r25,24+13*8(%r3)       
232         std     %r26,24+14*8(%r3)       
233         std     %r27,24+15*8(%r3)       
234         std     %r28,24+16*8(%r3)
235         std     %r29,24+17*8(%r3)       
236         std     %r30,24+18*8(%r3)       
237         std     %r31,24+19*8(%r3)       
238
239         xor     3,3,3
240         blr
241
242 #include <powerpc/aim/trap_subr64.S>