From 67ba90d3eaf01c5400d0b42cdce05ef9295d8c16 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Wed, 20 Nov 2019 20:32:27 -0700 Subject: [PATCH 1/4] Allow GZIP compressed flash updates Modified the bootloader to be able to take stored updates in compressed GZIP format (i.e. the output of "gzip -9 xxx.bin") and decompress them on-the-fly to their final destination. This can work for apps and for filesystems (when used with the 2-step update option). Allow eboot to be built using -Os/2 optimizations by fixing some portions which failed when any optimizations were used. Add -Wall and use data and function sections to reduce size. Use -Os to minimize size. Remove obsolete esptool-ck calls to build a .ROM image, we don't use it. Move all uninitted variables to RAM from IRAM, allowing 8-bit access. Hook in @d-a-v and @pfalcon's uzlib port to actually do the decompression. Do not use any CRC checking which saves space. Since we have overwritten all of flash by the time we know id the CRC matches, there's nothing we could have done anyway. Adjust the Updater class to support GZIP files and not attempt to patch them. Bootloader builds to 0xd90 out of 0xfff bytes. --- .gitmodules | 3 + bootloaders/eboot/Makefile | 31 +++++---- bootloaders/eboot/eboot.c | 102 +++++++++++++++++++++++++----- bootloaders/eboot/eboot.elf | Bin 10376 -> 35084 bytes bootloaders/eboot/eboot.ld | 3 +- bootloaders/eboot/eboot_command.c | 2 +- cores/esp8266/Updater.cpp | 12 +++- tools/sdk/uzlib | 1 + 8 files changed, 120 insertions(+), 34 deletions(-) create mode 160000 tools/sdk/uzlib diff --git a/.gitmodules b/.gitmodules index ca26e7d93b..403d4ce64e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "tools/esptool"] path = tools/esptool url = https://github.com/espressif/esptool.git +[submodule "tools/sdk/uzlib"] + path = tools/sdk/uzlib + url = https://github.com/earlephilhower/uzlib.git diff --git a/bootloaders/eboot/Makefile b/bootloaders/eboot/Makefile index 3e25eb139e..dc28219b61 100644 --- a/bootloaders/eboot/Makefile +++ b/bootloaders/eboot/Makefile @@ -6,25 +6,30 @@ TARGET_DIR := ./ TARGET_OBJ_FILES := \ eboot.o \ - eboot_command.o \ - + eboot_command.o TARGET_OBJ_PATHS := $(addprefix $(TARGET_DIR)/,$(TARGET_OBJ_FILES)) +UZLIB_PATH := ../../tools/sdk/uzlib/src +UZLIB_FLAGS := -DRUNTIME_BITS_TABLES + CC := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-gcc CXX := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-g++ AR := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-ar LD := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-gcc OBJDUMP := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-objdump -INC += -I../../tools/sdk/include +INC += -I../../tools/sdk/include -I../../tools/sdk/uzlib/src + CFLAGS += -std=gnu99 -CFLAGS += -O0 -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mno-text-section-literals +CFLAGS += -Os -g -Wall -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mno-text-section-literals -ffunction-sections -fdata-sections CFLAGS += $(INC) -LDFLAGS += -nostdlib -Wl,--no-check-sections -umain +CFLAGS += $(UZLIB_FLAGS) + +LDFLAGS += -nostdlib -Wl,--no-check-sections -Wl,--gc-sections -umain LD_SCRIPT := -Teboot.ld @@ -32,18 +37,20 @@ APP_OUT:= eboot.elf APP_AR := eboot.a APP_FW := eboot.bin -all: $(APP_FW) -$(APP_AR): $(TARGET_OBJ_PATHS) - $(AR) cru $@ $^ +all: $(APP_OUT) +tinflate.o: $(UZLIB_PATH)/tinflate.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h + $(CC) $(CFLAGS) -c -o tinflate.o $(UZLIB_PATH)/tinflate.c -$(APP_OUT): $(APP_AR) - $(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group -Wl,--whole-archive $(APP_AR) -Wl,--end-group -o $@ +tinfgzip.o: $(UZLIB_PATH)/tinfgzip.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h + $(CC) $(CFLAGS) -c -o tinfgzip.o $(UZLIB_PATH)/tinfgzip.c -$(APP_FW): $(APP_OUT) - $(ESPTOOL) -vvv -eo $(APP_OUT) -bo $@ -bs .text -bs .data -bs .rodata -bc -ec || true +$(APP_AR): $(TARGET_OBJ_PATHS) tinflate.o tinfgzip.o + $(AR) cru $@ $^ +$(APP_OUT): $(APP_AR) + $(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group -Wl,--whole-archive $(APP_AR) -Wl,--end-group -o $@ clean: rm -f *.o diff --git a/bootloaders/eboot/eboot.c b/bootloaders/eboot/eboot.c index 69bc692e97..1b4bcce23a 100644 --- a/bootloaders/eboot/eboot.c +++ b/bootloaders/eboot/eboot.c @@ -12,6 +12,9 @@ #include #include "flash.h" #include "eboot_command.h" +#include + +extern unsigned char _gzip_dict; #define SWRST do { (*((volatile uint32_t*) 0x60000700)) |= 0x80000000; } while(0); @@ -24,10 +27,14 @@ int print_version(const uint32_t flash_addr) if (SPIRead(flash_addr + APP_START_OFFSET + sizeof(image_header_t) + sizeof(section_header_t), &ver, sizeof(ver))) { return 1; } - const char* __attribute__ ((aligned (4))) fmtt = "v%08x\n\0\0"; - uint32_t fmt[2]; - fmt[0] = ((uint32_t*) fmtt)[0]; - fmt[1] = ((uint32_t*) fmtt)[1]; + char fmt[16]; + fmt[0] = 'v'; + fmt[1] = '%'; + fmt[2] = '0'; + fmt[3] = '8'; + fmt[4] = 'x'; + fmt[5] = '\n'; + fmt[6] = '0'; ets_printf((const char*) fmt, ver); return 0; } @@ -80,37 +87,96 @@ int load_app_from_flash_raw(const uint32_t flash_addr) pos += section_header.size; } - register uint32_t sp asm("a1") = 0x3ffffff0; - register uint32_t pc asm("a3") = image_header.entry; - __asm__ __volatile__ ("jx a3"); + asm volatile("" ::: "memory"); + asm volatile ("mov.n a1, %0\n" + "mov.n a3, %1\n" + "jx a3\n" : : "r" (0x3ffffff0), "r" (image_header.entry) ); + __builtin_unreachable(); // Save a few bytes by letting GCC know no need to pop regs/return return 0; } +uint8_t read_flash_byte(const uint32_t addr) +{ + uint8_t __attribute__((aligned(4))) buff[4]; + SPIRead(addr & ~3, buff, 4); + return buff[addr & 3]; +} +unsigned char __attribute__((aligned(4))) uzlib_flash_read_cb_buff[4096]; +uint32_t uzlib_flash_read_cb_addr; +int uzlib_flash_read_cb(struct uzlib_uncomp *m) +{ + m->source = uzlib_flash_read_cb_buff; + m->source_limit = uzlib_flash_read_cb_buff + sizeof(uzlib_flash_read_cb_buff); + SPIRead(uzlib_flash_read_cb_addr, uzlib_flash_read_cb_buff, sizeof(uzlib_flash_read_cb_buff)); + uzlib_flash_read_cb_addr += sizeof(uzlib_flash_read_cb_buff); + return *(m->source++); +} +unsigned char gzip_dict[32768]; int copy_raw(const uint32_t src_addr, const uint32_t dst_addr, const uint32_t size) { // require regions to be aligned - if (src_addr & 0xfff != 0 || - dst_addr & 0xfff != 0) { + if ((src_addr & 0xfff) != 0 || + (dst_addr & 0xfff) != 0) { return 1; } const uint32_t buffer_size = FLASH_SECTOR_SIZE; uint8_t buffer[buffer_size]; - uint32_t left = ((size+buffer_size-1) & ~(buffer_size-1)); + int32_t left = ((size+buffer_size-1) & ~(buffer_size-1)); uint32_t saddr = src_addr; uint32_t daddr = dst_addr; - - while (left) { + struct uzlib_uncomp m_uncomp; + bool gzip = false; + + // Check if we are uncompressing a GZIP upload or not + if ((read_flash_byte(saddr) == 0x1f) && (read_flash_byte(saddr + 1) == 0x8b)) { + // GZIP signature matched. Find real size as encoded at the end + left = read_flash_byte(saddr + size - 4); + left += read_flash_byte(saddr + size - 3)<<8; + left += read_flash_byte(saddr + size - 2)<<16; + left += read_flash_byte(saddr + size - 1)<<24; + + uzlib_init(); + + /* all 3 fields below must be initialized by user */ + m_uncomp.source = NULL; + m_uncomp.source_limit = NULL; + uzlib_flash_read_cb_addr = src_addr; + m_uncomp.source_read_cb = uzlib_flash_read_cb; + uzlib_uncompress_init(&m_uncomp, gzip_dict, sizeof(gzip_dict)); + + int res = uzlib_gzip_parse_header(&m_uncomp); + if (res != TINF_OK) { + return 5; // Error uncompress header read + } + gzip = true; + } + while (left > 0) { if (SPIEraseSector(daddr/buffer_size)) { return 2; } - if (SPIRead(saddr, buffer, buffer_size)) { - return 3; + if (!gzip) { + if (SPIRead(saddr, buffer, buffer_size)) { + return 3; + } + } else { + m_uncomp.dest_start = buffer; + m_uncomp.dest = buffer; + int to_read = (left > buffer_size) ? buffer_size : left; + m_uncomp.dest_limit = buffer + to_read; + int res = uzlib_uncompress(&m_uncomp); + if ((res != TINF_DONE) && (res != TINF_OK)) { + return 6; + } + // Fill any remaining with 0xff + for (int i = to_read; i < buffer_size; i++) { + buffer[i] = 0xff; + } } if (SPIWrite(daddr, buffer, buffer_size)) { return 4; @@ -124,12 +190,11 @@ int copy_raw(const uint32_t src_addr, } - -void main() +int main() { int res = 9; struct eboot_command cmd; - + print_version(0); if (eboot_command_read(&cmd) == 0) { @@ -167,4 +232,7 @@ void main() } while(true){} + + __builtin_unreachable(); + return 0; } diff --git a/bootloaders/eboot/eboot.elf b/bootloaders/eboot/eboot.elf index da0f8452785eb278f8a32f0ed05a0b8a67627195..cfd51f220f01bd2671f81b028f0b5fe23867cbe3 100755 GIT binary patch literal 35084 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 MFZN50x@fuo11Bu%PXGV_ literal 10376 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 OnLKB!aH(`A>;Df|*7v6X diff --git a/bootloaders/eboot/eboot.ld b/bootloaders/eboot/eboot.ld index 303ae8a56c..c693a3ae99 100644 --- a/bootloaders/eboot/eboot.ld +++ b/bootloaders/eboot/eboot.ld @@ -68,6 +68,8 @@ SECTIONS .data : ALIGN(4) { + *(COMMON) /* Global vars */ + . = ALIGN(4); _heap_start = ABSOLUTE(.); /* _stack_sentry = ALIGN(0x8); */ } >dram0_0_seg :dram0_0_bss_phdr @@ -150,7 +152,6 @@ SECTIONS *(.bss) *(.bss.*) *(.gnu.linkonce.b.*) - *(COMMON) . = ALIGN (8); _bss_end = ABSOLUTE(.); } >iram1_0_seg :iram1_0_phdr diff --git a/bootloaders/eboot/eboot_command.c b/bootloaders/eboot/eboot_command.c index 648039e48a..54d4895c94 100644 --- a/bootloaders/eboot/eboot_command.c +++ b/bootloaders/eboot/eboot_command.c @@ -37,7 +37,7 @@ int eboot_command_read(struct eboot_command* cmd) } uint32_t crc32 = eboot_command_calculate_crc32(cmd); - if (cmd->magic & EBOOT_MAGIC_MASK != EBOOT_MAGIC || + if ((cmd->magic & EBOOT_MAGIC_MASK) != EBOOT_MAGIC || cmd->crc32 != crc32) { return 1; } diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index b028e19b9d..8ee96ae994 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -329,7 +329,8 @@ bool UpdaterClass::_writeBuffer(){ bool modifyFlashMode = false; FlashMode_t flashMode = FM_QIO; FlashMode_t bufferFlashMode = FM_QIO; - if (_currentAddress == _startAddress + FLASH_MODE_PAGE) { + //TODO - GZIP can't do this + if ((_currentAddress == _startAddress + FLASH_MODE_PAGE) && (_buffer[0] != 0x1f)) { flashMode = ESP.getFlashChipMode(); #ifdef DEBUG_UPDATER DEBUG_UPDATER.printf_P(PSTR("Header: 0x%1X %1X %1X %1X\n"), _buffer[0], _buffer[1], _buffer[2], _buffer[3]); @@ -411,7 +412,7 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) { bool UpdaterClass::_verifyHeader(uint8_t data) { if(_command == U_FLASH) { // check for valid first magic byte (is always 0xE9) - if(data != 0xE9) { + if ((data != 0xE9) && (data != 0x1f)) { _currentAddress = (_startAddress + _size); _setError(UPDATE_ERROR_MAGIC_BYTE); return false; @@ -435,7 +436,12 @@ bool UpdaterClass::_verifyEnd() { } // check for valid first magic byte - if(buf[0] != 0xE9) { + // + // TODO: GZIP compresses the chipsize flags, so can't do check here + if ((buf[0] == 0x1f) && (buf[1] == 0x8b)) { + // GZIP, just assume OK + return true; + } else if (buf[0] != 0xE9) { _currentAddress = (_startAddress); _setError(UPDATE_ERROR_MAGIC_BYTE); return false; diff --git a/tools/sdk/uzlib b/tools/sdk/uzlib new file mode 160000 index 0000000000..6101f896d7 --- /dev/null +++ b/tools/sdk/uzlib @@ -0,0 +1 @@ +Subproject commit 6101f896d7b0ea0c7746ad7e1d98691a579df04d From 4306ae796549e561d9cc056b62cb5fd118aefc7c Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 7 Dec 2019 13:22:32 -0800 Subject: [PATCH 2/4] Add @d-a-v's patch for httpupdate https://github.com/esp8266/Arduino/pull/6820#pullrequestreview-326541014 --- .../src/ESP8266httpUpdate.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index f736120650..2198a28eb4 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -370,7 +370,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String& } // check for valid first magic byte - if(buf[0] != 0xE9) { + if(buf[0] != 0xE9 && buf[0] != 0x1f) { DEBUG_HTTP_UPDATE("[httpUpdate] Magic header does not start with 0xE9\n"); _setLastError(HTTP_UE_BIN_VERIFY_HEADER_FAILED); http.end(); @@ -378,14 +378,16 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String& } - uint32_t bin_flash_size = ESP.magicFlashChipSize((buf[3] & 0xf0) >> 4); + if (buf[0] == 0xe9) { + uint32_t bin_flash_size = ESP.magicFlashChipSize((buf[3] & 0xf0) >> 4); - // check if new bin fits to SPI flash - if(bin_flash_size > ESP.getFlashChipRealSize()) { - DEBUG_HTTP_UPDATE("[httpUpdate] New binary does not fit SPI Flash size\n"); - _setLastError(HTTP_UE_BIN_FOR_WRONG_FLASH); - http.end(); - return HTTP_UPDATE_FAILED; + // check if new bin fits to SPI flash + if(bin_flash_size > ESP.getFlashChipRealSize()) { + DEBUG_HTTP_UPDATE("[httpUpdate] New binary does not fit SPI Flash size\n"); + _setLastError(HTTP_UE_BIN_FOR_WRONG_FLASH); + http.end(); + return HTTP_UPDATE_FAILED; + } } } if(runUpdate(*tcp, len, http.header("x-MD5"), command)) { From 30ba645729b839083ad9b0f80436c3299009dab9 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 9 Dec 2019 12:55:59 -0800 Subject: [PATCH 3/4] Update uzlib to point to pfalcon++ For now, because there are some self-test failures with @d-a-v's esp8266 branch (whose cool new features we don't actually use in eboot now) start with pfalcon's 2.9 release and add the 2 patches (clcidx to code from IRAM/RODATA, and the Windows test file renaming) needed to build and run successfully. --- bootloaders/eboot/eboot.elf | Bin 35084 -> 34856 bytes tools/sdk/uzlib | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bootloaders/eboot/eboot.elf b/bootloaders/eboot/eboot.elf index cfd51f220f01bd2671f81b028f0b5fe23867cbe3..442ad15f542c9fd9fc810b683e6bed08a260e975 100755 GIT binary patch delta 8682 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 diff --git a/tools/sdk/uzlib b/tools/sdk/uzlib index 6101f896d7..80765a42d6 160000 --- a/tools/sdk/uzlib +++ b/tools/sdk/uzlib @@ -1 +1 @@ -Subproject commit 6101f896d7b0ea0c7746ad7e1d98691a579df04d +Subproject commit 80765a42d657fcd3a24e036ac9822f9dbf862449 From 431809f7a5398f23aef4342f21cf819b7c99a3c4 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 9 Dec 2019 13:05:46 -0800 Subject: [PATCH 4/4] Add (c) notice for uzlib to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6907c7f900..f3db2206a9 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,8 @@ ESP8266 core files are licensed under LGPL. [LittleFS](https://github.com/ARMmbed/littlefs) library written by ARM Limited and released under the [BSD 3-clause license](https://github.com/ARMmbed/littlefs/blob/master/LICENSE.md). +[uzlib](https://github.com/pfalcon/uzlib) library written and (c) 2014-2018 Paul Sokolovsky, licensed under the ZLib license (https://www.zlib.net/zlib_license.html). + ### Other useful links ### [Toolchain repo](https://github.com/earlephilhower/esp-quick-toolchain)