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