Line data Source code
1 0 : /*
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_ */
|