Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ppc32/src/exception.S

    r9d58539 rb66cc97  
    2727#
    2828
     29#include <abi/asmtool.h>
    2930#include <arch/asm/regname.h>
    3031#include <arch/msr.h>
    3132#include <arch/mm/page.h>
     33#include <arch/istate_struct.h>
     34#include <arch/stack.h>
     35#include <align.h>
    3236
    3337.section K_UNMAPPED_TEXT_START, "ax"
     
    4246        mtsprg2 sp
    4347       
    44         # check whether SP is in kernel
    45        
    46         andis. sp, sp, 0x8000
     48        # check whether the previous mode was user or kernel
     49       
     50        mfsrr1 sp # use sp as a temporary register to hold SRR1
     51        andi. sp, sp, MSR_PR
    4752        bne 1f
    48        
    49                 # stack is in user-space
    50                
    51                 mfsprg0 sp
    52        
    53         b 2f
    54        
    55         1:
    56        
    57                 # stack is in kernel
     53                # previous mode was kernel
    5854               
    5955                mfsprg2 sp
    6056                subis sp, sp, 0x8000
    61        
     57        b 2f
     58       
     59        1:
     60                # previous mode was user
     61               
     62                mfsprg0 sp
    6263        2:
    6364       
    64         subi sp, sp, 164
    65         stw r0, 8(sp)
    66         stw r2, 12(sp)
    67         stw r3, 16(sp)
    68         stw r4, 20(sp)
    69         stw r5, 24(sp)
    70         stw r6, 28(sp)
    71         stw r7, 32(sp)
    72         stw r8, 36(sp)
    73         stw r9, 40(sp)
    74         stw r10, 44(sp)
    75         stw r11, 48(sp)
    76         stw r13, 52(sp)
    77         stw r14, 56(sp)
    78         stw r15, 60(sp)
    79         stw r16, 64(sp)
    80         stw r17, 68(sp)
    81         stw r18, 72(sp)
    82         stw r19, 76(sp)
    83         stw r20, 80(sp)
    84         stw r21, 84(sp)
    85         stw r22, 88(sp)
    86         stw r23, 92(sp)
    87         stw r24, 96(sp)
    88         stw r25, 100(sp)
    89         stw r26, 104(sp)
    90         stw r27, 108(sp)
    91         stw r28, 112(sp)
    92         stw r29, 116(sp)
    93         stw r30, 120(sp)
    94         stw r31, 124(sp)
    95        
    96         stw r12, 128(sp)
     65        subi sp, sp, ALIGN_UP(ISTATE_SIZE, STACK_ALIGNMENT)
     66        stw r0, ISTATE_OFFSET_R0(sp)
     67        stw r2, ISTATE_OFFSET_R2(sp)
     68        stw r3, ISTATE_OFFSET_R3(sp)
     69        stw r4, ISTATE_OFFSET_R4(sp)
     70        stw r5, ISTATE_OFFSET_R5(sp)
     71        stw r6, ISTATE_OFFSET_R6(sp)
     72        stw r7, ISTATE_OFFSET_R7(sp)
     73        stw r8, ISTATE_OFFSET_R8(sp)
     74        stw r9, ISTATE_OFFSET_R9(sp)
     75        stw r10, ISTATE_OFFSET_R10(sp)
     76        stw r11, ISTATE_OFFSET_R11(sp)
     77        stw r13, ISTATE_OFFSET_R13(sp)
     78        stw r14, ISTATE_OFFSET_R14(sp)
     79        stw r15, ISTATE_OFFSET_R15(sp)
     80        stw r16, ISTATE_OFFSET_R16(sp)
     81        stw r17, ISTATE_OFFSET_R17(sp)
     82        stw r18, ISTATE_OFFSET_R18(sp)
     83        stw r19, ISTATE_OFFSET_R19(sp)
     84        stw r20, ISTATE_OFFSET_R20(sp)
     85        stw r21, ISTATE_OFFSET_R21(sp)
     86        stw r22, ISTATE_OFFSET_R22(sp)
     87        stw r23, ISTATE_OFFSET_R23(sp)
     88        stw r24, ISTATE_OFFSET_R24(sp)
     89        stw r25, ISTATE_OFFSET_R25(sp)
     90        stw r26, ISTATE_OFFSET_R26(sp)
     91        stw r27, ISTATE_OFFSET_R27(sp)
     92        stw r28, ISTATE_OFFSET_R28(sp)
     93        stw r29, ISTATE_OFFSET_R29(sp)
     94        stw r30, ISTATE_OFFSET_R30(sp)
     95        stw r31, ISTATE_OFFSET_R31(sp)
     96       
     97        stw r12, ISTATE_OFFSET_CR(sp)
    9798       
    9899        mfsrr0 r12
    99         stw r12, 132(sp)
     100        stw r12, ISTATE_OFFSET_PC(sp)
    100101       
    101102        mfsrr1 r12
    102         stw r12, 136(sp)
     103        stw r12, ISTATE_OFFSET_SRR1(sp)
    103104       
    104105        mflr r12
    105         stw r12, 140(sp)
     106        stw r12, ISTATE_OFFSET_LR(sp)
    106107       
    107108        mfctr r12
    108         stw r12, 144(sp)
     109        stw r12, ISTATE_OFFSET_CTR(sp)
    109110       
    110111        mfxer r12
    111         stw r12, 148(sp)
     112        stw r12, ISTATE_OFFSET_XER(sp)
    112113       
    113114        mfdar r12
    114         stw r12, 152(sp)
     115        stw r12, ISTATE_OFFSET_DAR(sp)
    115116       
    116117        mfsprg1 r12
    117         stw r12, 156(sp)
     118        stw r12, ISTATE_OFFSET_R12(sp)
    118119       
    119120        mfsprg2 r12
    120         stw r12, 160(sp)
     121        stw r12, ISTATE_OFFSET_SP(sp)
     122
     123        li r12, 0
     124        stw r12, ISTATE_OFFSET_LR_FRAME(sp)
     125        stw r12, ISTATE_OFFSET_SP_FRAME(sp)
    121126.endm
    122127
    123128.org 0x100
    124 .global exc_system_reset
    125 exc_system_reset:
     129SYMBOL(exc_system_reset)
    126130        CONTEXT_STORE
    127131       
     
    130134
    131135.org 0x200
    132 .global exc_machine_check
    133 exc_machine_check:
     136SYMBOL(exc_machine_check)
    134137        CONTEXT_STORE
    135138       
     
    138141
    139142.org 0x300
    140 .global exc_data_storage
    141 exc_data_storage:
     143SYMBOL(exc_data_storage)
    142144        CONTEXT_STORE
    143145       
     
    146148
    147149.org 0x400
    148 .global exc_instruction_storage
    149 exc_instruction_storage:
     150SYMBOL(exc_instruction_storage)
    150151        CONTEXT_STORE
    151152       
     
    154155
    155156.org 0x500
    156 .global exc_external
    157 exc_external:
     157SYMBOL(exc_external)
    158158        CONTEXT_STORE
    159159       
     
    162162
    163163.org 0x600
    164 .global exc_alignment
    165 exc_alignment:
     164SYMBOL(exc_alignment)
    166165        CONTEXT_STORE
    167166       
     
    170169
    171170.org 0x700
    172 .global exc_program
    173 exc_program:
     171SYMBOL(exc_program)
    174172        CONTEXT_STORE
    175173       
     
    178176
    179177.org 0x800
    180 .global exc_fp_unavailable
    181 exc_fp_unavailable:
     178SYMBOL(exc_fp_unavailable)
    182179        CONTEXT_STORE
    183180       
     
    186183
    187184.org 0x900
    188 .global exc_decrementer
    189 exc_decrementer:
     185SYMBOL(exc_decrementer)
    190186        CONTEXT_STORE
    191187       
     
    194190
    195191.org 0xa00
    196 .global exc_reserved0
    197 exc_reserved0:
     192SYMBOL(exc_reserved0)
    198193        CONTEXT_STORE
    199194       
     
    202197
    203198.org 0xb00
    204 .global exc_reserved1
    205 exc_reserved1:
     199SYMBOL(exc_reserved1)
    206200        CONTEXT_STORE
    207201       
     
    210204
    211205.org 0xc00
    212 .global exc_syscall
    213 exc_syscall:
     206SYMBOL(exc_syscall)
    214207        CONTEXT_STORE
    215208       
     
    217210
    218211.org 0xd00
    219 .global exc_trace
    220 exc_trace:
     212SYMBOL(exc_trace)
    221213        CONTEXT_STORE
    222214       
     
    225217
    226218.org 0x1000
    227 .global exc_itlb_miss
    228 exc_itlb_miss:
     219SYMBOL(exc_itlb_miss)
    229220        CONTEXT_STORE
    230221       
     
    233224
    234225.org 0x1100
    235 .global exc_dtlb_miss_load
    236 exc_dtlb_miss_load:
     226SYMBOL(exc_dtlb_miss_load)
    237227        CONTEXT_STORE
    238228       
     
    241231
    242232.org 0x1200
    243 .global exc_dtlb_miss_store
    244 exc_dtlb_miss_store:
     233SYMBOL(exc_dtlb_miss_store)
    245234        CONTEXT_STORE
    246235       
     
    250239.org 0x4000
    251240jump_to_kernel:
     241        mfsrr1 r5
     242        andi. r5, r5, MSR_PR
     243        bne 1f
     244                # Previous mode was kernel.
     245                # We can construct a proper frame linkage.
     246               
     247                mfsrr0 r12
     248                stw r12, ISTATE_OFFSET_LR_FRAME(sp)
     249                mfsprg2 r12
     250                stw r12, ISTATE_OFFSET_SP_FRAME(sp)
     251        1:
     252
    252253        lis r12, iret@ha
    253254        addi r12, r12, iret@l
    254255        mtlr r12
    255        
     256
    256257        lis r12, exc_dispatch@ha
    257258        addi r12, r12, exc_dispatch@l
    258259        mtsrr0 r12
    259        
     260
    260261        mfmsr r12
    261         ori r12, r12, (MSR_IR | MSR_DR)@l
     262        mfsrr1 r5
     263        andi. r5, r5, MSR_FP
     264        or r12, r12, r5         # Propagate MSR_FP from SRR1 to MSR
     265        ori r12, r12, (MSR_IR | MSR_DR)
    262266        mtsrr1 r12
    263267       
    264268        addis sp, sp, 0x8000
    265269        mr r4, sp
    266         addi r4, r4, 8
    267270       
    268271        rfi
     
    276279        addi r12, r12, iret_syscall@l
    277280        mtlr r12
    278        
     281
     282        mfsrr1 r0
     283        andi. r0, r0, MSR_FP
    279284        mfmsr r12
    280         ori r12, r12, (MSR_IR | MSR_DR)@l
     285        or r12, r12, r0         # Propagate MSR_FP from SRR1 to MSR
     286        ori r12, r12, (MSR_IR | MSR_DR | MSR_EE)
    281287        mtsrr1 r12
    282288       
Note: See TracChangeset for help on using the changeset viewer.