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)