added ebreak support

This commit is contained in:
Luxferre
2026-06-18 19:34:05 +03:00
parent 8c8de3bc1c
commit 7368329c16
5 changed files with 15 additions and 4 deletions
+5
View File
@@ -15,6 +15,11 @@ rv32imac_tests.bin: rv32imac_tests.elf
run: rv32imac_tests.bin run: rv32imac_tests.bin
$(EMULATOR) rv32imac_tests.bin $(EMULATOR) rv32imac_tests.bin
@echo "Testing standard ebreak..."
@echo "115 0 16 0" | awk -f amach.awk 2>&1 | grep -q "Fatal: EBREAK"
@echo "Testing compressed c.ebreak..."
@echo "2 144" | awk -f amach.awk 2>&1 | grep -q "Fatal: EBREAK"
@echo "All EBREAK tests PASSED!"
clean: clean:
rm -f rv32imac_tests.elf rv32imac_tests.bin rm -f rv32imac_tests.elf rv32imac_tests.bin
+1 -1
View File
@@ -32,7 +32,7 @@ POSIXLY_CORRECT=1 awk -f amach.awk [-v LVA=...] -- path/to/program.dec
## Support ## Support
Currently, A-machine only supports the **unprivileged** RV32IMAC instruction set with a few additional `ecall` syscalls: 63 (sys_read, for fd 0 only), 64 (sys_write, for fd 1 and 2 only) and 93 (sys_exit). For completeness, `fence` instruction is also supported but yields a no-op. Currently, A-machine only supports the **unprivileged** RV32IMAC instruction set with a few additional `ecall` syscalls: 63 (sys_read, for fd 0 only), 64 (sys_write, for fd 1 and 2 only) and 93 (sys_exit). For completeness, `fence` instruction is also supported but yields a no-op, and both `ebreak` and `c.ebreak` are supported to halt execution with a debug message.
## Plans (from higher to lower priority) ## Plans (from higher to lower priority)
+3 -3
View File
@@ -170,6 +170,7 @@ function amach_imm(opcode, f3, rd, rs1, immval, r1, ur1, shamt) {
pc = r1 + immval pc = r1 + immval
} else if(opcode == 115) { # 0x73, system call / csr } else if(opcode == 115) { # 0x73, system call / csr
if(immval == 0) handle_ecall(getreg(17), getreg(10), getreg(11), getreg(12), getreg(13), getreg(14), getreg(15)) if(immval == 0) handle_ecall(getreg(17), getreg(10), getreg(11), getreg(12), getreg(13), getreg(14), getreg(15))
else if(immval == 1) trapout(sprintf("EBREAK at 0x%X", pc-4))
else trapout(sprintf("Unimplemented external system call at 0x%X", pc-4)) else trapout(sprintf("Unimplemented external system call at 0x%X", pc-4))
} else trapout(sprintf("Illegal instruction at 0x%X", pc-4)) } else trapout(sprintf("Illegal instruction at 0x%X", pc-4))
} }
@@ -317,9 +318,8 @@ function amach_comp(instr, op, f3, b12, r11_7, r9_7, r6_2, r4_2, shamt, imm, ba
} else setreg(r11_7, getreg(r6_2)) # C.MV } else setreg(r11_7, getreg(r6_2)) # C.MV
} else { } else {
if(r6_2 == 0) { if(r6_2 == 0) {
if(r11_7 == 0) { # C.EBREAK if(r11_7 == 0) trapout(sprintf("EBREAK at 0x%X", pc-2)) # C.EBREAK
trapout(sprintf("EBREAK at 0x%X", pc-2)) else { # C.JALR
} else { # C.JALR
imm = getreg(r11_7) imm = getreg(r11_7)
setreg(1, pc) setreg(1, pc)
pc = imm pc = imm
Binary file not shown.
+6
View File
@@ -795,6 +795,12 @@ _start:
li a7, 93 li a7, 93
ecall ecall
# Unreachable: placed to verify standard/compressed ebreak compilation
ebreak
.option rvc
c.ebreak
.option norvc
report_error: report_error:
la a0, str_some_failed la a0, str_some_failed
jal print_string jal print_string