2024-08-23 23:37:50 +08:00

103 lines
2.1 KiB
Rust

// SPDX-License-Identifier: MPL-2.0
use ostd::{
cpu::{RawGeneralRegs, UserContext},
Pod,
};
use crate::cpu::LinuxAbi;
impl LinuxAbi for UserContext {
fn syscall_num(&self) -> usize {
self.rax()
}
fn syscall_ret(&self) -> usize {
self.rax()
}
fn set_syscall_ret(&mut self, ret: usize) {
self.set_rax(ret);
}
fn syscall_args(&self) -> [usize; 6] {
[
self.rdi(),
self.rsi(),
self.rdx(),
self.r10(),
self.r8(),
self.r9(),
]
}
fn set_tls_pointer(&mut self, tls: usize) {
self.set_fsbase(tls);
}
fn tls_pointer(&self) -> usize {
self.fsbase()
}
}
/// General-purpose registers.
#[derive(Debug, Clone, Copy, Pod, Default)]
#[repr(C)]
pub struct GpRegs {
pub rax: usize,
pub rbx: usize,
pub rcx: usize,
pub rdx: usize,
pub rsi: usize,
pub rdi: usize,
pub rbp: usize,
pub rsp: usize,
pub r8: usize,
pub r9: usize,
pub r10: usize,
pub r11: usize,
pub r12: usize,
pub r13: usize,
pub r14: usize,
pub r15: usize,
pub rip: usize,
pub rflags: usize,
pub fsbase: usize,
pub gsbase: usize,
}
macro_rules! copy_gp_regs {
($src: ident, $dst: ident) => {
$dst.rax = $src.rax;
$dst.rbx = $src.rbx;
$dst.rcx = $src.rcx;
$dst.rdx = $src.rdx;
$dst.rsi = $src.rsi;
$dst.rdi = $src.rdi;
$dst.rbp = $src.rbp;
$dst.rsp = $src.rsp;
$dst.r8 = $src.r8;
$dst.r9 = $src.r9;
$dst.r10 = $src.r10;
$dst.r11 = $src.r11;
$dst.r12 = $src.r12;
$dst.r13 = $src.r13;
$dst.r14 = $src.r14;
$dst.r15 = $src.r15;
$dst.rip = $src.rip;
$dst.rflags = $src.rflags;
$dst.fsbase = $src.fsbase;
$dst.gsbase = $src.gsbase;
};
}
impl GpRegs {
pub fn copy_to_raw(&self, dst: &mut RawGeneralRegs) {
copy_gp_regs!(self, dst);
}
pub fn copy_from_raw(&mut self, src: &RawGeneralRegs) {
copy_gp_regs!(src, self);
}
}