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
 105         mcr     p15, 0, r0, c1, c0, 0
 106         mrc     p15, 0, r0, c1, c0, 0
 107         orr     r0, #0x1
 108         mcr     p15, 0, r0, c1, c0, 0
 109         bx      lr
 110         SET_SIZE(fakeload_mmu_enable)
 111 #endif  /* __lint */
 112 
 113 
 114         ENTRY(fakeload_exec)
 115         blx     r3
 116         /* We should never execute this. If we do we'll go back to a panic */
 117         bx      lr
 118         SET_SIZE(fakeload_exec)