diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c index 37cbe175..316368ea 100644 --- a/lib/sbi/sbi_domain_context.c +++ b/lib/sbi/sbi_domain_context.c @@ -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;