diff options
Diffstat (limited to 'tools/src/exception.h')
| -rw-r--r-- | tools/src/exception.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tools/src/exception.h b/tools/src/exception.h new file mode 100644 index 0000000..786f38f --- /dev/null +++ b/tools/src/exception.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: MIT */ + +#ifndef __EXCEPTION_H__ +#define __EXCEPTION_H__ + +#define SIZEOF_EXC_INFO (64 * 8) + +#ifndef __ASSEMBLER__ + +#include <assert.h> +#include <stdint.h> + +#include "types.h" + +enum exc_guard_t { + GUARD_OFF = 0, + GUARD_SKIP, + GUARD_MARK, + GUARD_RETURN, + GUARD_TYPE_MASK = 0xff, + GUARD_SILENT = 0x100, +}; + +struct exc_info { + u64 regs[32]; + u64 spsr; + u64 elr; + u64 esr; + u64 far; + u64 afsr1; + u64 sp[3]; + u64 cpu_id; + u64 mpidr; + u64 elr_phys; + u64 far_phys; + u64 sp_phys; + void *extra; +}; +static_assert(sizeof(struct exc_info) <= SIZEOF_EXC_INFO, "Please increase SIZEOF_EXC_INFO"); +static_assert((sizeof(struct exc_info) & 15) == 0, "SIZEOF_EXC_INFO must be a multiple of 16"); + +extern volatile enum exc_guard_t exc_guard; +extern volatile int exc_count; + +void exception_initialize(void); +void exception_shutdown(void); + +void print_regs(u64 *regs, int el12); + +uint64_t el0_call(void *func, uint64_t a, uint64_t b, uint64_t c, uint64_t d); +uint64_t el1_call(void *func, uint64_t a, uint64_t b, uint64_t c, uint64_t d); + +#endif + +#endif |
