1 /*
2  * Copyright (c) 2018 Intel Corporation.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_EXC_HANDLE_H_
8 #define ZEPHYR_INCLUDE_EXC_HANDLE_H_
9 
10 /*
11  * This is used by some architectures to define code ranges which may
12  * perform operations that could generate a CPU exception that should not
13  * be fatal. Instead, the exception should return but set the program
14  * counter to a 'fixup' memory address which will gracefully error out.
15  *
16  * For example, in the case where user mode passes in a C string via
17  * system call, the length of that string needs to be measured. A specially
18  * written assembly language version of strlen (arch_user_string_len)
19  * defines start and end symbols where the memory in the string is examined;
20  * if this generates a fault, jumping to the fixup symbol within the same
21  * function will return an error result to the caller.
22  *
23  * To ensure precise control of the state of registers and the stack pointer,
24  * these functions need to be written in assembly.
25  *
26  * The arch-specific fault handling code will define an array of these
27  * z_exc_handle structures and return from the exception with the PC updated
28  * to the fixup address if a match is found.
29  */
30 
31 struct z_exc_handle {
32 	void *start;
33 	void *end;
34 	void *fixup;
35 };
36 
37 #define Z_EXC_HANDLE(name) \
38 	{ name ## _fault_start, name ## _fault_end, name ## _fixup }
39 
40 #define Z_EXC_DECLARE(name)          \
41 	void name ## _fault_start(void); \
42 	void name ## _fault_end(void);   \
43 	void name ## _fixup(void)
44 
45 #endif /* ZEPHYR_INCLUDE_EXC_HANDLE_H_ */
46