commit 0ec92ecb47a3a0093deb0f285e0d05d011cf06d9 from: Benjamin Stürz date: Tue Feb 20 18:51:20 2024 UTC fix bne and make ebreak useful commit - a67f2fcdcd5d5cc91b1aac7a4c600482f600a732 commit + 0ec92ecb47a3a0093deb0f285e0d05d011cf06d9 blob - c1b64dea367cf49f7f9f16f859eb4ff99407573e blob + 56c7fd9329171d775185b57763c510b8323df1a0 --- Makefile +++ Makefile @@ -10,7 +10,7 @@ CROSS = ./tools/bin/${TARGET} CFLAGS = -std=c2x -fPIC -O0 -g LDFLAGS = -pie -static -lpthread OBJ = rvemu.o ecall.o cpu.o exec.o -PROGS = test.elf hello.elf +PROGS = test.elf test2.elf hello.elf all: rvemu ${PROGS} blob - 6d0a65ab8870c771e0c20ac41212797db275fd74 blob + a705236c9bc04ebc05144792b2c9cc7cded54f0a --- cpu.c +++ cpu.c @@ -88,6 +88,7 @@ void cpu_exec (u32 instr) case 0b001: name = "bne"; c = a != b; + break; case 0b100: name = "blt"; c = (i64)a < (i64)b; @@ -367,17 +368,22 @@ void cpu_exec (u32 instr) eprintf ("%08llx: efence\n", pc - 4); break; case 0b1110011: // ecall/ebreak - log ( - "ecall a0=%llu, a1=%llu, a2=%llu, a3=%llu, a4=%llu, a5=%llu, a7=%llu", - cpu_get (10), - cpu_get (11), - cpu_get (12), - cpu_get (13), - cpu_get (14), - cpu_get (15), - cpu_get (17) - ); - ecall (); + if ((instr >> 20) & 1) { + eprintf ("%08llx: ebreak\n", pc - 4); + __asm __volatile__ ("int $3"); + } else { + log ( + "ecall a0=%llu, a1=%llu, a2=%llu, a3=%llu, a4=%llu, a5=%llu, a7=%llu", + cpu_get (10), + cpu_get (11), + cpu_get (12), + cpu_get (13), + cpu_get (14), + cpu_get (15), + cpu_get (17) + ); + ecall (); + } break; default: ud: blob - 4cb95aa505e1a5d33bd0d37ed1fb0f4f115b2b67 blob + f1fa870f78600a53528abcc226d280124e392286 --- rvemu.h +++ rvemu.h @@ -4,7 +4,7 @@ #include #include -#define DEBUG 1 +#define DEBUG 0 #if DEBUG # define eprintf(...) fprintf (stderr, __VA_ARGS__) blob - 70f3e50ce557283d9025cf3c7e821c05c080395b blob + 7ae62507ac23f2c3e6716f44bfdb437b02dbc5f6 --- test.c +++ test.c @@ -3,14 +3,14 @@ const char *volatile str = "Hello World!\n"; -size_t my_strlen (const char *s) +__attribute__((always_inline)) +inline static void ebreak (void) { - size_t i; - for (i = 0; s[i] != '\0'; ++i); - return i; + __asm __volatile__ ("ebreak"); } int main (void) { - const size_t len = my_strlen (str); - return len; + const size_t len = strlen (str); + write (1, str, len); + return 0; }