]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
refactor(el3_runtime): introduce save_x30 macro
authorManish Pandey <manish.pandey2@arm.com>
Wed, 11 Jan 2023 21:41:07 +0000 (21:41 +0000)
committerManish Pandey <manish.pandey2@arm.com>
Mon, 13 Feb 2023 10:45:46 +0000 (10:45 +0000)
Most of the macros/routine in vector entry need a free scratch register.
Introduce a macro "save_x30" and call it right at the begining of vector
entries where x30 is used. It is more exlicit and less error prone

Signed-off-by: Manish Pandey <manish.pandey2@arm.com>
Change-Id: I617f3d41a120739e5e3fe1c421c79ceb70c1188e

bl31/aarch64/runtime_exceptions.S
include/arch/aarch64/el2_common_macros.S
include/arch/aarch64/el3_common_macros.S

index 0c608597c1d896ed9d5f14e1b1158546fb2bf8ae..7cdde552b18a686b527a129dfa3850179f65bac7 100644 (file)
        .globl  fiq_aarch32
        .globl  serror_aarch32
 
+       /*
+        * Save LR and make x30 available as most of the routines in vector entry
+        * need a free register
+        */
+       .macro save_x30
+       str     x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
+       .endm
+
        /*
         * Macro that prepares entry to EL3 upon taking an exception.
         *
        /* Unmask the SError interrupt */
        msr     daifclr, #DAIF_ABT_BIT
 
-       /*
-        * Explicitly save x30 so as to free up a register and to enable
-        * branching
-        */
-       str     x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
-
        /* Check for SErrors synchronized by the ESB instruction */
        mrs     x30, DISR_EL1
        tbz     x30, #DISR_A_BIT, 1f
        /* Use ISB for the above unmask operation to take effect immediately */
        isb
 
-       /*
-        * Refer Note 1.
-        * No need to restore X30 as macros following this modify x30 anyway.
-        */
-       str     x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
+       /* Refer Note 1. */
        mov     x30, #1
        str     x30, [sp, #CTX_EL3STATE_OFFSET + CTX_IS_IN_EL3]
        dmb     sy
@@ -316,7 +314,7 @@ vector_entry serror_sp_elx
         * triggered due to explicit synchronization in EL3. Refer Note 1.
         */
        /* Assumes SP_EL3 on entry */
-       str     x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
+       save_x30
        ldr     x30, [sp, #CTX_EL3STATE_OFFSET + CTX_IS_IN_EL3]
        cbnz    x30, 1f
 
@@ -338,24 +336,28 @@ vector_entry sync_exception_aarch64
         * to a valid cpu context where the general purpose and system register
         * state can be saved.
         */
+       save_x30
        apply_at_speculative_wa
        check_and_unmask_ea
        handle_sync_exception
 end_vector_entry sync_exception_aarch64
 
 vector_entry irq_aarch64
+       save_x30
        apply_at_speculative_wa
        check_and_unmask_ea
        handle_interrupt_exception irq_aarch64
 end_vector_entry irq_aarch64
 
 vector_entry fiq_aarch64
+       save_x30
        apply_at_speculative_wa
        check_and_unmask_ea
        handle_interrupt_exception fiq_aarch64
 end_vector_entry fiq_aarch64
 
 vector_entry serror_aarch64
+       save_x30
        apply_at_speculative_wa
 #if RAS_EXTENSION
        msr     daifclr, #DAIF_ABT_BIT
@@ -377,24 +379,28 @@ vector_entry sync_exception_aarch32
         * to a valid cpu context where the general purpose and system register
         * state can be saved.
         */
+       save_x30
        apply_at_speculative_wa
        check_and_unmask_ea
        handle_sync_exception
 end_vector_entry sync_exception_aarch32
 
 vector_entry irq_aarch32
+       save_x30
        apply_at_speculative_wa
        check_and_unmask_ea
        handle_interrupt_exception irq_aarch32
 end_vector_entry irq_aarch32
 
 vector_entry fiq_aarch32
+       save_x30
        apply_at_speculative_wa
        check_and_unmask_ea
        handle_interrupt_exception fiq_aarch32
 end_vector_entry fiq_aarch32
 
 vector_entry serror_aarch32
+       save_x30
        apply_at_speculative_wa
 #if RAS_EXTENSION
        msr     daifclr, #DAIF_ABT_BIT
index 7bf4806980de8431b6b92f70fb4729bdb5e1e854..b3b85e67e7cf1313295d02fa66d1a19a1316fda5 100644 (file)
        .macro  apply_at_speculative_wa
 #if ERRATA_SPECULATIVE_AT
        /*
-        * Explicitly save x30 so as to free up a register and to enable
-        * branching and also, save x29 which will be used in the called
-        * function
+        * This function expects x30 has been saved.
+        * Also, save x29 which will be used in the called function.
         */
-       stp     x29, x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
+       str     x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
        bl      save_and_update_ptw_el1_sys_regs
-       ldp     x29, x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
+       ldr     x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
 #endif
        .endm
 
index de2b931af917c4ba588ace3ff44fd05966013c4d..40ff0566814bfca7a9282a80d2d664bac7fa5a5c 100644 (file)
        .macro  apply_at_speculative_wa
 #if ERRATA_SPECULATIVE_AT
        /*
-        * Explicitly save x30 so as to free up a register and to enable
-        * branching and also, save x29 which will be used in the called
-        * function
+        * This function expects x30 has been saved.
+        * Also, save x29 which will be used in the called function.
         */
-       stp     x29, x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
+       str     x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
        bl      save_and_update_ptw_el1_sys_regs
-       ldp     x29, x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
+       ldr     x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X29]
 #endif
        .endm