From 60e877d4aaedfa41d7f928e4c8cf3a514292b1af Mon Sep 17 00:00:00 2001 From: epollack Date: Wed, 23 Feb 2022 04:01:42 +0000 Subject: [PATCH 1/2] Fix #1220, Implement OS_ModuleGetInfo_Impl for RTEMS --- src/os/rtems/src/os-impl-loader.c | 45 +++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/os/rtems/src/os-impl-loader.c b/src/os/rtems/src/os-impl-loader.c index 1082fdb8d..2e7704bbe 100644 --- a/src/os/rtems/src/os-impl-loader.c +++ b/src/os/rtems/src/os-impl-loader.c @@ -35,6 +35,7 @@ #include "os-impl-loader.h" #include "os-shared-module.h" #include "os-shared-idmap.h" +#include /**************************************************************************************** GLOBAL DATA @@ -216,10 +217,44 @@ int32 OS_ModuleUnload_Impl(const OS_object_token_t *token) *-----------------------------------------------------------------*/ int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop) { - /* - ** RTEMS does not specify a way to get these values - ** Everything left at zero - */ - return (OS_SUCCESS); + rtems_rtl_obj *obj; + OS_impl_module_internal_record_t *impl; + int32 status = OS_ERROR; + + impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); + + /* Lock RTEMS runtime loader */ + if(rtems_rtl_lock() != NULL){ + + /* Get RTL object from handle */ + obj = rtems_rtl_check_handle(impl->dl_handle); + + if (obj == NULL) + { + OS_DEBUG("Error getting object information from handle\n"); + module_prop->addr.valid = false; + } + else + { + module_prop->addr.valid = true; + module_prop->addr.code_address = obj->text_base; + module_prop->addr.code_size = rtems_rtl_obj_text_size(obj); + module_prop->addr.data_address = obj->data_base; + module_prop->addr.data_size = rtems_rtl_obj_data_size(obj); + module_prop->addr.bss_address = obj->bss_base; + module_prop->addr.bss_size = rtems_rtl_obj_bss_size(obj); + + status = OS_SUCCESS; + } + + /* Unlock RTEMS runtime loader */ + rtems_rtl_unlock(); + } + else{ + OS_DEBUG("Error locking RTEMS runtime loader\n"); + module_prop->addr.valid = false; + } + + return status; } /* end OS_ModuleGetInfo_Impl */ From 7f049e5c9beb004c66070d1f6b24fe428cb3655e Mon Sep 17 00:00:00 2001 From: epollack Date: Sat, 26 Feb 2022 04:17:16 +0000 Subject: [PATCH 2/2] Fix #1220, Moved OS_DEBUG calls outside of rtems_rtl_lock and fixed formatting --- src/os/rtems/src/os-impl-loader.c | 46 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/os/rtems/src/os-impl-loader.c b/src/os/rtems/src/os-impl-loader.c index 2e7704bbe..93b864dc6 100644 --- a/src/os/rtems/src/os-impl-loader.c +++ b/src/os/rtems/src/os-impl-loader.c @@ -217,40 +217,42 @@ int32 OS_ModuleUnload_Impl(const OS_object_token_t *token) *-----------------------------------------------------------------*/ int32 OS_ModuleGetInfo_Impl(const OS_object_token_t *token, OS_module_prop_t *module_prop) { - rtems_rtl_obj *obj; - OS_impl_module_internal_record_t *impl; - int32 status = OS_ERROR; + rtems_rtl_obj * obj; + OS_impl_module_internal_record_t *impl; + int32 status = OS_ERROR; impl = OS_OBJECT_TABLE_GET(OS_impl_module_table, *token); - - /* Lock RTEMS runtime loader */ - if(rtems_rtl_lock() != NULL){ - /* Get RTL object from handle */ + /* Lock RTEMS runtime loader */ + if (rtems_rtl_lock() != NULL) + { + /* Get RTL object from handle and populate section info */ obj = rtems_rtl_check_handle(impl->dl_handle); - if (obj == NULL) - { - OS_DEBUG("Error getting object information from handle\n"); - module_prop->addr.valid = false; - } - else + if (obj != NULL) { module_prop->addr.valid = true; module_prop->addr.code_address = obj->text_base; - module_prop->addr.code_size = rtems_rtl_obj_text_size(obj); - module_prop->addr.data_address = obj->data_base; - module_prop->addr.data_size = rtems_rtl_obj_data_size(obj); - module_prop->addr.bss_address = obj->bss_base; - module_prop->addr.bss_size = rtems_rtl_obj_bss_size(obj); + module_prop->addr.code_size = rtems_rtl_obj_text_size(obj); + module_prop->addr.data_address = obj->data_base; + module_prop->addr.data_size = rtems_rtl_obj_data_size(obj); + module_prop->addr.bss_address = obj->bss_base; + module_prop->addr.bss_size = rtems_rtl_obj_bss_size(obj); - status = OS_SUCCESS; + status = OS_SUCCESS; } - /* Unlock RTEMS runtime loader */ - rtems_rtl_unlock(); + /* Unlock RTEMS runtime loader, report error if applicable */ + rtems_rtl_unlock(); + + if (obj == NULL) + { + OS_DEBUG("Error getting object information from handle\n"); + module_prop->addr.valid = false; + } } - else{ + else + { OS_DEBUG("Error locking RTEMS runtime loader\n"); module_prop->addr.valid = false; }