Split ABI for x86_64/aarch64

This commit is contained in:
Mark Poliakov 2023-11-04 15:40:48 +02:00
parent 15cbcf3d1f
commit 8bff432534
7 changed files with 56 additions and 20 deletions

9
src/arch/aarch64.rs Normal file
View File

@ -0,0 +1,9 @@
#[allow(missing_docs)]
#[derive(Clone, Debug)]
#[repr(C)]
pub struct SavedFrame {
pub gp_regs: [u64; 32],
pub spsr_el1: u64,
pub elr_el1: u64,
pub sp_el0: u64,
}

13
src/arch/mod.rs Normal file
View File

@ -0,0 +1,13 @@
//! Architecture-specific ABI implementation details
#[cfg(target_arch = "aarch64")]
pub(crate) mod aarch64;
#[cfg(target_arch = "aarch64")]
use aarch64 as arch_impl;
#[cfg(target_arch = "x86_64")]
pub(crate) mod x86_64;
#[cfg(target_arch = "x86_64")]
use x86_64 as arch_impl;
pub use arch_impl::SavedFrame;

26
src/arch/x86_64.rs Normal file
View File

@ -0,0 +1,26 @@
#![allow(missing_docs)]
#[derive(Clone, Debug)]
#[repr(C)]
pub struct SavedFrame {
pub rax: u64,
pub rcx: u64,
pub rdx: u64,
pub rbx: u64,
pub rsi: u64,
pub rdi: u64,
pub rbp: u64,
pub r8: u64,
pub r9: u64,
pub r10: u64,
pub r11: u64,
pub r12: u64,
pub r13: u64,
pub r14: u64,
pub r15: u64,
pub user_ip: u64,
pub user_sp: u64,
pub rflags: u64,
}

View File

@ -28,6 +28,8 @@ primitive_enum!(
DirectoryNotEmpty = 11, DirectoryNotEmpty = 11,
#[doc = "Operation was interrupted"] #[doc = "Operation was interrupted"]
Interrupted = 12, Interrupted = 12,
#[doc = "Operation has not completed yet"]
WouldBlock = 13,
} }
); );

View File

@ -5,6 +5,7 @@
pub(crate) mod macros; pub(crate) mod macros;
pub mod arch;
pub mod error; pub mod error;
pub mod io; pub mod io;
pub mod path; pub mod path;

View File

@ -1,15 +1,15 @@
/// Helper macro to define primitive enums with integer reprs, as well as their conversion methods /// Helper macro to define primitive enums with integer reprs, as well as their conversion methods
#[macro_export] #[macro_export]
macro_rules! primitive_enum { macro_rules! primitive_enum {
($(#[doc = $enum_doc:expr])? $vis:vis enum $name:ident: $repr:ty { ($(#[$struct_meta:meta])* $vis:vis enum $name:ident: $repr:ty {
$( $(#[doc = $doc:expr])? $variant:ident = $discriminant:literal, )+ $( $(#[$variant_meta:meta])* $variant:ident = $discriminant:literal, )+
}) => { }) => {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[repr($repr)] #[repr($repr)]
$(#[doc = $enum_doc])? $(#[$struct_meta])*
$vis enum $name { $vis enum $name {
$( $(
$(#[doc = $doc])? $(#[$variant_meta])?
$variant = $discriminant $variant = $discriminant
),+ ),+
} }

View File

@ -2,7 +2,7 @@
use core::num::NonZeroI32; use core::num::NonZeroI32;
use crate::{io::RawFd, primitive_enum}; use crate::{arch::SavedFrame, io::RawFd, primitive_enum};
/// Code signalled by a process when it finishes or is terminated by a signal /// Code signalled by a process when it finishes or is terminated by a signal
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -40,21 +40,6 @@ primitive_enum! {
} }
} }
/// Platform-specific "snapshot" of a program's context, used to restore it later when returning
/// from a signal handler
#[derive(Clone, Debug)]
#[repr(C)]
pub struct SavedFrame {
/// General-purpose registers
pub gp_regs: [u64; 32],
/// SPSR_EL1
pub spsr_el1: u64,
/// ELR_EL1 (return address)
pub elr_el1: u64,
/// SP_EL0 (return stack)
pub sp_el0: u64,
}
/// Data provided by the kernel to signal entry function /// Data provided by the kernel to signal entry function
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
#[repr(C)] #[repr(C)]