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);
+}