1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2013 (c) Joyent, Inc. All rights reserved.
14 * Copyright 2015 (c) Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
15 */
16
17 /*
18 * Every story needs a beginning, this is the loader's.
19 */
20
21 #include <sys/asm_linkage.h>
22
23 /*
24 * We put _start into the .text.init section so we can more easily shove it
25 * at the front of the .text.
26 */
27 .section .text.init
28 .align 4
29 .globl _start
30 .type _start, %function
31 _start:
32 mov sp, #0x8000
33 /*
34 * XXX manually fix up the tag start
35 */
36 mov r2, #0x100
37 bl fakeload_init
38 SET_SIZE(_start)
39
40 #if defined(__lint)
41
42 /* ARGSUSED */
43 void
44 fakeload_unaligned_enable(void)
45 {}
46
47 #else /* __lint */
48
49 /*
50 * Fix up alignment by turning off A and by turning on U.
51 */
52 ENTRY(fakeload_unaligned_enable)
53 mrc p15, 0, r0, c1, c0, 0
54 orr r0, #0x400000 /* U = 1 */
55 bic r0, r0, #2 /* A = 0 */
56 mcr p15, 0, r0, c1, c0, 0
57 bx lr
58 SET_SIZE(fakeload_unaligned_enable);
59
60 #endif /* __lint */
61
62 #if defined(__lint)
63
64 fakeload_pt_setup(uintptr_t ptroot)
65 {}
66
67 #else /* __lint */
68
69 /*
70 * We need to set up the world for the first time. We'll do the
71 * following in order:
72 *
73 * o Set the TTBCR to always use TTBR0
74 * o Set domain 0 to manager mode
75 * o Program the Page table root
76 */
77 ENTRY(fakeload_pt_setup)
78 mov r1, #0
79 mcr p15, 0, r1, c2, c0, 2
80 mov r1, #3
81 mcr p15, 0, r1, c3, c0, 0
82 orr r0, r0, #0x1b
83 mcr p15, 0, r0, c2, c0, 0
84 bx lr
85 SET_SIZE(fakeload_pt_setup)
86
87 #endif /* __lint */
88
89 #if defined(__lint)
90
91 /* ARGSUSED */
92 void
93 fakeload_mmu_enable(void)
94 {}
95
96 #else /* __lint */
97
98 /*
99 * We first make sure that the ARMv6 pages are enabled (bit 23) and then
100 * enable the MMU (bit 0).
101 */
102 ENTRY(fakeload_mmu_enable)
103 mrc p15, 0, r0, c1, c0, 0
104 orr r0, #0x800000 /* enable ARMv6 pages */
105 orr r0, #0x1 /* enable MMU */
106 mcr p15, 0, r0, c1, c0, 0
107 bx lr
108 SET_SIZE(fakeload_mmu_enable)
109 #endif /* __lint */
110
111
112 ENTRY(fakeload_exec)
113 blx r3
114 /* We should never execute this. If we do we'll go back to a panic */
115 bx lr
116 SET_SIZE(fakeload_exec)