master
s 97 lines 1.38 KB
Raw
1 .option norvc
2
3 .text
4 .global _start
5 _start:
6 # Set up trap vector
7 lla t0, trap
8 csrw mtvec, t0
9
10 # Set up timer
11 lui t1, 0x02004
12 sd zero, 0(t1) # MTIMECMP0
13
14 # Enable timer interrupts
15 li t0, 0x80
16 csrrs zero, mie, t0
17 csrrsi zero, mstatus, 0x8
18
19 # Set up UART
20 lui t1, 0x10000
21 li a0, 0x80 # DLAB=1
22 sb a0, 3(t1)
23 li a0, 1 # Full speed
24 sw a0, 0(t1)
25 li a0, 0x03 # 8N1, DLAB=0
26 sb a0, 3(t1)
27
28 # Run test for around 30s
29 call rtc_get
30 li t0, 30
31 slli t0, t0, 30 # Approx. 10e9 ns
32 add t0, t0, a0
33 0:
34 # Tight loop with memory accesses
35 li a1, 1000000
36 la a2, semiargs
37 1:
38 ld a0, 0(a2)
39 sd a0, 0(a2)
40 addi a1, a1, -1
41 bnez a1, 1b
42
43 li a0, '.'
44 call send_byte
45 call rtc_get
46 bltu a0, t0, 0b
47
48 li a0, '\n'
49 call send_byte
50
51 # Exit
52 li a0, 0
53 lla a1, semiargs
54 li t0, 0x20026 # ADP_Stopped_ApplicationExit
55 sd t0, 0(a1)
56 sd a0, 8(a1)
57 li a0, 0x20 # TARGET_SYS_EXIT_EXTENDED
58
59 # Semihosting call sequence
60 .balign 16
61 slli zero, zero, 0x1f
62 ebreak
63 srai zero, zero, 0x7
64
65 j .
66
67 rtc_get:
68 # Get current time from the goldfish RTC
69 lui t3, 0x0101
70 lw a0, 0(t3)
71 lw t3, 4(t3)
72 slli t3, t3, 32
73 add a0, a0, t3
74 ret
75
76 send_byte:
77 # Send a single byte over the serial
78 lui t3, 0x10000
79 lb a1, 5(t3)
80 andi a1, a1, 0x20
81 beqz a1, send_byte
82 sb a0, 0(t3)
83 ret
84
85 .balign 4
86 trap:
87 lui t5, 0x0200c
88 ld t6, -0x8(t5) # MTIME
89 addi t6, t6, 100
90 lui t5, 0x02004
91 sd t6, 0(t5) # MTIMECMP
92 mret
93
94 .data
95 .balign 16
96 semiargs:
97 .space 16