#pragma once #include "kernel.hpp" #include "kernel/kernel.hpp" namespace { static constexpr size_t TRAPFRAME_SIZE = 0x110; } class TrapFrame : public KernelObject { static constexpr size_t RAX_OFFSET = 0x30; static constexpr size_t RBX_OFFSET = 0x38; static constexpr size_t RCX_OFFSET = 0x18; static constexpr size_t RDX_OFFSET = 0x10; static constexpr size_t RSI_OFFSET = 0x08; static constexpr size_t RDI_OFFSET = 0x00; static constexpr size_t R8_OFFSET = 0x20; static constexpr size_t R9_OFFSET = 0x28; static constexpr size_t R10_OFFSET = 0x48; static constexpr size_t R11_OFFSET = 0x50; static constexpr size_t R12_OFFSET = 0x58; static constexpr size_t R13_OFFSET = 0x60; static constexpr size_t R14_OFFSET = 0x68; static constexpr size_t R15_OFFSET = 0x70; static constexpr size_t RBP_OFFSET = 0x40; static constexpr size_t RSP_OFFSET = 0x100; static constexpr size_t RIP_OFFSET = 0xe8; public: TrapFrame(uintptr_t addr) : KernelObject(addr) {} TrapFrame &setFrame(const TrapFrame *frame) { memcpy(buf, frame->buf, sizeof(buf)); return *this; } uint64_t getRax() { return get(); } TrapFrame &setRax(uint64_t rax) { set(rax); return *this; } uint64_t getRbx() { return get(); } TrapFrame &setRbx(uint64_t rbx) { set(rbx); return *this; } uint64_t getRcx() { return get(); } TrapFrame &setRcx(uint64_t rcx) { set(rcx); return *this; } uint64_t getRdx() { return get(); } TrapFrame &setRdx(uint64_t rdx) { set(rdx); return *this; } uint64_t getRsi() { return get(); } TrapFrame &setRsi(uint64_t rsi) { set(rsi); return *this; } uint64_t getRdi() { return get(); } TrapFrame &setRdi(uint64_t rdi) { set(rdi); return *this; } uint64_t getR8() { return get(); } TrapFrame &setR8(uint64_t r8) { set(r8); return *this; } uint64_t getR9() { return get(); } TrapFrame &setR9(uint64_t r9) { set(r9); return *this; } uint64_t getR10() { return get(); } TrapFrame &setR10(uint64_t r10) { set(r10); return *this; } uint64_t getR11() { return get(); } TrapFrame &setR11(uint64_t r11) { set(r11); return *this; } uint64_t getR12() { return get(); } TrapFrame &setR12(uint64_t r12) { set(r12); return *this; } uint64_t getR13() { return get(); } TrapFrame &setR13(uint64_t r13) { set(r13); return *this; } uint64_t getR14() { return get(); } TrapFrame &setR14(uint64_t r14) { set(r14); return *this; } uint64_t getR15() { return get(); } TrapFrame &setR15(uint64_t r15) { set(r15); return *this; } uint64_t getRbp() { return get(); } TrapFrame &setRbp(uint64_t rbp) { set(rbp); return *this; } uint64_t getRsp() { return get(); } TrapFrame &setRsp(uint64_t rsp) { set(rsp); return *this; } uint64_t getRip() { return get(); } TrapFrame &setRip(uint64_t rip) { set(rip); return *this; } };