/* * Copyright (c) 2018 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_EXC_HANDLE_H_ #define ZEPHYR_INCLUDE_EXC_HANDLE_H_ /* * This is used by some architectures to define code ranges which may * perform operations that could generate a CPU exception that should not * be fatal. Instead, the exception should return but set the program * counter to a 'fixup' memory address which will gracefully error out. * * For example, in the case where user mode passes in a C string via * system call, the length of that string needs to be measured. A specially * written assembly language version of strlen (z_arch_user_string_len) * defines start and end symbols where the memory in the string is examined; * if this generates a fault, jumping to the fixup symbol within the same * function will return an error result to the caller. * * To ensure precise control of the state of registers and the stack pointer, * these functions need to be written in assembly. * * The arch-specific fault handling code will define an array of these * z_exc_handle structures and return from the exception with the PC updated * to the fixup address if a match is found. */ struct z_exc_handle { void *start; void *end; void *fixup; }; #define Z_EXC_HANDLE(name) \ { &name ## _fault_start, &name ## _fault_end, &name ## _fixup } #define Z_EXC_DECLARE(name) \ extern void (*name ## _fault_start)(void); \ extern void (*name ## _fault_end)(void); \ extern void (*name ## _fixup)(void) #endif /* ZEPHYR_INCLUDE_EXC_HANDLE_H_ */