summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorTill Straumann <strauman@slac.stanford.edu>2006-06-19 20:30:08 +0000
committerTill Straumann <strauman@slac.stanford.edu>2006-06-19 20:30:08 +0000
commitbf943170754b8faf836f9be47a7c534d666f8e84 (patch)
tree2a52c92c47aca846b4142c9f84730722a1570af4 /c
parent Added altivec exception. Unfortunately, this doesn't fit (diff)
downloadrtems-bf943170754b8faf836f9be47a7c534d666f8e84.tar.bz2
re-checked synchronization requirements when manipulating
the caches against the book and updated 'dssall', 'sync' and 'isync's accordingly.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libcpu/powerpc/ChangeLog6
-rw-r--r--c/src/lib/libcpu/powerpc/mpc6xx/mmu/mmuAsm.S14
2 files changed, 16 insertions, 4 deletions
diff --git a/c/src/lib/libcpu/powerpc/ChangeLog b/c/src/lib/libcpu/powerpc/ChangeLog
index d487a8a9e1..1a8e901564 100644
--- a/c/src/lib/libcpu/powerpc/ChangeLog
+++ b/c/src/lib/libcpu/powerpc/ChangeLog
@@ -1,5 +1,11 @@
2006-06-19 Till Straumann <strauman@slac.stanford.edu>
+ * mpc6xx/mmu/mmuAsm.S: re-checked synchronization
+ requirements when manipulating the caches against the book
+ and updated 'dssall', 'sync' and 'isync's accordingly.
+
+2006-06-19 Till Straumann <strauman@slac.stanford.edu>
+
* mpc6xx/exceptions/raw_exception.c, mpc6xx/exceptions/raw_exception.h:
Added altivec exception. Unfortunately, this doesn't fit
the normal scheme of vector = exception # << 8. So we picked
diff --git a/c/src/lib/libcpu/powerpc/mpc6xx/mmu/mmuAsm.S b/c/src/lib/libcpu/powerpc/mpc6xx/mmu/mmuAsm.S
index 89651d2218..ec51c32220 100644
--- a/c/src/lib/libcpu/powerpc/mpc6xx/mmu/mmuAsm.S
+++ b/c/src/lib/libcpu/powerpc/mpc6xx/mmu/mmuAsm.S
@@ -231,8 +231,6 @@ thisIs750:
disableCache:
/* Disable the cache. First, we turn off data relocation. */
rlwinm r4,r4,0,28,26 /* Turn off DR bit */
- mtmsr r4
- isync /* make sure memory accesses have completed */
cmplwi r0,PPC_7455 /* 7455 ? */
beq 1f
cmplwi r0,PPC_7457 /* 7457 ? */
@@ -240,7 +238,9 @@ disableCache:
1:
/* 745x:L1 Load/Flush, L2, L3 : hardware flush */
DSSALL
+ mtmsr r4
sync
+ isync
mfspr r4, MSSCR0
rlwinm r4,r4,0,29,0 /* Turn off the L2PFE bits */
mtspr MSSCR0, r4
@@ -271,6 +271,9 @@ loadFlush:
b reenableDR
not745x:
+ sync
+ mtmsr r4
+ isync
/*
Now, read the first 2MB of memory to put new data in the cache.
(Actually we only need the size of the L2 cache plus
@@ -293,9 +296,9 @@ flushLoop:
dcbf r0,r4
addi r4,r4,CACHE_LINE_SIZE /* Go to start of next cache line */
bdnz flushLoop
- sync
reenableDR:
rlwinm r4,r7,0,17,15 /* still mask EE but reenable data relocation */
+ sync
mtmsr r4
isync
@@ -325,9 +328,9 @@ invalCompleteLoop: /* Wait for the invalidation to complete */
rlwinm r3,r3,0,11,9; /* Turn off the L2I bit */
sync
mtspr L2CR,r3
- sync
noInval:
+ sync
/* re-enable interrupts, i.e. restore original MSR */
mtmsr r7 /* (no sync needed) */
/* See if we need to enable the cache */
@@ -404,6 +407,8 @@ thisIs7455:
/* Before the L3 is disabled, it must be flused to prevent coherency problems */
/* First, we turn off data relocation. */
rlwinm r4,r4,0,28,26 /* Turn off DR bit */
+ DSSALL
+ sync
mtmsr r4
isync /* make sure memory accesses have completed */
/* 7455: L3 : hardware flush
@@ -420,6 +425,7 @@ thisIs7455:
sync
/* L3 flushed,L3IO & L3DO got cleared in the dontDisableL3Cache: */
rlwinm r4,r7,0,17,15 /* still mask EE but reenable data relocation */
+ sync
mtmsr r4
isync