The Pedigree Project 0.1
hosted/state.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef KERNEL_PROCESSOR_HOSTED_STATE_H
21#define KERNEL_PROCESSOR_HOSTED_STATE_H
22#include "pedigree/kernel/Log.h"
23#include "pedigree/kernel/compiler.h"
24#include "pedigree/kernel/processor/types.h"
25
26#include <config.h>
27
33 friend class HostedProcessorState;
34 friend class HostedInterruptManager;
35 friend class HostedIrqManager;
36 friend class PageFaultHandler;
37
38 public:
39 //
40 // General Interface (InterruptState, SyscallState & ProcessorState)
41 //
44 inline uintptr_t getStackPointer() const;
47 inline void setStackPointer(uintptr_t stackPointer);
51 inline uintptr_t getInstructionPointer() const;
54 inline void setInstructionPointer(uintptr_t instructionPointer);
57 inline uintptr_t getBasePointer() const;
60 inline void setBasePointer(uintptr_t basePointer);
61
62 //
63 // General Interface (InterruptState & SyscallState)
64 //
67 size_t getRegisterCount() const;
71 processor_register_t getRegister(size_t index) const;
75 const char* getRegisterName(size_t index) const;
79 inline size_t getRegisterSize(size_t index) const;
80
81 //
82 // InterruptState Interface
83 //
86 inline bool kernelMode() const;
89 inline size_t getInterruptNumber() const;
90
92 inline uintptr_t getInterruptSource() const;
93
96 inline uint64_t getFlags() const;
99 inline void setFlags(uint64_t flags);
100
103 static HostedInterruptState* construct(class HostedProcessorState& state, bool userMode);
104
105 private:
116
120 uint64_t state;
122 uint64_t which;
126 uint64_t extra;
131 uint64_t meta;
132
134 uintptr_t m_basePointer;
135 uintptr_t m_instructionPointer;
136 uintptr_t m_stackPointer;
137} PACKED;
138
141 friend class HostedProcessorState;
142 friend class HostedSyscallManager;
143
144 public:
145 //
146 // General Interface (InterruptState, SyscallState & ProcessorState)
147 //
150 inline uintptr_t getStackPointer() const;
153 inline void setStackPointer(uintptr_t stackPointer);
157 inline uintptr_t getInstructionPointer() const;
160 inline void setInstructionPointer(uintptr_t instructionPointer);
163 inline uintptr_t getBasePointer() const;
166 inline void setBasePointer(uintptr_t basePointer);
167
168 //
169 // General Interface (InterruptState & SyscallState)
170 //
173 size_t getRegisterCount() const;
177 processor_register_t getRegister(size_t index) const;
181 const char* getRegisterName(size_t index) const;
185 inline size_t getRegisterSize(size_t index) const;
186
187 //
188 // SyscallState Interface
189 //
192 inline size_t getSyscallService() const;
195 inline size_t getSyscallNumber() const;
197 inline uintptr_t getSyscallParameter(size_t n) const;
198 inline void setSyscallReturnValue(uintptr_t val);
199 inline void setSyscallErrno(uintptr_t val);
200
201 public:
202 uint64_t service;
203 uint64_t number;
204 uint64_t p1, p2, p3, p4, p5, p6;
205 uint64_t error;
206 uint64_t error_ptr; // pointer to error
207 uint64_t result;
208 uint64_t rsp;
209} PACKED;
210
213 public:
215 inline HostedProcessorState();
233 inline ~HostedProcessorState();
234
235 //
236 // General Interface (InterruptState, SyscallState & ProcessorState)
237 //
240 inline uintptr_t getStackPointer() const;
243 inline void setStackPointer(uintptr_t stackPointer);
247 inline uintptr_t getInstructionPointer() const;
250 inline void setInstructionPointer(uintptr_t instructionPointer);
253 inline uintptr_t getBasePointer() const;
256 inline void setBasePointer(uintptr_t basePointer);
257
258 uint64_t state;
259};
260
263 public:
264 uint64_t state[128];
265
266 uint64_t stackBase;
267 size_t stackSize;
268
270
271 inline uintptr_t getInstructionPointer() const {
273 return 0;
274 }
275};
276
279//
280// Part of the Implementation
281//
283 return m_stackPointer;
284}
285void HostedInterruptState::setStackPointer(uintptr_t stackPointer) {
286 m_stackPointer = stackPointer;
287}
289 return m_instructionPointer;
290}
291void HostedInterruptState::setInstructionPointer(uintptr_t instructionPointer) {
292 m_instructionPointer = instructionPointer;
293}
295 return m_basePointer;
296}
297void HostedInterruptState::setBasePointer(uintptr_t basePointer) {
298 m_basePointer = basePointer;
299}
300size_t HostedInterruptState::getRegisterSize(size_t index) const {
301 return sizeof(processor_register_t);
302}
303
305 return !fromUserspace;
306}
308 return which;
309}
311 return state;
312}
313
315 return 0;
316}
317void HostedInterruptState::setFlags(uint64_t flags) {}
318
320 return rsp;
321}
322void HostedSyscallState::setStackPointer(uintptr_t stackPointer) {
323 rsp = stackPointer;
324}
326 return 0;
327}
328void HostedSyscallState::setInstructionPointer(uintptr_t instructionPointer) {}
330 return 0;
331}
332void HostedSyscallState::setBasePointer(uintptr_t basePointer) {}
333size_t HostedSyscallState::getRegisterSize(size_t index) const {
334 return sizeof(processor_register_t);
335}
336
338 return service;
339}
341 return number;
342}
344 switch (n) {
345 // Native Pedigree services use slots 0-5. The Linux-compatible service
346 // uses slots 6-11 to match X64SyscallState's register-ABI redirection.
347 case 0:
348 case 6:
349 return p1;
350 case 1:
351 case 7:
352 return p2;
353 case 2:
354 case 8:
355 return p3;
356 case 3:
357 case 9:
358 return p4;
359 case 4:
360 case 10:
361 return p5;
362 case 5:
363 case 11:
364 return p6;
365 default:
366 return 0;
367 }
368}
369void HostedSyscallState::setSyscallReturnValue(uintptr_t val) {
370 result = val;
371}
372void HostedSyscallState::setSyscallErrno(uintptr_t val) {
373 error = val;
374}
375
381 state = x.state;
382 return *this;
383}
385 state = x.state;
386 return *this;
387}
392
394 return 0;
395}
396void HostedProcessorState::setStackPointer(uintptr_t stackPointer) {}
398 return 0;
399}
400void HostedProcessorState::setInstructionPointer(uintptr_t instructionPointer) {}
402 return 0;
403}
404void HostedProcessorState::setBasePointer(uintptr_t basePointer) {}
405
406#endif
HostedInterruptState & operator=(const HostedInterruptState &)
size_t getInterruptNumber() const
uintptr_t getInterruptSource() const
processor_register_t getRegister(size_t index) const
uintptr_t getBasePointer() const
uintptr_t getInstructionPointer() const
bool kernelMode() const
HostedInterruptState(const HostedInterruptState &)
uintptr_t getStackPointer() const
void setInstructionPointer(uintptr_t instructionPointer)
void setFlags(uint64_t flags)
void setStackPointer(uintptr_t stackPointer)
size_t getRegisterSize(size_t index) const
uint64_t getFlags() const
static HostedInterruptState * construct(class HostedProcessorState &state, bool userMode)
void setBasePointer(uintptr_t basePointer)
size_t getRegisterCount() const
const char * getRegisterName(size_t index) const
HostedProcessorState & operator=(const HostedProcessorState &)
void setBasePointer(uintptr_t basePointer)
uintptr_t getInstructionPointer() const
uintptr_t getStackPointer() const
void setStackPointer(uintptr_t stackPointer)
uintptr_t getBasePointer() const
void setInstructionPointer(uintptr_t instructionPointer)
uintptr_t getInstructionPointer() const
uintptr_t getSyscallParameter(size_t n) const
void setBasePointer(uintptr_t basePointer)
const char * getRegisterName(size_t index) const
void setStackPointer(uintptr_t stackPointer)
size_t getRegisterSize(size_t index) const
size_t getRegisterCount() const
size_t getSyscallService() const
uintptr_t getStackPointer() const
uintptr_t getInstructionPointer() const
void setInstructionPointer(uintptr_t instructionPointer)
uintptr_t getBasePointer() const
processor_register_t getRegister(size_t index) const
size_t getSyscallNumber() const