diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2009-01-24 03:47:09 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2009-01-24 03:47:09 +0000 |
commit | b0befadad1d9ec691ba647b948422e66a43f3674 (patch) | |
tree | 92f5fe47e0826daab66d2e321c96412841392058 /apps | |
parent | ef8413eb4fd7fead45d33b3ecae003210978b85d (diff) | |
download | rockbox-b0befadad1d9ec691ba647b948422e66a43f3674.tar.gz rockbox-b0befadad1d9ec691ba647b948422e66a43f3674.zip |
Include divide-by-zero handling within plugins and codecs for ARM processors.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19834 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/codecs.c | 4 | ||||
-rw-r--r-- | apps/codecs.h | 8 | ||||
-rw-r--r-- | apps/codecs/codec_crt0.c | 7 | ||||
-rw-r--r-- | apps/plugin.c | 3 | ||||
-rw-r--r-- | apps/plugin.h | 5 | ||||
-rw-r--r-- | apps/plugins/lib/SOURCES | 4 | ||||
-rw-r--r-- | apps/plugins/lib/gcc-support.c | 30 | ||||
-rw-r--r-- | apps/plugins/plugins.make | 6 | ||||
-rw-r--r-- | apps/plugins/test_codec.c | 3 |
9 files changed, 64 insertions, 6 deletions
diff --git a/apps/codecs.c b/apps/codecs.c index cddebb623d..231b612358 100644 --- a/apps/codecs.c +++ b/apps/codecs.c | |||
@@ -169,7 +169,9 @@ struct codec_api ci = { | |||
169 | 169 | ||
170 | /* new stuff at the end, sort into place next time | 170 | /* new stuff at the end, sort into place next time |
171 | the API gets incompatible */ | 171 | the API gets incompatible */ |
172 | 172 | #ifdef CPU_ARM | |
173 | __div0, | ||
174 | #endif | ||
173 | }; | 175 | }; |
174 | 176 | ||
175 | void codec_get_full_path(char *path, const char *codec_root_fn) | 177 | void codec_get_full_path(char *path, const char *codec_root_fn) |
diff --git a/apps/codecs.h b/apps/codecs.h index e603c8b35b..3eab1d35c2 100644 --- a/apps/codecs.h +++ b/apps/codecs.h | |||
@@ -75,7 +75,7 @@ | |||
75 | #define CODEC_ENC_MAGIC 0x52454E43 /* RENC */ | 75 | #define CODEC_ENC_MAGIC 0x52454E43 /* RENC */ |
76 | 76 | ||
77 | /* increase this every time the api struct changes */ | 77 | /* increase this every time the api struct changes */ |
78 | #define CODEC_API_VERSION 30 | 78 | #define CODEC_API_VERSION 31 |
79 | 79 | ||
80 | /* update this to latest version if a change to the api struct breaks | 80 | /* update this to latest version if a change to the api struct breaks |
81 | backwards compatibility (and please take the opportunity to sort in any | 81 | backwards compatibility (and please take the opportunity to sort in any |
@@ -232,8 +232,10 @@ struct codec_api { | |||
232 | #endif | 232 | #endif |
233 | 233 | ||
234 | /* new stuff at the end, sort into place next time | 234 | /* new stuff at the end, sort into place next time |
235 | the API gets incompatible */ | 235 | the API gets incompatible */ |
236 | 236 | #ifdef CPU_ARM | |
237 | void (*__div0)(void); | ||
238 | #endif | ||
237 | }; | 239 | }; |
238 | 240 | ||
239 | /* codec header */ | 241 | /* codec header */ |
diff --git a/apps/codecs/codec_crt0.c b/apps/codecs/codec_crt0.c index 167a91ec4c..467e115de9 100644 --- a/apps/codecs/codec_crt0.c +++ b/apps/codecs/codec_crt0.c | |||
@@ -51,3 +51,10 @@ enum codec_status codec_start(void) | |||
51 | #endif | 51 | #endif |
52 | return codec_main(); | 52 | return codec_main(); |
53 | } | 53 | } |
54 | |||
55 | #ifdef CPU_ARM | ||
56 | void __attribute__((naked)) __div0(void) | ||
57 | { | ||
58 | asm volatile("bx %0" : : "r"(ci->__div0)); | ||
59 | } | ||
60 | #endif | ||
diff --git a/apps/plugin.c b/apps/plugin.c index a19a08b5fb..1e86b4d07e 100644 --- a/apps/plugin.c +++ b/apps/plugin.c | |||
@@ -627,6 +627,9 @@ static const struct plugin_api rockbox_api = { | |||
627 | appsversion, | 627 | appsversion, |
628 | /* new stuff at the end, sort into place next time | 628 | /* new stuff at the end, sort into place next time |
629 | the API gets incompatible */ | 629 | the API gets incompatible */ |
630 | #ifdef CPU_ARM | ||
631 | __div0, | ||
632 | #endif | ||
630 | }; | 633 | }; |
631 | 634 | ||
632 | int plugin_load(const char* plugin, const void* parameter) | 635 | int plugin_load(const char* plugin, const void* parameter) |
diff --git a/apps/plugin.h b/apps/plugin.h index 992012be68..472daeafe4 100644 --- a/apps/plugin.h +++ b/apps/plugin.h | |||
@@ -126,7 +126,7 @@ void* plugin_get_buffer(size_t *buffer_size); | |||
126 | #define PLUGIN_MAGIC 0x526F634B /* RocK */ | 126 | #define PLUGIN_MAGIC 0x526F634B /* RocK */ |
127 | 127 | ||
128 | /* increase this every time the api struct changes */ | 128 | /* increase this every time the api struct changes */ |
129 | #define PLUGIN_API_VERSION 137 | 129 | #define PLUGIN_API_VERSION 138 |
130 | 130 | ||
131 | /* update this to latest version if a change to the api struct breaks | 131 | /* update this to latest version if a change to the api struct breaks |
132 | backwards compatibility (and please take the opportunity to sort in any | 132 | backwards compatibility (and please take the opportunity to sort in any |
@@ -782,6 +782,9 @@ struct plugin_api { | |||
782 | const char *appsversion; | 782 | const char *appsversion; |
783 | /* new stuff at the end, sort into place next time | 783 | /* new stuff at the end, sort into place next time |
784 | the API gets incompatible */ | 784 | the API gets incompatible */ |
785 | #ifdef CPU_ARM | ||
786 | void (*__div0)(void); | ||
787 | #endif | ||
785 | }; | 788 | }; |
786 | 789 | ||
787 | /* plugin header */ | 790 | /* plugin header */ |
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index bb7da12e8b..c90613623c 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES | |||
@@ -1,3 +1,7 @@ | |||
1 | #ifdef CPU_ARM | ||
2 | /* For now, only ARM uses this for __div0 */ | ||
3 | gcc-support.c | ||
4 | #endif | ||
1 | oldmenuapi.c | 5 | oldmenuapi.c |
2 | configfile.c | 6 | configfile.c |
3 | fixedpoint.c | 7 | fixedpoint.c |
diff --git a/apps/plugins/lib/gcc-support.c b/apps/plugins/lib/gcc-support.c new file mode 100644 index 0000000000..91744d7fbc --- /dev/null +++ b/apps/plugins/lib/gcc-support.c | |||
@@ -0,0 +1,30 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2009 by Michael Sevakis | ||
11 | * | ||
12 | * Miscellaneous compiler support routines. | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or | ||
15 | * modify it under the terms of the GNU General Public License | ||
16 | * as published by the Free Software Foundation; either version 2 | ||
17 | * of the License, or (at your option) any later version. | ||
18 | * | ||
19 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
20 | * KIND, either express or implied | ||
21 | * | ||
22 | ****************************************************************************/ | ||
23 | #include "plugin.h" | ||
24 | |||
25 | #ifdef CPU_ARM | ||
26 | void __attribute__((naked)) __div0(void) | ||
27 | { | ||
28 | asm volatile("bx %0" : : "r"(rb->__div0)); | ||
29 | } | ||
30 | #endif | ||
diff --git a/apps/plugins/plugins.make b/apps/plugins/plugins.make index c6c399db48..0f6804d591 100644 --- a/apps/plugins/plugins.make +++ b/apps/plugins/plugins.make | |||
@@ -17,6 +17,10 @@ ROCKS := $(subst $(ROOTDIR),$(BUILDDIR),$(ROCKS)) | |||
17 | PLUGINLIB := $(BUILDDIR)/apps/plugins/libplugin.a | 17 | PLUGINLIB := $(BUILDDIR)/apps/plugins/libplugin.a |
18 | PLUGINLIB_SRC = $(call preprocess, $(APPSDIR)/plugins/lib/SOURCES) | 18 | PLUGINLIB_SRC = $(call preprocess, $(APPSDIR)/plugins/lib/SOURCES) |
19 | OTHER_SRC += $(PLUGINLIB_SRC) | 19 | OTHER_SRC += $(PLUGINLIB_SRC) |
20 | # include gcc-support routines for linking first if in SOURCES | ||
21 | ifneq "$(findstring gcc-support.c,$(PLUGINLIB_SRC))" "" | ||
22 | GCCSUPPORT_OBJ := $(BUILDDIR)/apps/plugins/lib/gcc-support.o | ||
23 | endif | ||
20 | 24 | ||
21 | PLUGINLIB_OBJ := $(PLUGINLIB_SRC:.c=.o) | 25 | PLUGINLIB_OBJ := $(PLUGINLIB_SRC:.c=.o) |
22 | PLUGINLIB_OBJ := $(PLUGINLIB_OBJ:.S=.o) | 26 | PLUGINLIB_OBJ := $(PLUGINLIB_OBJ:.S=.o) |
@@ -70,7 +74,7 @@ else | |||
70 | PLUGINLDFLAGS = -T$(PLUGINLINK_LDS) -Wl,--gc-sections -Wl,-Map,$*.map | 74 | PLUGINLDFLAGS = -T$(PLUGINLINK_LDS) -Wl,--gc-sections -Wl,-Map,$*.map |
71 | endif | 75 | endif |
72 | 76 | ||
73 | $(BUILDDIR)/%.rock: $(BUILDDIR)/%.o $(PLUGINLINK_LDS) | 77 | $(BUILDDIR)/%.rock: $(GCCSUPPORT_OBJ) $(BUILDDIR)/%.o $(PLUGINLINK_LDS) |
74 | $(call PRINTS,LD $(@F))$(CC) $(PLUGINFLAGS) -o $(BUILDDIR)/$*.elf \ | 78 | $(call PRINTS,LD $(@F))$(CC) $(PLUGINFLAGS) -o $(BUILDDIR)/$*.elf \ |
75 | $(filter %.o, $^) \ | 79 | $(filter %.o, $^) \ |
76 | $(filter %.a, $^) \ | 80 | $(filter %.a, $^) \ |
diff --git a/apps/plugins/test_codec.c b/apps/plugins/test_codec.c index 48fceb9cf2..ec5c8e9800 100644 --- a/apps/plugins/test_codec.c +++ b/apps/plugins/test_codec.c | |||
@@ -494,6 +494,9 @@ static void init_ci(void) | |||
494 | ci.semaphore_release = rb->semaphore_release; | 494 | ci.semaphore_release = rb->semaphore_release; |
495 | #endif | 495 | #endif |
496 | 496 | ||
497 | #ifdef CPU_ARM | ||
498 | ci.__div0 = rb->__div0; | ||
499 | #endif | ||
497 | } | 500 | } |
498 | 501 | ||
499 | static void codec_thread(void) | 502 | static void codec_thread(void) |