Changeset e762b43 in mainline for kernel/arch/arm32/src/exception.c


Ignore:
Timestamp:
2009-03-03T16:12:43Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
02fd705
Parents:
f24d300
Message:

better inline assembler readability using the new symbolic syntax

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/exception.c

    rf24d300 re762b43  
    6464 * Temporary exception stack is used to save a few registers
    6565 * before stack switch takes place.
     66 *
    6667 */
    6768inline static void setup_stack_and_save_regs()
    6869{
    69         asm volatile(
    70                 "ldr r13, =exc_stack            \n"
    71                 "stmfd r13!, {r0}               \n"
    72                 "mrs r0, spsr                   \n"
    73                 "and r0, r0, #0x1f              \n"
    74                 "cmp r0, #0x10                  \n"
    75                 "bne 1f                         \n"
    76 
     70        asm volatile (
     71                "ldr r13, =exc_stack\n"
     72                "stmfd r13!, {r0}\n"
     73                "mrs r0, spsr\n"
     74                "and r0, r0, #0x1f\n"
     75                "cmp r0, #0x10\n"
     76                "bne 1f\n"
     77               
    7778                /* prev mode was usermode */
    78                 "ldmfd r13!, {r0}               \n"
    79                 "ldr r13, =supervisor_sp        \n"
    80                 "ldr r13, [r13]                 \n"
    81                 "stmfd r13!, {lr}               \n"
    82                 "stmfd r13!, {r0-r12}           \n"
    83                 "stmfd r13!, {r13, lr}^         \n"
    84                 "mrs r0, spsr                   \n"
    85                 "stmfd r13!, {r0}               \n"
    86                 "b 2f                           \n"
    87 
     79                "ldmfd r13!, {r0}\n"
     80                "ldr r13, =supervisor_sp\n"
     81                "ldr r13, [r13]\n"
     82                "stmfd r13!, {lr}\n"
     83                "stmfd r13!, {r0-r12}\n"
     84                "stmfd r13!, {r13, lr}^\n"
     85                "mrs r0, spsr\n"
     86                "stmfd r13!, {r0}\n"
     87                "b 2f\n"
     88               
    8889                /* mode was not usermode */
    89         "1:\n"
    90                 "stmfd r13!, {r1, r2, r3}       \n"
    91                 "mrs r1, cpsr                   \n"
    92                 "mov r2, lr                     \n"
    93                 "bic r1, r1, #0x1f              \n"
    94                 "orr r1, r1, r0                 \n"
    95                 "mrs r0, cpsr                   \n"
    96                 "msr cpsr_c, r1                 \n"
    97 
    98                 "mov r3, r13                    \n"
    99                 "stmfd r13!, {r2}               \n"
    100                 "mov r2, lr                     \n"
    101                 "stmfd r13!, {r4-r12}           \n"
    102                 "mov r1, r13                    \n"
    103                 /* the following two lines are for debugging */
    104                 "mov sp, #0                     \n"
    105                 "mov lr, #0                     \n"
    106                 "msr cpsr_c, r0                 \n"
    107 
    108                 "ldmfd r13!, {r4, r5, r6, r7}   \n"
    109                 "stmfd r1!, {r4, r5, r6}        \n"
    110                 "stmfd r1!, {r7}                \n"
    111                 "stmfd r1!, {r2}                \n"
    112                 "stmfd r1!, {r3}                \n"
    113                 "mrs r0, spsr                   \n"
    114                 "stmfd r1!, {r0}                \n"
    115                 "mov r13, r1                    \n"
    116         "2:\n"
     90                "1:\n"
     91                        "stmfd r13!, {r1, r2, r3}\n"
     92                        "mrs r1, cpsr\n"
     93                        "mov r2, lr\n"
     94                        "bic r1, r1, #0x1f\n"
     95                        "orr r1, r1, r0\n"
     96                        "mrs r0, cpsr\n"
     97                        "msr cpsr_c, r1\n"
     98                       
     99                        "mov r3, r13\n"
     100                        "stmfd r13!, {r2}\n"
     101                        "mov r2, lr\n"
     102                        "stmfd r13!, {r4-r12}\n"
     103                        "mov r1, r13\n"
     104                       
     105                        /* the following two lines are for debugging */
     106                        "mov sp, #0\n"
     107                        "mov lr, #0\n"
     108                        "msr cpsr_c, r0\n"
     109                       
     110                        "ldmfd r13!, {r4, r5, r6, r7}\n"
     111                        "stmfd r1!, {r4, r5, r6}\n"
     112                        "stmfd r1!, {r7}\n"
     113                        "stmfd r1!, {r2}\n"
     114                        "stmfd r1!, {r3}\n"
     115                        "mrs r0, spsr\n"
     116                        "stmfd r1!, {r0}\n"
     117                        "mov r13, r1\n"
     118                       
     119                "2:\n"
    117120        );
    118121}
     
    190193
    191194/** Calls exception dispatch routine. */
    192 #define CALL_EXC_DISPATCH(exception)            \
    193         asm("mov r0, %0" : : "i" (exception));  \
    194         asm("mov r1, r13");                     \
    195         asm("bl exc_dispatch");         
     195#define CALL_EXC_DISPATCH(exception) \
     196        asm volatile ( \
     197                "mov r0, %[exc]\n" \
     198                "mov r1, r13\n" \
     199                "bl exc_dispatch\n" \
     200                :: [exc] "i" (exception) \
     201        );\
    196202
    197203/** General exception handler.
     
    202208 *  @param exception Exception number.
    203209 */
    204 #define PROCESS_EXCEPTION(exception)            \
    205         setup_stack_and_save_regs();            \
    206         CALL_EXC_DISPATCH(exception)            \
     210#define PROCESS_EXCEPTION(exception) \
     211        setup_stack_and_save_regs(); \
     212        CALL_EXC_DISPATCH(exception) \
    207213        load_regs();
    208214
     
    334340        uint32_t control_reg;
    335341       
    336         asm volatile("mrc p15, 0, %0, c1, c1" : "=r" (control_reg));
     342        asm volatile (
     343                "mrc p15, 0, %[control_reg], c1, c1"
     344                : [control_reg] "=r" (control_reg)
     345        );
    337346       
    338347        /* switch on the high vectors bit */
    339348        control_reg |= CP15_R1_HIGH_VECTORS_BIT;
    340349       
    341         asm volatile("mcr p15, 0, %0, c1, c1" : : "r" (control_reg));
     350        asm volatile (
     351                "mcr p15, 0, %[control_reg], c1, c1"
     352                :: [control_reg] "r" (control_reg)
     353        );
    342354}
    343355#endif
    344356
    345357/** Initializes exception handling.
    346  * 
     358 *
    347359 * Installs low-level exception handlers and then registers
    348360 * exceptions and their handlers to kernel exception dispatcher.
Note: See TracChangeset for help on using the changeset viewer.