SYSTEM_OFF, SYSTEM_RESET, SYSTEM_RESET2
diff --git a/arch/arm64/kvm/hyp/nvhe/psci.c b/arch/arm64/kvm/hyp/nvhe/psci.c
index 84de389..c64df42 100644
--- a/arch/arm64/kvm/hyp/nvhe/psci.c
+++ b/arch/arm64/kvm/hyp/nvhe/psci.c
@@ -268,6 +268,27 @@
}
}
+static int __noreturn psci_system_off(void)
+{
+ psci_call(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
+ hyp_panic(); /* unreachable */
+}
+
+static int __noreturn psci_system_reset(void)
+{
+ psci_call(PSCI_0_2_FN_SYSTEM_RESET, 0, 0, 0);
+ hyp_panic(); /* unreachable */
+}
+
+static int psci_system_reset2(struct kvm_cpu_context *host_ctxt)
+{
+ u32 reset_type = (u32)host_ctxt->regs.regs[1];
+ u64 cookie = host_ctxt->regs.regs[2];
+
+ /* Returns either NOT_SUPPORTED or INVALID_PARAMETERS. */
+ return psci_call(PSCI_1_1_FN64_SYSTEM_RESET2, reset_type, cookie, 0);
+}
+
static void psci_narrow_to_32bit(struct kvm_cpu_context *cpu_ctxt)
{
int i;
@@ -311,6 +332,12 @@
return psci_cpu_on(host_ctxt);
case PSCI_0_2_FN64_AFFINITY_INFO:
return psci_affinity_info(host_ctxt);
+ case PSCI_0_2_FN_SYSTEM_OFF:
+ psci_system_off();
+ unreachable();
+ case PSCI_0_2_FN_SYSTEM_RESET:
+ psci_system_reset();
+ unreachable();
default:
return PSCI_RET_NOT_SUPPORTED;
}
@@ -332,6 +359,8 @@
switch (get_psci_func_id(host_ctxt)) {
case PSCI_1_0_FN_PSCI_FEATURES:
return psci_features(host_ctxt);
+ case PSCI_1_1_FN64_SYSTEM_RESET2:
+ return psci_system_reset2(host_ctxt);
default:
return PSCI_RET_NOT_SUPPORTED;
}