8
8
#include <zephyr/ztest_error_hook.h>
9
9
#include <cmsis_core.h>
10
10
11
+ /* size of stack area used by each thread */
12
+ #define STACKSIZE 1024
13
+
14
+ /* scheduling priority used by each thread */
15
+ #define PRIORITY 7
16
+
17
+ /* number of times to check if PAC keys were retained */
18
+ #define NUM_TRIALS 5
19
+
20
+ K_THREAD_STACK_DEFINE (pac_test_thread_stack_area , STACKSIZE );
21
+ static struct k_thread pac_test_thread ;
22
+
11
23
void test_arm_pacbti (void )
12
24
{
13
25
printf ("%s This should never have been called if BTI was enforced\n" , __func__ );
@@ -19,18 +31,18 @@ void test_arm_pacbti(void)
19
31
/* Without PAC this function would have returned to test_arm_pacbti() but with PAC enabled
20
32
* the AUT instruction should result in a USAGE FAULT since the `lr` was corrupted on stack.
21
33
*/
22
- __asm__ (".thumb\n"
23
- ".thumb_func\n"
24
- ".global corrupt_lr_on_stack\n"
25
- "corrupt_lr_on_stack:\n"
26
- " pacbti r12, lr, sp\n"
27
- " stmdb sp!, {ip, lr}\n"
28
- " ldr r0,=test_arm_pacbti\n"
29
- " str r0, [sp, #4]\n"
30
- " ldmia.w sp!, {ip, lr}\n"
31
- " aut r12, lr, sp\n"
32
- " bx lr\n" );
33
- void corrupt_lr_on_stack ();
34
+ __asm__(".thumb\n"
35
+ ".thumb_func\n"
36
+ ".global corrupt_lr_on_stack\n"
37
+ "corrupt_lr_on_stack:\n"
38
+ " pacbti r12, lr, sp\n"
39
+ " stmdb sp!, {ip, lr}\n"
40
+ " ldr r0,=test_arm_pacbti\n"
41
+ " str r0, [sp, #4]\n"
42
+ " ldmia.w sp!, {ip, lr}\n"
43
+ " aut r12, lr, sp\n"
44
+ " bx lr\n" );
45
+ void corrupt_lr_on_stack (void );
34
46
35
47
static int set_invalid_pac_key (void )
36
48
{
@@ -50,6 +62,23 @@ static int set_invalid_pac_key(void)
50
62
return 1 ;
51
63
}
52
64
65
+ static void pac_test_thread_entry_point (void * dummy1 , void * dummy2 , void * dummy3 )
66
+ {
67
+ ztest_set_fault_valid (true);
68
+
69
+ corrupt_lr_on_stack ();
70
+ }
71
+
72
+ ZTEST (arm_pacbti , test_arm_pac_corrupt_lr_in_userspace )
73
+ {
74
+ k_thread_create (& pac_test_thread , pac_test_thread_stack_area ,
75
+ K_THREAD_STACK_SIZEOF (pac_test_thread_stack_area ),
76
+ pac_test_thread_entry_point , NULL , NULL , NULL , PRIORITY , K_USER , K_FOREVER );
77
+
78
+ k_thread_start (& pac_test_thread );
79
+ k_thread_join (& pac_test_thread , K_FOREVER );
80
+ }
81
+
53
82
ZTEST (arm_pacbti , test_arm_pac_corrupt_lr )
54
83
{
55
84
ztest_set_fault_valid (true);
0 commit comments