summaryrefslogtreecommitdiff
path: root/apps/codecs/lib/setjmp_cf.S
diff options
context:
space:
mode:
authorMagnus Holmgren <magnushol@gmail.com>2009-03-08 12:48:58 +0000
committerMagnus Holmgren <magnushol@gmail.com>2009-03-08 12:48:58 +0000
commitf4515c3082dd413017ae06c25d7e85b1dcee30bf (patch)
tree1154b2fd5049aa42a1fdd2047effd39e9da1ccaa /apps/codecs/lib/setjmp_cf.S
parent3f69bb2b1d00ccc54e2097fd9da750fcd2f7e11b (diff)
downloadrockbox-f4515c3082dd413017ae06c25d7e85b1dcee30bf.zip
rockbox-f4515c3082dd413017ae06c25d7e85b1dcee30bf.tar.gz
rockbox-f4515c3082dd413017ae06c25d7e85b1dcee30bf.tar.bz2
rockbox-f4515c3082dd413017ae06c25d7e85b1dcee30bf.tar.xz
Add setjmp/longjmp for ARM and ColdFire to the codec lib, and use it in the Vorbis codec to better handle out of memory conditions (to exit rather than crash; the AAC codec could use it too). setjmp/longjmp comes from newlib 1.17.0 with a few minor changes (combine parts of some files, remove support for some architectures, change some ifdef's).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20235 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs/lib/setjmp_cf.S')
-rw-r--r--apps/codecs/lib/setjmp_cf.S79
1 files changed, 79 insertions, 0 deletions
diff --git a/apps/codecs/lib/setjmp_cf.S b/apps/codecs/lib/setjmp_cf.S
new file mode 100644
index 0000000..acc98c3
--- /dev/null
+++ b/apps/codecs/lib/setjmp_cf.S
@@ -0,0 +1,79 @@
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define d0 REG (d0)
+#define d1 REG (d1)
+#define d2 REG (d2)
+#define d3 REG (d3)
+#define d4 REG (d4)
+#define d5 REG (d5)
+#define d6 REG (d6)
+#define d7 REG (d7)
+#define a0 REG (a0)
+#define a1 REG (a1)
+#define a2 REG (a2)
+#define a3 REG (a3)
+#define a4 REG (a4)
+#define a5 REG (a5)
+#define a6 REG (a6)
+#define fp REG (fp)
+#define sp REG (sp)
+
+
+.global SYM (setjmp)
+.global SYM (longjmp)
+
+SYM (setjmp):
+ moveal sp@(4),a0
+ movel sp@(0),a0@(12)
+ movel sp,a0@(8)
+ moveml d2-d7/a2-a6,a0@(20)
+ clrl d0
+ rts
+
+SYM (longjmp):
+ moveal sp@(4),a0
+ movel sp@(8),d0
+ bne 1f
+ movel &1,d0
+1:
+ moveml a0@(20),d2-d7/a2-a6
+ moveal a0@(8),sp
+ movel a0@(12),sp@
+ rts
+
+#ifdef M68881
+.global SYM (setjmp_68881)
+.global SYM (longjmp_68881)
+
+SYM (setjmp_68881):
+ moveal sp@(4),a0
+ movel sp@(0),a0@(12)
+ movel sp,a0@(8)
+ moveml d2-d7/a2-a6,a0@(20)
+ fmovemx fp2-fp7,a0@(64)
+ clrl d0
+ rts
+
+SYM (longjmp_68881):
+ moveal sp@(4),a0
+ fmovemx a0@(64),fp2-fp7
+ movel sp@(8),d0
+ bne 1f
+ movel &1,d0
+1:
+ moveml a0@(20),d2-d7/a2-a6
+ moveal a0@(8),sp
+ movel a0@(12),sp@
+ rts
+#endif