Advertisement
xerpi

payloads.s

Oct 16th, 2015
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 4.29 KB | None | 0 0
  1. #include "linux_config.h"
  2.  
  3. .arm
  4. .align 4
  5. .code 32
  6. .text
  7.  
  8. @ LCD Frambuffers stuff (Physical Addresses)
  9. #define LCD_FB_PDC0           (0x10400400)
  10. #define LCD_FB_PDC1           (0x10400500)
  11. #define LCD_FB_A_ADDR_OFFSET  (0x68)
  12. #define LCD_FB_B_ADDR_OFFSET  (0x94)
  13. #define FB_TOP_SIZE           (400*240*3)
  14. #define FB_BOT_SIZE           (320*240*3)
  15. #define FB_TOP_LEFT1          (VRAM_BASE)
  16. #define FB_TOP_LEFT2          (FB_TOP_LEFT1  + FB_TOP_SIZE)
  17. #define FB_TOP_RIGHT1         (FB_TOP_LEFT2  + FB_TOP_SIZE)
  18. #define FB_TOP_RIGHT2         (FB_TOP_RIGHT1 + FB_TOP_SIZE)
  19. #define FB_BOT_1              (FB_TOP_RIGHT2 + FB_TOP_SIZE)
  20. #define FB_BOT_2              (FB_BOT_1      + FB_BOT_SIZE)
  21.  
  22. @ This must be Position-independent Code
  23.  
  24.     .cpu arm946e-s
  25.  
  26.     .global linux_payloads_start
  27. linux_payloads_start:
  28.  
  29. _start:
  30.     b _init
  31.  
  32.     @ required, don't move :)
  33.     @ will be set to FIRM ARM9 entry point by BRAHMA
  34.     arm9ep_backup:  .long 0xFFFF0000
  35.  
  36.  
  37. _init:
  38.     stmfd sp!, {r0-r12, lr}
  39.     bl linux_arm9_stage_start
  40.     ldmfd sp!, {r0-r12, lr}
  41.  
  42.     @ return control to FIRM
  43.     ldr pc, arm9ep_backup
  44.  
  45.  
  46. @@@@@@@@@@@@ ARM9 Stage 0 @@@@@@@@@@@@
  47.  
  48. linux_arm9_stage_start:
  49.  
  50.     @ Disable MPU
  51.     mrc p15, 0, r0, c1, c0, 0
  52.     bic r0, r0, #1
  53.     mcr p15, 0, r0, c1, c0, 0
  54.  
  55.     @ Disable IRQ and FIQ
  56.     mrs r0, cpsr
  57.     orr r0, r0, #(0x80 | 0x40)
  58.     msr cpsr_c, r0
  59.  
  60.     ldr r0, =SHARED_CHAR
  61.     mov r1, #0
  62.     str r1, [r0]
  63.  
  64.     @ The ARM9 code is loaded to 0x23F00000 so the
  65.     @ linux_arm11_stage_start address will be at:
  66.     @ 0x23F00000 + (&linux_arm11_stage_start - &linux_arm9_stage_start)
  67.  
  68.     ldr r0, =PA_ARM11_CODE_ADDR
  69.     ldr r1, =(0x23F0002C)
  70.     str r1, [r0]
  71.  
  72.     //Drain write buffer
  73.     mcr p15, 0, r0, c7, c10, 4
  74.  
  75.     //Map VRAM to region 7
  76.     //Region base: 0x18000000
  77.     //Region size: 8MB (0b10110)
  78.     ldr r0, =0x1800002D
  79.     mcr p15, 0, r0, c6, c7, 0
  80.  
  81.     //Set region 7 permissions:
  82.     //Privileged: Read/write access
  83.     //User: Read/write access
  84.     mrc p15, 0, r0, c5, c0, 2
  85.     bic r0, r0, #(0b1111 << 28)
  86.     orr r0, r0, #(0b0011 << 28)
  87.     mcr p15, 0, r0, c5, c0, 2
  88.  
  89.  
  90.  
  91. loop:
  92.  
  93.  
  94.     @ Draw fbs
  95.     ldr r0, =0xFF00FF
  96.     bl fill_screen
  97.  
  98.     b loop
  99.  
  100.  
  101.  
  102.  
  103. .global fill_screen
  104. @ r0 = color
  105. fill_screen:
  106.     mov r9, r0
  107.  
  108.     and r3, r0, #0xFF
  109.     lsr r4, r0, #8
  110.     and r4, r4, #0xFF
  111.     lsr r5, r0, #16
  112.     and r5, r5, #0xFF
  113.  
  114.     ldr r0, =(FB_TOP_SIZE/2)
  115.     ldr r1, =FB_TOP_LEFT1
  116.     ldr r7, =(FB_TOP_LEFT2-FB_TOP_LEFT1)
  117.     add r2, r1, r0 @limit_addr
  118.     mov r6, r1 @ ptr
  119. _fill_for_1:
  120.     strb r3, [r6, #0]
  121.     strb r4, [r6, #1]
  122.     strb r5, [r6, #2]
  123.     add r8, r6, r7
  124.     strb r3, [r8, #0]
  125.     strb r4, [r8, #1]
  126.     strb r5, [r8, #2]
  127.     add r6, r6, #3
  128.     cmp r6, r2
  129.     blt _fill_for_1
  130.  
  131.     mov r0, r9
  132.  
  133.     and r3, r0, #0xFF
  134.     lsr r4, r0, #8
  135.     and r4, r4, #0xFF
  136.     lsr r5, r0, #16
  137.     and r5, r5, #0xFF
  138.  
  139.     ldr r0, =(FB_TOP_SIZE/2)
  140.     ldr r1, =FB_TOP_RIGHT1
  141.     ldr r7, =(FB_TOP_RIGHT2-FB_TOP_RIGHT1)
  142.     add r2, r1, r0 @limit_addr
  143.     mov r6, r1 @ ptr
  144. _fill_for_2:
  145.     strb r3, [r6, #0]
  146.     strb r4, [r6, #1]
  147.     strb r5, [r6, #2]
  148.     add r8, r6, r7
  149.     strb r3, [r8, #0]
  150.     strb r4, [r8, #1]
  151.     strb r5, [r8, #2]
  152.     add r6, r6, #3
  153.     cmp r6, r2
  154.     blt _fill_for_2
  155.  
  156.     bx lr
  157.  
  158.     .ltorg
  159.     .global linux_arm9_stage_end
  160. linux_arm9_stage_end:
  161.  
  162.  
  163.     .cpu mpcore
  164.     .global linux_arm11_stage_start
  165. linux_arm11_stage_start:
  166.  
  167.     @ Disable FIQs, IRQs,
  168.     @ imprecise aborts,
  169.     @ and enter SVC mode
  170.     CPSID aif, #0x13
  171.  
  172.     @ Invalidate Entire Instruction Cache,
  173.     @ also flushes the branch target cache
  174.     mov r0, #0
  175.     mcr p15, 0, r0, c7, c5, 0
  176.  
  177.     @ Invalidate Entire Data Cache
  178.     mov r0, #0
  179.     mcr p15, 0, r0, c7, c6, 0
  180.  
  181.     @ Clear exclusive records
  182.     clrex
  183.  
  184.  
  185.     @ Map FBs to the VRAM
  186.  
  187.     @ Top screen
  188.     ldr r0, =LCD_FB_PDC0
  189.  
  190.     @ Left eye
  191.     ldr r1, =FB_TOP_LEFT1
  192.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 0)]
  193.     ldr r1, =FB_TOP_LEFT2
  194.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 4)]
  195.  
  196.     @ Right eye
  197.     ldr r1, =FB_TOP_RIGHT1
  198.     str r1, [r0, #(LCD_FB_B_ADDR_OFFSET + 0)]
  199.     ldr r1, =FB_TOP_RIGHT2
  200.     str r1, [r0, #(LCD_FB_B_ADDR_OFFSET + 4)]
  201.  
  202.     @ Bottom screen
  203.     ldr r0, =LCD_FB_PDC1
  204.  
  205.     ldr r1, =FB_BOT_1
  206.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 0)]
  207.     ldr r1, =FB_BOT_2
  208.     str r1, [r0, #(LCD_FB_A_ADDR_OFFSET + 4)]
  209.  
  210.     @ Setup the registers before
  211.     @ jumping to the kernel entry
  212.     mov r0, #0
  213.     ldr r1, =MACHINE_NUMBER
  214.     ldr r2, =PARAMS_ADDR
  215.     ldr lr, =ZIMAGE_ADDR
  216.  
  217.     bx lr
  218.  
  219.     .ltorg
  220.     .global linux_arm11_stage_end
  221. linux_arm11_stage_end:
  222.  
  223.  
  224.     .global linux_payloads_end
  225. linux_payloads_end:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement