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