The Pedigree Project 0.1
armv7/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 Armv7StackFrame::getParameter(size_t n) {
8 if (n < 4) {
9 return m_State.r[n];
10 }
11 return reinterpret_cast<const uintptr_t*>(m_State.sp)[n - 4];
12}
13#endif
14
15void Armv7StackFrame::construct(ProcessorState& state, uintptr_t returnAddress,
16 unsigned int nParams, ...) {
17 va_list args;
18 va_start(args, nParams);
19
20 const size_t stackParams = nParams > 4 ? nParams - 4 : 0;
21 uintptr_t stack = state.sp & ~uintptr_t(7);
22 stack -= (stackParams * sizeof(uintptr_t) + 7) & ~size_t(7);
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 < 4) {
28 state.r[i] = value;
29 } else {
30 stackArguments[i - 4] = value;
31 }
32 }
33
34 va_end(args);
35 state.lr = returnAddress;
36 state.sp = stack;
37}
uintptr_t getParameter(size_t n) override
const ProcessorState & m_State