Advertisement
xerpi

wakeup CPU0!!

Jan 25th, 2015
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 4.63 KB | None | 0 0
  1. @ This code will be run by the ARM11 processor.
  2. @ The ARM9 processor overwrites the ARM11 exception
  3. @ vectors with a jump to here, so when an ARM11
  4. @ exception raises, our code gets "called".
  5.  
  6. #define PRIV_MEM_BASE_VA                   (0xFFFEE000)
  7.     #define CPU0_INTERRUPT_INTERFACE_ADDR  (PRIV_MEM_BASE_VA+0x0200)
  8.         #define CPU0_INT_INTR_CTRL_ADDR        (CPU0_INTERRUPT_INTERFACE_ADDR+0x00)
  9.         #define CPU0_INT_INTR_PRIOMASK_ADDR    (CPU0_INTERRUPT_INTERFACE_ADDR+0x04)
  10.         #define CPU0_INT_INTR_BINPOINT_ADDR    (CPU0_INTERRUPT_INTERFACE_ADDR+0x08)
  11.     #define CPU1_INTERRUPT_INTERFACE_ADDR  (PRIV_MEM_BASE_VA+0x0300)
  12.         #define CPU1_INT_INTR_CTRL_ADDR        (CPU1_INTERRUPT_INTERFACE_ADDR+0x00)
  13.         #define CPU1_INT_INTR_PRIOMASK_ADDR    (CPU1_INTERRUPT_INTERFACE_ADDR+0x04)
  14.         #define CPU1_INT_INTR_BINPOINT_ADDR    (CPU1_INTERRUPT_INTERFACE_ADDR+0x08)
  15.     #define CPU0_TIMER_WATCHDOG_ADDR       (PRIV_MEM_BASE_VA+0x0700)
  16.         #define CPU0_TIMER_LOAD_ADDR           (CPU0_TIMER_WATCHDOG_ADDR+0x00)
  17.         #define CPU0_TIMER_COUNTER_ADDR        (CPU0_TIMER_WATCHDOG_ADDR+0x04)
  18.         #define CPU0_TIMER_CONTROL_ADDR        (CPU0_TIMER_WATCHDOG_ADDR+0x08)
  19.         #define CPU0_TIMER_INT_STATUS_ADDR     (CPU0_TIMER_WATCHDOG_ADDR+0x0C)
  20.         #define CPU0_WATCHDOG_COUNTER_ADDR     (CPU0_TIMER_WATCHDOG_ADDR+0x24)
  21.     #define CPU1_TIMER_WATCHDOG_ADDR       (PRIV_MEM_BASE_VA+0x0800)
  22.         #define CPU1_TIMER_LOAD_ADDR           (CPU1_TIMER_WATCHDOG_ADDR+0x00)
  23.         #define CPU1_TIMER_COUNTER_ADDR        (CPU1_TIMER_WATCHDOG_ADDR+0x04)
  24.         #define CPU1_TIMER_CONTROL_ADDR        (CPU1_TIMER_WATCHDOG_ADDR+0x08)
  25.         #define CPU1_TIMER_INT_STATUS_ADDR     (CPU1_TIMER_WATCHDOG_ADDR+0x0C)
  26.         #define CPU1_WATCHDOG_COUNTER_ADDR     (CPU1_TIMER_WATCHDOG_ADDR+0x24)
  27.     #define INTERRUPT_DISTRIBUTOR_ADDR     (PRIV_MEM_BASE_VA+0x1000)
  28.         #define INTERRUPT_DISTR_CTRL_ADDR      (INTERRUPT_DISTRIBUTOR_ADDR+0x000)
  29.         #define INTERRUPT_ENABLE_SET_ADDR      (INTERRUPT_DISTRIBUTOR_ADDR+0x100)
  30.         #define INTERRUPT_ENABLE_CLEAR_ADDR    (INTERRUPT_DISTRIBUTOR_ADDR+0x180)
  31.         #define INTERRUPT_PENDING_SET_ADDR     (INTERRUPT_DISTRIBUTOR_ADDR+0x200)
  32.         #define INTERRUPT_PENDING_CLEAR_ADDR   (INTERRUPT_DISTRIBUTOR_ADDR+0x280)
  33.         #define SOFTWARE_INTERRUPT_ADDR        (INTERRUPT_DISTRIBUTOR_ADDR+0xF00)
  34.  
  35.  
  36.     .global arm11_start
  37. arm11_start:
  38.  
  39.     SEV
  40.  
  41.     @ Disable FIQs, IRQs,
  42.     @ imprecise aborts,
  43.     @ and enter SVC mode
  44.     CPSID aif, #0x13
  45.  
  46.     @ Invalidate Both Caches.
  47.     @ Also flushes the branch target cache
  48.     @ mov r0, #0
  49.     @ mcr p15, 0, r0, c7, c5, 4
  50.    
  51. loop_forever:
  52.     @ Get CPU ID
  53.     mrc p15, 0, r0, c0, c0, 5
  54.     ldr r1, =MAGIC_ADDR
  55.     add r0, r0, r0
  56.     add r2, r1, r0
  57.     ldrb r0, [r2]
  58.     add r0, r0, #1
  59.     strb r0, [r2]
  60.    
  61.     @ Get CPU0 timer value
  62.     ldr r0, =CPU0_TIMER_COUNTER_ADDR
  63.     ldr r0, [r0]
  64.     ldr r1, =MAGIC2_ADDR
  65.     str r0, [r1]
  66.    
  67.     @ Get CPU1 timer value
  68.     ldr r0, =CPU1_TIMER_COUNTER_ADDR
  69.     ldr r0, [r0]
  70.     ldr r1, =MAGIC3_ADDR
  71.     str r0, [r1]
  72.    
  73.     mov r0, #BLUE
  74.     bl fill_screen
  75.    
  76.     ldr r2, =0xFFFD4000 @HID
  77.     ldr r2, [r2]
  78.     tst r2, #0b1  @ KEY_A (eq=press)
  79.    
  80.     bleq send_interrupt
  81.    
  82.     @ Clean and Invalidate entire Data Cache
  83.     mov r0, #0
  84.     mcr p15, 0, r0, c7, c14, 0
  85.    
  86.     b loop_forever
  87.    
  88. send_interrupt:
  89.     stmfd sp!, {lr}
  90.  
  91.     mov r0, #RED
  92.     bl fill_screen
  93.    
  94.     @ Set Enable bits
  95.     ldr r0, =INTERRUPT_ENABLE_SET_ADDR
  96.     ldr r1, =0xFFFFFFFF
  97.     str r1, [r0, #0x00]
  98.     str r1, [r0, #0x04]
  99.     str r1, [r0, #0x08]
  100.     str r1, [r0, #0x0C]
  101.     str r1, [r0, #0x10]
  102.     str r1, [r0, #0x14]
  103.     str r1, [r0, #0x18]
  104.     str r1, [r0, #0x1C]
  105.    
  106.     @ Enable GIC
  107.     ldr r0, =INTERRUPT_DISTR_CTRL_ADDR
  108.     ldr r1, =1
  109.     str r1, [r0]
  110.    
  111.     @ Enable CPU0 interrupt interface
  112.     ldr r0, =CPU0_INT_INTR_CTRL_ADDR
  113.     ldr r1, =1
  114.     str r1, [r0]
  115.    
  116.     @ Enable CPU1 interrupt interface
  117.     ldr r0, =CPU1_INT_INTR_CTRL_ADDR
  118.     ldr r1, =1
  119.     str r1, [r0]
  120.    
  121.     @ CPU0 Mask all interrupts
  122.     ldr r0, =CPU0_INT_INTR_PRIOMASK_ADDR
  123.     ldr r1, =0xF0
  124.     str r1, [r0]
  125.  
  126.     @ CPU1 Mask all interrupts
  127.     ldr r0, =CPU1_INT_INTR_PRIOMASK_ADDR
  128.     ldr r1, =0xF0
  129.     str r1, [r0]
  130.    
  131.     @ CPU0 all bits compared for pre-emption
  132.     ldr r0, =CPU0_INT_INTR_BINPOINT_ADDR
  133.     ldr r1, =0b011
  134.     str r1, [r0]
  135.    
  136.     @ CPU1 all bits compared for pre-emption
  137.     ldr r0, =CPU1_INT_INTR_BINPOINT_ADDR
  138.     ldr r1, =0b011
  139.     str r1, [r0]
  140.    
  141.     @ Enable CPU0 timer
  142.     ldr r0, =CPU0_TIMER_LOAD_ADDR
  143.     ldr r1, =0x40000000
  144.     str r1, [r0]
  145.    
  146.     ldr r0, =CPU0_TIMER_CONTROL_ADDR
  147.     ldr r1, [r0]
  148.     orr r1, r1, #0b111
  149.     str r1, [r0]
  150.    
  151.     @ Enable CPU1 timer
  152.     ldr r0, =CPU1_TIMER_LOAD_ADDR
  153.     ldr r1, =0x40000000
  154.     str r1, [r0]
  155.    
  156.     ldr r0, =CPU1_TIMER_CONTROL_ADDR
  157.     ldr r1, [r0]
  158.     orr r1, r1, #0b111
  159.     str r1, [r0]
  160.    
  161.     @ Signal the other core
  162.     @ SEV
  163.    
  164.     @ Send software interrupt ¿?
  165.     @ ldr r4, =SIR_REG_ADDR
  166.     @ ldr r5, =(0b0100000000000000<<9)
  167.    
  168.     ldmfd sp!, {pc}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement