kmc-solid: Use abort
to abort a program
The current implementation uses a `hlt` instruction, which is the most direct way to notify a connected debugger but is not the most flexible way. This commit changes it to a call to the `abort` libc function, making it possible for a system designer to override its behavior as they see fit.
This commit is contained in:
parent
1f7fb6413d
commit
9d1f82ebfc
@ -38,12 +38,11 @@ pub unsafe extern "C-unwind" fn __rust_start_panic(_payload: *mut &mut dyn BoxMe
|
|||||||
abort();
|
abort();
|
||||||
|
|
||||||
cfg_if::cfg_if! {
|
cfg_if::cfg_if! {
|
||||||
if #[cfg(unix)] {
|
if #[cfg(any(unix, target_os = "solid_asp3"))] {
|
||||||
unsafe fn abort() -> ! {
|
unsafe fn abort() -> ! {
|
||||||
libc::abort();
|
libc::abort();
|
||||||
}
|
}
|
||||||
} else if #[cfg(any(target_os = "hermit",
|
} else if #[cfg(any(target_os = "hermit",
|
||||||
target_os = "solid_asp3",
|
|
||||||
all(target_vendor = "fortanix", target_env = "sgx")
|
all(target_vendor = "fortanix", target_env = "sgx")
|
||||||
))] {
|
))] {
|
||||||
unsafe fn abort() -> ! {
|
unsafe fn abort() -> ! {
|
||||||
|
@ -4,32 +4,6 @@ mod fs;
|
|||||||
pub mod sockets;
|
pub mod sockets;
|
||||||
pub use self::fs::*;
|
pub use self::fs::*;
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
pub fn breakpoint_program_exited(tid: usize) {
|
|
||||||
unsafe {
|
|
||||||
match () {
|
|
||||||
// SOLID_BP_PROGRAM_EXITED = 15
|
|
||||||
#[cfg(target_arch = "arm")]
|
|
||||||
() => core::arch::asm!("bkpt #15", in("r0") tid),
|
|
||||||
#[cfg(target_arch = "aarch64")]
|
|
||||||
() => core::arch::asm!("hlt #15", in("x0") tid),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
pub fn breakpoint_abort() {
|
|
||||||
unsafe {
|
|
||||||
match () {
|
|
||||||
// SOLID_BP_CSABORT = 16
|
|
||||||
#[cfg(target_arch = "arm")]
|
|
||||||
() => core::arch::asm!("bkpt #16"),
|
|
||||||
#[cfg(target_arch = "aarch64")]
|
|
||||||
() => core::arch::asm!("hlt #16"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// `solid_types.h`
|
// `solid_types.h`
|
||||||
pub use super::itron::abi::{ER, ER_ID, E_TMOUT, ID};
|
pub use super::itron::abi::{ER, ER_ID, E_TMOUT, ID};
|
||||||
|
|
||||||
|
@ -74,20 +74,9 @@ pub fn decode_error_kind(code: i32) -> crate::io::ErrorKind {
|
|||||||
error::decode_error_kind(code)
|
error::decode_error_kind(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline]
|
||||||
pub fn abort_internal() -> ! {
|
pub fn abort_internal() -> ! {
|
||||||
loop {
|
unsafe { libc::abort() }
|
||||||
abi::breakpoint_abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function is needed by the panic runtime. The symbol is named in
|
|
||||||
// pre-link args for the target specification, so keep that in sync.
|
|
||||||
#[cfg(not(test))]
|
|
||||||
#[no_mangle]
|
|
||||||
// NB. used by both libunwind and libpanic_abort
|
|
||||||
pub extern "C" fn __rust_abort() {
|
|
||||||
abort_internal();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hashmap_random_keys() -> (u64, u64) {
|
pub fn hashmap_random_keys() -> (u64, u64) {
|
||||||
|
@ -11,7 +11,7 @@ use crate::path::{self, PathBuf};
|
|||||||
use crate::sys_common::rwlock::StaticRwLock;
|
use crate::sys_common::rwlock::StaticRwLock;
|
||||||
use crate::vec;
|
use crate::vec;
|
||||||
|
|
||||||
use super::{abi, error, itron, memchr};
|
use super::{error, itron, memchr};
|
||||||
|
|
||||||
// `solid` directly maps `errno`s to μITRON error codes.
|
// `solid` directly maps `errno`s to μITRON error codes.
|
||||||
impl itron::error::ItronError {
|
impl itron::error::ItronError {
|
||||||
@ -184,11 +184,8 @@ pub fn home_dir() -> Option<PathBuf> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exit(_code: i32) -> ! {
|
pub fn exit(code: i32) -> ! {
|
||||||
let tid = itron::task::try_current_task_id().unwrap_or(0);
|
rtabort!("exit({}) called", code);
|
||||||
loop {
|
|
||||||
abi::breakpoint_program_exited(tid as usize);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getpid() -> u32 {
|
pub fn getpid() -> u32 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user