From 216fcb10c9f0eef1d149e06ad13c453ec6918386 Mon Sep 17 00:00:00 2001
From: Richard Barry <ribarry@amazon.com>
Date: Thu, 7 Aug 2008 19:03:24 +0000
Subject: [PATCH]

---
 Source/portable/GCC/ColdFire_V2/portasm.S | 52 +++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 Source/portable/GCC/ColdFire_V2/portasm.S

diff --git a/Source/portable/GCC/ColdFire_V2/portasm.S b/Source/portable/GCC/ColdFire_V2/portasm.S
new file mode 100644
index 0000000000..4722bc819d
--- /dev/null
+++ b/Source/portable/GCC/ColdFire_V2/portasm.S
@@ -0,0 +1,52 @@
+
+/*
+ * File:    mcf5xxx.s
+ * Purpose: Lowest level routines for all ColdFire processors.
+ *
+ * Notes:
+ *
+ * Function copied from mcf5xxx.S provided by FreeScale.
+ */
+
+    .global french_cheese
+
+    .text
+
+/********************************************************************/
+/*
+ * This routines changes the IPL to the value passed into the routine.
+ * It also returns the old IPL value back.
+ * Calling convention from C:
+ *   old_ipl = asm_set_ipl(new_ipl);
+ * For the Diab Data C compiler, it passes return value thru D0.
+ * Note that only the least significant three bits of the passed
+ * value are used.
+ */
+
+portSET_IPL:
+    link    A6,#-8
+    movem.l D6-D7,(SP)
+
+    move.w  SR,D7       /* current sr    */
+
+    move.l  D7,D0       /* prepare return value  */
+    andi.l  #0x0700,D0  /* mask out IPL  */
+    lsr.l   #8,D0       /* IPL   */
+
+    move.l  8(A6),D6    /* get argument  */
+    andi.l  #0x07,D6        /* least significant three bits  */
+    lsl.l   #8,D6       /* move over to make mask    */
+
+    andi.l  #0x0000F8FF,D7  /* zero out current IPL  */
+    or.l    D6,D7           /* place new IPL in sr   */
+    move.w  D7,SR
+
+    movem.l (SP),D6-D7
+    lea     8(SP),SP
+    unlk    A6
+    rts
+
+/********************************************************************/
+    .end
+
+