From 38eafb60ff53079074443cddbda71dc4d7b31193 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Thu, 3 Mar 2022 23:40:17 +0000 Subject: [PATCH] x1000: use core_alloc in bootloader for loading rockbox Using the audio buffer directly is a bad idea because this will render core_alloc non-functional if load_firmware() writes into the buffer but then fails, for example on a checksum mismatch. Change-Id: Ib2d17bcea53bdea1c4c5496cec0c4eee5dd66069 --- bootloader/x1000.c | 16 ++++++++++------ firmware/target/mips/ingenic_x1000/app.lds | 2 -- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/bootloader/x1000.c b/bootloader/x1000.c index bce7b69784..14634683e6 100644 --- a/bootloader/x1000.c +++ b/bootloader/x1000.c @@ -137,11 +137,6 @@ const struct menuitem recovery_items[] = { {MENUITEM_ACTION, "Restore", &bootloader_restore}, }; -/* Temp buffer to contain the binary in memory */ -extern unsigned char loadbuffer[]; -extern unsigned char loadbufferend[]; -#define MAX_LOAD_SIZE (loadbufferend - loadbuffer) - /* Flags to indicate if hardware was already initialized */ bool lcd_inited = false; bool usb_inited = false; @@ -340,8 +335,17 @@ void boot_rockbox(void) if(init_disk() != 0) return; - int rc = load_firmware(loadbuffer, BOOTFILE, MAX_LOAD_SIZE); + size_t max_size = 0; + int handle = core_alloc_maximum("rockbox", &max_size, &buflib_ops_locked); + if(handle < 0) { + splash(5*HZ, "Out of memory"); + return; + } + + unsigned char* loadbuffer = core_get_data(handle); + int rc = load_firmware(loadbuffer, BOOTFILE, max_size); if(rc <= 0) { + core_free(handle); splash2(5*HZ, "Error loading Rockbox", loader_strerror(rc)); return; } diff --git a/firmware/target/mips/ingenic_x1000/app.lds b/firmware/target/mips/ingenic_x1000/app.lds index 26b2854728..9b36071c3c 100644 --- a/firmware/target/mips/ingenic_x1000/app.lds +++ b/firmware/target/mips/ingenic_x1000/app.lds @@ -88,10 +88,8 @@ SECTIONS { . = ALIGN(4); audiobuffer = .; - loadbuffer = .; } > DRAM - loadbufferend = ENDAUDIOADDR; audiobufend = ENDAUDIOADDR; codecbuf = ENDAUDIOADDR; pluginbuf = ENDCODECADDR;