Advertisement
Guest User

Untitled

a guest
Feb 19th, 2015
531
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 4.90 KB | None | 0 0
  1. #include <arm_const.h>
  2.  
  3. #define CPUID_ARM_VIRT_SHIFT            12
  4. #define CPUID_ARM_VIRT_MASK             (0xF << CPUID_ARM_VIRT_SHIFT)
  5. #define CPUID_ARM_GENTIMER_SHIFT        16
  6. #define CPUID_ARM_GENTIMER_MASK         (0xF << CPUID_ARM_GENTIMER_SHIFT)
  7.  
  8. #define BCM2708_PERI_BASE 0x3f000000
  9.  
  10. .arch_extension sec
  11. .arch_extension virt
  12.  
  13. .section .init
  14. .globl _start
  15. /* the vector table for secure state and HYP mode */
  16. _start:
  17.         b jmp_loader    /* reset */
  18.         .word 0 /* undef */
  19.         adr pc, _secure_monitor
  20.         .word 0
  21.         .word 0
  22.         .word 0
  23.         .word 0
  24.         .word 0
  25.  
  26. /*
  27.  * secure monitor handler
  28.  * U-boot calls this "software interrupt" in start.S
  29.  * This is executed on a "smc" instruction, we use a "smc #0" to switch
  30.  * to non-secure state.
  31.  * We use only r0 and r1 here, due to constraints in the caller.
  32.  */
  33. _secure_monitor:
  34.         mrc     p15, 0, r1, c1, c1, 0           @ read SCR
  35.         bic     r1, r1, #0x4e                   @ clear IRQ, FIQ, EA, nET bits
  36.         orr     r1, r1, #0x31                   @ enable NS, AW, FW bits
  37.  
  38.         @mrc    p15, 0, r0, c0, c1, 1           @ read ID_PFR1
  39.         @and    r0, r0, #CPUID_ARM_VIRT_MASK    @ mask virtualization bits
  40.         @cmp    r0, #(1 << CPUID_ARM_VIRT_SHIFT)
  41.         orr     r1, r1, #0x100                  @ allow HVC instruction
  42.  
  43.         mcr     p15, 0, r1, c1, c1, 0           @ write SCR (with NS bit set)
  44.  
  45.         mrc     p15, 0, r0, c12, c0, 1          @ get MVBAR value
  46.         mcr     p15, 4, r0, c12, c0, 0          @ write HVBAR
  47.  
  48.         @ Reset CNTVOFF to 0 before leaving monitor mode
  49.         mov     r0, #0
  50.         mcrr    p15, 4, r0, r0, c14             @ Reset CNTVOFF to zero
  51. 1:
  52. @        movs pc, lr
  53. @ by using bx lr instead of movs pc, lr, CPSR is not updated, so I stay in monitor (NS) mode
  54.         bx lr
  55.  
  56. jmp_loader:
  57.         mrc p15, 0, r0, c1, c0, 0 @ Read System Control Register
  58.         bic r0, r0, #(1<<2)       @ cache disable
  59.         bic r0, r0, #(1<<12)      @ icache disable
  60.         bic r0, r0, #(1<<0)       @ MMU disable
  61.         mcr p15, 0, r0, c1, c0, 0 @ Write System Control Register
  62.  
  63.         mrc p15, 0, r0, c1, c0, 1 @ Read Auxiliary Control Register
  64.         orr r0, r0, #(1<<6)       @ SMP
  65.         mcr p15, 0, r0, c1, c0, 1 @ Write Auxiliary Control Register
  66.  
  67.         mov r0, #1
  68.         mcr p15, 0, r0, c14, c3, 1 @ CNTV_CTL (enable=1, imask=0)
  69.  
  70. @ set to non-sec
  71.         movw    r1, #0x3fff
  72.         movt    r1, #0x0006
  73.         mcr     p15, 0, r1, c1, c1, 2           @ NSACR = all copros to non-sec
  74. @ timer frequency
  75.         ldr     r1, =19200000
  76.         mcr     p15, 0, r1, c14, c0, 0          @ write CNTFRQ
  77.  
  78.         adr     r1, _start
  79.         mcr     p15, 0, r1, c12, c0, 1          @ set MVBAR to secure vectors
  80.         mrc     p15, 0, ip, c12, c0, 0          @ save secure copy of VBAR
  81.  
  82.         isb
  83.  
  84. @        smc     #0                              @ call into MONITOR mode
  85. @ remove the smc call and inline the content of secure_monitor
  86. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  87.         cps     #CPSR_MONITOR_MODE
  88.  
  89.         mrc     p15, 0, r1, c1, c1, 0           @ read SCR
  90.         bic     r1, r1, #0x4e                   @ clear IRQ, FIQ, EA, nET bits
  91.         orr     r1, r1, #0x31                   @ enable NS, AW, FW bits
  92.         orr     r1, r1, #0x100                  @ allow HVC instruction
  93.         mcr     p15, 0, r1, c1, c1, 0           @ write SCR (with NS bit set)
  94.                                                                              
  95.         mrc     p15, 0, r0, c12, c0, 1          @ get MVBAR value
  96.         mcr     p15, 4, r0, c12, c0, 0          @ write HVBAR
  97.  
  98.         @ Reset CNTVOFF to 0 before leaving monitor mode
  99.         mov     r0, #0
  100.         mcrr    p15, 4, r0, r0, c14             @ Reset CNTVOFF to zero
  101. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  102.         @ Still in Monitor mode, but now in Non-Secure state
  103.  
  104.         mov     r4, #0x8000
  105.         mrc     p15, 0, r0, c0, c0, 5       @ MPIDR
  106.         ubfx    r0, r0, #0, #2
  107.         cmp     r0, #0
  108.         beq     9f
  109.  
  110.         cmp     r0, #0xff
  111.         bge     10f
  112.  
  113.         ldr     r5, =0x4000008C         @ mbox
  114.         ldr     r3, =0x00000000         @ magic
  115.         str     r3, [r5, r0, lsl #4]
  116.  
  117.         ldr     r5, =0x400000CC         @ mbox
  118. 1:
  119.         ldr     r4, [r5, r0, lsl #4]
  120.         cmp     r4, r3
  121.         beq     1b
  122.  
  123. @ clear mailbox
  124.         str     r4, [r5, r0, lsl #4]
  125.  
  126. 9:
  127.         @ldr    r5, = (BCM2708_PERI_BASE + 0x300c)              @ stc0
  128.         @ldr    r6, = 0xaff0aff0
  129.         @str    r4, [r5, r0, lsl #2]
  130.  
  131.  
  132. @       msr     cpsr_fsxc, #0xd3
  133.         mov     r0, #0
  134.         ldr     r1, =3138               @ BCM2708 machine id
  135.         ldr     r2, =0x100              @ ATAGS
  136.         bx      r4
  137. 10:
  138.         wfi
  139.         b       10b
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement