[PATCH v5 5/9] target/ppc: Simplify syscall exception handlers

BALATON Zoltan posted 9 patches 10 months, 1 week ago
Maintainers: Nicholas Piggin <npiggin@gmail.com>, Daniel Henrique Barboza <danielhb413@gmail.com>, "Cédric Le Goater" <clg@kaod.org>
There is a newer version of this series
[PATCH v5 5/9] target/ppc: Simplify syscall exception handlers
Posted by BALATON Zoltan 10 months, 1 week ago
After previous changes the hypercall handling in 7xx and 74xx
exception handlers can be folded into one if statement to simpilfy
this code. Also add "unlikely" to mark the less freqiently used branch
for the compiler.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 target/ppc/excp_helper.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
index 411d67376c..035a9fd968 100644
--- a/target/ppc/excp_helper.c
+++ b/target/ppc/excp_helper.c
@@ -762,26 +762,22 @@ static void powerpc_excp_7xx(PowerPCCPU *cpu, int excp)
     case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
     {
         int lev = env->error_code;
-
-        if (lev == 1 && cpu->vhyp) {
-            dump_hcall(env);
-        } else {
-            dump_syscall(env);
-        }
         /*
          * The Virtual Open Firmware (VOF) relies on the 'sc 1'
          * instruction to communicate with QEMU. The pegasos2 machine
          * uses VOF and the 7xx CPUs, so although the 7xx don't have
          * HV mode, we need to keep hypercall support.
          */
-        if (lev == 1 && cpu->vhyp) {
+        if (unlikely(lev == 1 && cpu->vhyp)) {
             PPCVirtualHypervisorClass *vhc =
                 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
+            dump_hcall(env);
             vhc->hypercall(cpu->vhyp, cpu);
             powerpc_reset_excp_state(cpu);
             return;
+        } else {
+            dump_syscall(env);
         }
-
         break;
     }
     case POWERPC_EXCP_FPU:       /* Floating-point unavailable exception     */
@@ -907,26 +903,22 @@ static void powerpc_excp_74xx(PowerPCCPU *cpu, int excp)
     case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
     {
         int lev = env->error_code;
-
-        if (lev == 1 && cpu->vhyp) {
-            dump_hcall(env);
-        } else {
-            dump_syscall(env);
-        }
         /*
          * The Virtual Open Firmware (VOF) relies on the 'sc 1'
          * instruction to communicate with QEMU. The pegasos2 machine
          * uses VOF and the 74xx CPUs, so although the 74xx don't have
          * HV mode, we need to keep hypercall support.
          */
-        if (lev == 1 && cpu->vhyp) {
+        if (unlikely(lev == 1 && cpu->vhyp)) {
             PPCVirtualHypervisorClass *vhc =
                 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
+            dump_hcall(env);
             vhc->hypercall(cpu->vhyp, cpu);
             powerpc_reset_excp_state(cpu);
             return;
+        } else {
+            dump_syscall(env);
         }
-
         break;
     }
     case POWERPC_EXCP_FPU:       /* Floating-point unavailable exception     */
-- 
2.30.9
Re: [PATCH v5 5/9] target/ppc: Simplify syscall exception handlers
Posted by Harsh Prateek Bora 9 months, 1 week ago

On 1/19/24 03:31, BALATON Zoltan wrote:
> After previous changes the hypercall handling in 7xx and 74xx
> exception handlers can be folded into one if statement to simpilfy
> this code. Also add "unlikely" to mark the less freqiently used branch
> for the compiler.
> 
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>

Nice cleanup.

Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

> ---
>   target/ppc/excp_helper.c | 24 ++++++++----------------
>   1 file changed, 8 insertions(+), 16 deletions(-)
> 
> diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
> index 411d67376c..035a9fd968 100644
> --- a/target/ppc/excp_helper.c
> +++ b/target/ppc/excp_helper.c
> @@ -762,26 +762,22 @@ static void powerpc_excp_7xx(PowerPCCPU *cpu, int excp)
>       case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
>       {
>           int lev = env->error_code;
> -
> -        if (lev == 1 && cpu->vhyp) {
> -            dump_hcall(env);
> -        } else {
> -            dump_syscall(env);
> -        }
>           /*
>            * The Virtual Open Firmware (VOF) relies on the 'sc 1'
>            * instruction to communicate with QEMU. The pegasos2 machine
>            * uses VOF and the 7xx CPUs, so although the 7xx don't have
>            * HV mode, we need to keep hypercall support.
>            */
> -        if (lev == 1 && cpu->vhyp) {
> +        if (unlikely(lev == 1 && cpu->vhyp)) {
>               PPCVirtualHypervisorClass *vhc =
>                   PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
> +            dump_hcall(env);
>               vhc->hypercall(cpu->vhyp, cpu);
>               powerpc_reset_excp_state(cpu);
>               return;
> +        } else {
> +            dump_syscall(env);
>           }
> -
>           break;
>       }
>       case POWERPC_EXCP_FPU:       /* Floating-point unavailable exception     */
> @@ -907,26 +903,22 @@ static void powerpc_excp_74xx(PowerPCCPU *cpu, int excp)
>       case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
>       {
>           int lev = env->error_code;
> -
> -        if (lev == 1 && cpu->vhyp) {
> -            dump_hcall(env);
> -        } else {
> -            dump_syscall(env);
> -        }
>           /*
>            * The Virtual Open Firmware (VOF) relies on the 'sc 1'
>            * instruction to communicate with QEMU. The pegasos2 machine
>            * uses VOF and the 74xx CPUs, so although the 74xx don't have
>            * HV mode, we need to keep hypercall support.
>            */
> -        if (lev == 1 && cpu->vhyp) {
> +        if (unlikely(lev == 1 && cpu->vhyp)) {
>               PPCVirtualHypervisorClass *vhc =
>                   PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
> +            dump_hcall(env);
>               vhc->hypercall(cpu->vhyp, cpu);
>               powerpc_reset_excp_state(cpu);
>               return;
> +        } else {
> +            dump_syscall(env);
>           }
> -
>           break;
>       }
>       case POWERPC_EXCP_FPU:       /* Floating-point unavailable exception     */
Re: [PATCH v5 5/9] target/ppc: Simplify syscall exception handlers
Posted by Harsh Prateek Bora 9 months, 1 week ago

On 1/19/24 03:31, BALATON Zoltan wrote:
> After previous changes the hypercall handling in 7xx and 74xx
> exception handlers can be folded into one if statement to simpilfy
> this code. Also add "unlikely" to mark the less freqiently used branch
> for the compiler.
> 
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>

Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>

> ---
>   target/ppc/excp_helper.c | 24 ++++++++----------------
>   1 file changed, 8 insertions(+), 16 deletions(-)
> 
> diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
> index 411d67376c..035a9fd968 100644
> --- a/target/ppc/excp_helper.c
> +++ b/target/ppc/excp_helper.c
> @@ -762,26 +762,22 @@ static void powerpc_excp_7xx(PowerPCCPU *cpu, int excp)
>       case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
>       {
>           int lev = env->error_code;
> -
> -        if (lev == 1 && cpu->vhyp) {
> -            dump_hcall(env);
> -        } else {
> -            dump_syscall(env);
> -        }
>           /*
>            * The Virtual Open Firmware (VOF) relies on the 'sc 1'
>            * instruction to communicate with QEMU. The pegasos2 machine
>            * uses VOF and the 7xx CPUs, so although the 7xx don't have
>            * HV mode, we need to keep hypercall support.
>            */
> -        if (lev == 1 && cpu->vhyp) {
> +        if (unlikely(lev == 1 && cpu->vhyp)) {
>               PPCVirtualHypervisorClass *vhc =
>                   PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
> +            dump_hcall(env);
>               vhc->hypercall(cpu->vhyp, cpu);
>               powerpc_reset_excp_state(cpu);
>               return;
> +        } else {
> +            dump_syscall(env);
>           }
> -
>           break;
>       }
>       case POWERPC_EXCP_FPU:       /* Floating-point unavailable exception     */
> @@ -907,26 +903,22 @@ static void powerpc_excp_74xx(PowerPCCPU *cpu, int excp)
>       case POWERPC_EXCP_SYSCALL:   /* System call exception                    */
>       {
>           int lev = env->error_code;
> -
> -        if (lev == 1 && cpu->vhyp) {
> -            dump_hcall(env);
> -        } else {
> -            dump_syscall(env);
> -        }
>           /*
>            * The Virtual Open Firmware (VOF) relies on the 'sc 1'
>            * instruction to communicate with QEMU. The pegasos2 machine
>            * uses VOF and the 74xx CPUs, so although the 74xx don't have
>            * HV mode, we need to keep hypercall support.
>            */
> -        if (lev == 1 && cpu->vhyp) {
> +        if (unlikely(lev == 1 && cpu->vhyp)) {
>               PPCVirtualHypervisorClass *vhc =
>                   PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
> +            dump_hcall(env);
>               vhc->hypercall(cpu->vhyp, cpu);
>               powerpc_reset_excp_state(cpu);
>               return;
> +        } else {
> +            dump_syscall(env);
>           }
> -
>           break;
>       }
>       case POWERPC_EXCP_FPU:       /* Floating-point unavailable exception     */