spapr: Implement H_PROD
H_PROD is added, and H_CEDE is modified to test the prod bit according to PAPR. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Message-Id: <20190718034214.14948-3-npiggin@gmail.com> Reviewed-by: Greg Kurz <groug@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
03ef074c04
commit
3a6e6224a9
@ -4312,6 +4312,7 @@ static void spapr_cpu_exec_enter(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)
|
||||
|
||||
/* These are only called by TCG, KVM maintains dispatch state */
|
||||
|
||||
spapr_cpu->prod = false;
|
||||
if (spapr_cpu->vpa_addr) {
|
||||
CPUState *cs = CPU(cpu);
|
||||
uint32_t dispatch;
|
||||
|
@ -1051,14 +1051,44 @@ static target_ulong h_cede(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
{
|
||||
CPUPPCState *env = &cpu->env;
|
||||
CPUState *cs = CPU(cpu);
|
||||
SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
|
||||
|
||||
env->msr |= (1ULL << MSR_EE);
|
||||
hreg_compute_hflags(env);
|
||||
|
||||
if (spapr_cpu->prod) {
|
||||
spapr_cpu->prod = false;
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
if (!cpu_has_work(cs)) {
|
||||
cs->halted = 1;
|
||||
cs->exception_index = EXCP_HLT;
|
||||
cs->exit_request = 1;
|
||||
}
|
||||
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
static target_ulong h_prod(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
||||
target_ulong opcode, target_ulong *args)
|
||||
{
|
||||
target_long target = args[0];
|
||||
PowerPCCPU *tcpu;
|
||||
CPUState *cs;
|
||||
SpaprCpuState *spapr_cpu;
|
||||
|
||||
tcpu = spapr_find_cpu(target);
|
||||
cs = CPU(tcpu);
|
||||
if (!cs) {
|
||||
return H_PARAMETER;
|
||||
}
|
||||
|
||||
spapr_cpu = spapr_cpu_state(tcpu);
|
||||
spapr_cpu->prod = true;
|
||||
cs->halted = 0;
|
||||
qemu_cpu_kick(cs);
|
||||
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1885,6 +1915,8 @@ static void hypercall_register_types(void)
|
||||
/* hcall-splpar */
|
||||
spapr_register_hypercall(H_REGISTER_VPA, h_register_vpa);
|
||||
spapr_register_hypercall(H_CEDE, h_cede);
|
||||
spapr_register_hypercall(H_PROD, h_prod);
|
||||
|
||||
spapr_register_hypercall(H_SIGNAL_SYS_RESET, h_signal_sys_reset);
|
||||
|
||||
/* processor register resource access h-calls */
|
||||
|
@ -46,6 +46,7 @@ typedef struct SpaprCpuState {
|
||||
uint64_t vpa_addr;
|
||||
uint64_t slb_shadow_addr, slb_shadow_size;
|
||||
uint64_t dtl_addr, dtl_size;
|
||||
bool prod; /* not migrated, only used to improve dispatch latencies */
|
||||
struct ICPState *icp;
|
||||
struct XiveTCTX *tctx;
|
||||
} SpaprCpuState;
|
||||
|
Loading…
Reference in New Issue
Block a user