From c73b13bd416352dbfc546e2fa2e4ecbfb3e677bd Mon Sep 17 00:00:00 2001 From: devdl11 Date: Wed, 27 Apr 2022 19:24:59 +0200 Subject: [PATCH] Some code --- bootloader/boot.cpp | 32 +++++++++++-------- build/targets.device.bootloader.mak | 2 -- ion/src/device/shared/drivers/flash.cpp | 4 +++ ion/src/device/shared/drivers/flash.h | 1 + .../device/shared/drivers/internal_flash.cpp | 11 +++++++ .../device/shared/drivers/internal_flash.h | 1 + 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/bootloader/boot.cpp b/bootloader/boot.cpp index 7b108fe09..dc574c4f8 100644 --- a/bootloader/boot.cpp +++ b/bootloader/boot.cpp @@ -58,12 +58,16 @@ bool Boot::isKernelPatched(const Slot & s) { return true; } - return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == (uint32_t)&_fake_isr_function_start && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == (uint32_t)&_fake_isr_function_start; + // return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;*(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;*(uint32_t *)(origin_isr + sizeof(uint32_t) * 4) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 5) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 6) == ((uint32_t)&_fake_isr_function_start) + 1 && *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1; + return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1; } __attribute((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() { // a simple function - + Ion::Device::Flash::ClearInternalFlashErrors(); + asm("bx lr"); + asm("ldr PC, [PC, -0x18]"); + Ion::LED::setColor(KDColorBlue); } void Boot::patchKernel(const Slot & s) { @@ -71,27 +75,27 @@ void Boot::patchKernel(const Slot & s) { // we allocate a big buffer to store the first sector uint8_t data[1024*4]; memcpy(data, (void*)0x90000000, 1024*4); - uint32_t dummy_address = (uint32_t)&_fake_isr_function_start; + uint32_t dummy_address = (uint32_t)&_fake_isr_function_start + 1; uint8_t * ptr = (uint8_t *)&dummy_address; - data[origin_isr + sizeof(uint32_t) * 6] = ptr[0]; + data[origin_isr + sizeof(uint32_t) * 6] = ptr[0]; // BusFault data[origin_isr + sizeof(uint32_t) * 6 + 1] = ptr[1]; data[origin_isr + sizeof(uint32_t) * 6 + 2] = ptr[2]; data[origin_isr + sizeof(uint32_t) * 6 + 3] = ptr[3]; - data[origin_isr + sizeof(uint32_t) * 5] = ptr[0]; - data[origin_isr + sizeof(uint32_t) * 5 + 1] = ptr[1]; - data[origin_isr + sizeof(uint32_t) * 5 + 2] = ptr[2]; - data[origin_isr + sizeof(uint32_t) * 5 + 3] = ptr[3]; + // data[origin_isr + sizeof(uint32_t) * 5] = ptr[0]; // MemManage + // data[origin_isr + sizeof(uint32_t) * 5 + 1] = ptr[1]; + // data[origin_isr + sizeof(uint32_t) * 5 + 2] = ptr[2]; + // data[origin_isr + sizeof(uint32_t) * 5 + 3] = ptr[3]; - data[origin_isr + sizeof(uint32_t) * 7] = ptr[0]; + data[origin_isr + sizeof(uint32_t) * 7] = ptr[0]; // UsageFault data[origin_isr + sizeof(uint32_t) * 7 + 1] = ptr[1]; data[origin_isr + sizeof(uint32_t) * 7 + 2] = ptr[2]; data[origin_isr + sizeof(uint32_t) * 7 + 3] = ptr[3]; - data[origin_isr + sizeof(uint32_t) * 4] = ptr[0]; - data[origin_isr + sizeof(uint32_t) * 4 + 1] = ptr[1]; - data[origin_isr + sizeof(uint32_t) * 4 + 2] = ptr[2]; - data[origin_isr + sizeof(uint32_t) * 4 + 3] = ptr[3]; + // data[origin_isr + sizeof(uint32_t) * 4] = ptr[0];//hardfault + // data[origin_isr + sizeof(uint32_t) * 4 + 1] = ptr[1]; + // data[origin_isr + sizeof(uint32_t) * 4 + 2] = ptr[2]; + // data[origin_isr + sizeof(uint32_t) * 4 + 3] = ptr[3]; Ion::Device::ExternalFlash::EraseSector(0); Ion::Device::ExternalFlash::WriteMemory((uint8_t*)0x90000000, data, 1024*4); @@ -119,7 +123,7 @@ void Boot::bootSelectedSlot() { // enableFlashIntr(); config()->setBooting(true); config()->slot()->boot(); - Ion::Device::Flash::EnableInternalSessionLock(); + // Ion::Device::Flash::EnableInternalSessionLock(); } __attribute__((noreturn)) void Boot::boot() { diff --git a/build/targets.device.bootloader.mak b/build/targets.device.bootloader.mak index d5b7ec1a8..48466b778 100644 --- a/build/targets.device.bootloader.mak +++ b/build/targets.device.bootloader.mak @@ -35,7 +35,6 @@ HANDY_TARGETS += epsilon.A epsilon.B .PHONY: epsilon epsilon: $(BUILD_DIR)/epsilon.onboarding.bin - $(PYTHON) build/device/secure_ext.py $(BUILD_DIR)/epsilon.onboarding.bin .DEFAULT_GOAL := epsilon .PHONY: %_flash @@ -54,4 +53,3 @@ binpack: $(BUILD_DIR)/epsilon.onboarding.bin cp $(BUILD_DIR)/epsilon.onboarding.bin $(BUILD_DIR)/binpack cd $(BUILD_DIR) && for binary in epsilon.onboarding.bin; do shasum -a 256 -b binpack/$${binary} > binpack/$${binary}.sha256;done cd $(BUILD_DIR) && tar cvfz binpack-$(MODEL)-`git rev-parse HEAD | head -c 7`.tgz binpack/* - $(PYTHON) build/device/secure_ext.py $(BUILD_DIR)/epsilon.onboarding.bin diff --git a/ion/src/device/shared/drivers/flash.cpp b/ion/src/device/shared/drivers/flash.cpp index 2860dd593..5fff806be 100644 --- a/ion/src/device/shared/drivers/flash.cpp +++ b/ion/src/device/shared/drivers/flash.cpp @@ -70,6 +70,10 @@ void EnableInternalFlashInterrupt() { InternalFlash::EnableFlashInterrupt(); } +void ClearInternalFlashErrors() { + InternalFlash::ClearErrors(); +} + void LockSlotA() { ExternalFlash::LockSlotA(); } diff --git a/ion/src/device/shared/drivers/flash.h b/ion/src/device/shared/drivers/flash.h index 91f942a20..60714542b 100644 --- a/ion/src/device/shared/drivers/flash.h +++ b/ion/src/device/shared/drivers/flash.h @@ -20,6 +20,7 @@ void EnableInternalProtection(); void SetInternalSectorProtection(int i, bool protect); void EnableInternalSessionLock(); // Will cause BUSERR when enabled void EnableInternalFlashInterrupt(); +void ClearInternalFlashErrors(); void LockSlotA(); void LockSlotB(); diff --git a/ion/src/device/shared/drivers/internal_flash.cpp b/ion/src/device/shared/drivers/internal_flash.cpp index 91292c0af..5c5d0aaec 100644 --- a/ion/src/device/shared/drivers/internal_flash.cpp +++ b/ion/src/device/shared/drivers/internal_flash.cpp @@ -363,6 +363,17 @@ void EnableFlashInterrupt() { close(); } +void ClearErrors() { + class FLASH::SR sr(0); + // Error flags are cleared by writing 1 + sr.setERSERR(true); + sr.setPGPERR(true); + sr.setPGAERR(true); + sr.setWRPERR(true); + sr.setEOP(true); + FLASH.SR()->set(sr); +} + } } } diff --git a/ion/src/device/shared/drivers/internal_flash.h b/ion/src/device/shared/drivers/internal_flash.h index cf351a1b6..818a0a414 100644 --- a/ion/src/device/shared/drivers/internal_flash.h +++ b/ion/src/device/shared/drivers/internal_flash.h @@ -20,6 +20,7 @@ void DisableProtection(); void SetSectorProtection(int i, bool protect); void EnableSessionLock(); void EnableFlashInterrupt(); +void ClearErrors(); /* The Device is powered by a 2.8V LDO. This allows us to perform writes to the * Flash 32 bits at once. */