diff options
| author | Thomas Martitz <kugel@rockbox.org> | 2010-09-09 16:17:21 +0000 |
|---|---|---|
| committer | Thomas Martitz <kugel@rockbox.org> | 2010-09-09 16:17:21 +0000 |
| commit | 0d4585b28ffcac1b62ed37cee2c34de0515df468 (patch) | |
| tree | 70ace8b78a4d0a44da50d692e893fadd93f85878 /firmware/export/load_code.h | |
| parent | cec7c99613b3c11deb8a05deecd7ee9d16b5ea8a (diff) | |
| download | rockbox-0d4585b28ffcac1b62ed37cee2c34de0515df468.zip rockbox-0d4585b28ffcac1b62ed37cee2c34de0515df468.tar.gz rockbox-0d4585b28ffcac1b62ed37cee2c34de0515df468.tar.bz2 rockbox-0d4585b28ffcac1b62ed37cee2c34de0515df468.tar.xz | |
Extend lc_open() to also being able to load overlay plugins.
For this it needs to look at the plugin header. Since lc_open() doesn't know
it's a plugin, the header needs to be changed slightly to include the new lc_header (which needs to be the first element in plugin_header so it can be casted savely).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28054 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/export/load_code.h')
| -rw-r--r-- | firmware/export/load_code.h | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/firmware/export/load_code.h b/firmware/export/load_code.h index 6f5e5d0..55ce601 100644 --- a/firmware/export/load_code.h +++ b/firmware/export/load_code.h @@ -20,17 +20,21 @@ ****************************************************************************/ +#ifndef __LOAD_CODE_H__ +#define __LOAD_CODE_H__ + #include "config.h" #if (CONFIG_PLATFORM & PLATFORM_NATIVE) #include "system.h" -extern void *lc_open(const char *filename, char *buf, size_t buf_size); +extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size); /* header is always at the beginning of the blob, and handle actually points - * to the start of the blob */ + * to the start of the blob (the header is there) */ static inline void *lc_open_from_mem(void* addr, size_t blob_size) { (void)blob_size; + /* commit dcache and discard icache */ cpucache_invalidate(); return addr; } @@ -48,14 +52,27 @@ static inline void lc_close(void *handle) { (void)handle; } #else #define _lc_open_char char #endif -extern void *_lc_open(const _lc_open_char *filename, char *buf, size_t buf_size); +extern void *_lc_open(const _lc_open_char *filename, unsigned char *buf, size_t buf_size); extern void *_lc_get_header(void *handle); extern void _lc_close(void *handle); -extern void *lc_open(const char *filename, char *buf, size_t buf_size); -/* not possiible on hosted platforms */ +extern void *lc_open(const char *filename, unsigned char *buf, size_t buf_size); extern void *lc_open_from_mem(void *addr, size_t blob_size); extern void *lc_get_header(void *handle); extern void lc_close(void *handle); extern const char* lc_last_error(void); #endif + +/* this struct needs to be the first part of other headers + * (lc_open() casts the other header to this one to load to the correct + * address) + */ +struct lc_header { + unsigned long magic; + unsigned short target_id; + unsigned short api_version; + unsigned char *load_addr; + unsigned char *end_addr; +}; + +#endif /* __LOAD_CODE_H__ */ |