]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/powerpc/aim/locore64.S
Merge llvm trunk r238337 from ^/vendor/llvm/dist, resolve conflicts, and
[FreeBSD/FreeBSD.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 /* Locate the per-CPU data structure */
69 #define GET_CPUINFO(r)  \
70         mfsprg0  r
71 #define GET_TOCBASE(r)  \
72         li      r,TRAP_TOCBASE; /* Magic address for TOC */ \
73         ld      r,0(r)
74
75 /* Glue for linker script */
76 .globl  kernbase
77 .set    kernbase, KERNBASE
78
79 /*
80  * Globals
81  */
82         .data
83         .align 3
84 GLOBAL(__startkernel)
85         .llong  begin
86 GLOBAL(__endkernel)
87         .llong  end
88
89         .align  4
90 #define TMPSTKSZ        16384           /* 16K temporary stack */
91 GLOBAL(tmpstk)
92         .space  TMPSTKSZ
93
94 TOC_ENTRY(tmpstk)
95
96         .text
97         .globl  btext
98 btext:
99
100 /*
101  * This symbol is here for the benefit of kvm_mkdb, and is supposed to
102  * mark the start of kernel text.
103  */
104         .globl  kernel_text
105 kernel_text:
106
107 /*
108  * Startup entry.  Note, this must be the first thing in the text
109  * segment!
110  *
111  * Calling convention:
112  * r3: Flattened Device Tree pointer (or zero)
113  * r4: ignored
114  * r5: OF client interface pointer (or zero)
115  * r6: Loader metadata pointer (or zero)
116  */
117         .text
118 ASENTRY_NOPROF(__start)
119         /* Set up the TOC pointer */
120         b       0f
121         .align 3
122 0:      nop
123         bl      1f
124         .llong  __tocbase + 0x8000 - .
125 1:      mflr    %r2
126         ld      %r1,0(%r2)
127         add     %r2,%r1,%r2
128
129         /* Get load offset */
130         ld      %r31,-0x8000(%r2) /* First TOC entry is TOC base */
131         subf    %r31,%r31,%r2   /* Subtract from real TOC base to get base */
132
133         /* Set up the stack pointer */
134         ld      %r1,TOC_REF(tmpstk)(%r2)
135         addi    %r1,%r1,TMPSTKSZ-96
136         add     %r1,%r1,%r31
137
138         /* Relocate kernel */
139         std     %r3,48(%r1)
140         std     %r4,56(%r1)
141         std     %r5,64(%r1)
142         std     %r6,72(%r1)
143         bl      1f
144         .llong _DYNAMIC-.
145 1:      mflr    %r3
146         ld      %r4,0(%r3)
147         add     %r3,%r4,%r3
148         mr      %r4,%r31
149         bl      elf_reloc_self
150         nop
151         ld      %r3,48(%r1)
152         ld      %r4,56(%r1)
153         ld      %r5,64(%r1)
154         ld      %r6,72(%r1)
155
156         /* Switch to 64-bit mode */
157         mfmsr   %r9
158         li      %r8,1
159         insrdi  %r9,%r8,1,0
160         mtmsrd  %r9
161         isync
162         
163         /* Begin CPU init */
164         mr      %r4,%r2 /* Replace ignored r4 with tocbase for trap handlers */
165         bl      powerpc_init
166         nop
167
168         /* Set stack pointer to new value and branch to mi_startup */
169         mr      %r1, %r3
170         li      %r3, 0
171         std     %r3, 0(%r1)
172         bl      mi_startup
173         nop
174
175         /* If this returns (it won't), go back to firmware */
176         b       OF_exit
177         nop
178
179 /*
180  * int setfault()
181  *
182  * Similar to setjmp to setup for handling faults on accesses to user memory.
183  * Any routine using this may only call bcopy, either the form below,
184  * or the (currently used) C code optimized, so it doesn't use any non-volatile
185  * registers.
186  */
187 ASENTRY_NOPROF(setfault)
188         mflr    0
189         mfcr    12
190         mfsprg  4,0
191         ld      4,TD_PCB(13)    /* curthread = r13 */
192         std     3,PCB_ONFAULT(4)
193         std     0,0(3)
194         std     1,8(3)
195         std     2,16(3)
196
197         std     %r12,24(%r3)    /* Save the non-volatile GP regs. */
198         std     %r13,24+1*8(%r3)        
199         std     %r14,24+2*8(%r3)        
200         std     %r15,24+3*8(%r3)        
201         std     %r16,24+4*8(%r3)        
202         std     %r17,24+5*8(%r3)        
203         std     %r18,24+6*8(%r3)        
204         std     %r19,24+7*8(%r3)        
205         std     %r20,24+8*8(%r3)        
206         std     %r21,24+9*8(%r3)        
207         std     %r22,24+10*8(%r3)       
208         std     %r23,24+11*8(%r3)       
209         std     %r24,24+12*8(%r3)       
210         std     %r25,24+13*8(%r3)       
211         std     %r26,24+14*8(%r3)       
212         std     %r27,24+15*8(%r3)       
213         std     %r28,24+16*8(%r3)
214         std     %r29,24+17*8(%r3)       
215         std     %r30,24+18*8(%r3)       
216         std     %r31,24+19*8(%r3)       
217
218         xor     3,3,3
219         blr
220
221 #include <powerpc/aim/trap_subr64.S>