From b7e5138eb4dc7f933eb4e8ba28e59983e421b7d2 Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:00:46 +0000 Subject: [PATCH 1/7] [sw] Fix inline error when build optimized with O1 Signed-off-by: Douglas Reis --- sw/device/tests/axi_sram/smoketest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sw/device/tests/axi_sram/smoketest.c b/sw/device/tests/axi_sram/smoketest.c index cac2698f0..fc3b04bf8 100644 --- a/sw/device/tests/axi_sram/smoketest.c +++ b/sw/device/tests/axi_sram/smoketest.c @@ -5,7 +5,7 @@ #include #include -bool rapid_write_test() +static bool rapid_write_test() { uint64_t d1 = 0xB03747F359ABBCFEUL, res1; uint64_t d2 = 0x0A197F0071E028A1UL, res2; From f20411a9d883608cad76270add98b9fe3471e237 Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:01:44 +0000 Subject: [PATCH 2/7] [sw,uart] Add functions to read the status register Signed-off-by: Douglas Reis --- sw/device/lib/hal/uart.c | 10 ++++++++++ sw/device/lib/hal/uart.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/sw/device/lib/hal/uart.c b/sw/device/lib/hal/uart.c index a9895df26..c392bd183 100644 --- a/sw/device/lib/hal/uart.c +++ b/sw/device/lib/hal/uart.c @@ -60,6 +60,16 @@ bool uart_interrupt_any_pending(uart_t uart, uart_intr intrs) return (VOLATILE_READ(uart->intr_state) & intrs) != 0u; } +bool uart_status_any(uart_t uart, uart_status status) +{ + return (VOLATILE_READ(uart->status) & status) != 0u; +} + +bool uart_status_all(uart_t uart, uart_status status) +{ + return (VOLATILE_READ(uart->status) & status) == status; +} + void uart_loopback_set(uart_t uart, bool system_enable, bool line_enable) { uart_ctrl ctrl = VOLATILE_READ(uart->ctrl); diff --git a/sw/device/lib/hal/uart.h b/sw/device/lib/hal/uart.h index b71433110..84fcfa612 100644 --- a/sw/device/lib/hal/uart.h +++ b/sw/device/lib/hal/uart.h @@ -22,6 +22,8 @@ void uart_interrupt_force(uart_t uart, uart_intr intrs); void uart_interrupt_clear(uart_t uart, uart_intr intrs); bool uart_interrupt_all_pending(uart_t uart, uart_intr intrs); bool uart_interrupt_any_pending(uart_t uart, uart_intr intrs); +bool uart_status_any(uart_t uart, uart_status status); +bool uart_status_all(uart_t uart, uart_status status); void uart_loopback_set(uart_t uart, bool system_enable, bool line_enable); char uart_in(uart_t uart); From 0d451c00ba5f43254981d511c514f00f9f5c38b4 Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:03:16 +0000 Subject: [PATCH 3/7] [sw, test_framework] Flush the uart before and after the test This makes sure that bootrom logs don't interfer with tests. Also make sure that test logs are printed before the simulation is finished. Signed-off-by: Douglas Reis --- sw/device/lib/test_framework/main.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sw/device/lib/test_framework/main.c b/sw/device/lib/test_framework/main.c index b7167b2d5..0a8b4f6de 100644 --- a/sw/device/lib/test_framework/main.c +++ b/sw/device/lib/test_framework/main.c @@ -78,9 +78,15 @@ test_exception_handler(struct trap_registers *registers, struct trap_context *co void *dv_test_status = mocha_system_dv_test_status(); uart_init(console); + //Flush the uart + while (!uart_status_any(console, uart_status_txidle)) { + }; DEV_WRITE(dv_test_status, TEST_STATUS_IN_TEST); bool result = test_main(console); + //Flush the uart + while (!uart_status_any(console, uart_status_txidle)) { + }; test_exit(result); } From 313da1815bc45b410b31b8a190a6a0bbf14b20cb Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:05:06 +0000 Subject: [PATCH 4/7] [sw,uart] Refactor smoketest The test was sensitive to timing, when optimization was enabled it would fails as the loop back transmission would not have finished in time for checking. Signed-off-by: Douglas Reis --- sw/device/tests/uart/smoketest.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sw/device/tests/uart/smoketest.c b/sw/device/tests/uart/smoketest.c index b05b2cf18..241ad3b8a 100644 --- a/sw/device/tests/uart/smoketest.c +++ b/sw/device/tests/uart/smoketest.c @@ -3,26 +3,38 @@ // SPDX-License-Identifier: Apache-2.0 #include "hal/uart.h" +#include "runtime/print.h" #include #include -const char uart_loopback_test_string[] = "Test String"; +const static char uart_loopback_test_string[] = "Test String"; static bool loopback_test(uart_t uart) { + // Flush the uart + while (!uart_status_any(uart, uart_status_txidle)) { + }; + uart_loopback_set(uart, true, true); for (uint32_t idx = 0; idx < sizeof(uart_loopback_test_string); idx++) { uart_out(uart, uart_loopback_test_string[idx]); } + // Wait for the transmission to finish + while (!uart_status_any(uart, uart_status_txidle)) { + }; + uart_loopback_set(uart, false, false); bool res = true; for (uint32_t idx = 0; idx < sizeof(uart_loopback_test_string); idx++) { - if (uart_in(uart) != uart_loopback_test_string[idx]) { + while (uart_status_any(uart, uart_status_rxempty)) { + }; + char rx = uart_in(uart); + if (rx != uart_loopback_test_string[idx]) { + uprintf(uart, "Expected: %c, got: %c\n", rx, uart_loopback_test_string[idx]); res = false; break; } } - uart_loopback_set(uart, false, false); return res; } From 926cdf3a25469fdd5b8f7c990531c482d9a51b95 Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:20:24 +0000 Subject: [PATCH 5/7] [sw, spi_host] Add functions to read the status register Signed-off-by: Douglas Reis --- sw/device/lib/hal/spi_host.c | 11 +++++++++++ sw/device/lib/hal/spi_host.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/sw/device/lib/hal/spi_host.c b/sw/device/lib/hal/spi_host.c index 4ca1b8a28..560ad3952 100644 --- a/sw/device/lib/hal/spi_host.c +++ b/sw/device/lib/hal/spi_host.c @@ -25,3 +25,14 @@ uint32_t spi_host_read(spi_host_t spi_host) { return DEV_READ(spi_host + SPI_HOST_RXDATA_REG); } + +uint32_t spi_host_status(spi_host_t spi_host) +{ + return DEV_READ(spi_host + SPI_HOST_STATUS_REG); +} + +void spi_host_wait_for_idle(spi_host_t spi_host) +{ + while ((spi_host_status(spi_host) & SPI_HOST_STATUS_ACTIVE_MASK) != 0) { + }; +} diff --git a/sw/device/lib/hal/spi_host.h b/sw/device/lib/hal/spi_host.h index 5c806e5a0..aed807066 100644 --- a/sw/device/lib/hal/spi_host.h +++ b/sw/device/lib/hal/spi_host.h @@ -15,6 +15,7 @@ #define SPI_HOST_CONTROL_SPIEN_MASK (1u << 31) #define SPI_HOST_CONTROL_OUTPUTEN_MASK (1u << 29) #define SPI_HOST_STATUS_REG (0x14) +#define SPI_HOST_STATUS_ACTIVE_MASK (1u << 30) #define SPI_HOST_CONFIGOPTS_REG (0x18) #define SPI_HOST_CSID_REG (0x1C) #define SPI_HOST_COMMAND_REG (0x20) @@ -32,3 +33,5 @@ typedef void *spi_host_t; void spi_host_init(spi_host_t spi_host); void spi_host_write(spi_host_t spi_host, uint32_t data); uint32_t spi_host_read(spi_host_t spi_host); +uint32_t spi_host_status(spi_host_t spi_host); +void spi_host_wait_for_idle(spi_host_t spi_host); From 70d1d62d7c6a48f41825c24bcdc659c04b9fe976 Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:21:21 +0000 Subject: [PATCH 6/7] [sw, spi_host] Fix timing error in smoketest The error manifest when optimization is enabled Signed-off-by: Douglas Reis --- sw/device/tests/spi_host/smoketest.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sw/device/tests/spi_host/smoketest.c b/sw/device/tests/spi_host/smoketest.c index 658f22cdf..46ef6b0c2 100644 --- a/sw/device/tests/spi_host/smoketest.c +++ b/sw/device/tests/spi_host/smoketest.c @@ -16,6 +16,7 @@ bool test_main() spi_host = mocha_system_spi_host(); spi_host_init(spi_host); spi_host_write(spi_host, tx_data); + spi_host_wait_for_idle(spi_host); rx_data = spi_host_read(spi_host); return tx_data == rx_data; } From 06348c5f3b73d6f9911039cdcbef16f0524d3461 Mon Sep 17 00:00:00 2001 From: Douglas Reis Date: Wed, 13 May 2026 11:22:38 +0000 Subject: [PATCH 7/7] [sw, cmake] Enable optimization O1 This makes binaries smaller and faster to run tests Signed-off-by: Douglas Reis --- sw/cheri_toolchain.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sw/cheri_toolchain.cmake b/sw/cheri_toolchain.cmake index e084f1140..5d6df67f8 100644 --- a/sw/cheri_toolchain.cmake +++ b/sw/cheri_toolchain.cmake @@ -32,14 +32,14 @@ set(CMAKE_CXX_STANDARD_REQUIRED TRUE) set(LDS_DIR "${CMAKE_SOURCE_DIR}/device/lib/boot") string(CONCAT CMAKE_CXX_FLAGS_INIT - "-std=c++20 -O0 -g" + "-std=c++20 -O1 -g" " -ffreestanding -static" " -fno-builtin -fno-exceptions -fno-c++-static-destructors -fno-rtti" " -Wall -Wextra" ) string(CONCAT CMAKE_C_FLAGS_INIT - "-std=c99 -O0 -g" + "-std=c99 -O1 -g" " -ffreestanding -static" " -fno-builtin" " -Wall -Wextra"