usrWdbCore.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:14k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* usrWdbCore.c - configuration file for the WDB agent's core facilities */
  2. /* Copyright 1997-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,01apr02,jkf  SPR#74251, using bootLib.h macros for array sizes
  7. 01k,28feb02,jhw  Modified hasWriteProtect assignment. (SPR 71816).
  8. 01j,04oct01,c_c  Added wdbToolName symbol.
  9. 01i,06jun01,pch  Fix length of copy to vxBootFile.
  10. 01h,09may01,dtr  Addition of wdbTgtHasCoprocessor.
  11. 01g,19apr01,kab  Added Altivec support
  12. 01f,16nov00,zl   added DSP support.
  13. 01e,27apr99,cym  removing wait for simulator IDE signaling
  14. 01d,22feb99,cym  increased time before notifying IDE (SPR #23942.)
  15. 01c,08jul98,ms   need semTake initialized early if WDB_TASK included
  16. 01b,18may98,dbt  integrated latest WDB stuff
  17. 01a,21jul97,ms   taken from 01y of usrWdb.c
  18. */
  19. /*
  20. DESCRIPTION
  21. This library configures the WDB agent's core facilities.
  22. Agent initialization is a separate step.
  23. */
  24. /* defines */
  25. #define NUM_MBUFS 5
  26. #define MAX_LEN BOOT_LINE_SIZE
  27. #define WDB_MAX_SERVICES        50      /* max # of agent services */
  28. #define WDB_POOL_BASE ((char *)(FREE_RAM_ADRS))
  29. #define WDB_NUM_CL_BLKS         5
  30. /* externals */
  31. extern STATUS wdbCommDevInit (WDB_COMM_IF * pCommIf, char ** ppWdbInBuf,
  32.     char ** ppWdbOutBuf);
  33. #ifdef INCLUDE_WDB_TASK
  34. static void * vxSemCreate (void);
  35. static STATUS vxSemGive (void * semId);
  36. static STATUS vxSemTake (void * semId, struct timeval * tv);
  37. #endif
  38. /* globals */
  39. uint_t wdbCommMtu;
  40. int wdbNumMemRegions = 0; /* number of extra memory regions */
  41. WDB_MEM_REGION *pWdbMemRegions = NULL; /* array of regions */
  42. VOIDFUNCPTR wdbBpSysEnterHook;
  43. VOIDFUNCPTR wdbBpSysExitHook;
  44. VOIDFUNCPTR wdbTaskRestartHook;
  45. WDB_RT_IF wdbRtIf; /* XXX - move to wdbLib.c */
  46. bool_t _wdbTgtHasFpp = FALSE;
  47. bool_t _wdbTgtHasDsp = FALSE;
  48. bool_t _wdbTgtHasAltivec = FALSE;
  49. bool_t wdbIsInitialized = FALSE;
  50. /* This two macros transform TOOL define into the string "TOOL" */
  51. #define MKSTR(MACRO) MKSTR_FIRST_PASS(MACRO)
  52. #define MKSTR_FIRST_PASS(MACRO) #MACRO
  53. /* 
  54.  * This symbol "wdbToolName" is used by the tgtsvr to retrieve the name of the
  55.  * tool used to build vxWorks run-time. DO NOT REMOVE !!!
  56.  */
  57. #ifdef TOOL
  58. const char wdbToolName[] = MKSTR(TOOL);
  59. #else /* TOOL */
  60. const char wdbToolName[] = "Unknown";
  61. #endif /* TOOL */
  62. /* locals */
  63. LOCAL BUF_POOL wdbMbufPool;
  64. LOCAL BUF_POOL wdbClBlkPool;
  65. LOCAL char vxBootFile [MAX_LEN];
  66. #ifdef INCLUDE_KERNEL
  67. LOCAL BOOL prevKernelState;
  68. #endif /* INCLUDE_KERNEL */
  69. LOCAL WDB_SVC wdbSvcArray [WDB_MAX_SERVICES];
  70. LOCAL uint_t wdbSvcArraySize = WDB_MAX_SERVICES;
  71. /* forward static declarations */
  72. LOCAL void wdbMbufInit (void);
  73. LOCAL void wdbRtIfInit (void);
  74. LOCAL STATUS wdbCommIfInit (void);
  75. #if CPU==SIMNT
  76. void winIdeNotify (void)
  77.     {
  78.     extern int simUpMutex;
  79.     extern int win_ReleaseMutex(int hMutex);
  80.     win_ReleaseMutex(simUpMutex);
  81.     }
  82. #endif
  83. /******************************************************************************
  84. *
  85. * wdbConfig - configure and initialize the WDB agent.
  86. *
  87. * This routine configures and initializes the WDB agent.
  88. *
  89. * RETURNS :
  90. * OK or ERROR if the communication link cannot be initialized.
  91. *
  92. * NOMANUAL
  93. */
  94. STATUS wdbConfig (void)
  95.     {
  96.     /* Initialize the agents interface function pointers */
  97.     wdbRtIfInit   (); /* run-time interface functions */
  98.     if (wdbCommIfInit () == ERROR) /* communication interface functions */
  99. {
  100. if (_func_printErr != NULL)
  101.     _func_printErr ("wdbConfig: error configuring WDB communication interfacen");
  102. return (ERROR);
  103. }
  104.     /* Install some required agent services */
  105.     wdbSvcLibInit (wdbSvcArray, wdbSvcArraySize);
  106.     wdbConnectLibInit (); /* required agent service */
  107.     wdbMemCoreLibInit (); /* required agent service */
  108.     wdbIsInitialized = TRUE; /* mark WDB as initialized */
  109. #if CPU==SIMNT
  110.     winIdeNotify();
  111. #endif
  112.     return (OK);
  113.     }
  114. /******************************************************************************
  115. *
  116. * wdbExternEnterHook - hook to call when external agent is entered.
  117. *
  118. * NOMANUAL
  119. */
  120. void wdbExternEnterHook (void)
  121.     {
  122. #ifdef INCLUDE_KERNEL
  123.     intCnt++; /* always fake an interrupt context */
  124.     prevKernelState = kernelState;
  125.     kernelState = TRUE; /* always run in kernel state */
  126. #endif /* INCLUDE_KERNEL */
  127. #if     (CPU_FAMILY==I80X86)
  128.     sysIntLock ();
  129. #endif  /* CPU_FAMILY==I80X86 */
  130.     if (wdbBpSysEnterHook != NULL)
  131. wdbBpSysEnterHook ();
  132.     }
  133. /******************************************************************************
  134. *
  135. * wdbExternExitHook - hook to call when the external agent resumes the system.
  136. *
  137. * NOMANUAL
  138. */
  139. void wdbExternExitHook (void)
  140.     {
  141. #ifdef INCLUDE_KERNEL
  142.     intCnt--; /* restore original intCnt value */
  143.     kernelState = prevKernelState; /* restore original kernelState value */
  144. #endif /* INCLUDE_KERNEL */
  145. #if     (CPU_FAMILY==I80X86)
  146.     intLock ();
  147.     sysIntUnlock ();
  148. #endif  /* CPU_FAMILY==I80X86 */
  149.     if (wdbBpSysExitHook != NULL)
  150. wdbBpSysExitHook ();
  151.     }
  152. /******************************************************************************
  153. *
  154. * wdbTgtHasFpp - check if the target has fpp support
  155. */ 
  156. BOOL wdbTgtHasFpp (void)
  157.     {
  158.     return ((BOOL)_wdbTgtHasFpp);
  159.     }
  160. /******************************************************************************
  161. * wdbTgtHasFppSet - call this function to force fpp support
  162. */ 
  163. void wdbTgtHasFppSet (void)
  164.     {
  165.     _wdbTgtHasFpp = TRUE;
  166.     }
  167. /******************************************************************************
  168. *
  169. * wdbTgtHasAltivec - check if the target has fpp support
  170. */ 
  171. BOOL wdbTgtHasAltivec (void)
  172.     {
  173.     return ((BOOL)_wdbTgtHasAltivec);
  174.     }
  175. /******************************************************************************
  176. * wdbTgtHasAltivecSet - call this function to force fpp support
  177. */ 
  178. void wdbTgtHasAltivecSet (void)
  179.     {
  180.     _wdbTgtHasAltivec = TRUE;
  181.     }
  182. /******************************************************************************
  183. *
  184. * wdbTgtHasDsp - check if the target has DSP support
  185. */ 
  186. BOOL wdbTgtHasDsp (void)
  187.     {
  188.     return ((BOOL)_wdbTgtHasDsp);
  189.     }
  190. /******************************************************************************
  191. * wdbTgtHasDspSet - call this function to force DSP support
  192. */ 
  193. void wdbTgtHasDspSet (void)
  194.     {
  195.     _wdbTgtHasDsp = TRUE;
  196.     }
  197. /******************************************************************************
  198. * wdbTgtHasCoprocessor - this function's result contains bit fields for each 
  199. *  co-processor. Coprocessors include floating-point,altivec(PPC) and 
  200. * dsp(SH).
  201. */ 
  202. LOCAL UINT32 wdbTgtHasCoprocessor (void)
  203.     {
  204.     UINT32 result;
  205.     result = wdbTgtHasFpp();
  206. #ifdef INCLUDE_ALTIVEC
  207.     result |= (wdbTgtHasAltivec() << WDB_CO_PROC_ALTIVEC);
  208. #endif
  209. #ifdef INCLUDE_DSP
  210.     result |= (wdbTgtHasDsp() << WDB_CO_PROC_DSP);
  211. #endif
  212.     return result;
  213.     }
  214. /******************************************************************************
  215. *
  216. * wdbRtInfoGet - get info on the VxWorks run time system.
  217. *
  218. * NOMANUAL
  219. */
  220. void wdbRtInfoGet
  221.     (
  222.     WDB_RT_INFO * pRtInfo
  223.     )
  224.     {
  225.     pRtInfo->rtType = WDB_RT_VXWORKS;
  226.     pRtInfo->rtVersion = vxWorksVersion;
  227.     pRtInfo->cpuType = CPU;
  228.     pRtInfo->hasCoprocessor = wdbTgtHasCoprocessor();
  229. #ifdef INCLUDE_PROTECT_TEXT
  230.     pRtInfo->hasWriteProtect = (vmLibInfo.pVmTextProtectRtn != NULL);
  231. #else
  232.     pRtInfo->hasWriteProtect = FALSE;
  233. #endif /* INCLUDE_PROTECT_TEXT */
  234.     pRtInfo->pageSize   = VM_PAGE_SIZE_GET();
  235.     pRtInfo->endian = _BYTE_ORDER;
  236.     pRtInfo->bspName = sysModel();
  237.     pRtInfo->bootline = vxBootFile;
  238.     pRtInfo->memBase = (TGT_ADDR_T)(LOCAL_MEM_LOCAL_ADRS);
  239.     pRtInfo->memSize = (int)sysMemTop() - (int)LOCAL_MEM_LOCAL_ADRS;
  240.     pRtInfo->numRegions = wdbNumMemRegions;
  241.     pRtInfo->memRegion = pWdbMemRegions;
  242.     pRtInfo->hostPoolBase = (TGT_ADDR_T)WDB_POOL_BASE;
  243.     pRtInfo->hostPoolSize = WDB_POOL_SIZE;
  244.     }
  245. /******************************************************************************
  246. *
  247. * vxReboot - reboot the system.
  248. *
  249. */
  250. LOCAL void vxReboot (void)
  251.     {
  252. #ifdef INCLUDE_KERNEL
  253.     reboot (0);
  254. #else /* INCLUDE_KERNEL */
  255.     (void) sysToMonitor (0);
  256. #endif /* INCLUDE_KERNEL */
  257.     }
  258. /******************************************************************************
  259. *
  260. * vxMemProtect - protect a region of memory.
  261. */
  262. LOCAL STATUS vxMemProtect
  263.     (
  264.     char * addr,
  265.     u_int  nBytes,
  266.     bool_t protect /* TRUE = protect, FALSE = unprotect */
  267.     )
  268.     {
  269.     return (VM_STATE_SET (NULL, addr, nBytes, VM_STATE_MASK_WRITABLE, 
  270.                      (protect ? VM_STATE_WRITABLE_NOT : VM_STATE_WRITABLE)));
  271.     }
  272. /******************************************************************************
  273. *
  274. * vxExcHookAdd -
  275. */
  276. LOCAL void (*vxExcHook)();
  277. LOCAL int vxExcHookWrapper (int vec, char *pESF, WDB_IU_REGS *pRegs)
  278.     {
  279.     WDB_CTX context;
  280. #ifdef INCLUDE_KERNEL
  281.     if (INT_CONTEXT() || wdbIsNowExternal() || (taskIdCurrent == 0))
  282. context.contextType = WDB_CTX_SYSTEM;
  283.     else
  284. context.contextType = WDB_CTX_TASK;
  285.     context.contextId = (int)taskIdCurrent;
  286. #else /* INCLUDE_KERNEL */
  287.     context.contextType = WDB_CTX_SYSTEM;
  288.     context.contextId   = -1;
  289. #endif /* INCLUDE_KERNEL */
  290.     (*vxExcHook)(context, vec, pESF, pRegs);
  291.     if (wdbTaskRestartHook != NULL)
  292. wdbTaskRestartHook ();
  293.     return (FALSE);
  294.     }
  295. /******************************************************************************
  296. *
  297. * vxExcHookAdd - add an excpetion hook
  298. */
  299. LOCAL void vxExcHookAdd
  300.     (
  301.     void (*hook)()
  302.     )
  303.     {
  304.     vxExcHook = hook;
  305.     _func_excBaseHook = vxExcHookWrapper;
  306.     }
  307. /******************************************************************************
  308. *
  309. * wdbRtIfInit - Initialize pointers to the VxWorks routines.
  310. */
  311. LOCAL void wdbRtIfInit ()
  312.     {
  313.     int  ix = 0;
  314.     bzero ((char *)&wdbRtIf, sizeof (WDB_RT_IF));
  315.     wdbRtIf.rtInfoGet = wdbRtInfoGet;
  316.     wdbRtIf.reboot = vxReboot;
  317.     wdbRtIf.cacheTextUpdate = (void (*)())cacheLib.textUpdateRtn;
  318.     wdbRtIf.memProtect   = vxMemProtect;
  319.     wdbRtIf.memProbe = (STATUS (*)())vxMemProbe;
  320.     wdbRtIf.excHookAdd = vxExcHookAdd;
  321. #ifdef INCLUDE_WDB_TASK
  322.     wdbRtIf.semCreate   = vxSemCreate;
  323.     wdbRtIf.semGive     = vxSemGive;
  324.     wdbRtIf.semTake     = vxSemTake;
  325. #endif
  326.     /* first check if boot line is empty (eg : no network) */
  327.     if (*sysBootLine != EOS)
  328. {
  329. for (ix = 0; ix < MAX_LEN; ix ++)
  330.     {
  331.     if (*(sysBootLine + ix) == ')')
  332. {
  333. ix++;
  334. break;
  335. }
  336.     }
  337. /* Copy the bootline following the ')' to vxBootFile */
  338. strncpy (vxBootFile, sysBootLine + ix, sizeof(vxBootFile));
  339. /* Truncate vxBootFile at the first space */
  340. for (ix = 0; ix < MAX_LEN - 1; ix ++)
  341.     {
  342.     if (*(vxBootFile + ix) == ' ')
  343. break;
  344.     }
  345. }
  346.     *(vxBootFile + ix) = '';
  347.     wdbInstallRtIf (&wdbRtIf);
  348.     }
  349. /******************************************************************************
  350. *
  351. * wdbCommIfInit - Initialize the agent's communction interface
  352. *
  353. * RETURNS : OK or error if we can't initialize the communication interface.
  354. *
  355. * NOMANUAL
  356. */
  357. LOCAL STATUS wdbCommIfInit ()
  358.     {
  359.     static WDB_XPORT wdbXport;
  360.     static WDB_COMM_IF wdbCommIf;
  361.     char * pWdbInBuf;
  362.     char * pWdbOutBuf;
  363.     wdbMbufInit ();
  364.     /* initialize the agent communication interface device */
  365.     if (wdbCommDevInit (&wdbCommIf, &pWdbInBuf, &pWdbOutBuf) == ERROR)
  366. return (ERROR);
  367.     /*
  368.      * Install the agents communication interface and RPC transport handle.
  369.      * Currently only one agent will be active at a time, so both
  370.      * agents can share the same communication interface and XPORT handle.
  371.      */
  372.     wdbRpcXportInit  (&wdbXport, &wdbCommIf, pWdbInBuf, pWdbOutBuf, wdbCommMtu);
  373.     wdbInstallCommIf (&wdbCommIf, &wdbXport);
  374.     return (OK);
  375.     }
  376. /******************************************************************************
  377. *
  378. * wdbMbufInit - initialize the agent's mbuf memory allocator.
  379. *
  380. * wdbMbufLib manages I/O buffers for the agent since the agent
  381. * can't use malloc().
  382. *
  383. * If the agent is ever hooked up to a network driver that uses standard
  384. * MGET/MFREE for mbuf managment, then the routines wdbMBufAlloc()
  385. * and wdbMBufFree() below should be changed accordingly.
  386. */ 
  387. LOCAL void wdbMbufInit (void)
  388.     {
  389.     static struct mbuf mbufs[NUM_MBUFS];
  390.     static CL_BLK      wdbClBlks [WDB_NUM_CL_BLKS];
  391.     bufPoolInit (&wdbMbufPool, (char *)mbufs, NUM_MBUFS, sizeof (struct mbuf));
  392.     bufPoolInit (&wdbClBlkPool, (char *)wdbClBlks, WDB_NUM_CL_BLKS,
  393.                  sizeof (CL_BLK));
  394.     }
  395. /******************************************************************************
  396. *
  397. * wdbMbufAlloc - allocate an mbuf
  398. *
  399. * RETURNS: a pointer to an mbuf, or NULL on error.
  400. */ 
  401. struct mbuf * wdbMbufAlloc (void)
  402.     {
  403.     struct mbuf * pMbuf;
  404.     CL_BLK_ID     pClBlk;
  405.     pMbuf = (struct mbuf *)bufAlloc (&wdbMbufPool);
  406.     if (pMbuf == NULL)
  407.         return (NULL);
  408.     pClBlk = (CL_BLK_ID) bufAlloc (&wdbClBlkPool);
  409.     if (pClBlk == NULL)
  410.         {
  411.         wdbMbufFree (pMbuf);
  412.         return (NULL);
  413.         }
  414.     pMbuf->m_next       = NULL;
  415.     pMbuf->m_nextpkt    = NULL;
  416.     pMbuf->m_flags      = 0;
  417.     pMbuf->pClBlk       = pClBlk;
  418.     return (pMbuf);
  419.     }
  420. /******************************************************************************
  421. *
  422. * wdbMbufFree - free an mbuf
  423. */ 
  424. void wdbMbufFree
  425.     (
  426.     struct mbuf * pMbuf /* mbuf chain to free */
  427.     )
  428.     {
  429.     /* if it is a cluster, see if we need to perform a callback */
  430.     if (pMbuf->m_flags & M_EXT)
  431.         {
  432.         if (--(pMbuf->m_extRefCnt) <= 0)
  433.             {
  434.             if (pMbuf->m_extFreeRtn != NULL)
  435.                 {
  436.                 (*pMbuf->m_extFreeRtn) (pMbuf->m_extArg1, pMbuf->m_extArg2, pMbuf->m_extArg3);
  437.                 }
  438.             /* free the cluster blk */
  439.             bufFree (&wdbClBlkPool, (char *) pMbuf->pClBlk);
  440.             }
  441.         }
  442. #if 1
  443.     bufFree (&wdbMbufPool, (char *)pMbuf);
  444. #endif
  445.     }