diff options
Diffstat (limited to '')
| -rw-r--r-- | examples/device_tree.valid | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/examples/device_tree.valid b/examples/device_tree.valid new file mode 100644 index 0000000..41deb4a --- /dev/null +++ b/examples/device_tree.valid @@ -0,0 +1,152 @@ +== 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 edfe1dd0/imm20hi +13/i 6/rd 0/funct3 6/rs edfe0dd0/imm12lo +3/i 5/rd 2/funct3 15/rs 0/imm12 +63/b 1/funct3 5/rs1 6/rs2 err_magic/off13 + +37/u b/rd S_TOTALSZ/imm20hi +13/i b/rd 0/funct3 b/rs S_TOTALSZ/imm12lo +6f/j 1/rd print/off21 + +3/i b/rd 2/funct3 15/rs 4/imm12 +6f/j 1/rd bswapw/off21 +6f/j 1/rd print_hex_word/off21 +6f/j 1/rd printnl/off21 + +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 E_MAGIC/imm20hi +13/i b/rd 0/funct3 b/rs E_MAGIC/imm12lo +6f/j 1/rd print/off21 +6f/j 0/rd exit/off21 + +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 printnl:spin/off13 +# 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 print:break/off13 +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 print:spin/off13 +# 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 print:loop/off21 +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 print_hex_dgt/off21 + +# break if last shift +63/b 0/funct3 9/rs1 0/rs2 print_hex_word:break/off13 + +# subtract shift count, loop +13/i 9/rd 0/funct3 9/rs -4/imm12 +6f/j 0/rd print_hex_word:loop/off21 +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 print_hex_dgt:spin/off13 +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 print_hex_dgt:spin/off13 + +# 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 0a/8 00/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 00/8 + |
