Changeset 7f341820 in mainline


Ignore:
Timestamp:
2009-02-17T14:09:31Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
30e2bba
Parents:
85156d3
Message:

mips32: basic SMP support

Files:
1 added
1 deleted
13 edited
2 moved

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r85156d3 r7f341820  
    282282
    283283% Support for SMP
    284 ! [(PLATFORM=ia32&MACHINE!=athlon-xp)|PLATFORM=amd64|PLATFORM=sparc64|PLATFORM=ia64] CONFIG_SMP (y/n)
     284! [(PLATFORM=ia32&MACHINE!=athlon-xp)|PLATFORM=amd64|PLATFORM=sparc64|PLATFORM=ia64|(PLATFORM=mips32&MACHINE=msim)] CONFIG_SMP (y/n)
    285285
    286286% Improved support for hyperthreading
  • kernel/arch/mips32/Makefile.inc

    r85156d3 r7f341820  
    3434TOOLCHAIN_DIR = $(CROSS_PREFIX)/mipsel
    3535
    36 KERNEL_LOAD_ADDRESS = 0x80100000
    37 
    3836GCC_CFLAGS += -mno-abicalls -G 0 -fno-zero-initialized-in-bss
    3937
    40 DEFS += -D__32_BITS__ -DKERNEL_LOAD_ADDRESS=$(KERNEL_LOAD_ADDRESS)
     38DEFS += -D__32_BITS__
    4139
    4240## Accepted MACHINEs
     
    7573        arch/$(KARCH)/src/panic.S \
    7674        arch/$(KARCH)/src/mips32.c \
    77         arch/$(KARCH)/src/dummy.S \
    7875        arch/$(KARCH)/src/console.c \
    7976        arch/$(KARCH)/src/asm.S \
     
    9188        arch/$(KARCH)/src/drivers/msim.c \
    9289        arch/$(KARCH)/src/drivers/serial.c \
    93         arch/$(KARCH)/src/smp/order.c
     90        arch/$(KARCH)/src/smp/dorder.c \
     91        arch/$(KARCH)/src/smp/smp.c
  • kernel/arch/mips32/_link.ld.in

    r85156d3 r7f341820  
    99#undef mips
    1010#define mips mips
     11
     12#define KERNEL_LOAD_ADDRESS 0x80100000
    1113
    1214OUTPUT_ARCH(mips)
  • kernel/arch/mips32/include/asm.h

    r85156d3 r7f341820  
    5656        uintptr_t v;
    5757       
    58         asm volatile ("and %0, $29, %1\n" : "=r" (v) : "r" (~(STACK_SIZE-1)));
     58        asm volatile (
     59                "and %0, $29, %1\n"
     60                : "=r" (v)
     61                : "r" (~(STACK_SIZE-1))
     62        );
    5963       
    6064        return v;
     
    6468extern void asm_delay_loop(uint32_t t);
    6569extern void userspace_asm(uintptr_t ustack, uintptr_t uspace_uarg,
    66                           uintptr_t entry);
     70    uintptr_t entry);
    6771
    6872extern ipl_t interrupts_disable(void);
     
    7074extern void interrupts_restore(ipl_t ipl);
    7175extern ipl_t interrupts_read(void);
     76extern void asm_delay_loop(uint32_t t);
    7277
    7378static inline void pio_write_8(ioport_t port, uint8_t v)
  • kernel/arch/mips32/include/atomic.h

    r85156d3 r7f341820  
    3636#define KERN_mips32_ATOMIC_H_
    3737
    38 #define atomic_inc(x)   ((void) atomic_add(x, 1))
    39 #define atomic_dec(x)   ((void) atomic_add(x, -1))
     38#define atomic_inc(x)  ((void) atomic_add(x, 1))
     39#define atomic_dec(x)  ((void) atomic_add(x, -1))
    4040
    41 #define atomic_postinc(x) (atomic_add(x, 1) - 1)
    42 #define atomic_postdec(x) (atomic_add(x, -1) + 1)
     41#define atomic_postinc(x)  (atomic_add(x, 1) - 1)
     42#define atomic_postdec(x)  (atomic_add(x, -1) + 1)
    4343
    44 #define atomic_preinc(x) atomic_add(x, 1)
    45 #define atomic_predec(x) atomic_add(x, -1)
     44#define atomic_preinc(x)  atomic_add(x, 1)
     45#define atomic_predec(x)  atomic_add(x, -1)
    4646
    4747/* Atomic addition of immediate value.
     
    5555{
    5656        long tmp, v;
    57 
     57       
    5858        asm volatile (
    5959                "1:\n"
    6060                "       ll %0, %1\n"
    61                 "       addu %0, %0, %3\n"      /* same as addi, but never traps on overflow */
    62                 "       move %2, %0\n"
     61                "       addu %0, %0, %3\n"  /* same as addi, but never traps on overflow */
     62                "       move %2, %0\n"
    6363                "       sc %0, %1\n"
    64                 "       beq %0, %4, 1b\n"       /* if the atomic operation failed, try again */
     64                "       beq %0, %4, 1b\n"   /* if the atomic operation failed, try again */
    6565                "       nop\n"
    6666                : "=&r" (tmp), "+m" (val->count), "=&r" (v)
    6767                : "r" (i), "i" (0)
    68                 );
     68        );
     69       
     70        return v;
     71}
    6972
     73static inline uint32_t test_and_set(atomic_t *val) {
     74        uint32_t tmp, v;
     75       
     76        asm volatile (
     77                "1:\n"
     78                "       ll %2, %1\n"
     79                "       bnez %2, 2f\n"
     80                "       li %0, %3\n"
     81                "       sc %0, %1\n"
     82                "       beqz %0, 1b\n"
     83                "2:\n"
     84                : "=&r" (tmp), "+m" (val->count), "=&r" (v)
     85                : "i" (1)
     86        );
     87       
    7088        return v;
    7189}
  • kernel/arch/mips32/include/cpu.h

    r85156d3 r7f341820  
    4343        uint32_t rev_num;
    4444} cpu_arch_t;
    45        
     45
    4646#endif
    4747
  • kernel/arch/mips32/include/interrupt.h

    r85156d3 r7f341820  
    3939#include <arch/exception.h>
    4040
    41 #define IVT_ITEMS 32
    42 #define IVT_FIRST 0
     41#define IVT_ITEMS  32
     42#define IVT_FIRST  0
     43
     44#define VECTOR_TLB_SHOOTDOWN_IPI  EXC_Int
    4345
    4446extern function virtual_timer_fnc;
  • kernel/arch/mips32/include/smp/dorder.h

    r85156d3 r7f341820  
    2727 */
    2828
    29 #ifndef KERN_mips32_ORDER_H_
    30 #define KERN_mips32_ORDER_H_
     29#ifndef KERN_mips32_DORDER_H_
     30#define KERN_mips32_DORDER_H_
    3131
    3232extern void ipi_broadcast_arch(int ipi);
  • kernel/arch/mips32/src/asm.S

    r85156d3 r7f341820  
    2828
    2929#include <arch/asm/regname.h>
    30        
     30
    3131.text
    3232
     
    4646.set noreorder
    4747.set nomacro
     48
     49.global asm_delay_loop
     50asm_delay_loop:
     51        j $31
     52        nop
    4853
    4954.global cpu_halt
  • kernel/arch/mips32/src/debugger.c

    r85156d3 r7f341820  
    163163                if (breakpoints[i].address == (uintptr_t)argv->intval) {
    164164                        printf("Duplicate breakpoint %d.\n", i);
    165                         spinlock_unlock(&bkpoints_lock);
     165                        spinlock_unlock(&bkpoint_lock);
    166166                        return 0;
    167167                } else if (breakpoints[i].address == (uintptr_t)argv->intval +
     
    170170                        printf("Adjacent breakpoints not supported, conflict "
    171171                            "with %d.\n", i);
    172                         spinlock_unlock(&bkpoints_lock);
     172                        spinlock_unlock(&bkpoint_lock);
    173173                        return 0;
    174174                }
    175                        
     175               
    176176        }
    177177
  • kernel/arch/mips32/src/interrupt.c

    r85156d3 r7f341820  
    4242#include <ddi/device.h>
    4343
    44 #define IRQ_COUNT 8
    45 #define TIMER_IRQ 7
     44#define IRQ_COUNT   8
     45#define TIMER_IRQ   7
     46#define DORDER_IRQ  5
    4647
    4748function virtual_timer_fnc = NULL;
  • kernel/arch/mips32/src/mips32.c

    r85156d3 r7f341820  
    167167}
    168168
     169void calibrate_delay_loop(void)
     170{
     171}
     172
    169173void userspace(uspace_arg_t *kernel_uarg)
    170174{
  • kernel/arch/mips32/src/mm/tlb.c

    r85156d3 r7f341820  
    2727 */
    2828
    29 /** @addtogroup mips32mm       
     29/** @addtogroup mips32mm
    3030 * @{
    3131 */
     
    4242#include <arch.h>
    4343#include <symtab.h>
    44 #include <synch/spinlock.h>
     44#include <synch/mutex.h>
    4545#include <print.h>
    4646#include <debug.h>
     
    9393        pte_t *pte;
    9494        int pfrc;
    95 
     95       
    9696        badvaddr = cp0_badvaddr_read();
    97 
    98         spinlock_lock(&AS->lock);
     97       
     98        mutex_lock(&AS->lock);
    9999        asid = AS->asid;
    100         spinlock_unlock(&AS->lock);
    101 
     100        mutex_unlock(&AS->lock);
     101       
    102102        page_table_lock(AS, true);
    103 
     103       
    104104        pte = find_mapping_and_check(badvaddr, PF_ACCESS_READ, istate, &pfrc);
    105105        if (!pte) {
  • kernel/arch/mips32/src/smp/dorder.c

    r85156d3 r7f341820  
    2727 */
    2828
    29 /** @addtogroup mips32 
     29/** @addtogroup mips32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include <arch/smp/order.h>
     35#include <arch/smp/dorder.h>
    3636
    37 #define MSIM_ORDER_ADDRESS      0xB0000004
     37#define MSIM_DORDER_ADDRESS  0xB0000004
    3838
    3939void ipi_broadcast_arch(int ipi)
    4040{
    41         *((volatile unsigned int *) MSIM_ORDER_ADDRESS) = 0x7FFFFFFF;
     41#ifdef CONFIG_SMP
     42        *((volatile unsigned int *) MSIM_DORDER_ADDRESS) = 0x7FFFFFFF;
     43#endif
    4244}
    4345
  • kernel/generic/src/mm/as.c

    r85156d3 r7f341820  
    123123
    124124        link_initialize(&as->inactive_as_with_asid_link);
    125         mutex_initialize(&as->lock, MUTEX_PASSIVE);     
     125        mutex_initialize(&as->lock, MUTEX_PASSIVE);
    126126       
    127127        rc = as_constructor_arch(as, flags);
Note: See TracChangeset for help on using the changeset viewer.