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;
|
int rc;
|
||||||
struct hart_context *dom_ctx;
|
struct hart_context *dom_ctx;
|
||||||
struct hart_context *ctx = hart_context_thishart_get();
|
struct hart_context *ctx = hart_context_thishart_get();
|
||||||
|
u32 hartindex = current_hartindex();
|
||||||
|
|
||||||
/* Target domain must not be same as the current domain */
|
/* Target domain must not be same as the current domain */
|
||||||
if (!dom || dom == sbi_domain_thishart_ptr())
|
if (!dom || dom == sbi_domain_thishart_ptr())
|
||||||
return SBI_EINVAL;
|
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
|
* If it's first time to call `enter` on the current hart, no
|
||||||
* context allocated before. Allocate context for each valid
|
* context allocated before. Allocate context for each valid
|
||||||
* domain on the current hart.
|
* domain on the current hart.
|
||||||
*/
|
*/
|
||||||
if (!ctx) {
|
if (!ctx) {
|
||||||
rc = hart_context_init(current_hartindex());
|
rc = hart_context_init(hartindex);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@@ -251,7 +256,7 @@ int sbi_domain_context_enter(struct sbi_domain *dom)
|
|||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dom_ctx = hart_context_get(dom, current_hartindex());
|
dom_ctx = hart_context_get(dom, hartindex);
|
||||||
/* Validate the domain context existence */
|
/* Validate the domain context existence */
|
||||||
if (!dom_ctx)
|
if (!dom_ctx)
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
@@ -276,7 +281,7 @@ int sbi_domain_context_exit(void)
|
|||||||
* its context on the current hart if valid.
|
* its context on the current hart if valid.
|
||||||
*/
|
*/
|
||||||
if (!ctx) {
|
if (!ctx) {
|
||||||
rc = hart_context_init(current_hartindex());
|
rc = hart_context_init(hartindex);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@@ -294,6 +299,9 @@ int sbi_domain_context_exit(void)
|
|||||||
if (dom == &root || dom == sbi_domain_thishart_ptr())
|
if (dom == &root || dom == sbi_domain_thishart_ptr())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (!sbi_hartmask_test_hartindex(hartindex, dom->possible_harts))
|
||||||
|
continue;
|
||||||
|
|
||||||
tmp = hart_context_get(dom, hartindex);
|
tmp = hart_context_get(dom, hartindex);
|
||||||
if (tmp && !tmp->initialized) {
|
if (tmp && !tmp->initialized) {
|
||||||
dom_ctx = tmp;
|
dom_ctx = tmp;
|
||||||
|
|||||||
Reference in New Issue
Block a user