From ffb0cdc4263c5c5f4b13fd7514533f4d17fa2a3b Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Mon, 16 Jan 2006 18:51:12 +0000 Subject: Archos recorders: The Rockboy overlay loader now uses the same header as the plugin loader. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8354 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/rockboy.c | 63 +++++++++++++++++++++++++---------------- apps/plugins/rockboy/archos.lds | 4 +-- apps/plugins/rockboy/rockboy.c | 24 ++-------------- 3 files changed, 44 insertions(+), 47 deletions(-) diff --git a/apps/plugins/rockboy.c b/apps/plugins/rockboy.c index d3504572cf..f571894717 100644 --- a/apps/plugins/rockboy.c +++ b/apps/plugins/rockboy.c @@ -34,47 +34,62 @@ int audiobuf_size; /* this is the plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - int fh, readsize; - struct { - unsigned long magic; - unsigned char *start_addr; - unsigned char *end_addr; - enum plugin_status(*entry_point)(struct plugin_api*, void*); - } header; + int fd, readsize; + struct plugin_header header; rb = api; - fh = rb->open(OVL_NAME, O_RDONLY); - if (fh < 0) + fd = rb->open(OVL_NAME, O_RDONLY); + if (fd < 0) { - rb->splash(2*HZ, true, "Couldn't open " OVL_DISPLAYNAME " overlay."); + rb->splash(2*HZ, true, "Can't open " OVL_NAME); return PLUGIN_ERROR; } - readsize = rb->read(fh, &header, sizeof(header)); - if (readsize != sizeof(header) || header.magic != 0x524f564c) + readsize = rb->read(fd, &header, sizeof(header)); + rb->close(fd); + /* Close for now. Less code than doing it in all error checks. + * Would need to seek back anyway. */ + + if (readsize != sizeof(header)) { - rb->close(fh); - rb->splash(2*HZ, true, OVL_NAME " is not a valid Rockbox overlay."); + rb->splash(2*HZ, true, "Reading" OVL_DISPLAYNAME " overlay failed."); return PLUGIN_ERROR; } - + if (header.magic != PLUGIN_MAGIC || header.target_id != TARGET_ID) + { + rb->splash(2*HZ, true, OVL_DISPLAYNAME + " overlay: Incompatible model."); + return PLUGIN_ERROR; + } + if (header.api_version != PLUGIN_API_VERSION) + { + rb->splash(2*HZ, true, OVL_DISPLAYNAME + " overlay: Incompatible version."); + return PLUGIN_ERROR; + } + audiobuf = rb->plugin_get_audio_buffer(&audiobuf_size); - if (header.start_addr < audiobuf || + if (header.load_addr < audiobuf || header.end_addr > audiobuf + audiobuf_size) { - rb->close(fh); rb->splash(2*HZ, true, OVL_DISPLAYNAME - " overlay doesn't fit into memory."); + " overlay doesn't fit into memory."); + return PLUGIN_ERROR; + } + rb->memset(header.load_addr, 0, header.end_addr - header.load_addr); + + fd = rb->open(OVL_NAME, O_RDONLY); + if (fd < 0) + { + rb->splash(2*HZ, true, "Can't open " OVL_NAME); return PLUGIN_ERROR; } - rb->memset(header.start_addr, 0, header.end_addr - header.start_addr); + readsize = rb->read(fd, header.load_addr, header.end_addr - header.load_addr); + rb->close(fd); - rb->lseek(fh, 0, SEEK_SET); - readsize = rb->read(fh, header.start_addr, header.end_addr - header.start_addr); - rb->close(fh); - if (readsize <= (int)sizeof(header)) + if (readsize < 0) { - rb->splash(2*HZ, true, "Error loading " OVL_DISPLAYNAME " overlay."); + rb->splash(2*HZ, true, "Reading" OVL_DISPLAYNAME " overlay failed."); return PLUGIN_ERROR; } return header.entry_point(api, parameter); diff --git a/apps/plugins/rockboy/archos.lds b/apps/plugins/rockboy/archos.lds index 55db1e2e30..24f4f1d4eb 100755 --- a/apps/plugins/rockboy/archos.lds +++ b/apps/plugins/rockboy/archos.lds @@ -19,7 +19,7 @@ MEMORY SECTIONS { .header : { - _ovl_start_addr = .; + _plugin_start_addr = .; *(.header) } > OVERLAY_RAM @@ -42,6 +42,6 @@ SECTIONS *(.bss) *(COMMON) . = ALIGN(0x4); - _ovl_end_addr = .; + _plugin_end_addr = .; } > OVERLAY_RAM } diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index a21e9e4368..a7e9bfb8f1 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -20,25 +20,7 @@ #include "loader.h" #include "rockmacros.h" -#if MEM <= 8 && !defined(SIMULATOR) -/* On archos this is loaded as an overlay */ - -/* These are defined in the linker script */ -extern unsigned char ovl_start_addr[]; -extern unsigned char ovl_end_addr[]; - -const struct { - unsigned long magic; - unsigned char *start_addr; - unsigned char *end_addr; - enum plugin_status (*entry_point)(struct plugin_api*, void*); -} header __attribute__ ((section (".header"))) = { - 0x524f564c, /* ROVL */ - ovl_start_addr, ovl_end_addr, plugin_start -}; -#else PLUGIN_HEADER -#endif #ifdef USE_IRAM extern char iramcopy[]; @@ -109,10 +91,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) audio_bufferbase = audio_bufferpointer = rb->plugin_get_audio_buffer((int *)&audio_buffer_free); #if MEM <= 8 && !defined(SIMULATOR) - /* loaded as an overlay, protect from overwriting ourselves */ - if ((unsigned)(ovl_start_addr - (unsigned char *)audio_bufferbase) + /* loaded as an overlay plugin, protect from overwriting ourselves */ + if ((unsigned)(plugin_start_addr - (unsigned char *)audio_bufferbase) < audio_buffer_free) - audio_buffer_free = ovl_start_addr - (unsigned char *)audio_bufferbase; + audio_buffer_free = plugin_start_addr - (unsigned char *)audio_bufferbase; #endif #ifdef USE_IRAM -- cgit v1.2.3