Message ID | 20220110181546.4131853-9-farosas@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/ppc: powerpc_excp improvements [40x] (3/n) | expand |
On Mon, Jan 10, 2022 at 03:15:46PM -0300, Fabiano Rosas wrote: > There's no sc 1. > > We also only used env->nip because of the vhyp code, so change to > 'vector' now. I don't think this is right. The point with the env->nip change is changing the PC as it appeared *before* saving it to SRR0, so that we'll eventually return to the right place. 'vector' is the address for the interrupt vector itself. > > Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> > --- > target/ppc/excp_helper.c | 23 +++-------------------- > 1 file changed, 3 insertions(+), 20 deletions(-) > > diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c > index f7b9af5065..ab298d0d8f 100644 > --- a/target/ppc/excp_helper.c > +++ b/target/ppc/excp_helper.c > @@ -398,7 +398,7 @@ static void powerpc_excp_40x(PowerPCCPU *cpu, int excp) > CPUPPCState *env = &cpu->env; > int excp_model = env->excp_model; > target_ulong msr, new_msr, vector; > - int srr0, srr1, lev = -1; > + int srr0, srr1; > > if (excp <= POWERPC_EXCP_NONE || excp >= POWERPC_EXCP_NB) { > cpu_abort(cs, "Invalid PowerPC exception %d. Aborting\n", excp); > @@ -518,30 +518,13 @@ static void powerpc_excp_40x(PowerPCCPU *cpu, int excp) > } > break; > case POWERPC_EXCP_SYSCALL: /* System call exception */ > - lev = env->error_code; > - > - if ((lev == 1) && cpu->vhyp) { > - dump_hcall(env); > - } else { > - dump_syscall(env); > - } > + dump_syscall(env); > > /* > * We need to correct the NIP which in this case is supposed > * to point to the next instruction > */ > - env->nip += 4; > - > - /* "PAPR mode" built-in hypercall emulation */ > - if ((lev == 1) && cpu->vhyp) { > - PPCVirtualHypervisorClass *vhc = > - PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); > - vhc->hypercall(cpu->vhyp, cpu); > - return; > - } > - if (lev == 1) { > - new_msr |= (target_ulong)MSR_HVB; > - } > + vector += 4; > break; > case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ > case POWERPC_EXCP_APU: /* Auxiliary processor unavailable */
David Gibson <david@gibson.dropbear.id.au> writes: > On Mon, Jan 10, 2022 at 03:15:46PM -0300, Fabiano Rosas wrote: >> There's no sc 1. >> >> We also only used env->nip because of the vhyp code, so change to >> 'vector' now. > > I don't think this is right. The point with the env->nip change is > changing the PC as it appeared *before* saving it to SRR0, so that > we'll eventually return to the right place. 'vector' is the address > for the interrupt vector itself. Ugh, In the RFC version I introduced a 'nip' that holds env->nip. So it would be correct to use 'nip' instead of 'env->nip' here. I knew 'vector' was looking off... Thanks for catching that.
diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index f7b9af5065..ab298d0d8f 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -398,7 +398,7 @@ static void powerpc_excp_40x(PowerPCCPU *cpu, int excp) CPUPPCState *env = &cpu->env; int excp_model = env->excp_model; target_ulong msr, new_msr, vector; - int srr0, srr1, lev = -1; + int srr0, srr1; if (excp <= POWERPC_EXCP_NONE || excp >= POWERPC_EXCP_NB) { cpu_abort(cs, "Invalid PowerPC exception %d. Aborting\n", excp); @@ -518,30 +518,13 @@ static void powerpc_excp_40x(PowerPCCPU *cpu, int excp) } break; case POWERPC_EXCP_SYSCALL: /* System call exception */ - lev = env->error_code; - - if ((lev == 1) && cpu->vhyp) { - dump_hcall(env); - } else { - dump_syscall(env); - } + dump_syscall(env); /* * We need to correct the NIP which in this case is supposed * to point to the next instruction */ - env->nip += 4; - - /* "PAPR mode" built-in hypercall emulation */ - if ((lev == 1) && cpu->vhyp) { - PPCVirtualHypervisorClass *vhc = - PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); - vhc->hypercall(cpu->vhyp, cpu); - return; - } - if (lev == 1) { - new_msr |= (target_ulong)MSR_HVB; - } + vector += 4; break; case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ case POWERPC_EXCP_APU: /* Auxiliary processor unavailable */
There's no sc 1. We also only used env->nip because of the vhyp code, so change to 'vector' now. Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> --- target/ppc/excp_helper.c | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-)