use super::machine::ExceptionInfo;
#[repr(C)]
pub struct Context {
pub segments: [u64; 4],
pub fxsave: [u8; 512],
pub gprs: [u64; 15],
_padding: u64,
}
const _: () = assert!(size_of::<Context>() == 32 + 512 + 120 + 8);
const _: () = assert!((size_of::<Context>() + size_of::<ExceptionInfo>()).is_multiple_of(16));
macro_rules! save {
() => {
concat!(
" sub rsp, 8\n",
" push rax\n",
" push rbx\n",
" push rcx\n",
" push rdx\n",
" push rsi\n",
" push rdi\n",
" push rbp\n",
" push r8\n",
" push r9\n",
" push r10\n",
" push r11\n",
" push r12\n",
" push r13\n",
" push r14\n",
" push r15\n",
" sub rsp, 512\n",
" mov rax, rsp\n",
" fxsave [rax]\n",
" mov rax, es\n",
" push rax\n",
" mov rax, fs\n",
" push rax\n",
" mov rax, gs\n",
" push rax\n",
" mov rax, ds\n",
" push rax\n",
)
};
}
pub(super) use save;
macro_rules! restore {
() => {
concat!(
" pop rax\n",
" mov ds, rax\n",
" pop rax\n",
" mov gs, rax\n",
" pop rax\n",
" mov fs, rax\n",
" pop rax\n",
" mov es, rax\n",
" mov rax, rsp\n",
" fxrstor [rax]\n",
" add rsp, 512\n",
" pop r15\n",
" pop r14\n",
" pop r13\n",
" pop r12\n",
" pop r11\n",
" pop r10\n",
" pop r9\n",
" pop r8\n",
" pop rbp\n",
" pop rdi\n",
" pop rsi\n",
" pop rdx\n",
" pop rcx\n",
" pop rbx\n",
" pop rax\n",
" add rsp, 8\n",
)
};
}
pub(super) use restore;