From 00129ac87205bfdf52a03e1053923ccf498501d4 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Tue, 20 Jul 2021 19:23:20 +0100 Subject: Fix battery_bench bug by using a static buffer for stack Since battery_bench is a TSR (terminate & stay resident) plugin it cannot allocate the plugin buffer -- various parts of the Rockbox core make use of it as temporary storage space. The buffer was used for stack space so this generated false 'Stkov' panics when one of those in-core users overwrote the buffer. The default stack size of 1kb is a bit small, so use 4x the default size to be on the safe side. This also fixes a minor issue where trying to view OS stack usage while battery_bench was running would cause audio dropouts, due to scanning the possibly huge stack with IRQs disabled. Change-Id: I2e6b76f9946db9090c1af61f7aa0a0dac0698c20 --- apps/plugins/battery_bench.c | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) (limited to 'apps/plugins') diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index 6c477cbd09..53931d1930 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -30,7 +30,7 @@ #define EV_EXIT 1337 /* seems to work with 1300, but who knows... */ -#define MIN_THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200 +#define THREAD_STACK_SIZE 4*DEFAULT_STACK_SIZE #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ (CONFIG_KEYPAD == IRIVER_H300_PAD) @@ -279,8 +279,7 @@ static struct batt_info static struct { unsigned int id; /* worker thread id */ - long *stack; - ssize_t stacksize; + long stack[THREAD_STACK_SIZE / sizeof(long)]; } gThread; static struct event_queue thread_q SHAREDBSS_ATTR; @@ -607,25 +606,9 @@ enum plugin_status plugin_start(const void* parameter) } rb->memset(&gThread, 0, sizeof(gThread)); - void *buf; - size_t buf_size; - buf = rb->plugin_get_buffer(&buf_size); - ALIGN_BUFFER(buf, buf_size, sizeof(long)); - rb->memset(buf, 0, buf_size); - - gThread.stacksize = buf_size; - gThread.stack = (long *) buf; - - if (gThread.stacksize < MIN_THREAD_STACK_SIZE) - { - rb->splash(HZ*2, "Out of memory"); - gThread.id = UINT_MAX; - return PLUGIN_ERROR; - } - rb->queue_init(&thread_q, true); /* put the thread's queue in the bcast list */ - gThread.id = rb->create_thread(thread, gThread.stack, - gThread.stacksize, 0, "Battery Benchmark" + gThread.id = rb->create_thread(thread, gThread.stack, sizeof(gThread.stack), + 0, "Battery Benchmark" IF_PRIO(, PRIORITY_BACKGROUND) IF_COP(, CPU)); -- cgit v1.2.3