Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 5.07 KB | None | 0 0
  1.     ORG 0
  2. ivt_start:
  3.     b reset         ; RESET 0x00000000, Reset
  4.     b undef_short   ; UNDEF 0x00000004, Undefined Instruction
  5.     b swi_short     ; SWI   0x00000008, Software Interrupt
  6.     b pabt_short    ; PABT  0x0000000C, Prefetch Abort
  7.  
  8.     b dabt_short    ; DABT  0x00000010, Data Abort
  9.     b rsv_short     ; RSV   0x00000014, Reserved
  10.     b irq_short     ; IRQ   0x00000018, Interrupt Request
  11.     b fig_short     ; FIQ   0x0000001C, Fast Interrupt Request
  12.  
  13.     undef_isr_addr: dd hang
  14.     swi_isr_addr:   dd hang
  15.     pabt_isr_addr:  dd hang
  16.     dabt_isr_addr:  dd hang
  17.     rsv_isr_addr:   dd hang
  18.     irq_isr_addr:   dd irq_isr
  19.     fig_isr_addr:   dd hang
  20.  
  21. undef_short:
  22.     mov r0, 0x10000
  23.     ldr r1, [undef_isr_addr]
  24.     add r1, r0
  25.     mov pc, r1
  26. swi_short:
  27.     mov r0, 0x10000
  28.     ldr r1, [swi_isr_addr]
  29.     add r1, r0
  30.     mov pc, r1
  31. pabt_short:
  32.     mov r0, 0x10000
  33.     ldr r1, [pabt_isr_addr]
  34.     add r1, r0
  35.     mov pc, r1
  36. dabt_short:
  37.     mov r0, 0x10000
  38.     ldr r1, [dabt_isr_addr]
  39.     add r1, r0
  40.     mov pc, r1
  41. rsv_short:
  42.     mov r0, 0x10000
  43.     ldr r1, [rsv_isr_addr]
  44.     add r1, r0
  45.     mov pc, r1    
  46. irq_short:          
  47.     mov r0, 0x10000
  48.     ldr r1, [irq_isr_addr]
  49.     add r1, r0
  50.     mov pc, r1
  51. fig_short:
  52.     mov r0, 0x10000
  53.     ldr r1, [fig_isr_addr]
  54.     add r1, r0
  55.     mov pc, r1
  56. ivt_end:
  57.     ;***************
  58.     ;* Timer MMIO  *
  59.     ;***************      
  60.     TIMER_CVR    EQU 0x04 ; Current Value Register, TimerXValue
  61.     TIMER_CR     EQU 0x08 ; Control Register, TimerXControl
  62.     TIMER_INTCLR EQU 0x0C ; Interrupt Clear Register, TimerXIntClr
  63.     TIMER_BGLOAD EQU 0x18 ; Background Load Register
  64.     ;*************
  65.     ;* Uart MMIO *
  66.     ;*************
  67.     UART_CR      EQU 0x30 ; Control Register
  68.     UART_ICR     EQU 0x44 ; Interrupt Clear Register
  69.     UART_FR      EQU 0x18 ; Flag Register
  70.     UART_IMSC    EQU 0x38 ; Interrupt Mask Register
  71.     UART_ICR     EQU 0x44 ; Interrupt Clear Register
  72.  
  73. ;*********************************
  74. ;* IRQ Interrupt Service Routine *
  75. ;*********************************    
  76. irq_isr:
  77.     push {r0-r12, r14}
  78.     ldr r0, [VIC_IRQSTATUS]
  79.     ldr r1, [r0]
  80.     ; Timer0 IRQ Source Check
  81.     ands r1, #0x10
  82.     bne irq_isr_timer
  83.     ldr r1, [r0]
  84.     ands r1, #0x1000
  85.     bne irq_isr_uart
  86.     b halt
  87. irq_isr_uart:
  88.     mov r1, #0x31
  89.     bl uart_put32
  90.  
  91.     ldr r0, [UART_BASE]
  92.     mov r1, #0x10
  93.     str r1, [r0, UART_ICR]  ; // THIS RIGHT HERE CHANGES VALUE OF SP TO BULLSHIT
  94. q: b q
  95.  
  96.     pop {r0-r12, r14}
  97.     subs pc, r14, #4
  98. irq_isr_timer:
  99.     mov r1, 0x30
  100.  
  101. halt: b halt
  102.     pop {r0-r12, r14}
  103.     subs pc, r14, #4
  104.  
  105. reset:
  106.     mov sp, #0x20000
  107.     mov r0, #0x10000
  108.     mov r1, #0
  109.     mov r10, ivt_end - ivt_start
  110.     lsr r10, #3
  111. relocate:
  112.     ldmia r0!, {r2, r3, r4, r5, r6, r7, r8, r9}
  113.     stmia r1!, {r2, r3, r4, r5, r6, r7, r8, r9}
  114.     subs r10, #1
  115.     bne relocate
  116.     ;ldmia r0!, {r2, r3, r4, r5, r6, r7, r8, r9}
  117.     ;stmia r1!, {r2, r3, r4, r5, r6, r7, r8, r9}
  118.  
  119. ;****************************************
  120. ;*         Enable Timer0 and IRQs       *
  121. ;****************************************
  122.     mrs r0, cpsr
  123.     bic r0, r0, #0x80 ; Clear IRQ Disable
  124.     msr cpsr_c, r0
  125.  
  126.     ldr r1, [TIMER_BASE]
  127.     add r1, TIMER_CR
  128.     mov r0, #0
  129.     str r0, [r1]
  130.  
  131.     ldr r0, [TIMER_COUNT]
  132.     ldr r1, [TIMER_BASE]
  133.     mov r2, TIMER_BGLOAD
  134.     add r2, r1
  135.     str r0, [r1]
  136.     str r0, [r2]
  137.    
  138.     ldr r1, [TIMER_BASE]
  139.     add r1, TIMER_INTCLR
  140.     mov r2, #0
  141.     str r2, [r1]
  142.  
  143.     mov r0, #0xE2 ; Timer Enable, Periodic Mode, IRQ ON, Prescale = 0, 32 bit, Wrapping Mode
  144.     ldr r1, [TIMER_BASE]
  145.     add r1, TIMER_CR
  146.     str r0, [r1]
  147.  
  148.     mov r0, #0x10
  149.     ldr r1, [VIC_INTENABLE]
  150. ;    str r0, [r1]
  151.  
  152. ;****************************************
  153. ;*             Enable UART              *
  154. ;****************************************
  155.     ldr r0, [UART_BASE]
  156.     mov r1, #0x10 ; Enable Rx Interrupt
  157.     str r1, [r0, UART_IMSC]
  158.    
  159.     mov r0, #0x1000
  160.     ldr r1, [VIC_INTENABLE]
  161.     str r0, [r1]
  162.     b  mainloop
  163.     UART_BASE: dd 0x101F1000
  164.     TIMER_BASE: dd 0x101E2000
  165.     TIMER_COUNT: dd 1000000
  166.     VIC_BASE: dd 0x10140000
  167.     VIC_IRQSTATUS: dd (0x10140000 + 0x00)
  168.     VIC_FIGSTATUS: dd (0x10140000 + 0x04)
  169.     VIC_RAWINTR:   dd (0x10140000 + 0x08)
  170.     VIC_INTSELECT: dd (0x10140000 + 0x0C)
  171.     VIC_INTENABLE: dd (0x10140000 + 0x10)
  172.     VIC_INTCLEAR:  dd (0x10140000 + 0x14)
  173.     VIC_SOFTINT:   dd (0x10140000 + 0x18)
  174.  
  175. hang:
  176.     b hang
  177. ;****************************************
  178. ;*            Kernel Mainloop           *
  179. ;****************************************
  180. mainloop:
  181. ;    ldr r1, [pc, 4]
  182. ;    bl uart_put32
  183.     b mainloop
  184.     dd 0x50505050
  185.  
  186. ;     ldr r0, [TIMER_BASE]
  187. ;     add r0, TIMER_CVR
  188. ;     ldr r1, [r0]
  189. ;     bl uart_put32
  190. ;     b mainloop
  191. ;****************************************
  192. ;* UART Write 32 Bit Value              *
  193. ;* Input: R1 Value to be written        *
  194. ;* Output: None                         *
  195. ;****************************************
  196. uart_put32:
  197.     ldr r0, [pc, 4]   ; PC + 16
  198.     str r1, [r0]
  199.     bx lr
  200.     dd 0x101f1000
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement