2#include "pedigree/kernel/processor/UserReturnFrame.h"
6#if X64 && !HOSTED && THREADS
7#include "pedigree/kernel/process/Thread.h"
8#include "pedigree/kernel/processor/Processor.h"
9#include "pedigree/kernel/processor/ProcessorInformation.h"
10#include "pedigree/kernel/processor/state.h"
19static_assert(__builtin_offsetof(
X64UserEntryMetadata, origRax) == 24,
"entry original RAX offset");
20static_assert(
sizeof(
X64SyscallState) == 160,
"syscall frame includes entry metadata");
21static_assert(
sizeof(
X64InterruptState) == 208,
"interrupt frame includes entry metadata");
25 output.orig_rax = entry.origRax;
26 output.fs_base = entry.fsBase;
27 output.gs_base = entry.gsBase;
41 output.r11 = state.getFlags();
53 output.eflags = state.getFlags();
56 copyMetadata(output, state.getUserEntryMetadata());
80 copyMetadata(output, state.getUserEntryMetadata());
86#if X64 && !HOSTED && THREADS
91 m_Owner->currentUserReturnFrame() !=
this)
96 if (m_Origin != Origin::Syscall && m_Origin != Origin::NewImage)
98 capture(next.amd64, *m_Syscall);
99 }
else if (m_Interrupt) {
100 if ((m_Origin != Origin::Interrupt && m_Origin != Origin::SignalRestore) ||
101 m_Interrupt->kernelMode())
103 capture(next.amd64, *m_Interrupt);
107 next.architecture = UserRegisterSnapshot::Architecture::Amd64;
static ProcessorInformation & information()
uintptr_t getStackPointer() const
uintptr_t getInstructionPointer() const
uint64_t getFlags() const
uint16_t getCodeSegment() const
uint16_t getStackSegment() const
processor_register_t getRegister(size_t index) const
EXPORTED_PUBLIC processor_register_t getRegister(size_t index) const
uintptr_t getInstructionPointer() const
uintptr_t getStackPointer() const