Introduce vcpu_reset and refactor arch_cpu_init
Introduce vcpu_reset calling arch_cpu_init and arch_regs_reset.
vcpu_reset is called from main on cold boot or resume from CPU off.
arch_cpu_init gets a cpu and entry point parameter passed to
PSCI resume function.
Change-Id: I809b453c32b418237b7334d13d8e55916d593b09
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
diff --git a/inc/hf/arch/cpu.h b/inc/hf/arch/cpu.h
index 3d18b41..0400133 100644
--- a/inc/hf/arch/cpu.h
+++ b/inc/hf/arch/cpu.h
@@ -53,4 +53,4 @@
/**
* Initialize and reset CPU-wide register values.
*/
-void arch_cpu_init(void);
+void arch_cpu_init(struct cpu *c, ipaddr_t entry_point);
diff --git a/inc/hf/vcpu.h b/inc/hf/vcpu.h
index 5439719..2f9ffb6 100644
--- a/inc/hf/vcpu.h
+++ b/inc/hf/vcpu.h
@@ -113,3 +113,4 @@
struct vcpu_fault_info *f);
struct vcpu *vcpu_get_other_world_counterpart(struct vcpu *current);
+void vcpu_reset(struct vcpu *vcpu);
diff --git a/src/arch/aarch64/hypervisor/cpu.c b/src/arch/aarch64/hypervisor/cpu.c
index fc4fd73..37e7e95 100644
--- a/src/arch/aarch64/hypervisor/cpu.c
+++ b/src/arch/aarch64/hypervisor/cpu.c
@@ -156,9 +156,9 @@
};
}
-void arch_cpu_init(void)
+void arch_cpu_init(struct cpu *c, ipaddr_t entry_point)
{
- plat_psci_cpu_resume(NULL, ipa_init(0));
+ plat_psci_cpu_resume(c, entry_point);
/*
* Linux expects LORegions to be disabled, hence if the current system
diff --git a/src/arch/fake/hypervisor/cpu.c b/src/arch/fake/hypervisor/cpu.c
index 78b46f2..e00f71f 100644
--- a/src/arch/fake/hypervisor/cpu.c
+++ b/src/arch/fake/hypervisor/cpu.c
@@ -44,3 +44,9 @@
r->arg[6] = v.arg6;
r->arg[7] = v.arg7;
}
+
+void arch_cpu_init(struct cpu *c, ipaddr_t entry_point)
+{
+ (void)c;
+ (void)entry_point;
+}
diff --git a/src/main.c b/src/main.c
index 5f30aac..ea3d3b0 100644
--- a/src/main.c
+++ b/src/main.c
@@ -26,10 +26,8 @@
vcpu->cpu = c;
- arch_cpu_init();
-
/* Reset the registers to give a clean start for vCPU. */
- arch_regs_reset(vcpu);
+ vcpu_reset(vcpu);
return vcpu;
}
diff --git a/src/vcpu.c b/src/vcpu.c
index 15a6c85..6b1e161 100644
--- a/src/vcpu.c
+++ b/src/vcpu.c
@@ -8,6 +8,8 @@
#include "hf/vcpu.h"
+#include "hf/arch/cpu.h"
+
#include "hf/check.h"
#include "hf/dlog.h"
#include "hf/std.h"
@@ -193,3 +195,11 @@
return vm_get_vcpu(vm, current_cpu_index);
}
+
+void vcpu_reset(struct vcpu *vcpu)
+{
+ arch_cpu_init(vcpu->cpu, ipa_init(0));
+
+ /* Reset the registers to give a clean start for vCPU. */
+ arch_regs_reset(vcpu);
+}