From 3e42d4847ac66199ed2b17be838a3668af0125d4 Mon Sep 17 00:00:00 2001 From: Laury Date: Mon, 9 May 2022 18:39:02 +0200 Subject: [PATCH 01/12] Revert "[storage] Possibility to store metadata with records (cursor in scripts)" --- apps/code/editor_controller.cpp | 8 +- apps/code/script.cpp | 15 --- apps/code/script.h | 2 - ion/include/ion/internal_storage.h | 24 +---- ion/include/ion/storage.h | 1 - ion/src/shared/internal_storage.cpp | 152 ++-------------------------- ion/src/shared/storage.cpp | 2 +- 7 files changed, 9 insertions(+), 195 deletions(-) diff --git a/apps/code/editor_controller.cpp b/apps/code/editor_controller.cpp index d286b92cf..be09c9662 100644 --- a/apps/code/editor_controller.cpp +++ b/apps/code/editor_controller.cpp @@ -65,19 +65,13 @@ void EditorController::viewWillAppear() { ViewController::viewWillAppear(); m_editorView.loadSyntaxHighlighter(); if(GlobalPreferences::sharedGlobalPreferences()->cursorSaving()) { - int offset = m_script.cursorOffset(); - if (offset != -1) { - m_editorView.setCursorLocation(m_editorView.text() + offset); - } else { - m_editorView.setCursorLocation(m_editorView.text() + strlen(m_editorView.text())); - } + m_editorView.setCursorLocation(m_editorView.text() + strlen(m_editorView.text())); } else { m_editorView.setCursorLocation(m_editorView.text() + strlen(m_editorView.text())); } } void EditorController::viewDidDisappear() { - m_script.setCursorOffset(m_editorView.cursorLocation() - m_script.content()); m_editorView.resetSelection(); m_menuController->scriptContentEditionDidFinish(); } diff --git a/apps/code/script.cpp b/apps/code/script.cpp index 3b73d54bd..4b39b3452 100644 --- a/apps/code/script.cpp +++ b/apps/code/script.cpp @@ -65,21 +65,6 @@ bool Script::nameCompliant(const char * name) { return false; } -uint16_t Script::cursorOffset() { - assert(!isNull()); - Ion::Storage::MetadataRowHeader * metadataForRecord = Ion::Storage::sharedStorage()->metadataForRecord(*this); - if (metadataForRecord != nullptr) { - assert(metadataForRecord->metadataSize == 2); - return *((uint16_t*) metadataForRecord->data()); - } - - return -1; -} -void Script::setCursorOffset(uint16_t position) { - assert(!isNull()); - Ion::Storage::sharedStorage()->setMetadataForRecord(*this, sizeof(uint16_t), &position); -} - uint8_t * StatusFromData(Script::Data d) { return const_cast(static_cast(d.buffer)); } diff --git a/apps/code/script.h b/apps/code/script.h index ffa8038bc..6f7df9cda 100644 --- a/apps/code/script.h +++ b/apps/code/script.h @@ -50,8 +50,6 @@ public: void toggleAutoimportationStatus(); const char * content() const; size_t contentSize() { return value().size - k_statusSize; } - void setCursorOffset(uint16_t position); // -1 if no metadata - uint16_t cursorOffset(); /* Fetched status */ bool fetchedFromConsole() const; diff --git a/ion/include/ion/internal_storage.h b/ion/include/ion/internal_storage.h index c85282df2..257d243ce 100644 --- a/ion/include/ion/internal_storage.h +++ b/ion/include/ion/internal_storage.h @@ -64,7 +64,6 @@ public: return m_fullNameCRC32 == 0; } const char * fullName() const; - uint32_t fullNameCRC32() const { return m_fullNameCRC32; } ErrorStatus setBaseNameWithExtension(const char * baseName, const char * extension); ErrorStatus setName(const char * fullName); Data value() const; @@ -75,19 +74,11 @@ public: uint32_t m_fullNameCRC32; }; - struct MetadataRowHeader { // In fact, it's a struct with a method to get data - public: - char * data() const { return (char *) this + sizeof(MetadataRowHeader); } - uint32_t size() const { return sizeof(MetadataRowHeader) + metadataSize; } - uint32_t fullNameCRC32; - uint32_t metadataSize; // To fullfill alignment - MetadataRowHeader * nextRow; - }; #if ION_STORAGE_LOG void log(); #endif - size_t availableSize(char ** endBufferReturn = nullptr); + size_t availableSize(); size_t putAvailableSpaceAtEndOfRecord(Record r); void getAvailableSpaceFromEndOfRecord(Record r, size_t recordAvailableSpace); uint32_t checksum(); @@ -123,11 +114,6 @@ public: // Used by Python OS module int numberOfRecords(); Record recordAtIndex(int index); - - // Metadata - MetadataRowHeader * metadataForRecord(Record r); - bool setMetadataForRecord(Record r, int size, const void * metadata); - void removeMetadataForRecord(Record r); protected: InternalStorage(); /* Getters on address in buffer */ @@ -137,13 +123,6 @@ protected: const void * valueOfRecordStarting(char * start) const; void destroyRecord(const Record record); - struct MetadataMapHeader { - char * startOfMetadataMap() { return (char *) this - metadataMapSize + sizeof(MetadataMapHeader); } - uint8_t metadataMapSize; - uint8_t numberOfRows; - MetadataRowHeader * firstRow; - }; - class RecordIterator { public: RecordIterator(char * start) : m_recordStart(start) {} @@ -196,7 +175,6 @@ private: protected: mutable Record m_lastRecordRetrieved; mutable char * m_lastRecordRetrievedPointer; - MetadataMapHeader * m_metadataMapHeader; }; /* Some apps memoize records and need to be notified when a record might have diff --git a/ion/include/ion/storage.h b/ion/include/ion/storage.h index 300e77d39..5385f4608 100644 --- a/ion/include/ion/storage.h +++ b/ion/include/ion/storage.h @@ -8,7 +8,6 @@ namespace Ion { class Storage : public InternalStorage { public: using InternalStorage::Record; - using InternalStorage::MetadataRowHeader; using InternalStorage::expExtension; using InternalStorage::funcExtension; diff --git a/ion/src/shared/internal_storage.cpp b/ion/src/shared/internal_storage.cpp index eade3a611..5fc4a90d1 100644 --- a/ion/src/shared/internal_storage.cpp +++ b/ion/src/shared/internal_storage.cpp @@ -112,138 +112,11 @@ void InternalStorage::log() { } #endif -InternalStorage::MetadataRowHeader * InternalStorage::metadataForRecord(Record r) { - MetadataRowHeader * header = m_metadataMapHeader->firstRow; - for (int i = 0; i < m_metadataMapHeader->numberOfRows; i++) { - if (header->fullNameCRC32 == r.fullNameCRC32()) { - return header; - } - header = header->nextRow; - } - - return nullptr; -} - -void InternalStorage::removeMetadataForRecord(Record r) { - if (r.isNull()) { - return; - } - - MetadataRowHeader ** rowPointer = &m_metadataMapHeader->firstRow; - MetadataRowHeader * headerToRemove = nullptr; - size_t headerToRemoveSize = 0; // We compute it now as it will be more difficult later - for (int i = 0; i < m_metadataMapHeader->numberOfRows; i++) { - if ((*rowPointer)->fullNameCRC32 == r.fullNameCRC32()) { - headerToRemove = *rowPointer; - headerToRemoveSize = headerToRemove->size(); - if ((*rowPointer)->nextRow != nullptr) { - *rowPointer = (MetadataRowHeader *) ((char *) (*rowPointer)->nextRow + headerToRemove->size()); - } else { - *rowPointer = nullptr; - } - break; - } - - rowPointer = &(*rowPointer)->nextRow; - } - - if (headerToRemove == nullptr) { - return; - } - - MetadataRowHeader * header = headerToRemove->nextRow; - if (header != nullptr) { - while (header->nextRow) { - MetadataRowHeader * nextRow = header->nextRow; - header->nextRow = (MetadataRowHeader *) ((char *) header->nextRow +headerToRemoveSize); - header = nextRow; - } - } - - char * startOfMetadataMap = m_metadataMapHeader->startOfMetadataMap(); - uint8_t sizeToMove = (char *) headerToRemove - startOfMetadataMap; - - memmove(startOfMetadataMap + headerToRemoveSize, startOfMetadataMap, sizeToMove); - m_metadataMapHeader->numberOfRows--; - m_metadataMapHeader->metadataMapSize -= headerToRemoveSize; -} - -bool InternalStorage::setMetadataForRecord(Record r, int size, const void * metadata) { - int neededSize = 0; - char * endBufferPointer = nullptr; - MetadataRowHeader * headerToUpdate = nullptr; - MetadataRowHeader ** headerToUpdatePointer = nullptr; - int headerToUpdateIndex = -1; - - // We find the metadata row header for this record - MetadataRowHeader ** headerPointer = &m_metadataMapHeader->firstRow; - for (int i = 0; i < m_metadataMapHeader->numberOfRows; i++) { - if ((*headerPointer)->fullNameCRC32 == r.fullNameCRC32()) { - neededSize = size - (*headerPointer)->metadataSize; - headerToUpdate = (*headerPointer); - headerToUpdatePointer = headerPointer; - headerToUpdateIndex = i; - if (neededSize > 0 && neededSize > availableSize(&endBufferPointer)) { - return false; - } - break; - } - - headerPointer = &((*headerPointer)->nextRow); - } - - char * startOfMetadataMap = m_metadataMapHeader->startOfMetadataMap(); // Me must compute it now because it may change - - if (headerToUpdate == nullptr) { // If we didn't find a header, we need to create one - if (size != 0) { - uint8_t newRowSize = sizeof(MetadataRowHeader) + size; - - if (endBufferPointer < m_buffer + k_storageSize - m_metadataMapHeader->metadataMapSize - newRowSize) { - m_metadataMapHeader->numberOfRows++; - m_metadataMapHeader->metadataMapSize += newRowSize; - headerToUpdate = (MetadataRowHeader *) ((char *) startOfMetadataMap - newRowSize); - headerToUpdate->fullNameCRC32 = r.fullNameCRC32(); - headerToUpdate->nextRow = nullptr; - - if (m_metadataMapHeader->numberOfRows == 0) { - m_metadataMapHeader->firstRow = headerToUpdate; - } else { - ((MetadataRowHeader *) startOfMetadataMap)->nextRow = headerToUpdate; - } - - } else { - return false; - } - } else { - return true; - } - } - - if (neededSize != 0) { // If we must move some data to make or fill empty space - m_metadataMapHeader->metadataMapSize += neededSize; - memmove(startOfMetadataMap - neededSize, startOfMetadataMap, (char *) headerToUpdate + sizeof(MetadataRowHeader) - startOfMetadataMap); - - headerToUpdate = (MetadataRowHeader *) ((char *) headerToUpdate - neededSize); - MetadataRowHeader ** headerAfterPointer = headerToUpdatePointer; // Now we update each header below the one we just updated - for (int i = headerToUpdateIndex; i < m_metadataMapHeader->numberOfRows; i++) { - (*headerAfterPointer) = (MetadataRowHeader *) ((char *) (*headerAfterPointer) - neededSize); - headerAfterPointer = &((*headerAfterPointer)->nextRow); - } - } - - headerToUpdate->metadataSize = size; - memcpy(headerToUpdate->data(), metadata, size); - - return true; -} - -size_t InternalStorage::availableSize(char ** endBufferReturn) { - char * endBufferPointer = endBuffer(); - if (endBufferReturn) { - *endBufferReturn = endBufferPointer; - } - assert(k_storageSize >= (endBufferPointer - m_buffer) + sizeof(record_size_t) + m_metadataMapHeader->metadataMapSize); - return k_storageSize-(endBufferPointer-m_buffer)-sizeof(record_size_t) - m_metadataMapHeader->metadataMapSize; +size_t InternalStorage::availableSize() { + /* TODO maybe do: availableSize(char ** endBuffer) to get the endBuffer if it + * is needed after calling availableSize */ + assert(k_storageSize >= (endBuffer() - m_buffer) + sizeof(record_size_t)); + return k_storageSize-(endBuffer()-m_buffer)-sizeof(record_size_t); } size_t InternalStorage::putAvailableSpaceAtEndOfRecord(InternalStorage::Record r) { @@ -253,7 +126,7 @@ size_t InternalStorage::putAvailableSpaceAtEndOfRecord(InternalStorage::Record r char * nextRecord = p + previousRecordSize; memmove(nextRecord + availableStorageSize, nextRecord, - (m_buffer + k_storageSize - m_metadataMapHeader->metadataMapSize - availableStorageSize) - nextRecord); + (m_buffer + k_storageSize - availableStorageSize) - nextRecord); size_t newRecordSize = previousRecordSize + availableStorageSize; overrideSizeAtPosition(p, (record_size_t)newRecordSize); return newRecordSize; @@ -475,12 +348,6 @@ InternalStorage::InternalStorage() : assert(m_magicFooter == Magic); // Set the size of the first record to 0 overrideSizeAtPosition(m_buffer, 0); - - // Set the metadata map header at the end of the buffer - m_metadataMapHeader = (MetadataMapHeader*) (m_buffer + k_storageSize - sizeof(MetadataMapHeader)); - m_metadataMapHeader->numberOfRows = 0; - m_metadataMapHeader->firstRow = nullptr; - m_metadataMapHeader->metadataMapSize = sizeof(MetadataMapHeader); } // PRIVATE @@ -514,11 +381,6 @@ InternalStorage::Record::ErrorStatus InternalStorage::setFullNameOfRecord(const notifyChangeToDelegate(record); m_lastRecordRetrieved = record; m_lastRecordRetrievedPointer = p; - // Update metadata map - MetadataRowHeader * row = metadataForRecord(record); - if (row != nullptr) { - row->fullNameCRC32 = Record(fullName).fullNameCRC32(); - } return Record::ErrorStatus::None; } return Record::ErrorStatus::RecordDoesNotExist; @@ -590,8 +452,6 @@ void InternalStorage::destroyRecord(Record record) { } char * p = pointerOfRecord(record); if (p != nullptr) { - // Erase metadata - InternalStorage::removeMetadataForRecord(record); record_size_t previousRecordSize = sizeOfRecordStarting(p); slideBuffer(p+previousRecordSize, -previousRecordSize); notifyChangeToDelegate(); diff --git a/ion/src/shared/storage.cpp b/ion/src/shared/storage.cpp index 3a90f51ad..50a8a4c70 100644 --- a/ion/src/shared/storage.cpp +++ b/ion/src/shared/storage.cpp @@ -21,7 +21,7 @@ size_t Storage::availableSize() { bufferSize += sizeOfRecordStarting(p); } } - return k_storageSize-bufferSize-sizeof(record_size_t)-InternalStorage::m_metadataMapHeader->metadataMapSize; + return k_storageSize-bufferSize-sizeof(record_size_t); } else { return InternalStorage::availableSize(); } From a01f4bcf1a9da87eff19c302541c4b5c1abd3aa5 Mon Sep 17 00:00:00 2001 From: emanuel <76693837+emsquid@users.noreply.github.com> Date: Tue, 10 May 2022 18:06:46 +0200 Subject: [PATCH 02/12] Update config.mak (#230) [build/config.mak] Set OMEGA_VERSION to 2.0.2 --- build/config.mak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/config.mak b/build/config.mak index 3b6ce62f6..a912bd170 100644 --- a/build/config.mak +++ b/build/config.mak @@ -5,7 +5,7 @@ DEBUG ?= 0 HOME_DISPLAY_EXTERNALS ?= 1 EPSILON_VERSION ?= 15.5.0 -OMEGA_VERSION ?= 2.0.0 +OMEGA_VERSION ?= 2.0.2 UPSILON_VERSION ?= 1.0.0 # OMEGA_USERNAME ?= N/A OMEGA_STATE ?= public From 833bc4a120f4531e868385057514579758bfed44 Mon Sep 17 00:00:00 2001 From: Andrej Date: Wed, 11 May 2022 20:27:12 +0200 Subject: [PATCH 03/12] [bootloader/menu] Fix typo (#231) --- bootloader/interface/src/menu.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bootloader/interface/src/menu.h b/bootloader/interface/src/menu.h index ba8bae77c..0e88ba7c6 100644 --- a/bootloader/interface/src/menu.h +++ b/bootloader/interface/src/menu.h @@ -9,10 +9,10 @@ namespace Bootloader { class Menu { public: Menu() : Menu(KDColorBlack, KDColorWhite, Messages::mainTitle) { }; - Menu(KDColor forground, KDColor background, const char * title) : Menu(forground, background, title, nullptr) {}; - Menu(KDColor forground, KDColor background, const char * title, const char * bottom) : Menu(forground, background, title, bottom, false) {}; - Menu(KDColor forground, KDColor background, const char * title, const char * bottom, bool centerY) : Menu(forground, background, title, bottom, centerY, k_columns_margin) {}; - Menu(KDColor forground, KDColor background, const char * title, const char * bottom, bool centerY, int margin) : m_columns(), m_defaultColumns(), m_slotColumns(), m_background(background), m_title(title), m_foreground(forground), m_bottom(bottom), m_centerY(centerY), m_forced_exit(false), m_margin(margin) { + Menu(KDColor foreground, KDColor background, const char * title) : Menu(foreground, background, title, nullptr) {}; + Menu(KDColor foreground, KDColor background, const char * title, const char * bottom) : Menu(foreground, background, title, bottom, false) {}; + Menu(KDColor foreground, KDColor background, const char * title, const char * bottom, bool centerY) : Menu(foreground, background, title, bottom, centerY, k_columns_margin) {}; + Menu(KDColor foreground, KDColor background, const char * title, const char * bottom, bool centerY, int margin) : m_columns(), m_defaultColumns(), m_slotColumns(), m_background(background), m_title(title), m_foreground(foreground), m_bottom(bottom), m_centerY(centerY), m_forced_exit(false), m_margin(margin) { setup(); } static const int k_columns_margin = 5; From 8e543f30c9f9c93cc37451df3399d123a5cd25df Mon Sep 17 00:00:00 2001 From: devdl11 Date: Thu, 19 May 2022 19:50:27 +0200 Subject: [PATCH 04/12] Magical Backup --- bootloader/Makefile | 1 + bootloader/boot.cpp | 2 +- bootloader/boot.h | 2 +- .../interface/menus/upsilon_recovery.cpp | 46 +++++++++++++++++ bootloader/interface/menus/upsilon_recovery.h | 15 ++++++ bootloader/interface/src/menu.h | 8 +-- bootloader/interface/static/messages.h | 9 ++++ bootloader/recovery.cpp | 12 ++++- bootloader/slots/slot.cpp | 10 ++++ bootloader/slots/slot.h | 2 + bootloader/slots/userland_header.cpp | 8 +++ bootloader/slots/userland_header.h | 5 ++ ion/src/device/bootloader/boot/rt0.cpp | 49 +++++++++++++++++++ .../device/bootloader/bootloader_common.ld | 29 ++++++++++- ion/src/device/bootloader/internal_flash.ld | 12 ++++- ion/src/device/bootloader/platform_info.cpp | 9 +++- ion/src/device/shared/boot/isr.h | 1 + ion/src/device/shared/drivers/Makefile | 1 + ion/src/device/shared/drivers/bldata.cpp | 21 ++++++++ ion/src/device/shared/drivers/bldata.h | 24 +++++++++ ion/src/shared/internal_storage.cpp | 18 +++---- ion/src/shared/storage.cpp | 2 +- 22 files changed, 265 insertions(+), 21 deletions(-) create mode 100644 bootloader/interface/menus/upsilon_recovery.cpp create mode 100644 bootloader/interface/menus/upsilon_recovery.h create mode 100644 ion/src/device/shared/drivers/bldata.cpp create mode 100644 ion/src/device/shared/drivers/bldata.h diff --git a/bootloader/Makefile b/bootloader/Makefile index 31edbf00e..24270de7a 100644 --- a/bootloader/Makefile +++ b/bootloader/Makefile @@ -37,6 +37,7 @@ bootloader_src += $(addprefix bootloader/interface/menus/, \ warning.cpp \ slot_recovery.cpp \ crash.cpp \ + upsilon_recovery.cpp \ ) bootloader_images = $(addprefix bootloader/, \ diff --git a/bootloader/boot.cpp b/bootloader/boot.cpp index 931b27afc..8aa002603 100644 --- a/bootloader/boot.cpp +++ b/bootloader/boot.cpp @@ -65,7 +65,7 @@ bool Boot::isKernelPatched(const Slot & s) { 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() { +__attribute__((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() { // a simple function Ion::Device::Flash::ClearInternalFlashErrors(); asm("bx lr"); diff --git a/bootloader/boot.h b/bootloader/boot.h index 300fb762c..c771e5678 100644 --- a/bootloader/boot.h +++ b/bootloader/boot.h @@ -47,7 +47,7 @@ public: static void bootSlot(Bootloader::Slot slot); static void bootSelectedSlot(); __attribute__ ((noreturn)) static void jumpToInternalBootloader(); - __attribute((section(".fake_isr_function"))) __attribute__((used)) static void flash_interrupt(); + __attribute__ ((section(".fake_isr_function"))) __attribute__((used)) static void flash_interrupt(); static void bootloader(); static void lockInternal(); diff --git a/bootloader/interface/menus/upsilon_recovery.cpp b/bootloader/interface/menus/upsilon_recovery.cpp new file mode 100644 index 000000000..561a83ec0 --- /dev/null +++ b/bootloader/interface/menus/upsilon_recovery.cpp @@ -0,0 +1,46 @@ +#include "upsilon_recovery.h" +#include +#include +#include +#include +#include + +extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void)); + +Bootloader::UpsilonRecoveryMenu::UpsilonRecoveryMenu() : Menu(KDColorBlack, KDColorWhite, Messages::upsilonRecoveryTitle, Messages::mainTitle) { + setup(); +} + +void Bootloader::UpsilonRecoveryMenu::setup() { + m_defaultColumns[0] = Column(Messages::upsilonRecoveryMessage1, k_small_font, 0, true); + m_defaultColumns[1] = Column(Messages::upsilonRecoveryMessage2, k_small_font, 0, true); + m_defaultColumns[2] = Column(Messages::upsilonRecoveryMessage3, k_small_font, 0, true); + m_defaultColumns[3] = Column(Messages::upsilonRecoveryMessage4, k_small_font, 0, true); + m_defaultColumns[4] = Column(Messages::upsilonRecoveryMessage5, k_small_font, 0, true); + + m_columns[0] = ColumnBinder(&m_defaultColumns[0]); + m_columns[1] = ColumnBinder(&m_defaultColumns[1]); + m_columns[2] = ColumnBinder(&m_defaultColumns[2]); + m_columns[3] = ColumnBinder(&m_defaultColumns[3]); + m_columns[4] = ColumnBinder(&m_defaultColumns[4]); +} + +void Bootloader::UpsilonRecoveryMenu::postOpen() { + // We override the open method + for (;;) { + uint64_t scan = Ion::Keyboard::scan(); + if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Back)) { + while (Ion::Keyboard::scan() == Ion::Keyboard::State(Ion::Keyboard::Key::Back)); + forceExit(); + return; + } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OnOff)) { + Ion::Power::standby(); + return; + } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OK)) { + Slot slot = Slot::Upsilon(); + Ion::Device::Board::bootloaderMPU(); + jump_to_firmware(slot.kernelHeader()->stackPointer(), slot.userlandHeader()->upsilonRecoveryBootFunction()); + for(;;); + } + } +} diff --git a/bootloader/interface/menus/upsilon_recovery.h b/bootloader/interface/menus/upsilon_recovery.h new file mode 100644 index 000000000..d911f89e8 --- /dev/null +++ b/bootloader/interface/menus/upsilon_recovery.h @@ -0,0 +1,15 @@ +#ifndef _BOOTLOADER_INTERFACE_MENUS_UPSILON_RECOVERY_H_ +#define _BOOTLOADER_INTERFACE_MENUS_UPSILON_RECOVERY_H_ + +#include + +namespace Bootloader { + class UpsilonRecoveryMenu : public Menu { + public: + UpsilonRecoveryMenu(); + void setup() override; + void postOpen() override; + }; +} + +#endif \ No newline at end of file diff --git a/bootloader/interface/src/menu.h b/bootloader/interface/src/menu.h index 0e88ba7c6..ba8bae77c 100644 --- a/bootloader/interface/src/menu.h +++ b/bootloader/interface/src/menu.h @@ -9,10 +9,10 @@ namespace Bootloader { class Menu { public: Menu() : Menu(KDColorBlack, KDColorWhite, Messages::mainTitle) { }; - Menu(KDColor foreground, KDColor background, const char * title) : Menu(foreground, background, title, nullptr) {}; - Menu(KDColor foreground, KDColor background, const char * title, const char * bottom) : Menu(foreground, background, title, bottom, false) {}; - Menu(KDColor foreground, KDColor background, const char * title, const char * bottom, bool centerY) : Menu(foreground, background, title, bottom, centerY, k_columns_margin) {}; - Menu(KDColor foreground, KDColor background, const char * title, const char * bottom, bool centerY, int margin) : m_columns(), m_defaultColumns(), m_slotColumns(), m_background(background), m_title(title), m_foreground(foreground), m_bottom(bottom), m_centerY(centerY), m_forced_exit(false), m_margin(margin) { + Menu(KDColor forground, KDColor background, const char * title) : Menu(forground, background, title, nullptr) {}; + Menu(KDColor forground, KDColor background, const char * title, const char * bottom) : Menu(forground, background, title, bottom, false) {}; + Menu(KDColor forground, KDColor background, const char * title, const char * bottom, bool centerY) : Menu(forground, background, title, bottom, centerY, k_columns_margin) {}; + Menu(KDColor forground, KDColor background, const char * title, const char * bottom, bool centerY, int margin) : m_columns(), m_defaultColumns(), m_slotColumns(), m_background(background), m_title(title), m_foreground(forground), m_bottom(bottom), m_centerY(centerY), m_forced_exit(false), m_margin(margin) { setup(); } static const int k_columns_margin = 5; diff --git a/bootloader/interface/static/messages.h b/bootloader/interface/static/messages.h index e47764ac8..98869dbae 100644 --- a/bootloader/interface/static/messages.h +++ b/bootloader/interface/static/messages.h @@ -53,6 +53,15 @@ public: constexpr static const char * recoveryMessage4 = "Press Back to continue."; constexpr static const char * recoveryMessage5 = "(you will not be able to recover your data !)"; + // Upsilon Recovery menu + constexpr static const char * upsilonRecoveryTitle = "Upsilon Recovery"; + + constexpr static const char * upsilonRecoveryMessage1 = "The bootloader has detected a crash."; + constexpr static const char * upsilonRecoveryMessage2 = "Because you also have an Upsilon slot,"; + constexpr static const char * upsilonRecoveryMessage3 = "you can recover your data by booting"; + constexpr static const char * upsilonRecoveryMessage4 = "the Upsilon slot."; + constexpr static const char * upsilonRecoveryMessage5 = "Press OK to continue, BACK to cancel"; + // Warning menu constexpr static const char * epsilonWarningTitle = "Epsilon Slot"; diff --git a/bootloader/recovery.cpp b/bootloader/recovery.cpp index 8c849f781..1e6174bb1 100644 --- a/bootloader/recovery.cpp +++ b/bootloader/recovery.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include constexpr static uint32_t MagicStorage = 0xEE0BDDBA; @@ -76,7 +78,15 @@ void Bootloader::Recovery::recoverData() { Ion::Display::pushRectUniform(KDRect(0,0,320,240), KDColorWhite); Ion::Backlight::init(); - USBData udata = USBData::Recovery((uint32_t)getSlotConcerned().getStorageAddress(), (uint32_t)getSlotConcerned().getStorageSize()); + CrashedSlot slot = getSlotConcerned(); + + if (Slot::hasUpsilon() && Slot::Upsilon().userlandHeader()->hasUpsilonExtras()) { + Ion::Device::BootloaderSharedData::sharedBootloaderData()->setRecovery((uint32_t)slot.getStorageAddress(), slot.getStorageSize()); + UpsilonRecoveryMenu reco = UpsilonRecoveryMenu(); + reco.open(); + } + + USBData udata = USBData::Recovery((uint32_t)slot.getStorageAddress(), (uint32_t)slot.getStorageSize()); SlotRecoveryMenu menu = SlotRecoveryMenu(&udata); menu.open(); diff --git a/bootloader/slots/slot.cpp b/bootloader/slots/slot.cpp index d8ce93398..34d14e3d6 100644 --- a/bootloader/slots/slot.cpp +++ b/bootloader/slots/slot.cpp @@ -2,6 +2,7 @@ #include #include #include +#include extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void)); @@ -19,6 +20,15 @@ const Slot Slot::Khi() { return Slot(0x90180000); } +const bool Slot::hasUpsilon() { + return (isFullyValid(A()) && A().userlandHeader()->isUpsilon()) || (isFullyValid(B()) && B().userlandHeader()->isUpsilon()); +} + +const Slot Slot::Upsilon() { + assert(hasUpsilon()); + return (isFullyValid(A()) && A().userlandHeader()->isUpsilon()) ? A() : B(); +} + const KernelHeader* Slot::kernelHeader() const { return m_kernelHeader; } diff --git a/bootloader/slots/slot.h b/bootloader/slots/slot.h index 8aa97b4d3..f8ed363bc 100644 --- a/bootloader/slots/slot.h +++ b/bootloader/slots/slot.h @@ -24,6 +24,8 @@ public: static const Slot A(); static const Slot B(); static const Slot Khi(); + static const bool hasUpsilon(); + static const Slot Upsilon(); static bool isFullyValid(const Slot& slot) { return slot.kernelHeader()->isValid() && slot.userlandHeader()->isValid(); diff --git a/bootloader/slots/userland_header.cpp b/bootloader/slots/userland_header.cpp index 3c8a91908..d05c55a5a 100644 --- a/bootloader/slots/userland_header.cpp +++ b/bootloader/slots/userland_header.cpp @@ -38,4 +38,12 @@ const size_t UserlandHeader::storageSize() const { return m_storageSizeRAM; } +const bool UserlandHeader::hasUpsilonExtras() const { + return m_upsilonExtraMagicFooter == UpsilonMagic; +} + +const void (*UserlandHeader::upsilonRecoveryBootFunction() const)() { + return m_recoveryAddress; +} + } diff --git a/bootloader/slots/userland_header.h b/bootloader/slots/userland_header.h index 382e409b0..abead1378 100644 --- a/bootloader/slots/userland_header.h +++ b/bootloader/slots/userland_header.h @@ -17,6 +17,9 @@ public: const char * upsilonVersion() const; const void * storageAddress() const; const size_t storageSize() const; + const bool hasUpsilonExtras() const; + const void (*upsilonRecoveryBootFunction() const)(); + private: UserlandHeader(); @@ -42,6 +45,8 @@ private: const char m_UpsilonVersion[16]; uint32_t m_osType; uint32_t m_upsilonMagicFooter; + const void (*m_recoveryAddress)(); + uint32_t m_upsilonExtraMagicFooter; }; extern const UserlandHeader* s_userlandHeaderA; diff --git a/ion/src/device/bootloader/boot/rt0.cpp b/ion/src/device/bootloader/boot/rt0.cpp index a631356bb..2e242cd8a 100644 --- a/ion/src/device/bootloader/boot/rt0.cpp +++ b/ion/src/device/bootloader/boot/rt0.cpp @@ -1,11 +1,15 @@ #include #include #include +#include +#include +#include #include #include #include #include #include +#include typedef void (*cxx_constructor)(); @@ -14,6 +18,8 @@ extern "C" { extern char _data_section_start_ram; extern char _data_section_end_ram; extern char _bss_section_start_ram; + extern char _static_storage_start; + extern char _static_storage_end; extern char _bss_section_end_ram; extern cxx_constructor _init_array_start; extern cxx_constructor _init_array_end; @@ -129,6 +135,49 @@ void __attribute__((noinline)) start() { abort(); } +void __attribute__((noinline)) __attribute__((section(".recovery_boot"))) __attribute__((used)) recovery_start() { + // Here we are in the recovery boot. + Ion::Device::Board::initFPU(); + + bool is_recoverying = Ion::Device::BootloaderSharedData::sharedBootloaderData()->storageAddress() != 0; + + if (is_recoverying) { + uint32_t address = Ion::Device::BootloaderSharedData::sharedBootloaderData()->storageAddress(); + uint32_t size = Ion::Device::BootloaderSharedData::sharedBootloaderData()->storageSize(); + + size_t storageSize = (&_static_storage_end - &_static_storage_start); + + memcpy(&_static_storage_start, (void*)address, size); + + size_t dataSectionLength = (&_data_section_end_ram - &_data_section_start_ram); + memcpy(&_data_section_start_ram, &_data_section_start_flash, dataSectionLength); + + size_t bssSectionLength = (&_bss_section_end_ram - &_static_storage_end); + memset(&_static_storage_end, 0, bssSectionLength); + } else { + size_t dataSectionLength = (&_data_section_end_ram - &_data_section_start_ram); + memcpy(&_data_section_start_ram, &_data_section_start_flash, dataSectionLength); + size_t bssSectionLength = (&_bss_section_end_ram - &_bss_section_start_ram); + memset(&_bss_section_start_ram, 0, bssSectionLength); + } + + if (&_init_array_start != &_init_array_end) { + abort(); + } + size_t isrSectionLength = (&_isr_vector_table_end_ram - &_isr_vector_table_start_ram); + memcpy(&_isr_vector_table_start_ram, &_isr_vector_table_start_flash, isrSectionLength); + + Ion::Device::Board::init(); + + if (is_recoverying) { + Ion::LED::setColor(KDColorBlue); + } + + jump_to_external_flash(); + + abort(); +} + void __attribute__((interrupt, noinline)) isr_systick() { auto t = Ion::Device::Timing::MillisElapsed; t++; diff --git a/ion/src/device/bootloader/bootloader_common.ld b/ion/src/device/bootloader/bootloader_common.ld index e8f0c9bbc..816e51bcc 100644 --- a/ion/src/device/bootloader/bootloader_common.ld +++ b/ion/src/device/bootloader/bootloader_common.ld @@ -1,3 +1,4 @@ +BOOTLOADER_SHARED_OFFSET = 0x3d0; SECTIONS { .signed_payload_prefix ORIGIN(FLASH) : { @@ -34,7 +35,14 @@ SECTIONS { _isr_vector_table_end_ram = .; } >SRAM - .exam_mode_buffer ORIGIN(FLASH) + SIZEOF(.signed_payload_prefix) + SIZEOF(.kernel_header) + SIZEOF(.isr_vector_table) : { + .bootloader_shared ORIGIN(SRAM) + BOOTLOADER_SHARED_OFFSET : AT(ORIGIN(FLASH) + SIZEOF(.signed_payload_prefix) + SIZEOF(.kernel_header) + SIZEOF(.isr_vector_table) + SIZEOF(.slot_info)) { + _bootloader_shared_start = .; + KEEP(*(.bootloader_shared)) + KEEP(*(.bootloader_shared.*)) + _bootloader_shared_end = .; + } >SRAM + + .exam_mode_buffer ORIGIN(FLASH) + SIZEOF(.signed_payload_prefix) + SIZEOF(.kernel_header) + SIZEOF(.isr_vector_table) + SIZEOF(.bootloader_shared) + SIZEOF(.slot_info) : { . = ALIGN(4K); _exam_mode_buffer_start = .; KEEP(*(.exam_mode_buffer)) @@ -49,6 +57,13 @@ SECTIONS { KEEP(*(.userland_header)); } > FLASH + .recovery_boot : { + . = ALIGN(4); + _recovery_boot_start = .; + KEEP(*(.recovery_boot)); + _recovery_boot_end = .; + } >FLASH + .text : { . = ALIGN(4); *(.text) @@ -88,6 +103,17 @@ SECTIONS { _data_section_end_ram = .; } >SRAM AT> FLASH + /* + * We set the .static_storage right after the .data section, even if it's a bss region, because we need to fix it in memory. + */ + .static_storage : { + . = ALIGN(4); + _bss_section_start_ram = .; + _static_storage_start = .; + KEEP (*(.static_storage)) + _static_storage_end = .; + } > SRAM + .bss : { /* The bss section contains data for all uninitialized variables * So like the .data section, it will go in RAM, but unlike the data section @@ -96,7 +122,6 @@ SECTIONS { * Before execution, crt0 will erase that section of memory though, so we'll * need pointers to the beginning and end of this section. */ . = ALIGN(4); - _bss_section_start_ram = .; *(.bss) *(.bss.*) /* The compiler may choose to allocate uninitialized global variables as diff --git a/ion/src/device/bootloader/internal_flash.ld b/ion/src/device/bootloader/internal_flash.ld index e441c6527..42f6dcf7c 100644 --- a/ion/src/device/bootloader/internal_flash.ld +++ b/ion/src/device/bootloader/internal_flash.ld @@ -8,6 +8,7 @@ MEMORY { STACK_SIZE = 32K; TRAMPOLINES_OFFSET = 0xE000; CUSTOM_TRAMPOLINES_OFFSET = 64K - 64; +BOOTLOADER_SHARED_OFFSET = 0x3d0; SECTIONS { .isr_vector_table ORIGIN(INTERNAL_FLASH) : { @@ -31,7 +32,16 @@ SECTIONS { KEEP(*(.header)) } >INTERNAL_FLASH - .rodata : { + .bootloader_shared ORIGIN(SRAM) + BOOTLOADER_SHARED_OFFSET : AT(ORIGIN(INTERNAL_FLASH) + SIZEOF(.isr_vector_table) + SIZEOF(.header)) { + . = ORIGIN(SRAM) + BOOTLOADER_SHARED_OFFSET; + _bootloader_shared_start = .; + KEEP(*(.bootloader_shared)) + KEEP(*(.bootloader_shared.*)) + _bootloader_shared_end = .; + } >SRAM + + .rodata ORIGIN(INTERNAL_FLASH) + SIZEOF(.isr_vector_table) + SIZEOF(.header) + SIZEOF(.bootloader_shared) : { + . = ALIGN(4); *(.rodata) *(.rodata.*) diff --git a/ion/src/device/bootloader/platform_info.cpp b/ion/src/device/bootloader/platform_info.cpp index 3b08c1860..26d48865e 100644 --- a/ion/src/device/bootloader/platform_info.cpp +++ b/ion/src/device/bootloader/platform_info.cpp @@ -17,6 +17,9 @@ #error This file expects UPSILON_VERSION to be defined #endif +extern "C" { + extern char _recovery_boot_start; +} namespace Ion { extern char staticStorageArea[]; } @@ -72,7 +75,9 @@ public: m_upsilonMagicHeader(UpsilonMagic), m_UpsilonVersion{UPSILON_VERSION}, m_osType(OSType), - m_upsilonMagicFooter(UpsilonMagic) { } + m_upsilonMagicFooter(UpsilonMagic), + m_recoveryAddress(((uint32_t)&_recovery_boot_start) + 1), + m_upsilonExtraMagicFooter(UpsilonMagic) { } const char * omegaVersion() const { assert(m_storageAddressRAM != nullptr); @@ -128,6 +133,8 @@ private: const char m_UpsilonVersion[16]; uint32_t m_osType; uint32_t m_upsilonMagicFooter; + uint32_t m_recoveryAddress; + uint32_t m_upsilonExtraMagicFooter; }; const UserlandHeader __attribute__((section(".userland_header"), used)) k_userlandHeader; diff --git a/ion/src/device/shared/boot/isr.h b/ion/src/device/shared/boot/isr.h index ca5becb13..474522699 100644 --- a/ion/src/device/shared/boot/isr.h +++ b/ion/src/device/shared/boot/isr.h @@ -8,6 +8,7 @@ extern "C" { void start(); void abort(); void isr_systick(); +void recovery_start(); #ifdef __cplusplus } diff --git a/ion/src/device/shared/drivers/Makefile b/ion/src/device/shared/drivers/Makefile index 2db043c5f..0ec24eca3 100644 --- a/ion/src/device/shared/drivers/Makefile +++ b/ion/src/device/shared/drivers/Makefile @@ -26,4 +26,5 @@ ion_device_src += $(addprefix ion/src/device/shared/drivers/, \ timing.cpp \ usb.cpp \ wakeup.cpp \ + bldata.cpp \ ) diff --git a/ion/src/device/shared/drivers/bldata.cpp b/ion/src/device/shared/drivers/bldata.cpp new file mode 100644 index 000000000..dc2ccd474 --- /dev/null +++ b/ion/src/device/shared/drivers/bldata.cpp @@ -0,0 +1,21 @@ +#include "bldata.h" +#include +#include + +namespace Ion { + uint32_t staticSharedData[sizeof(Ion::Device::BootloaderSharedData)/sizeof(uint32_t)] __attribute__((section(".bootloader_shared"))) __attribute__((used)) = {0}; + + Device::BootloaderSharedData * Device::BootloaderSharedData::sharedBootloaderData() { + static BootloaderSharedData * sharedData = new (staticSharedData) BootloaderSharedData(); + return sharedData; + } + + Device::BootloaderSharedData::BootloaderSharedData() { + if (m_header != Magic || m_footer != Magic) { + m_header = Magic; + m_storageAddress = 0; + m_storageSize = 0; + m_footer = Magic; + } + } +} diff --git a/ion/src/device/shared/drivers/bldata.h b/ion/src/device/shared/drivers/bldata.h new file mode 100644 index 000000000..58716a2f6 --- /dev/null +++ b/ion/src/device/shared/drivers/bldata.h @@ -0,0 +1,24 @@ +#include + +namespace Ion +{ +namespace Device +{ + class BootloaderSharedData { + public: + constexpr static uint32_t Magic = 0x626C6461; + static BootloaderSharedData * sharedBootloaderData(); + + BootloaderSharedData(); + + void setRecovery(uint32_t address, uint32_t size) { m_storageAddress = address; m_storageSize = size; } + uint32_t storageAddress() const { return m_storageAddress; } + uint32_t storageSize() const { return m_storageSize; } + private: + uint32_t m_header; + uint32_t m_storageAddress; + uint32_t m_storageSize; + uint32_t m_footer; + }; +} +} \ No newline at end of file diff --git a/ion/src/shared/internal_storage.cpp b/ion/src/shared/internal_storage.cpp index 5fc4a90d1..f8aac4d50 100644 --- a/ion/src/shared/internal_storage.cpp +++ b/ion/src/shared/internal_storage.cpp @@ -336,18 +336,18 @@ void InternalStorage::destroyRecordsWithExtension(const char * extension) { } } -InternalStorage::InternalStorage() : - m_magicHeader(Magic), - m_buffer(), - m_magicFooter(Magic), - m_delegate(nullptr), - m_lastRecordRetrieved(nullptr), - m_lastRecordRetrievedPointer(nullptr) -{ +InternalStorage::InternalStorage() { + m_magicHeader = Magic; + + m_magicFooter = Magic; + m_delegate = nullptr; + m_lastRecordRetrieved = nullptr; + m_lastRecordRetrievedPointer = nullptr; + assert(m_magicHeader == Magic); assert(m_magicFooter == Magic); // Set the size of the first record to 0 - overrideSizeAtPosition(m_buffer, 0); + // overrideSizeAtPosition(m_buffer, 0); } // PRIVATE diff --git a/ion/src/shared/storage.cpp b/ion/src/shared/storage.cpp index 50a8a4c70..0a77cfa39 100644 --- a/ion/src/shared/storage.cpp +++ b/ion/src/shared/storage.cpp @@ -6,7 +6,7 @@ namespace Ion { -uint32_t staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0}; +uint32_t __attribute__((section(".static_storage"))) staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0}; Storage * Storage::sharedStorage() { static Storage * storage = new (staticStorageArea) Storage(); From ab8b353c9c523a0f74ca20153f56f24ce6b4f525 Mon Sep 17 00:00:00 2001 From: Yaya-Cout Date: Wed, 18 May 2022 13:02:41 +0200 Subject: [PATCH 05/12] Change Upsilon version from 1.0.0 to 1.0.1-dev --- build/config.mak | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/config.mak b/build/config.mak index a912bd170..cf91239fe 100644 --- a/build/config.mak +++ b/build/config.mak @@ -6,9 +6,9 @@ DEBUG ?= 0 HOME_DISPLAY_EXTERNALS ?= 1 EPSILON_VERSION ?= 15.5.0 OMEGA_VERSION ?= 2.0.2 -UPSILON_VERSION ?= 1.0.0 +UPSILON_VERSION ?= 1.0.1-dev # OMEGA_USERNAME ?= N/A -OMEGA_STATE ?= public +OMEGA_STATE ?= dev EPSILON_APPS ?= calculation graph rpn code statistics probability solver atomic sequence regression reader settings external SUBMODULES_APPS = atomic rpn EPSILON_I18N ?= en fr nl pt it de es hu From 48587c15d7962b8ad0797693b95e25d7b785bb8e Mon Sep 17 00:00:00 2001 From: devdl11 Date: Thu, 19 May 2022 20:51:18 +0200 Subject: [PATCH 06/12] Review --- ion/src/shared/internal_storage.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ion/src/shared/internal_storage.cpp b/ion/src/shared/internal_storage.cpp index f8aac4d50..82373da6f 100644 --- a/ion/src/shared/internal_storage.cpp +++ b/ion/src/shared/internal_storage.cpp @@ -338,16 +338,12 @@ void InternalStorage::destroyRecordsWithExtension(const char * extension) { InternalStorage::InternalStorage() { m_magicHeader = Magic; - m_magicFooter = Magic; m_delegate = nullptr; m_lastRecordRetrieved = nullptr; m_lastRecordRetrievedPointer = nullptr; - assert(m_magicHeader == Magic); assert(m_magicFooter == Magic); - // Set the size of the first record to 0 - // overrideSizeAtPosition(m_buffer, 0); } // PRIVATE From 363ffbcaf8024c89b61cdfdc963023f4bed6d642 Mon Sep 17 00:00:00 2001 From: devdl11 Date: Fri, 20 May 2022 11:43:40 +0200 Subject: [PATCH 07/12] Removing debug led --- ion/src/device/bootloader/boot/rt0.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ion/src/device/bootloader/boot/rt0.cpp b/ion/src/device/bootloader/boot/rt0.cpp index 2e242cd8a..02dcc5a19 100644 --- a/ion/src/device/bootloader/boot/rt0.cpp +++ b/ion/src/device/bootloader/boot/rt0.cpp @@ -169,10 +169,6 @@ void __attribute__((noinline)) __attribute__((section(".recovery_boot"))) __attr Ion::Device::Board::init(); - if (is_recoverying) { - Ion::LED::setColor(KDColorBlue); - } - jump_to_external_flash(); abort(); From 1e0fa89efe3a1c29e25d7243ffd112f3b4175c12 Mon Sep 17 00:00:00 2001 From: devdl11 <54149885+devdl11@users.noreply.github.com> Date: Fri, 20 May 2022 17:59:53 +0200 Subject: [PATCH 08/12] Update bootloader/interface/menus/upsilon_recovery.cpp Co-authored-by: Yaya-Cout --- bootloader/interface/menus/upsilon_recovery.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootloader/interface/menus/upsilon_recovery.cpp b/bootloader/interface/menus/upsilon_recovery.cpp index 561a83ec0..022efdb5b 100644 --- a/bootloader/interface/menus/upsilon_recovery.cpp +++ b/bootloader/interface/menus/upsilon_recovery.cpp @@ -34,7 +34,7 @@ void Bootloader::UpsilonRecoveryMenu::postOpen() { forceExit(); return; } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OnOff)) { - Ion::Power::standby(); + Ion::Power::suspend(); return; } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OK)) { Slot slot = Slot::Upsilon(); From cbec2e5883f664229fd120836c4740143c22a3f6 Mon Sep 17 00:00:00 2001 From: devdl11 <54149885+devdl11@users.noreply.github.com> Date: Fri, 20 May 2022 18:00:00 +0200 Subject: [PATCH 09/12] Update bootloader/interface/menus/upsilon_recovery.h Co-authored-by: Yaya-Cout --- bootloader/interface/menus/upsilon_recovery.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootloader/interface/menus/upsilon_recovery.h b/bootloader/interface/menus/upsilon_recovery.h index d911f89e8..90793b6c7 100644 --- a/bootloader/interface/menus/upsilon_recovery.h +++ b/bootloader/interface/menus/upsilon_recovery.h @@ -12,4 +12,4 @@ namespace Bootloader { }; } -#endif \ No newline at end of file +#endif From 8996f960dcf03271c5c0dbd3e3ef8adbf6157b87 Mon Sep 17 00:00:00 2001 From: devdl11 Date: Wed, 25 May 2022 09:53:00 +0200 Subject: [PATCH 10/12] Add specific header and extra version --- bootloader/slots/userland_header.cpp | 6 +++++- bootloader/slots/userland_header.h | 4 ++++ ion/src/device/bootloader/platform_info.cpp | 7 ++++++- ion/src/device/shared/drivers/bldata.h | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/bootloader/slots/userland_header.cpp b/bootloader/slots/userland_header.cpp index d05c55a5a..aa3f0ae42 100644 --- a/bootloader/slots/userland_header.cpp +++ b/bootloader/slots/userland_header.cpp @@ -39,7 +39,11 @@ const size_t UserlandHeader::storageSize() const { } const bool UserlandHeader::hasUpsilonExtras() const { - return m_upsilonExtraMagicFooter == UpsilonMagic; + return m_upsilonExtraMagicHeader == UpsilonExtraMagic && m_upsilonExtraMagicFooter == UpsilonExtraMagic; +} + +const uint16_t UserlandHeader::getExtraVersion() const { + return m_extraVersion; } const void (*UserlandHeader::upsilonRecoveryBootFunction() const)() { diff --git a/bootloader/slots/userland_header.h b/bootloader/slots/userland_header.h index abead1378..7b0591555 100644 --- a/bootloader/slots/userland_header.h +++ b/bootloader/slots/userland_header.h @@ -19,6 +19,7 @@ public: const size_t storageSize() const; const bool hasUpsilonExtras() const; const void (*upsilonRecoveryBootFunction() const)(); + const uint16_t getExtraVersion() const; private: @@ -26,6 +27,7 @@ private: constexpr static uint32_t Magic = 0xDEC0EDFE; constexpr static uint32_t OmegaMagic = 0xEFBEADDE; constexpr static uint32_t UpsilonMagic = 0x55707369; + constexpr static uint32_t UpsilonExtraMagic = 0xaa7073ff; uint32_t m_header; const char m_expectedEpsilonVersion[8]; void * m_storageAddressRAM; @@ -45,7 +47,9 @@ private: const char m_UpsilonVersion[16]; uint32_t m_osType; uint32_t m_upsilonMagicFooter; + uint32_t m_upsilonExtraMagicHeader; const void (*m_recoveryAddress)(); + uint16_t m_extraVersion; uint32_t m_upsilonExtraMagicFooter; }; diff --git a/ion/src/device/bootloader/platform_info.cpp b/ion/src/device/bootloader/platform_info.cpp index 26d48865e..8d174399b 100644 --- a/ion/src/device/bootloader/platform_info.cpp +++ b/ion/src/device/bootloader/platform_info.cpp @@ -76,8 +76,10 @@ public: m_UpsilonVersion{UPSILON_VERSION}, m_osType(OSType), m_upsilonMagicFooter(UpsilonMagic), + m_upsilonExtraMagicHeader(UpsilonExtraMagic), m_recoveryAddress(((uint32_t)&_recovery_boot_start) + 1), - m_upsilonExtraMagicFooter(UpsilonMagic) { } + m_extraVersion(1), + m_upsilonExtraMagicFooter(UpsilonExtraMagic) { } const char * omegaVersion() const { assert(m_storageAddressRAM != nullptr); @@ -114,6 +116,7 @@ private: constexpr static uint32_t OmegaMagic = 0xEFBEADDE; constexpr static uint32_t UpsilonMagic = 0x55707369; constexpr static uint32_t OSType = 0x79827178; + constexpr static uint32_t UpsilonExtraMagic = 0xaa7073ff; uint32_t m_header; const char m_expectedEpsilonVersion[8]; void * m_storageAddressRAM; @@ -133,7 +136,9 @@ private: const char m_UpsilonVersion[16]; uint32_t m_osType; uint32_t m_upsilonMagicFooter; + uint32_t m_upsilonExtraMagicHeader; uint32_t m_recoveryAddress; + uint16_t m_extraVersion; uint32_t m_upsilonExtraMagicFooter; }; diff --git a/ion/src/device/shared/drivers/bldata.h b/ion/src/device/shared/drivers/bldata.h index 58716a2f6..d315a4fbe 100644 --- a/ion/src/device/shared/drivers/bldata.h +++ b/ion/src/device/shared/drivers/bldata.h @@ -21,4 +21,4 @@ namespace Device uint32_t m_footer; }; } -} \ No newline at end of file +} From 952a83400a8fb719047429fc947924d9fb788b9a Mon Sep 17 00:00:00 2001 From: devdl11 Date: Fri, 27 May 2022 10:02:59 +0200 Subject: [PATCH 11/12] ld fix possibility --- bootloader/slots/userland_header.h | 4 ++-- ion/src/device/bootloader/platform_info.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bootloader/slots/userland_header.h b/bootloader/slots/userland_header.h index 7b0591555..85fa64d3b 100644 --- a/bootloader/slots/userland_header.h +++ b/bootloader/slots/userland_header.h @@ -19,7 +19,7 @@ public: const size_t storageSize() const; const bool hasUpsilonExtras() const; const void (*upsilonRecoveryBootFunction() const)(); - const uint16_t getExtraVersion() const; + const uint32_t getExtraVersion() const; private: @@ -49,7 +49,7 @@ private: uint32_t m_upsilonMagicFooter; uint32_t m_upsilonExtraMagicHeader; const void (*m_recoveryAddress)(); - uint16_t m_extraVersion; + uint32_t m_extraVersion; uint32_t m_upsilonExtraMagicFooter; }; diff --git a/ion/src/device/bootloader/platform_info.cpp b/ion/src/device/bootloader/platform_info.cpp index 8d174399b..8396ca2d6 100644 --- a/ion/src/device/bootloader/platform_info.cpp +++ b/ion/src/device/bootloader/platform_info.cpp @@ -138,7 +138,7 @@ private: uint32_t m_upsilonMagicFooter; uint32_t m_upsilonExtraMagicHeader; uint32_t m_recoveryAddress; - uint16_t m_extraVersion; + uint32_t m_extraVersion; uint32_t m_upsilonExtraMagicFooter; }; From 71a8c20ee777bff7aa790cf0d7a3a6c9fe157031 Mon Sep 17 00:00:00 2001 From: Yaya-Cout Date: Tue, 31 May 2022 18:23:51 +0200 Subject: [PATCH 12/12] [bootloader] Fix minimum brightness when booting --- bootloader/interface/menus/upsilon_recovery.cpp | 2 ++ bootloader/slots/slot.cpp | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/bootloader/interface/menus/upsilon_recovery.cpp b/bootloader/interface/menus/upsilon_recovery.cpp index 022efdb5b..0529bd307 100644 --- a/bootloader/interface/menus/upsilon_recovery.cpp +++ b/bootloader/interface/menus/upsilon_recovery.cpp @@ -39,6 +39,8 @@ void Bootloader::UpsilonRecoveryMenu::postOpen() { } else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OK)) { Slot slot = Slot::Upsilon(); Ion::Device::Board::bootloaderMPU(); + // Deinitialize the backlight to prevent bugs when the firmware boots + Ion::Backlight::shutdown(); jump_to_firmware(slot.kernelHeader()->stackPointer(), slot.userlandHeader()->upsilonRecoveryBootFunction()); for(;;); } diff --git a/bootloader/slots/slot.cpp b/bootloader/slots/slot.cpp index 34d14e3d6..eaaf468cb 100644 --- a/bootloader/slots/slot.cpp +++ b/bootloader/slots/slot.cpp @@ -3,6 +3,7 @@ #include #include #include +#include extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void)); @@ -50,6 +51,9 @@ const UserlandHeader* Slot::userlandHeader() const { // Configure the MPU for the booted firmware Ion::Device::Board::bootloaderMPU(); + // Deinitialize the backlight to prevent bugs when the firmware boots + Ion::Backlight::shutdown(); + // Jump jump_to_firmware(kernelHeader()->stackPointer(), kernelHeader()->startPointer()); for(;;);