1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <tests/test.h>
8 #if CONFIG_STACK_SIZE == 0
9 #define STACK_SIZE 0x1000
11 #define STACK_SIZE CONFIG_STACK_SIZE
14 /* Value used for stack initialization. Change if implementation changes. */
15 #define STACK_GUARD_VALUE 0xDEADBEEF
17 __weak
extern u8 _stack
[];
18 __weak
extern u8 _estack
[];
19 TEST_REGION(stack
, STACK_SIZE
);
22 static void fill_stack(u32 value
)
24 u32
*stack
= (u32
*)_stack
;
25 for (size_t i
= 0; i
< STACK_SIZE
/ sizeof(u32
); ++i
)
29 /* Fill stack region with guard value. */
30 static void clean_stack(void)
32 fill_stack(STACK_GUARD_VALUE
);
35 static int setup_stack_test(void **state
)
37 void *top_of_stack
= _stack
+ sizeof(_stack
);
40 *state
= top_of_stack
;
45 static void test_empty_stack(void **state
)
47 void *top_of_stack
= *state
;
49 /* Expect success when checking empty stack. */
50 assert_int_equal(0, checkstack(top_of_stack
, 0));
53 static void test_almost_full_stack(void **state
)
55 void *top_of_stack
= *state
;
56 u32
*stack
= (u32
*)_stack
;
58 /* Fill stack with random value except last word */
59 for (size_t i
= 1; i
< STACK_SIZE
/ sizeof(u32
); ++i
)
60 stack
[i
] = 0xAA11FF44;
62 /* Expect success when checking almost-full stack,
63 because last guard value is present */
64 assert_int_equal(0, checkstack(top_of_stack
, 0));
67 static void test_full_stack(void **state
)
69 void *top_of_stack
= *state
;
71 /* Fill stack with value different than stack guard */
72 fill_stack(0x600DB015);
74 /* Expect failure when checking full stack as absence of guard value at the end of
75 the stack indicates stack overrun. */
76 expect_assert_failure(checkstack(top_of_stack
, 0));
79 static void test_partialy_filled_stack(void **state
)
81 void *top_of_stack
= *state
;
82 u32
*stack
= (u32
*)_stack
;
83 size_t i
= STACK_SIZE
/ sizeof(u32
) / 2;
85 for (; i
< STACK_SIZE
/ sizeof(u32
); ++i
)
86 stack
[i
] = 0x4321ABDC + i
;
88 /* Expect success when checking partially-filled stack,
89 because only part of stack is filled with non-guard value. */
90 assert_int_equal(0, checkstack(top_of_stack
, 0));
93 static void test_alternately_filled_stack(void **state
)
95 void *top_of_stack
= *state
;
96 u32
*stack
= (u32
*)_stack
;
99 for (i
= 0; i
< STACK_SIZE
/ sizeof(u32
); i
+= 2)
100 stack
[i
] = STACK_GUARD_VALUE
;
102 for (i
= 1; i
< STACK_SIZE
/ sizeof(u32
); i
+= 2)
103 stack
[i
] = 0x42420707;
105 assert_int_equal(0, checkstack(top_of_stack
, 0));
108 static void test_incorrectly_initialized_stack(void **state
)
110 void *top_of_stack
= *state
;
111 u32
*stack
= (u32
*)_stack
;
113 /* Remove last stack guard value */
114 stack
[0] = 0xFF00FF11;
116 /* Expect failure when there is no last stack guard value even if no other value was
118 expect_assert_failure(checkstack(top_of_stack
, 0));
123 const struct CMUnitTest tests
[] = {
124 cmocka_unit_test_setup(test_empty_stack
, setup_stack_test
),
125 cmocka_unit_test_setup(test_almost_full_stack
, setup_stack_test
),
126 cmocka_unit_test_setup(test_full_stack
, setup_stack_test
),
127 cmocka_unit_test_setup(test_partialy_filled_stack
, setup_stack_test
),
128 cmocka_unit_test_setup(test_alternately_filled_stack
, setup_stack_test
),
129 cmocka_unit_test_setup(test_incorrectly_initialized_stack
, setup_stack_test
),
132 return cb_run_group_tests(tests
, NULL
, NULL
);