From 85ef57f7ed55698f1db234c4028b3bcb0cb40095 Mon Sep 17 00:00:00 2001 From: M4x1m3 Date: Sat, 26 Feb 2022 20:20:13 +0100 Subject: [PATCH] [bootloader] Added userland header, rewrote lernel header --- bootloader/Makefile | 3 +- bootloader/kernel_header.cpp | 29 ++++++++++++++++++ bootloader/{slot.h => kernel_header.h} | 12 ++++---- bootloader/main.cpp | 4 +-- bootloader/slot.cpp | 29 ------------------ bootloader/userland_header.cpp | 20 ++++++++++++ bootloader/userland_header.h | 42 ++++++++++++++++++++++++++ 7 files changed, 101 insertions(+), 38 deletions(-) create mode 100644 bootloader/kernel_header.cpp rename bootloader/{slot.h => kernel_header.h} (71%) delete mode 100644 bootloader/slot.cpp create mode 100644 bootloader/userland_header.cpp create mode 100644 bootloader/userland_header.h diff --git a/bootloader/Makefile b/bootloader/Makefile index 8a4a0b0c6..c59461600 100644 --- a/bootloader/Makefile +++ b/bootloader/Makefile @@ -1,7 +1,8 @@ bootloader_src += $(addprefix bootloader/,\ main.cpp \ - slot.cpp \ + kernel_header.cpp \ + userland_header.cpp \ interface.cpp \ jump_to_firmware.s \ trampoline.cpp \ diff --git a/bootloader/kernel_header.cpp b/bootloader/kernel_header.cpp new file mode 100644 index 000000000..9c771dd8f --- /dev/null +++ b/bootloader/kernel_header.cpp @@ -0,0 +1,29 @@ +#include + +extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void)); + +namespace Bootloader { + + +const KernelHeader* s_kernelHeaderA = reinterpret_cast(0x90000000); +const KernelHeader* s_kernelHeaderB = reinterpret_cast(0x90400000); + +const char * KernelHeader::version() const { + return m_version; +} + +const char * KernelHeader::patchLevel() const { + return m_patchLevel; +} + +const bool KernelHeader::isValid() const { + return m_header == Magic && m_footer == Magic; +} + +[[ noreturn ]] void KernelHeader::boot() const { + jump_to_firmware(m_stackPointer, m_startPointer); + for(;;); +} + + +} diff --git a/bootloader/slot.h b/bootloader/kernel_header.h similarity index 71% rename from bootloader/slot.h rename to bootloader/kernel_header.h index 4bb7de8fd..32d47347d 100644 --- a/bootloader/slot.h +++ b/bootloader/kernel_header.h @@ -1,11 +1,11 @@ -#ifndef BOOTLOADER_SLOT -#define BOOTLOADER_SLOT +#ifndef BOOTLOADER_KERNEL_HEADER_H +#define BOOTLOADER_KERNEL_HEADER_H #include namespace Bootloader { -class Slot { +class KernelHeader { public: const char * version() const; const char * patchLevel() const; @@ -13,7 +13,7 @@ public: [[ noreturn ]] void boot() const; private: - Slot(); + KernelHeader(); constexpr static uint32_t Magic = 0xDEC00DF0; const uint32_t m_unknown; const uint32_t m_signature; @@ -25,8 +25,8 @@ private: const void(*m_startPointer)(); }; -extern const Slot* s_slotA; -extern const Slot* s_slotB; +extern const KernelHeader* s_kernelHeaderA; +extern const KernelHeader* s_kernelHeaderB; } diff --git a/bootloader/main.cpp b/bootloader/main.cpp index 6f4e54237..b6d0fffb9 100644 --- a/bootloader/main.cpp +++ b/bootloader/main.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include @@ -25,5 +25,5 @@ void ion_main(int argc, const char * const argv[]) { } Ion::Device::Board::bootloaderMPU(); - Bootloader::s_slotA->boot(); + Bootloader::s_kernelHeaderA->boot(); } diff --git a/bootloader/slot.cpp b/bootloader/slot.cpp deleted file mode 100644 index 3df80ac87..000000000 --- a/bootloader/slot.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include - -extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void)); - -namespace Bootloader { - - -const Slot* s_slotA = reinterpret_cast(0x90000000); -const Slot* s_slotB = reinterpret_cast(0x90400000); - -const char * Slot::version() const { - return m_version; -} - -const char * Slot::patchLevel() const { - return m_patchLevel; -} - -const bool Slot::isValid() const { - return m_header == Magic && m_footer == Magic; -} - -[[ noreturn ]] void Slot::boot() const { - jump_to_firmware(m_stackPointer, m_startPointer); - for(;;); -} - - -} diff --git a/bootloader/userland_header.cpp b/bootloader/userland_header.cpp new file mode 100644 index 000000000..36963b589 --- /dev/null +++ b/bootloader/userland_header.cpp @@ -0,0 +1,20 @@ +#include + +namespace Bootloader { + +const UserlandHeader* s_UserlandHeaderA = reinterpret_cast(0x90010000); +const UserlandHeader* s_UserlandHeaderB = reinterpret_cast(0x90410000); + +const char * UserlandHeader::version() const { + return m_expectedEpsilonVersion; +} + +const bool UserlandHeader::isValid() const { + return m_header == Magic && m_footer == Magic; +} + +const bool UserlandHeader::isOmega() const { + return m_ohm_header == OmegaMagic && m_ohm_footer == OmegaMagic; +} + +} diff --git a/bootloader/userland_header.h b/bootloader/userland_header.h new file mode 100644 index 000000000..6dc1a6c02 --- /dev/null +++ b/bootloader/userland_header.h @@ -0,0 +1,42 @@ +#ifndef BOOTLOADER_USERLAND_HEADER_H +#define BOOTLOADER_USERLAND_HEADER_H + +#include +#include +#include + +namespace Bootloader { + +class UserlandHeader { +public: + const char * version() const; + const bool isValid() const; + const bool isOmega() const; + +private: + UserlandHeader(); + constexpr static uint32_t Magic = 0xDEC0EDFE; + constexpr static uint32_t OmegaMagic = 0xEFBEADDE; + uint32_t m_header; + const char m_expectedEpsilonVersion[8]; + void * m_storageAddressRAM; + size_t m_storageSizeRAM; + /* We store the range addresses of external apps memory because storing the + * size is complicated due to c++11 constexpr. */ + uint32_t m_externalAppsFlashStart; + uint32_t m_externalAppsFlashEnd; + uint32_t m_externalAppsRAMStart; + uint32_t m_externalAppsRAMEnd; + uint32_t m_footer; + uint32_t m_ohm_header; + const char m_omegaVersion[16]; + const volatile char m_username[16]; + uint32_t m_ohm_footer; +}; + +extern const UserlandHeader* s_userlandHeaderA; +extern const UserlandHeader* s_userlandHeaderB; + +} + +#endif