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.