summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S
diff options
context:
space:
mode:
authorRalf Corsepius <ralf.corsepius@rtems.org>2004-03-08 15:36:03 +0000
committerRalf Corsepius <ralf.corsepius@rtems.org>2004-03-08 15:36:03 +0000
commit0aee2be50e93ea3e719102e6f0e59d8364f8ba0c (patch)
treef16e0ae9765416f62e4f512b10cad61d57cf2c02 /c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S
parentUnused (diff)
downloadrtems-0aee2be50e93ea3e719102e6f0e59d8364f8ba0c.tar.bz2
2004-03-08 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
* mpc5xx/.cvsignore, mpc5xx/Makefile.am: New. * mpc5xx/exceptions/asm_utils.S, mpc5xx/exceptions/raw_exception.c, mpc5xx/exceptions/raw_exception.h, mpc5xx/ictrl/ictrl.c, mpc5xx/ictrl/ictrl.h, mpc5xx/timer/timer.c: New (Submission from Wilfried Busalski <w.busalski@lancier-monitoring.de>).
Diffstat (limited to 'c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S')
-rw-r--r--c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S64
1 files changed, 64 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S b/c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S
new file mode 100644
index 0000000000..ae0e1010b5
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/mpc5xx/exceptions/asm_utils.S
@@ -0,0 +1,64 @@
+/*
+ * asm_utils.s
+ *
+ * asm_utils.S,v 1.2 2002/04/18 20:55:37 joel Exp
+ *
+ * Copyright (C) 1999 Eric Valette (valette@crf.canon.fr)
+ *
+ * This file contains the low-level support for moving exception
+ * exception code to appropriate location.
+ *
+ * Adapted for MPC5XX Wilfried Busalski (w.busalski@lancier-monitoring.de)
+ * (C) Lancier Monitoring GmbH
+ */
+
+#include <asm.h>
+#include <rtems/score/cpu.h>
+#include <libcpu/io.h>
+
+//SPR defines
+#define SPR_ICCST 560
+
+
+ .globl codemove
+codemove:
+ .type codemove,@function
+/* r3 dest, r4 src, r5 length in bytes, r6 cachelinesize */
+ cmplw cr1,r3,r4
+ addi r0,r5,3
+ srwi. r0,r0,2
+ beq cr1,4f /* In place copy is not necessary */
+ beq 7f /* Protect against 0 count */
+ mtctr r0
+ bge cr1,2f
+
+ la r8,-4(r4)
+ la r7,-4(r3)
+1: lwzu r0,4(r8)
+ stwu r0,4(r7)
+ bdnz 1b
+ b 4f
+
+2: slwi r0,r0,2
+ add r8,r4,r0
+ add r7,r3,r0
+3: lwzu r0,-4(r8)
+ stwu r0,-4(r7)
+ bdnz 3b
+
+/* Now flush the cache: note that we must start from a cache aligned
+ * address. Otherwise we might miss one cache line.
+ */
+
+4: lis r0, 0x0A00 // Command Unlock All
+ mtspr SPR_ICCST, r0 // Cache Unlock ALL
+
+ lis r0, 0x0C00 // Command Invalidate All
+ mtspr SPR_ICCST, r0 // Cache Invalidate ALL
+
+ lis r0, 0x0200 // Command Enable All
+ mtspr SPR_ICCST, r0 // Cache Enable ALL
+
+7: sync /* Wait for all icbi to complete on bus */
+ isync
+ blr