Changes in / [af56e9b:721d4e85] in mainline
- Files:
-
- 2 added
- 13 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
raf56e9b r721d4e85 344 344 ! [PLATFORM=sparc64] CONFIG_VIRT_IDX_DCACHE (y/n) 345 345 346 % Simics SMP Hack347 ! [PROCESSOR=sun4v] CONFIG_SIMICS_SMP_HACK (y/n)348 349 346 % Support for userspace debuggers 350 347 ! CONFIG_UDEBUG (y/n) -
kernel/arch/sparc64/Makefile.inc
raf56e9b r721d4e85 92 92 arch/$(KARCH)/src/drivers/sgcn.c \ 93 93 arch/$(KARCH)/src/drivers/pci.c \ 94 arch/$(KARCH)/src/drivers/fhc.c \ 95 arch/$(KARCH)/src/trap/$(USARCH)/interrupt.c 94 arch/$(KARCH)/src/drivers/fhc.c 96 95 97 96 ifeq ($(USARCH),sun4u) … … 113 112 ifeq ($(CONFIG_SMP),y) 114 113 ARCH_SOURCES += \ 115 arch/$(KARCH)/src/smp/ $(USARCH)/smp.c \116 arch/$(KARCH)/src/smp/ $(USARCH)/ipi.c114 arch/$(KARCH)/src/smp/ipi.c \ 115 arch/$(KARCH)/src/smp/smp.c 117 116 endif 118 117 -
kernel/arch/sparc64/include/sun4v/cpu.h
raf56e9b r721d4e85 46 46 struct cpu; 47 47 48 /* 48 49 typedef struct { 49 50 uint64_t exec_unit_id; … … 51 52 uint64_t cpuids[MAX_CORE_STRANDS]; 52 53 struct cpu *cpus[MAX_CORE_STRANDS]; 53 //cpu_t *cpus[MAX_CORE_STRANDS];54 54 atomic_t nrdy; 55 55 SPINLOCK_DECLARE(proposed_nrdy_lock); 56 56 } exec_unit_t; 57 */ 57 58 58 59 typedef struct cpu_arch { … … 62 63 generated when the TICK register 63 64 matches this value. */ 64 exec_unit_t *exec_unit; /**< Physical core. */65 unsigned long proposed_nrdy; /**< Proposed No. of ready threads66 so that cores are equally balanced. */65 //exec_unit_t *exec_unit; /**< Physical core. */ 66 //unsigned long proposed_nrdy; /**< Proposed No. of ready threads 67 // so that cores are equally balanced. */ 67 68 } cpu_arch_t; 68 69 -
kernel/arch/sparc64/include/trap/interrupt.h
raf56e9b r721d4e85 32 32 /** 33 33 * @file 34 * @brief This file contains level N interrupt and inter-processor interrupt 35 * trap handler. 34 * @brief This file contains interrupt vector trap handler. 36 35 */ 37 #ifndef KERN_sparc64_INTERRUPT_TRAP_H_ 38 #define KERN_sparc64_INTERRUPT_TRAP_H_ 36 37 #ifndef KERN_sparc64_TRAP_INTERRUPT_H_ 38 #define KERN_sparc64_TRAP_INTERRUPT_H_ 39 40 #include <arch/trap/trap_table.h> 41 #include <arch/stack.h> 42 43 /* IMAP register bits */ 44 #define IGN_MASK 0x7c0 45 #define INO_MASK 0x1f 46 #define IMAP_V_MASK (1ULL << 31) 47 48 #define IGN_SHIFT 6 49 50 51 /* Interrupt ASI registers. */ 52 #define ASI_INTR_W 0x77 53 #define ASI_INTR_DISPATCH_STATUS 0x48 54 #define ASI_INTR_R 0x7f 55 #define ASI_INTR_RECEIVE 0x49 56 57 /* VA's used with ASI_INTR_W register. */ 58 #if defined (US) 59 #define ASI_UDB_INTR_W_DATA_0 0x40 60 #define ASI_UDB_INTR_W_DATA_1 0x50 61 #define ASI_UDB_INTR_W_DATA_2 0x60 62 #elif defined (US3) 63 #define VA_INTR_W_DATA_0 0x40 64 #define VA_INTR_W_DATA_1 0x48 65 #define VA_INTR_W_DATA_2 0x50 66 #define VA_INTR_W_DATA_3 0x58 67 #define VA_INTR_W_DATA_4 0x60 68 #define VA_INTR_W_DATA_5 0x68 69 #define VA_INTR_W_DATA_6 0x80 70 #define VA_INTR_W_DATA_7 0x88 71 #endif 72 #define VA_INTR_W_DISPATCH 0x70 73 74 /* VA's used with ASI_INTR_R register. */ 75 #if defined(US) 76 #define ASI_UDB_INTR_R_DATA_0 0x40 77 #define ASI_UDB_INTR_R_DATA_1 0x50 78 #define ASI_UDB_INTR_R_DATA_2 0x60 79 #elif defined (US3) 80 #define VA_INTR_R_DATA_0 0x40 81 #define VA_INTR_R_DATA_1 0x48 82 #define VA_INTR_R_DATA_2 0x50 83 #define VA_INTR_R_DATA_3 0x58 84 #define VA_INTR_R_DATA_4 0x60 85 #define VA_INTR_R_DATA_5 0x68 86 #define VA_INTR_R_DATA_6 0x80 87 #define VA_INTR_R_DATA_7 0x88 88 #endif 89 90 /* Shifts in the Interrupt Vector Dispatch virtual address. */ 91 #define INTR_VEC_DISPATCH_MID_SHIFT 14 92 93 /* Bits in the Interrupt Dispatch Status register. */ 94 #define INTR_DISPATCH_STATUS_NACK 0x2 95 #define INTR_DISPATCH_STATUS_BUSY 0x1 39 96 40 97 #define TT_INTERRUPT_LEVEL_1 0x41 … … 54 111 #define TT_INTERRUPT_LEVEL_15 0x4f 55 112 113 #define TT_INTERRUPT_VECTOR_TRAP 0x60 114 56 115 #define INTERRUPT_LEVEL_N_HANDLER_SIZE TRAP_TABLE_ENTRY_SIZE 57 58 /* IMAP register bits */ 59 #define IGN_MASK 0x7c0 60 #define INO_MASK 0x1f 61 #define IMAP_V_MASK (1ULL << 31) 62 63 #define IGN_SHIFT 6 64 116 #define INTERRUPT_VECTOR_TRAP_HANDLER_SIZE TRAP_TABLE_ENTRY_SIZE 65 117 66 118 #ifdef __ASM__ … … 69 121 PREEMPTIBLE_HANDLER exc_dispatch 70 122 .endm 71 #endif 123 124 .macro INTERRUPT_VECTOR_TRAP_HANDLER 125 PREEMPTIBLE_HANDLER interrupt 126 .endm 127 #endif /* __ASM__ */ 72 128 73 129 #ifndef __ASM__ … … 78 134 #endif /* !def __ASM__ */ 79 135 80 81 #if defined (SUN4U)82 #include <arch/trap/sun4u/interrupt.h>83 #elif defined (SUN4V)84 #include <arch/trap/sun4v/interrupt.h>85 #endif86 87 136 #endif 88 137 -
kernel/arch/sparc64/src/cpu/sun4v/cpu.c
raf56e9b r721d4e85 41 41 #include <arch/sun4v/md.h> 42 42 #include <arch/sun4v/hypercall.h> 43 #include <arch/trap/sun4v/interrupt.h>44 43 45 44 //#include <arch/trap/sun4v/interrupt.h> … … 75 74 76 75 tick_init(); 77 78 sun4v_ipi_init();76 //MH - uncomment later 77 //sun4v_ipi_init(); 79 78 } 80 79 -
kernel/arch/sparc64/src/trap/interrupt.c
raf56e9b r721d4e85 1 1 /* 2 2 * Copyright (c) 2005 Jakub Jermar 3 * Copyright (c) 2009 Pavel Rimsky4 3 * All rights reserved. 5 4 * … … 35 34 36 35 #include <arch/interrupt.h> 36 #include <arch/sparc64.h> 37 37 #include <arch/trap/interrupt.h> 38 #include <arch/sparc64.h>39 38 #include <interrupt.h> 40 39 #include <ddi/irq.h> … … 61 60 exc_register(n - 1, name, f); 62 61 } 62 63 /** Process hardware interrupt. 64 * 65 * @param n Ignored. 66 * @param istate Ignored. 67 */ 68 void interrupt(int n, istate_t *istate) 69 { 70 uint64_t status; 71 uint64_t intrcv; 72 uint64_t data0; 73 status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); 74 if (status & (!INTR_DISPATCH_STATUS_BUSY)) 75 panic("Interrupt Dispatch Status busy bit not set."); 76 77 intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0); 78 #if defined (US) 79 data0 = asi_u64_read(ASI_INTR_R, ASI_UDB_INTR_R_DATA_0); 80 #elif defined (US3) 81 data0 = asi_u64_read(ASI_INTR_R, VA_INTR_R_DATA_0); 82 #endif 83 84 irq_t *irq = irq_dispatch_and_lock(data0); 85 if (irq) { 86 /* 87 * The IRQ handler was found. 88 */ 89 irq->handler(irq); 90 /* 91 * See if there is a clear-interrupt-routine and call it. 92 */ 93 if (irq->cir) { 94 irq->cir(irq->cir_arg, irq->inr); 95 } 96 spinlock_unlock(&irq->lock); 97 } else if (data0 > config.base) { 98 /* 99 * This is a cross-call. 100 * data0 contains address of the kernel function. 101 * We call the function only after we verify 102 * it is one of the supported ones. 103 */ 104 #ifdef CONFIG_SMP 105 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) { 106 tlb_shootdown_ipi_recv(); 107 } 108 #endif 109 } else { 110 /* 111 * Spurious interrupt. 112 */ 113 #ifdef CONFIG_DEBUG 114 printf("cpu%u: spurious interrupt (intrcv=%#" PRIx64 115 ", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0); 116 #endif 117 } 118 119 membar(); 120 asi_u64_write(ASI_INTR_RECEIVE, 0, 0); 121 } 122 63 123 /** @} 64 124 */ -
kernel/generic/include/cpu.h
raf56e9b r721d4e85 48 48 * There is one structure like this for every processor. 49 49 */ 50 typedef struct cpu{50 typedef struct { 51 51 SPINLOCK_DECLARE(lock); 52 52 -
kernel/generic/src/proc/scheduler.c
raf56e9b r721d4e85 201 201 * even though there is a runnable thread. 202 202 */ 203 203 204 cpu_sleep(); 204 205 goto loop;
Note:
See TracChangeset
for help on using the changeset viewer.