summaryrefslogtreecommitdiffstats
path: root/picorv32/firmware/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'picorv32/firmware/start.S')
-rw-r--r--picorv32/firmware/start.S537
1 files changed, 0 insertions, 537 deletions
diff --git a/picorv32/firmware/start.S b/picorv32/firmware/start.S
deleted file mode 100644
index d95f04c..0000000
--- a/picorv32/firmware/start.S
+++ /dev/null
@@ -1,537 +0,0 @@
-// This is free and unencumbered software released into the public domain.
-//
-// Anyone is free to copy, modify, publish, use, compile, sell, or
-// distribute this software, either in source code form or as a compiled
-// binary, for any purpose, commercial or non-commercial, and by any
-// means.
-
-#define ENABLE_QREGS
-#define ENABLE_HELLO
-#define ENABLE_RVTST
-#define ENABLE_SIEVE
-#define ENABLE_MULTST
-#define ENABLE_STATS
-
-#ifndef ENABLE_QREGS
-# undef ENABLE_RVTST
-#endif
-
-// Only save registers in IRQ wrapper that are to be saved by the caller in
-// the RISC-V ABI, with the excpetion of the stack pointer. The IRQ handler
-// will save the rest if necessary. I.e. skip x3, x4, x8, x9, and x18-x27.
-#undef ENABLE_FASTIRQ
-
-#include "custom_ops.S"
-
- .section .text
- .global irq
- .global hello
- .global sieve
- .global multest
- .global hard_mul
- .global hard_mulh
- .global hard_mulhsu
- .global hard_mulhu
- .global hard_div
- .global hard_divu
- .global hard_rem
- .global hard_remu
- .global stats
-
-reset_vec:
- // no more than 16 bytes here !
- picorv32_waitirq_insn(zero)
- picorv32_maskirq_insn(zero, zero)
- j start
-
-
-/* Interrupt handler
- **********************************/
-
-.balign 16
-irq_vec:
- /* save registers */
-
-#ifdef ENABLE_QREGS
-
- picorv32_setq_insn(q2, x1)
- picorv32_setq_insn(q3, x2)
-
- lui x1, %hi(irq_regs)
- addi x1, x1, %lo(irq_regs)
-
- picorv32_getq_insn(x2, q0)
- sw x2, 0*4(x1)
-
- picorv32_getq_insn(x2, q2)
- sw x2, 1*4(x1)
-
- picorv32_getq_insn(x2, q3)
- sw x2, 2*4(x1)
-
-#ifdef ENABLE_FASTIRQ
- sw x5, 5*4(x1)
- sw x6, 6*4(x1)
- sw x7, 7*4(x1)
- sw x10, 10*4(x1)
- sw x11, 11*4(x1)
- sw x12, 12*4(x1)
- sw x13, 13*4(x1)
- sw x14, 14*4(x1)
- sw x15, 15*4(x1)
- sw x16, 16*4(x1)
- sw x17, 17*4(x1)
- sw x28, 28*4(x1)
- sw x29, 29*4(x1)
- sw x30, 30*4(x1)
- sw x31, 31*4(x1)
-#else
- sw x3, 3*4(x1)
- sw x4, 4*4(x1)
- sw x5, 5*4(x1)
- sw x6, 6*4(x1)
- sw x7, 7*4(x1)
- sw x8, 8*4(x1)
- sw x9, 9*4(x1)
- sw x10, 10*4(x1)
- sw x11, 11*4(x1)
- sw x12, 12*4(x1)
- sw x13, 13*4(x1)
- sw x14, 14*4(x1)
- sw x15, 15*4(x1)
- sw x16, 16*4(x1)
- sw x17, 17*4(x1)
- sw x18, 18*4(x1)
- sw x19, 19*4(x1)
- sw x20, 20*4(x1)
- sw x21, 21*4(x1)
- sw x22, 22*4(x1)
- sw x23, 23*4(x1)
- sw x24, 24*4(x1)
- sw x25, 25*4(x1)
- sw x26, 26*4(x1)
- sw x27, 27*4(x1)
- sw x28, 28*4(x1)
- sw x29, 29*4(x1)
- sw x30, 30*4(x1)
- sw x31, 31*4(x1)
-#endif
-
-#else // ENABLE_QREGS
-
-#ifdef ENABLE_FASTIRQ
- sw gp, 0*4+0x200(zero)
- sw x1, 1*4+0x200(zero)
- sw x2, 2*4+0x200(zero)
- sw x5, 5*4+0x200(zero)
- sw x6, 6*4+0x200(zero)
- sw x7, 7*4+0x200(zero)
- sw x10, 10*4+0x200(zero)
- sw x11, 11*4+0x200(zero)
- sw x12, 12*4+0x200(zero)
- sw x13, 13*4+0x200(zero)
- sw x14, 14*4+0x200(zero)
- sw x15, 15*4+0x200(zero)
- sw x16, 16*4+0x200(zero)
- sw x17, 17*4+0x200(zero)
- sw x28, 28*4+0x200(zero)
- sw x29, 29*4+0x200(zero)
- sw x30, 30*4+0x200(zero)
- sw x31, 31*4+0x200(zero)
-#else
- sw gp, 0*4+0x200(zero)
- sw x1, 1*4+0x200(zero)
- sw x2, 2*4+0x200(zero)
- sw x3, 3*4+0x200(zero)
- sw x4, 4*4+0x200(zero)
- sw x5, 5*4+0x200(zero)
- sw x6, 6*4+0x200(zero)
- sw x7, 7*4+0x200(zero)
- sw x8, 8*4+0x200(zero)
- sw x9, 9*4+0x200(zero)
- sw x10, 10*4+0x200(zero)
- sw x11, 11*4+0x200(zero)
- sw x12, 12*4+0x200(zero)
- sw x13, 13*4+0x200(zero)
- sw x14, 14*4+0x200(zero)
- sw x15, 15*4+0x200(zero)
- sw x16, 16*4+0x200(zero)
- sw x17, 17*4+0x200(zero)
- sw x18, 18*4+0x200(zero)
- sw x19, 19*4+0x200(zero)
- sw x20, 20*4+0x200(zero)
- sw x21, 21*4+0x200(zero)
- sw x22, 22*4+0x200(zero)
- sw x23, 23*4+0x200(zero)
- sw x24, 24*4+0x200(zero)
- sw x25, 25*4+0x200(zero)
- sw x26, 26*4+0x200(zero)
- sw x27, 27*4+0x200(zero)
- sw x28, 28*4+0x200(zero)
- sw x29, 29*4+0x200(zero)
- sw x30, 30*4+0x200(zero)
- sw x31, 31*4+0x200(zero)
-#endif
-
-#endif // ENABLE_QREGS
-
- /* call interrupt handler C function */
-
- lui sp, %hi(irq_stack)
- addi sp, sp, %lo(irq_stack)
-
- // arg0 = address of regs
- lui a0, %hi(irq_regs)
- addi a0, a0, %lo(irq_regs)
-
- // arg1 = interrupt type
-#ifdef ENABLE_QREGS
- picorv32_getq_insn(a1, q1)
-#else
- addi a1, tp, 0
-#endif
-
- // call to C function
- jal ra, irq
-
- /* restore registers */
-
-#ifdef ENABLE_QREGS
-
- // new irq_regs address returned from C code in a0
- addi x1, a0, 0
-
- lw x2, 0*4(x1)
- picorv32_setq_insn(q0, x2)
-
- lw x2, 1*4(x1)
- picorv32_setq_insn(q1, x2)
-
- lw x2, 2*4(x1)
- picorv32_setq_insn(q2, x2)
-
-#ifdef ENABLE_FASTIRQ
- lw x5, 5*4(x1)
- lw x6, 6*4(x1)
- lw x7, 7*4(x1)
- lw x10, 10*4(x1)
- lw x11, 11*4(x1)
- lw x12, 12*4(x1)
- lw x13, 13*4(x1)
- lw x14, 14*4(x1)
- lw x15, 15*4(x1)
- lw x16, 16*4(x1)
- lw x17, 17*4(x1)
- lw x28, 28*4(x1)
- lw x29, 29*4(x1)
- lw x30, 30*4(x1)
- lw x31, 31*4(x1)
-#else
- lw x3, 3*4(x1)
- lw x4, 4*4(x1)
- lw x5, 5*4(x1)
- lw x6, 6*4(x1)
- lw x7, 7*4(x1)
- lw x8, 8*4(x1)
- lw x9, 9*4(x1)
- lw x10, 10*4(x1)
- lw x11, 11*4(x1)
- lw x12, 12*4(x1)
- lw x13, 13*4(x1)
- lw x14, 14*4(x1)
- lw x15, 15*4(x1)
- lw x16, 16*4(x1)
- lw x17, 17*4(x1)
- lw x18, 18*4(x1)
- lw x19, 19*4(x1)
- lw x20, 20*4(x1)
- lw x21, 21*4(x1)
- lw x22, 22*4(x1)
- lw x23, 23*4(x1)
- lw x24, 24*4(x1)
- lw x25, 25*4(x1)
- lw x26, 26*4(x1)
- lw x27, 27*4(x1)
- lw x28, 28*4(x1)
- lw x29, 29*4(x1)
- lw x30, 30*4(x1)
- lw x31, 31*4(x1)
-#endif
-
- picorv32_getq_insn(x1, q1)
- picorv32_getq_insn(x2, q2)
-
-#else // ENABLE_QREGS
-
- // new irq_regs address returned from C code in a0
- addi a1, zero, 0x200
- beq a0, a1, 1f
- ebreak
-1:
-
-#ifdef ENABLE_FASTIRQ
- lw gp, 0*4+0x200(zero)
- lw x1, 1*4+0x200(zero)
- lw x2, 2*4+0x200(zero)
- lw x5, 5*4+0x200(zero)
- lw x6, 6*4+0x200(zero)
- lw x7, 7*4+0x200(zero)
- lw x10, 10*4+0x200(zero)
- lw x11, 11*4+0x200(zero)
- lw x12, 12*4+0x200(zero)
- lw x13, 13*4+0x200(zero)
- lw x14, 14*4+0x200(zero)
- lw x15, 15*4+0x200(zero)
- lw x16, 16*4+0x200(zero)
- lw x17, 17*4+0x200(zero)
- lw x28, 28*4+0x200(zero)
- lw x29, 29*4+0x200(zero)
- lw x30, 30*4+0x200(zero)
- lw x31, 31*4+0x200(zero)
-#else
- lw gp, 0*4+0x200(zero)
- lw x1, 1*4+0x200(zero)
- lw x2, 2*4+0x200(zero)
- // do not restore x3 (gp)
- lw x4, 4*4+0x200(zero)
- lw x5, 5*4+0x200(zero)
- lw x6, 6*4+0x200(zero)
- lw x7, 7*4+0x200(zero)
- lw x8, 8*4+0x200(zero)
- lw x9, 9*4+0x200(zero)
- lw x10, 10*4+0x200(zero)
- lw x11, 11*4+0x200(zero)
- lw x12, 12*4+0x200(zero)
- lw x13, 13*4+0x200(zero)
- lw x14, 14*4+0x200(zero)
- lw x15, 15*4+0x200(zero)
- lw x16, 16*4+0x200(zero)
- lw x17, 17*4+0x200(zero)
- lw x18, 18*4+0x200(zero)
- lw x19, 19*4+0x200(zero)
- lw x20, 20*4+0x200(zero)
- lw x21, 21*4+0x200(zero)
- lw x22, 22*4+0x200(zero)
- lw x23, 23*4+0x200(zero)
- lw x24, 24*4+0x200(zero)
- lw x25, 25*4+0x200(zero)
- lw x26, 26*4+0x200(zero)
- lw x27, 27*4+0x200(zero)
- lw x28, 28*4+0x200(zero)
- lw x29, 29*4+0x200(zero)
- lw x30, 30*4+0x200(zero)
- lw x31, 31*4+0x200(zero)
-#endif
-
-#endif // ENABLE_QREGS
-
- picorv32_retirq_insn()
-
-#ifndef ENABLE_QREGS
-.balign 0x200
-#endif
-irq_regs:
- // registers are saved to this memory region during interrupt handling
- // the program counter is saved as register 0
- .fill 32,4
-
- // stack for the interrupt handler
- .fill 128,4
-irq_stack:
-
-
-/* Main program
- **********************************/
-
-start:
- /* zero-initialize all registers */
-
- addi x1, zero, 0
- addi x2, zero, 0
- addi x3, zero, 0
- addi x4, zero, 0
- addi x5, zero, 0
- addi x6, zero, 0
- addi x7, zero, 0
- addi x8, zero, 0
- addi x9, zero, 0
- addi x10, zero, 0
- addi x11, zero, 0
- addi x12, zero, 0
- addi x13, zero, 0
- addi x14, zero, 0
- addi x15, zero, 0
- addi x16, zero, 0
- addi x17, zero, 0
- addi x18, zero, 0
- addi x19, zero, 0
- addi x20, zero, 0
- addi x21, zero, 0
- addi x22, zero, 0
- addi x23, zero, 0
- addi x24, zero, 0
- addi x25, zero, 0
- addi x26, zero, 0
- addi x27, zero, 0
- addi x28, zero, 0
- addi x29, zero, 0
- addi x30, zero, 0
- addi x31, zero, 0
-
-#ifdef ENABLE_HELLO
- /* set stack pointer */
- lui sp,(128*1024)>>12
-
- /* call hello C code */
- jal ra,hello
-#endif
-
- /* running tests from riscv-tests */
-
-#ifdef ENABLE_RVTST
-# define TEST(n) \
- .global n; \
- addi x1, zero, 1000; \
- picorv32_timer_insn(zero, x1); \
- jal zero,n; \
- .global n ## _ret; \
- n ## _ret:
-#else
-# define TEST(n) \
- .global n ## _ret; \
- n ## _ret:
-#endif
-
- TEST(lui)
- TEST(auipc)
- TEST(j)
- TEST(jal)
- TEST(jalr)
-
- TEST(beq)
- TEST(bne)
- TEST(blt)
- TEST(bge)
- TEST(bltu)
- TEST(bgeu)
-
- TEST(lb)
- TEST(lh)
- TEST(lw)
- TEST(lbu)
- TEST(lhu)
-
- TEST(sb)
- TEST(sh)
- TEST(sw)
-
- TEST(addi)
- TEST(slti) // also tests sltiu
- TEST(xori)
- TEST(ori)
- TEST(andi)
- TEST(slli)
- TEST(srli)
- TEST(srai)
-
- TEST(add)
- TEST(sub)
- TEST(sll)
- TEST(slt) // what is with sltu ?
- TEST(xor)
- TEST(srl)
- TEST(sra)
- TEST(or)
- TEST(and)
-
- TEST(mulh)
- TEST(mulhsu)
- TEST(mulhu)
- TEST(mul)
-
- TEST(div)
- TEST(divu)
- TEST(rem)
- TEST(remu)
-
- TEST(simple)
-
- /* set stack pointer */
- lui sp,(128*1024)>>12
-
- /* set gp and tp */
- lui gp, %hi(0xdeadbeef)
- addi gp, gp, %lo(0xdeadbeef)
- addi tp, gp, 0
-
-#ifdef ENABLE_SIEVE
- /* call sieve C code */
- jal ra,sieve
-#endif
-
-#ifdef ENABLE_MULTST
- /* call multest C code */
- jal ra,multest
-#endif
-
-#ifdef ENABLE_STATS
- /* call stats C code */
- jal ra,stats
-#endif
-
- /* print "DONE\n" */
- lui a0,0x10000000>>12
- addi a1,zero,'D'
- addi a2,zero,'O'
- addi a3,zero,'N'
- addi a4,zero,'E'
- addi a5,zero,'\n'
- sw a1,0(a0)
- sw a2,0(a0)
- sw a3,0(a0)
- sw a4,0(a0)
- sw a5,0(a0)
-
- li a0, 0x20000000
- li a1, 123456789
- sw a1,0(a0)
-
- /* trap */
- ebreak
-
-
-/* Hard mul functions for multest.c
- **********************************/
-
-hard_mul:
- mul a0, a0, a1
- ret
-
-hard_mulh:
- mulh a0, a0, a1
- ret
-
-hard_mulhsu:
- mulhsu a0, a0, a1
- ret
-
-hard_mulhu:
- mulhu a0, a0, a1
- ret
-
-hard_div:
- div a0, a0, a1
- ret
-
-hard_divu:
- divu a0, a0, a1
- ret
-
-hard_rem:
- rem a0, a0, a1
- ret
-
-hard_remu:
- remu a0, a0, a1
- ret
-