summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core.rs8
-rw-r--r--src/main.rs3
-rw-r--r--wrv32em-common.dts2
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";