diff options
author | Thomas Martitz <kugel@rockbox.org> | 2010-08-27 00:16:26 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2010-08-27 00:16:26 +0000 |
commit | 97d2a6ec5ca8ace8daed29c8c69aab9595147b3a (patch) | |
tree | 8f67645f080416576b9356dfc4385b8181eeb152 /apps/plugin.c | |
parent | 73f057be6fcb849d5379073267e21e9526576ccd (diff) | |
download | rockbox-97d2a6ec5ca8ace8daed29c8c69aab9595147b3a.tar.gz rockbox-97d2a6ec5ca8ace8daed29c8c69aab9595147b3a.zip |
Revert "Introduce a small api for loading code (codecs,plugins) from disk/memory."
I don't understand the build error at all, plugin_bss_start is clearly defined in plugin.lds
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27901 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugin.c')
-rw-r--r-- | apps/plugin.c | 102 |
1 files changed, 71 insertions, 31 deletions
diff --git a/apps/plugin.c b/apps/plugin.c index 53a05bf527..cc540cd988 100644 --- a/apps/plugin.c +++ b/apps/plugin.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "errno.h" | 42 | #include "errno.h" |
43 | #include "diacritic.h" | 43 | #include "diacritic.h" |
44 | #include "filefuncs.h" | 44 | #include "filefuncs.h" |
45 | #include "load_code.h" | ||
46 | 45 | ||
47 | #if CONFIG_CHARGING | 46 | #if CONFIG_CHARGING |
48 | #include "power.h" | 47 | #include "power.h" |
@@ -76,19 +75,21 @@ static unsigned int open_files; | |||
76 | 75 | ||
77 | #if (CONFIG_PLATFORM & PLATFORM_HOSTED) | 76 | #if (CONFIG_PLATFORM & PLATFORM_HOSTED) |
78 | static unsigned char pluginbuf[PLUGIN_BUFFER_SIZE]; | 77 | static unsigned char pluginbuf[PLUGIN_BUFFER_SIZE]; |
78 | void *sim_plugin_load(char *plugin, void **pd); | ||
79 | void sim_plugin_close(void *pd); | ||
79 | void sim_lcd_ex_init(unsigned long (*getpixel)(int, int)); | 80 | void sim_lcd_ex_init(unsigned long (*getpixel)(int, int)); |
80 | void sim_lcd_ex_update_rect(int x, int y, int width, int height); | 81 | void sim_lcd_ex_update_rect(int x, int y, int width, int height); |
81 | #else | 82 | #else |
83 | #define sim_plugin_close(x) | ||
82 | extern unsigned char pluginbuf[]; | 84 | extern unsigned char pluginbuf[]; |
83 | #include "bitswap.h" | 85 | #include "bitswap.h" |
84 | #endif | 86 | #endif |
85 | 87 | ||
86 | /* for actual plugins only, not for codecs */ | 88 | /* for actual plugins only, not for codecs */ |
89 | static bool plugin_loaded = false; | ||
87 | static int plugin_size = 0; | 90 | static int plugin_size = 0; |
88 | static bool (*pfn_tsr_exit)(bool reenter) = NULL; /* TSR exit callback */ | 91 | static bool (*pfn_tsr_exit)(bool reenter) = NULL; /* TSR exit callback */ |
89 | static char current_plugin[MAX_PATH]; | 92 | static char current_plugin[MAX_PATH]; |
90 | /* NULL if no plugin is loaded, otherwise the handle that lc_open() returned */ | ||
91 | static void *current_plugin_handle; | ||
92 | 93 | ||
93 | char *plugin_get_current_filename(void); | 94 | char *plugin_get_current_filename(void); |
94 | 95 | ||
@@ -727,60 +728,98 @@ int plugin_load(const char* plugin, const void* parameter) | |||
727 | { | 728 | { |
728 | int rc, i; | 729 | int rc, i; |
729 | struct plugin_header *hdr; | 730 | struct plugin_header *hdr; |
731 | #if (CONFIG_PLATFORM & PLATFORM_HOSTED) | ||
732 | void *pd; | ||
733 | #else /* PLATFOR_NATIVE */ | ||
734 | int fd; | ||
735 | ssize_t readsize; | ||
736 | #if NUM_CORES > 1 | ||
737 | unsigned my_core; | ||
738 | #endif | ||
739 | #endif /* CONFIG_PLATFORM */ | ||
730 | 740 | ||
731 | #if LCD_DEPTH > 1 | 741 | #if LCD_DEPTH > 1 |
732 | fb_data* old_backdrop; | 742 | fb_data* old_backdrop; |
733 | #endif | 743 | #endif |
734 | 744 | ||
735 | if (current_plugin_handle && pfn_tsr_exit) | 745 | if (pfn_tsr_exit != NULL) /* if we have a resident old plugin: */ |
736 | { /* if we have a resident old plugin and a callback */ | 746 | { |
737 | if (pfn_tsr_exit(!strcmp(current_plugin, plugin)) == false ) | 747 | if (pfn_tsr_exit(!strcmp(current_plugin, plugin)) == false ) |
738 | { | 748 | { |
739 | /* not allowing another plugin to load */ | 749 | /* not allowing another plugin to load */ |
740 | return PLUGIN_OK; | 750 | return PLUGIN_OK; |
741 | } | 751 | } |
742 | lc_close(current_plugin_handle); | 752 | pfn_tsr_exit = NULL; |
743 | current_plugin_handle = pfn_tsr_exit = NULL; | 753 | plugin_loaded = false; |
744 | } | 754 | } |
745 | 755 | ||
746 | splash(0, ID2P(LANG_WAIT)); | 756 | splash(0, ID2P(LANG_WAIT)); |
747 | strcpy(current_plugin, plugin); | 757 | strcpy(current_plugin, plugin); |
748 | 758 | ||
749 | current_plugin_handle = lc_open(plugin, pluginbuf, PLUGIN_BUFFER_SIZE); | 759 | #if (CONFIG_PLATFORM & PLATFORM_HOSTED) |
750 | if (current_plugin_handle == NULL) { | 760 | hdr = sim_plugin_load((char *)plugin, &pd); |
761 | if (pd == NULL) { | ||
751 | splashf(HZ*2, str(LANG_PLUGIN_CANT_OPEN), plugin); | 762 | splashf(HZ*2, str(LANG_PLUGIN_CANT_OPEN), plugin); |
752 | return -1; | 763 | return -1; |
753 | } | 764 | } |
765 | if (hdr == NULL | ||
766 | || hdr->magic != PLUGIN_MAGIC | ||
767 | || hdr->target_id != TARGET_ID) { | ||
768 | sim_plugin_close(pd); | ||
769 | splash(HZ*2, str(LANG_PLUGIN_WRONG_MODEL)); | ||
770 | return -1; | ||
771 | } | ||
772 | if (hdr->api_version > PLUGIN_API_VERSION | ||
773 | || hdr->api_version < PLUGIN_MIN_API_VERSION) { | ||
774 | sim_plugin_close(pd); | ||
775 | splash(HZ*2, str(LANG_PLUGIN_WRONG_VERSION)); | ||
776 | return -1; | ||
777 | } | ||
778 | #else | ||
779 | fd = open(plugin, O_RDONLY); | ||
780 | if (fd < 0) { | ||
781 | splashf(HZ*2, str(LANG_PLUGIN_CANT_OPEN), plugin); | ||
782 | return fd; | ||
783 | } | ||
784 | #if NUM_CORES > 1 | ||
785 | /* Make sure COP cache is flushed and invalidated before loading */ | ||
786 | my_core = switch_core(CURRENT_CORE ^ 1); | ||
787 | cpucache_invalidate(); | ||
788 | switch_core(my_core); | ||
789 | #endif | ||
754 | 790 | ||
755 | hdr = lc_get_header(current_plugin_handle); | 791 | readsize = read(fd, pluginbuf, PLUGIN_BUFFER_SIZE); |
792 | close(fd); | ||
756 | 793 | ||
757 | if (hdr == NULL | 794 | if (readsize < 0) { |
795 | splashf(HZ*2, str(LANG_READ_FAILED), plugin); | ||
796 | return -1; | ||
797 | } | ||
798 | hdr = (struct plugin_header *)pluginbuf; | ||
799 | |||
800 | if ((unsigned)readsize <= sizeof(struct plugin_header) | ||
758 | || hdr->magic != PLUGIN_MAGIC | 801 | || hdr->magic != PLUGIN_MAGIC |
759 | || hdr->target_id != TARGET_ID | 802 | || hdr->target_id != TARGET_ID |
760 | #if (CONFIG_PLATFORM & PLATFORM_NATIVE) | ||
761 | || hdr->load_addr != pluginbuf | 803 | || hdr->load_addr != pluginbuf |
762 | || hdr->end_addr > pluginbuf + PLUGIN_BUFFER_SIZE | 804 | || hdr->end_addr > pluginbuf + PLUGIN_BUFFER_SIZE) { |
763 | #endif | ||
764 | ) | ||
765 | { | ||
766 | lc_close(current_plugin_handle); | ||
767 | splash(HZ*2, str(LANG_PLUGIN_WRONG_MODEL)); | 805 | splash(HZ*2, str(LANG_PLUGIN_WRONG_MODEL)); |
768 | return -1; | 806 | return -1; |
769 | } | 807 | } |
770 | if (hdr->api_version > PLUGIN_API_VERSION | 808 | if (hdr->api_version > PLUGIN_API_VERSION |
771 | || hdr->api_version < PLUGIN_MIN_API_VERSION) | 809 | || hdr->api_version < PLUGIN_MIN_API_VERSION) { |
772 | { | ||
773 | lc_close(current_plugin_handle); | ||
774 | splash(HZ*2, str(LANG_PLUGIN_WRONG_VERSION)); | 810 | splash(HZ*2, str(LANG_PLUGIN_WRONG_VERSION)); |
775 | return -1; | 811 | return -1; |
776 | } | 812 | } |
777 | #if (CONFIG_PLATFORM & PLATFORM_NATIVE) | ||
778 | plugin_size = hdr->end_addr - pluginbuf; | 813 | plugin_size = hdr->end_addr - pluginbuf; |
779 | #else | 814 | |
780 | plugin_size = 0; | 815 | /* zero out bss area only, above guards end of pluginbuf */ |
816 | if (plugin_size > readsize) | ||
817 | memset(pluginbuf + readsize, 0, plugin_size - readsize); | ||
781 | #endif | 818 | #endif |
782 | 819 | ||
783 | *(hdr->api) = &rockbox_api; | 820 | *(hdr->api) = &rockbox_api; |
821 | plugin_loaded = true; | ||
822 | |||
784 | 823 | ||
785 | #if defined HAVE_LCD_BITMAP && LCD_DEPTH > 1 | 824 | #if defined HAVE_LCD_BITMAP && LCD_DEPTH > 1 |
786 | old_backdrop = lcd_get_backdrop(); | 825 | old_backdrop = lcd_get_backdrop(); |
@@ -795,6 +834,8 @@ int plugin_load(const char* plugin, const void* parameter) | |||
795 | 834 | ||
796 | FOR_NB_SCREENS(i) | 835 | FOR_NB_SCREENS(i) |
797 | viewportmanager_theme_enable(i, false, NULL); | 836 | viewportmanager_theme_enable(i, false, NULL); |
837 | |||
838 | cpucache_invalidate(); | ||
798 | 839 | ||
799 | #ifdef HAVE_TOUCHSCREEN | 840 | #ifdef HAVE_TOUCHSCREEN |
800 | touchscreen_set_mode(TOUCHSCREEN_BUTTON); | 841 | touchscreen_set_mode(TOUCHSCREEN_BUTTON); |
@@ -806,12 +847,6 @@ int plugin_load(const char* plugin, const void* parameter) | |||
806 | 847 | ||
807 | rc = hdr->entry_point(parameter); | 848 | rc = hdr->entry_point(parameter); |
808 | 849 | ||
809 | if (!pfn_tsr_exit) | ||
810 | { /* close handle if plugin is no tsr one */ | ||
811 | lc_close(current_plugin_handle); | ||
812 | current_plugin_handle = NULL; | ||
813 | } | ||
814 | |||
815 | /* Go back to the global setting in case the plugin changed it */ | 850 | /* Go back to the global setting in case the plugin changed it */ |
816 | #ifdef HAVE_TOUCHSCREEN | 851 | #ifdef HAVE_TOUCHSCREEN |
817 | touchscreen_set_mode(global_settings.touch_mode); | 852 | touchscreen_set_mode(global_settings.touch_mode); |
@@ -852,8 +887,11 @@ int plugin_load(const char* plugin, const void* parameter) | |||
852 | FOR_NB_SCREENS(i) | 887 | FOR_NB_SCREENS(i) |
853 | viewportmanager_theme_undo(i, false); | 888 | viewportmanager_theme_undo(i, false); |
854 | 889 | ||
890 | if (pfn_tsr_exit == NULL) | ||
891 | plugin_loaded = false; | ||
892 | |||
855 | #ifdef HAVE_PLUGIN_CHECK_OPEN_CLOSE | 893 | #ifdef HAVE_PLUGIN_CHECK_OPEN_CLOSE |
856 | if(open_files != 0 && !current_plugin_handle) | 894 | if(open_files != 0 && !plugin_loaded) |
857 | { | 895 | { |
858 | int fd; | 896 | int fd; |
859 | logf("Plugin '%s' leaks file handles", plugin); | 897 | logf("Plugin '%s' leaks file handles", plugin); |
@@ -871,6 +909,8 @@ int plugin_load(const char* plugin, const void* parameter) | |||
871 | } | 909 | } |
872 | #endif | 910 | #endif |
873 | 911 | ||
912 | sim_plugin_close(pd); | ||
913 | |||
874 | if (rc == PLUGIN_ERROR) | 914 | if (rc == PLUGIN_ERROR) |
875 | splash(HZ*2, str(LANG_PLUGIN_ERROR)); | 915 | splash(HZ*2, str(LANG_PLUGIN_ERROR)); |
876 | 916 | ||
@@ -883,7 +923,7 @@ void* plugin_get_buffer(size_t *buffer_size) | |||
883 | { | 923 | { |
884 | int buffer_pos; | 924 | int buffer_pos; |
885 | 925 | ||
886 | if (current_plugin_handle) | 926 | if (plugin_loaded) |
887 | { | 927 | { |
888 | if (plugin_size >= PLUGIN_BUFFER_SIZE) | 928 | if (plugin_size >= PLUGIN_BUFFER_SIZE) |
889 | return NULL; | 929 | return NULL; |