Files
chipyard/bootrom/bootrom.S
2017-09-12 20:33:36 -07:00

44 lines
1.0 KiB
ArmAsm

#define DRAM_BASE 0x80000000
.section .text.start, "ax", @progbits
.globl _start
_start:
li a1, 0x2000000 // base address of clint
csrr a0, mhartid
bnez a0, boot_core
addi a2, a1, 4
li a3, 1
interrupt_loop:
sw a3, 0(a2)
addi a2, a2, 4
lw a3, -4(a2)
bnez a3, interrupt_loop
boot_core:
sll a0, a0, 2 // offset for hart msip
add a0, a0, a1
sw zero, 0(a0) // clear the interrupt
li a0, DRAM_BASE // program reset vector
csrw mepc, a0 // return from interrupt to start of user program
csrr a0, mhartid // hartid for next level bootloader
la a1, _dtb // dtb address for next level bootloader
mret
.section .text.hang, "ax", @progbits
.globl _hang
_hang:
// This boot ROM doesn't know about any boot devices, so it just spins,
// waiting for the serial interface to load the program and interrupt it
la a0, _start
csrw mtvec, a0
li a0, 8 // MIE or MSIP bit
csrw mie, a0 // set only MSIP in mie CSR
csrw mideleg, zero // no delegation
csrs mstatus, a0 // set MIE in mstatus CSR
wfi_loop:
wfi
j wfi_loop
_dtb: