Port-sparc64 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: V240 Status?
>>> Martin Husemann <martin%duskware.de@localhost> wrote
> On Tue, Jan 22, 2013 at 07:50:08PM +0900, Takeshi Nakayama wrote:
> > Other idea is just schedule a softint in IPI-handler:
>
> I prefer to do the full TRAP_SETUP() dance (and move the function to
> locore.s),
> which will make it usefull for future work with other target functions, e.g.
> if we convert fpu handling to pcu(9).
Sure.
Btw, I just wrote the code realize my idea. It will be useful
temporary to make the fssconfig work.
-- Takeshi Nakayama
Index: include/cpu.h
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/include/cpu.h,v
retrieving revision 1.100
diff -u -d -r1.100 cpu.h
--- include/cpu.h 9 Nov 2012 10:05:59 -0000 1.100
+++ include/cpu.h 22 Jan 2013 12:48:16 -0000
@@ -134,6 +134,7 @@
/* Interrupts */
struct intrhand *ci_intrpending[16];
struct intrhand *ci_tick_ih;
+ struct intrhand *ci_xcall_ih;
/* Event counters */
struct evcnt ci_tick_evcnt;
Index: sparc64/cpu.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/cpu.c,v
retrieving revision 1.103
diff -u -d -r1.103 cpu.c
--- sparc64/cpu.c 8 Nov 2012 00:34:38 -0000 1.103
+++ sparc64/cpu.c 22 Jan 2013 12:48:16 -0000
@@ -285,6 +285,7 @@
evcnt_attach_dynamic(&ci->ci_tick_evcnt, EVCNT_TYPE_INTR, NULL,
device_xname(dev), "timer");
mutex_init(&ci->ci_ctx_lock, MUTEX_SPIN, IPL_VM);
+ ci->ci_xcall_ih = sparc_softintr_establish(PIL_HIGH, NULL, NULL);
clk = prom_getpropint(node, "clock-frequency", 0);
if (clk == 0) {
Index: sparc64/genassym.cf
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/genassym.cf,v
retrieving revision 1.66
diff -u -d -r1.66 genassym.cf
--- sparc64/genassym.cf 20 Jul 2011 12:06:00 -0000 1.66
+++ sparc64/genassym.cf 22 Jan 2013 12:48:16 -0000
@@ -160,6 +160,7 @@
define CI_IDEPTH offsetof(struct cpu_info, ci_idepth)
define CI_INTRPENDING offsetof(struct cpu_info, ci_intrpending)
define CI_TICK_IH offsetof(struct cpu_info, ci_tick_ih)
+define CI_XCALL_IH offsetof(struct cpu_info, ci_xcall_ih)
define CI_CTXBUSY offsetof(struct cpu_info, ci_ctxbusy)
define CI_TSB_DMMU offsetof(struct cpu_info, ci_tsb_dmmu)
define CI_TSB_IMMU offsetof(struct cpu_info, ci_tsb_immu)
Index: sparc64/locore.s
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/locore.s,v
retrieving revision 1.345
diff -u -d -r1.345 locore.s
--- sparc64/locore.s 10 Nov 2012 01:47:25 -0000 1.345
+++ sparc64/locore.s 22 Jan 2013 12:48:17 -0000
@@ -3130,6 +3130,7 @@
inc %g1
stx %g1, [%g5 + IH_CNT]
+ .globl setup_sparcintr
setup_sparcintr:
LDPTR [%g5+IH_PEND], %g6 ! Read pending flag
brnz,pn %g6, ret_from_intr_vector ! Skip it if it's running
Index: sparc64/mp_subr.S
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/mp_subr.S,v
retrieving revision 1.3
diff -u -d -r1.3 mp_subr.S
--- sparc64/mp_subr.S 12 Jul 2011 07:51:34 -0000 1.3
+++ sparc64/mp_subr.S 22 Jan 2013 12:48:17 -0000
@@ -418,14 +418,12 @@
* %g3 = single argument to called function
*/
ENTRY(sparc64_ipi_ccall)
- save %sp, -CC64FSZ-16, %sp ! create a stack frame
- stx %g2, [%fp + BIAS -16 + 0] ! save function pointer
- stx %g3, [%fp + BIAS -16 + 8] ! and argument
- wrpr %g0, PSTATE_KERN, %pstate ! switch globals
- ldx [%fp + BIAS -16 + 0], %l0 ! reload function
- call %l0 ! call function
- ldx [%fp + BIAS -16 + 8], %o0 ! reload argument
- restore ! pop stack frame
- ba,a ret_from_intr_vector ! and return from IPI
+ sethi %hi(CPUINFO_VA+CI_XCALL_IH), %g6 ! curcpu()->ci_xcall_ih
+ LDPTR [%g6 + %lo(CPUINFO_VA+CI_XCALL_IH)], %g5
+ LDPTR [%g5 + IH_PEND], %g6 ! read pending flag
+ brnz,pn %g6, ret_from_intr_vector ! skip if it's running
nop
+ STPTR %g2, [%g5 + IH_FUN] ! set func and arg
+ ba,pt %icc, setup_sparcintr
+ STPTR %g3, [%g5 + IH_ARG]
#endif
Home |
Main Index |
Thread Index |
Old Index