Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 20 additions & 15 deletions src/unix/bsd/netbsdlike/netbsd/riscv64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,9 @@ use crate::prelude::*;
use crate::PT_FIRSTMACH;

pub type __greg_t = u64;
pub type __cpu_simple_lock_nv_t = c_int;
pub type __gregset = [__greg_t; _NGREG];
pub type __fregset = [__fpreg; _NFREG];

s! {
pub struct mcontext_t {
pub __gregs: __gregset,
pub __fregs: __fregset,
__spare: [crate::__greg_t; 7],
}
}
pub type __cpu_simple_lock_nv_t = c_uint;
pub type __gregset_t = [__greg_t; _NGREG];
pub type __fregset_t = [__fpreg; _NFREG];

s_no_extra_traits! {
pub union __fpreg {
Expand All @@ -21,23 +13,36 @@ s_no_extra_traits! {
}
}

s! {
pub struct mcontext_t {
pub __gregs: __gregset_t,
pub __fregs: __fregset_t,
__spare: [crate::__greg_t; 7],
}
}

cfg_if! {
if #[cfg(feature = "extra_traits")] {
impl PartialEq for __fpreg {
fn eq(&self, other: &Self) -> bool {
unsafe { self.u_u64 == other.u_u64 }
fn eq(&self, other: &__fpreg) -> bool {
unsafe { self.u_u64 == other.u_u64 || self.u_d == other.u_d }
}
}
impl Eq for __fpreg {}
impl hash::Hash for __fpreg {
fn hash<H: hash::Hasher>(&self, state: &mut H) {
unsafe { self.u_u64.hash(state) };
unsafe {
self.u_u64.hash(state);
}
}
}
}
}

pub(crate) const _ALIGNBYTES: usize = size_of::<c_long>() - 1;
// gcc for riscv64 defines `BIGGEST_ALIGNMENT`, but it's mesured in bits.
pub(crate) const __BIGGEST_ALIGNMENT_IN_BITS__: usize = 128;
// `_ALIGNBYTES` is measured in, well, bytes.
pub(crate) const _ALIGNBYTES: usize = (__BIGGEST_ALIGNMENT_IN_BITS__ / 8) - 1;

pub const PT_GETREGS: c_int = PT_FIRSTMACH + 0;
pub const PT_SETREGS: c_int = PT_FIRSTMACH + 1;
Expand Down