forked from Mirrors/opensbi
sbi: sbi_domain_context: Add spinlock for updating domain assigned_harts
Add spinlock protection to avoid race condition on assigned_harts during domain context switching. Also, rename/add variables for accessing the corresponding domain of target/current context. Signed-off-by: Alvin Chang <alvinga@andestech.com> Reviewed-by: Yu Chien Peter Lin <peterlin@andestech.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
@@ -26,18 +26,23 @@
|
||||
static void switch_to_next_domain_context(struct sbi_context *ctx,
|
||||
struct sbi_context *dom_ctx)
|
||||
{
|
||||
u32 hartindex;
|
||||
u32 hartindex = sbi_hartid_to_hartindex(current_hartid());
|
||||
struct sbi_trap_regs *trap_regs;
|
||||
struct sbi_domain *dom = dom_ctx->dom;
|
||||
struct sbi_domain *current_dom = ctx->dom;
|
||||
struct sbi_domain *target_dom = dom_ctx->dom;
|
||||
struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
|
||||
unsigned int pmp_count = sbi_hart_pmp_count(scratch);
|
||||
|
||||
/* Assign current hart to target domain */
|
||||
hartindex = sbi_hartid_to_hartindex(current_hartid());
|
||||
sbi_hartmask_clear_hartindex(
|
||||
hartindex, &sbi_domain_thishart_ptr()->assigned_harts);
|
||||
sbi_update_hartindex_to_domain(hartindex, dom);
|
||||
sbi_hartmask_set_hartindex(hartindex, &dom->assigned_harts);
|
||||
spin_lock(¤t_dom->assigned_harts_lock);
|
||||
sbi_hartmask_clear_hartindex(hartindex, ¤t_dom->assigned_harts);
|
||||
spin_unlock(¤t_dom->assigned_harts_lock);
|
||||
|
||||
sbi_update_hartindex_to_domain(hartindex, target_dom);
|
||||
|
||||
spin_lock(&target_dom->assigned_harts_lock);
|
||||
sbi_hartmask_set_hartindex(hartindex, &target_dom->assigned_harts);
|
||||
spin_unlock(&target_dom->assigned_harts_lock);
|
||||
|
||||
/* Reconfigure PMP settings for the new domain */
|
||||
for (int i = 0; i < pmp_count; i++) {
|
||||
@@ -72,9 +77,11 @@ static void switch_to_next_domain_context(struct sbi_context *ctx,
|
||||
/* If target domain context is not initialized or runnable */
|
||||
if (!dom_ctx->initialized) {
|
||||
/* Startup boot HART of target domain */
|
||||
if (current_hartid() == dom->boot_hartid)
|
||||
sbi_hart_switch_mode(dom->boot_hartid, dom->next_arg1,
|
||||
dom->next_addr, dom->next_mode,
|
||||
if (current_hartid() == target_dom->boot_hartid)
|
||||
sbi_hart_switch_mode(target_dom->boot_hartid,
|
||||
target_dom->next_arg1,
|
||||
target_dom->next_addr,
|
||||
target_dom->next_mode,
|
||||
false);
|
||||
else
|
||||
sbi_hsm_hart_stop(scratch, true);
|
||||
|
Reference in New Issue
Block a user