X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/22d06cbaaf660067bfea03f73bee9c8630c05d50..6be108db01439d3463342689446e457a315d6705:/lunaix-os/arch/aarch64/includes/asm/hart.h diff --git a/lunaix-os/arch/aarch64/includes/asm/hart.h b/lunaix-os/arch/aarch64/includes/asm/hart.h index f9e7d0a..89a2e9a 100644 --- a/lunaix-os/arch/aarch64/includes/asm/hart.h +++ b/lunaix-os/arch/aarch64/includes/asm/hart.h @@ -3,74 +3,80 @@ #ifndef __ASM__ #include +#include +#include + +#define SYNDROME_ETYPE BITS(63, 56) struct hart_state; struct regcontext { union { - reg_t x[32]; + reg_t x[31]; struct { reg_t x[29]; reg_t fp; reg_t lr; - reg_t sp; }; }; -} compact; +} compact align(8); struct exec_param { struct hart_state* parent_state; - reg_t vector; + reg_t spsr; + reg_t link; + struct { + reg_t sp_el0; + reg_t sp_el1; + }; + reg_t syndrome; - reg_t elink; - reg_t sp; -} compact; +} compact align(8); struct hart_state { reg_t depth; struct regcontext registers; - union - { - reg_t sp; - volatile struct exec_param* execp; - }; -} compact; + struct exec_param execp; +} compact align(16); static inline int hart_vector_stamp(struct hart_state* hstate) { - return hstate->execp->vector; + return BITS_GET(hstate->execp.syndrome, SYNDROME_ETYPE); } static inline unsigned int hart_ecause(struct hart_state* hstate) { - return hstate->execp->syndrome; + return hstate->execp.syndrome; } static inline struct hart_state* hart_parent_state(struct hart_state* hstate) { - return hstate->execp->parent_state; + 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; + hstate->execp.parent_state = p_hstate; } static inline ptr_t hart_pc(struct hart_state* hstate) { - return hstate->execp->elink; + return hstate->execp.link; } static inline ptr_t hart_sp(struct hart_state* hstate) { - return hstate->execp->sp; + if (spsr_from_el0(hstate->execp.spsr)) { + return hstate->execp.sp_el0; + } + return hstate->execp.sp_el1; } static inline bool