180 lines
4.3 KiB
Rust
180 lines
4.3 KiB
Rust
use super::{siginfo_t, sigset_t, stack_t};
|
|
use crate::platform::types::*;
|
|
use core::arch::global_asm;
|
|
|
|
// Needs to be defined in assembly because it can't have a function prologue
|
|
// rax is register, 15 is RT_SIGRETURN
|
|
#[cfg(target_arch = "x86_64")]
|
|
global_asm!(
|
|
"
|
|
.global __restore_rt
|
|
__restore_rt:
|
|
mov rax, 15
|
|
syscall
|
|
"
|
|
);
|
|
// x8 is register, 139 is RT_SIGRETURN
|
|
#[cfg(target_arch = "aarch64")]
|
|
global_asm!(
|
|
"
|
|
.global __restore_rt
|
|
__restore_rt:
|
|
mov x8, #139
|
|
svc 0
|
|
"
|
|
);
|
|
|
|
#[cfg(target_arch = "riscv64")]
|
|
global_asm!(
|
|
"
|
|
.global __restore_rt
|
|
__restore_rt:
|
|
li a7, 139
|
|
ecall
|
|
"
|
|
);
|
|
|
|
pub const SIGHUP: usize = 1;
|
|
pub const SIGINT: usize = 2;
|
|
pub const SIGQUIT: usize = 3;
|
|
pub const SIGILL: usize = 4;
|
|
pub const SIGTRAP: usize = 5;
|
|
pub const SIGABRT: usize = 6;
|
|
pub const SIGIOT: usize = SIGABRT;
|
|
pub const SIGBUS: usize = 7;
|
|
pub const SIGFPE: usize = 8;
|
|
pub const SIGKILL: usize = 9;
|
|
pub const SIGUSR1: usize = 10;
|
|
pub const SIGSEGV: usize = 11;
|
|
pub const SIGUSR2: usize = 12;
|
|
pub const SIGPIPE: usize = 13;
|
|
pub const SIGALRM: usize = 14;
|
|
pub const SIGTERM: usize = 15;
|
|
pub const SIGSTKFLT: usize = 16;
|
|
pub const SIGCHLD: usize = 17;
|
|
pub const SIGCONT: usize = 18;
|
|
pub const SIGSTOP: usize = 19;
|
|
pub const SIGTSTP: usize = 20;
|
|
pub const SIGTTIN: usize = 21;
|
|
pub const SIGTTOU: usize = 22;
|
|
pub const SIGURG: usize = 23;
|
|
pub const SIGXCPU: usize = 24;
|
|
pub const SIGXFSZ: usize = 25;
|
|
pub const SIGVTALRM: usize = 26;
|
|
pub const SIGPROF: usize = 27;
|
|
pub const SIGWINCH: usize = 28;
|
|
pub const SIGIO: usize = 29;
|
|
pub const SIGPOLL: usize = SIGIO;
|
|
pub const SIGPWR: usize = 30;
|
|
pub const SIGSYS: usize = 31;
|
|
pub const SIGUNUSED: usize = SIGSYS;
|
|
pub const NSIG: usize = 32;
|
|
|
|
pub const SIGRTMIN: usize = 35; // TODO: decrease to 34
|
|
pub const SIGRTMAX: usize = 64;
|
|
|
|
pub const SA_NOCLDSTOP: usize = 1;
|
|
pub const SA_NOCLDWAIT: usize = 2;
|
|
pub const SA_SIGINFO: usize = 4;
|
|
pub const SA_ONSTACK: usize = 0x0800_0000;
|
|
pub const SA_RESTART: usize = 0x1000_0000;
|
|
pub const SA_NODEFER: usize = 0x4000_0000;
|
|
pub const SA_RESETHAND: usize = 0x8000_0000;
|
|
pub const SA_RESTORER: usize = 0x0400_0000;
|
|
|
|
pub const SS_ONSTACK: usize = 1;
|
|
pub const SS_DISABLE: usize = 2;
|
|
|
|
// Those two should be updated from kernel headers
|
|
pub const MINSIGSTKSZ: usize = 2048;
|
|
pub const SIGSTKSZ: usize = 8096;
|
|
|
|
pub const SI_QUEUE: i32 = -1;
|
|
pub const SI_USER: i32 = 0;
|
|
pub const SI_TIMER: i32 = 1;
|
|
pub const SI_ASYNCIO: i32 = 2;
|
|
pub const SI_MESGQ: i32 = 3;
|
|
|
|
// si_code values (signal-specific)
|
|
pub const ILL_ILLOPC: i32 = 1;
|
|
pub const ILL_ILLOPN: i32 = 2;
|
|
pub const ILL_ILLADR: i32 = 3;
|
|
pub const ILL_ILLTRP: i32 = 4;
|
|
pub const ILL_PRVOPC: i32 = 5;
|
|
pub const ILL_PRVREG: i32 = 6;
|
|
pub const ILL_COPROC: i32 = 7;
|
|
pub const ILL_BADSTK: i32 = 8;
|
|
|
|
pub const FPE_INTDIV: i32 = 1;
|
|
pub const FPE_INTOVF: i32 = 2;
|
|
pub const FPE_FLTDIV: i32 = 3;
|
|
pub const FPE_FLTOVF: i32 = 4;
|
|
pub const FPE_FLTUND: i32 = 5;
|
|
pub const FPE_FLTRES: i32 = 6;
|
|
pub const FPE_FLTINV: i32 = 7;
|
|
pub const FPE_FLTSUB: i32 = 8;
|
|
|
|
pub const SEGV_MAPERR: i32 = 1;
|
|
pub const SEGV_ACCERR: i32 = 2;
|
|
|
|
pub const BUS_ADRALN: i32 = 1;
|
|
pub const BUS_ADRERR: i32 = 2;
|
|
pub const BUS_OBJERR: i32 = 3;
|
|
|
|
pub const TRAP_BRKPT: i32 = 1;
|
|
pub const TRAP_TRACE: i32 = 2;
|
|
|
|
pub const CLD_EXITED: i32 = 1;
|
|
pub const CLD_KILLED: i32 = 2;
|
|
pub const CLD_DUMPED: i32 = 3;
|
|
pub const CLD_TRAPPED: i32 = 4;
|
|
pub const CLD_STOPPED: i32 = 5;
|
|
pub const CLD_CONTINUED: i32 = 6;
|
|
|
|
// Mirrors the ucontext_t struct from the libc crate on Linux.
|
|
|
|
pub(crate) type ucontext_t = ucontext;
|
|
pub(crate) type mcontext_t = mcontext;
|
|
|
|
#[repr(C)]
|
|
pub struct ucontext {
|
|
pub uc_flags: c_ulong,
|
|
pub uc_link: *mut ucontext_t,
|
|
pub uc_stack: stack_t,
|
|
pub uc_mcontext: mcontext_t,
|
|
pub uc_sigmask: sigset_t,
|
|
__private: [u8; 512],
|
|
}
|
|
|
|
#[repr(C)]
|
|
pub struct _libc_fpstate {
|
|
pub cwd: u16,
|
|
pub swd: u16,
|
|
pub ftw: u16,
|
|
pub fop: u16,
|
|
pub rip: u64,
|
|
pub rdp: u64,
|
|
pub mxcsr: u32,
|
|
pub mxcr_mask: u32,
|
|
pub _st: [_libc_fpxreg; 8],
|
|
pub _xmm: [_libc_xmmreg; 16],
|
|
__private: [u64; 12],
|
|
}
|
|
#[repr(C)]
|
|
pub struct _libc_fpxreg {
|
|
pub significand: [u16; 4],
|
|
pub exponent: u16,
|
|
__private: [u16; 3],
|
|
}
|
|
|
|
#[repr(C)]
|
|
pub struct _libc_xmmreg {
|
|
pub element: [u32; 4],
|
|
}
|
|
#[repr(C)]
|
|
pub struct mcontext {
|
|
pub gregs: [i64; 23], // TODO: greg_t?
|
|
pub fpregs: *mut _libc_fpstate,
|
|
__private: [u64; 8],
|
|
}
|