ANDROID: gunyah: Handle platform specific return value of vcpu_run
PSCI_SYSTEM_RESET is a valid return value of the vcpu_run hypercall. As kernel doesn't have any special handling of this case, treat it as a generic SYSTEM_OFF and let the VMM take the appropriate action as the vcpu_run structure will have the necessary details for this exit. Bug: 409998900 Change-Id: I0275e887f869964cb2a27e74f2f55b8ec3febf3c Signed-off-by: Prakruthi Deepak Heragu <quic_pheragu@quicinc.com>
This commit is contained in:
committed by
Carlos Llamas
parent
f49bbfed7a
commit
8ffa03307c
@@ -8,6 +8,7 @@
|
|||||||
#include <linux/gunyah.h>
|
#include <linux/gunyah.h>
|
||||||
#include <linux/uuid.h>
|
#include <linux/uuid.h>
|
||||||
|
|
||||||
|
#define GUNYAH_VCPU_RUN_STATE_PSCI_SYSTEM_RESET 256
|
||||||
/* {c1d58fcd-a453-5fdb-9265-ce36673d5f14} */
|
/* {c1d58fcd-a453-5fdb-9265-ce36673d5f14} */
|
||||||
static const uuid_t GUNYAH_UUID = UUID_INIT(0xc1d58fcd, 0xa453, 0x5fdb, 0x92,
|
static const uuid_t GUNYAH_UUID = UUID_INIT(0xc1d58fcd, 0xa453, 0x5fdb, 0x92,
|
||||||
0x65, 0xce, 0x36, 0x67, 0x3d, 0x5f,
|
0x65, 0xce, 0x36, 0x67, 0x3d, 0x5f,
|
||||||
@@ -285,6 +286,14 @@ gunyah_hypercall_vcpu_run(u64 capid, unsigned long *resume_data,
|
|||||||
resp->state_data[2] = res.a4;
|
resp->state_data[2] = res.a4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PSCI_SYSTEM_RESET is also a state where VM is shutdown
|
||||||
|
* Translate it to GUNYAH_VCPU_STATE_SYSTEM_OFF as VMM will
|
||||||
|
* be able to take the action based on the exit_info.
|
||||||
|
*/
|
||||||
|
if (resp->sized_state == GUNYAH_VCPU_RUN_STATE_PSCI_SYSTEM_RESET)
|
||||||
|
resp->sized_state = GUNYAH_VCPU_STATE_SYSTEM_OFF;
|
||||||
|
|
||||||
return res.a0;
|
return res.a0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gunyah_hypercall_vcpu_run);
|
EXPORT_SYMBOL_GPL(gunyah_hypercall_vcpu_run);
|
||||||
|
|||||||
@@ -277,6 +277,8 @@ static int gunyah_vcpu_run(struct gunyah_vcpu *vcpu)
|
|||||||
schedule();
|
schedule();
|
||||||
break;
|
break;
|
||||||
case GUNYAH_VCPU_STATE_POWERED_OFF:
|
case GUNYAH_VCPU_STATE_POWERED_OFF:
|
||||||
|
fallthrough;
|
||||||
|
case GUNYAH_VCPU_STATE_SYSTEM_OFF:
|
||||||
/**
|
/**
|
||||||
* vcpu might be off because the VM is shut down
|
* vcpu might be off because the VM is shut down
|
||||||
* If so, it won't ever run again
|
* If so, it won't ever run again
|
||||||
@@ -326,8 +328,8 @@ static int gunyah_vcpu_run(struct gunyah_vcpu *vcpu)
|
|||||||
pr_warn_ratelimited(
|
pr_warn_ratelimited(
|
||||||
"Unknown vCPU state: %llx\n",
|
"Unknown vCPU state: %llx\n",
|
||||||
vcpu_run_resp.sized_state);
|
vcpu_run_resp.sized_state);
|
||||||
schedule();
|
ret = -EINVAL;
|
||||||
break;
|
goto out;
|
||||||
}
|
}
|
||||||
} else if (gunyah_error == GUNYAH_ERROR_RETRY) {
|
} else if (gunyah_error == GUNYAH_ERROR_RETRY) {
|
||||||
schedule();
|
schedule();
|
||||||
|
|||||||
@@ -526,6 +526,8 @@ struct gunyah_hypercall_vcpu_run_resp {
|
|||||||
GUNYAH_VCPU_ADDRSPACE_VMMIO_WRITE = 5,
|
GUNYAH_VCPU_ADDRSPACE_VMMIO_WRITE = 5,
|
||||||
/* VCPU blocked on fault where we can demand page */
|
/* VCPU blocked on fault where we can demand page */
|
||||||
GUNYAH_VCPU_ADDRSPACE_PAGE_FAULT = 7,
|
GUNYAH_VCPU_ADDRSPACE_PAGE_FAULT = 7,
|
||||||
|
/* VCPU is powered off due to some system event/reset */
|
||||||
|
GUNYAH_VCPU_STATE_SYSTEM_OFF = 0x100,
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
} state;
|
} state;
|
||||||
u64 sized_state;
|
u64 sized_state;
|
||||||
|
|||||||
Reference in New Issue
Block a user