Ignore:
File:
1 edited

Legend:

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

    r3fde837 r9d58539  
    3030#include <arch/msr.h>
    3131#include <arch/mm/page.h>
    32 #include <arch/istate_struct.h>
    33 #include <arch/stack.h>
    34 #include <align.h>
    3532
    3633.section K_UNMAPPED_TEXT_START, "ax"
     
    4542        mtsprg2 sp
    4643       
    47         # check whether the previous mode was user or kernel
    48        
    49         mfsrr1 sp # use sp as a temporary register to hold SRR1
    50         andi. sp, sp, MSR_PR
     44        # check whether SP is in kernel
     45       
     46        andis. sp, sp, 0x8000
    5147        bne 1f
    52                 # previous mode was kernel
     48       
     49                # stack is in user-space
     50               
     51                mfsprg0 sp
     52       
     53        b 2f
     54       
     55        1:
     56       
     57                # stack is in kernel
    5358               
    5459                mfsprg2 sp
    5560                subis sp, sp, 0x8000
    56         b 2f
    57        
    58         1:
    59                 # previous mode was user
    60                
    61                 mfsprg0 sp
     61       
    6262        2:
    6363       
    64         subi sp, sp, ALIGN_UP(ISTATE_SIZE, STACK_ALIGNMENT)
    65         stw r0, ISTATE_OFFSET_R0(sp)
    66         stw r2, ISTATE_OFFSET_R2(sp)
    67         stw r3, ISTATE_OFFSET_R3(sp)
    68         stw r4, ISTATE_OFFSET_R4(sp)
    69         stw r5, ISTATE_OFFSET_R5(sp)
    70         stw r6, ISTATE_OFFSET_R6(sp)
    71         stw r7, ISTATE_OFFSET_R7(sp)
    72         stw r8, ISTATE_OFFSET_R8(sp)
    73         stw r9, ISTATE_OFFSET_R9(sp)
    74         stw r10, ISTATE_OFFSET_R10(sp)
    75         stw r11, ISTATE_OFFSET_R11(sp)
    76         stw r13, ISTATE_OFFSET_R13(sp)
    77         stw r14, ISTATE_OFFSET_R14(sp)
    78         stw r15, ISTATE_OFFSET_R15(sp)
    79         stw r16, ISTATE_OFFSET_R16(sp)
    80         stw r17, ISTATE_OFFSET_R17(sp)
    81         stw r18, ISTATE_OFFSET_R18(sp)
    82         stw r19, ISTATE_OFFSET_R19(sp)
    83         stw r20, ISTATE_OFFSET_R20(sp)
    84         stw r21, ISTATE_OFFSET_R21(sp)
    85         stw r22, ISTATE_OFFSET_R22(sp)
    86         stw r23, ISTATE_OFFSET_R23(sp)
    87         stw r24, ISTATE_OFFSET_R24(sp)
    88         stw r25, ISTATE_OFFSET_R25(sp)
    89         stw r26, ISTATE_OFFSET_R26(sp)
    90         stw r27, ISTATE_OFFSET_R27(sp)
    91         stw r28, ISTATE_OFFSET_R28(sp)
    92         stw r29, ISTATE_OFFSET_R29(sp)
    93         stw r30, ISTATE_OFFSET_R30(sp)
    94         stw r31, ISTATE_OFFSET_R31(sp)
    95        
    96         stw r12, ISTATE_OFFSET_CR(sp)
     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)
    9797       
    9898        mfsrr0 r12
    99         stw r12, ISTATE_OFFSET_PC(sp)
     99        stw r12, 132(sp)
    100100       
    101101        mfsrr1 r12
    102         stw r12, ISTATE_OFFSET_SRR1(sp)
     102        stw r12, 136(sp)
    103103       
    104104        mflr r12
    105         stw r12, ISTATE_OFFSET_LR(sp)
     105        stw r12, 140(sp)
    106106       
    107107        mfctr r12
    108         stw r12, ISTATE_OFFSET_CTR(sp)
     108        stw r12, 144(sp)
    109109       
    110110        mfxer r12
    111         stw r12, ISTATE_OFFSET_XER(sp)
     111        stw r12, 148(sp)
    112112       
    113113        mfdar r12
    114         stw r12, ISTATE_OFFSET_DAR(sp)
     114        stw r12, 152(sp)
    115115       
    116116        mfsprg1 r12
    117         stw r12, ISTATE_OFFSET_R12(sp)
     117        stw r12, 156(sp)
    118118       
    119119        mfsprg2 r12
    120         stw r12, ISTATE_OFFSET_SP(sp)
    121 
    122         li r12, 0
    123         stw r12, ISTATE_OFFSET_LR_FRAME(sp)
    124         stw r12, ISTATE_OFFSET_SP_FRAME(sp)
     120        stw r12, 160(sp)
    125121.endm
    126122
     
    254250.org 0x4000
    255251jump_to_kernel:
    256         mfsrr1 r5
    257         andi. r5, r5, MSR_PR
    258         bne 1f
    259                 # Previous mode was kernel.
    260                 # We can construct a proper frame linkage.
    261                
    262                 mfsrr0 r12
    263                 stw r12, ISTATE_OFFSET_LR_FRAME(sp)
    264                 mfsprg2 r12
    265                 stw r12, ISTATE_OFFSET_SP_FRAME(sp)
    266         1:
    267 
    268252        lis r12, iret@ha
    269253        addi r12, r12, iret@l
    270254        mtlr r12
    271 
     255       
    272256        lis r12, exc_dispatch@ha
    273257        addi r12, r12, exc_dispatch@l
    274258        mtsrr0 r12
    275 
     259       
    276260        mfmsr r12
    277         mfsrr1 r5
    278         andi. r5, r5, MSR_FP
    279         or r12, r12, r5         # Propagate MSR_FP from SRR1 to MSR
    280         ori r12, r12, (MSR_IR | MSR_DR)
     261        ori r12, r12, (MSR_IR | MSR_DR)@l
    281262        mtsrr1 r12
    282263       
    283264        addis sp, sp, 0x8000
    284265        mr r4, sp
     266        addi r4, r4, 8
    285267       
    286268        rfi
     
    294276        addi r12, r12, iret_syscall@l
    295277        mtlr r12
    296 
    297         mfsrr1 r0
    298         andi. r0, r0, MSR_FP
     278       
    299279        mfmsr r12
    300         or r12, r12, r0         # Propagate MSR_FP from SRR1 to MSR
    301         ori r12, r12, (MSR_IR | MSR_DR)
     280        ori r12, r12, (MSR_IR | MSR_DR)@l
    302281        mtsrr1 r12
    303282       
Note: See TracChangeset for help on using the changeset viewer.