summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2011-06-07 17:19:14 +0000
committermarius <marius@FreeBSD.org>2011-06-07 17:19:14 +0000
commit3a370ea3a9d5051e1f35c95d2db6af27c37fde70 (patch)
tree8ce5d78bf1b5a789f16cd7ef1d3e3935ddbfc1b8 /sys/sparc64
parentf7c852c88abcebcb25c335b83cf1f5e748e33a1c (diff)
downloadFreeBSD-src-3a370ea3a9d5051e1f35c95d2db6af27c37fde70.zip
FreeBSD-src-3a370ea3a9d5051e1f35c95d2db6af27c37fde70.tar.gz
Fix a problem with r222813; given that we may only operate on interrupt
globals here but clobber %y save and restore the latter.
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/sparc64/mp_exception.S20
1 files changed, 11 insertions, 9 deletions
diff --git a/sys/sparc64/sparc64/mp_exception.S b/sys/sparc64/sparc64/mp_exception.S
index d378035..f1b323a 100644
--- a/sys/sparc64/sparc64/mp_exception.S
+++ b/sys/sparc64/sparc64/mp_exception.S
@@ -38,7 +38,8 @@ __FBSDID("$FreeBSD$");
.register %g2, #ignore
.register %g3, #ignore
-#define IPI_DONE(r1, r2, r3, r4, r5) \
+#define IPI_DONE(r1, r2, r3, r4, r5, r6) \
+ rd %y, r6 ; \
lduw [PCPU(CPUID)], r2 ; \
mov _NCPUBITS, r3 ; \
mov %g0, %y ; \
@@ -50,6 +51,7 @@ __FBSDID("$FreeBSD$");
sub r2, r3, r3 ; \
mov 1, r4 ; \
sllx r4, r3, r4 ; \
+ wr r6, %y ; \
ATOMIC_CLEAR_LONG(r1, r2, r3, r4)
/*
@@ -87,7 +89,7 @@ ENTRY(tl_ipi_spitfire_dcache_page_inval)
2: brgz,pt %g2, 1b
sub %g2, %g4, %g2
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_spitfire_dcache_page_inval)
@@ -127,7 +129,7 @@ ENTRY(tl_ipi_spitfire_icache_page_inval)
2: brgz,pt %g2, 1b
sub %g2, %g4, %g2
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_spitfire_icache_page_inval)
@@ -158,7 +160,7 @@ ENTRY(tl_ipi_cheetah_dcache_page_inval)
blt,a,pt %xcc, 1b
nop
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_cheetah_dcache_page_inval)
@@ -214,7 +216,7 @@ ENTRY(tl_ipi_tlb_page_demap)
stxa %g0, [%g2] ASI_IMMU_DEMAP
flush %g3
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_tlb_page_demap)
@@ -257,7 +259,7 @@ ENTRY(tl_ipi_tlb_range_demap)
blt,a,pt %xcc, 1b
nop
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_tlb_range_demap)
@@ -281,7 +283,7 @@ ENTRY(tl_ipi_tlb_context_demap)
stxa %g0, [%g1] ASI_IMMU_DEMAP
flush %g3
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_tlb_context_demap)
@@ -293,7 +295,7 @@ ENTRY(tl_ipi_stick_rd)
rd %asr24, %g2
stx %g2, [%g1]
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_stick_rd)
@@ -305,6 +307,6 @@ ENTRY(tl_ipi_tick_rd)
rd %tick, %g2
stx %g2, [%g1]
- IPI_DONE(%g5, %g1, %g2, %g3, %g4)
+ IPI_DONE(%g5, %g1, %g2, %g3, %g4, %g6)
retry
END(tl_ipi_tick_rd)
OpenPOWER on IntegriCloud