X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/32b9a6d76790c73d3d2d36d9081a2581cc65d184..28c176b668c841a3b7fb093faccf0efa39257603:/lunaix-os/arch/x86/includes/sys/hart.h?ds=sidebyside diff --git a/lunaix-os/arch/x86/includes/sys/hart.h b/lunaix-os/arch/x86/includes/sys/hart.h new file mode 100644 index 0000000..ac3801e --- /dev/null +++ b/lunaix-os/arch/x86/includes/sys/hart.h @@ -0,0 +1,165 @@ +#ifndef __LUNAIX_ARCH_HART_H +#define __LUNAIX_ARCH_HART_H + +#include "vectors.h" + +#ifndef __ASM__ +#include +#include + + +struct hart_state; + +#ifdef CONFIG_ARCH_X86_64 +struct regcontext +{ + reg_t rax; + reg_t rbx; + reg_t rcx; + reg_t rdx; + reg_t rdi; + reg_t rbp; + reg_t rsi; + reg_t r8; + reg_t r9; + reg_t r10; + reg_t r11; + reg_t r12; + reg_t r13; + reg_t r14; + reg_t r15; +} compact; + +struct exec_param +{ + struct hart_state* parent_state; + reg_t vector; + reg_t err_code; + reg_t rip; + reg_t cs; + reg_t rflags; + reg_t rsp; + reg_t ss; +} compact; + + +#else +struct regcontext +{ + reg_t eax; + reg_t ebx; + reg_t ecx; + reg_t edx; + reg_t edi; + reg_t ebp; + reg_t esi; + reg_t ds; + reg_t es; + reg_t fs; + reg_t gs; +} compact; + +struct exec_param +{ + struct hart_state* parent_state; + reg_t vector; + reg_t err_code; + reg_t eip; + reg_t cs; + reg_t eflags; + reg_t esp; + reg_t ss; +} compact; + +#endif + + +struct hart_state +{ + reg_t depth; + struct regcontext registers; + union + { + reg_t sp; + volatile struct exec_param* execp; + }; +} compact; + +static inline int +hart_vector_stamp(struct hart_state* hstate) { + return hstate->execp->vector; +} + +static inline unsigned int +hart_ecause(struct hart_state* hstate) { + return hstate->execp->err_code; +} + +static inline struct hart_state* +hart_parent_state(struct hart_state* hstate) +{ + return hstate->execp->parent_state; +} + +static inline void +hart_push_state(struct hart_state* p_hstate, struct hart_state* hstate) +{ + hstate->execp->parent_state = p_hstate; +} + + +#ifdef CONFIG_ARCH_X86_64 +static inline ptr_t +hart_pc(struct hart_state* hstate) +{ + return hstate->execp->rip; +} + +static inline ptr_t +hart_sp(struct hart_state* hstate) +{ + return hstate->execp->rsp; +} + +static inline bool +kernel_context(struct hart_state* hstate) +{ + return !((hstate->execp->cs) & 0b11); +} + +static inline ptr_t +hart_stack_frame(struct hart_state* hstate) +{ + return hstate->registers.rbp; +} + +#else +static inline ptr_t +hart_pc(struct hart_state* hstate) +{ + return hstate->execp->eip; +} + +static inline ptr_t +hart_sp(struct hart_state* hstate) +{ + return hstate->execp->esp; +} + +static inline bool +kernel_context(struct hart_state* hstate) +{ + return !((hstate->execp->cs) & 0b11); +} + +static inline ptr_t +hart_stack_frame(struct hart_state* hstate) +{ + return hstate->registers.ebp; +} + +#endif + +#endif + +#endif /* __LUNAIX_ARCH_HART_H */