spapr_hcall: Split h_set_mode()
This moves H_SET_MODE_RESOURCE_LE handler to a separate function as there are other "resources" coming and this is going to become ugly. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
cd9adfdd77
commit
c4015bbd50
|
@ -712,46 +712,49 @@ static target_ulong h_logical_dcbf(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
|||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
static target_ulong h_set_mode_resouce_le(PowerPCCPU *cpu,
|
||||
target_ulong mflags,
|
||||
target_ulong value1,
|
||||
target_ulong value2)
|
||||
{
|
||||
CPUState *cs;
|
||||
|
||||
if (value1) {
|
||||
return H_P3;
|
||||
}
|
||||
if (value2) {
|
||||
return H_P4;
|
||||
}
|
||||
|
||||
switch (mflags) {
|
||||
case H_SET_MODE_ENDIAN_BIG:
|
||||
CPU_FOREACH(cs) {
|
||||
set_spr(cs, SPR_LPCR, 0, LPCR_ILE);
|
||||
}
|
||||
return H_SUCCESS;
|
||||
|
||||
case H_SET_MODE_ENDIAN_LITTLE:
|
||||
CPU_FOREACH(cs) {
|
||||
set_spr(cs, SPR_LPCR, LPCR_ILE, LPCR_ILE);
|
||||
}
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
||||
return H_UNSUPPORTED_FLAG;
|
||||
}
|
||||
|
||||
static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPREnvironment *spapr,
|
||||
target_ulong opcode, target_ulong *args)
|
||||
{
|
||||
CPUState *cs;
|
||||
target_ulong mflags = args[0];
|
||||
target_ulong resource = args[1];
|
||||
target_ulong value1 = args[2];
|
||||
target_ulong value2 = args[3];
|
||||
target_ulong ret = H_P2;
|
||||
|
||||
if (resource == H_SET_MODE_RESOURCE_LE) {
|
||||
if (value1) {
|
||||
ret = H_P3;
|
||||
goto out;
|
||||
}
|
||||
if (value2) {
|
||||
ret = H_P4;
|
||||
goto out;
|
||||
}
|
||||
switch (mflags) {
|
||||
case H_SET_MODE_ENDIAN_BIG:
|
||||
CPU_FOREACH(cs) {
|
||||
set_spr(cs, SPR_LPCR, 0, LPCR_ILE);
|
||||
}
|
||||
ret = H_SUCCESS;
|
||||
break;
|
||||
|
||||
case H_SET_MODE_ENDIAN_LITTLE:
|
||||
CPU_FOREACH(cs) {
|
||||
set_spr(cs, SPR_LPCR, LPCR_ILE, LPCR_ILE);
|
||||
}
|
||||
ret = H_SUCCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = H_UNSUPPORTED_FLAG;
|
||||
}
|
||||
switch (resource) {
|
||||
case H_SET_MODE_RESOURCE_LE:
|
||||
ret = h_set_mode_resouce_le(cpu, args[0], args[2], args[3]);
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue