Changeset 817d939 in mainline


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

Changes as follows:

  • Implemented storing kernel stack pointer and userspace window buffer in invalid register window space
  • Initialized IRQ routing
Location:
kernel/arch/sparc32
Files:
6 edited

Legend:

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

    rd783145 r817d939  
    7272} bootinfo_t;
    7373
    74 extern uintptr_t kernel_sp;
    75 extern uintptr_t uspace_wbuf;
    76 
    7774extern void arch_pre_main(void *unused, bootinfo_t *bootinfo);
     75extern void write_to_invalid(uint32_t l0, uint32_t l1, uint32_t l2);
    7876
    7977#endif
  • kernel/arch/sparc32/src/mm/frame.c

    rd783145 r817d939  
    4646        size_t size;
    4747
    48         //machine_get_memory_extents(&base, &size);
    49         base = 0x40000000;
    50         size = 0x4000000;
     48        machine_get_memory_extents(&base, &size);
    5149
    5250        base = ALIGN_UP(base, FRAME_SIZE);
  • kernel/arch/sparc32/src/mm/page.c

    rd783145 r817d939  
    9191        printf("page fault on address 0x%08x, status 0x%08x, type %d\n", fault_address, fault_status, type);
    9292
    93         if (type == FAULT_TYPE_LOAD_USER_DATA || type == FAULT_TYPE_LOAD_SUPERVISOR_DATA)       
     93        if (type == FAULT_TYPE_LOAD_USER_DATA ||
     94            type == FAULT_TYPE_LOAD_SUPERVISOR_DATA)   
    9495                as_page_fault(fault_address, PF_ACCESS_READ, istate);
    9596
    96         if (type == FAULT_TYPE_EXECUTE_USER || type == FAULT_TYPE_EXECUTE_SUPERVISOR)
     97        if (type == FAULT_TYPE_EXECUTE_USER ||
     98            type == FAULT_TYPE_EXECUTE_SUPERVISOR)
    9799                as_page_fault(fault_address, PF_ACCESS_EXEC, istate);
    98100
    99         if (type == FAULT_TYPE_STORE_USER_DATA || type == FAULT_TYPE_STORE_USER_INSTRUCTION || type == FAULT_TYPE_STORE_SUPERVISOR_INSTRUCTION)
     101        if (type == FAULT_TYPE_STORE_USER_DATA ||
     102            type == FAULT_TYPE_STORE_USER_INSTRUCTION ||
     103            type == FAULT_TYPE_STORE_SUPERVISOR_INSTRUCTION)
    100104                as_page_fault(fault_address, PF_ACCESS_WRITE, istate);
    101105}
  • kernel/arch/sparc32/src/proc/scheduler.c

    rd783145 r817d939  
    4444void before_thread_runs_arch(void)
    4545{
    46         kernel_sp = (uintptr_t) THREAD->kstack + STACK_SIZE;
    47         uspace_wbuf = (uintptr_t) THREAD->arch.uspace_window_buffer;
     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);
    4849}
    4950
  • kernel/arch/sparc32/src/sparc32.c

    rd783145 r817d939  
    3737#include <arch/interrupt.h>
    3838#include <arch/asm.h>
     39#include <arch/machine_func.h>
    3940
    4041#include <func.h>
     
    5556char memcpy_from_uspace_failover_address;
    5657char memcpy_to_uspace_failover_address;
     58bootinfo_t machine_bootinfo;
    5759
    5860void arch_pre_main(void *unused, bootinfo_t *bootinfo)
    5961{
    6062        init.cnt = min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
    61        
     63        memcpy(&machine_bootinfo, bootinfo, sizeof(machine_bootinfo));
     64
    6265        size_t i;
    6366        for (i = 0; i < init.cnt; i++) {
     
    6770                    bootinfo->tasks[i].name);
    6871        }
     72
     73        machine_ops_init();
    6974}
    7075
     
    7580void arch_post_mm_init(void)
    7681{
     82        machine_init(&machine_bootinfo);
     83
    7784        if (config.cpu_active == 1) {
    7885                /* Initialize IRQ routing */
    79                 irq_init(0, 0);
     86                irq_init(16, 16);
    8087               
    8188                /* Merge all memory zones to 1 big zone */
    8289                zone_merge_all();
    8390        }
     91
     92        machine_output_init();
    8493}
     94
    8595
    8696void arch_post_cpu_init()
     
    94104void arch_post_smp_init(void)
    95105{
     106        machine_input_init();
    96107}
    97108
  • kernel/arch/sparc32/src/trap_table.S

    rd783145 r817d939  
    3434.global reset_trap
    3535.global preemptible_trap
     36.global interrupt_trap
    3637.global syscall_trap
    3738.global window_overflow_trap
    3839.global window_underflow_trap
     40.global write_to_invalid
     41
     42.macro get_wim_number reg
     43        clr \reg
     44        mov %wim, %g5
     451:      inc \reg
     46        srl %g5, 1, %g5
     47        andcc %g5, 1, %g0
     48        bne 1b
     49        nop
     50.endm
     51
     52.macro get_cwp reg
     53        mov %psr, \reg
     54        and \reg, 0x7, \reg
     55.endm
     56
     57.macro switch_to_invalid saved_wim, saved_psr
     58        get_wim_number %g6
     59        mov %wim, \saved_wim    ! save WIM
     60        mov %g0, %wim           ! clear WIM
     61        mov %psr, \saved_psr    ! read PSR
     62        or \saved_psr, %g6, %g6 ! set CWP
     63        mov %g6, %psr           ! write PSR
     64        nop
     65        nop
     66        nop
     67        nop                     ! wait for PSR to be effective
     68.endm   
     69
     70.macro switch_back wim, psr
     71        mov \wim, %wim          ! saved WIM
     72        mov \psr, %psr          ! saved PSR
     73        nop
     74        nop
     75        nop
     76        nop
     77.endm
     78
     79/* Save next window to kernel stack or UWB */
     80.macro inline_save_kernel
     81        save
     82        std %l0, [%sp +  0]
     83        std %l2, [%sp +  8]
     84        std %l4, [%sp + 16]
     85        std %l6, [%sp + 24]
     86        std %i0, [%sp + 32]
     87        std %i2, [%sp + 40]
     88        std %i4, [%sp + 48]
     89        std %i6, [%sp + 56]
     90        restore
     91.endm
     92
     93.macro inline_save_uspace uwb
     94        save
     95        ld [\uwb], %g1
     96        std %l0, [%g1 +  0]
     97        std %l2, [%g1 +  8]
     98        std %l4, [%g1 + 16]
     99        std %l6, [%g1 + 24]
     100        std %i0, [%g1 + 32]
     101        std %i2, [%g1 + 40]
     102        std %i4, [%g1 + 48]
     103        std %i6, [%g1 + 56]
     104        add \uwb, 64, \uwb
     105        restore
     106.endm
     107
     108/* Restore window from kernel stack or UWB */
     109.macro inline_restore_kernel
     110        save
     111        ldd [%sp +  0], %l0
     112        ldd [%sp +  8], %l2
     113        ldd [%sp + 16], %l4
     114        ldd [%sp + 24], %l6
     115        ldd [%sp + 32], %i0
     116        ldd [%sp + 40], %i2
     117        ldd [%sp + 48], %i4
     118        ldd [%sp + 56], %i6
     119        restore
     120.endm
     121
     122.macro inline_restore_uspace uwb
     123        save
     124        ld [\uwb], %g1
     125        std %l0, [%g1 +  0]
     126        std %l2, [%g1 +  8]
     127        std %l4, [%g1 + 16]
     128        std %l6, [%g1 + 24]
     129        std %i0, [%g1 + 32]
     130        std %i2, [%g1 + 40]
     131        std %i4, [%g1 + 48]
     132        std %i6, [%g1 + 56]
     133        sub \uwb, 64, \uwb
     134        restore
     135.endm
     136
     137.macro if_from_kernel label
     138        mov %psr, %g2
     139        and %g2, (1 << 6), %g2
     140        cmp %g2, 0
     141        bne \label
     142        nop
     143.endm
     144
     145write_to_invalid:
     146        mov %o0, %g5
     147        mov %o1, %g6
     148        mov %o2, %g7
     149        switch_to_invalid %g3, %g4
     150        mov %g5, %l5
     151        mov %g6, %l6
     152        mov %g7, %l7
     153        switch_back %g3, %g4
     154        retl
     155        nop
    39156
    40157reset_trap:
     
    62179        beq 1f
    63180        nop
     181
     182        /* Save invalid window data */
     183        mov %l5, %g5            ! kernel stack pointer
     184        mov %l6, %g6            ! kernel wbuf
     185        mov %l7, %g7
    64186
    65187        /* dump registers to stack */
     
    78200        /* dump registers to uwb */
    792011:      save
    80         set uspace_wbuf, %g2
    81         ld [%g1], %g1
    82         std %l0, [%g1 +  0]
    83         std %l2, [%g1 +  8]
    84         std %l4, [%g1 + 16]
    85         std %l6, [%g1 + 24]
    86         std %i0, [%g1 + 32]
    87         std %i2, [%g1 + 40]
    88         std %i4, [%g1 + 48]
    89         std %i6, [%g1 + 56]
    90         add %g1, 64, %g1
    91         st %g1, [%g2]
    92 
    93         /* back to where we should be */
    94 2:      restore
     202        std %l0, [%g4 +  0]
     203        std %l2, [%g4 +  8]
     204        std %l4, [%g4 + 16]
     205        std %l6, [%g4 + 24]
     206        std %i0, [%g4 + 32]
     207        std %i2, [%g4 + 40]
     208        std %i4, [%g4 + 48]
     209        std %i6, [%g4 + 56]
     210        add %g4, 64, %g4
     211
     2122:      /* back to where we should be */
     213        mov %g5, %l5
     214        mov %g6, %l6
     215        mov %g7, %l7
     216        restore
    95217
    96218        /* set new value of window */
     
    120242        beq 1f
    121243        nop
     244
     245        /* Save invalid window data */
     246        mov %l5, %g5            ! kernel stack pointer
     247        mov %l6, %g6            ! kernel wbuf
     248        mov %l7, %g7
    122249
    123250        /* load registers from stack */
     
    151278        st %g1, [%g2]
    152279
    153         /* back to where we should be */
    154 2:      save
     2802:      /* back to where we should be */
     281        mov %g5, %l5
     282        mov %g6, %l6
     283        mov %g7, %l7
     284        save
    155285        save
    156286
     
    164294
    165295preemptible_trap:
     296        /* Check whether we landed in invalid window */
     297        get_wim_number %g6
     298        get_cwp %g7
     299        cmp %g6, %g7
     300        bne 4f
     301        nop
     302
     303        /* We are in invalid window. Check whether previous mode was usermode */
     304        if_from_kernel 3f
     305
     306        /* Kernel stack pointer is at %l5, uwb is at %l6 */
     307        inline_save_uspace %l6
     3083:      inline_save_kernel
     309
     3104:      /* Check whether previous mode was usermode */
     311        if_from_kernel 5f
     312
     313        /* Load kernel stack pointer from invalid window */
     314        switch_to_invalid %g5, %g6
     315        mov %l5, %g7            ! stack pointer
     316        switch_back %g5, %g6
     317        mov %g7, %sp
     318        mov %sp, %fp
     3195:      sub %sp, 112, %sp
     320
     321        /* Save trap data on stack */
     322        mov %psr, %l0
     323        st %l1, [%fp - 4]
     324        st %l2, [%fp - 8]
     325        st %l0, [%fp - 12]
     326
     327        /* Enable traps */
     328        mov %psr, %l0
     329        or %l0, (1 << 5), %l0
     330        mov %l0, %psr
     331        nop
     332        nop
     333        nop
     334        nop
     335
     336        /* 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
     353interrupt_trap:
    166354        mov %psr, %l0
    167355
     
    195383        /* Jump to actual subroutine */
    196384        mov %g2, %o0
    197         call %g1
     385        call exc_dispatch
    198386        sub %fp, 12, %o1
    199387
     
    268456#define TRAP(_vector, _handler) \
    269457        .org trap_table + _vector * TRAP_ENTRY_SIZE; \
    270         set _vector, %g2 ; \
    271         sethi %hi(_handler), %g1 ; \
     458        set _vector, %o0 ; \
     459        sethi %hi(_handler), %o2 ; \
    272460        b preemptible_trap ; \
    273         or %g1, %lo(_handler), %g1 ;
     461        or %o2, %lo(_handler), %o2 ;
    274462
    275463#define SYSCALL(_vector) \
     
    283471        mov %psr, %l0 ; \
    284472        mov _priority, %g2 ; \
    285         call exc_dispatch ; \
     473        b interrupt_trap ; \
    286474        nop ;
    287475
     
    292480.align TRAP_TABLE_SIZE
    293481trap_table:
    294         TRAP(0x0, reset_trap)
     482        STRAP(0x0, reset_trap)
    295483        TRAP(0x1, instruction_access_exception)
    296484        TRAP(0x2, illegal_instruction)
Note: See TracChangeset for help on using the changeset viewer.