Changeset 679dc0c in mainline


Ignore:
Timestamp:
2013-11-11T12:28:25Z (11 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bf677f6
Parents:
3d1956b
Message:
  • Save %g1-%g4 to the stack in trap handlers.
  • Fix CWP calculation issues (overflows)
  • Implement 'present' bit in userspace window mark
Location:
kernel/arch/sparc32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc32/include/arch/exception.h

    r3d1956b r679dc0c  
    6767extern void data_store_error(int n, istate_t *istate);
    6868extern void mem_address_not_aligned(int n, istate_t *istate);
    69 extern void syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id);
     69extern sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id);
    7070
    7171#endif /* !__ASM__ */
  • kernel/arch/sparc32/src/exception.c

    r3d1956b r679dc0c  
    140140}
    141141
    142 void syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id)
     142sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id)
    143143{
    144144        printf("syscall %d\n", id);
    145         syscall_handler(a1, a2, a3, a4, a5, a6, id);
     145        printf("args: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", a1, a2, a3, a4, a5, a6);
     146        return syscall_handler(a1, a2, a3, a4, a5, a6, id);
    146147}
    147148
  • kernel/arch/sparc32/src/trap_table.S

    r3d1956b r679dc0c  
    8383/* Save next window to kernel stack or UWB */
    8484.macro inline_save_kernel
    85         mov %wim, %g2
     85        mov %wim, %l3
     86        sll %l3, 7, %l4
     87        srl %l3, 1, %l3
     88        or  %l3, %l4, %l3
     89        and %l3, 0xff, %l3
     90
    8691        mov %g0, %wim
    8792        save
     
    95100        std %i6, [%sp + 56]
    96101        restore
    97         mov %g2, %wim
     102        mov %l3, %wim
    98103.endm
    99104
    100105.macro inline_save_uspace uwb
    101         mov %wim, %g2
    102         mov %g0, %wim
     106        mov %wim, %l3
     107        sll %l3, 7, %l4
     108        srl %l3, 1, %l3
     109        or  %l3, %l4, %l3
     110        and %l3, 0xff, %l3
     111        mov \uwb, %g3
     112
    103113        save
    104         std %l0, [\uwb +  0]
    105         std %l2, [\uwb +  8]
    106         std %l4, [\uwb + 16]
    107         std %l6, [\uwb + 24]
    108         std %i0, [\uwb + 32]
    109         std %i2, [\uwb + 40]
    110         std %i4, [\uwb + 48]
    111         std %i6, [\uwb + 56]
     114        std %l0, [%g3 +  0]
     115        std %l2, [%g3 +  8]
     116        std %l4, [%g3 + 16]
     117        std %l6, [%g3 + 24]
     118        std %i0, [%g3 + 32]
     119        std %i2, [%g3 + 40]
     120        std %i4, [%g3 + 48]
     121        std %i6, [%g3 + 56]
    112122        add \uwb, 64, \uwb
    113123        restore
    114         mov %g2, %wim
     124        mov %l3, %wim
    115125.endm
    116126
     
    165175        save   
    166176
     177        sub \uwb, 64, \uwb
    167178        ldd [\uwb +  0], %l0
    168179        ldd [\uwb +  8], %l2
     
    173184        ldd [\uwb + 48], %i4
    174185        ldd [\uwb + 56], %i6
    175         sub \uwb, 64, \uwb
    176186        save
    177187
     
    180190
    181191.macro if_from_kernel label
    182         mov %psr, %g2
    183         and %g2, (1 << 6), %g2
    184         cmp %g2, 0
     192        mov %psr, %l3
     193        and %l3, (1 << 6), %l3
     194        cmp %l3, 0
    185195        bne \label
    186196        nop
     
    245255        /* dump registers to stack */
    246256        save
    247         st %l0, [%sp + 0] ! XXX
    248257        std %l0, [%sp +  0]
    249258        std %l2, [%sp +  8]
     
    261270        mov %psr, %g7
    262271        and %g7, 0x7, %g7
    263         inc %g7
     272        or %g7, 0x10, %g7
    264273
    2652742:      save
     
    272281        std %i4, [%g6 + 48]
    273282        std %i6, [%g6 + 56]
    274         add %g4, 64, %g4
     283        add %g6, 64, %g6
    275284
    276285        /* check whether it's the last user window to be saved */
     286        and %g7, 0x7, %l5
    277287        mov %psr, %l4
    278288        and %l4, 0x7, %l4
    279         inc %l4
    280         cmp %g7, %l4
     289        cmp %l5, %l4
    281290        bne 3f
    282291        nop
     
    384393        /* set uspace window mark */
    385394        mov %psr, %l7
     395        inc %l7
    386396        and %l7, 0x7, %l7
    387         inc %l7
     397        or %l7, 0x10, %l7
     398        b 4f
     399        nop
    388400
    3894013:      /* Trap originated from kernel */
     
    397409        /* set uspace window mark */
    398410        mov %g6, %l7
     411        inc %l7
    399412        and %l7, 0x7, %l7
    400         inc %l7
     413        or %l7, 0x10, %l7
    401414        /* Save stack pointer */
    402415        mov %l5, %g7
     
    406419
    4074205:      /* Set up stack frame */
    408         sub %sp, 112, %sp
     421        sub %sp, 120, %sp
    409422
    410423        /* Save trap data on stack */
     
    413426        st %l2, [%sp + 96]
    414427        st %l0, [%sp + 100]
     428        st %g1, [%sp + 104]
     429        st %g2, [%sp + 108]
     430        st %g3, [%sp + 112]
     431        st %g4, [%sp + 116]
    415432
    416433        /* Enable traps */
     
    431448        ld [%sp + 96], %l2
    432449        ld [%sp + 100], %l0
     450        ld [%sp + 104], %g1
     451        ld [%sp + 108], %g2
     452        ld [%sp + 112], %g3
     453        ld [%sp + 116], %g4
    433454        mov %l0, %psr
    434455        nop
     
    450471        get_cwp %g7
    451472        inc %g7
     473        and %g7, 0x7, %g7
    452474        cmp %g6, %g7
    453475        bne 8f
     
    456478
    457479        inline_restore_uspace %g1
     480        switch_to_invalid %g5, %g6
     481        mov %g1, %l6
     482        switch_back %g5, %g6
    458483        b 8f
    459484        nop
     
    528553
    529554        inline_restore_uspace %g1
     555        switch_to_invalid %g5, %g6
     556        mov %g1, %l6
     557        switch_back %g5, %g6
    530558        b 8f
    531559        nop
     
    547575        if_from_kernel 3f
    548576
     577        /* Trap originated from uspace */
    549578        /* Kernel stack pointer is at %l5, uwb is at %l6 */
    550579        inline_save_uspace %l6
    551 3:      inline_save_kernel
     580
     581        /* set uspace window mark */
     582        mov %psr, %l7
     583        inc %l7
     584        and %l7, 0x7, %l7
     585        or %l7, 0x10, %l7
     586        b 4f
     587        nop
     588
     5893:      /* Trap originated from kernel */
     590        inline_save_kernel
    552591
    5535924:      /* Check whether previous mode was usermode */
     
    556595        /* Load kernel stack pointer from invalid window */
    557596        switch_to_invalid %g5, %g6
     597
    558598        /* set uspace window mark */
    559599        mov %g6, %l7
     600        inc %l7
    560601        and %l7, 0x7, %l7
    561         inc %l7
     602        or %l7, 0x10, %l7
     603
    562604        /* Save stack pointer */
    563605        mov %l5, %g7
    564606        switch_back %g5, %g6
    565607        mov %g7, %sp
    566         mov %sp, %fp
    567 5:      sub %sp, 112, %sp
     608//      mov %sp, %fp
     609
     6105:      /* Set up stack frame */
     611        sub %sp, 120, %sp
    568612
    569613        /* Save trap data on stack */
     
    572616        st %l2, [%sp + 96]
    573617        st %l0, [%sp + 100]
     618        st %g1, [%sp + 104]
     619        st %g2, [%sp + 108]
     620        st %g3, [%sp + 112]
     621        st %g4, [%sp + 116]
    574622
    575623        /* Enable traps */
     
    597645        ld [%sp + 96], %l2
    598646        ld [%sp + 100], %l0
     647        ld [%sp + 104], %g1
     648        ld [%sp + 108], %g2
     649        ld [%sp + 112], %g3
     650        ld [%sp + 116], %g4
     651
     652        mov %o0, %i0
    599653        mov %l0, %psr
    600654        nop
     
    616670        get_cwp %g7
    617671        inc %g7
     672        and %g7, 0x7, %g7
    618673        cmp %g6, %g7
    619674        bne 8f
     
    622677
    623678        inline_restore_uspace %g1
     679        switch_to_invalid %g5, %g6
     680        mov %g1, %l6
     681        switch_back %g5, %g6
    624682        b 8f
    625683        nop
    626684
    6276857:      inline_restore_kernel
    628 
    629686
    6306878:      jmp %l2
Note: See TracChangeset for help on using the changeset viewer.