Changeset 15d0046 in mainline for kernel/arch/ppc32/src/exception.S


Ignore:
Timestamp:
2014-09-12T13:22:33Z (10 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9b20126
Parents:
8db09e4 (diff), 105d8d6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes

File:
1 edited

Legend:

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

    r8db09e4 r15d0046  
    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>
    3235
    3336.section K_UNMAPPED_TEXT_START, "ax"
     
    4245        mtsprg2 sp
    4346       
    44         # check whether SP is in kernel
    45        
    46         andis. sp, sp, 0x8000
     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
    4751        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
     52                # previous mode was kernel
    5853               
    5954                mfsprg2 sp
    6055                subis sp, sp, 0x8000
    61        
     56        b 2f
     57       
     58        1:
     59                # previous mode was user
     60               
     61                mfsprg0 sp
    6262        2:
    6363       
    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)
     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)
    9797       
    9898        mfsrr0 r12
    99         stw r12, 132(sp)
     99        stw r12, ISTATE_OFFSET_PC(sp)
    100100       
    101101        mfsrr1 r12
    102         stw r12, 136(sp)
     102        stw r12, ISTATE_OFFSET_SRR1(sp)
    103103       
    104104        mflr r12
    105         stw r12, 140(sp)
     105        stw r12, ISTATE_OFFSET_LR(sp)
    106106       
    107107        mfctr r12
    108         stw r12, 144(sp)
     108        stw r12, ISTATE_OFFSET_CTR(sp)
    109109       
    110110        mfxer r12
    111         stw r12, 148(sp)
     111        stw r12, ISTATE_OFFSET_XER(sp)
    112112       
    113113        mfdar r12
    114         stw r12, 152(sp)
     114        stw r12, ISTATE_OFFSET_DAR(sp)
    115115       
    116116        mfsprg1 r12
    117         stw r12, 156(sp)
     117        stw r12, ISTATE_OFFSET_R12(sp)
    118118       
    119119        mfsprg2 r12
    120         stw r12, 160(sp)
     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)
    121125.endm
    122126
     
    250254.org 0x4000
    251255jump_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
    252268        lis r12, iret@ha
    253269        addi r12, r12, iret@l
    254270        mtlr r12
    255        
     271
    256272        lis r12, exc_dispatch@ha
    257273        addi r12, r12, exc_dispatch@l
    258274        mtsrr0 r12
    259        
     275
    260276        mfmsr r12
    261         ori r12, r12, (MSR_IR | MSR_DR)@l
     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)
    262281        mtsrr1 r12
    263282       
    264283        addis sp, sp, 0x8000
    265284        mr r4, sp
    266         addi r4, r4, 8
    267285       
    268286        rfi
     
    276294        addi r12, r12, iret_syscall@l
    277295        mtlr r12
    278        
     296
     297        mfsrr1 r0
     298        andi. r0, r0, MSR_FP
    279299        mfmsr r12
    280         ori r12, r12, (MSR_IR | MSR_DR)@l
     300        or r12, r12, r0         # Propagate MSR_FP from SRR1 to MSR
     301        ori r12, r12, (MSR_IR | MSR_DR)
    281302        mtsrr1 r12
    282303       
Note: See TracChangeset for help on using the changeset viewer.