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_ */