Module Name: src Committed By: palle Date: Fri Feb 8 20:14:51 UTC 2019
Modified Files: src/sys/arch/sparc64/include: cpu.h src/sys/arch/sparc64/sparc64: clock.c locore.s Log Message: sun4v: initialize %stickcmpr properly when establishing interrupt - fixes issue seen on newer sun4v/SPARC-T5 system where the interrupt never fires. To generate a diff of this commit: cvs rdiff -u -r1.125 -r1.126 src/sys/arch/sparc64/include/cpu.h cvs rdiff -u -r1.120 -r1.121 src/sys/arch/sparc64/sparc64/clock.c cvs rdiff -u -r1.417 -r1.418 src/sys/arch/sparc64/sparc64/locore.s Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/include/cpu.h diff -u src/sys/arch/sparc64/include/cpu.h:1.125 src/sys/arch/sparc64/include/cpu.h:1.126 --- src/sys/arch/sparc64/include/cpu.h:1.125 Wed Aug 22 01:05:23 2018 +++ src/sys/arch/sparc64/include/cpu.h Fri Feb 8 20:14:50 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.125 2018/08/22 01:05:23 msaitoh Exp $ */ +/* $NetBSD: cpu.h,v 1.126 2019/02/08 20:14:50 palle Exp $ */ /* * Copyright (c) 1992, 1993 @@ -434,6 +434,7 @@ void switchtoctx_us(int); void switchtoctx_usiii(int); void next_tick(long); void next_stick(long); +void next_stick_init(void); /* trap.c */ void cpu_vmspace_exec(struct lwp *, vaddr_t, vaddr_t); int rwindow_save(struct lwp *); Index: src/sys/arch/sparc64/sparc64/clock.c diff -u src/sys/arch/sparc64/sparc64/clock.c:1.120 src/sys/arch/sparc64/sparc64/clock.c:1.121 --- src/sys/arch/sparc64/sparc64/clock.c:1.120 Thu Jul 7 06:55:38 2016 +++ src/sys/arch/sparc64/sparc64/clock.c Fri Feb 8 20:14:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: clock.c,v 1.120 2016/07/07 06:55:38 msaitoh Exp $ */ +/* $NetBSD: clock.c,v 1.121 2019/02/08 20:14:51 palle Exp $ */ /* * Copyright (c) 1992, 1993 @@ -55,7 +55,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.120 2016/07/07 06:55:38 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.121 2019/02/08 20:14:51 palle Exp $"); #include "opt_multiprocessor.h" @@ -406,6 +406,7 @@ stickintr_establish(int pil, int (*fun)( ci->ci_tick_increment = ci->ci_system_clockrate[0] / hz; s = intr_disable(); + next_stick_init(); next_stick(ci->ci_tick_increment); intr_restore(s); } Index: src/sys/arch/sparc64/sparc64/locore.s diff -u src/sys/arch/sparc64/sparc64/locore.s:1.417 src/sys/arch/sparc64/sparc64/locore.s:1.418 --- src/sys/arch/sparc64/sparc64/locore.s:1.417 Fri Feb 8 19:45:24 2019 +++ src/sys/arch/sparc64/sparc64/locore.s Fri Feb 8 20:14:51 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.417 2019/02/08 19:45:24 palle Exp $ */ +/* $NetBSD: locore.s,v 1.418 2019/02/08 20:14:51 palle Exp $ */ /* * Copyright (c) 2006-2010 Matthew R. Green @@ -7507,6 +7507,21 @@ Lstick_ovflw: retl wr %o2, STICK_CMPR +/* + * next_stick_init() + * + * Sets the %stick_cmpr register to the value retrieved from %stick so + * next_stick() does not spend too much time in the function when called + * for the first time. + */ +ENTRY(next_stick_init) + rd STICK, %o0 + mov 1, %o1 ! Mask off high bits of the register + sllx %o1, 63, %o1 + andn %o0, %o1, %o0 + retl + wr %o0, STICK_CMPR + ENTRY(setjmp) save %sp, -CC64FSZ, %sp ! Need a frame to return to. flushw