This is a copy of the
riscv-probe repository stripped
from everything but the 64-bit hello world program for the sifive_u
QEMU
machine.
The directory structure is kept. This makes this repository a good starting
point to dive into riscv-probe. In particular we keep the crt.s
and start.c
files although they are almost empty. They are used in the original repository
to initialize libfemto. Here libfemto just provides a puts
function.
Having such a stripped down hello world program written in C was necessary for me to learn how to create a bare metal RISC-V assembly hello world version because I couldn't find a complete example program in assembly only that was writing to the UART.
Assuming the default prefix for the GNU toolchain is correct, and the toolchain
is in the $PATH
, running make
produce our hello
program. Refer to the
original repository otherwise.
$ make
AS.rv64imac build/obj/rv64imac/env/qemu-sifive_u/crt.o
CC.rv64imac build/obj/rv64imac/examples/hello/hello.o
CC.rv64imac build/obj/rv64imac/libfemto/arch/riscv/start.o
CC.rv64imac build/obj/rv64imac/libfemto/std/putchar.o
AR.rv64imac build/lib/rv64imac/libfemto.a
LD.rv64imac build/bin/rv64imac/qemu-sifive_u/hello
The result is a 64-bit RISC-V binary.
$ file build/bin/rv64imac/qemu-sifive_u/hello
build/bin/rv64imac/qemu-sifive_u/hello: ELF 64-bit LSB executable, UCB RISC-V,
version 1 (SYSV), statically linked, not stripped
Run it with:
$ qemu-system-riscv64 -nographic -machine sifive_u \
-kernel build/bin/rv64imac/qemu-sifive_u/hello
Hello.
QEMU: Terminated
Note: the program enters an infinite loop after producing the Hello.
text.
Type ctrl-a x
to stop QEMU.
To dissamble the program:
$ riscv64-unknown-elf-objdump -d build/bin/rv64imac/qemu-sifive_u/hello
build/bin/rv64imac/qemu-sifive_u/hello: file format elf64-littleriscv
Disassembly of section .text:
0000000080000000 <_start>:
80000000: 0040006f j 80000004 <main>
0000000080000004 <main>:
80000004: 1141 addi sp,sp,-16
80000006: e022 sd s0,0(sp)
80000008: e406 sd ra,8(sp)
8000000a: 00000417 auipc s0,0x0
8000000e: 02e40413 addi s0,s0,46 # 80000038 <putchar+0x16>
80000012: 00044503 lbu a0,0(s0)
80000016: e111 bnez a0,8000001a <main+0x16>
80000018: a001 j 80000018 <main+0x14>
8000001a: 0405 addi s0,s0,1
8000001c: 006000ef jal ra,80000022 <putchar>
80000020: bfcd j 80000012 <main+0xe>
0000000080000022 <putchar>:
80000022: 100137b7 lui a5,0x10013
80000026: 4398 lw a4,0(a5)
80000028: 02071693 slli a3,a4,0x20
8000002c: fe06cde3 bltz a3,80000026 <putchar+0x4>
80000030: 0ff57513 andi a0,a0,255
80000034: c388 sw a0,0(a5)
80000036: 8082 ret
I used the above listing to guide modifications to the
hello-world-abs.S
program provided in rv8 to finally create a pure assembly hello
world.