The Pedigree Project 0.1
armv7/state.h
1#ifndef KERNEL_PROCESSOR_ARMV7_STATE_H
2#define KERNEL_PROCESSOR_ARMV7_STATE_H
3
4#include "pedigree/kernel/processor/types.h"
5
7
9 public:
10 uintptr_t getStackPointer() const {
11 return sp;
12 }
13 void setStackPointer(uintptr_t value) {
14 sp = value;
15 }
16 uintptr_t getInstructionPointer() const {
17 return pc;
18 }
19 void setInstructionPointer(uintptr_t value) {
20 pc = value;
21 }
22 uintptr_t getBasePointer() const {
23 return r[11];
24 }
25 void setBasePointer(uintptr_t value) {
26 r[11] = value;
27 }
28
29 size_t getRegisterCount() const {
30 return 19;
31 }
32 processor_register_t getRegister(size_t index) const;
33 void setRegister(size_t index, uintptr_t value);
34 const char* getRegisterName(size_t index) const;
35 size_t getRegisterSize(size_t) const {
36 return sizeof(uint32_t);
37 }
38
39 bool kernelMode() const {
40 return (cpsr & 0x1f) != 0x10;
41 }
42 size_t getInterruptNumber() const {
43 return vector;
44 }
45 uintptr_t getErrorCode() const {
46 return faultStatus;
47 }
48 uint32_t getFlags() const {
49 return cpsr;
50 }
51 void setFlags(uint32_t value) {
52 cpsr = value;
53 }
54
55 static Armv7InterruptState* construct(Armv7ProcessorState& state, bool userMode);
56
57 uint32_t r[13];
58 uint32_t sp;
59 uint32_t lr;
60 uint32_t pc;
61 uint32_t cpsr;
62 uint32_t faultAddress;
63 uint32_t faultStatus;
64 uint32_t vector;
65};
66
68 public:
69 size_t getSyscallService() const {
70 return svcNumber ? (r[7] >> 16) & 0xffff : 0;
71 }
72 size_t getSyscallNumber() const {
73 return svcNumber ? r[7] & 0xffff : r[7];
74 }
75 uintptr_t getSyscallParameter(size_t index) const {
76 return index < 6 ? r[index] : (index < 13 ? r[index - 6] : 0);
77 }
78 void setSyscallReturnValue(uintptr_t value) {
79 r[0] = value;
80 }
81 void setSyscallErrno(uintptr_t value) {
82 r[1] = value;
83 }
84
85 uint32_t svcNumber;
86};
87
89 public:
90 Armv7ProcessorState() : r{}, sp(0), lr(0), pc(0), cpsr(0) {}
92 *this = state;
93 }
95 *this = state;
96 }
97 Armv7ProcessorState& operator=(const Armv7InterruptState& state) {
98 for (size_t i = 0; i < 13; ++i) {
99 r[i] = state.r[i];
100 }
101 sp = state.sp;
102 lr = state.lr;
103 pc = state.pc;
104 cpsr = state.cpsr;
105 return *this;
106 }
107 uintptr_t getStackPointer() const {
108 return sp;
109 }
110 void setStackPointer(uintptr_t value) {
111 sp = value;
112 }
113 uintptr_t getInstructionPointer() const {
114 return pc;
115 }
116 void setInstructionPointer(uintptr_t value) {
117 pc = value;
118 }
119 uintptr_t getBasePointer() const {
120 return r[11];
121 }
122 void setBasePointer(uintptr_t value) {
123 r[11] = value;
124 }
125
126 uint32_t r[13];
127 uint32_t sp;
128 uint32_t lr;
129 uint32_t pc;
130 uint32_t cpsr;
131};
132
134 public:
135 uintptr_t getInstructionPointer() const {
136 return pc;
137 }
138 uint32_t r4ToR11[8];
139 uint32_t sp;
140 uint32_t pc;
141 uint64_t d[16];
142};
143
144static_assert(sizeof(Armv7InterruptState) == 80);
145static_assert(__builtin_offsetof(Armv7InterruptState, sp) == 52);
146static_assert(__builtin_offsetof(Armv7InterruptState, cpsr) == 64);
147
148#endif