| /* |
| * Copyright 2017, Data61 |
| * Commonwealth Scientific and Industrial Research Organisation (CSIRO) |
| * ABN 41 687 119 230. |
| * |
| * This software may be distributed and modified according to the terms of |
| * the BSD 2-Clause license. Note that NO WARRANTY is provided. |
| * See "LICENSE_BSD2.txt" for details. |
| * |
| * @TAG(DATA61_BSD) |
| */ |
| |
| #pragma once |
| |
| #include <utils/attribute.h> |
| |
| /** Execute an undefined machine instruction. |
| * |
| * This function is designed to be used as a last resort for error handling, when the usual options |
| * are not possible (e.g. serial output is unavailable). It is guaranteed to generate an exception |
| * during instruction decoding, that can be propagated to a monitor (a fault handler or the kernel). |
| * You can think of it as forcing a `SIGILL`. |
| * |
| * It is forced inline, so you can call it even when you don't have a stack. Though morally it |
| * doesn't return, it is not marked as such so the compiler will not remove following code. It is |
| * possible that the caller's monitor may want to handle the fault by bumping the instruction |
| * pointer to ignore the error and continue. |
| * |
| * At first glance, it might seem as if `__builtin_trap` already serves this purpose. However, its |
| * semantics are vague enough to make it near-useless in a portable embedded context. E.g. on x86 |
| * it emits an instruction that generates an exception, but on ARM it calls `abort`. |
| */ |
| static inline void utils_undefined_instruction(void) ALWAYS_INLINE; |
| |
| #include <utils/arch/ud.h> |