Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:16

0001 #include "rtl-unwind-arm.h"
0002 
0003 bool
0004 rtems_rtl_elf_unwind_parse (const rtems_rtl_obj* obj,
0005                             const char*          name,
0006                             uint32_t             flags)
0007 {
0008   /*
0009    * We location the EH sections in section flags.
0010    */
0011   return false;
0012 }
0013 
0014 bool
0015 rtems_rtl_elf_unwind_register (rtems_rtl_obj* obj)
0016 {
0017   return true;
0018 }
0019 
0020 bool
0021 rtems_rtl_elf_unwind_deregister (rtems_rtl_obj* obj)
0022 {
0023   obj->loader = NULL;
0024   return true;
0025 }
0026 
0027 /*
0028  * A weak reference is in libgcc, provide a real version and provide a way to
0029  * manage loaded modules.
0030  *
0031  * Passed in the return address and a reference to the number of records
0032  * found. We set the start of the exidx data and the number of records.
0033  */
0034 _Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
0035                                      int*        nrec) __attribute__ ((__noinline__,
0036                                                                        __used__,
0037                                                                        __noclone__));
0038 
0039 _Unwind_Ptr __gnu_Unwind_Find_exidx (_Unwind_Ptr return_address,
0040                                      int*        nrec)
0041 {
0042   rtems_rtl_data*   rtl;
0043   rtems_chain_node* node;
0044   __EIT_entry*      exidx_start = &__exidx_start;
0045   __EIT_entry*      exidx_end = &__exidx_end;
0046 
0047   rtl = rtems_rtl_lock ();
0048 
0049   node = rtems_chain_first (&rtl->objects);
0050   while (!rtems_chain_is_tail (&rtl->objects, node)) {
0051     rtems_rtl_obj* obj = (rtems_rtl_obj*) node;
0052     if (rtems_rtl_obj_text_inside (obj, (void*) return_address)) {
0053       exidx_start = (__EIT_entry*) obj->eh_base;
0054       exidx_end = (__EIT_entry*) (obj->eh_base + obj->eh_size);
0055       break;
0056     }
0057     node = rtems_chain_next (node);
0058   }
0059 
0060   rtems_rtl_unlock ();
0061 
0062   *nrec = exidx_end - exidx_start;
0063 
0064   return (_Unwind_Ptr) exidx_start;
0065 }