source: svn/newcon3bcm2_21bu/dst/dhl/src/DHL_DBG_Symbols.c @ 76

Last change on this file since 76 was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 8.8 KB
Line 
1/**
2        @file
3                DHL_SYS_Platform.c
4
5        @brief
6               
7
8        ÀÌ ¸ðµâ¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸í..
9        ex: AudioVideo decoding/capture/output implementation
10
11        Copyright 2006~2010 Digital STREAM Technology, Inc.
12        All Rights Reserved
13*/
14
15
16#include "DHL_OSAL.h"
17#include "DHL_DBG.h"
18
19#include "DHL_DBG_Priv.h"
20
21
22/*
23        ¸ðµç Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÏÁö´Â ¾ÊÀ¸¸ç, compile timeÀ» ÁÙÀ̱â À§ÇØ
24        °¢ ¸ðµâÀº ÇÊ¿äÇÑ ¸¸Å­ÀÇ Çì´õ¸¦ ¼±¾ðÇϵµ·Ï ÇÔ.
25*/
26
27
28
29/*
30        DHL µð¹ö±× ¸ðµâ À̸§ Á¤ÀÇ ·ê Âü°í:
31
32        DHL ¸ðµâµéÀº ¸ðµÎ * ·Î ½ÃÀÛ.
33        API´Â ´ë¹®ÀÚ, Platform ¹× ±âŸ´Â ¼Ò¹®ÀÚ »ç¿ë.
34
35        µðÆúÆ® ·¹º§Àº 0À¸·Î ¼³Á¤ÇÑ´Ù. (0: ¿¡·¯ ¸Þ½ÃÁö¸¸ Ãâ·Â)
36       
37       
38*/
39
40//DHL_MODULE("*MMM", 0);
41
42
43
44#if COMMENT
45____Config____(){}
46#endif
47
48#define SUPPORT_DBG_SYMBOL 1
49
50
51/*
52        ÀÌ ¸ðµâ ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â °¢Á¾ configuration Á¤ÀÇ.
53*/
54
55
56/* #define SUPPORT_FAST_SWITCHING_OPTIMIZATION 1 */
57/* #define FUNC_MONITOR_TIMER_ID TIMER_ID_FUNC_MONITOR */
58
59
60
61#if COMMENT
62____Types____(){}
63#endif
64
65/*
66        ÀÌ ¸ðµâ ³»ºÎ¿¡¼­ »ç¿ëµÇ´Â structure ¹× enumerations.
67*/
68
69
70
71#if COMMENT
72____Variables____(){}
73#endif
74
75/*
76        global·Î Àû¿ëµÇ´Â variable Á¤ÀÇ.
77        °¢ function º°·Î Ư¼öÇÑ ¿ëµµÀÇ variableÀº °¢ functionX block ¿¡¼­ Á¤ÀÇ °¡´É.
78*/
79
80
81
82
83#if COMMENT
84_____DHL_Symbol______(){}
85#endif
86
87#if SUPPORT_DBG_SYMBOL
88
89// cafrii 060630 add
90//  memory check exceptionÀ» ÀÚµ¿À¸·Î µî·ÏÇϱâ À§ÇÑ º¯¼ö
91int g_dhl_memtrace_skip_line1;
92//int g_dhl_memtrace_skip_line2;
93//int g_dhl_memtrace_skip_line3;
94//int g_dhl_memtrace_skip_line4;
95
96static DHL_SymbolTable *p_SymbolTable;
97
98static int p_nNumberOfSymbols;
99static int p_nSizeOfSymbolTable;
100
101static DHL_OS_SEMA_ID p_dhl_MutexSymTbl;
102
103
104static void p_dbg_LockSymTbl(BOOL bLock)
105{
106        if (p_dhl_MutexSymTbl == 0) {
107                p_dhl_MutexSymTbl = DHL_OS_CreateMutexSemaphore("DhlSymTbl");
108                if (p_dhl_MutexSymTbl == 0)
109                        return;
110        }
111       
112        if (bLock)
113                DHL_OS_TakeSemaphore(p_dhl_MutexSymTbl, DHL_TIMEOUT_FOREVER);
114        else
115                DHL_OS_GiveSemaphore(p_dhl_MutexSymTbl);
116}
117
118
119// todo..
120//
121// symbol tableÀ» À§ÇÑ ¸Þ¸ð¸®´Â º°µµ·Î ÇÒ´ç/°ü¸® µÇ´Âµ¥,
122// user(app/mw)¿¡¼­ º°µµ·Î symbol table µî·ÏÀ» À§ÇØ ÁغñÇÏ´Â tableÀÌ ÀÖÀ¸¹Ç·Î
123// ½ÇÁ¦·Î ÇÊ¿äÇÑ ¸Þ¸ð¸®ÀÇ µÎ¹è°¡ ¼Ò¸ðµÇ´Â ¹®Á¦°¡ ÀÖ´Ù.
124//
125// ´ë½Å ÀÌ·¸°Ô ¸Þ¸ð¸®°¡ ¼Ò¸ðµÇÁö¸¸ sortingÀ» ÇÒ ¼ö Àֱ⠶§¹®¿¡ Á» È¿À²ÀûÀÌ´Ù.
126//
127// user¿¡¼­ °Ç³×ÁØ tableÀ» ±×³É »ç¿ëÇÏ´Â ¹æ¹ýµµ °í·ÁÇØº¸ÀÚ.
128//  - Çϳª¾¿ symbol µî·ÏÀ» ÇÏ´Â °æ¿ì´Â ³»ºÎ °ü¸® tableÀ» »ç¿ë,
129//  - º¹¼ö°³ÀÇ symbolÀ» µî·ÏÀ» ÇÏ´Â °æ¿ì´Â ±×³É Àü´ÞµÈ tableÀ» »ç¿ëÇÏ´Â ¹æ¹ý °í·Á.
130//
131
132//
133// symbol µî·ÏÇÏ´Â ÇÔ¼öµé..
134//
135void dhl_dbg_register_one_symbol(char *name, void *ptr, int type)
136{
137        char *pNameDup = NULL;
138        int i, idx;
139       
140        if (name == NULL || name[0] == 0) {
141                DHL_OS_Printf("!! register func symbol: invalid argument\n");
142                return;
143        }
144
145        if (type != DHL_SYM_FN && type != DHL_SYM_V4 &&
146                type != DHL_SYM_V2 && type != DHL_SYM_V1) {
147                DHL_OS_Printf("!! invalid symbol type %d\n", type);
148                return;
149        }
150
151        if (type == DHL_SYM_FN && ((UINT32)ptr & 0x3)) {  // it is not 4-byte aligned.
152                DHL_OS_Printf("!! FN symbol '%s' address 0x%x should be 4-byte aligned.\n", name, (UINT32)ptr);
153                return;
154        }
155        else if (type == DHL_SYM_V4 && ((UINT32)ptr & 0x3)) {
156                DHL_OS_Printf("!! V4 symbol '%s' address 0x%x should be 4-byte aligned.\n", name, (UINT32)ptr);
157                return;
158        }
159        else if (type == DHL_SYM_V2 && ((UINT32)ptr & 0x1)) {
160                DHL_OS_Printf("!! V2 symbol '%s' address 0x%x should be 2-byte aligned.\n", name, (UINT32)ptr);
161                return;
162        }
163
164        p_dbg_LockSymTbl(TRUE);
165
166        //tbl = p_SymbolTable;
167       
168        // µ¿ÀÏÇÑ nameÀÌ ÀÖÀ¸¸é overwrite..
169       
170        for (i=0; i<p_nNumberOfSymbols; i++) {
171                if (p_SymbolTable[i].name == NULL)
172                        continue;
173                if (strcmp(name, p_SymbolTable[i].name) == 0) {
174                        //DHL_OS_Printf("symbol '%s' replaced 0x%08x->0x%08x\n",
175                        //      name, p_SymbolTable[i].ptr, ptr);
176                        p_SymbolTable[i].ptr = ptr;
177                        goto label_done;
178                }
179        }
180       
181        // symbol nameÀ» duplicate..   
182        pNameDup = DHL_OS_Malloc(strlen(name)+1);
183        g_dhl_memtrace_skip_line1 |= (__LINE__ - 1); // ²À ¹Ù·Î ¾Æ·¡ ¶óÀο¡ »ç¿ëÇÒ °Í..
184
185        if (pNameDup == NULL) {
186                DHL_OS_Printf("!! out of memory for new symbol name\n");
187                goto label_done;
188        }
189        strcpy(pNameDup, name);
190       
191        if (p_nNumberOfSymbols == p_nSizeOfSymbolTable)
192        {
193                // symbol table buffer is full. increase symbol table buffer memory
194                //
195                int nNewSize = p_nSizeOfSymbolTable == 0 ? 16 : p_nSizeOfSymbolTable*2;
196               
197                DHL_SymbolTable *pNewTbl = DHL_OS_Malloc(nNewSize*sizeof(DHL_SymbolTable));
198               
199                if (pNewTbl == NULL) {
200                        DHL_OS_Printf("!! out of memory for new symbol table\n");
201                        //DHL_OS_Free(&pNameDup);
202                        goto label_done;
203                }
204               
205                if (p_nSizeOfSymbolTable) {
206                        // duplicate
207                        memcpy(pNewTbl, p_SymbolTable, sizeof(DHL_SymbolTable)*p_nSizeOfSymbolTable);
208                       
209                        // free original small table..
210                        DHL_OS_Free((void **)&p_SymbolTable);
211                }
212                               
213                p_SymbolTable = pNewTbl;
214                p_nSizeOfSymbolTable = nNewSize;
215        }
216       
217       
218        // sortingÀ» ÇÒ Çʿ䰡 ÀÖ´Ù¸é ÀÌ ½ÃÁ¡¿¡¼­ ¼öÇàÇÑ´Ù.
219       
220        for (i=0; i<p_nNumberOfSymbols; i++) {
221                if (p_SymbolTable[i].name == NULL)
222                        continue;
223                if (strcmp(name, p_SymbolTable[i].name) > 0) {
224                        break;
225                }
226        }
227        idx = i;
228       
229        // idx ¹øÂ°ºÎÅÍ ¸¶Áö¸·±îÁö ÇÑÄ­¾¿ shift
230       
231        for (i=p_nNumberOfSymbols-1; i>=idx; i--)
232                p_SymbolTable[i+1] = p_SymbolTable[i];
233        memset(&p_SymbolTable[idx], 0, sizeof(DHL_SymbolTable));
234       
235        // idx ¹øÂ°ÀÇ entry¿¡ »õ·Î¿î symbol Á¤º¸¸¦ µî·ÏÇÑ´Ù.
236        //DHL_OS_Printf("register symbol '%s' to %d th entry..\n", name, idx);
237
238        p_SymbolTable[idx].name = pNameDup;
239        p_SymbolTable[idx].ptr  = ptr;
240        p_SymbolTable[idx].type = type;
241        pNameDup = NULL;
242       
243        p_nNumberOfSymbols++;
244       
245label_done:
246
247        if (pNameDup)
248                DHL_OS_Free((void **)&pNameDup);
249               
250        p_dbg_LockSymTbl(FALSE);
251
252}
253
254
255#endif /* SUPPORT_DBG_SYMBOL */
256
257#if COMMENT
258_____API______(){}
259#endif
260
261//
262// ÁöÁ¤ÇÑ ¹®ÀÚ¿­À» substringÀ¸·Î °®´Â symbol tableÀ» ¸ðµÎ Ãâ·ÂÇÑ´Ù.
263//
264void DHL_DBG_PrintSymbolTable(int showmask, char *substr)
265{
266#if SUPPORT_DBG_SYMBOL
267        int i;
268        DHL_SymbolTable *tbl;
269       
270        if (substr == NULL) substr = "";
271       
272        if (showmask == 0)  // show all..
273                showmask = DHL_SYM_FN | DHL_SYM_V1 | DHL_SYM_V2 | DHL_SYM_V4;
274               
275        p_dbg_LockSymTbl(TRUE);
276       
277        DHL_OS_Printf("Total %d Symbols registerred, tbl size %d\n",
278                p_nNumberOfSymbols, p_nSizeOfSymbolTable);
279       
280        for (i=0; i<p_nNumberOfSymbols; i++) {
281                tbl = &p_SymbolTable[i];
282                if ((showmask & tbl->type) == 0)
283                        continue;
284               
285                if (substr[0] && strstr(tbl->name, substr)==NULL)
286                        continue;
287
288                if (tbl->type == DHL_SYM_V1 ||
289                        tbl->type == DHL_SYM_V2 ||
290                        tbl->type == DHL_SYM_V4) 
291                {
292                        UINT32 value = tbl->type==DHL_SYM_V1 ? *(INT8*)tbl->ptr : 
293                                        tbl->type==DHL_SYM_V2 ? *(INT16*)tbl->ptr : *(INT32*)tbl->ptr;
294                        DHL_OS_Printf(" (%03d)  0x%08x  %s  %s = %d (0x%x)\n", 
295                                i, (UINT32)tbl->ptr, 
296                                tbl->type == DHL_SYM_V1 ? "V1" :
297                                tbl->type == DHL_SYM_V2 ? "V2" : 
298                                tbl->type == DHL_SYM_V4 ? "V4" : "??",
299                                tbl->name ? tbl->name : "(NULL)",
300                                value, value);
301                }
302                else 
303                        DHL_OS_Printf(" (%03d)  0x%08x  %s  %s \n", 
304                                i, (UINT32)tbl->ptr, 
305                                tbl->type == DHL_SYM_FN ? "FN" : "??",
306                                tbl->name ? tbl->name : "(NULL)");
307        }
308        p_dbg_LockSymTbl(FALSE);
309#endif
310}
311
312
313
314void DHL_DBG_RegisterFunctionSymbol(char *name, void *ptr)
315{
316#if SUPPORT_DBG_SYMBOL
317        dhl_dbg_register_one_symbol(name, ptr, DHL_SYM_FN);     
318#endif
319}
320void DHL_DBG_RegisterVarSymbol(char *name, void *ptr, int size)
321{
322#if SUPPORT_DBG_SYMBOL
323        dhl_dbg_register_one_symbol(name, ptr, 
324                size==1 ? DHL_SYM_V1 : size==2 ? DHL_SYM_V2 : DHL_SYM_V4);     
325#endif
326}
327
328void DHL_DBG_RegisterSymbols(DHL_SymbolTable *tbls, int n)
329{
330#if SUPPORT_DBG_SYMBOL
331        int i;
332       
333        if (tbls == NULL)
334                return;
335
336        /* cafrii 090721, null symbol name also means end of list. */
337        for (i=0; i<n && tbls[i].name; i++)
338                dhl_dbg_register_one_symbol(tbls[i].name, tbls[i].ptr, tbls[i].type);   
339#endif
340}
341
342
343//
344// À̸§À¸·Î symbol Á¤º¸¸¦ ã´Â ÇÔ¼ö. symbol pointer¿Í typeÀÌ ¸®ÅϵȴÙ.
345// ¹ß°ßµÇÁö ¾ÊÀ¸¸é ¿¡·¯ ¸®ÅÏ.
346//
347DHL_RESULT DHL_DBG_QuerySymbol(char *name, void **pptr, int *ptype)
348{
349#if SUPPORT_DBG_SYMBOL
350        DHL_RESULT err = DHL_FAIL_NOT_FOUND;
351        int i;
352       
353        // todo..
354        // °¹¼ö°¡ ¸¹À¸¸é binary search Àû¿ë..
355        p_dbg_LockSymTbl(TRUE);
356       
357        for (i=0; i<p_nNumberOfSymbols; i++) {
358                if (p_SymbolTable[i].name == NULL) 
359                        continue;
360                if (strcmp(p_SymbolTable[i].name, name) == 0) {
361                        if (pptr)
362                                *pptr = p_SymbolTable[i].ptr;
363                        if (ptype)
364                                *ptype = p_SymbolTable[i].type;
365                        err = DHL_OK;
366                        break;
367                }
368        }
369        p_dbg_LockSymTbl(FALSE);
370       
371        return err;
372#endif
373}
374
375
376
377#if COMMENT
378_____BUILD_Symbol______(){}
379#endif
380
381
382/**
383        @todo
384                symtab Á¤·Ä..
385*/
386void dhl_dbg_init_symtab(void)
387{
388}
389
390/**
391
392*/
393void dhl_dbg_print_symtab(char *substr)
394{
395}
396
397
398UINT32 dhl_dbg_find_sym_by_name(char *name)
399{
400        return 0;
401}
402
403BOOL dhl_dbg_is_text_symbol(UINT32 addr)
404{
405                return FALSE;
406}
407
408BOOL dhl_dbg_is_data_symbol(UINT32 addr)
409{
410                return FALSE;
411}
412
413
414/* end of file */
415
Note: See TracBrowser for help on using the repository browser.