/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) IPADS@SJTU 2023. All rights reserved. */ #ifndef __SBI_DOMAIN_CONTEXT_H__ #define __SBI_DOMAIN_CONTEXT_H__ #include #include #include /** Context representation for a hart within a domain */ struct sbi_context { /** Trap-related states such as GPRs, mepc, and mstatus */ struct sbi_trap_regs regs; /** Supervisor status register */ unsigned long sstatus; /** Supervisor interrupt enable register */ unsigned long sie; /** Supervisor trap vector base address register */ unsigned long stvec; /** Supervisor scratch register for temporary storage */ unsigned long sscratch; /** Supervisor exception program counter register */ unsigned long sepc; /** Supervisor cause register */ unsigned long scause; /** Supervisor trap value register */ unsigned long stval; /** Supervisor interrupt pending register */ unsigned long sip; /** Supervisor address translation and protection register */ unsigned long satp; /** Counter-enable register */ unsigned long scounteren; /** Supervisor environment configuration register */ unsigned long senvcfg; /** Reference to the owning domain */ struct sbi_domain *dom; /** Previous context (caller) to jump to during context exits */ struct sbi_context *prev_ctx; /** Is context initialized and runnable */ bool initialized; }; /** Get the context pointer for a given hart index and domain */ #define sbi_hartindex_to_domain_context(__hartindex, __d) \ (__d)->hartindex_to_context_table[__hartindex] /** Macro to obtain the current hart's context pointer */ #define sbi_domain_context_thishart_ptr() \ sbi_hartindex_to_domain_context( \ sbi_hartid_to_hartindex(current_hartid()), \ sbi_domain_thishart_ptr()) /** * Enter a specific domain context synchronously * @param dom pointer to domain * * @return 0 on success and negative error code on failure */ int sbi_domain_context_enter(struct sbi_domain *dom); /** * Exit the current domain context, and then return to the caller * of sbi_domain_context_enter or attempt to start the next domain * context to be initialized * * @return 0 on success and negative error code on failure */ int sbi_domain_context_exit(void); #endif // __SBI_DOMAIN_CONTEXT_H__