46 lines
1.5 KiB
C
46 lines
1.5 KiB
C
|
/*
|
||
|
* Copyright (c) 2018 Intel Corporation.
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
#ifndef _ZEPHYR_EXC_HANDLE_H_
|
||
|
#define _ZEPHYR_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_EXC_HANDLE_H_ */
|