| /* Support for ARM EABI unwinding on VxWorks Downloadable Kernel Modules. |
| Copyright (C) 2017-2021 Free Software Foundation, Inc. |
| |
| This file is free software; you can redistribute it and/or modify it |
| under the terms of the GNU General Public License as published by the |
| Free Software Foundation; either version 3, or (at your option) any |
| later version. |
| |
| This file is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| Under Section 7 of GPL version 3, you are granted additional |
| permissions described in the GCC Runtime Library Exception, version |
| 3.1, as published by the Free Software Foundation. |
| |
| You should have received a copy of the GNU General Public License and |
| a copy of the GCC Runtime Library Exception along with this program; |
| see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| /* The common unwinding code refers to __gnu_Unwind_Find_exidx and |
| __cxa_type_match symbols, which are not in VxWorks kernels on ARM, |
| now llvm based. |
| |
| While the common code works just fine for RTPs thanks to weak references |
| and proper positioning of __exidx_start/end from linker scripts, we need |
| symbol definitions for kernel modules. */ |
| |
| #ifndef __RTP__ |
| |
| #include <private/moduleLibP.h> |
| |
| /* __gnu_Unwind_Find_exidx. See if we can use _func_moduleExidxGet to |
| refine whatever we have in __exidx_start and __exidx_end. */ |
| |
| typedef struct |
| { |
| UINT32 fnoffset; |
| UINT32 content; |
| } __EIT_entry; |
| |
| extern __EIT_entry __exidx_start; |
| extern __EIT_entry __exidx_end; |
| |
| __EIT_entry * |
| __gnu_Unwind_Find_exidx (void *pc, int *nrec) |
| { |
| __EIT_entry *pstart = 0; |
| __EIT_entry *pend = 0; |
| |
| if (_func_moduleExidxGet != NULL) |
| _func_moduleExidxGet (pc, |
| (void *) &__exidx_start, (void *) &__exidx_end, |
| (void **) &pstart, (void **) &pend); |
| |
| if (!pstart) |
| { |
| pstart = &__exidx_start; |
| pend = &__exidx_end; |
| } |
| |
| *nrec = pend - pstart; |
| |
| return pstart; |
| } |
| |
| /* __cxa_type_match. A dummy version to be overridden by the libstdc++ one |
| when we link with it. */ |
| |
| void * __attribute__((weak)) |
| __cxa_type_match () |
| { |
| return (void *) 0; |
| } |
| |
| #endif |