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 55 mcr p15, 0, r0, c1, c0, 0 56 bx lr 57 SET_SIZE(fakeload_unaligned_enable); 58 59 #endif /* __lint */ 60 61 #if defined(__lint) 62 63 fakeload_pt_setup(uintptr_t ptroot) 64 {} 65 66 #else /* __lint */ 67 68 /* 69 * We need to set up the world for the first time. We'll do the 70 * following in order: 71 * 72 * o Set the TTBCR to always use TTBR0 73 * o Set domain 0 to manager mode 74 * o Program the Page table root 75 */ 76 ENTRY(fakeload_pt_setup) 77 mov r1, #0 78 mcr p15, 0, r1, c2, c0, 2 79 mov r1, #3 80 mcr p15, 0, r1, c3, c0, 0 81 orr r0, r0, #0x1b 82 mcr p15, 0, r0, c2, c0, 0 83 bx lr 84 SET_SIZE(fakeload_pt_setup) 85 86 #endif /* __lint */ 87 88 #if defined(__lint) 89 90 /* ARGSUSED */ 91 void 92 fakeload_mmu_enable(void) 93 {} 94 95 #else /* __lint */ 96 97 /* 98 * We first make sure that the ARMv6 pages are enabled (bit 23) and then 99 * enable the MMU (bit 0). 100 */ 101 ENTRY(fakeload_mmu_enable) 102 mrc p15, 0, r0, c1, c0, 0 103 orr r0, #0x800000 104 mcr p15, 0, r0, c1, c0, 0 105 mrc p15, 0, r0, c1, c0, 0 106 orr r0, #0x1 107 mcr p15, 0, r0, c1, c0, 0 108 bx lr 109 SET_SIZE(fakeload_mmu_enable) 110 #endif /* __lint */ 111 112 113 ENTRY(fakeload_exec) 114 blx r3 115 /* We should never execute this. If we do we'll go back to a panic */ 116 bx lr 117 SET_SIZE(fakeload_exec)