On 12/17/18 6:16 PM, Jan Kiszka wrote:
> On 06.11.18 00:05, Ralf Ramsauer wrote:
>> The final step: remove arch_handle_exit, and dispatch things directly in
>> assembly. As a consequence, we get a faster exit path, as we save the
>> double-dispatching.
>>
>> We also save one instruction inside the interrupt vector. :-)
>>
>> For the union registers, replace the exit_reason with __padding. For
>> easier
>> handling, the padding is located at the beginning of the structure.
> 
> What do we need that padding still for?

There was a reason...

Aah -- Afair, we have an odd number of registers, and the stack needs to
be aligned after pushing all registers.

  Ralf

> 
>>
>> Signed-off-by: Ralf Ramsauer <ralf.ramsa...@oth-regensburg.de>
>> ---
>>   hypervisor/arch/arm64/entry.S                 | 18 +++++--------
>>   .../arch/arm64/include/arch/asm/traps.h       |  3 +++
>>   hypervisor/arch/arm64/include/asm/processor.h |  6 +----
>>   hypervisor/arch/arm64/traps.c                 | 26 ++-----------------
>>   4 files changed, 13 insertions(+), 40 deletions(-)
>>
>> diff --git a/hypervisor/arch/arm64/entry.S
>> b/hypervisor/arch/arm64/entry.S
>> index e0240f00..498a8d64 100644
>> --- a/hypervisor/arch/arm64/entry.S
>> +++ b/hypervisor/arch/arm64/entry.S
>> @@ -271,19 +271,15 @@ bootstrap_vectors:
>>       ventry    .
>>     -.macro handle_vmexit exit_reason
>> +.macro handle_vmexit handler
>>       .align    7
>>       /* We need to save EL1 context, reserve some space on the stack */
>>       sub    sp, sp, #(16 * 16)
>>       /* And push [x1-x4] early, we need registers to work on */
>> +    str        x0, [sp, #(1 * 8)]
>>       stp    x1, x2, [sp, #(1 * 16)]
>>       stp    x3, x4, [sp, #(2 * 16)]
>>   -    /* x1 is available, use it to hold the exit reason */
>> -    mov    x1, #\exit_reason
>> -    /* ... and push it together with x0 */
>> -    stp    x1, x0, [sp, #(0 * 16)]
>> -
>>       /* [x0-x4] may now be clobbered. */
>>         /*
>> @@ -314,7 +310,7 @@ bootstrap_vectors:
>>       mov    x29, xzr    /* reset fp,lr */
>>       mov    x30, xzr
>>       mov    x0, sp
>> -    bl    arch_handle_exit
>> +    bl    \handler
>>       /* take the fast exit path, sp is already in place */
>>       b    __vmreturn
>>   .endm
>> @@ -326,13 +322,13 @@ hyp_vectors:
>>       ventry    .
>>       ventry    .
>>   -    handle_vmexit EXIT_REASON_EL2_ABORT
>> +    handle_vmexit arch_el2_abt
>>       ventry    .
>>       ventry    .
>>       ventry    .
>>   -    handle_vmexit EXIT_REASON_EL1_ABORT
>> -    handle_vmexit EXIT_REASON_EL1_IRQ
>> +    handle_vmexit arch_handle_trap
>> +    handle_vmexit irqchip_handle_irq
>>       ventry    .
>>       ventry    .
>>   @@ -429,8 +425,8 @@ __vmreturn:
>>       ldp    x7, x8, [sp, #(4 * 16)]
>>       ldp    x5, x6, [sp, #(3 * 16)]
>>       ldp    x3, x4, [sp, #(2 * 16)]
>> -    ldp    x1, x0, [sp, #(0 * 16)]    /* x1 is the exit_reason */
>>       ldp    x1, x2, [sp, #(1 * 16)]
>> +    ldr        x0, [sp, #(1 * 8)]
>>       add    sp, sp, #(16 * 16)
>>       eret
>>       .popsection
>> diff --git a/hypervisor/arch/arm64/include/arch/asm/traps.h
>> b/hypervisor/arch/arm64/include/arch/asm/traps.h
>> index aec6de5a..e2164ad9 100644
>> --- a/hypervisor/arch/arm64/include/arch/asm/traps.h
>> +++ b/hypervisor/arch/arm64/include/arch/asm/traps.h
>> @@ -16,3 +16,6 @@ struct trap_context {
>>       u64 spsr;
>>       u64 sp;
>>   };
>> +
>> +void arch_handle_trap(union registers *guest_regs);
>> +void arch_el2_abt(union registers *regs);
>> diff --git a/hypervisor/arch/arm64/include/asm/processor.h
>> b/hypervisor/arch/arm64/include/asm/processor.h
>> index 6396a356..5bedb20a 100644
>> --- a/hypervisor/arch/arm64/include/asm/processor.h
>> +++ b/hypervisor/arch/arm64/include/asm/processor.h
>> @@ -16,17 +16,13 @@
>>   #include <jailhouse/types.h>
>>   #include <jailhouse/utils.h>
>>   -#define EXIT_REASON_EL2_ABORT    0x0
>> -#define EXIT_REASON_EL1_ABORT    0x1
>> -#define EXIT_REASON_EL1_IRQ    0x2
>> -
>>   #define NUM_USR_REGS        31
>>     #ifndef __ASSEMBLY__
>>     union registers {
>>       struct {
>> -        unsigned long exit_reason;
>> +        unsigned long __padding;
>>           unsigned long usr[NUM_USR_REGS];
>>       };
>>   };
>> diff --git a/hypervisor/arch/arm64/traps.c
>> b/hypervisor/arch/arm64/traps.c
>> index 71f6da6f..0174edae 100644
>> --- a/hypervisor/arch/arm64/traps.c
>> +++ b/hypervisor/arch/arm64/traps.c
>> @@ -159,7 +159,7 @@ static const trap_handler trap_handlers[0x40] =
>>       [ESR_EC_DABT_LOW]    = arch_handle_dabt,
>>   };
>>   -static void arch_handle_trap(union registers *guest_regs)
>> +void arch_handle_trap(union registers *guest_regs)
>>   {
>>       struct trap_context ctx;
>>       trap_handler handler;
>> @@ -182,7 +182,7 @@ static void arch_handle_trap(union registers
>> *guest_regs)
>>       }
>>   }
>>   -static void arch_el2_abt(union registers *regs)
>> +void arch_el2_abt(union registers *regs)
>>   {
>>       struct trap_context ctx;
>>   @@ -193,25 +193,3 @@ static void arch_el2_abt(union registers *regs)
>>       dump_hyp_stack(&ctx);
>>       panic_stop();
>>   }
>> -
>> -union registers *arch_handle_exit(union registers *regs)
>> -{
>> -    switch (regs->exit_reason) {
>> -    case EXIT_REASON_EL1_IRQ:
>> -        irqchip_handle_irq();
>> -        break;
>> -
>> -    case EXIT_REASON_EL1_ABORT:
>> -        arch_handle_trap(regs);
>> -        break;
>> -
>> -    case EXIT_REASON_EL2_ABORT:
>> -        arch_el2_abt(regs);
>> -        break;
>> -
>> -    default:
>> -        panic_stop();
>> -    }
>> -
>> -    return regs;
>> -}
>>
> 
> Nice refactoring!
> 
> Jan
> 

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jailhouse-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to