== code 0x80400000 # main: # print device tree info. # OpenSBI calls us with a1 set to the start of the DTB # load 0x10000000 (UART0) into a0 37/u a/rd 10000/imm20 13/i 15/rd 0/funct3 b/rs 0/imm12 # check magic == 0xd00dfeed 37/u 6/rd edfe1/imm20 13/i 6/rd 0/funct3 6/rs dd0/imm12 3/i 5/rd 2/funct3 15/rs 0/imm12 63/b 1/funct3 5/rs1 6/rs2 38/imm13 37/u b/rd 80500/imm20 13/i b/rd 0/funct3 b/rs 14/imm12 6f/j 1/rd 88/imm21 3/i b/rd 2/funct3 15/rs 4/imm12 6f/j 1/rd 34/imm21 6f/j 1/rd a0/imm21 6f/j 1/rd 60/imm21 # exit: # system reset (via SBI extension SRST) # a7 = ext id, a6 = fid, a0 = 0, a1 = 0 37/u 11/rd 53525/imm20 13/i 11/rd 0/funct3 11/rs 354/imm12 33/r 10/rd 0/funct3 0/rs1 0/rs2 0/funct7 33/r a/rd 0/funct3 0/rs1 0/rs2 0/funct7 33/r b/rd 0/funct3 0/rs1 0/rs2 0/funct7 # ECALL 73/i 0/rd 0/funct3 0/rs 0/imm12 # err_magic: 37/u b/rd 80500/imm20 13/i b/rd 0/funct3 b/rs 0/imm12 6f/j 1/rd 54/imm21 6f/j 0/rd -24/imm21 # bswapw: # byte-order-swap word in a1 # srli a1, a0, 8 # lui a2, 16 # addi a2, a2, -256 # and a1, a1, a2 13/i 5/rd 5/funct3 b/rs 8/imm12 37/u 6/rd 16/imm20 13/i 6/rd 0/funct3 6/rs -100/imm12 33/r 5/rd 7/funct3 5/rs1 6/rs2 0/funct7 # srli a2, a0, 24 # or a1, a1, a2 13/i 6/rd 5/funct3 b/rs 18/imm12 33/r 5/rd 6/funct3 5/rs1 6/rs2 0/funct7 # slli a2, a0, 8 # lui a3, 4080 # and a2, a2, a3 13/i 6/rd 1/funct3 b/rs 8/imm12 37/u 7/rd ff0/imm20 33/r 6/rd 7/funct3 6/rs1 7/rs2 0/funct7 # slli a0, a0, 24 # or a0, a0, a2 # or a0, a0, a1 13/i b/rd 1/funct3 b/rs 18/imm12 33/r b/rd 6/funct3 b/rs1 6/rs2 0/funct7 33/r b/rd 6/funct3 b/rs1 5/rs2 0/funct7 # ret 67/i 0/rd 0/funct3 1/rs 0/imm12 # printnl: 13/i 6/rd 0/funct3 0/rs a/imm12 # printnl:spin: # spin if FIFO is full (thr_emtpy = UART+5 & 0x20) 3/i 7/rd 4/funct3 a/rs 5/imm12 13/i 7/rd 7/funct3 7/rs 20/imm12 63/b 0/funct3 7/rs1 0/rs2 -8/imm13 # print char 23/s 2/funct3 a/rs1 0/imm12 6/rs2 # return 67/i 0/rd 0/funct3 1/rs 0/imm12 # print: # print:loop: # load unsigned byte at a1 3/i 6/rd 4/funct3 b/rs 0/imm12 # break loop if zero 63/b 0/funct3 6/rs1 0/rs2 1c/imm13 # print:spin: # spin if FIFO is full (thr_emtpy = UART+5 & 0x20) 3/i 7/rd 4/funct3 a/rs 5/imm12 13/i 7/rd 7/funct3 7/rs 20/imm12 63/b 0/funct3 7/rs1 0/rs2 -8/imm13 # print char 23/s 2/funct3 a/rs1 0/imm12 6/rs2 # increment a1 13/i b/rd 0/funct3 b/rs 1/imm12 # jump back up 6f/j 0/rd -1c/imm21 # print:break: # return 67/i 0/rd 0/funct3 1/rs 0/imm12 # print_hex_word: 13/i 8/rd 0/funct3 b/rs 0/imm12 13/i 9/rd 0/funct3 0/rs 1c/imm12 13/i 12/rd 0/funct3 1/rs 0/imm12 # print_hex_word:loop: # shift 33/r b/rd 5/funct3 8/rs1 9/rs2 0/funct7 6f/j 1/rd 14/imm21 # break if last shift 63/b 0/funct3 9/rs1 0/rs2 c/imm13 # subtract shift count, loop 13/i 9/rd 0/funct3 9/rs -4/imm12 6f/j 0/rd -10/imm21 # print_hex_word:break: # return 67/i 0/rd 0/funct3 12/rs 0/imm12 # print_hex_dgt: # a1 = a1 & 0xf 13/i b/rd 7/funct3 b/rs f/imm12 # t1 = 0x40 13/i 6/rd 0/funct3 0/rs 40/imm12 # add 0x30 (ascii '0') / 0x61 (ascii 'a') 13/i b/rd 0/funct3 b/rs 30/imm12 63/b 4/funct3 b/rs1 6/rs2 8/imm13 13/i b/rd 0/funct3 b/rs 27/imm12 # print_hex_dgt:spin: # spin if FIFO is full (thr_emtpy = UART+5 & 0x20) 3/i 7/rd 4/funct3 a/rs 5/imm12 13/i 7/rd 7/funct3 7/rs 20/imm12 63/b 0/funct3 7/rs1 0/rs2 -8/imm13 # print char 23/s 2/funct3 a/rs1 0/imm12 b/rs2 # return 67/i 0/rd 0/funct3 1/rs 0/imm12 == data 0x80500000 # E_MAGIC: # "Invalid DTB magic!\n\0" 49/8 6e/8 76/8 61/8 6c/8 69/8 64/8 20/8 44/8 54/8 42/8 20/8 6d/8 61/8 67/8 69/8 63/8 21/8 a/8 0/8 # S_TOTALSZ: 54/8 6f/8 74/8 61/8 6c/8 20/8 53/8 69/8 7a/8 65/8 3a/8 20/8 0/8