20#include "pedigree/kernel/processor/Processor.h"
21#include "pedigree/kernel/processor/state.h"
22#include "pedigree/kernel/processor/types.h"
24static const char* X64InterruptStateRegisterName[18] = {
25 "rax",
"rbx",
"rcx",
"rdx",
"rdi",
"rsi",
"rbp",
"r8",
"r9",
26 "r10",
"r11",
"r12",
"r13",
"r14",
"r15",
"rsp",
"rip",
"rflags"};
28static const char* X64SyscallStateRegisterName[16] = {
"rax",
"rbx",
"rdx",
"rdi",
"rsi",
"rbp",
29 "r8",
"r9",
"r10",
"r12",
"r13",
"r14",
30 "r15",
"rsp",
"rip",
"rflags"};
113 return X64InterruptStateRegisterName[index];
189 return X64SyscallStateRegisterName[index];
195 uintptr_t* pStack =
reinterpret_cast<uintptr_t*
>(state.
getStackPointer());
197 *--pStack = (userMode) ? 0x23 : 0x10;
198 *--pStack = state.
rsp;
200 *--pStack = (userMode) ? 0x1b : 0x08;
201 *--pStack = state.
rip;
204 *--pStack = state.
rax;
205 *--pStack = state.
rbx;
206 *--pStack = state.
rcx;
207 *--pStack = state.
rdx;
208 *--pStack = state.
rdi;
209 *--pStack = state.
rsi;
210 *--pStack = state.
rbp;
211 *--pStack = state.
r8;
212 *--pStack = state.
r9;
213 *--pStack = state.
r10;
214 *--pStack = state.
r11;
215 *--pStack = state.
r12;
216 *--pStack = state.
r13;
217 *--pStack = state.
r14;
218 *--pStack = state.
r15;
222 toRet->setUserEntryMetadata(metadata);
229uint64_t installedUserTlsBase() {
231 asm volatile(
"rdmsr" :
"=a"(low),
"=d"(high) :
"c"(0xc0000100));
232 return (uint64_t(high) << 32) | low;
235void X64InterruptState::refreshUserTlsBase() {
236 pedigree_materialize_user_entry();
237 m_UserEntry.fsBase = installedUserTlsBase();
238 m_UserEntry.gsBase = Processor::getUserGsBase();
240void X64SyscallState::refreshUserTlsBase() {
241 pedigree_materialize_user_entry();
242 m_UserEntry.fsBase = installedUserTlsBase();
243 m_UserEntry.gsBase = Processor::getUserGsBase();
size_t getRegisterCount() const
uintptr_t getStackPointer() const
const char * getRegisterName(size_t index) const
processor_register_t getRegister(size_t index) const
static X64InterruptState * construct(class X64ProcessorState &state, bool userMode, const X64UserEntryMetadata &metadata)
void setRegister(size_t index, uintptr_t value)
uintptr_t getStackPointer() const
EXPORTED_PUBLIC processor_register_t getRegister(size_t index) const
const char * getRegisterName(size_t index) const
size_t getRegisterCount() const
EXPORTED_PUBLIC void setRegister(size_t index, uintptr_t value)