Zephyr Project API  3.1.0
A Scalable Open Source RTOS
mem_protect.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017, 2020 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include <zephyr/zephyr.h>
8#include <ztest.h>
10#include <string.h>
11#include <stdlib.h>
12
13extern void test_permission_inheritance(void);
14extern void test_inherit_resource_pool(void);
15
16extern void test_mem_domain_setup(void);
17extern void test_mem_domain_valid_access(void);
18extern void test_mem_domain_invalid_access(void);
19extern void test_mem_domain_no_writes_to_ro(void);
22extern void test_mem_domain_boot_threads(void);
23extern void test_mem_domain_migration(void);
24extern void test_mem_domain_init_fail(void);
25extern void test_mem_domain_remove_part_fail(void);
26extern void test_mem_part_add_error_null(void);
27extern void test_mem_part_add_error_zerosize(void);
28extern void test_mem_part_error_wraparound(void);
30
34
35extern void test_kobject_access_grant(void);
36extern void test_syscall_invalid_kobject(void);
38extern void test_kobject_revoke_access(void);
39extern void test_kobject_grant_access_kobj(void);
41extern void test_kobject_release_from_user(void);
42extern void test_kobject_access_all_grant(void);
49extern void test_create_new_thread_from_user(void);
60extern void test_mem_part_overlap(void);
61extern void test_mem_part_assert_add_overmax(void);
62extern void test_kobject_access_grant_error(void);
66extern void test_kobject_invalid(void);
67extern void test_kobject_free_error(void);
68extern void test_kobject_init_error(void);
69extern void test_kobj_create_out_of_memory(void);
70extern void test_thread_alloc_out_of_idx(void);
71extern void test_alloc_kobjects(void);
72extern void test_kobject_perm_error(void);
73extern void test_all_kobjects_str(void);
74
75
76/* Flag needed to figure out if the fault was expected or not. */
77extern volatile bool valid_fault;
78
79static inline void set_fault_valid(bool valid)
80{
81 valid_fault = valid;
82 /* Put a barrier here, such that no instructions get ordered by the
83 * compiler before we set valid_fault. This can happen with expansion
84 * of inline syscall invocation functions.
85 */
86 compiler_barrier();
87}
88
89/* For inherit.c */
90#define INHERIT_STACK_SIZE CONFIG_MAIN_STACK_SIZE
91#define SEMAPHORE_MAX_COUNT (10)
92#define SEMAPHORE_INIT_COUNT (0)
93#define SYNC_SEM_MAX_COUNT (1)
94#define SYNC_SEM_INIT_COUNT (0)
95#define MSG_Q_SIZE (10)
96#define MSG_Q_MAX_NUM_MSGS (10)
97#define MSG_Q_ALIGN (2)
98#define PRIORITY 5
99#define STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACK_SIZE)
100#define BLK_SIZE_MIN 16
101#define BLK_SIZE_MAX 64
102#define BLK_NUM_MIN 8
103#define BLK_NUM_MAX 2
104#define BLK_ALIGN BLK_SIZE_MIN
105#define SEM_INIT_VAL (0U)
106#define SEM_MAX_VAL (1U)
107
108/* For mem_domain.c */
109#define MEM_DOMAIN_STACK_SIZE CONFIG_MAIN_STACK_SIZE
110#define MEM_PARTITION_INIT_NUM (1)
111#define BLK_SIZE_MIN_MD 8
112#define BLK_SIZE_MAX_MD 16
113#define BLK_NUM_MAX_MD 4
114#define BLK_ALIGN_MD BLK_SIZE_MIN_MD
115#define DESC_SIZE sizeof(struct sys_mem_pool_block)
116#define STACK_SIZE_MD (512 + CONFIG_TEST_EXTRA_STACK_SIZE)
117#define PRIORITY_MD 5
118
119#if defined(CONFIG_X86)
120#define MEM_REGION_ALLOC (4096)
121#elif defined(CONFIG_ARC)
122#define MEM_REGION_ALLOC (Z_ARC_MPU_ALIGN)
123#elif defined(CONFIG_ARM64)
124#define MEM_REGION_ALLOC (4096)
125#elif defined(CONFIG_ARM)
126#define MEM_REGION_ALLOC (Z_THREAD_MIN_STACK_ALIGN)
127#elif defined(CONFIG_RISCV)
128#define MEM_REGION_ALLOC (4)
129#else
130#error "Test suite not compatible for the given architecture"
131#endif
132#define MEM_DOMAIN_ALIGNMENT __aligned(MEM_REGION_ALLOC)
133
134/* for kobject.c */
135#define KOBJECT_STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACK_SIZE)
136
137
138
139#if (defined(CONFIG_X86_64) || defined(CONFIG_ARM64) || \
140 (defined(CONFIG_RISCV) && defined(CONFIG_64BIT)))
141#define TEST_HEAP_SIZE (2 << CONFIG_MAX_THREAD_BYTES) * 1024
142#define MAX_OBJ 512
143#else
144#define TEST_HEAP_SIZE (2 << CONFIG_MAX_THREAD_BYTES) * 256
145#define MAX_OBJ 256
146#endif
147
148#ifndef _TEST_SYSCALLS_H_
149#define _TEST_SYSCALLS_H_
150
151__syscall struct k_heap *ret_resource_pool_ptr(void);
152
153#include <syscalls/mem_protect.h>
154
155#endif /* _TEST_SYSCALLS_H_ */
void test_macros_obtain_names_data_bss(void)
void test_mem_domain_remove_part_fail(void)
Definition: mem_domain.c:489
void test_kobject_perm_error(void)
Test grant access failed in user mode.
Definition: kobject.c:1357
void test_mem_domain_boot_threads(void)
Show that boot threads belong to the default memory domain.
Definition: mem_domain.c:281
void test_thread_has_residual_permissions(void)
Test access permission of a terminated thread.
Definition: kobject.c:451
void test_mem_part_error_wraparound(void)
Test error case of memory partition address wraparound.
Definition: mem_domain.c:569
void test_create_new_higher_prio_thread_from_user(void)
Thread creation with priority is higher than current thread.
Definition: kobject.c:975
void test_kobject_access_invalid_kobject(void)
Object validation checks.
Definition: kobject.c:507
void test_mem_part_add_error_zerosize(void)
Test error case of adding zero sized memory partition fail.
Definition: mem_domain.c:547
void test_kobject_revoke_access(void)
Test access revoke.
Definition: kobject.c:220
void test_mem_domain_invalid_access(void)
Show that a user thread can't touch partitions not in its domain.
Definition: mem_domain.c:169
void test_create_new_thread_from_user(void)
Test thread create from a user thread and check permissions.
Definition: kobject.c:639
void test_thread_alloc_out_of_idx(void)
Definition: kobject.c:1207
void test_mem_domain_no_writes_to_ro(void)
Show that a read-only partition can't be written to.
Definition: mem_domain.c:181
void test_mem_part_assert_add_overmax(void)
Test system assert when adding memory partitions more than possible.
Definition: mem_domain.c:443
void test_kobject_grant_access_kobj(void)
Test access revoke.
Definition: kobject.c:267
void test_kobject_access_all_grant_error(void)
Test grant access to all the kobject for thread.
Definition: kobject.c:129
void test_create_new_invalid_prio_thread_from_user(void)
Create a new thread whose priority is invalid.
Definition: kobject.c:1022
void test_kobject_access_all_grant(void)
Test supervisor thread grants kernel objects all access public status.
Definition: kobject.c:402
void test_kobject_access_grant_to_invalid_thread(void)
Test grant access to a valid kobject but invalid thread id.
Definition: kobject.c:486
void test_kobject_access_grant_error(void)
Test grant access of given NULL kobject.
Definition: kobject.c:66
void test_permission_inheritance(void)
Test object permission inheritance except of the parent thread object.
Definition: inherit.c:105
void test_thread_without_kobject_permission(void)
Test user thread can access a k_object without grant.
Definition: kobject.c:189
void test_mem_domain_migration(void)
Definition: mem_domain.c:331
static void set_fault_valid(bool valid)
Definition: mem_protect.h:79
void test_mem_part_remove_error_zerosize(void)
Test error case of removing memory partition fail.
Definition: mem_domain.c:595
void test_alloc_kobjects(void)
Test kernel object allocation.
Definition: kobject.c:1259
void test_mem_part_assign_bss_vars_zero(void)
void test_kobject_init_error(void)
Test alloc an invalid kernel object.
Definition: kobject.c:1141
void test_kobject_access_grant_error_user(void)
Test grant access of given NULL thread in usermode.
Definition: kobject.c:81
void test_mem_part_add_error_null(void)
Test error case of adding null memory partition fail.
Definition: mem_domain.c:525
void test_all_kobjects_str(void)
Test get all kernel object list.
Definition: kobject.c:1396
void test_create_new_thread_from_user_no_access_stack(void)
Test creates new thread from usermode without stack access.
Definition: kobject.c:733
void test_kobject_free_error(void)
Test free an invalid kernel object.
Definition: kobject.c:1114
void test_create_new_supervisor_thread_from_user(void)
Test to create a new supervisor thread from user.
Definition: kobject.c:885
void test_mem_domain_setup(void)
Definition: mem_domain.c:50
void test_mem_part_overlap(void)
Test system assert when new partition overlaps the existing partition.
Definition: mem_domain.c:403
volatile bool valid_fault
Definition: common.c:9
struct k_heap * ret_resource_pool_ptr(void)
void test_mem_domain_api_supervisor_only(void)
Test access memory domain APIs allowed to supervisor threads only.
Definition: mem_domain.c:263
void test_kobject_grant_access_kobj_invalid(void)
Test access grant between threads.
Definition: kobject.c:313
void test_kobject_access_grant(void)
Test access to a invalid semaphore who's address is NULL.
Definition: kobject.c:41
void test_mem_domain_init_fail(void)
Test error case of initializing memory domain fail.
Definition: mem_domain.c:503
void test_mem_domain_remove_add_partition(void)
Show that adding/removing partitions works.
Definition: mem_domain.c:196
void test_inherit_resource_pool(void)
Test child thread inherits parent's thread resource pool.
Definition: inherit.c:181
void test_kobject_release_from_user(void)
Test revoke permission of a k_object from userspace.
Definition: kobject.c:347
void test_krnl_obj_static_alloc_build_time(void)
void test_kobj_create_out_of_memory(void)
Test kernel object until out of memory.
Definition: kobject.c:1164
void test_kobject_reinitialize_thread_kobj(void)
Test to reinitialize the k_thread object.
Definition: kobject.c:593
void test_access_kobject_without_init_with_access(void)
Test syscall on a kobject which is not initialized and has access.
Definition: kobject.c:550
void test_new_user_thread_with_in_use_stack_obj(void)
Test create new user thread from a user thread with in-use stack obj.
Definition: kobject.c:689
void test_mark_thread_exit_uninitialized(void)
Test when thread exits, kernel marks stack objects uninitialized.
Definition: kobject.c:1065
void test_kobject_access_grant_error_user_null(void)
Test grant access of given NULL kobject in usermode.
Definition: kobject.c:112
void test_create_new_thread_from_user_invalid_stacksize(void)
Test to validate user thread spawning with stack overflow.
Definition: kobject.c:777
void test_access_kobject_without_init_access(void)
Object validation checks without init access.
Definition: kobject.c:525
void test_create_new_thread_from_user_huge_stacksize(void)
Test to check stack overflow from user thread.
Definition: kobject.c:831
void test_create_new_essential_thread_from_user(void)
Create a new essential thread from user.
Definition: kobject.c:929
void test_kobject_invalid(void)
Test release and access grant an invalid kobject.
Definition: kobject.c:373
void test_mem_part_auto_determ_size(void)
void test_mem_domain_valid_access(void)
Check if the mem_domain is configured and accessible for userspace.
Definition: mem_domain.c:158
void test_syscall_invalid_kobject(void)
Test syscall can take a different type of kobject.
Definition: kobject.c:158
Definition: kernel.h:5144
Zephyr Testsuite.