]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/powerpc/aim/locore32.S
Merge bmake 20151020
[FreeBSD/FreeBSD.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 /* Locate the per-CPU data structure */
70 #define GET_CPUINFO(r)  \
71         mfsprg0  r
72
73 /*
74  * Compiled KERNBASE location and the kernel load address
75  */
76         .globl  kernbase
77         .set    kernbase, KERNBASE
78
79 /*
80  * Globals
81  */
82         .data
83         .align 3
84 GLOBAL(__startkernel)
85         .long   begin
86 GLOBAL(__endkernel)
87         .long   end
88         .align  4
89 #define TMPSTKSZ        8192            /* 8K temporary stack */
90 GLOBAL(tmpstk)
91         .space  TMPSTKSZ
92
93         .text
94         .globl  btext
95 btext:
96
97 /*
98  * This symbol is here for the benefit of kvm_mkdb, and is supposed to
99  * mark the start of kernel text.
100  */
101         .globl  kernel_text
102 kernel_text:
103
104 /*
105  * Startup entry.  Note, this must be the first thing in the text
106  * segment!
107  */
108         .text
109         .globl  __start
110 __start:
111         /* Figure out where we are */
112         bl      1f
113         .long   _DYNAMIC-.
114         .long   _GLOBAL_OFFSET_TABLE_-.
115         .long   tmpstk-.
116 1:      mflr    %r30
117
118         /* Set up temporary stack pointer */
119         lwz     %r1,8(%r30)
120         add     %r1,%r1,%r30
121         addi    %r1,%r1,(8+TMPSTKSZ-32)
122
123         /* Relocate self */
124         stw     %r3,16(%r1)
125         stw     %r4,20(%r1)
126         stw     %r5,24(%r1)
127         stw     %r6,28(%r1)
128
129         lwz     %r3,0(%r30) /* _DYNAMIC in %r3 */
130         add     %r3,%r3,%r30
131         lwz     %r4,4(%r30) /* GOT pointer */
132         add     %r4,%r4,%r30
133         lwz     %r4,4(%r4)  /* got[0] is _DYNAMIC link addr */
134         subf    %r4,%r4,%r3 /* subtract to calculate relocbase */
135         bl      elf_reloc_self
136         
137         lwz     %r3,16(%r1)
138         lwz     %r4,20(%r1)
139         lwz     %r5,24(%r1)
140         lwz     %r6,28(%r1)
141
142         /* MD setup */
143         bl      powerpc_init
144
145         /* Set stack pointer to new value and branch to mi_startup */
146         mr      %r1, %r3
147         li      %r3, 0
148         stw     %r3, 0(%r1)
149         bl      mi_startup
150
151         /* If mi_startup somehow returns, exit. This would be bad. */
152         b       OF_exit
153
154 /*
155  * int setfault()
156  *
157  * Similar to setjmp to setup for handling faults on accesses to user memory.
158  * Any routine using this may only call bcopy, either the form below,
159  * or the (currently used) C code optimized, so it doesn't use any non-volatile
160  * registers.
161  */
162         .globl  setfault
163 setfault:
164         mflr    0
165         mfcr    12
166         mfsprg  4,0
167         lwz     4,TD_PCB(2)     /* curthread = r2 */
168         stw     3,PCB_ONFAULT(4)
169         stw     0,0(3)
170         stw     1,4(3)
171         stw     2,8(3)
172         stmw    12,12(3)
173         xor     3,3,3
174         blr
175
176 #include <powerpc/aim/trap_subr32.S>