On 11.02.2016 00:30, David Gibson wrote: > On Wed, Feb 10, 2016 at 07:09:09PM +0100, Thomas Huth wrote: >> This is a very simple hypercall that only sets up the SPRG0 >> register for the guest (since writing to SPRG0 was only permitted >> to the hypervisor in older versions of the PowerISA). >> >> Signed-off-by: Thomas Huth <th...@redhat.com> >> --- >> hw/ppc/spapr_hcall.c | 15 +++++++++++++-- >> 1 file changed, 13 insertions(+), 2 deletions(-) >> >> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c >> index 12f8c33..58103ef 100644 >> --- a/hw/ppc/spapr_hcall.c >> +++ b/hw/ppc/spapr_hcall.c >> @@ -332,6 +332,15 @@ static target_ulong h_read(PowerPCCPU *cpu, >> sPAPRMachineState *spapr, >> return H_SUCCESS; >> } >> >> +static target_ulong h_set_sprg0(PowerPCCPU *cpu, sPAPRMachineState *spapr, >> + target_ulong opcode, target_ulong *args) >> +{ >> + CPUState *cs = CPU(cpu); >> + >> + set_spr(cs, SPR_SPRG0, args[0], -1L); > > This looks correct, but I think set_spr() is serious overkill here. > It does some fancy synchronization designed for setting one cpu's SPR > from an hcall executed on a different CPU. In this case the calling > CPU is just setting its own SPRG0, so just > cpu_synchronize_state() > env->spr[SPR_SPRG0] = XXX > > Should be sufficient.
AFAIK the synchronization stuff is skipped when set_spr() runs already on the destination CPU, but ok, since h-calls should be fast, I can change this anyway to save some precious cycles. Thomas
signature.asc
Description: OpenPGP digital signature