| // Copyright Microsoft and CHERIoT Contributors. |
| // SPDX-License-Identifier: MIT |
| |
| #pragma once |
| #include <compartment.h> |
| #include <errno.h> |
| #include <stdint.h> |
| |
| #ifdef SIMULATION |
| /** |
| * Exit simulation, reporting the error code given as the argument. |
| */ |
| [[cheri::interrupt_state(disabled)]] int __cheri_compartment("scheduler") |
| scheduler_simulation_exit(uint32_t code __if_cxx(= 0)); |
| #endif |
| |
| /** |
| * Exit the simulation, if we can, or fall back to an infinite loop. |
| */ |
| static inline void __attribute__((noreturn)) |
| simulation_exit(uint32_t code __if_cxx(= 0)) |
| { |
| #ifdef SIMULATION |
| /* |
| * This fails only if either we are out of (trusted) stack space for the |
| * cross-call or the platform is misconfigured. If either of those happen, |
| * fall back to infinite looping. |
| */ |
| (void)scheduler_simulation_exit(code); |
| #endif |
| |
| while (true) |
| { |
| yield(); |
| } |
| }; |