Changeset bbb94545 in mainline


Ignore:
Timestamp:
2013-11-01T20:28:13Z (10 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3f596c9
Parents:
e6a3bfee
Message:

Fixed moving from/to invalid window and register window corruption in
preemptible_trap.

Location:
kernel/arch/sparc32/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc32/src/proc/scheduler.c

    re6a3bfee rbbb94545  
    4444void before_thread_runs_arch(void)
    4545{
    46         uint32_t kernel_sp = (uint32_t) THREAD->kstack + STACK_SIZE;
    47         uint32_t uspace_wbuf = (uint32_t) THREAD->arch.uspace_window_buffer;
    48         write_to_invalid(kernel_sp, uspace_wbuf, 0xdeadbeef);
     46        printf("before_thread_runs_arch(uspace=%d, kernel_sp=0x%08x\n", THREAD->uspace, (uintptr_t)THREAD->kstack + STACK_SIZE);
     47        if (THREAD->uspace) {
     48                uint32_t kernel_sp = (uint32_t) THREAD->kstack + STACK_SIZE - 8;
     49                uint32_t uspace_wbuf = (uint32_t) THREAD->arch.uspace_window_buffer;
     50                write_to_invalid(kernel_sp, uspace_wbuf, 0);
     51        }
    4952}
    5053
  • kernel/arch/sparc32/src/sparc32.c

    re6a3bfee rbbb94545  
    8383{
    8484        /* Test register windows */
    85         write_to_invalid(0xdeadbeef, 0xcafebabe, 0xfeedface);
     85        write_to_invalid(0xdeadbeef, 0xcafebabe, 0);
    8686        func1();
    8787
     
    110110void arch_post_smp_init(void)
    111111{
    112         machine_input_init();
     112//      machine_input_init();
    113113}
    114114
  • kernel/arch/sparc32/src/trap_table.S

    re6a3bfee rbbb94545  
    5959
    6060.macro switch_to_invalid saved_wim, saved_psr
    61         get_wim_number %g6
     61        get_wim_number %l3
    6262        mov %wim, \saved_wim    ! save WIM
    6363        mov %g0, %wim           ! clear WIM
    6464        mov %psr, \saved_psr    ! read PSR
    65         and \saved_psr, 0xfffffff0, %l0
    66         or %l0, %g6, %g6        ! set CWP
    67         mov %g6, %psr           ! write PSR
     65        and \saved_psr, 0xfffffff0, %l4
     66        or %l4, %l3, %l3        ! set CWP
     67        mov %l3, %psr           ! write PSR
    6868        nop
    6969        nop
     
    230230        /* dump registers to uwb */
    2312312:      save
    232         std %l0, [%g4 +  0]
    233         std %l2, [%g4 +  8]
    234         std %l4, [%g4 + 16]
    235         std %l6, [%g4 + 24]
    236         std %i0, [%g4 + 32]
    237         std %i2, [%g4 + 40]
    238         std %i4, [%g4 + 48]
    239         std %i6, [%g4 + 56]
     232        std %l0, [%g6 +  0]
     233        std %l2, [%g6 +  8]
     234        std %l4, [%g6 + 16]
     235        std %l6, [%g6 + 24]
     236        std %i0, [%g6 + 32]
     237        std %i2, [%g6 + 40]
     238        std %i4, [%g6 + 48]
     239        std %i6, [%g6 + 56]
    240240        add %g4, 64, %g4
    241241
     
    276276        restore
    277277        restore
     278        /* Save invalid window data */
     279        mov %l5, %g5            ! kernel stack pointer
     280        mov %l6, %g6            ! kernel wbuf
     281        mov %l7, %g7
     282
     283        /* we should check whether window needs to be saved
     284         * to kernel stack or uwb
     285         */
     286        cmp %g7, 0
     287        bne 3f
     288        nop
     289
    278290        ldd [%sp +  0], %l0
    279291        ldd [%sp +  8], %l2
     
    2903021:      restore
    291303        restore
    292         set uspace_wbuf, %g2
    293         ld [%g2], %g1
    294         ldd [%g1 +  0], %l0
    295         ldd [%g1 +  8], %l2
    296         ldd [%g1 + 16], %l4
    297         ldd [%g1 + 24], %l6
    298         ldd [%g1 + 32], %i0
    299         ldd [%g1 + 40], %i2
    300         ldd [%g1 + 48], %i4
    301         ldd [%g1 + 56], %i6
    302         sub %g1, 64, %g1
    303         st %g1, [%g2]
    304 
    305 2:      /* Save invalid window data */
     304        /* Save invalid window data */
    306305        mov %l5, %g5            ! kernel stack pointer
    307306        mov %l6, %g6            ! kernel wbuf
    308307        mov %l7, %g7
    309         save
    310         save
    311 
    312         /* Restore invalid window data */
     3083:      sub %g6, 64, %g6
     309        ldd [%g6 +  0], %l0
     310        ldd [%g6 +  8], %l2
     311        ldd [%g6 + 16], %l4
     312        ldd [%g6 + 24], %l6
     313        ldd [%g6 + 32], %i0
     314        ldd [%g6 + 40], %i2
     315        ldd [%g6 + 48], %i4
     316        ldd [%g6 + 56], %i6
     317
     3182:      /* Restore invalid window data */
     319        restore
    313320        mov %g5, %l5
    314321        mov %g6, %l6
    315322        mov %g7, %l7
     323        save
     324        save
     325        save
    316326
    317327        /* Set new value of window */
     
    351361        /* Load kernel stack pointer from invalid window */
    352362        switch_to_invalid %g5, %g6
    353         save
    354363        /* set uspace window mark */
    355364        mov %psr, %l7
     
    475484        /* Load kernel stack pointer from invalid window */
    476485        switch_to_invalid %g5, %g6
    477         save
     486        restore
    478487        mov %l5, %g7            ! stack pointer
    479488        switch_back %g5, %g6
Note: See TracChangeset for help on using the changeset viewer.