summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2021-07-20 19:23:20 +0100
committerAidan MacDonald <amachronic@protonmail.com>2021-07-22 13:50:26 +0000
commit00129ac87205bfdf52a03e1053923ccf498501d4 (patch)
tree4739b416dfe5e4f1f4807fa1eb2d65480c7e3ff0 /apps/plugins
parentf0e3a36fe4b06627d2c7293f42ede38944ff162c (diff)
downloadrockbox-00129ac87205bfdf52a03e1053923ccf498501d4.tar.gz
rockbox-00129ac87205bfdf52a03e1053923ccf498501d4.zip
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
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/battery_bench.c25
1 files changed, 4 insertions, 21 deletions
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 @@
30#define EV_EXIT 1337 30#define EV_EXIT 1337
31 31
32/* seems to work with 1300, but who knows... */ 32/* seems to work with 1300, but who knows... */
33#define MIN_THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200 33#define THREAD_STACK_SIZE 4*DEFAULT_STACK_SIZE
34 34
35#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 35#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
36 (CONFIG_KEYPAD == IRIVER_H300_PAD) 36 (CONFIG_KEYPAD == IRIVER_H300_PAD)
@@ -279,8 +279,7 @@ static struct batt_info
279static struct 279static struct
280{ 280{
281 unsigned int id; /* worker thread id */ 281 unsigned int id; /* worker thread id */
282 long *stack; 282 long stack[THREAD_STACK_SIZE / sizeof(long)];
283 ssize_t stacksize;
284} gThread; 283} gThread;
285 284
286static struct event_queue thread_q SHAREDBSS_ATTR; 285static struct event_queue thread_q SHAREDBSS_ATTR;
@@ -607,25 +606,9 @@ enum plugin_status plugin_start(const void* parameter)
607 } 606 }
608 607
609 rb->memset(&gThread, 0, sizeof(gThread)); 608 rb->memset(&gThread, 0, sizeof(gThread));
610 void *buf;
611 size_t buf_size;
612 buf = rb->plugin_get_buffer(&buf_size);
613 ALIGN_BUFFER(buf, buf_size, sizeof(long));
614 rb->memset(buf, 0, buf_size);
615
616 gThread.stacksize = buf_size;
617 gThread.stack = (long *) buf;
618
619 if (gThread.stacksize < MIN_THREAD_STACK_SIZE)
620 {
621 rb->splash(HZ*2, "Out of memory");
622 gThread.id = UINT_MAX;
623 return PLUGIN_ERROR;
624 }
625
626 rb->queue_init(&thread_q, true); /* put the thread's queue in the bcast list */ 609 rb->queue_init(&thread_q, true); /* put the thread's queue in the bcast list */
627 gThread.id = rb->create_thread(thread, gThread.stack, 610 gThread.id = rb->create_thread(thread, gThread.stack, sizeof(gThread.stack),
628 gThread.stacksize, 0, "Battery Benchmark" 611 0, "Battery Benchmark"
629 IF_PRIO(, PRIORITY_BACKGROUND) 612 IF_PRIO(, PRIORITY_BACKGROUND)
630 IF_COP(, CPU)); 613 IF_COP(, CPU));
631 614