The Pedigree Project 0.1
arm64/StackFrame.cc
1#include "pedigree/kernel/processor/StackFrame.h"
2#include "pedigree/kernel/processor/state.h"
3
4#include <stdarg.h>
5
6#if DEBUGGER
7uintptr_t Arm64StackFrame::getParameter(size_t n) {
8 if (n < 8) {
9 return m_State.x[n];
10 }
11 return reinterpret_cast<const uintptr_t*>(m_State.sp)[n - 8];
12}
13#endif
14
15void Arm64StackFrame::construct(ProcessorState& state, uintptr_t returnAddress,
16 unsigned int nParams, ...) {
17 va_list args;
18 va_start(args, nParams);
19
20 uintptr_t stack = state.sp & ~uintptr_t(15);
21 const size_t stackParams = nParams > 8 ? nParams - 8 : 0;
22 stack -= ((stackParams * sizeof(uintptr_t) + 15) & ~size_t(15));
23 auto* stackArguments = reinterpret_cast<uintptr_t*>(stack);
24
25 for (size_t i = 0; i < nParams; ++i) {
26 uintptr_t value = va_arg(args, uintptr_t);
27 if (i < 8) {
28 state.x[i] = value;
29 } else {
30 stackArguments[i - 8] = value;
31 }
32 }
33
34 va_end(args);
35 state.x[30] = returnAddress;
36 state.sp = stack;
37}
uintptr_t getParameter(size_t n) override
const ProcessorState & m_State