Ignore:
Timestamp:
2013-12-10T22:33:33Z (10 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f7a33de
Parents:
2955bb9
Message:

Fixes as follows:

  • memcpy_from/to_uspace - fixed return value when size is 0
  • saving UWB pointer after thead runs
  • preemptible trap/syscall fixes
  • support for missing page fault types in page_fault()
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc32/src/trap_table.S

    r2955bb9 r382fb4ba  
    279279        restore
    280280        mov %g5, %wim
     281
     282        /* Check beginning of %sp */
    281283        and %g4, 0xfffff000, %l4
     284        lda [%l4] 0x18, %l4
     285        cmp %l4, 0
     286        bne 1f
     287        nop
     288
     289        /* prepare args for preemptible handler */
     290        mov %g4, %o0
     291        set preemptible_save_uspace, %o2
     292        b preemptible_trap
     293        nop
     294
     295        /* Check end of %sp */
     296        add %g4, 56, %g4
     297        and %l4, 0xfffff000, %l4
    282298        lda [%l4] 0x18, %l4
    283299        cmp %l4, 0
     
    532548        nop
    533549
     550        /* Get UWB address */
     551//      switch_to_invalid %g5, %g6
     552//      mov %l6, %g1
     553//      switch_back %g5, %g6
     554
     555#       /* Flush windows to stack */
     556        call flush_windows
     557        nop
     558/*
     559        get_wim_number %g2
     560        get_cwp %g5
     561        mov %psr, %g6
     562
     563        sub %g2, 1, %g4
     564        and %g4, 0x7, %g4
     5650:      mov %g0, %wim
     566        cmp %g5, %g4
     567        be 0f
     568        nop
     569
     570        restore
     571        add %g1, 64, %g1
     572        std %l0, [%g1  + 0]
     573        std %l2, [%g1 +  8]
     574        std %l4, [%g1 + 16]
     575        std %l6, [%g1 + 24]
     576        std %i0, [%g1 + 32]
     577        std %l2, [%g1 + 40]
     578        std %l4, [%g1 + 48]
     579        std %l6, [%g1 + 56]
     580        inc %g5
     581        and %g5, 0x7, %g5
     582        ba 0b
     583        nop
     584
     5850:      inc %g4
     586        and %g4, 0x7, %g4
     587        clr %g5
     588        inc %g5
     589        sll %g5, %g4, %g5
     590
     591        * Write values to invalid window and switch back *
     592        mov %g7, %l5
     593        mov %g1, %l6
     594        clr %l7
     595        switch_back %g5, %g6
     596*/
     597
    534598        /* Jump to actual subroutine */
    535599        call %o2
     
    548612
    549613        /* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
    550         if_from_kernel 6f
     614        if_from_kernel 9f
    551615        switch_to_invalid %g5, %g6
    552616        clr %l7
     
    594658        switch_back %g5, %g6
    595659
    596         /* If next window is invalid, do inline restore */
    597 6:      get_wim_number %g6
    598         get_cwp %g7
    599         inc %g7
    600         and %g7, 0x7, %g7
    601         cmp %g6, %g7
    602         bne 8f
    603 
    604         if_from_kernel 7f
    605 
    606         inline_restore_uspace %g1
    607         switch_to_invalid %g5, %g6
    608         mov %g1, %l6
    609         switch_back %g5, %g6
    610         b 8f
    611         nop
    612 
    613 7:      inline_restore_kernel
    614 
    615 8:      ld [%sp + 104], %g1
     660        mov %sp, %l3
     661        sub %g2, 128, %sp
     662        ld [%sp + 104], %g1
    616663        ld [%sp + 108], %g2
    617664        ld [%sp + 112], %g3
    618665        ld [%sp + 116], %g4
    619666        ld [%sp + 120], %g7
    620         jmp %l1
     667        mov %l3, %sp
     668        b 10f
     669        nop
     670
     6719:      ld [%sp + 104], %g1
     672        ld [%sp + 108], %g2
     673        ld [%sp + 112], %g3
     674        ld [%sp + 116], %g4
     675        ld [%sp + 120], %g7
     676
     67710:     jmp %l1
    621678        rett %l2
    622679
    623680interrupt_trap:
    624         mov %psr, %l0
    625 
    626         /* Check whether previous mode was usermode */
    627         and %l0, (1 << 6), %l0
    628         cmp %l0, 0
    629         bne 1f
    630         nop
    631 
    632         /* Set up stack */
    633         set kernel_sp, %l4
    634         ld [%l4], %sp
    635         mov %sp, %fp
    636 1:      sub %sp, 112, %sp
    637 
    638         /* Save trap data on stack */
    639         mov %psr, %l0
    640         st %l1, [%fp - 4]
    641         st %l2, [%fp - 8]
    642         st %l0, [%fp - 12]
    643 
    644         /* Enable traps */
    645         mov %psr, %l0
    646         or %l0, (1 << 5), %l0
    647         mov %l0, %psr
    648         nop
    649         nop
    650         nop
    651         nop
    652 
    653         /* Jump to actual subroutine */
    654         mov %g2, %o0
    655         call exc_dispatch
    656         sub %fp, 12, %o1
    657 
    658         /* Return from handler */
    659         ld [%fp - 4], %l1
    660         ld [%fp - 8], %l2
    661         ld [%fp - 12], %l0
    662         mov %l0, %psr
    663         nop
    664         nop
    665         nop
    666         nop
    667         nop
    668 
    669         /* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
    670         if_from_kernel 6f
    671         switch_to_invalid %g5, %g6
    672         clr %l7
    673         mov %l6, %g7
    674         switch_back %g5, %g6
    675         mov %g7, %g1
    676 
    677         /* If next window is invalid, do inline restore */
    678 6:      get_wim_number %g6
    679         get_cwp %g7
    680         inc %g7
    681         cmp %g6, %g7
    682         bne 8f
    683 
    684         if_from_kernel 7f
    685 
    686         inline_restore_uspace %g1
    687         switch_to_invalid %g5, %g6
    688         mov %g1, %l6
    689         switch_back %g5, %g6
    690         b 8f
    691         nop
    692 
    693 7:      inline_restore_kernel
    694 
    695 8:      jmp %l1
    696         rett %l2
    697 
    698 syscall_trap:
    699681        /* Save %g7 */
    700682        mov %g7, %l0
     
    766748        nop
    767749
     750        /* Flush windows to stack */
     751        call flush_windows
     752        nop
     753
    768754        /* Jump to actual subroutine */
    769         sub %o0, 0x80, %o0
    770         st %o0, [ %sp + 92 ]
    771         mov %i0, %o0
    772         mov %i1, %o1
    773         mov %i2, %o2
    774         mov %i3, %o3
    775         mov %i4, %o4
    776         call syscall
    777         mov %i5, %o5
     755        mov %g2, %o0
     756        call exc_dispatch
     757        add %sp, 128, %o1
    778758
    779759        /* Return from handler */
     
    781761        ld [%sp + 96], %l2
    782762        ld [%sp + 100], %l0
    783         mov %o0, %i0
    784         mov %psr, %l1
    785         and %l1, 0xf, %l1
    786         and %l0, 0xfffffff0, %l0
    787         or %l0, %l1, %l0
    788763        mov %l0, %psr
    789764        nop
     
    864839        ld [%sp + 116], %g4
    865840        ld [%sp + 120], %g7
     841        jmp %l1
     842        rett %l2
     843
     844
     845syscall_trap:
     846        /* Save %g7 */
     847        mov %g7, %l0
     848
     849        /* Check whether we landed in invalid window */
     850        get_wim_number %g6
     851        get_cwp %g7
     852        cmp %g6, %g7
     853        bne 4f
     854        nop
     855
     856        /* We are in invalid window. Check whether previous mode was usermode */
     857        if_from_kernel 3f
     858
     859        /* Trap originated from uspace */
     860        /* Kernel stack pointer is at %l5, uwb is at %l6 */
     861        inline_save_uspace %l6
     862
     863        /* set uspace window mark */
     864        mov %psr, %l7
     865        inc %l7
     866        and %l7, 0x7, %l7
     867        or %l7, 0x10, %l7
     868        b 4f
     869        nop
     870
     8713:      /* Trap originated from kernel */
     872        inline_save_kernel
     873
     8744:      /* Check whether previous mode was usermode */
     875        if_from_kernel 5f
     876
     877        /* Load kernel stack pointer from invalid window */
     878        switch_to_invalid %g5, %g6
     879
     880        /* set uspace window mark */
     881        mov %g6, %l7
     882        inc %l7
     883        and %l7, 0x7, %l7
     884        or %l7, 0x10, %l7
     885
     886        /* Save stack pointer */
     887        mov %l5, %g7
     888        switch_back %g5, %g6
     889        mov %g7, %sp
     890//      mov %sp, %fp
     891
     8925:      /* Set up stack frame */
     893        sub %sp, 128, %sp
     894
     895        /* Save trap data on stack */
     896        mov %psr, %l5
     897        st %l1, [%sp + 92]
     898        st %l2, [%sp + 96]
     899        st %l5, [%sp + 100]
     900        st %g1, [%sp + 104]
     901        st %g2, [%sp + 108]
     902        st %g3, [%sp + 112]
     903        st %g4, [%sp + 116]
     904        st %l0, [%sp + 120]
     905
     906        /* Enable traps */
     907        mov %psr, %l0
     908        or %l0, (1 << 5), %l0
     909        mov %l0, %psr
     910        nop
     911        nop
     912        nop
     913        nop
     914
     915        /* Flush windows */
     916        call flush_windows
     917        nop
     918
     919        /* Jump to actual subroutine */
     920        sub %o0, 0x80, %o0
     921        st %o0, [ %sp + 92 ]
     922        mov %i0, %o0
     923        mov %i1, %o1
     924        mov %i2, %o2
     925        mov %i3, %o3
     926        mov %i4, %o4
     927        call syscall
     928        mov %i5, %o5
     929
     930        /* Return from handler */
     931        ld [%sp + 92], %l1
     932        ld [%sp + 96], %l2
     933        ld [%sp + 100], %l0
     934        mov %o0, %i0
     935        mov %psr, %l1
     936        and %l1, 0xf, %l1
     937        and %l0, 0xfffffff0, %l0
     938        or %l0, %l1, %l0
     939        mov %l0, %psr
     940        nop
     941        nop
     942        nop
     943        nop
     944        nop
     945
     946        /* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
     947        if_from_kernel 8f
     948        switch_to_invalid %g5, %g6
     949        mov %l5, %g2
     950        mov %l6, %g1
     951        mov %l7, %g7
     952        switch_back %g5, %g6
     953       
     954        /* If trap originated from uspace, restore all windows from UWB */
     955        /* UWB pointer is at %g1 */
     9560:      mov %g0, %wim
     957        clr %g5
     958        andcc %g1, UWB_ALIGNMENT - 1, %g0
     959        bz 0f
     960        nop
     961
     962        restore
     963        sub %g1, 64, %g1
     964        ldd [%g1 +  0], %l0
     965        ldd [%g1 +  8], %l2
     966        ldd [%g1 + 16], %l4
     967        ldd [%g1 + 24], %l6
     968        ldd [%g1 + 32], %i0
     969        ldd [%g1 + 40], %i2
     970        ldd [%g1 + 48], %i4
     971        ldd [%g1 + 56], %i6
     972        inc %g5
     973        and %g5, 0x7, %g5
     974        ba 0b
     975        nop
     976
     977        /* We've restored all uspace windows. Now time to
     978         * fix CWP and WIM
     979         */
     9800:      restore
     981        get_cwp %g7
     982        clr %g5
     983        inc %g5
     984        sll %g5, %g7, %g5
     985
     986        /* Write values to invalid window and switch back */
     987        mov %g2, %l5
     988        mov %g1, %l6
     989        clr %l7
     990        switch_back %g5, %g6
     991
     9928:      mov %sp, %l1
     993        sub %g2, 128, %sp
     994        ld [%sp + 104], %g1
     995        ld [%sp + 108], %g2
     996        ld [%sp + 112], %g3
     997        ld [%sp + 116], %g4
     998        ld [%sp + 120], %g7
     999        mov %l1, %sp
    8661000        jmp %l2
    8671001        rett %l2 + 4
Note: See TracChangeset for help on using the changeset viewer.