mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-08 21:06:48 +00:00
103 lines
2.1 KiB
Rust
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);
|
|
}
|
|
}
|