aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0008-add-some-ARM-EABI-specific-exception-handling-infras.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0008-add-some-ARM-EABI-specific-exception-handling-infras.patch')
-rw-r--r--main/musl/0008-add-some-ARM-EABI-specific-exception-handling-infras.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/main/musl/0008-add-some-ARM-EABI-specific-exception-handling-infras.patch b/main/musl/0008-add-some-ARM-EABI-specific-exception-handling-infras.patch
new file mode 100644
index 0000000000..56b09d7cf2
--- /dev/null
+++ b/main/musl/0008-add-some-ARM-EABI-specific-exception-handling-infras.patch
@@ -0,0 +1,66 @@
+From f39afb9ffb34b747bfc1ec9d77b239c0c32a754d Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Wed, 10 Jul 2013 16:11:01 -0400
+Subject: [PATCH 8/9] add some ARM EABI-specific exception handling
+ infrastructure
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+patch by Timo Teräs
+---
+ arch/arm/src/find_exidx.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 42 insertions(+)
+ create mode 100644 arch/arm/src/find_exidx.c
+
+diff --git a/arch/arm/src/find_exidx.c b/arch/arm/src/find_exidx.c
+new file mode 100644
+index 0000000..77c4472
+--- /dev/null
++++ b/arch/arm/src/find_exidx.c
+@@ -0,0 +1,42 @@
++#define _GNU_SOURCE
++#include <link.h>
++#include <stdint.h>
++
++struct find_exidx_data {
++ uintptr_t pc, exidx_start;
++ int exidx_len;
++};
++
++static int find_exidx(struct dl_phdr_info *info, size_t size, void *ptr)
++{
++ struct find_exidx_data *data = ptr;
++ const ElfW(Phdr) *phdr = info->dlpi_phdr;
++ uintptr_t addr, exidx_start = 0;
++ int i, match = 0, exidx_len = 0;
++
++ for (i = info->dlpi_phnum; i > 0; i--, phdr++) {
++ addr = info->dlpi_addr + phdr->p_vaddr;
++ switch (phdr->p_type) {
++ case PT_LOAD:
++ match |= data->pc >= addr && data->pc < addr + phdr->p_memsz;
++ break;
++ case PT_ARM_EXIDX:
++ exidx_start = addr;
++ exidx_len = phdr->p_memsz;
++ break;
++ }
++ }
++ data->exidx_start = exidx_start;
++ data->exidx_len = exidx_len;
++ return match;
++}
++
++uintptr_t __gnu_Unwind_Find_exidx(uintptr_t pc, int *pcount)
++{
++ struct find_exidx_data data;
++ data.pc = pc;
++ if (dl_iterate_phdr(find_exidx, &data) <= 0)
++ return 0;
++ *pcount = data.exidx_len / 8;
++ return data.exidx_start;
++}
+--
+1.8.3.2
+