Changeset e6a3bfee in mainline


Ignore:
Timestamp:
2013-10-30T07:10:32Z (11 years ago)
Author:
Jakub Klama <jakub.klama@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bbb94545
Parents:
817d939
Message:

Preemptible trap development, continued. Added register window regression
test.

Location:
kernel/arch/sparc32
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc32/Makefile.inc

    r817d939 re6a3bfee  
    4040
    4141BITS = 32
    42 ENDIANESS = LE
     42ENDIANESS = BE
    4343
    4444ARCH_SOURCES = \
    4545        arch/$(KARCH)/src/start.S \
    4646        arch/$(KARCH)/src/trap_table.S \
     47        arch/$(KARCH)/src/regwin_test.S \
    4748        arch/$(KARCH)/src/context.S \
    4849        arch/$(KARCH)/src/debug/stacktrace.c \
  • kernel/arch/sparc32/src/machine/leon3/leon3.c

    r817d939 re6a3bfee  
    107107{
    108108        *start = LEON3_SDRAM_START;
    109         *size = machine.bootinfo->memsize;
     109        *size = 64 * 1024 * 1024;//machine.bootinfo->memsize;
    110110}
    111111
     
    142142static void leon3_input_init(void)
    143143{
     144#if 0
    144145        grlib_uart_t *scons_inst;
    145 
     146       
    146147        if (machine.scons_dev) {
    147148                /* Create input device. */
     
    158159                }
    159160        }
     161#endif
    160162}
    161163
  • kernel/arch/sparc32/src/mm/frame.c

    r817d939 re6a3bfee  
    3636
    3737#include <mm/frame.h>
     38#include <arch/machine_func.h>
    3839#include <arch/mm/frame.h>
    3940#include <config.h>
  • kernel/arch/sparc32/src/sparc32.c

    r817d939 re6a3bfee  
    7878}
    7979
     80extern void func1(void);
     81
    8082void arch_post_mm_init(void)
    8183{
     84        /* Test register windows */
     85        write_to_invalid(0xdeadbeef, 0xcafebabe, 0xfeedface);
     86        func1();
     87
    8288        machine_init(&machine_bootinfo);
    8389
  • kernel/arch/sparc32/src/start.S

    r817d939 re6a3bfee  
    5454        sub     %sp, 96, %sp
    5555
    56         mov     %o1, %i0
     56        mov     %o1, %l1
     57        set     0xdeadbeef, %o0
     58        set     0xdeadbeef, %o1
     59        set     0, %o2
     60        call write_to_invalid
     61        nop
     62
     63        mov     %l1, %o1
    5764        call arch_pre_main
    5865        nop
  • kernel/arch/sparc32/src/trap_table.S

    r817d939 re6a3bfee  
    4343        clr \reg
    4444        mov %wim, %g5
    45 1:      inc \reg
     451:      andcc %g5, 1, %g0
     46        bne 2f
     47        nop
    4648        srl %g5, 1, %g5
    47         andcc %g5, 1, %g0
    48         bne 1b
    49         nop
     49        inc \reg
     50        b 1b
     512:      nop
     52
    5053.endm
    5154
     
    6063        mov %g0, %wim           ! clear WIM
    6164        mov %psr, \saved_psr    ! read PSR
    62         or \saved_psr, %g6, %g6 ! set CWP
     65        and \saved_psr, 0xfffffff0, %l0
     66        or %l0, %g6, %g6        ! set CWP
    6367        mov %g6, %psr           ! write PSR
    6468        nop
     
    7983/* Save next window to kernel stack or UWB */
    8084.macro inline_save_kernel
     85        set 0x80000100, %g2
     86        set 'k', %g1
     87        sta %g1, [%g2] 0x1c
    8188        save
    8289        std %l0, [%sp +  0]
     
    9299
    93100.macro inline_save_uspace uwb
     101        set 0x80000100, %g2
     102        set 'u', %g1
     103        sta %g1, [%g2] 0x1c
    94104        save
    95105        ld [\uwb], %g1
     
    144154
    145155write_to_invalid:
    146         mov %o0, %g5
    147         mov %o1, %g6
     156        ! Write value 1
     157        mov %o0, %g7
     158        switch_to_invalid %g3, %g4
     159        mov %g7, %l5
     160        switch_back %g3, %g4
     161        ! Write value 2
     162        mov %o1, %g7
     163        switch_to_invalid %g3, %g4
     164        mov %g7, %l6
     165        switch_back %g3, %g4
     166        ! Write value 3
    148167        mov %o2, %g7
    149168        switch_to_invalid %g3, %g4
    150         mov %g5, %l5
    151         mov %g6, %l6
    152169        mov %g7, %l7
    153170        switch_back %g3, %g4
     
    173190        nop; nop; nop
    174191
    175         /* Check whether previous mode was usermode */
    176         mov %psr, %l0
    177         and %l0, (1 << 6), %l0
    178         cmp %l0, 0
    179         beq 1f
    180         nop
    181 
    182192        /* Save invalid window data */
    183193        mov %l5, %g5            ! kernel stack pointer
    184194        mov %l6, %g6            ! kernel wbuf
    185195        mov %l7, %g7
     196
     197        /* Check whether previous mode was usermode */
     198        and %l0, (1 << 6), %l0
     199        cmp %l0, 0
     200        beq 1f
     201        nop
     202
     203        /* kernel: */
     204        /* we should check whether window needs to be saved
     205         * to kernel stack or uwb
     206         */
     207        cmp %g7, 0
     208        bne 2f
     209        nop
    186210
    187211        /* dump registers to stack */
     
    195219        std %i4, [%sp + 48]
    196220        std %i6, [%sp + 56]
    197         b 2f
    198         nop
     221        b 3f
     222        nop
     223
     2241:      /* uspace: */
     225        /* set uspace window mark */
     226        mov %psr, %g7
     227        and %g7, 0x7, %g7
     228        inc %g7
    199229
    200230        /* dump registers to uwb */
    201 1:      save
     2312:      save
    202232        std %l0, [%g4 +  0]
    203233        std %l2, [%g4 +  8]
     
    210240        add %g4, 64, %g4
    211241
    212 2:      /* back to where we should be */
     2423:      /* back to where we should be */
    213243        mov %g5, %l5
    214244        mov %g6, %l6
     
    242272        beq 1f
    243273        nop
    244 
    245         /* Save invalid window data */
    246         mov %l5, %g5            ! kernel stack pointer
    247         mov %l6, %g6            ! kernel wbuf
    248         mov %l7, %g7
    249274
    250275        /* load registers from stack */
     
    278303        st %g1, [%g2]
    279304
    280 2:      /* back to where we should be */
     3052:      /* Save invalid window data */
     306        mov %l5, %g5            ! kernel stack pointer
     307        mov %l6, %g6            ! kernel wbuf
     308        mov %l7, %g7
     309        save
     310        save
     311
     312        /* Restore invalid window data */
    281313        mov %g5, %l5
    282314        mov %g6, %l6
    283315        mov %g7, %l7
    284         save
    285         save
    286 
    287         /* set new value of window */
     316
     317        /* Set new value of window */
    288318        mov %l3,%wim
    289319        nop; nop; nop
     
    304334        if_from_kernel 3f
    305335
     336        /* Trap originated from uspace */
     337        /* Kernel stack pointer is at %l5, uwb is at %l6 */
     338        inline_save_uspace %l6
     339
     340        /* set uspace window mark */
     341        mov %psr, %l7
     342        and %l7, 0x7, %l7
     343        inc %l7
     344
     3453:      /* Trap originated from kernel */
     346        inline_save_kernel
     347
     3484:      /* Check whether previous mode was usermode */
     349        if_from_kernel 5f
     350
     351        /* Load kernel stack pointer from invalid window */
     352        switch_to_invalid %g5, %g6
     353        save
     354        /* set uspace window mark */
     355        mov %psr, %l7
     356        and %l7, 0x7, %l7
     357        inc %l7
     358        /* Save stack pointer */
     359        mov %l5, %g7
     360        switch_back %g5, %g6
     361        mov %g7, %sp
     362        mov %sp, %fp
     363
     364        /* Set secondary invalid window mark */
     365        add %g7, 1, %l7
     366
     3675:      /* Set up stack frame */
     368        sub %sp, 112, %sp
     369
     370        /* Save trap data on stack */
     371        mov %psr, %l0
     372        st %l1, [%fp - 4]
     373        st %l2, [%fp - 8]
     374        st %l0, [%fp - 12]
     375
     376        /* Enable traps */
     377        mov %psr, %l0
     378        or %l0, (1 << 5), %l0
     379        mov %l0, %psr
     380        nop
     381        nop
     382        nop
     383        nop
     384
     385        /* Jump to actual subroutine */
     386        call %o2
     387        sub %fp, 12, %o1
     388
     389        /* Return from handler */
     390        ld [%fp - 4], %l1
     391        ld [%fp - 8], %l2
     392        ld [%fp - 12], %l0
     393        mov %l0, %psr
     394        nop
     395        nop
     396        nop
     397        nop
     398        nop
     399
     400        /* If trap originated from uspace, clear uspace window mark */
     401        if_from_kernel 6f
     402        switch_to_invalid %g5, %g6
     403        clr %l7
     404        switch_back %g5, %g6
     405
     4066:      jmp %l1
     407        rett %l2
     408
     409interrupt_trap:
     410        mov %psr, %l0
     411
     412        /* Check whether previous mode was usermode */
     413        and %l0, (1 << 6), %l0
     414        cmp %l0, 0
     415        bne 1f
     416        nop
     417
     418        /* Set up stack */
     419        set kernel_sp, %l4
     420        ld [%l4], %sp
     421        mov %sp, %fp
     4221:      sub %sp, 112, %sp
     423
     424        /* Save trap data on stack */
     425        mov %psr, %l0
     426        st %l1, [%fp - 4]
     427        st %l2, [%fp - 8]
     428        st %l0, [%fp - 12]
     429
     430        /* Enable traps */
     431        mov %psr, %l0
     432        or %l0, (1 << 5), %l0
     433        mov %l0, %psr
     434        nop
     435        nop
     436        nop
     437        nop
     438
     439        /* Jump to actual subroutine */
     440        mov %g2, %o0
     441        call exc_dispatch
     442        sub %fp, 12, %o1
     443
     444        /* Return from handler */
     445        ld [%fp - 4], %l1
     446        ld [%fp - 8], %l2
     447        ld [%fp - 12], %l0
     448        mov %l0, %psr
     449        nop
     450        nop
     451        nop
     452        nop
     453        nop
     454        jmp %l1
     455        rett %l2
     456
     457syscall_trap:
     458        /* Check whether we landed in invalid window */
     459        get_wim_number %g6
     460        get_cwp %g7
     461        cmp %g6, %g7
     462        bne 4f
     463        nop
     464
     465        /* We are in invalid window. Check whether previous mode was usermode */
     466        if_from_kernel 3f
     467
    306468        /* Kernel stack pointer is at %l5, uwb is at %l6 */
    307469        inline_save_uspace %l6
     
    313475        /* Load kernel stack pointer from invalid window */
    314476        switch_to_invalid %g5, %g6
     477        save
    315478        mov %l5, %g7            ! stack pointer
    316479        switch_back %g5, %g6
     
    335498
    336499        /* Jump to actual subroutine */
    337         call %o2
    338         sub %fp, 12, %o1
    339 
    340         /* Return from handler */
    341         ld [%fp - 4], %l1
    342         ld [%fp - 8], %l2
    343         ld [%fp - 12], %l0
    344         mov %l0, %psr
    345         nop
    346         nop
    347         nop
    348         nop
    349         nop
    350         jmp %l1
    351         rett %l2
    352 
    353 interrupt_trap:
    354         mov %psr, %l0
    355 
    356         /* Check whether previous mode was usermode */
    357         and %l0, (1 << 6), %l0
    358         cmp %l0, 0
    359         bne 1f
    360         nop
    361 
    362         /* Set up stack */
    363         set kernel_sp, %l4
    364         ld [%l4], %sp
    365         mov %sp, %fp
    366 1:      sub %sp, 112, %sp
    367 
    368         /* Save trap data on stack */
    369         mov %psr, %l0
    370         st %l1, [%fp - 4]
    371         st %l2, [%fp - 8]
    372         st %l0, [%fp - 12]
    373 
    374         /* Enable traps */
    375         mov %psr, %l0
    376         or %l0, (1 << 5), %l0
    377         mov %l0, %psr
    378         nop
    379         nop
    380         nop
    381         nop
    382 
    383         /* Jump to actual subroutine */
    384         mov %g2, %o0
    385         call exc_dispatch
    386         sub %fp, 12, %o1
    387 
    388         /* Return from handler */
    389         ld [%fp - 4], %l1
    390         ld [%fp - 8], %l2
    391         ld [%fp - 12], %l0
    392         mov %l0, %psr
    393         nop
    394         nop
    395         nop
    396         nop
    397         nop
    398         jmp %l1
    399         rett %l2
    400 
    401 syscall_trap:
    402         mov %psr, %l0
    403 
    404         /* Set up stack */
    405         set kernel_sp, %l4
    406         ld [%l4], %sp
    407         mov %sp, %fp
    408         sub %sp, 112, %sp
    409 
    410         /* Save trap data on stack */
    411         mov %psr, %l0
    412         st %l1, [%fp - 4]
    413         st %l2, [%fp - 8]
    414         st %l0, [%fp - 12]
    415 
    416         /* Enable traps */
    417         mov %psr, %l0
    418         or %l0, (1 << 5), %l0
    419         mov %l0, %psr
    420         nop
    421         nop
    422         nop
    423         nop
    424 
    425         /* Jump to actual subroutine */
    426         sub %g2, 0x80, %g2
    427         st %g2, [ %sp + 92 ]
    428         mov %i0, %o1
     500        sub %o0, 0x80, %o0
     501        st %o0, [ %sp + 92 ]
     502        mov %i0, %o0
    429503        mov %i1, %o1
    430504        mov %i2, %o2
     
    463537#define SYSCALL(_vector) \
    464538        .org trap_table + _vector * TRAP_ENTRY_SIZE; \
    465         set _vector, %g2 ; \
     539        set _vector, %o0 ; \
    466540        b syscall_trap ; \
    467541        nop ;
Note: See TracChangeset for help on using the changeset viewer.