blob: 930a1e6bafd431a6c52f6f9a27a096f5af81a3eb [file] [log] [blame]
/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <ztest.h>
#include <zephyr.h>
#include <errno.h>
/**
* @brief Test the thread context
*
* @defgroup kernel_threadcontext_tests Thread Context Tests
*
* @ingroup all_tests
*
* @{
* @}
*/
#define N_THREADS 2
#define STACK_SIZE (384 + CONFIG_TEST_EXTRA_STACKSIZE)
static K_THREAD_STACK_ARRAY_DEFINE(stacks, N_THREADS, STACK_SIZE);
static struct k_thread threads[N_THREADS];
static int errno_values[N_THREADS + 1] = {
0xbabef00d,
0xdeadbeef,
0xabad1dea,
};
struct result {
void *q;
int pass;
};
struct result result[N_THREADS];
struct k_fifo fifo;
static void errno_thread(void *_n, void *_my_errno, void *_unused)
{
int n = POINTER_TO_INT(_n);
int my_errno = POINTER_TO_INT(_my_errno);
errno = my_errno;
k_sleep(30 - (n * 10));
if (errno == my_errno) {
result[n].pass = 1;
}
zassert_equal(errno, my_errno, NULL);
k_fifo_put(&fifo, &result[n]);
}
/**
* @brief Verify thread context
*
* @ingroup kernel_threadcontext_tests
*
* @details Check whether variable value per-thread are saved during
* context switch
*/
void test_thread_context(void)
{
int rv = TC_PASS, test_errno;
k_fifo_init(&fifo);
errno = errno_values[N_THREADS];
test_errno = errno;
for (int ii = 0; ii < N_THREADS; ii++) {
result[ii].pass = TC_FAIL;
}
/**TESTPOINT: thread- threads stacks are separate */
for (int ii = 0; ii < N_THREADS; ii++) {
k_thread_create(&threads[ii], stacks[ii], STACK_SIZE,
errno_thread, INT_TO_POINTER(ii),
INT_TO_POINTER(errno_values[ii]), NULL,
K_PRIO_PREEMPT(ii + 5), 0, K_NO_WAIT);
}
for (int ii = 0; ii < N_THREADS; ii++) {
struct result *p = k_fifo_get(&fifo, 100);
if (!p || !p->pass) {
rv = TC_FAIL;
}
}
zassert_equal(errno, test_errno, NULL);
if (errno != errno_values[N_THREADS]) {
rv = TC_FAIL;
}
}