20#ifndef KERNEL_PROCESSOR_X64_STATE_H
21#define KERNEL_PROCESSOR_X64_STATE_H
26#include "pedigree/kernel/Log.h"
27#include "pedigree/kernel/compiler.h"
28#include "pedigree/kernel/processor/types.h"
34 uint16_t ds, es, fs, gs;
35 uint64_t fsBase, gsBase, origRax;
41extern "C" EXPORTED_PUBLIC
void pedigree_materialize_user_entry();
56 pedigree_materialize_user_entry();
58 m_UserEntry = metadata;
60 void refreshUserTlsBase();
67 inline uintptr_t getStackPointer()
const;
70 inline void setStackPointer(uintptr_t stackPointer);
74 inline uintptr_t getInstructionPointer()
const;
77 inline void setInstructionPointer(uintptr_t instructionPointer);
80 inline uintptr_t getBasePointer()
const;
83 inline void setBasePointer(uintptr_t basePointer);
90 size_t getRegisterCount()
const;
94 processor_register_t getRegister(
size_t index)
const;
98 void setRegister(
size_t index, uintptr_t value);
102 const char* getRegisterName(
size_t index)
const;
106 inline size_t getRegisterSize(
size_t index)
const;
113 inline bool kernelMode()
const;
116 inline size_t getInterruptNumber()
const;
118 inline uintptr_t getErrorCode()
const;
120 inline uint16_t getCodeSegment()
const;
122 inline uint16_t getStackSegment()
const;
126 inline uint64_t getFlags()
const;
129 inline void setFlags(uint64_t flags);
206 pedigree_materialize_user_entry();
212 pedigree_materialize_user_entry();
214 m_UserEntry = metadata;
216 void refreshUserTlsBase();
250 EXPORTED_PUBLIC processor_register_t
getRegister(
size_t index)
const;
252 EXPORTED_PUBLIC
void setRegister(
size_t index, uintptr_t value);
273 inline void setSyscallReturnValue(uintptr_t val);
274 inline void setSyscallErrno(uintptr_t val);
276 inline uint64_t getFlags()
const;
277 inline void setFlags(uint64_t newFlags);
408 uint64_t r8, r9, r10, r11, r12, r13, r14, r15;
414 uintptr_t getInstructionPointer()
const {
422 uint8_t x87FPU_MMX_XMM_MXCSR_State[512 + 16]
__attribute__((aligned(16)));
434 m_Rsp = stackPointer;
440 m_Rip = instructionPointer;
453 return (
m_Cs == 0x08);
462 return static_cast<uint16_t
>(
m_Cs);
465 return static_cast<uint16_t
>(
m_Ss);
479 m_Rsp = stackPointer;
498 return ((
m_Rax >> 16) & 0xFFFF);
501 return (
m_Rax & 0xFFFF);
533 WARNING(
"Bad syscall parameter requested: " <<
Dec << n);
537void X64SyscallState::setSyscallReturnValue(uintptr_t val) {
540void X64SyscallState::setSyscallErrno(uintptr_t val) {
543uint64_t X64SyscallState::getFlags()
const {
546void X64SyscallState::setFlags(uint64_t newFlags) {
624 rflags(x.m_RFlagsR11),
701 rip = instructionPointer;
X64InterruptState(const X64InterruptState &)
uintptr_t getStackPointer() const
uintptr_t getInstructionPointer() const
void setInstructionPointer(uintptr_t instructionPointer)
uint64_t getFlags() const
uintptr_t getErrorCode() const
uint16_t getCodeSegment() const
size_t getInterruptNumber() const
void setBasePointer(uintptr_t basePointer)
uintptr_t getBasePointer() const
uint16_t getStackSegment() const
void setStackPointer(uintptr_t stackPointer)
X64InterruptState & operator=(const X64InterruptState &)
size_t getRegisterSize(size_t index) const
void setFlags(uint64_t flags)
X64ProcessorState & operator=(const X64ProcessorState &)
void setBasePointer(uintptr_t basePointer)
uintptr_t getBasePointer() const
void setStackPointer(uintptr_t stackPointer)
uintptr_t getStackPointer() const
void setInstructionPointer(uintptr_t instructionPointer)
uintptr_t getInstructionPointer() const
uintptr_t getBasePointer() const
void setBasePointer(uintptr_t basePointer)
EXPORTED_PUBLIC processor_register_t getRegister(size_t index) const
const char * getRegisterName(size_t index) const
void setStackPointer(uintptr_t stackPointer)
size_t getRegisterCount() const
void setInstructionPointer(uintptr_t instructionPointer)
uintptr_t getInstructionPointer() const
ALWAYS_INLINE uintptr_t getSyscallParameter(size_t n) const
uintptr_t getStackPointer() const
size_t getSyscallNumber() const
size_t getRegisterSize(size_t index) const
size_t getSyscallService() const
EXPORTED_PUBLIC void setRegister(size_t index, uintptr_t value)