Print this page
armv6: bcm2835 & qvpb have nearly identical locore _start
It makes sense to common-ize _start for all armv6 machines. They will all
have to do the same basic setup. If there is any machine specific setup
they need to do, they can do so in the new _mach_start function.
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/armv6/ml/glocore.s
+++ new/usr/src/uts/armv6/ml/glocore.s
1 1 /*
2 2 * This file and its contents are supplied under the terms of the
3 3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 4 * You may only use this file in accordance with the terms of version
5 5 * 1.0 of the CDDL.
6 6 *
7 7 * A full copy of the text of the CDDL should have accompanied this
8 8 * source. A copy of the CDDL is also available via the Internet at
9 9 * http://www.illumos.org/license/CDDL.
10 10 */
11 11
12 12 /*
↓ open down ↓ |
12 lines elided |
↑ open up ↑ |
13 13 * Copyright 2013 (c) Joyent, Inc. All rights reserved.
14 14 * Copyright (c) 2015 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
15 15 */
16 16
17 17 #include <sys/asm_linkage.h>
18 18 #include <sys/machparam.h>
19 19 #include <sys/cpu_asm.h>
20 20
21 21 #include "assym.h"
22 22
23 -#if defined(__lint)
24 -
25 -#endif
23 +/*
24 + * Every story needs a beginning. This is ours.
25 + */
26 26
27 27 /*
28 28 * Each of the different machines has its own locore.s to take care of getting
29 - * us into fakebop for the first time. After that, they all return here to a
30 - * generic locore to take us into mlsetup and then to main forever more.
29 + * the machine specific setup done. Just before jumping into fakebop the
30 + * first time, we call this machine specific code.
31 + */
32 +
33 +/*
34 + * We are in a primordial world here. The loader is going to come along and
35 + * boot us at _start. As we've started the world, we also need to set up a
36 + * few things about us, for example our stack pointer. To help us out, it's
37 + * useful to remember what the loader set up for us:
38 + *
39 + * - unaligned access are allowed (A = 0, U = 1)
40 + * - virtual memory is enabled
41 + * - we (unix) are mapped right were we want to be
42 + * - a UART has been enabled & any memory mapped registers have been 1:1
43 + * mapped
44 + * - ATAGs have been updated to tell us what the mappings are
45 + * - I/D L1 caches have been enabled
31 46 */
32 47
33 48 /*
34 49 * External globals
35 50 */
36 51 .globl _locore_start
37 52 .globl mlsetup
38 53 .globl sysp
39 54 .globl bootops
40 55 .globl bootopsp
41 56 .globl t0
42 57
43 58 .data
44 59 .comm t0stack, DEFAULTSTKSZ, 32
45 60 .comm t0, 4094, 32
46 61
62 +
63 +/*
64 + * Recall that _start is the traditional entry point for an ELF binary.
65 + */
66 + ENTRY(_start)
67 + ldr sp, =t0stack
68 + ldr r4, =DEFAULTSTKSZ
69 + add sp, r4
70 + bic sp, sp, #0xff
71 +
72 + /*
73 + * establish bogus stacks for exceptional CPU states, our exception
74 + * code should never make use of these, and we want loud and violent
75 + * failure should we accidentally try.
76 + */
77 + cps #(CPU_MODE_UND)
78 + mov sp, #-1
79 + cps #(CPU_MODE_ABT)
80 + mov sp, #-1
81 + cps #(CPU_MODE_FIQ)
82 + mov sp, #-1
83 + cps #(CPU_MODE_IRQ)
84 + mov sp, #-1
85 + cps #(CPU_MODE_SVC)
86 +
87 + /* Enable highvecs (moves the base of the exception vector) */
88 + mrc p15, 0, r3, c1, c0, 0
89 + mov r4, #1
90 + lsl r4, r4, #13
91 + orr r3, r3, r4
92 + mcr p15, 0, r3, c1, c0, 0
93 +
94 + /* invoke machine specific setup */
95 + bl _mach_start
96 +
97 + bl _fakebop_start
98 + SET_SIZE(_start)
99 +
100 +
47 101 #if defined(__lint)
48 102
49 103 /* ARGSUSED */
50 104 void
51 105 _locore_start(struct boot_syscalls *sysp, struct bootops *bop)
52 106 {}
53 107
54 108 #else /* __lint */
55 109
56 110 /*
57 111 * We got here from _kobj_init() via exitto(). We have a few different
58 112 * tasks that we need to take care of before we hop into mlsetup and
59 113 * then main. We're never going back so we shouldn't feel compelled to
60 114 * preserve any registers.
61 115 *
62 116 * o Enable our I/D-caches
63 117 * o Save the boot syscalls and bootops for later
64 118 * o Set up our stack to be the real stack of t0stack.
65 119 * o Save t0 as curthread
66 120 * o Set up a struct REGS for mlsetup
67 121 * o Make sure that we're 8 byte aligned for the call
68 122 */
69 123
70 124 ENTRY(_locore_start)
71 125
72 126
73 127 /*
74 128 * We've been running in t0stack anyway, up to this point, but
75 129 * _locore_start represents what is in effect a fresh start in the
76 130 * real kernel -- We'll never return back through here.
77 131 *
78 132 * So reclaim those few bytes
79 133 */
80 134 ldr sp, =t0stack
81 135 ldr r4, =(DEFAULTSTKSZ - REGSIZE)
82 136 add sp, r4
83 137 bic sp, sp, #0xff
84 138
85 139 /*
86 140 * Save flags and arguments for potential debugging
87 141 */
88 142 str r0, [sp, #REGOFF_R0]
89 143 str r1, [sp, #REGOFF_R1]
90 144 str r2, [sp, #REGOFF_R2]
91 145 str r3, [sp, #REGOFF_R3]
92 146 mrs r4, CPSR
93 147 str r4, [sp, #REGOFF_CPSR]
94 148
95 149 /*
96 150 * Save back the bootops and boot_syscalls.
97 151 */
98 152 ldr r2, =sysp
99 153 str r0, [r2]
100 154 ldr r2, =bootops
101 155 str r1, [r2]
102 156 ldr r2, =bootopsp
103 157 ldr r2, [r2]
104 158 str r1, [r2]
105 159
106 160 /*
107 161 * Set up our curthread pointer
108 162 */
109 163 ldr r0, =t0
110 164 mcr p15, 0, r0, c13, c0, 4
111 165
112 166 /*
113 167 * Go ahead now and enable the L1 I/D caches.
114 168 */
115 169 mrc p15, 0, r0, c1, c0, 0
116 170 orr r0, #0x04 /* D-cache */
117 171 orr r0, #0x1000 /* I-cache */
118 172 mcr p15, 0, r0, c1, c0, 0
119 173
120 174 /*
121 175 * mlsetup() takes the struct regs as an argument. main doesn't take
122 176 * any and should never return. Currently, we have an 8-byte aligned
123 177 * stack. We want to push a zero frame pointer to terminate any
124 178 * stack walking, but that would cause us to end up with only a
125 179 * 4-byte aligned stack. So, to keep things nice and correct, we
126 180 * push a zero value twice - it's similar to a typical function
127 181 * entry:
128 182 * push { r9, lr }
129 183 */
130 184 mov r9,#0
131 185 push { r9 } /* link register */
132 186 push { r9 } /* frame pointer */
133 187 mov r0, sp
134 188 bl mlsetup
↓ open down ↓ |
78 lines elided |
↑ open up ↑ |
135 189 bl main
136 190 /* NOTREACHED */
137 191 ldr r0,=__return_from_main
138 192 ldr r0,[r0]
139 193 bl panic
140 194 SET_SIZE(_locore_start)
141 195
142 196 __return_from_main:
143 197 .string "main() returned"
144 198 #endif /* __lint */
199 +
200 + ENTRY(arm_reg_read)
201 + ldr r0, [r0]
202 + bx lr
203 + SET_SIZE(arm_reg_read)
204 +
205 + ENTRY(arm_reg_write)
206 + str r1, [r0]
207 + bx lr
208 + SET_SIZE(arm_reg_write)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX