This test launches several threads. Only last thread will overflow the stack and an mpu exception will occur. The other threads are regulary suspended, this triggers access to kthread structure. This tests is failed on st and nxp platform, if 32 bytes alignement is not set. Signed-off-by: Michel Jaouen <michel.jaouen@st.com>
86 lines
1.8 KiB
C
86 lines
1.8 KiB
C
/* main.c - Hello World demo */
|
|
|
|
/*
|
|
* Copyright (c) 2012-2014 Wind River Systems, Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr.h>
|
|
#include <misc/printk.h>
|
|
|
|
/* size of stack area used by each thread */
|
|
#define STACKSIZE 512
|
|
|
|
/* scheduling priority used by each thread */
|
|
#define PRIORITY 7
|
|
|
|
/* delay between greetings (in ms) */
|
|
#define SLEEPTIME 500
|
|
|
|
/* delay between greetings (in ms) */
|
|
#define SCHEDTIME 30
|
|
|
|
/* Focaccia tastes better than DEEDBEEF ;-) */
|
|
#define STACK_GUARD_CANARY 0xF0CACC1A
|
|
|
|
struct stack_guard_buffer {
|
|
/* Make sure canary is not optimized by the compiler */
|
|
struct k_thread thread;
|
|
volatile u32_t canary;
|
|
K_THREAD_STACK_MEMBER(stack, STACKSIZE);
|
|
};
|
|
|
|
#define LAST_THREAD_NUM 6
|
|
struct stack_guard_buffer buf[LAST_THREAD_NUM+1];
|
|
|
|
u32_t recursive_loop(u32_t counter, int num, void *dummy)
|
|
{
|
|
|
|
if (buf[num].canary != STACK_GUARD_CANARY) {
|
|
printk("Canary = 0x%08x\tTest not passed.\n", buf[num].canary);
|
|
|
|
while (1) {
|
|
k_sleep(SLEEPTIME);
|
|
}
|
|
}
|
|
counter++;
|
|
if (dummy == 0)
|
|
return counter;
|
|
return recursive_loop(counter, num, dummy)
|
|
+recursive_loop(counter, num, dummy);
|
|
}
|
|
|
|
|
|
/* stack_guard_thread is a dynamic thread */
|
|
void stack_guard_thread(void *dummy1, void *dummy2, void *dummy3)
|
|
{
|
|
ARG_UNUSED(dummy1);
|
|
recursive_loop(0, (int)dummy1, dummy2);
|
|
|
|
}
|
|
|
|
void main(void)
|
|
{
|
|
int i;
|
|
bool failed;
|
|
|
|
printk("STACK_ALIGN 0x%x\n", STACK_ALIGN);
|
|
for (i = 0; i <= LAST_THREAD_NUM; i++) {
|
|
buf[i].canary = STACK_GUARD_CANARY;
|
|
failed = (i == LAST_THREAD_NUM) ? true : false;
|
|
if (failed) {
|
|
printk("MPU STACK GUARD Test\n");
|
|
printk("Canary Initial Value = 0x%x threads %p\n",
|
|
buf[i].canary, &buf[i].thread);
|
|
}
|
|
|
|
/* create stack_guard_thread */
|
|
k_thread_create(&buf[i].thread, buf[i].stack,
|
|
K_THREAD_STACK_SIZEOF(buf[i].stack),
|
|
stack_guard_thread, (void *)i,
|
|
(void *)failed, NULL, PRIORITY, 0, K_NO_WAIT);
|
|
}
|
|
|
|
}
|