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

VxWorks

开发平台:

C/C++

  1. /* usrLoadSym.c - development symbol table loader */
  2. /* Copyright 1992-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01l,24may02,wap  made previous fix conditional on INCLUDE_NET_INIT
  7. 01k,10may02,wap  Reduce task priority below tNetTask's before doing netLoad()
  8.                  (SPR #76107)
  9. 01j,29oct01,jkf  added rip's SPR 62094 & 62122 fixes, made a symlink from
  10.                  src/config/usrLoadSym.c to this version.  Changed DESC.
  11. 01i,15apr99,sn   fixed SPR 26726 (=SPR 22644):
  12.                  prevent netSymTbl from ever firing linked C++ ctors
  13. 01h,03jun98,ms   modfied for config tool
  14. 01g,19nov97,hdn  added support for TFFS.
  15. 01f,18nov96,dbt  ANSIfied function headers (SPR #7427.)
  16. 01e,01nov96,hdn  added support for PCMCIA.
  17. 01d,23jul96,hdn  added support for ATA driver.
  18. 01c,25oct94,hdn  swapped 1st and 2nd parameter of usrFdConfig().
  19. 01b,13nov93,hdn  added support for floppy and IDE drive.
  20. 01a,18sep92,jcf  written.
  21. */
  22. /*
  23. DESCRIPTION
  24. This file is used to load the development symbol table from an
  25. external source into the target runtime.  Possible sources are
  26. the network, or from a local disc (floppy, ata/ide, scsi, etc).
  27. This file is included as a component of either usrConfig.c for
  28. BSP directory builds, or from the project facility.
  29. NOMANUAL
  30. */
  31. #ifndef  __INCusrLoadSymc
  32. #define  __INCusrLoadSymc
  33. #ifdef  INCLUDE_NET_SYM_TBL
  34. /********************************************************************************
  35. * netLoadSymTbl - load system symbol table from network (or from SCSI)
  36. *
  37. * This routine creates a system symbol table and loads it across the network.
  38. * The name of the symbol table file is constructed as:
  39. *      <host>:<bootFile>.sym
  40. *
  41. * RETURNS: OK, or ERROR if symbol table was not loaded.
  42. *
  43. * NOMANUAL
  44. */
  45. STATUS netLoadSymTbl ()
  46.     {
  47.     char symTblFile [PATH_MAX + 1];   /* name of symbol table file */
  48. #ifdef INCLUDE_NET_INIT
  49.     IMPORT int netTaskPriority;
  50.     int oldTaskPriority;
  51.     taskPriorityGet (0, &oldTaskPriority);
  52. #endif /* INCLUDE_NET_INIT */
  53.     if (strncmp (sysBootParams.bootDev, "scsi", 4) == 0)
  54. sprintf (symTblFile, "%s.sym", sysBootParams.bootFile);
  55. #ifdef INCLUDE_IDE
  56.     else if (strncmp (sysBootParams.bootDev, "ide", 3) == 0)
  57. {
  58.         int drive = 0;
  59.         int type = 0;
  60. if (strlen (sysBootParams.bootDev) == 3)
  61.     return (ERROR);
  62. else
  63.     sscanf (sysBootParams.bootDev, "%*3s%*c%d%*c%d", &drive, &type);
  64. if (usrIdeConfig (drive, sysBootParams.bootFile) != OK)
  65.     return (ERROR);
  66. sprintf (symTblFile, "%s.sym", sysBootParams.bootFile);
  67. }
  68. #endif /* INCLUDE_IDE */
  69. #ifdef INCLUDE_ATA
  70.     else if (strncmp (sysBootParams.bootDev, "ata", 3) == 0)
  71.         {
  72.         int ctrl  = 0;
  73.         int drive = 0;
  74.         char tmp[BOOT_FILE_LEN];
  75.         if (strlen (sysBootParams.bootDev) == 3)
  76.             return (ERROR);
  77.         else
  78.             sscanf (sysBootParams.bootDev, "%*3s%*c%d%*c%d", &ctrl, &drive);
  79.         /*
  80.          * SPR 62094, 62122:  When dosFs2 happened, the file usrAta.c was
  81.          * modified to take into account partitioned ata drives.  Part of that
  82.          * revision was a change to the handling of the third parameter in the
  83.          * call, from a single string to a comma delimited list of partition
  84.          * names.  That change, however, was not reflected in this file.
  85.          *
  86.          * To correct, we need split off the filename from the device name
  87.          * before passing it (the device name) to usrAtaConfig.
  88.          */
  89.         devSplit(sysBootParams.bootFile, tmp);
  90.         if (usrAtaConfig (ctrl, drive, tmp) != OK)
  91.             return (ERROR);
  92.         sprintf (symTblFile, "%s.sym", sysBootParams.bootFile);
  93.         }
  94. #endif /* INCLUDE_ATA */
  95. #ifdef INCLUDE_FD
  96.     else if (strncmp (sysBootParams.bootDev, "fd", 2) == 0)
  97. {
  98.         int drive = 0;
  99.         int type = 0;
  100. if (strlen (sysBootParams.bootDev) == 2)
  101.     return (ERROR);
  102. else
  103.     sscanf (sysBootParams.bootDev, "%*2s%*c%d%*c%d", &drive, &type);
  104. if (usrFdConfig (drive, type, sysBootParams.bootFile) != OK)
  105.     return (ERROR);
  106. sprintf (symTblFile, "%s.sym", sysBootParams.bootFile);
  107. }
  108. #endif /* INCLUDE_FD */
  109. #ifdef INCLUDE_PCMCIA
  110.     else if (strncmp (sysBootParams.bootDev, "pcmcia", 6) == 0)
  111. {
  112. int sock = NONE;
  113. if (strlen (sysBootParams.bootDev) == 6)
  114.     return (ERROR);
  115. else
  116.     sscanf (sysBootParams.bootDev, "%*6s%*c%d", &sock);
  117. /* we try a block device first then an ethernet device */
  118. if (usrPcmciaConfig (sock, sysBootParams.bootFile) != OK)
  119.             sprintf (symTblFile, "%s:%s.sym", sysBootParams.hostName,
  120.      sysBootParams.bootFile);
  121. sprintf (symTblFile, "%s.sym", sysBootParams.bootFile);
  122. }
  123. #endif /* INCLUDE_PCMCIA */
  124. #ifdef INCLUDE_TFFS
  125.     else if (strncmp (sysBootParams.bootDev, "tffs", 4) == 0)
  126. {
  127.         int drive = 0;
  128.         int removable = 0;
  129. if (strlen (sysBootParams.bootDev) == 4)
  130.     return (ERROR);
  131. else
  132.     sscanf (sysBootParams.bootDev, "%*4s%*c%d%*c%d", &drive, &removable);
  133. if (usrTffsConfig (drive, removable, sysBootParams.bootFile) != OK)
  134.     return (ERROR);
  135. sprintf (symTblFile, "%s.sym", sysBootParams.bootFile);
  136. }
  137. #endif /* INCLUDE_TFFS */
  138.     else
  139.         {
  140. #ifdef INCLUDE_NET_INIT
  141.         taskPrioritySet (0, netTaskPriority + 1);
  142. #endif /* INCLUDE_NET_INIT */
  143.         sprintf (symTblFile, "%s:%s.sym", sysBootParams.hostName,
  144.          sysBootParams.bootFile);
  145.         }
  146.     printf ("Loading symbol table from %s ...", symTblFile);
  147.     if (loadSymTbl (symTblFile) == ERROR)
  148. {
  149. taskDelay (sysClkRateGet () * 3); /* wait 3 seconds */
  150. #ifdef INCLUDE_NET_INIT
  151.         taskPrioritySet (0, oldTaskPriority);
  152. #endif /* INCLUDE_NET_INIT */
  153. return (ERROR);
  154. }
  155.     printf ("donen");
  156. #ifdef INCLUDE_NET_INIT
  157.     taskPrioritySet (0, oldTaskPriority);
  158. #endif /* INCLUDE_NET_INIT */
  159.     return (OK);
  160.     }
  161. /*******************************************************************************
  162. *
  163. * loadSymTbl - load system symbol table
  164. *
  165. * This routine loads the system symbol table.
  166. *
  167. * RETURNS: OK or ERROR
  168. *
  169. * NOMANUAL
  170. */
  171. STATUS loadSymTbl 
  172.     (
  173.     char *symTblName
  174.     )
  175.     {
  176.     char *loadAddr;
  177.     int savedCplusXtorStrategy;
  178.     int symfd = open (symTblName, O_RDONLY, 0);
  179.     if (symfd == ERROR)
  180. {
  181. printf ("Error opening %s: status = 0x%xn", symTblName, errno);
  182. return (ERROR);
  183. }
  184.     /* load system symbol table */
  185.     loadAddr = 0; /* to prevent symbols from being relocated */
  186.     /* SPR 22644 - loadModuleAt will fire any C++ ctors it finds
  187.      * unless the ctors strategy is set to MANUAL. We must prevent
  188.      * this since loadSymTbl should just "load the symbol table"! */
  189.     /* save ctors strategy and temporarily set to MANUAL*/
  190.     savedCplusXtorStrategy = cplusXtorStrategy;
  191.     cplusXtorStrategy = MANUAL;
  192.     if (loadModuleAt (symfd, HIDDEN_MODULE | ((sysFlags & SYSFLG_DEBUG)
  193.       ? LOAD_ALL_SYMBOLS
  194.       : LOAD_GLOBAL_SYMBOLS),
  195.       &loadAddr, &loadAddr, &loadAddr) == NULL)
  196. {  
  197. printf ("Error loading symbol table: status = 0x%xn", errno);
  198. close (symfd);
  199. /* restore ctors strategy */  
  200. cplusXtorStrategy = savedCplusXtorStrategy;
  201. return (ERROR);
  202. }
  203.     close (symfd);
  204.     /* restore ctors strategy */  
  205.     cplusXtorStrategy = savedCplusXtorStrategy;
  206.   
  207.     return (OK);
  208.     }
  209. #ifdef PRJ_BUILD
  210. /******************************************************************************
  211. *
  212. * usrLoadSyms - load symbols
  213. */ 
  214. void usrLoadSyms (void)
  215.     {
  216.     sysSymTbl = symTblCreate (SYM_TBL_HASH_SIZE_LOG2, TRUE, memSysPartId);
  217.     netLoadSymTbl ();
  218.     }
  219. #endif /* PRJ_BUILD */
  220. #endif  /* INCLUDE_NET_SYM_TBL */
  221. #endif  /* __INCusrLoadSymc */