soundstream: cleanups With an updated toolchain we can eliminate the heap allocations: - allocate the sample buffer in .bss - allocate the sample filter buffers on the stack (sized at 4KiB) - mark the soundstream compartment with CHERIOT_NO_AMBIENT_MALLOC now that we no longer use the heap - replace the one use of CHECK with Debug::Assert Bug: 330741645 Bypass-Presubmit-Reason: no sencha presubmit tests Change-Id: I9b6df0a6cca5d12547610623ac0638636fd37ae1
diff --git a/sw/device/cheriot/soundstream/soundstream.cc b/sw/device/cheriot/soundstream/soundstream.cc index 45dd2a9..6d6c06f 100644 --- a/sw/device/cheriot/soundstream/soundstream.cc +++ b/sw/device/cheriot/soundstream/soundstream.cc
@@ -14,19 +14,6 @@ * limitations under the License. */ -// Data structures that hold audio samples are allocated on the heap -// because they are too big (for now) for .data/.bss. We use calloc -// for this and need to override the default quota (4K) to satisfy our -// large'ish requests. -//#define kSamples (5 * 16000) -#define kSamples (5000) // NB: reduced sample count for slow renode -#define kFilterSamples (256) -#define roundup(a, b) (((a) + (b) - 1) / (b)) * (b) -#define MALLOC_QUOTA \ - roundup( \ - (kSamples * sizeof(int32_t)) + 2 * (kFilterSamples * sizeof(int16_t)), \ - 4096) - #include "soundstream.h" #include <fail-simulator-on-error.h> @@ -39,10 +26,12 @@ /// Expose debugging features unconditionally for this compartment. using Debug = ConditionalDebug<true, "SOUNDSTREAM">; -#include "compat.h" - #define ABS(x) (x > 0 ? x : -x) +//#define kSamples (5 * 16000) +#define kSamples (2000) // NB: reduced sample count for slow renode +#define kFilterSamples (256) + void __cheri_compartment("soundstream") entry(void) { Debug::log("soundstream (Thread {})", thread_id_get()); @@ -54,29 +43,15 @@ i2s_irq_acknowledge_all(); i2s_irq_set_enabled(kI2sIrqRxWatermark, /*enabled=*/true); - // NB: sample buffers are temporarily allocated from the heap because - // the toolchain does not support large'ish data structures. Support - // has been committed upstream but not yet brought in. - - // XXX calloc returns 0xffffffff (v:0 0xfffffe00-0xfffffe00 l:0x0 o:0x0 p: - - // ------ -- ---) on failure so cannot check against NULL - // int16_t samples_left[kFilterSamples] = {0}; - // int16_t samples_right[kFilterSamples] = {0}; - int16_t* samples_left = (int16_t*)calloc(sizeof(int16_t), kFilterSamples); - Debug::Assert(__builtin_cheri_length_get(samples_left) > 0, - "samples_left allocation failed {}", samples_left); - int16_t* samples_right = (int16_t*)calloc(sizeof(int16_t), kFilterSamples); - Debug::Assert(__builtin_cheri_length_get(samples_right) > 0, - "samples_right allocation failed {}", samples_right); + // NB: the stack is 4KiB so this uses 1/4 of it + int16_t samples_left[kFilterSamples] = {0}; + int16_t samples_right[kFilterSamples] = {0}; size_t index_left = 0; size_t index_right = 0; int32_t total_left = 0; int32_t total_right = 0; - // static int32_t samples[kSamples]; - int32_t* samples = (int32_t*)calloc(sizeof(int32_t), kSamples); - Debug::Assert(__builtin_cheri_length_get(samples) > 0, - "Sample allocation failed {}", samples); + static int32_t samples[kSamples]; memset(samples, 0xa5, sizeof(int32_t) * kSamples); Debug::log("Setup complete"); @@ -190,7 +165,7 @@ ml_top_wait_for_finish(); ml_top_get_output_header(&header); - CHECK(header.length == sizeof(result_buffer), "Unexpected ML result size"); + Debug::Assert(header.length == sizeof(result_buffer), "Unexpected ML result size"); ml_top_get_output_data(&header, result_buffer); encode((const unsigned char*)result_buffer, sizeof(result_buffer),
diff --git a/sw/device/cheriot/soundstream/xmake.lua b/sw/device/cheriot/soundstream/xmake.lua index 5ab5325..0872683 100644 --- a/sw/device/cheriot/soundstream/xmake.lua +++ b/sw/device/cheriot/soundstream/xmake.lua
@@ -68,6 +68,7 @@ add_files("soundstream.cc", "encode.cc") add_files(path.join(matcha_dir, "hw/top_matcha/sw/autogen/top_matcha.c")); add_includedirs(matcha_dir, matcha_gen_dir, opentitan_dir) + add_defines("CHERIOT_NO_AMBIENT_MALLOC") -- Firmware image. firmware("soundstream-firmware")