Changeset 9426f7c4 in mainline


Ignore:
Timestamp:
2013-11-12T22:24:04Z (10 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a3b034b
Parents:
bf677f6
Message:
  • Add proper TLB flushes in as_install_arch()
  • Improve saving %g1-%g4,%g7 in trap and syscall handlers
Location:
kernel/arch/sparc32
Files:
4 edited

Legend:

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

    rbf677f6 r9426f7c4  
    4646#define ASI_CACHEMISS   0x01
    4747#define ASI_CACHECTRL   0x02
     48#define ASI_MMUCACHE    0x10
    4849#define ASI_MMUREGS     0x19
    4950#define ASI_MMUBYPASS   0x1c
     51#define ASI_MMUFLUSH    0x18
    5052
    5153#define TASKMAP_MAX_RECORDS  32
  • kernel/arch/sparc32/src/mm/as.c

    rbf677f6 r9426f7c4  
    5454        context_table[as->asid].et = PTE_ET_DESCRIPTOR;
    5555        asi_u32_write(ASI_MMUREGS, 0x200, as->asid);
     56        asi_u32_write(ASI_MMUCACHE, 0, 1);
     57        asi_u32_write(ASI_MMUFLUSH, 0, 1);
    5658}
    5759
  • kernel/arch/sparc32/src/trap_table.S

    rbf677f6 r9426f7c4  
    8888        or  %l3, %l4, %l3
    8989        and %l3, 0xff, %l3
    90 
    9190        mov %g0, %wim
     91
     92        mov %l5, %g5
     93        mov %l6, %g6
     94        mov %l7, %g7
     95
    9296        save
    9397        std %l0, [%sp +  0]
     
    99103        std %i4, [%sp + 48]
    100104        std %i6, [%sp + 56]
     105        mov %g5, %l5
     106        mov %g6, %l6
     107        mov %g7, %l7
    101108        restore
    102109        mov %l3, %wim
     
    109116        or  %l3, %l4, %l3
    110117        and %l3, 0xff, %l3
     118        mov %g0, %wim
    111119        mov \uwb, %g3
     120
     121        mov %l5, %g5
     122        mov %l6, %g6
     123        mov %l7, %g7
    112124
    113125        save
     
    120132        std %i4, [%g3 + 48]
    121133        std %i6, [%g3 + 56]
     134        mov %g5, %l5
     135        mov %g6, %l6
     136        mov %g7, %l7
    122137        add \uwb, 64, \uwb
    123138        restore
     
    223238
    224239window_overflow_trap:
     240        mov %g7, %l0
     241
    225242        /* rotate WIM on bit right, we have 8 windows */
    226243        mov %wim, %l3
     
    240257
    241258        /* Check whether previous mode was usermode */
    242         and %l0, (1 << 6), %l0
    243         cmp %l0, 0
     259        mov %psr, %l4
     260        and %l4, (1 << 6), %l4
     261        cmp %l4, 0
    244262        beq 1f
    245263        nop
     
    305323
    306324        /* go home */
     325        mov %l0, %g7
    307326        jmp %l1
    308327        rett %l2
    309328
    310329window_underflow_trap:
     330        mov %g7, %l0
     331
    311332        /* rotate WIM on bit LEFT, we have 8 windows */
    312333        mov %wim,%l3
     
    321342
    322343        /* Check whether previous mode was usermode */
    323         mov %psr, %l0
    324         and %l0, (1 << 6), %l0
    325         cmp %l0, 0
     344        mov %psr, %l4
     345        and %l4, (1 << 6), %l4
     346        cmp %l4, 0
    326347        beq 1f
    327348        nop
     
    373394
    374395        /* go home */
     396        mov %l0, %g7
    375397        jmp %l1
    376398        rett %l2
    377399
    378400preemptible_trap:
     401        /* Save %g7 */
     402        mov %g7, %l0
     403
    379404        /* Check whether we landed in invalid window */
    380405        get_wim_number %g6
     
    407432        /* Load kernel stack pointer from invalid window */
    408433        switch_to_invalid %g5, %g6
     434
    409435        /* set uspace window mark */
    410436        mov %g6, %l7
     
    412438        and %l7, 0x7, %l7
    413439        or %l7, 0x10, %l7
     440
    414441        /* Save stack pointer */
    415442        mov %l5, %g7
     
    419446
    4204475:      /* Set up stack frame */
    421         sub %sp, 120, %sp
     448        sub %sp, 128, %sp
    422449
    423450        /* Save trap data on stack */
    424         mov %psr, %l0
     451        mov %psr, %l5
    425452        st %l1, [%sp + 92]
    426453        st %l2, [%sp + 96]
    427         st %l0, [%sp + 100]
     454        st %l5, [%sp + 100]
    428455        st %g1, [%sp + 104]
    429456        st %g2, [%sp + 108]
    430457        st %g3, [%sp + 112]
    431458        st %g4, [%sp + 116]
     459        st %l0, [%sp + 120]
    432460
    433461        /* Enable traps */
     
    448476        ld [%sp + 96], %l2
    449477        ld [%sp + 100], %l0
    450         ld [%sp + 104], %g1
    451         ld [%sp + 108], %g2
    452         ld [%sp + 112], %g3
    453         ld [%sp + 116], %g4
    454478        mov %l0, %psr
    455479        nop
     
    4865107:      inline_restore_kernel
    487511
    488 8:      jmp %l1
     5128:      ld [%sp + 104], %g1
     513        ld [%sp + 108], %g2
     514        ld [%sp + 112], %g3
     515        ld [%sp + 116], %g4
     516        ld [%sp + 120], %g7
     517        jmp %l1
    489518        rett %l2
    490519
     
    565594
    566595syscall_trap:
     596        /* Save %g7 */
     597        mov %g7, %l0
     598
    567599        /* Check whether we landed in invalid window */
    568600        get_wim_number %g6
     
    609641
    6106425:      /* Set up stack frame */
    611         sub %sp, 120, %sp
     643        sub %sp, 128, %sp
    612644
    613645        /* Save trap data on stack */
    614         mov %psr, %l0
     646        mov %psr, %l5
    615647        st %l1, [%sp + 92]
    616648        st %l2, [%sp + 96]
    617         st %l0, [%sp + 100]
     649        st %l5, [%sp + 100]
    618650        st %g1, [%sp + 104]
    619651        st %g2, [%sp + 108]
    620652        st %g3, [%sp + 112]
    621653        st %g4, [%sp + 116]
     654        st %l0, [%sp + 120]
    622655
    623656        /* Enable traps */
     
    645678        ld [%sp + 96], %l2
    646679        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 
    652680        mov %o0, %i0
    653681        mov %l0, %psr
     
    6857137:      inline_restore_kernel
    686714
    687 8:      jmp %l2
     7158:      ld [%sp + 104], %g1
     716        ld [%sp + 108], %g2
     717        ld [%sp + 112], %g3
     718        ld [%sp + 116], %g4
     719        ld [%sp + 120], %g7
     720        jmp %l2
    688721        rett %l2 + 4
    689722
  • kernel/arch/sparc32/src/userspace.c

    rbf677f6 r9426f7c4  
    5252
    5353        asm volatile (
     54                "flush\n"
    5455                "mov %[stack], %%sp\n"
     56                "mov %[arg], %%o1\n"
    5557                "jmp %[entry]\n"
    5658                "mov %[psr], %%psr\n" :: [entry] "r" (kernel_uarg->uspace_entry),
     59                           [arg] "r" (kernel_uarg->uspace_uarg),
    5760                           [psr] "r" (psr),
    5861                           [stack] "r" (kernel_uarg->uspace_stack + kernel_uarg->uspace_stack_size));
Note: See TracChangeset for help on using the changeset viewer.