From 19a0c7143a45b140199405dc692fccfd2af5a112 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 18 Oct 2021 10:01:17 +0200 Subject: [PATCH] patterns: Added ARM Cortex M vector table pattern (#23) --- README.md | 1 + patterns/arm_cm_vtor.hexpat | 54 +++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 patterns/arm_cm_vtor.hexpat diff --git a/README.md b/README.md index 5e31854..1cf7317 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Hex patterns, include patterns and magic files for the use with the ImHex Hex Ed | NACP | | `patterns/nacp.hexpat` | Nintendo Switch NACP files | | NRO | | `patterns/nro.hexpat` | Nintendo Switch NRO files | | Java Class | `application/x-java-applet` | `patterns/java_class.hexpat` | Java Class files | +| ARM VTOR | | `patterns/arm_cm_vtor.hexpat` | ARM Cortex M Vector Table Layout | ### Pattern Libraries diff --git a/patterns/arm_cm_vtor.hexpat b/patterns/arm_cm_vtor.hexpat new file mode 100644 index 0000000..523db3f --- /dev/null +++ b/patterns/arm_cm_vtor.hexpat @@ -0,0 +1,54 @@ +#pragma endian little + +#define VTOR 0x00000000 +#define EXTERNAL_INTERRUPT_COUNT 64 + +using Address = u32; + +struct Exceptions { + Address reset [[name("Reset Handler")]]; + Address nmi [[name("Non-maskable Interrupt Handler")]]; + Address hard_fault [[name("HardFault Handler")]]; + Address mem_manage [[name("Memory Protection Error Handler")]]; + Address bus_fault [[name("Bus Fault Handler")]]; + Address usage_fault [[name("UsageFault (Instruction Execution fault) Handler")]]; + Address reserved_1[4] [[hidden]]; + Address sv_call [[name("Synchronous Supervisor Call (SVC Instruction) Handler")]]; + Address debug_monitor [[name("Synchronous Debug Event Handler")]]; + Address reserved_2[1] [[hidden]]; + Address pend_sv [[name("Asynchronous Supervisor Call Handler")]]; + Address sys_tick [[name("System Timer Tick Handler")]]; +}; + +struct ExternalInterrupts { + Address external_interrupt[EXTERNAL_INTERRUPT_COUNT] [[inline]]; +}; + +struct VectorTable { + Address initial_sp [[name("Initial Stack Pointer Value")]]; + Exceptions exceptions [[inline, name("Exceptions")]]; + ExternalInterrupts external_interrupts [[name("External Interrupts")]]; +}; + +VectorTable vector_table @ VTOR; + +fn main() { + u32 table_size = sizeof(vector_table); + + u32 default_handler_address = 0x00; + + for (u32 i = 4, i < table_size, i = i + 4) { + u32 occurrences = 0; + for (u32 j = 4, j < table_size, j = j + 4) { + if (std::mem::read_unsigned(i, 4) == std::mem::read_unsigned(j, 4)) { + occurrences = occurrences + 1; + + if (occurrences > 1) + default_handler_address = std::mem::read_unsigned(i, 4); + } + } + } + + if (default_handler_address != 0x00) + std::print("Default Handler implementation at 0x{:08X}", default_handler_address); +}; \ No newline at end of file