From bfd7592c10befe0ba086f15bf169ab85a311a75e Mon Sep 17 00:00:00 2001 From: Nathan Lee Date: Mon, 24 Aug 2026 20:23:16 -0500 Subject: add floating point error CSR --- src/core.rs | 8 ++++++-- src/main.rs | 3 ++- wrv32em-common.dts | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/core.rs b/src/core.rs index 2746d1b..24c6a8f 100644 --- a/src/core.rs +++ b/src/core.rs @@ -388,8 +388,12 @@ pub fn fdiv_s(state: &mut CpuState, rd: usize, rs1: usize, rs2: usize) { let b = state.f_registers[rs2]; state.f_registers[rd] = if b == 0.0 { - f32::NAN - // todo: raise division by zero in csr + state.csr[0x001 /*fflags*/] |= 0b100; + if a.is_sign_positive() { + f32::INFINITY + } else { + f32::NEG_INFINITY + } } else { a / b } diff --git a/src/main.rs b/src/main.rs index 74515b1..814dfeb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -420,7 +420,8 @@ fn return_to_userspace(state: &mut CpuState) { } fn exit(state: &mut CpuState) { - let data = read_all(&state.memory, RINGBUF_ADDR as u32, RINGBUF_SIZE as u32); + let mut data = read_all(&state.memory, RINGBUF_ADDR as u32, RINGBUF_SIZE as u32); + data.retain(|&x| x != 0); std::fs::write("core_dump.txt", data).unwrap(); std::process::exit(0); } diff --git a/wrv32em-common.dts b/wrv32em-common.dts index 7ba1946..969821c 100644 --- a/wrv32em-common.dts +++ b/wrv32em-common.dts @@ -4,6 +4,8 @@ #address-cells = <1>; #size-cells = <1>; + initrd = <0x50000000 0x50000000>; + memory@80000000 { device_type = "memory"; status = "okay"; -- cgit v1.2.3