Changeset 0b9ac3c in mainline for kernel/arch/sparc64/src
- Timestamp:
- 2010-02-23T19:03:28Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c62d2e1
- Parents:
- 1ccafee (diff), 5e50394 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/arch/sparc64/src
- Files:
-
- 18 added
- 6 edited
- 12 moved
-
asm.S (modified) (2 diffs)
-
cpu/sun4u/cpu.c (moved) (moved from kernel/arch/sparc64/src/cpu/cpu.c )
-
cpu/sun4v/cpu.c (added)
-
drivers/kbd.c (modified) (1 diff)
-
drivers/niagara.c (added)
-
drivers/tick.c (modified) (2 diffs)
-
mm/page.c (modified) (1 diff)
-
mm/sun4u/as.c (moved) (moved from kernel/arch/sparc64/src/mm/as.c )
-
mm/sun4u/frame.c (moved) (moved from kernel/arch/sparc64/src/mm/frame.c )
-
mm/sun4u/tlb.c (moved) (moved from kernel/arch/sparc64/src/mm/tlb.c ) (4 diffs)
-
mm/sun4u/tsb.c (moved) (moved from kernel/arch/sparc64/src/mm/tsb.c )
-
mm/sun4v/as.c (added)
-
mm/sun4v/frame.c (added)
-
mm/sun4v/tlb.c (added)
-
mm/sun4v/tsb.c (added)
-
proc/sun4u/scheduler.c (moved) (moved from kernel/arch/sparc64/src/proc/scheduler.c )
-
proc/sun4v/scheduler.c (added)
-
smp/sun4u/ipi.c (moved) (moved from kernel/arch/sparc64/src/smp/ipi.c ) (2 diffs)
-
smp/sun4u/smp.c (moved) (moved from kernel/arch/sparc64/src/smp/smp.c ) (1 diff)
-
smp/sun4v/ipi.c (added)
-
smp/sun4v/smp.c (added)
-
sun4u/asm.S (added)
-
sun4u/sparc64.c (moved) (moved from kernel/arch/sparc64/src/sparc64.c ) (2 diffs)
-
sun4u/start.S (moved) (moved from kernel/arch/sparc64/src/start.S )
-
sun4v/asm.S (added)
-
sun4v/md.c (added)
-
sun4v/sparc64.c (added)
-
sun4v/start.S (added)
-
trap/exception.c (modified) (1 diff)
-
trap/interrupt.c (modified) (3 diffs)
-
trap/sun4u/interrupt.c (added)
-
trap/sun4u/mmu.S (moved) (moved from kernel/arch/sparc64/src/trap/mmu.S )
-
trap/sun4u/trap_table.S (moved) (moved from kernel/arch/sparc64/src/trap/trap_table.S )
-
trap/sun4v/interrupt.c (added)
-
trap/sun4v/mmu.S (added)
-
trap/sun4v/trap_table.S (added)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/asm.S
r1ccafee r0b9ac3c 29 29 #include <arch/arch.h> 30 30 #include <arch/stack.h> 31 #include <arch/regdef.h>32 #include <arch/mm/mmu.h>33 31 34 32 .text … … 234 232 nop 235 233 236 237 .macro WRITE_ALTERNATE_REGISTER reg, bit238 rdpr %pstate, %g1 ! save PSTATE.PEF239 wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate240 mov %o0, \reg241 wrpr %g0, PSTATE_PRIV_BIT, %pstate242 retl243 wrpr %g1, 0, %pstate ! restore PSTATE.PEF244 .endm245 246 .macro READ_ALTERNATE_REGISTER reg, bit247 rdpr %pstate, %g1 ! save PSTATE.PEF248 wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate249 mov \reg, %o0250 wrpr %g0, PSTATE_PRIV_BIT, %pstate251 retl252 wrpr %g1, 0, %pstate ! restore PSTATE.PEF253 .endm254 255 .global write_to_ag_g6256 write_to_ag_g6:257 WRITE_ALTERNATE_REGISTER %g6, PSTATE_AG_BIT258 259 .global write_to_ag_g7260 write_to_ag_g7:261 WRITE_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT262 263 .global write_to_ig_g6264 write_to_ig_g6:265 WRITE_ALTERNATE_REGISTER %g6, PSTATE_IG_BIT266 267 .global read_from_ag_g7268 read_from_ag_g7:269 READ_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT270 271 272 /** Switch to userspace.273 *274 * %o0 Userspace entry address.275 * %o1 Userspace stack pointer address.276 * %o2 Userspace address of uarg structure.277 */278 .global switch_to_userspace279 switch_to_userspace:280 save %o1, -(STACK_WINDOW_SAVE_AREA_SIZE + STACK_ARG_SAVE_AREA_SIZE), %sp281 flushw282 wrpr %g0, 0, %cleanwin ! avoid information leak283 284 mov %i2, %o0 ! uarg285 xor %o1, %o1, %o1 ! %o1 is defined to hold pcb_ptr286 ! set it to 0287 288 clr %i2289 clr %i3290 clr %i4291 clr %i5292 clr %i6293 294 wrpr %g0, 1, %tl ! enforce mapping via nucleus295 296 rdpr %cwp, %g1297 wrpr %g1, TSTATE_IE_BIT, %tstate298 wrpr %i0, 0, %tnpc299 300 /*301 * Set primary context according to secondary context.302 * Secondary context has been already installed by303 * higher-level functions.304 */305 wr %g0, ASI_DMMU, %asi306 ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1307 stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi308 flush %i7309 310 /*311 * Spills and fills will be handled by the userspace handlers.312 */313 wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate314 315 done ! jump to userspace316 -
kernel/arch/sparc64/src/drivers/kbd.c
r1ccafee r0b9ac3c 39 39 #include <console/console.h> 40 40 #include <ddi/irq.h> 41 #include <mm/page.h> 41 42 #include <arch/mm/page.h> 42 43 #include <arch/types.h> -
kernel/arch/sparc64/src/drivers/tick.c
r1ccafee r0b9ac3c 54 54 interrupt_register(14, "tick_int", tick_interrupt); 55 55 compare.int_dis = false; 56 compare.tick_cmpr = CPU->arch.clock_frequency / HZ; 56 compare.tick_cmpr = tick_counter_read() + 57 CPU->arch.clock_frequency / HZ; 57 58 CPU->arch.next_tick_cmpr = compare.tick_cmpr; 58 59 tick_compare_write(compare.value); 59 tick_write(0);60 60 61 #if defined (US3) 61 #if defined (US3) || defined (SUN4V) 62 62 /* disable STICK interrupts and clear any pending ones */ 63 63 tick_compare_reg_t stick_compare; … … 111 111 * overflow only in 146 years. 112 112 */ 113 drift = tick_ read() - CPU->arch.next_tick_cmpr;113 drift = tick_counter_read() - CPU->arch.next_tick_cmpr; 114 114 while (drift > CPU->arch.clock_frequency / HZ) { 115 115 drift -= CPU->arch.clock_frequency / HZ; 116 116 CPU->missed_clock_ticks++; 117 117 } 118 CPU->arch.next_tick_cmpr = tick_ read() +118 CPU->arch.next_tick_cmpr = tick_counter_read() + 119 119 (CPU->arch.clock_frequency / HZ) - drift; 120 120 tick_compare_write(CPU->arch.next_tick_cmpr); -
kernel/arch/sparc64/src/mm/page.c
r1ccafee r0b9ac3c 33 33 */ 34 34 35 #include <mm/page.h> 35 36 #include <arch/mm/page.h> 36 37 #include <arch/mm/tlb.h> -
kernel/arch/sparc64/src/mm/sun4u/tlb.c
r1ccafee r0b9ac3c 37 37 #include <mm/as.h> 38 38 #include <mm/asid.h> 39 #include <genarch/mm/page_ht.h>40 39 #include <arch/mm/frame.h> 41 40 #include <arch/mm/page.h> … … 51 50 #include <panic.h> 52 51 #include <arch/asm.h> 52 #include <genarch/mm/page_ht.h> 53 53 54 54 #ifdef CONFIG_TSB … … 476 476 } 477 477 478 void d ump_sfsr_and_sfar(void)478 void describe_dmmu_fault(void) 479 479 { 480 480 tlb_sfsr_reg_t sfsr; … … 499 499 } 500 500 501 void dump_sfsr_and_sfar(void) 502 { 503 tlb_sfsr_reg_t sfsr; 504 uintptr_t sfar; 505 506 sfsr.value = dtlb_sfsr_read(); 507 sfar = dtlb_sfar_read(); 508 509 #if defined (US) 510 printf("DTLB SFSR: asi=%#x, ft=%#x, e=%d, ct=%d, pr=%d, w=%d, ow=%d, " 511 "fv=%d\n", sfsr.asi, sfsr.ft, sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, 512 sfsr.ow, sfsr.fv); 513 #elif defined (US3) 514 printf("DTLB SFSR: nf=%d, asi=%#x, tm=%d, ft=%#x, e=%d, ct=%d, pr=%d, " 515 "w=%d, ow=%d, fv=%d\n", sfsr.nf, sfsr.asi, sfsr.tm, sfsr.ft, 516 sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, sfsr.ow, sfsr.fv); 517 #endif 518 519 printf("DTLB SFAR: address=%p\n", sfar); 520 521 dtlb_sfsr_write(0); 522 } 523 501 524 #if defined (US) 502 525 /** Invalidate all unlocked ITLB and DTLB entries. */ -
kernel/arch/sparc64/src/smp/sun4u/ipi.c
r1ccafee r0b9ac3c 99 99 status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); 100 100 if (status & INTR_DISPATCH_STATUS_BUSY) 101 panic("Interrupt Dispatch Status busy bit set .");101 panic("Interrupt Dispatch Status busy bit set\n"); 102 102 103 103 ASSERT(!(pstate_read() & PSTATE_IE_BIT)); … … 152 152 break; 153 153 default: 154 panic("Unknown IPI (%d). ", ipi);154 panic("Unknown IPI (%d).\n", ipi); 155 155 break; 156 156 } -
kernel/arch/sparc64/src/smp/sun4u/smp.c
r1ccafee r0b9ac3c 62 62 { 63 63 ofw_tree_node_t *node; 64 size_t cnt = 0;64 unsigned int cnt = 0; 65 65 66 66 if (is_us() || is_us_iii()) { -
kernel/arch/sparc64/src/sun4u/sparc64.c
r1ccafee r0b9ac3c 44 44 #include <arch/mm/page.h> 45 45 #include <arch/stack.h> 46 #include <interrupt.h> 46 47 #include <genarch/ofw/ofw_tree.h> 47 48 #include <userspace.h> … … 166 167 } 167 168 169 void irq_initialize_arch(irq_t *irq) 170 { 171 (void) irq; 172 } 173 168 174 /** @} 169 175 */ -
kernel/arch/sparc64/src/trap/exception.c
r1ccafee r0b9ac3c 162 162 fault_if_from_uspace(istate, "%s.", __func__); 163 163 dump_istate(istate); 164 d ump_sfsr_and_sfar();164 describe_dmmu_fault(); 165 165 panic("%s.", __func__); 166 166 } -
kernel/arch/sparc64/src/trap/interrupt.c
r1ccafee r0b9ac3c 1 1 /* 2 2 * Copyright (c) 2005 Jakub Jermar 3 * Copyright (c) 2009 Pavel Rimsky 3 4 * All rights reserved. 4 5 * … … 34 35 35 36 #include <arch/interrupt.h> 37 #include <arch/trap/interrupt.h> 36 38 #include <arch/sparc64.h> 37 #include <arch/trap/interrupt.h>38 39 #include <interrupt.h> 39 40 #include <ddi/irq.h> … … 60 61 exc_register(n - 1, name, f); 61 62 } 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 #endif83 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 verify102 * it is one of the supported ones.103 */104 #ifdef CONFIG_SMP105 if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) {106 tlb_shootdown_ipi_recv();107 }108 #endif109 } else {110 /*111 * Spurious interrupt.112 */113 #ifdef CONFIG_DEBUG114 printf("cpu%u: spurious interrupt (intrcv=%#" PRIx64115 ", data0=%#" PRIx64 ")\n", CPU->id, intrcv, data0);116 #endif117 }118 119 membar();120 asi_u64_write(ASI_INTR_RECEIVE, 0, 0);121 }122 123 63 /** @} 124 64 */
Note:
See TracChangeset
for help on using the changeset viewer.
