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:
Anup Patel
2026-09-16 09:21:21 +05:30
committed by Anup Patel
parent 3593a5facc
commit 6dc5a896b1
+11 -3
View File
@@ -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;