mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-09-20 15:21:42 +01:00
lib: sbi_domain: Check possible harts in sbi_domain_context_enter/exit()
When context switching to a domain the current hart MUST be part of the possible harts of that domain. Add appropriate checks in sbi_domain_context_enter/exit() along these lines. Signed-off-by: Anup Patel <anup.patel@oss.qualcomm.com> Reviewed-by: Pawandeep Oza <pawandeep.oza@oss.qualcomm.com> Tested-by: Pawandeep Oza <pawandeep.oza@oss.qualcomm.com> Reviewed-by: Yu-Chien Peter Lin <peter.lin@sifive.com> Link: https://lore.kernel.org/r/20260905131748.922920-2-anup.patel@oss.qualcomm.com Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -231,18 +231,23 @@ int sbi_domain_context_enter(struct sbi_domain *dom)
|
||||
int rc;
|
||||
struct hart_context *dom_ctx;
|
||||
struct hart_context *ctx = hart_context_thishart_get();
|
||||
u32 hartindex = current_hartindex();
|
||||
|
||||
/* Target domain must not be same as the current domain */
|
||||
if (!dom || dom == sbi_domain_thishart_ptr())
|
||||
return SBI_EINVAL;
|
||||
|
||||
/* Target domain must have current hart as a possible harts */
|
||||
if (!sbi_hartmask_test_hartindex(hartindex, dom->possible_harts))
|
||||
return SBI_EINVAL;
|
||||
|
||||
/*
|
||||
* If it's first time to call `enter` on the current hart, no
|
||||
* context allocated before. Allocate context for each valid
|
||||
* domain on the current hart.
|
||||
*/
|
||||
if (!ctx) {
|
||||
rc = hart_context_init(current_hartindex());
|
||||
rc = hart_context_init(hartindex);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -251,7 +256,7 @@ int sbi_domain_context_enter(struct sbi_domain *dom)
|
||||
return SBI_EINVAL;
|
||||
}
|
||||
|
||||
dom_ctx = hart_context_get(dom, current_hartindex());
|
||||
dom_ctx = hart_context_get(dom, hartindex);
|
||||
/* Validate the domain context existence */
|
||||
if (!dom_ctx)
|
||||
return SBI_EINVAL;
|
||||
@@ -276,7 +281,7 @@ int sbi_domain_context_exit(void)
|
||||
* its context on the current hart if valid.
|
||||
*/
|
||||
if (!ctx) {
|
||||
rc = hart_context_init(current_hartindex());
|
||||
rc = hart_context_init(hartindex);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -294,6 +299,9 @@ int sbi_domain_context_exit(void)
|
||||
if (dom == &root || dom == sbi_domain_thishart_ptr())
|
||||
continue;
|
||||
|
||||
if (!sbi_hartmask_test_hartindex(hartindex, dom->possible_harts))
|
||||
continue;
|
||||
|
||||
tmp = hart_context_get(dom, hartindex);
|
||||
if (tmp && !tmp->initialized) {
|
||||
dom_ctx = tmp;
|
||||
|
||||
Reference in New Issue
Block a user