summaryrefslogtreecommitdiff
path: root/src/module.c
diff options
context:
space:
mode:
author[email protected] <[email protected]>2011-06-12 10:01:48 +0000
committer[email protected] <[email protected]>2011-06-12 10:01:48 +0000
commit864bd1180237c952beefda21266c3f76f288b99a (patch)
tree0d437761b4efee23c50b0a6e88e6a664fd55b2cf /src/module.c
parent8c3d1e5eaec88d77a2fe623e9d478b9542bad040 (diff)
Add reentrance check. Put kernel debug switch together.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1494 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'src/module.c')
-rw-r--r--src/module.c63
1 files changed, 42 insertions, 21 deletions
diff --git a/src/module.c b/src/module.c
index a5af06c491..f15d856e12 100644
--- a/src/module.c
+++ b/src/module.c
@@ -14,13 +14,13 @@
* 2010-10-23 yi.qiu implement module memory allocator
*/
+#include <rthw.h>
#include <rtthread.h>
#include <rtm.h>
#include "string.h"
#include "kservice.h"
-/* #define RT_MODULE_DEBUG */
#ifdef RT_USING_MODULE
#include "module.h"
@@ -137,9 +137,10 @@ static int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf3
case R_ARM_ABS32:
*where += (Elf32_Addr)sym_val;
-#ifdef RT_MODULE_DEBUG
- rt_kprintf("R_ARM_ABS32: %x -> %x\n", where, *where);
-#endif
+
+ RT_DEBUG_LOG(RT_DEBUG_MODULE,
+ ("R_ARM_ABS32: %x -> %x\n", where, *where));
+
break;
case R_ARM_PC24:
@@ -152,9 +153,9 @@ static int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf3
tmp = sym_val - (Elf32_Addr)where + (addend << 2);
tmp >>= 2;
*where = (*where & 0xff000000) | (tmp & 0x00ffffff);
-#ifdef RT_MODULE_DEBUG
- rt_kprintf("R_ARM_PC24: %x -> %x\n", where, *where);
-#endif
+
+ RT_DEBUG_LOG(RT_DEBUG_MODULE,("R_ARM_PC24: %x -> %x\n", where, *where));
+
break;
case R_ARM_V4BX:
@@ -164,15 +165,17 @@ static int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf3
case R_ARM_GLOB_DAT:
case R_ARM_JUMP_SLOT:
*where = (Elf32_Addr)sym_val;
-#ifdef RT_MODULE_DEBUG
- rt_kprintf("R_ARM_JUMP_SLOT: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val);
-#endif
+
+ RT_DEBUG_LOG(RT_DEBUG_MODULE,
+ ("R_ARM_JUMP_SLOT: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val));
+
break;
case R_ARM_RELATIVE:
*where += (Elf32_Addr)sym_val;
-#ifdef RT_MODULE_DEBUG
- rt_kprintf("R_ARM_RELATIVE: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val);
-#endif
+
+ RT_DEBUG_LOG(RT_DEBUG_MODULE,
+ ("R_ARM_RELATIVE: 0x%x -> 0x%x 0x%x\n", where, *where, sym_val));
+
break;
default:
return -1;
@@ -261,6 +264,8 @@ rt_module_t rt_module_load(const char* name, void* module_ptr)
rt_bool_t linked = RT_FALSE;
rt_uint32_t index, module_size = 0;
+ RT_DEBUG_NOT_REENT
+
rt_kprintf("rt_module_load: %s ,", name);
/* check ELF header */
@@ -348,17 +353,19 @@ rt_module_t rt_module_load(const char* name, void* module_ptr)
for (i = 0; i < nr_reloc; i ++)
{
Elf32_Sym *sym = &symtab[ELF32_R_SYM(rel->r_info)];
-#ifdef RT_MODULE_DEBUG
- rt_kprintf("relocate symbol %s shndx %d\n", strtab + sym->st_name, sym->st_shndx);
-#endif
+
+ RT_DEBUG_LOG(RT_DEBUG_MODULE,
+ ("relocate symbol %s shndx %d\n", strtab + sym->st_name, sym->st_shndx));
+
if((sym->st_shndx != SHT_NULL) || (ELF_ST_BIND(sym->st_info) == STB_LOCAL))
rt_module_arm_relocate(module, rel, (Elf32_Addr)(module->module_space + sym->st_value));
else if(!linked)
{
Elf32_Addr addr;
-#ifdef RT_MODULE_DEBUG
- rt_kprintf("unresolved relocate symbol: %s\n", strtab + sym->st_name);
-#endif
+
+ RT_DEBUG_LOG(RT_DEBUG_MODULE,
+ ("unresolved relocate symbol: %s\n", strtab + sym->st_name));
+
/* need to resolve symbol in kernel symbol table */
addr = rt_module_symbol_find((const char*)(strtab + sym->st_name));
if (addr == 0)
@@ -477,6 +484,8 @@ rt_module_t rt_module_open(const char* filename)
struct stat s;
char *buffer, *offset_ptr;;
+ RT_DEBUG_NOT_REENT
+
/* check parameters */
RT_ASSERT(filename != RT_NULL);
@@ -546,6 +555,8 @@ rt_err_t rt_module_unload(rt_module_t module)
struct rt_object* object;
struct rt_list_node *list;
+ RT_DEBUG_NOT_REENT
+
rt_kprintf("rt_module_unload: %s\n", module->parent.name);
/* check parameter */
@@ -763,6 +774,8 @@ rt_module_t rt_module_find(const char* name)
extern struct rt_object_information rt_object_container[];
+ RT_DEBUG_NOT_REENT
+
/* enter critical */
rt_enter_critical();
@@ -794,6 +807,8 @@ static struct rt_mem_head *morepage(rt_size_t nu)
struct rt_mem_head *up;
struct rt_module_page *node;
+ RT_DEBUG_NOT_REENT
+
RT_ASSERT (nu != 0);
/* allocate pages from system heap */
@@ -824,7 +839,9 @@ void *rt_module_malloc(rt_size_t size)
struct rt_mem_head *b, *n;
struct rt_mem_head **prev;
rt_size_t nunits;
-
+
+ RT_DEBUG_NOT_REENT
+
nunits = (size + sizeof(struct rt_mem_head) -1)/sizeof(struct rt_mem_head) + 1;
RT_ASSERT(size != 0);
@@ -892,7 +909,9 @@ void rt_module_free(rt_module_t module, void *addr)
{
struct rt_mem_head *b, *n;
struct rt_mem_head **prev;
-
+
+ RT_DEBUG_NOT_REENT
+
RT_ASSERT(addr);
RT_ASSERT((((rt_uint32_t)addr) & (sizeof(struct rt_mem_head) -1)) == 0);
@@ -942,6 +961,8 @@ void *rt_module_realloc(void *ptr, rt_size_t size)
struct rt_mem_head *b, *p, *prev, *tmpp;
rt_size_t nunits;
+ RT_DEBUG_NOT_REENT
+
if (!ptr) return rt_module_malloc(size);
if (size == 0)
{