bootConfig.c
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:169k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* bootConfig.c - system configuration module for boot ROMs */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 11q,23sep02,jmb  Skip initialization of BSS -- it's done in romInit for MBZ.
  8. 11p,18sep02,jmb  Change bootActiveString to UINT8; only 1 byte reserved for it in NVRAM
  9. 11o,17sep02,jmb  New TFFS init routine for MBZ
  10. 11n,10sep02,jmb  Start PCI bus scan from 1 for 47xx
  11. 11m,30jul02,jmb  merged in Broadcom patches from IDTRP334 and BMW BSP's
  12. 11l,27feb01,hk   update printBootLogo() copyright notice to cover 2001.
  13. 11l,07feb01,spm  added merge record for 30jan01 update from version 10z of
  14.                  tor2_0_x branch (base 10y) and fixed modification history
  15. 11k,30jan01,ijm  merged SPR# 28602 fixes: proxy ARP services are obsolete
  16. 10q,30apr99,jpd  changed copyright year from 1998 to 1999.
  17. 10p,13nov98,jpd  conditionally add sysHwInit0() call before cacheLibInit(); make
  18.  cacheEnable call depend on INCLUDE_CACHE_SUPPORT (SPR #22707).
  19. 10z,01sep99,spm  allowed proxy client and server to use any device (SPR #8993)
  20. 11j,08dec00,rae  Fixed minor #ifdef problem
  21. 11i,06dec00,rae  usrRoot can't return ERROR
  22. 11h,17nov00,spm  fixed NPT merge to allow build without END device support
  23. 11g,14nov00,rae  removed unused argument from sockLibAdd()
  24. 11f,01nov00,ham  update muxDevStopAll call in response to muxLib.c's ver 03k.
  25. 11e,17oct00,niq  Integrating T3 DHCP
  26. 11e,28feb00,gnn  merged from NPT
  27. 11d,04oct99,pul  Modification for NPT: passing the right cookie to muxDevStart
  28. 11c,29apr99,pul  Upgraded NPT phase3 code to tor2.0.0
  29. 11b,29mar99,pul  removed mmuxMCastMapAdd()
  30. 11a,26mar99,sj   added NPT support: muxLibInit; muxMaxBinds
  31. 10z,19mar99,dat  removed bp driver interface SPR 25877, fixed bug in ver 10x.
  32. 11a,19apr00,zl   fixed unitNum default to 0 in mEnet(). Updated copyright year.
  33. 10y,17mar99,spm  added support for identical unit numbers (SPR #20913)
  34. 10x,16mar99,dat  SPR 25790, fixed startup of END and BSD drivers
  35. 10w,16mar99,spm  recovered orphaned code from tor1_0_1.sens1_1 (SPR #25770)
  36. 10v,01mar99,spm  bypassed incorrect cleanup after successful TFTP file 
  37.                  transfer (SPR #24618)
  38. 10u,26feb99,dat  added FEI support (23818)
  39. 10t,19feb99,spm  fixed construction of device name for pcmcia (SPR #21676)
  40. 10s,02feb99,sgv  Added bitflag value to sockLibAdd
  41. 10r,28jan99,jmp  added TSFS_BOOT facility (SPR# 24466).
  42. 10q,20jan99,scb  usrBpInit() modified to use "sm=" before SM_ANCHOR_ADRS (23035)
  43. 10p,26jan99,jkf  removed x86 specific memAddToPool's from ataLoad,
  44.                  ideLoad, pcmciaLoad, & tffsLoad.  Replaced with
  45.                  BSP specific memAddToPool in sysHwInit2() (SPR#21338).
  46. 10o,13nov98,n_s  added call to muxDevStopAll in go. spr #23229
  47. 10n,11sep98,spm  corrected documentation for bootpGet and dhcpGet (SPR #20629)
  48. 10m,04sep98,ham  set subnetmask through ntohl() in bootpGet(),SPR#21909.
  49. 10l,03jun98,hdn  disabled system clock just before jumping to the entry point
  50.  for PentiumPro's Local APIC Timer.
  51. 10k,23apr98,yp   merged TrueFFS support
  52. 10j,01apr98,hdn  moved tffsLoad from usrTffs.c.
  53. 10i,04feb98,jpd  updated copyright date.
  54. 10h,19mar98,spm  corrected prototype for mEnet() routine (SPR #20174); changed
  55.                  parameter name to match coding standards
  56. 10g,02feb98,spm  replaced invalid logMsg calls with printf statements
  57. 10f,06jan98,hdn  added support for TFFS.
  58. 10e,30nov97,vin  added network system pool
  59. 10d,20nov97,gnn  fixed spr#7265 to deal with devices with no attach routine.
  60. 10c,27oct97,vin  fixed call to endLoadFunc(..).
  61. 10b,03oct97,gnn  removed references to endDriver global
  62. 10b,23oct97,tam  fixed compilation warnings.
  63. 10a,26sep97,gnn  added muxAddrResFuncAdd call for ipAttach
  64. 09z,26sep97,vin  used NUM_XXX_MIN macros for system pool configuration.
  65. 09y,25sep97,gnn  SENS beta feedback fixes
  66. 09x,26aug97,vin  fixed warnings in muxIoctl
  67. 09w,26aug97,spm  major overhaul of DHCP client: reorganized code and changed
  68.                  user interface to support multiple leases at runtime, improved
  69.                  handling of address information, and allowed selection of UDP
  70.                  ports; also fixed incorrect treatment of gateway field by
  71.                  BOOTP/DHCP (SPR #9137)
  72. 09v,12aug97,gnn  changes necessitated by MUX/END update.
  73. 09u,15jul97,spm  fixed byte ordering of netmask from DHCP client (SPR #8739)
  74. 09t,01jul97,jag  removed stale code for RESOLVER (SPR #8868)
  75. 09j,15aug97,cdp  add casts etc. to stop compiler warnings.
  76. 09i,05feb97,cdp  remove ARM test hook (_func_armStartup).
  77. 09h,21jan97,jpd  Added support for Olicom and lnEbsa Ethernet drivers, made
  78.                  cacheLib calls dependent upon INCLUDE_CACHE_SUPPORT being
  79.                  defined.
  80. 09g,12dec96,cdp  added _func_armStartup for ARM platforms.
  81. 09s,02jun97,spm  changed DHCP option tags to prevent name conflicts (SPR #8667)
  82. 09r,20may97,gnn  fixed SPR 8627 so that multiple gn devices are supported.
  83. 09q,19may97,spm  included rngLib.h to fix DHCP client build error (SPR #8606)
  84. 09p,30apr97,spm  moved usrNetIfConfig for "gn" device to prevent DHCP error
  85. 09o,25apr97,gnn  changed INCLUDE_GN to INCLUDE_END
  86. 09n,18apr97,spm  corrected structure element name in BOOTP interface
  87. 09m,17apr97,gnn  added support for configNet style configuration of ENDs.
  88. 09l,07apr97,spm  changed BOOTP interface to DHCP style: all options supported
  89. 09k,29jan97,spm  made global variables for DHCP client unique
  90. 09j,29jan97,spm  removed parameters from dhcpBootBind()
  91. 09i,21jan97,gnn  added the new argument to muxDevLoad().
  92. 09h,20dec96,vin  fixed warnings muxDevLoad(). added AF_ROUTE.
  93. 09g,06mar97,mas  deleted unused variable 'char gateway[INET_ADDR_LEN];' from
  94.  bootLoad() (SPR 8113).
  95. 09g,18dec96,spm  fixed bug in unit number support and restored lost DHCP code
  96. 09f,17dec96,gnn  added stuff for new etherHooks.
  97. 09e,27nov96,spm  added support for DHCP client and network device unit numbers
  98. 09d,25nov96,vin  added new cluster configuration.
  99. 09c,01oct96,spm  added bzero() call to checkInetAddrField (SPR 6326)
  100. 09b,22sep96,spm  Fixed SPR 7120: added support for gateways to BOOTP startup
  101. 09a,24jul96,vin  fetching netmask after usrNetIfConfig() mods for bsd4.4.
  102. 08z,21jun96,jmb  long modhist -- deleted entries prior to 1994.  SPR #6528
  103. 08y,19jun96,hdn  defined IDE_MEM_DOSFS to 0x200000.
  104. 08x,13jun96,hdn  added INCLUDE_ESMC for SMC91c9x Ethernet driver.
  105. 08w,05jun96,kkk  update copyright year from 1995 to 1996.
  106. 08v,05jun96,ism  bumped copyright date to 1996.
  107. 19v,19apr96,jds  changed the include of scsiLib.h to be done after config.h;
  108.                  also added setting to asynchronous mode all target devices
  109. 08u,20mar96,hdn  made inclusion of pppLib.h and strmLib.h conditional.
  110. 09t,07mar96,gnn  added SLIP_MTU to slipInit so that we could configure
  111.     the MTU.  (SPR #4652)
  112. 08s,06mar96,tpr  added #include "bootElfLib.h".
  113. 08r,06mar96,dat  removed __DATE__ from printBootLogo
  114. 08q,06mar96,tpr  Enabled the Instruction Cache for PowerPC.
  115. 08p,06dec95,vin  fixed usrStrmInit warning.
  116. 08o,29nov95,vin  added baudrate processing of boot string.
  117. 08n,06sep95,jag  deleted call to  fattachInit (), changed sadInit to 
  118.  autopushInit (), and changed iosStrmInit to strmInit (). 
  119. 08m,01aug95,dzb  changed STREAMS options to go through iosStrmInit ().
  120.  added usrStrmInit ().
  121.                  PPP initialization failure message (SPR #4505).
  122. 08l,25jul95,dzb  tweaked socket library initialization.
  123. 08k,25jul95,dzb  added socket library init for BSD vs. STREAMS.
  124. 08j,18jul95,dzb  wait for PPP interface to come up in usrPPPInit().
  125. 08i,17jul95,dzb  fixed ordering of boot params search.
  126. 08h,26jun95,dzb  removed PPP_S_USEHOSTNAME option.
  127. 08g,21jun95,dzb  Added INCLUDE_PPP_CRYPT for unbundled crypt() support.
  128. 08f,20jun95,dzb  Added PPP support.
  129. 09b,28nov95,tpr  re-ordered history following PPC merge.
  130. 09a,11oct95,dat  new BSP revision id, modified signon banner printing
  131. 08z,29jun95,caf  added nicEvb driver entry.
  132. 08y,28jun95,caf  for PPC, called cacheTextUpdate() instead of cacheClear().
  133. 08x,26jun95,kvk  Removed references to _edata and _end for a clean 
  134.  bootrom_uncmp build.
  135. 08w,06jun95,caf  fixed edata and end for Green Hills/PowerPC.
  136. 08v,26jun95,ms  updated for new serial drivers, removed WDB support.
  137. 08u,21jun95,ms  changed copywrite to 1995
  138. 08t,01jun95,caf  added support for "ilac" driver.
  139. 08s,22may95,yao  adjust reference to edata, end to SVR4 ABI standard 
  140.  for PowerPC.
  141. 08r,22may95,p_m  added WDB agent support.
  142.           + ms
  143. 08q,05apr95,kkk  changed edata & end to char arrays (spr# 3917)
  144. 08p,28mar95,kkk  made baud rate a macro in configAll.h
  145. 08o,19mar95,dvs  removed TRON references.
  146. 08n,08dec94,hdn  swapped 1st and 2nd parameters of fdDevCreate().
  147.  fixed bootHelp message; fd=... and ide=...
  148. 08m,21nov94,hdn  fixed a problem by swapping 1st and 2nd parameters of sscanf.
  149. 08l,20nov94,kdl  added hashLibInit() call if using dosFs.
  150. 08k,11nov94,dzb  added QU network interface.
  151. 08j,09nov94,jds  additions for scsi backward compatability ; scsi[12]IfInit()
  152. 08i,20oct94,hdn  used ideRawio() instead of using raw file system.
  153.  swapped 1st and 2nd parameter of ideLoad() and fdLoad().
  154. 08h,17aug94,dzb  fixed setting the gateway for a slip connection (SPR #2353).
  155.                  added INCLUDE_NETWORK macros for scalability (SPR #1147).
  156.    added CSLIP support.
  157. 08g,14jun94,caf  updated copyright notices.
  158. 08f,29may94,hdn  fixed more FTP bootrom bug in netLoad().
  159.  updated the copyright year 93 to 94.
  160.  disabled cache for i486 and Pentium.
  161. 08e,26may94,kdl  changed netLoad() to properly close FTP connections (SPR 3231).
  162. 08d,10may94,hdn  fixed the FTP bootrom bug (John's patch)
  163. 08c,09feb94,hdn  added support for if_elt 3COM EtherLink III driver.
  164.  added support for if_ene Eagle NE2000 driver.
  165. */
  166. /*
  167. DESCRIPTION
  168. This is the WRS-supplied configuration module for the VxWorks boot ROM.
  169. It is a stripped-down version of usrConfig.c, having no VxWorks shell or
  170. debugging facilities.  Its primary function is to load an object module
  171. over the network with either RSH or FTP.  Additionally, a simple set of
  172. single letter commands is provided for displaying and modifying memory
  173. contents.  Use this module as a starting point for placing applications 
  174. in ROM.
  175. */
  176. #include "vxWorks.h"
  177. #include "bootEcoffLib.h"
  178. #include "bootElfLib.h"
  179. #include "bootLib.h"
  180. #include "bootLoadLib.h"
  181. #include "bootpLib.h"
  182. #include "bsdSockLib.h"
  183. #include "cacheLib.h"
  184. #include "ctype.h"
  185. #include "dosFsLib.h"
  186. #include "errno.h"
  187. #include "errnoLib.h"
  188. #include "fcntl.h"
  189. #include "fioLib.h"
  190. #include "ftpLib.h"
  191. #include "hostLib.h"
  192. #include "icmpLib.h"
  193. #include "ifLib.h"
  194. #include "if_sl.h"
  195. #include "inetLib.h"
  196. #include "intLib.h"
  197. #include "ioLib.h"
  198. #include "iosLib.h"
  199. #include "loadAoutLib.h"
  200. #include "loadCoffLib.h"
  201. #include "loadLib.h"
  202. #include "logLib.h"
  203. #include "memLib.h"
  204. #include "msgQLib.h"
  205. #include "netLib.h"
  206. #include "pipeDrv.h"
  207. #include "proxyLib.h"
  208. #include "qLib.h"
  209. #include "qPriBMapLib.h"
  210. #include "rebootLib.h"
  211. #include "remLib.h"
  212. #include "rngLib.h"
  213. #include "routeLib.h"
  214. #include "semLib.h"
  215. #include "sockLib.h"
  216. #include "stdio.h"
  217. #include "string.h"
  218. #include "sysLib.h"
  219. #include "sysSymTbl.h"
  220. #include "taskHookLib.h"
  221. #include "taskLib.h"
  222. #include "tftpLib.h"
  223. #include "tickLib.h"
  224. #include "trcLib.h"
  225. #include "unistd.h"
  226. #include "version.h"
  227. #include "wdLib.h"
  228. #include "net/if.h"
  229. #include "net/mbuf.h"
  230. #include "netinet/if_ether.h"
  231. #include "drv/netif/smNetLib.h"
  232. #include "ipProto.h"
  233. #include "private/kernelLibP.h"
  234. #include "private/workQLibP.h"
  235. #include "config.h"
  236. #include "scsiLib.h"
  237. #if 1
  238. #include "vxLib.h"
  239. #endif
  240. #ifdef BROADCOM_BSP
  241. #include "drv/pci/pciConfigLib.h"
  242. #include "memDrv.h"
  243. #include "m48t59y.h"
  244. #include "ftpXfer2.h"
  245. #include "srecLoad.h"
  246. #endif
  247. #ifdef  INCLUDE_FLASH_BOOT
  248. #include "flashDrvLib.h"        /* Flash driver for MBZ */
  249. #include "flashFsLib.h"     /* Flash filesystem driver */
  250. #endif  /* INCLUDE_FLASH_BOOT */
  251. #ifdef INCLUDE_PPP
  252. #include "pppLib.h"
  253. #endif /* INCLUDE_PPP */
  254. #ifdef INCLUDE_DHCPC
  255. #include "dhcpcBootLib.h"
  256. #include "dhcp/dhcpc.h"
  257. #include "dhcp/dhcpcCommonLib.h"
  258. #endif
  259. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  260. #include "strmLib.h"
  261. #endif /* INCLUDE_STREAMS */
  262. /* defines */
  263. #define STREQ(A, B) (strcmp(A, B) == 0 ? 1 : 0)
  264. #define TIMEOUT 7 /* number of seconds before auto-boot */
  265. #define MAX_LINE        160 /* max line length for input to 'm' routine */
  266. #define RSHD 514 /* rshd service */
  267. #define DEC FALSE /* getArg parameters */
  268. #define HEX TRUE
  269. #define OPT TRUE
  270. #define MAX_ADR_SIZE  6 
  271. #define DOS_ID_OFFSET                   3
  272. #define FIRST_PARTITION_SECTOR_OFFSET   (0x1be + 8)
  273. #define VXDOS                           "VXDOS"
  274. #define VXEXT                           "VXEXT"
  275. /* DO NOT ADD ANYTHING BEFORE THE FIRST ROUTINE compressedEntry() */
  276. void usrInit ();
  277. IMPORT void  sysInitAlt ();
  278. #ifdef BROADCOM_BSP
  279. IMPORT void sysLedDsply(const char* msg);
  280. #endif
  281. #if (CPU_FAMILY==MIPS)
  282. IMPORT void  sysGpInit ();
  283. #endif /* (CPU_FAMILY==MIPS) */
  284. #ifdef  INCLUDE_NETWORK
  285. #ifdef ETHERNET_ADR_SET
  286. void mEnet (char *);
  287. void  sysEnetAddrGet ();
  288. void  sysEnetAddrSet ();
  289. #endif  /* ETHERNET_ADR_SET */
  290. #endif  /* INCLUDE_NETWORK */
  291. #ifdef INCLUDE_END
  292. LOCAL void* findCookie(int unitNo, char* devName);
  293. #endif /* INCLUDE_END */
  294. #ifdef BROADCOM_BSP
  295. /* Jimmy: might delete dosFsMemPartInitSize */
  296. extern unsigned int dosFsMemPartInitSize;
  297. extern STATUS tffsBCM47xxInit(int forceFormat);
  298. extern int pciMaxBus;
  299. /* Xmodem boot/file support */
  300. IMPORT STATUS Xmodem(int argc, char** argv);
  301. #define DEFLATED_EXT            ".Z"
  302. #define DEFLATED_EXT_LEN        (sizeof (DEFLATED_EXT) - 1)
  303. #define DEFLATED_FILE(fileName) 
  304.         (strlen(fileName) >= DEFLATED_EXT_LEN && 
  305.          ! strcmp((fileName) + strlen(fileName) - DEFLATED_EXT_LEN, 
  306.                   DEFLATED_EXT))
  307. #endif  /* BROADCOM_BSP */
  308. /*******************************************************************************
  309. *
  310. * compressedEntry - compressed entry point after decompression 
  311. *
  312. * This routine is the entry point after the bootroms decompress, if
  313. * compression is utilized.  This routine must be the first item of the
  314. * text segment of this file.  With ANSI C, strings will appear in text
  315. * segment so one should avoid entering strings, routines, or anything
  316. * else that might displace this routine from base of the text segment.
  317. *
  318. * It is unwise to add functionality to this routine without due cause.
  319. * We are in the prehistoric period of system initialization.  
  320. *
  321. * NOMANUAL
  322. */
  323. void compressedEntry 
  324.     (
  325.     int startType
  326.     )
  327.     {
  328. #if (CPU_FAMILY==MIPS)
  329. #if __GNUC__
  330.     __asm volatile (".extern _gp,0; la $gp,_gp");
  331. #endif
  332. #endif
  333. #if (CPU_FAMILY==I960)
  334.     sysInitAlt (startType); /* jump to the i960 entry point */
  335. #else
  336.     usrInit (startType); /* all others procede below */
  337. #endif
  338.     }
  339. #ifdef INCLUDE_END
  340. #include "end.h"
  341. #include "muxLib.h"
  342. #include "muxTkLib.h"
  343. #include "configNet.h"
  344. #include "m2Lib.h"
  345. IMPORT int  ipAttach ();
  346. IMPORT END_TBL_ENTRY endDevTbl[];
  347. typedef struct cookie_tbl
  348.     {
  349.     int unitNo;
  350.     char devName[END_NAME_MAX];
  351.     void* pCookie;
  352.     }COOKIE_TBL;
  353. COOKIE_TBL cookieTbl[32];
  354. #ifndef IP_MAX_UNITS 
  355. #define IP_MAX_UNITS 1
  356. #endif
  357. #ifndef MUX_MAX_BINDS
  358. #define MUX_MAX_BINDS 8
  359. #endif
  360. IP_DRV_CTRL ipDrvCtrl [IP_MAX_UNITS];
  361. int ipMaxUnits = IP_MAX_UNITS;
  362. END_OBJ*   pEnd;
  363. void*   pCookie;
  364. M2_INTERFACETBL endM2Tbl;
  365. #else /* INCLUDE_END not defined */
  366. IP_DRV_CTRL   ipDrvCtrl[1];
  367. #endif  /* INCLUDE_END */
  368. /* Wind kernel configuration facility */
  369. #undef INCLUDE_SHOW_ROUTINES /* keep out kernel show routines */
  370. #include "usrKernel.c" /* kernel configuration facility */
  371. /* imports */
  372. IMPORT char edata []; /* defined by the loader */
  373. IMPORT char end []; /* defined by the loader */
  374. #define FREE_MEM_START_ADRS FREE_RAM_ADRS
  375. #ifdef  INCLUDE_INITIAL_MEM_ALLOCATION
  376. #define MEM_POOL_START_ADRS 
  377.     (ROUND_UP(FREE_MEM_START_ADRS, (INITIAL_MEM_ALIGNMENT)) + 
  378.     (INITIAL_MEM_SIZE))
  379. #else   /* INCLUDE_INITIAL_MEM_ALLOCATION */
  380. #define MEM_POOL_START_ADRS FREE_MEM_START_ADRS
  381. #endif  /* INCLUDE_INITIAL_MEM_ALLOCATION */
  382. #ifdef  INCLUDE_TSFS_BOOT /* boot via Target Server File System */
  383. #if ((WDB_COMM_TYPE == WDB_COMM_SERIAL) && 
  384. (CONSOLE_TTY == NONE || CONSOLE_TTY == WDB_TTY_CHANNEL))
  385. #define INCLUDE_TSFS_BOOT_VIO_CONSOLE /* needed for Target Server Console */
  386. #endif
  387. #define INCLUDE_WDB /* WDB agent needed for TSFS Boot */
  388. #define INCLUDE_WDB_TSFS /* target-server file system */
  389. #undef  INCLUDE_WDB_BANNER /* print banner after agent starts */
  390. #undef  INCLUDE_WDB_TTY_TEST /* test serial line communcation */
  391. #undef  INCLUDE_WDB_START_NOTIFY /* notify the host of task creation */
  392. #undef  INCLUDE_WDB_USER_EVENT /* user events handling */
  393. #undef  INCLUDE_WDB_CTXT /* context control */
  394. #undef  INCLUDE_WDB_FUNC_CALL /* spawn function as separate task */
  395. #undef  INCLUDE_WDB_GOPHER /* gopher info gathering */
  396. #undef  INCLUDE_WDB_EXIT_NOTIFY /* notify the host of task exit */
  397. #undef  INCLUDE_WDB_REG /* get/set hardware registers */
  398. #undef  INCLUDE_WDB_EVENTPOINTS /* eventpoints handling */
  399. #undef  INCLUDE_WDB_MEM /* optional memory services */
  400. #undef  INCLUDE_WDB_BP /* breakpoint support */
  401. #include "wdb/wdbEvtLib.h"
  402. #include "../../src/config/usrWdb.c"    /* WDB agent configuration */
  403. #else /* INCLUDE_TSFS_BOOT not defined */
  404. #undef INCLUDE_WDB
  405. #endif  /* INCLUDE_TSFS_BOOT */
  406. #ifdef  INCLUDE_NETWORK
  407. /* forward declarations */
  408. LOCAL STATUS usrNetProtoInit (void);
  409. IMPORT int lnEbsaattach ();
  410. IMPORT int oliattach ();
  411. IMPORT int dcattach ();
  412. IMPORT int eglattach ();
  413. IMPORT int eiattach ();
  414. IMPORT int feiattach ();
  415. IMPORT int exattach ();
  416. IMPORT int enpattach ();
  417. IMPORT int ieattach ();
  418. IMPORT int ilacattach ();
  419. IMPORT int lnattach ();
  420. IMPORT int lnsgiattach ();
  421. IMPORT int nicattach ();
  422. IMPORT int nicEvbattach ();
  423. IMPORT int medattach ();
  424. IMPORT int      elcattach ();
  425. IMPORT int      ultraattach ();
  426. IMPORT int      eexattach ();
  427. IMPORT int      eltattach ();
  428. IMPORT int      eneattach ();
  429. IMPORT int      esmcattach ();
  430. IMPORT int quattach ();
  431. IMPORT int loattach ();
  432. IMPORT int snattach ();
  433. IMPORT int fnattach ();
  434. IMPORT STATUS slipInit ();
  435. IMPORT int ifreset ();
  436. IMPORT void if_dettach ();
  437. IMPORT u_long in_netof ();
  438. IMPORT struct ifnet * ifunit ();
  439. IMPORT int pcmciaattach ();
  440. #ifdef  NETIF_USR_DECL
  441.     NETIF_USR_DECL  /* additional declarations, from BSP */
  442. #endif
  443. #ifdef INCLUDE_IF_USR
  444. IMPORT int IF_USR_ATTACH ();
  445. #endif /* INCLUDE_IF_USR */
  446. LOCAL NETIF netIf [] =
  447.     {
  448. #ifdef  NETIF_USR_ENTRIES
  449.     NETIF_USR_ENTRIES /* additional entries, from BSP */
  450. #endif
  451. #ifdef INCLUDE_IF_USR
  452.         { IF_USR_NAME, IF_USR_ATTACH, IF_USR_ARG1, IF_USR_ARG2, IF_USR_ARG3,
  453.           IF_USR_ARG4, IF_USR_ARG5, IF_USR_ARG6, IF_USR_ARG7, IF_USR_ARG8 },
  454. #endif /* INCLUDE_IF_USR */
  455. #ifdef  INCLUDE_LNEBSA
  456. { "lnEbsa", lnEbsaattach, (char*)IO_ADRS_LNEBSA, INT_VEC_LNEBSA,
  457.   INT_LVL_LNEBSA, LNEBSA_POOL_ADRS, LNEBSA_POOL_SIZE,
  458.   LNEBSA_DATA_WIDTH, LNEBSA_MODE, LNEBSA_DMA_CHAN },
  459. #endif  /* INCLUDE_LNEBSA */
  460. #ifdef  INCLUDE_OLI
  461. { "oli", oliattach, (char*)IO_ADRS_NISA_BASE,
  462.   IO_ADRS_NISA_PCMCIA, IO_ADRS_NISA_PCMEM,
  463.   INT_VEC_PCMCIA_A, INT_LVL_PCMCIA_A,
  464.   INT_VEC_PCMCIA_B, INT_LVL_PCMCIA_B },
  465. #endif
  466. #ifdef INCLUDE_DC
  467. { "dc", dcattach, (char*)IO_ADRS_DC, INT_VEC_DC, INT_LVL_DC,
  468.   DC_POOL_ADRS, DC_POOL_SIZE, DC_DATA_WIDTH, DC_RAM_PCI_ADRS,
  469.   DC_MODE },
  470. #endif /* INCLUDE_DC */
  471. #ifdef INCLUDE_EGL
  472. { "egl", eglattach, (char*)IO_ADRS_EGL, INT_VEC_EGL, INT_LVL_EGL },
  473. #endif /* INCLUDE_EGL */
  474. #ifdef INCLUDE_EI
  475.         { "ei", eiattach, (char*)INT_VEC_EI, EI_SYSBUS, EI_POOL_ADRS, 0, 0},
  476. #endif /* INCLUDE_EI */
  477. #ifdef INCLUDE_FEI
  478.         { "fei", feiattach, (char*)FEI_POOL_ADRS, 0, 0, 0, 0},
  479. #endif /* INCLUDE_FEI */
  480. #ifdef  INCLUDE_EX
  481.         { "ex", exattach, (char*)IO_ADRS_EX, INT_VEC_EX, INT_LVL_EX,
  482.   IO_AM_EX_MASTER, IO_AM_EX },
  483. #endif /* INCLUDE_EX */
  484. #ifdef  INCLUDE_ENP
  485.         { "enp", enpattach, (char*)IO_ADRS_ENP, INT_VEC_ENP, INT_LVL_ENP,
  486.   IO_AM_ENP },
  487. #endif /* INCLUDE_ENP */
  488. #ifdef  INCLUDE_IE
  489.         { "ie", ieattach, (char*)IO_ADRS_IE, INT_VEC_IE, INT_LVL_IE },
  490. #endif /* INCLUDE_IE */
  491. #ifdef INCLUDE_ILAC
  492. { "ilac", ilacattach, (char*)IO_ADRS_ILAC, INT_VEC_ILAC},
  493. #endif /* INCLUDE_ILAC */
  494. #ifdef  INCLUDE_LN
  495.         { "ln", lnattach, (char*)IO_ADRS_LN, INT_VEC_LN, INT_LVL_LN,
  496.           LN_POOL_ADRS, LN_POOL_SIZE, LN_DATA_WIDTH, LN_PADDING,
  497.   LN_RING_BUF_SIZE },
  498. #endif /* INCLUDE_LN */
  499. #ifdef  INCLUDE_LNSGI
  500.         { "lnsgi", lnsgiattach, (char*)IO_ADRS_LNSGI, INT_VEC_LNSGI,
  501.           INT_LVL_LNSGI, LNSGI_POOL_ADRS, LNSGI_POOL_SIZE, LNSGI_DATA_WIDTH,
  502.           LNSGI_PADDING, LNSGI_RING_BUF_SIZE },
  503. #endif  /* INCLUDE_LNSGI */
  504. #ifdef  INCLUDE_NIC
  505.         { "nic", nicattach, (char*)IO_ADRS_NIC, INT_VEC_NIC, INT_LVL_NIC },
  506. #endif /* INCLUDE_NIC */
  507. #ifdef  INCLUDE_NIC_EVB
  508.         { "nicEvb", nicEvbattach, (char*)IO_ADRS_NIC,INT_VEC_NIC,INT_LVL_NIC },
  509. #endif /* INCLUDE_NIC_EVB */
  510. #ifdef  INCLUDE_MED
  511.         { "med", medattach, (char*)IO_ADRS_DBETH, INT_VEC_DBETH, INT_LVL_DBETH},
  512. #endif /* INCLUDE_MED */
  513. #ifdef  INCLUDE_ELC
  514. { "elc", elcattach, (char*)IO_ADRS_ELC, INT_VEC_ELC, INT_LVL_ELC,
  515.   MEM_ADRS_ELC, MEM_SIZE_ELC, CONFIG_ELC},
  516. #endif  /* INCLUDE_ELC */
  517. #ifdef  INCLUDE_ULTRA
  518. { "ultra", ultraattach, (char*)IO_ADRS_ULTRA, INT_VEC_ULTRA,
  519.   INT_LVL_ULTRA, MEM_ADRS_ULTRA, MEM_SIZE_ULTRA, CONFIG_ULTRA},
  520. #endif  /* INCLUDE_ULTRA */
  521. #ifdef  INCLUDE_EEX
  522. { "eex", eexattach, (char*)IO_ADRS_EEX, INT_VEC_EEX, INT_LVL_EEX,
  523.   NTFDS_EEX, CONFIG_EEX},
  524. #endif  /* INCLUDE_EEX */
  525. #ifdef  INCLUDE_ELT
  526. { "elt", eltattach, (char*)IO_ADRS_ELT, INT_VEC_ELT, INT_LVL_ELT,
  527.   NRF_ELT, CONFIG_ELT},
  528. #endif  /* INCLUDE_ELT */
  529. #ifdef  INCLUDE_ENE
  530. { "ene", eneattach, (char*)IO_ADRS_ENE, INT_VEC_ENE, INT_LVL_ENE},
  531. #endif  /* INCLUDE_ELT */
  532. #ifdef  INCLUDE_ESMC
  533. { "esmc", esmcattach, (char*)IO_ADRS_ESMC, INT_VEC_ESMC, INT_LVL_ESMC,
  534.   CONFIG_ESMC, RX_MODE_ESMC},
  535. #endif  /* INCLUDE_ESMC */
  536. #ifdef  INCLUDE_QU
  537. { "qu", quattach, (char*)IO_ADRS_QU_EN, INT_VEC_QU_EN, QU_EN_SCC,
  538.           QU_EN_TX_BD, QU_EN_RX_BD, QU_EN_TX_OFF, QU_EN_RX_OFF, QU_EN_MEM},
  539. #endif  /* INCLUDE_QU */
  540. #ifdef  INCLUDE_SN
  541.         { "sn", snattach, (char*)IO_ADRS_SN, INT_VEC_SN },
  542. #endif /* INCLUDE_SN */
  543. #ifdef  INCLUDE_FN
  544.         { "fn", fnattach },
  545. #endif  /* INCLUDE_FN */
  546. #ifdef  INCLUDE_SM_NET
  547.         { "sm", smNetAttach, 0, 0, 0, 0,  0, 0 },
  548. #endif  /* INCLUDE_SM_NET */
  549. #ifdef INCLUDE_PCMCIA
  550. { "pcmcia", pcmciaattach, 0, 0, 0, 0, 0, 0 },
  551. #endif /* INCLUDE_PCMCIA */
  552. #ifdef  INCLUDE_PPP
  553. {"ppp", 0, 0, 0, 0, 0},
  554. #endif  /* INCLUDE_PPP */
  555. #ifdef  INCLUDE_SLIP
  556. { "sl", 0, 0, 0, 0, 0 },
  557. #endif /* INCLUDE_SLIP */
  558. { "lo", loattach, 0, 0, 0, 0 },
  559.         { 0, 0, 0, 0, 0, 0 },
  560.     };
  561. #endif  /* INCLUDE_NETWORK */
  562. /* global variables */
  563. SYMTAB_ID sysSymTbl;
  564. int consoleFd; /* fd of initial console device */
  565. char consoleName [20]; /* console device name, eg. "/tyCo/0" */
  566. int sysStartType; /* BOOT_CLEAR, BOOT_NO_AUTOBOOT, ... */
  567. BOOL scsiInitialized      = FALSE;
  568. int bootCmdTaskPriority  = 1;
  569. int bootCmdTaskOptions   = VX_SUPERVISOR_MODE;
  570. int bootCmdTaskStackSize = 7000;
  571. UINT8           bootActiveString = 0;
  572. #ifdef  INCLUDE_NETWORK
  573. /* network protocol configuration parameters */
  574. #ifdef INCLUDE_TCP
  575. TCP_CFG_PARAMS tcpCfgParams =   /* tcp configuration parameters */
  576.     {
  577.     TCP_FLAGS_DFLT,             /* include rfc1323 support */
  578.     TCP_SND_SIZE_DFLT,          /* default send buffer size */
  579.     TCP_RCV_SIZE_DFLT,          /* default recv buffer size */
  580.     TCP_CON_TIMEO_DFLT,         /* initial connection time out */
  581.     TCP_REXMT_THLD_DFLT,        /* retransmit threshold */
  582.     TCP_MSS_DFLT,               /* default maximum segment size */
  583.     TCP_RND_TRIP_DFLT,          /* default round trip time */
  584.     TCP_IDLE_TIMEO_DFLT,        /* idle timeouts before first probe */
  585.     TCP_MAX_PROBE_DFLT          /* max no. probes before dropping */
  586.     };
  587. #endif /* INCLUDE_TCP */
  588. #ifdef INCLUDE_UDP
  589. UDP_CFG_PARAMS udpCfgParams =   /* udp configuration parameters */
  590.     {
  591.     UDP_FLAGS_DFLT,
  592.     UDP_SND_SIZE_DFLT,          /* send buffer size */
  593.     UDP_RCV_SIZE_DFLT           /* recv buffer size */
  594.     };
  595. #endif /* INCLUDE_UDP */
  596. #ifdef INCLUDE_ICMP
  597. ICMP_CFG_PARAMS icmpCfgParams = /* icmp configuration parameters */
  598.     {
  599.     ICMP_FLAGS_DFLT             /* no icmp mask replies by default */
  600.     };
  601. #endif  /* INCLUDE_ICMP */
  602. IP_CFG_PARAMS ipCfgParams =     /* ip configuration parameters */
  603.     {
  604.     IP_FLAGS_DFLT,              /* default ip flags */
  605.     IP_TTL_DFLT,                /* ip default time to live */
  606.     IP_QLEN_DFLT,               /* default ip intr queue len */
  607.     IP_FRAG_TTL_DFLT            /* default ip fragment time to live */
  608.     };
  609. /* network buffers configuration */
  610. /*
  611.  * mBlk, clBlk configuration table for network stack data pool.
  612.  * Only used for data transfer in the network stack.
  613.  */
  614. M_CL_CONFIG mClBlkConfig =
  615.     {
  616.     /* 
  617.     no. mBlks no. clBlks memArea memSize
  618.     ----------- ---------- ------- -------
  619.     */
  620.     NUM_NET_MBLKS_MIN,  NUM_CL_BLKS_MIN, NULL,  0
  621.     };
  622. /*
  623.  * network stack data cluster pool configuration table
  624.  * Only used for data transfer in the network stack.
  625.  */
  626. CL_DESC clDescTbl [] =
  627.     {
  628.     /*
  629.     clusterSize     num              memArea         memSize
  630.     -----------     ----             -------         -------
  631.     */
  632.     {64,            NUM_64_MIN, NULL,           0},
  633.     {128,           NUM_128_MIN,        NULL,           0},
  634.     {256,           NUM_256_MIN,        NULL,           0},
  635.     {512,           NUM_512_MIN,        NULL,           0},
  636.     {1024,          NUM_1024_MIN,       NULL,           0},
  637.     };
  638. int clDescTblNumEnt = (NELEMENTS(clDescTbl));
  639. /*
  640.  * mBlk, clBlk configuration table for network stack system pool.
  641.  * Used for network stack system structures such as routes, sockets,
  642.  * protocol control blocks, interface addresses, mulitcast addresses,
  643.  * and multicast routing entries.
  644.  */
  645. M_CL_CONFIG sysMclBlkConfig = 
  646.     {
  647.     /* 
  648.     no. mBlks no. clBlks memArea memSize
  649.     ----------- ---------- ------- -------
  650.     */
  651.     NUM_SYS_MBLKS_MIN,  NUM_SYS_CL_BLKS_MIN, NULL,  0
  652.     };
  653. /*
  654.  * network stack system cluster pool configuration table
  655.  * Used for network stack system structures such as routes, sockets,
  656.  * protocol control blocks, interface addresses, mulitcast addresses,
  657.  * and multicast routing entries.
  658.  */
  659. CL_DESC sysClDescTbl [] = 
  660.     {
  661.     /* 
  662.     clusterSize num memArea memSize
  663.     ----------- ---- ------- -------
  664.     */
  665.     {64, NUM_SYS_64_MIN, NULL, 0},
  666.     {128, NUM_SYS_128_MIN, NULL, 0},
  667.     {256, NUM_SYS_256_MIN, NULL, 0},
  668.     {512, NUM_SYS_512_MIN, NULL, 0},
  669.     }; 
  670. int sysClDescTblNumEnt = (NELEMENTS(sysClDescTbl));
  671. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  672. #ifdef  STREAMS_PROTO_INIT_RTN
  673. FUNCPTR strmProtoInitRtn = (FUNCPTR) STREAMS_PROTO_INIT_RTN;
  674. #endif  /* STREAMS_PROTO_INIT_RTN */
  675. #endif /* INCLUDE_STREAMS || INCLUDE_STREAMS_ALL */
  676. #ifdef  INCLUDE_PPP
  677. #ifndef PPP_OPTIONS_FLAGS
  678. #define PPP_OPTIONS_FLAGS ((PPP_OPT_NO_ALL << PPP_S_NO_ALL)  | 
  679.     (PPP_OPT_PASSIVE_MODE << PPP_S_PASSIVE_MODE)             | 
  680.     (PPP_OPT_SILENT_MODE << PPP_S_SILENT_MODE)               | 
  681.     (PPP_OPT_DEFAULTROUTE << PPP_S_DEFAULTROUTE)             | 
  682.     (PPP_OPT_PROXYARP << PPP_S_PROXYARP)                     | 
  683.     (PPP_OPT_IPCP_ACCEPT_LOCAL << PPP_S_IPCP_ACCEPT_LOCAL)   | 
  684.     (PPP_OPT_IPCP_ACCEPT_REMOTE << PPP_S_IPCP_ACCEPT_REMOTE) | 
  685.     (PPP_OPT_NO_IP << PPP_S_NO_IP)                           | 
  686.     (PPP_OPT_NO_ACC << PPP_S_NO_ACC)                         | 
  687.     (PPP_OPT_NO_PC << PPP_S_NO_PC)                           | 
  688.     (PPP_OPT_NO_VJ << PPP_S_NO_VJ)                           | 
  689.     (PPP_OPT_NO_VJCCOMP << PPP_S_NO_VJCCOMP)                 | 
  690.     (PPP_OPT_NO_ASYNCMAP << PPP_S_NO_ASYNCMAP)               | 
  691.     (PPP_OPT_NO_MN << PPP_S_NO_MN)                           | 
  692.     (PPP_OPT_NO_MRU << PPP_S_NO_MRU)                         | 
  693.     (PPP_OPT_NO_PAP << PPP_S_NO_PAP)                         | 
  694.     (PPP_OPT_NO_CHAP << PPP_S_NO_CHAP)                       | 
  695.     (PPP_OPT_REQUIRE_PAP << PPP_S_REQUIRE_PAP)               | 
  696.     (PPP_OPT_REQUIRE_CHAP << PPP_S_REQUIRE_CHAP)             | 
  697.     (PPP_OPT_LOGIN << PPP_S_LOGIN)                           | 
  698.     (PPP_OPT_DEBUG << PPP_S_DEBUG)                           | 
  699.     (PPP_OPT_DRIVER_DEBUG << PPP_S_DRIVER_DEBUG))
  700. #endif  /* PPP_OPTIONS_FLAGS */
  701.  
  702. PPP_OPTIONS pppOptions =
  703.     {
  704.     PPP_OPTIONS_FLAGS, /* flags field */
  705.     PPP_STR_ASYNCMAP, /* Set the desired async map */
  706.     PPP_STR_ESCAPE_CHARS, /* Set chars to escape on transmission */
  707.     PPP_STR_VJ_MAX_SLOTS, /* Set maximum VJ compression header slots */
  708.     PPP_STR_NETMASK, /* Set netmask value for negotiation */
  709.     PPP_STR_MRU, /* Set MRU value for negotiation */
  710.     PPP_STR_MTU, /* Set MTU value for negotiation */
  711.     PPP_STR_LCP_ECHO_FAILURE, /* Set max # consecutive LCP echo failures */
  712.     PPP_STR_LCP_ECHO_INTERVAL, /* Set time for LCP echo requests */
  713.     PPP_STR_LCP_RESTART, /* Set timeout for LCP */
  714.     PPP_STR_LCP_MAX_TERMINATE, /* Set max # xmits for LCP term-reqs */
  715.     PPP_STR_LCP_MAX_CONFIGURE, /* Set max # xmits for LCP conf-reqs */
  716.     PPP_STR_LCP_MAX_FAILURE, /* Set max # conf-naks for LCP */
  717.     PPP_STR_IPCP_RESTART, /* Set timeout for IPCP */
  718.     PPP_STR_IPCP_MAX_TERMINATE, /* Set max # xmits for IPCP term-reqs */
  719.     PPP_STR_IPCP_MAX_CONFIGURE, /* Set max # xmits for IPCP conf-reqs */
  720.     PPP_STR_IPCP_MAX_FAILURE, /* Set max # conf-naks for IPCP */
  721.     PPP_STR_LOCAL_AUTH_NAME, /* Set local name for authentication */
  722.     PPP_STR_REMOTE_AUTH_NAME, /* Set remote name for authentication */
  723.     PPP_STR_PAP_FILE, /* Set the PAP secrets file */
  724.     PPP_STR_PAP_USER_NAME, /* Set username for PAP auth with peer */
  725.     PPP_STR_PAP_PASSWD, /* Set password for PAP auth with peer */
  726.     PPP_STR_PAP_RESTART, /* Set timeout for PAP */
  727.     PPP_STR_PAP_MAX_AUTHREQ, /* Set max # xmits for PAP auth-reqs */
  728.     PPP_STR_CHAP_FILE, /* Set the CHAP secrets file */
  729.     PPP_STR_CHAP_RESTART, /* Set timeout for CHAP */
  730.     PPP_STR_CHAP_INTERVAL, /* Set interval for CHAP rechallenge */
  731.     PPP_STR_CHAP_MAX_CHALLENGE /* Set max # xmits for CHAP challenge */
  732.     };
  733.  
  734. #endif  /* INCLUDE_PPP */
  735. #endif  /* INCLUDE_NETWORK */
  736. /* forward declarations */
  737. #ifdef __STDC__
  738. void  usrRoot (char *pMemPoolStart, unsigned memPoolSize);
  739. void  usrClock (void);
  740. void usrKernelInit (void);
  741. LOCAL void bootCmdLoop (void);
  742. LOCAL char autoboot (int timeout);
  743. LOCAL void printBootLogo (void);
  744. LOCAL void bootHelp (void);
  745. LOCAL STATUS bootLoad (char *bootString, FUNCPTR *pEntry);
  746. LOCAL void go (FUNCPTR entry);
  747. LOCAL void m (char *adrs);
  748. LOCAL void d (char *adrs, int nwords);
  749. LOCAL void bootExcHandler (int tid);
  750. LOCAL void skipSpace (char **strptr);
  751. LOCAL void printExcMsg (char *string);
  752. LOCAL STATUS getArg (char **ppString, int *pValue, BOOL defaultHex,
  753. BOOL optional);
  754. LOCAL void usrBootLineInit (int startType);
  755. LOCAL STATUS usrBootLineCrack (char *bootString, BOOT_PARAMS *pParams);
  756. #ifdef  INCLUDE_NETWORK
  757. LOCAL STATUS netLoad (char *hostName, char *fileName, char *usr, 
  758.  char *passwd, FUNCPTR *pEntry);
  759. #ifdef BROADCOM_BSP
  760. LOCAL STATUS    netFlash(char *bootString);
  761. #endif
  762. LOCAL void netifAdrsPrint (char *ifname);
  763. LOCAL STATUS checkInetAddrField (char *pInetAddr, BOOL subnetMaskOK);
  764. LOCAL STATUS usrNetIfAttach (char *devName, int unitNum, char *inetAdrs);
  765. LOCAL STATUS usrNetIfConfig (char *devName, int unitNum, char *inetAdrs, 
  766.                                 char *inetName, int netmask);
  767. LOCAL STATUS usrBpInit (char *devName, int unitNum, u_long startAddr);
  768. LOCAL STATUS usrSlipInit (char *pBootDev, int unitNum, char *localAddr, 
  769.                              char *peerAddr);
  770. LOCAL STATUS    usrPPPInit (char *pBootDev, int unitNum, char *localAddr, 
  771.                             char *peerAddr);
  772. LOCAL STATUS bootpGet (char *pNetDev, char *pBootDevAddr, char *pBootFile,
  773.   char *pHostAddr, int *pMask);
  774. #ifdef INCLUDE_DHCPC
  775. LOCAL STATUS  dhcpGet (char *pNetDev, char *pBootDevAddr, char *pBootFile,
  776.                          char *pHostAddr, int  *pMask,
  777.                          DHCP_LEASE_DATA *pDhcpLease);
  778. #endif
  779. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  780. LOCAL STATUS    usrStrmInit (void);
  781. #endif /* INCLUDE_STREAMS || INCLUDE_STREAMS_ALL */
  782. #endif  /* INCLUDE_NETWORK */
  783. #ifdef INCLUDE_SCSI_BOOT
  784. LOCAL STATUS scsiLoad (int bootDevId, int bootDevLUN, char *fileName,
  785.           FUNCPTR *pEntry);
  786. #endif /* INCLUDE_SCSI_BOOT */
  787. #ifdef  INCLUDE_FD
  788. LOCAL STATUS    fdLoad (int drive, int type, char *fileName, FUNCPTR *pEntry);
  789. #endif  /* INCLUDE_FD */
  790. #ifdef  INCLUDE_IDE
  791. LOCAL STATUS    ideLoad (int drive, int type, char *fileName, FUNCPTR *pEntry);
  792. #endif  /* INCLUDE_IDE */
  793. #ifdef INCLUDE_ATA
  794. LOCAL STATUS ataLoad (int ctrl, int drive, char *fileName, FUNCPTR *pEntry);
  795. #endif /* INCLUDE_ATA */
  796. #ifdef INCLUDE_PCMCIA
  797. LOCAL STATUS pcmciaLoad (int sock, char *fileName, FUNCPTR *pEntry);
  798. #endif /* INCLUDE_PCMCIA */
  799. #ifdef INCLUDE_TFFS
  800. LOCAL STATUS    tffsLoad (int drive, int removable, char *fileName, 
  801.   FUNCPTR *pEntry);
  802. #endif /* INCLUDE_TFFS */
  803. #ifdef INCLUDE_TSFS_BOOT
  804. LOCAL STATUS tsfsLoad (char * fileName, FUNCPTR * pEntry);
  805. LOCAL void wdbRebootEventGet (void * pNode, WDB_EVT_DATA * pEvtData);
  806. #endif /* INCLUDE_TSFS_BOOT */
  807. #else
  808. void usrRoot ();
  809. void usrClock ();
  810. void usrKernelInit ();
  811. LOCAL void bootCmdLoop ();
  812. LOCAL char autoboot ();
  813. LOCAL void printBootLogo ();
  814. LOCAL void bootHelp ();
  815. LOCAL STATUS bootLoad ();
  816. LOCAL void go ();
  817. LOCAL void m ();
  818. LOCAL void d ();
  819. LOCAL void bootExcHandler ();
  820. LOCAL void skipSpace ();
  821. LOCAL void printExcMsg ();
  822. LOCAL STATUS getArg ();
  823. LOCAL void usrBootLineInit ();
  824. LOCAL STATUS usrBootLineCrack ();
  825. #ifdef  INCLUDE_NETWORK
  826. LOCAL STATUS netLoad ();
  827. LOCAL void netifAdrsPrint ();
  828. LOCAL STATUS checkInetAddrField ();
  829. LOCAL STATUS usrNetIfAttach ();
  830. LOCAL STATUS usrNetIfConfig ();
  831. LOCAL STATUS usrBpInit ();
  832. LOCAL STATUS usrSlipInit ();
  833. LOCAL STATUS usrPPPInit ();
  834. LOCAL STATUS bootpGet ();
  835. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  836. LOCAL STATUS usrStrmInit ();
  837. #endif /* INCLUDE_STREAMS || INCLUDE_STREAMS_ALL */
  838. #endif  /* INCLUDE_NETWORK */
  839. #ifdef INCLUDE_SCSI_BOOT
  840. LOCAL STATUS scsiLoad();
  841. #endif /* INCLUDE_SCSI_BOOT */
  842. #ifdef  INCLUDE_FD
  843. LOCAL STATUS    fdLoad ();
  844. #endif  /* INCLUDE_FD */
  845. #ifdef  INCLUDE_IDE
  846. LOCAL STATUS    ideLoad ();
  847. #endif  /* INCLUDE_IDE */
  848. #ifdef INCLUDE_ATA
  849. LOCAL STATUS ataLoad ();
  850. #endif /* INCLUDE_ATA */
  851. #ifdef INCLUDE_PCMCIA
  852. LOCAL STATUS pcmciaLoad ();
  853. #endif /* INCLUDE_PCMCIA */
  854. #ifdef INCLUDE_TFFS
  855. LOCAL STATUS    tffsLoad ();
  856. #endif /* INCLUDE_TFFS */
  857. #ifdef INCLUDE_TSFS_BOOT
  858. LOCAL STATUS tsfsLoad ();
  859. LOCAL void wdbRebootEventGet ();
  860. #endif /* INCLUDE_TSFS_BOOT */
  861. #endif /* __STDC__ */
  862. /*******************************************************************************
  863. *
  864. * usrInit - user-defined system initialization routine
  865. *
  866. * This routine is called by the start-up code in romStart().  It is called
  867. * before kernel multi-tasking is enabled, with the interrupts locked out.
  868. *
  869. * It starts by clearing BSS, so all variables are initialized to 0 as per
  870. * the C specification.  Then it sets up exception vectors, initializes the
  871. * hardware by calling sysHwInit(), and finally starts the kernel with the
  872. * usrRoot() task to do the remainder of the initialization.
  873. *
  874. * NOMANUAL
  875. */
  876. void usrInit 
  877.     (
  878.     int startType
  879.     )
  880.     {
  881. #ifdef BRINGUP
  882.     if ((SYS_REVID_GET()) == BOARD_ID_LM_1)
  883.         bringupPrintRtn = sysSerialPrintStringNL;
  884.     else
  885.         bringupPrintRtn = sysLedDsply;
  886. #else
  887.     bringupPrintRtn = NULL;
  888. #endif
  889.     BPRINT ("CHK6");
  890. #if (CPU_FAMILY == SPARC)
  891.     excWindowInit (); /* SPARC window management */
  892. #endif
  893.     BPRINT("CHK7");
  894. #if (CPU_FAMILY == MIPS)
  895.     sysGpInit (); /* MIPS global pointer */
  896. #endif /* (CPU_FAMILY == MIPS) */
  897.     BPRINT("CHK8");
  898. #ifdef INCLUDE_SYS_HW_INIT_0
  899.     /*
  900.      * Perform any BSP-specific initialisation that must be done before
  901.      * cacheLibInit() is called and/or BSS is cleared.
  902.      */
  903.     SYS_HW_INIT_0 ();
  904. #endif /* INCLUDE_SYS_HW_INIT_0 */
  905.     /* configure data and instruction cache if available and leave disabled */
  906. #ifdef INCLUDE_CACHE_SUPPORT
  907.     cacheLibInit (USER_I_CACHE_MODE, USER_D_CACHE_MODE);
  908. #endif /* INCLUDE_CACHE_SUPPORT */
  909. #if (CPU == SPARClite)
  910.     cacheLib.textUpdateRtn = NULL; /* XXX - mod hist 07u */
  911. #endif
  912.     BPRINT("CHK9");
  913.     /* don't assume bss variables are zero before this call */
  914.     bzero (edata, end - edata); /* zero out bss variables */
  915.     sysStartType = startType;
  916.     BPRINT("CHKa");
  917.     intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS); /* set vector base table */
  918. #if (CPU_FAMILY == AM29XXX)
  919.     excSpillFillInit ();                        /* am29k stack cache managemt */
  920. #endif
  921.     BPRINT("CHKb");
  922.     excVecInit (); /* install exception vectors */
  923.     BPRINT("CHKc");
  924.     sysHwInit (); /* initialize system hardware */
  925.     BPRINT("CHKd");
  926.     usrKernelInit (); /* configure the Wind kernel */
  927.     BPRINT("CHKe");
  928. #if (CPU==SPARC) || (CPU_FAMILY==I80X86) /* XXX workaround for sun1e */
  929. #undef USER_I_CACHE_ENABLE /* XXX disable instruction cache */
  930. #endif /* (CPU==SPARC) || (CPU_FAMILY==I80X86) */
  931. #ifdef INCLUDE_CACHE_SUPPORT
  932. #ifdef  USER_I_CACHE_ENABLE
  933.     cacheEnable (INSTRUCTION_CACHE); /* enable instruction cache */
  934. #endif /* USER_I_CACHE_ENABLE */
  935. #endif /* INCLUDE_CACHE_SUPPORT */
  936.     /* start the kernel specifying usrRoot as the root task */
  937.     BPRINT("CHKf");
  938.     kernelInit ((FUNCPTR) usrRoot, ROOT_STACK_SIZE,
  939. (char *) MEM_POOL_START_ADRS,
  940. sysMemTop (), ISR_STACK_SIZE, INT_LOCK_LEVEL);
  941.     }
  942. /*******************************************************************************
  943. *
  944. * usrRoot - user-defined root task
  945. *
  946. * The root task performs any initialization that should be done
  947. * subsequent to the kernel initialization.
  948. *
  949. * It initializes the I/O system, install drivers, create devices,
  950. * sets up the network, etc., as necessary for the particular configuration.
  951. * It may also create the system symbol table if one is to be included.
  952. * Finally, it spawns the boot command loop task.
  953. *
  954. * NOMANUAL
  955. */
  956. int piggy (void) {return 1;}
  957. void usrRoot
  958.     (
  959.     char *      pMemPoolStart,          /* start of system memory partition */
  960.     unsigned    memPoolSize             /* initial size of mem pool */
  961.     )
  962.     {
  963.     char tyName [20];
  964.     int ix;
  965. int xxx = 0;
  966. #ifdef INCLUDE_END
  967.     int count;
  968.     END_TBL_ENTRY* pDevTbl;
  969. #endif /* INCLUDE_END */
  970.     /* Initialize the memory pool before initializing any other package.
  971.      * The memory associated with the root task will be reclaimed at the
  972.      * completion of its activities.                                 
  973.      */
  974. while (xxx == 0)
  975.    xxx = piggy();
  976.     BPRINT("CHKg");
  977.     memInit (pMemPoolStart, memPoolSize);/* XXX select between memPartLibInit */
  978.     BPRINT("CLKh");
  979.     /* set up system timer */
  980.     sysClkConnect ((FUNCPTR) usrClock, 0);/* connect clock interrupt routine */
  981.     BPRINT("CHKi");
  982.     sysClkRateSet (60); /* set system clock rate */
  983.     BPRINT("CHKj");
  984.     sysClkEnable (); /* start it */
  985.     BPRINT("CHKk");
  986.     /* initialize I/O and file system */
  987.     iosInit (NUM_DRIVERS, NUM_FILES, "/null");
  988.     consoleFd = NONE;
  989.     /* install driver for on-board serial ports and make devices */
  990. #ifdef  INCLUDE_TYCODRV_5_2
  991. #ifdef  INCLUDE_TTY_DEV
  992.     if (NUM_TTY > 0)
  993.         {
  994.         tyCoDrv ();                             /* install console driver */
  995.         for (ix = 0; ix < NUM_TTY; ix++)        /* create serial devices */
  996.             {
  997.             sprintf (tyName, "%s%d", "/tyCo/", ix);
  998.             (void) tyCoDevCreate (tyName, ix, 512, 512);
  999.             if (ix == CONSOLE_TTY)
  1000.                 strcpy (consoleName, tyName);   /* store console name */
  1001.             }
  1002.         consoleFd = open (consoleName, O_RDWR, 0);
  1003.         /* set baud rate */
  1004.         (void) ioctl (consoleFd, FIOBAUDRATE, CONSOLE_BAUD_RATE);
  1005.         (void) ioctl (consoleFd, FIOSETOPTIONS,
  1006. OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);
  1007.         }
  1008. #endif  /* INCLUDE_TTY_DEV */
  1009. #else   /* !INCLUDE_TYCODRV_5_2 */
  1010. #ifdef  INCLUDE_TTY_DEV
  1011.     if (NUM_TTY > 0)
  1012.         {
  1013.         ttyDrv();                               /* install console driver */
  1014.         for (ix = 0; ix < NUM_TTY; ix++)        /* create serial devices */
  1015.             {
  1016. #if (defined(INCLUDE_WDB) && (WDB_COMM_TYPE == WDB_COMM_SERIAL))
  1017.     if (ix == WDB_TTY_CHANNEL)          /* don't use WDBs channel */
  1018.      continue;
  1019. #endif
  1020.             sprintf (tyName, "%s%d", "/tyCo/", ix);
  1021.             (void) ttyDevCreate (tyName, sysSerialChanGet(ix), 512, 512);
  1022.             if (ix == CONSOLE_TTY)              /* init the tty console */
  1023.                 {
  1024.                 strcpy (consoleName, tyName);
  1025.                 consoleFd = open (consoleName, O_RDWR, 0);
  1026.                 (void) ioctl (consoleFd, FIOBAUDRATE, CONSOLE_BAUD_RATE);
  1027.                 (void) ioctl (consoleFd, FIOSETOPTIONS,
  1028. OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);
  1029.                 }
  1030.             }
  1031.         }
  1032. #endif  /* INCLUDE_TTY_DEV */
  1033. #ifdef INCLUDE_PC_CONSOLE
  1034.     pcConDrv ();
  1035.     for (ix = 0; ix < N_VIRTUAL_CONSOLES; ix++)
  1036.         {
  1037.         sprintf (tyName, "%s%d", "/pcConsole/", ix);
  1038.         (void) pcConDevCreate (tyName,ix, 512, 512);
  1039.         if (ix == PC_CONSOLE)           /* init the console device */
  1040.             {
  1041.             strcpy (consoleName, tyName);
  1042.             consoleFd = open (consoleName, O_RDWR, 0);
  1043.             (void) ioctl (consoleFd, FIOBAUDRATE, CONSOLE_BAUD_RATE);
  1044.             (void) ioctl (consoleFd, FIOSETOPTIONS,
  1045. OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);
  1046.             }
  1047.         }
  1048. #endif  /* INCLUDE_PC_CONSOLE */
  1049. #endif  /* !INCLUDE_TYCODRV_5_2 */
  1050. #ifdef INCLUDE_WDB
  1051.     wdbConfig(); /* configure and initialize the WDB agent */
  1052.     vxBootFile[0] = NULL; /* clear boot line set by wdbConfig() */
  1053. #if defined(INCLUDE_TSFS_BOOT) && defined(INCLUDE_TSFS_BOOT_VIO_CONSOLE)
  1054.     consoleFd = open ("/vio/0", O_RDWR, 0); /* for Target Server Console */
  1055. #endif
  1056. #endif /* INCLUDE_WDB */
  1057.     ioGlobalStdSet (STD_IN,  consoleFd);
  1058.     ioGlobalStdSet (STD_OUT, consoleFd);
  1059.     ioGlobalStdSet (STD_ERR, consoleFd);
  1060.     BPRINT("CONS");
  1061.     pipeDrv (); /* install pipe driver */
  1062.     excInit (); /* init exception handling */
  1063.     excHookAdd ((FUNCPTR) bootExcHandler); /* install exc handler */
  1064.     logInit (consoleFd, 5); /* initialize logging */
  1065. #ifdef INCLUDE_DOSFS
  1066.     hashLibInit (); /* hashLib used by dosFS */
  1067. #endif
  1068.     /* initialize object module loader */
  1069. #if defined(INCLUDE_AOUT)
  1070.     bootAoutInit (); /* use a.out format */
  1071. #else /* coff or ecoff */
  1072. #if defined(INCLUDE_ECOFF)
  1073.     bootEcoffInit (); /* use ecoff format */
  1074. #else /* coff */
  1075. #if defined(INCLUDE_COFF)
  1076.     bootCoffInit (); /* use coff format */
  1077. #else   /* coff */
  1078. #if defined(INCLUDE_ELF)
  1079.     bootElfInit (); /* use elf format */
  1080. #endif
  1081. #endif  /* mips cpp no elif */
  1082. #endif
  1083. #endif
  1084. #ifdef INCLUDE_END
  1085.     /* initialize the MUX */
  1086.     muxMaxBinds = MUX_MAX_BINDS;
  1087.     if (muxLibInit() == ERROR)
  1088. return;                              /* can't return ERROR */
  1089.     /* Initialize all the available devices. */
  1090.     for (count = 0, pDevTbl = endDevTbl; pDevTbl->endLoadFunc != END_TBL_END;
  1091.          pDevTbl++, count++)
  1092.         {
  1093.         cookieTbl[count].pCookie = muxDevLoad (pDevTbl->unit, pDevTbl->endLoadFunc,
  1094.                                        pDevTbl->endLoadString,
  1095.                                        pDevTbl->endLoan, pDevTbl->pBSP);
  1096.         if (cookieTbl[count].pCookie == NULL)
  1097.             {
  1098. #ifndef BROADCOM_BSP
  1099.             printf ("muxLoad failed!n");
  1100. #endif
  1101.             }
  1102.         cookieTbl[count].unitNo=pDevTbl->unit;
  1103. bzero((void *)cookieTbl[count].devName,END_NAME_MAX);
  1104. pDevTbl->endLoadFunc((char*)cookieTbl[count].devName, NULL);
  1105.         }
  1106. #endif /* INCLUDE_END */
  1107.     
  1108. #ifdef BROADCOM_BSP
  1109.     sysLedDsply("BOOT");
  1110. #endif
  1111.     taskSpawn ("tBoot", bootCmdTaskPriority, bootCmdTaskOptions,
  1112. bootCmdTaskStackSize, (FUNCPTR) bootCmdLoop,
  1113. 0,0,0,0,0,0,0,0,0,0);
  1114.     }
  1115. /*******************************************************************************
  1116. *
  1117. * usrClock - user defined system clock interrupt routine
  1118. *
  1119. * This routine is called at interrupt level on each clock interrupt.  It is
  1120. * installed a call to sysClkConnect().  It calls any other facilities that
  1121. * need to know about clock ticks, including the kernel itself.
  1122. *
  1123. * If the application needs anything to happen at clock interrupt level,
  1124. * it should be added to this routine.
  1125. *
  1126. * NOMANUAL
  1127. */
  1128. void usrClock (void)
  1129.     {
  1130.     tickAnnounce (); /* announce system tick to kernel */
  1131.     }
  1132. #define PCI_CFG_47XX(d, f, o)  ( 0xAC000000 | (1 << (16+d)) | (f << 8) | o )
  1133. #ifdef BROADCOM_BSP
  1134. /*****************************************************************************
  1135. *
  1136. * pciPrintAll - scans function 0 of all PCI busses and devices and
  1137. * prints a line for each device found.
  1138. */
  1139. void pciPrintAll(void)
  1140. {
  1141.     extern int pciLibInitStatus;
  1142.     extern int pciConfigMech;
  1143.     int dev_count = 0x1f;
  1144.     int bus_count = pciMaxBus;
  1145.     int busNo, devNo, funcNo;
  1146.     funcNo = 0;
  1147.     if (pciLibInitStatus != OK) {
  1148. printf("ERROR: pciLibInitStatus is not OKn");
  1149. return;
  1150.     }
  1151.     printf("Using configuration mechanism %dn", pciConfigMech);
  1152.     printf("Scanning function 0 of PCI busses 1-%d, devices 0-%dn",
  1153.    bus_count, dev_count - 1);
  1154.     printf("bus dev fn venID devID class  rev MBAR0    MBAR1    IPIN ILINEn");
  1155.     /* Scan begins from bus 1, not bus 0.  Bus 0 is Silicon backplane */
  1156.     for (busNo = 1; busNo <= 1 + bus_count; busNo++)
  1157.         {
  1158.         /* Primary bus (1) only supports 16 device numbers */
  1159.         dev_count = ((busNo > 1) ? 0x1f : 0xf);
  1160. for (devNo = 0; devNo < dev_count; devNo++) {
  1161.     UINT32  tmp;
  1162.     UINT32 vendorID, deviceID, class, revID;
  1163.     UINT32 MBAR0, MBAR1, ipin, iline;
  1164.     if (pciConfigInLong(busNo, devNo, funcNo, PCI_CFG_VENDOR_ID, &tmp) == ERROR)
  1165.                 continue;
  1166.     vendorID = (tmp & 0x0000ffff);
  1167.     deviceID = (tmp & 0xffff0000) >> 16;
  1168.     
  1169.     if(vendorID != 0xFFFF) {
  1170. pciConfigInLong(busNo, devNo, funcNo, PCI_CFG_REVISION, &tmp);
  1171. class    = (tmp & 0xffffff00) >>  8;
  1172. revID    = (tmp & 0x000000ff);
  1173. pciConfigInLong(busNo, devNo, funcNo, PCI_CFG_BASE_ADDRESS_0,
  1174. &MBAR0);
  1175. pciConfigInLong(busNo, devNo, funcNo, PCI_CFG_BASE_ADDRESS_1,
  1176. &MBAR1);
  1177. pciConfigInLong(busNo, devNo, funcNo, PCI_CFG_DEV_INT_LINE, &tmp);
  1178. iline    = (tmp & 0x000000ff);
  1179. ipin     = (tmp & 0x0000ff00) >> 8;
  1180. printf("%02x  %02x  %02x %04x  %04x  %06x %02x  %08x %08x %02x   %02xn",
  1181.        busNo, devNo, funcNo,
  1182.        vendorID, deviceID, class, revID,
  1183.        MBAR0, MBAR1, ipin, iline);
  1184.     }
  1185. }
  1186.    }
  1187. }
  1188. /****************************************************************************
  1189.  * MAC address routines
  1190.  ***************************************************************************/
  1191. /*
  1192.  * Convert hex digit to hex character and vice-versa
  1193.  */
  1194. int i2xdigit(int digit)
  1195. {
  1196.     digit &= 0xf;
  1197.     return (digit > 9) ? digit - 10 + 'a' : digit + '0';
  1198. }
  1199. int xdigit2i(int digit)
  1200. {
  1201.     if (digit >= '0' && digit <= '9') return (digit - '0'     );
  1202.     if (digit >= 'a' && digit <= 'f') return (digit - 'a' + 10);
  1203.     if (digit >= 'A' && digit <= 'F') return (digit - 'A' + 10);
  1204.     return 0;
  1205. }
  1206. /*
  1207.  * parse_macaddr will take a string of the form H:H:H:H:H:H where each
  1208.  * H is one or two hex digits, or a string of the form 0xN where N may
  1209.  * consist of up to 12 hex digits.  The result is returned in a byte
  1210.  * array to avoid endian confusion.
  1211.  */
  1212. int parse_macaddr(char *str, char macaddr[6])
  1213. {
  1214.     char *s;
  1215.     int colon = FALSE;
  1216.     int i, c1, c2;
  1217.     if (strchr(str, ':')) { /* Colon format */
  1218. colon = TRUE;
  1219.     } else if (*str++ != '0' || tolower(*str++) != 'x') {
  1220. return -1;
  1221.     } else {
  1222. memset(macaddr, 0, 6);
  1223.     }
  1224.     /* Start at end and work back */
  1225.     s = str + strlen(str);
  1226.     for (i = 5; (i >= 0) && (s >= str); i--) {
  1227. c2 = (s > str && isxdigit((unsigned) s[-1])) ? xdigit2i((unsigned) *--s) : 0;
  1228. c1 = (s > str && isxdigit((unsigned) s[-1])) ? xdigit2i((unsigned) *--s) : 0;
  1229. macaddr[i] = c1 * 16 + c2;
  1230. if (colon && (s >= str) && (':' != *--s))
  1231.     break;
  1232.     }
  1233.     return(((s <= str) && (!colon || (i == 0))) ? 0 : -1);
  1234. }
  1235. /*
  1236.  * format_macaddr requires a buffer of 18 bytes minimum.
  1237.  * It does not use sprintf so it can be called from an interrupt context.
  1238.  */
  1239. void format_macaddr(char buf[18], char macaddr[6])
  1240. {
  1241.     int i;
  1242.     for (i = 0; i <= 5; i++) {
  1243. *buf++ = i2xdigit(macaddr[i] >> 4);
  1244. *buf++ = i2xdigit(macaddr[i]);
  1245. *buf++ = ':';
  1246.     }
  1247.     *--buf = 0;
  1248. }
  1249. /*
  1250.  * macAddrCmd
  1251.  *
  1252.  *   Process the boot loader 'M' command.
  1253.  *   'M' displays current MAC address.
  1254.  *   'M xx:xx:xx:xx:xx:xx' changes the MAC address.
  1255.  */
  1256. void macAddrCmd(char *s)
  1257. {
  1258.     char        enetAdrs[6];
  1259.     char        buf[80];
  1260.     skipSpace(&s);
  1261.     if (*s != EOS) {
  1262.         if (parse_macaddr(s, enetAdrs) < 0)
  1263.             printf("MAC address syntax errorn");
  1264.         else {
  1265.             sysNvRamSet(enetAdrs, 6, NV_OFF_MACADDR);
  1266.         }
  1267.     }
  1268.     /* Get current MAC address from NVRAM */
  1269.     sysNvRamGet(enetAdrs, 6, NV_OFF_MACADDR);
  1270.     format_macaddr(buf, enetAdrs);
  1271.     printf("MAC address: %sn", buf);
  1272. }
  1273. /*
  1274.  * timeZoneCmd
  1275.  *
  1276.  *   Process the boot loader 'Z' command.
  1277.  *   'Z' displays current time zone.
  1278.  *   'Z w:x:y:z changes the time zone (see ansiTime(1) for format)
  1279.  */
  1280. void timeZoneCmd(char *s)
  1281. {
  1282.     extern int sysTimeZoneGood(char *tz);       /* sysLib.c */
  1283.     skipSpace(&s);
  1284.     if (*s != EOS) {
  1285.         if (sysTimeZoneGood(s))
  1286.             sysNvRamSet(s, 64, NV_OFF_TIMEZONE);
  1287.         else
  1288.             printf("Time zone syntax error; see ansiTime(1)n");
  1289.     }
  1290.     sysNvRamGet(s, 64, NV_OFF_TIMEZONE);
  1291.     printf("Time zone: %sn", sysTimeZoneGood(s) ? s : "not set");
  1292. }
  1293. /*
  1294.  * Receive XModem file
  1295.  */
  1296. void xmodemCmd(char *s)
  1297. {
  1298.     int i;
  1299.     char* args[3];
  1300.     for ( i = 0; i < 3; i++) {
  1301. args[i] = malloc(100);
  1302. memset(args[i],0x0,100);
  1303.     }
  1304.     skipSpace(&s);
  1305.     if (*s != EOS) {
  1306. /* Args[0] is unused */
  1307. sprintf(args[1],"%s","-rb");
  1308. sprintf(args[2],"%s", s);    
  1309. Xmodem(2,args);
  1310.     }
  1311.     /* Free up mem */
  1312.     for ( i = 0; i < 3; i++)
  1313. free(args[i]);
  1314.     
  1315. }
  1316. /*
  1317.  * Command to clear NVRAM
  1318.  */
  1319. void nvramClearCmd(void)
  1320. {
  1321.     char        zero[4] = { 0, 0, 0, 0 };
  1322.     int         i;
  1323.     for (i = 0; i < NV_RAM_SIZE; i += 4)
  1324.         sysNvRamSet(zero, 4, i);
  1325.     printf("NVRAM clearedn");
  1326. }
  1327. /*
  1328.  * testMemory
  1329.  */
  1330. #define MAX_ERRS 10
  1331. void fillPat(UINT32 *addr, UINT32 len,
  1332.      UINT32 seed, UINT32 incr, UINT32 xor)
  1333. {
  1334.     UINT32 *ptr, *limit;
  1335.     printf("FILL ");
  1336.     ptr = addr;
  1337.     limit = addr + len / 4;
  1338.     while (ptr < limit) {
  1339. *ptr = seed;
  1340. seed = (seed + incr) ^ xor;
  1341. ptr++;
  1342.     }
  1343.     cacheFlush(DATA_CACHE, addr, len);
  1344. }
  1345. STATUS verifyPat(UINT32 *addr, UINT32 len,
  1346.  UINT32 seed, UINT32 incr, UINT32 xor)
  1347. {
  1348.     UINT32 *ptr, *limit, data;
  1349.     int errs = 0;
  1350.     printf("VERIFY ");
  1351.     cacheInvalidate(DATA_CACHE, addr, len);
  1352.     ptr = addr;
  1353.     limit = addr + len / 4;
  1354.     while (ptr < limit) {
  1355. data = *ptr;
  1356. if (data != seed) {
  1357.     cacheInvalidate(DATA_CACHE, ptr, 4);
  1358.     printf("nMISCOMPARE: "
  1359.    "addr=%08x wrote=%08x read=%08x reread=%08xn",
  1360.    (int) ptr, seed, data, *(volatile UINT32 *) ptr);
  1361.     if (++errs == MAX_ERRS)
  1362. break;
  1363. }
  1364. seed = (seed + incr) ^ xor;
  1365. ptr++;
  1366.     }
  1367.     return (errs == 0) ? OK : ERROR;
  1368. }
  1369. void writeMemory(volatile UINT32 *addr, UINT32 len)
  1370. {
  1371.     UINT32 *end = (UINT32 *) addr + len / 4;
  1372.     while (addr < end)
  1373. *addr++ = 0;
  1374. }
  1375. void readMemory(volatile UINT32 *addr, UINT32 len)
  1376. {
  1377.     UINT32 *end = (UINT32 *) addr + len / 4;
  1378.     while (addr < end)
  1379. *addr++;
  1380. }
  1381. void testBandwidth(UINT32 *addr, UINT32 len)
  1382. {
  1383.     int il, sec, wkb = 0, rkb = 0;
  1384.     /* Allow time for console output to flush */
  1385.     taskDelay(sysClkRateGet());
  1386.     /* Turn off interrupts and data cache for accurate results */
  1387.     il = intLock();
  1388.     cacheDisable(DATA_CACHE);
  1389.     /* Line up on an even second */
  1390.     sec = sysTodGetSecond();
  1391.     while (sysTodGetSecond() == sec)
  1392. ;
  1393.     /* Write to memory for 1 second */
  1394.     sec = sysTodGetSecond();
  1395.     while (sysTodGetSecond() == sec) {
  1396. writeMemory(addr, 0x10000);
  1397. wkb += 64;
  1398.     }
  1399.     /* Read from memory for 1 second */
  1400.     sec = sysTodGetSecond();
  1401.     while (sysTodGetSecond() == sec) {
  1402. readMemory(addr, 0x10000);
  1403. rkb += 64;
  1404.     }
  1405.     /* Restore cache and interrupts */
  1406.     cacheEnable(DATA_CACHE);
  1407.     intUnlock(il);
  1408.     printf("Write bandwidth         %d kB/secn", wkb);
  1409.     printf("Read bandwidth          %d kB/secn", rkb);
  1410. }
  1411. STATUS testMemory(UINT32 *addr, UINT32 len)
  1412. {
  1413.     printf("Testing: addr=%08x length=%08x", (int) addr, len);
  1414.     printf("nCheckerboard 5/A        ");
  1415.     fillPat(addr, len, 0x55555555, 0x00000000, 0xffffffff);
  1416.     if (verifyPat(addr, len, 0x55555555, 0x00000000, 0xffffffff) != OK)
  1417. return ERROR;
  1418.     printf("nCheckerboard A/5        ");
  1419.     fillPat(addr, len, 0xaaaaaaaa, 0x00000000, 0xffffffff);
  1420.     if (verifyPat(addr, len, 0xaaaaaaaa, 0x00000000, 0xffffffff) != OK)
  1421. return ERROR;
  1422.     printf("nData equals address     ");
  1423.     fillPat(addr, len, (UINT32) addr, 0x00000004, 0x00000000);
  1424.     if (verifyPat(addr, len, (UINT32) addr, 0x00000004, 0x00000000) != OK)
  1425. return ERROR;
  1426.     printf("nPseudo-random           ");
  1427.     fillPat(addr, len, 0xbabeface, 0xdeadbeef, 0x00000000);
  1428.     if (verifyPat(addr, len, 0xbabeface, 0xdeadbeef, 0x00000000) != OK)
  1429. return ERROR;
  1430.     printf("n");
  1431.     if (len >= 0x10000)
  1432. testBandwidth(addr, len);
  1433.     return OK;
  1434. }
  1435. #endif /* BROADCOM_BSP */
  1436. /*****************************************************************************
  1437.  *
  1438.  * Compute NVRAM offset for currently active boot string
  1439.  */
  1440. static int bootActiveStringNVOFF(void)
  1441. {
  1442.     switch (bootActiveString) {
  1443.     default:
  1444.         return NV_OFF_BOOT0;
  1445.     case 1:
  1446.         return NV_OFF_BOOT1;
  1447.     case 2:
  1448.         return NV_OFF_BOOT2;
  1449.     }
  1450. }
  1451. /*******************************************************************************
  1452. *
  1453. * bootCmdLoop - read and execute user commands forever (until boot)
  1454. */
  1455. LOCAL void bootCmdLoop (void)
  1456.     {
  1457.     BOOT_PARAMS params;
  1458.     char line [MAX_LINE];
  1459.     char *pLine;
  1460.     int nwords;
  1461.     int nbytes;
  1462.     int value;
  1463.     int adr;
  1464.     int adr2;
  1465.     FUNCPTR entry;
  1466.     char key = 0;
  1467.     /* flush standard input to get rid of any garbage;
  1468.      * E.g. the Heurikon HKV2F gets junk in USART if no terminal connected.
  1469.      */
  1470.     (void) ioctl (STD_IN, FIOFLUSH, 0 /*XXX*/);
  1471. #ifdef BROADCOM_BSP
  1472.     bootActiveString = 0;
  1473.    (void) sysNvRamGet((char *) &bootActiveString,
  1474.                        sizeof (bootActiveString),
  1475.                        NV_OFF_ACTIVEBOOT);
  1476. #endif
  1477.     if (sysStartType & BOOT_CLEAR)
  1478. printBootLogo ();
  1479.     usrBootLineInit (sysStartType);
  1480.     /* print out any new exception message -
  1481.      * the first byte is zeroed after printing so that we won't print
  1482.      * it again automatically.  However, 'e' command will still print out
  1483.      * the remainder. */
  1484.     printExcMsg (sysExcMsg);
  1485.     *sysExcMsg = EOS; /* indicate exception message is old */
  1486.     /* start autoboot, unless no-autoboot specified */
  1487.     bootStringToStruct (BOOT_LINE_ADRS, &params);
  1488.     sysFlags = params.flags;
  1489. #if defined(INCLUDE_TSFS_BOOT) && defined(INCLUDE_TSFS_BOOT_VIO_CONSOLE)
  1490.     /* Wait for Target Server connection */
  1491.     while (!wdbTargetIsConnected())
  1492.      taskDelay (sysClkRateGet());
  1493.     /*
  1494.      * disable the auto-boot mechanism, because the Target Server may not have
  1495.      * time to start its VIO Console before the end of the auto-boot coutdown.
  1496.      */
  1497.     sysStartType |= BOOT_NO_AUTOBOOT;
  1498. #endif
  1499.     if (!(sysStartType & BOOT_NO_AUTOBOOT) &&
  1500. !(sysFlags & SYSFLG_NO_AUTOBOOT))
  1501. {
  1502. int timeout = TIMEOUT;
  1503. if ((sysStartType & BOOT_QUICK_AUTOBOOT) ||
  1504.     (sysFlags & SYSFLG_QUICK_AUTOBOOT))
  1505.     {
  1506.     timeout = 1;
  1507.     }
  1508. key = autoboot (timeout); /* doesn't return if successful */
  1509. }
  1510.     /* If we're here, either we aren't auto-booting, or we got an error
  1511.      * auto-booting, or the auto-booting was stopped. */
  1512.     /* put console in line mode */
  1513.     (void) ioctl (consoleFd, FIOSETOPTIONS, OPT_TERMINAL);
  1514.     /* read and execute the ROM commands */
  1515.     printf ("n");
  1516.     FOREVER
  1517. {
  1518. #ifdef BROADCOM_BSP
  1519.         if ((key == '!') || (key == '@') || (key >= '0' && key <= '2'))
  1520. #else
  1521. if ((key == '!') || (key == '@'))
  1522. #endif
  1523.     {
  1524.     line [0] = key;
  1525.     line [1] = EOS;
  1526.     key = 0;
  1527.     }
  1528. else
  1529.     {
  1530.     printf ("[VxWorks Boot]: ");
  1531.     fioRdString (STD_IN, line, sizeof (line));
  1532.     }
  1533. adr = adr2 = 0;
  1534. nwords = 0;
  1535. /* take blanks off end of line */
  1536. pLine = line + strlen (line) - 1; /* point at last char */
  1537. while ((pLine >= line) && (*pLine == ' '))
  1538.     {
  1539.     *pLine = EOS;
  1540.     pLine--;
  1541.     }
  1542. pLine = line;
  1543. skipSpace (&pLine);
  1544. switch (*(pLine++))
  1545.     {
  1546.     case EOS: /* blank line */
  1547. break;
  1548.     case 'd': /* display */
  1549. if ((getArg (&pLine, &adr, HEX, OPT) == OK) &&
  1550.     (getArg (&pLine, &nwords, DEC, OPT) == OK))
  1551.     d ((char *) adr, nwords);
  1552. break;
  1553.     case 'e': /* exception */
  1554. printExcMsg (sysExcMsg + 1);
  1555. break;
  1556.     case 'f': /* fill */
  1557. if ((getArg (&pLine, &adr, HEX, !OPT) == OK) &&
  1558.     (getArg (&pLine, &nbytes, DEC, !OPT) == OK) &&
  1559.     (getArg (&pLine, &value, DEC, !OPT) == OK))
  1560.     {
  1561.     bfillBytes ((char *) adr, nbytes, value);
  1562.     }
  1563. break;
  1564.     case 't': /* transpose(?) (running out of letters!) */
  1565. if ((getArg (&pLine, &adr, HEX, !OPT) == OK) &&
  1566.     (getArg (&pLine, &adr2, HEX, !OPT) == OK) &&
  1567.     (getArg (&pLine, &nbytes, HEX, !OPT) == OK))
  1568.     {
  1569.     bcopy ((char *) adr, (char *) adr2, nbytes);
  1570.     }
  1571. break;
  1572.     case 'm': /* modify */
  1573. if (getArg (&pLine, &adr, HEX, !OPT) == OK)
  1574.     m ((char *) adr);
  1575. break;
  1576. #ifdef TARGET_HK_V2F
  1577.     case 's': /* system controller */
  1578. {
  1579. extern ULONG sysBCLSet ();
  1580. if (getArg (&pLine, &value, DEC, !OPT) == OK)
  1581.     {
  1582.     if (value != 0)
  1583. {
  1584. (void) sysBCLSet ((ULONG)HK_BCL_SYS_CONTROLLER,
  1585.   (ULONG)HK_BCL_SYS_CONTROLLER);
  1586. printf ("System controller on.n");
  1587. }
  1588.     else
  1589. {
  1590. (void) sysBCLSet ((ULONG)HK_BCL_SYS_CONTROLLER,
  1591.   (ULONG)0);
  1592. printf ("System controller off.n");
  1593. }
  1594.     }
  1595. break;
  1596. }
  1597. #endif /* TARGET_HK_V2F */
  1598. #if defined(TARGET_FRC_30) || defined(TARGET_FRC_31) || defined(TARGET_FRC_33)
  1599.     case 's': /* system controller */
  1600. if (getArg (&pLine, &value, DEC, !OPT) == OK)
  1601.     {
  1602.     if (value != 0)
  1603. {
  1604. *FGA_CTL1 |= FGA_CTL1_SCON;
  1605. printf ("System controller on.n");
  1606. }
  1607.     else
  1608. {
  1609. *FGA_CTL1 &= ~FGA_CTL1_SCON;
  1610. printf ("System controller off.n");
  1611. }
  1612.     }
  1613. break;
  1614. #endif /* TARGET_FRC_30 || TARGET_FRC_31 || TARGET_FRC_33 */
  1615.     case 'p': /* print boot params */
  1616. #ifdef BROADCOM_BSP
  1617.                 printf("nboot string          : %d", (int) bootActiveString);
  1618. #endif
  1619. bootParamsShow (BOOT_LINE_ADRS);
  1620. break;
  1621. #ifdef BROADCOM_BSP
  1622.             case 'P':
  1623.                 pciPrintAll();
  1624.                 break;
  1625.             case 'b':           /* print/change active boot string */
  1626.                 value = -1;
  1627.                 if (getArg(&pLine, &value, DEC, OPT) == OK) {
  1628.                     if (value < 0)
  1629.                         printf("Active boot string: %dn", bootActiveString);
  1630.                     else if (value >= 0 && value <= 2) {
  1631.                         bootActiveString = value;
  1632.                         (void) sysNvRamSet((char *) &bootActiveString,
  1633.                                            sizeof (bootActiveString),
  1634.                                            NV_OFF_ACTIVEBOOT);
  1635.                         usrBootLineInit(BOOT_CLEAR);    /* Reload BOOT_LINE */
  1636.                         printf("Active boot string changed to %dn",
  1637.                                bootActiveString);
  1638.                     } else
  1639.                         printf("Illegal boot string # (0-2)n");
  1640.                 }
  1641.                 break;
  1642. #endif
  1643.     case 'c': /* change boot params */
  1644. bootParamsPrompt (BOOT_LINE_ADRS);
  1645. #ifdef BROADCOM_BSP
  1646.                 (void) sysNvRamSet (BOOT_LINE_ADRS,
  1647.                                     strlen (BOOT_LINE_ADRS) + 1,
  1648.                                     bootActiveStringNVOFF());
  1649. #else
  1650. (void) sysNvRamSet (BOOT_LINE_ADRS,
  1651.     strlen (BOOT_LINE_ADRS) + 1, 0);
  1652. #endif
  1653. break;
  1654. #ifdef BROADCOM_BSP
  1655.             case 'C':           /* clear NVRAM */
  1656.                 nvramClearCmd();
  1657.                 break;
  1658.             case 'T':           /* Test memory */
  1659.                 if (getArg(&pLine, (int *) &adr, HEX, !OPT) == OK &&
  1660.                     getArg(&pLine, (int *) &nbytes, HEX, !OPT) == OK)
  1661.                     testMemory((UINT32 *) adr, nbytes);
  1662.                 break;
  1663.             case 'R':           /* Reset */
  1664.                 printf("Resetting...");
  1665.                 taskDelay (sysClkRateGet ());   /* pause a second */
  1666.                 sysReboot();
  1667.                 /*NOTREACHED*/
  1668.                 break;
  1669. #endif
  1670.     case 'g': /* go */
  1671. if (getArg (&pLine, (int *) &entry, HEX, !OPT) == OK)
  1672.     go (entry);
  1673. break;
  1674. #ifdef  INCLUDE_NETWORK
  1675. #ifdef BROADCOM_BSP
  1676.             case 'F':           /* Flash PROM over network (Broadcom) */
  1677.                 netFlash(pLine);
  1678.                 break;
  1679.             case 'M':
  1680.                 macAddrCmd (pLine);
  1681.                 break;
  1682. #endif  /* BROADCOM_BSP */
  1683.     case 'n':
  1684. netifAdrsPrint (pLine);
  1685. break;
  1686. #ifdef ETHERNET_ADR_SET
  1687.     case 'N':
  1688. mEnet (pLine);
  1689. break;
  1690. #endif  /* ETHERNET_ADR_SET */
  1691. #endif  /* INCLUDE_NETWORK */
  1692. #ifdef BROADCOM_BSP
  1693.             case 'Z':           /* Time Zone (see ansiTime) */
  1694.                 timeZoneCmd(pLine);
  1695.                 break;
  1696.             case 'X':
  1697.             case 'x':
  1698.                 xmodemCmd(pLine);
  1699.                 break;
  1700. #endif
  1701.     case '?': /* help */
  1702.             case 'h': /* help */
  1703. bootHelp ();
  1704. break;
  1705. #ifdef BROADCOM_BSP
  1706.            case '0':
  1707.             case '1':
  1708.             case '2':
  1709.                 bootActiveString = pLine[-1] - '0';
  1710.                 usrBootLineInit(BOOT_CLEAR);    /* Reload BOOT_LINE */
  1711.                 /* Fall through */
  1712. #endif
  1713.             case '@': /* load and go with internal params */
  1714.     case '$': /* load and go with internal params */
  1715. if (bootLoad (pLine, &entry) == OK)
  1716.     {
  1717.     go (entry);
  1718.     }
  1719. else
  1720.     {
  1721.     taskDelay (sysClkRateGet ()); /* pause a second */
  1722.     reboot (BOOT_NO_AUTOBOOT); /* something is awry */
  1723.     }
  1724. break;
  1725.     case 'l': /* load with internal params */
  1726. if (bootLoad (pLine, &entry) == OK)
  1727.     {
  1728.     printf ("entry = 0x%xn", (int) entry);
  1729.     }
  1730. else
  1731.     {
  1732.     taskDelay (sysClkRateGet ()); /* pause a second */
  1733.     reboot (BOOT_NO_AUTOBOOT); /* something is awry */
  1734.     }
  1735. break;
  1736.     default:
  1737. printf ("Unrecognized command. Type '?' for help.n");
  1738. break;
  1739.             } /* switch */
  1740.         } /* FOREVER */
  1741.     }
  1742. /******************************************************************************
  1743. *
  1744. * autoboot - do automatic boot sequence
  1745. *
  1746. * RETURNS: Doesn't return if successful (starts execution of booted system).
  1747. */
  1748. LOCAL char autoboot 
  1749.     (
  1750.     int timeout /* timeout time in seconds */
  1751.     )
  1752.     {
  1753.     ULONG autoBootTime;
  1754.     int timeLeft;
  1755.     UINT timeMarker;
  1756.     int bytesRead = 0;
  1757.     FUNCPTR entry;
  1758.     char key;
  1759.     if (timeout > 0)
  1760. {
  1761. printf ("nPress any key to stop auto-boot...n");
  1762. /* Loop looking for a char, or timeout after specified seconds */
  1763. autoBootTime = tickGet () + sysClkRateGet () * timeout;
  1764. timeMarker = tickGet () + sysClkRateGet ();
  1765. timeLeft = timeout;
  1766. printf ("%2dr", timeLeft);
  1767.  while ((tickGet () < autoBootTime) && (bytesRead == 0))
  1768.     {
  1769.     (void) ioctl (consoleFd, FIONREAD, (int) &bytesRead);
  1770.     if (tickGet () == timeMarker)
  1771. {
  1772. timeMarker = tickGet () + sysClkRateGet ();
  1773. printf ("%2dr", --timeLeft);
  1774. }
  1775.     }
  1776. }
  1777.     if (bytesRead == 0)    /* nothing typed so auto-boot */
  1778. {
  1779. /* put the console back in line mode so it echoes (so's you can bang
  1780.  * on it to see if it's still alive) */
  1781. (void) ioctl (consoleFd, FIOSETOPTIONS, OPT_TERMINAL);
  1782. printf ("nauto-booting...nn");
  1783. if (bootLoad (BOOT_LINE_ADRS, &entry) == OK)
  1784.     go (entry); /* ... and never return */
  1785. else
  1786.     {
  1787.     printf ("Can't load boot file!!n");
  1788.     taskDelay (sysClkRateGet ()); /* pause a second */
  1789.     reboot (BOOT_NO_AUTOBOOT); /* something is awry */
  1790.     }
  1791. }
  1792.     else
  1793. {
  1794. /* read the key that stopped autoboot */
  1795. read (consoleFd, &key, 1);
  1796. return (key & 0x7f); /* mask off parity in raw mode */
  1797. }
  1798.     return (ERROR); /* for lint - can't really get here */
  1799.     }
  1800. /******************************************************************************
  1801. *
  1802. * printBootLogo - print initial boot banner page
  1803. */
  1804. LOCAL void printBootLogo (void)
  1805.     {
  1806.     printf ("nnnnnnnnnnn");
  1807.     printf ("%28s%s", "","VxWorks System Boot");
  1808.     printf ("nnnCopyright 1984-2001  Wind River Systems, Inc.nnnnnn");
  1809.     printf ("CPU: %sn", sysModel ());
  1810.     printf ("Version: %sn", vxWorksVersion);
  1811.     printf ("BSP version: " BSP_VERSION BSP_REV "n");
  1812.     printf ("Creation date: %snn", creationDate);
  1813.     }
  1814. /*******************************************************************************
  1815. *
  1816. * bootHelp - print brief help list
  1817. */
  1818. LOCAL void bootHelp (void)
  1819.     {
  1820.     static char *helpMsg[] =
  1821. {
  1822. "?",                      "- print this list",
  1823.         "@",                      "- boot using active boot string",
  1824. #ifdef BROADCOM_BSP
  1825.         "<n>",                    "- boot using boot string <n> = 0 to 2",
  1826.         "b [<n>]",                "- show/change which boot string is active",
  1827.         "P",                      "- show devices on the PCI bus",
  1828.         "Z [w:x:y:z]",            "- show/set the time zone",
  1829.         "M [xx:xx:xx:xx:xx:xx]",  "- show/set the MAC address",
  1830.         "Z [w:x:y:z]",            "- show/set the time zone",
  1831.         "R",                      "- reboot",
  1832.         "T addr, nbytes",         "- test memory",
  1833.         "X | x",                  "- boot over serial port using xmodem",
  1834.         "C",                      "- clear NVRAM",
  1835. #endif
  1836. "p",                      "- print boot params",
  1837. "c",                      "- change boot params",
  1838.         "l",                      "- load boot file using active boot string",
  1839. "g adrs",                 "- go to adrs",
  1840. "d adrs[,n]",             "- display memory",
  1841. "m adrs",                 "- modify memory",
  1842. "f adrs, nbytes, value",  "- fill memory",
  1843. "t adrs, adrs, nbytes",   "- copy memory",
  1844. "e",                      "- print fatal exception",
  1845. #ifdef INCLUDE_NETWORK
  1846. "n netif",      "- print network interface device address",
  1847. #if defined(ETHERNET_ADR_SET)
  1848. "N",   "- set ethernet address",
  1849. #endif  /* ETHERNET_ADR_SET */
  1850. #endif  /* INCLUDE_NETWORK */
  1851. #if defined(TARGET_HK_V2F) || defined(TARGET_FRC_30) || 
  1852.     defined(TARGET_FRC_31) || defined(TARGET_FRC_33)
  1853. "s [0/1]",                "- system controller 0 = off, 1 = on",
  1854. #endif /* TARGET_HK_V2F/FRC_30/FRC_31/FRC_33 */
  1855. "$dev(0,procnum)host:/file h=# e=# b=# g=# u=usr [pw=passwd] f=#", "",
  1856. "                          tn=targetname s=script o=other", "",
  1857. #ifdef INCLUDE_SCSI_BOOT
  1858. "boot device: scsi=id,lun              file name: /sd0/vxWorks","",
  1859. #endif /*INCLUDE_SCSI_BOOT*/
  1860. #ifdef INCLUDE_FD
  1861. "boot device: fd=drive,fdType          file name: /fd0/vxWorks","",
  1862. #endif /* INCLUDE_FD */
  1863. #ifdef INCLUDE_IDE
  1864. "boot device: ide=drive,configType     file name: /ide0/vxWorks","",
  1865. #endif /* INCLUDE_IDE */
  1866. #ifdef INCLUDE_ATA
  1867. "boot device: ata=ctrl,drive           file name: /ata0/vxWorks","",
  1868. #endif /* INCLUDE_ATA */
  1869. #ifdef INCLUDE_PCMCIA
  1870. "boot device: pcmcia=sock              file name: /pcmcia0/vxWorks","",
  1871. #endif /* INCLUDE_PCMCIA */
  1872. #ifdef INCLUDE_TFFS
  1873. #ifdef  BROADCOM_BSP
  1874.         "boot device: flash                    file name: flash:vxWorks.st","",
  1875. #else
  1876. "boot device: tffs=drive,removable     file name: /tffs0/vxWorks","",
  1877. #endif
  1878. #endif /* INCLUDE_TFFS */
  1879. #ifdef INCLUDE_TSFS_BOOT
  1880. "boot device: tsfs                     file name: /tgtsvr/vxWorks","",
  1881. #endif /*INCLUDE_TSFS_BOOT */
  1882. "Boot flags:",   "",
  1883. #if defined(TARGET_HK_V2F) || defined(TARGET_FRC_30) || 
  1884.     defined(TARGET_FRC_31) || defined(TARGET_FRC_33)
  1885. "  0x01  - don't be system controller", "",
  1886. #endif /* TARGET_HK_V2F/FRC_30/FRC_31/FRC_33 */
  1887. "  0x02  - load local system symbols", "",
  1888. "  0x04  - don't autoboot", "",
  1889. "  0x08  - quick autoboot (no countdown)", "",
  1890. #ifdef  INCLUDE_NETWORK
  1891. "  0x20  - disable login security", "",
  1892. #ifdef  INCLUDE_DHCPC
  1893. "  0x40  - use dhcp to get boot parameters", "",
  1894. #else
  1895. "  0x40  - use bootp to get boot parameters", "",
  1896. #endif
  1897. "  0x80  - use tftp to get boot image", "",
  1898. "  0x100 - use proxy arp", "",
  1899. #endif  /* INCLUDE_NETWORK */
  1900. NULL
  1901. };
  1902.     FAST char **pMsg;
  1903. #ifdef  INCLUDE_NETWORK
  1904.     FAST NETIF *pNif;
  1905. #endif  /* INCLUDE_NETWORK */
  1906. #ifdef INCLUDE_END
  1907.     int count;
  1908.     char       muxDevName[8];
  1909.     END_TBL_ENTRY* pDevTbl;
  1910. #endif /* INCLUDE_END */
  1911.     printf ("n");
  1912.     for (pMsg = helpMsg; *pMsg != NULL; pMsg += 2)
  1913. printf (" %-21s %sn", *pMsg, *(pMsg + 1));
  1914. #ifdef  INCLUDE_NETWORK
  1915.     printf ("navailable boot devices:");
  1916. #ifdef INCLUDE_END
  1917.     printf ("Enhanced Network Devicesn");
  1918.     for (count = 0, pDevTbl = endDevTbl; pDevTbl->endLoadFunc != END_TBL_END;
  1919.          pDevTbl++, count++)
  1920.         {
  1921.         if (!pDevTbl->processed)
  1922.             {
  1923.             muxDevName [0] = (char) NULL;
  1924.             pDevTbl->endLoadFunc (muxDevName, NULL);
  1925.             printf (" %s%d", muxDevName, pDevTbl->unit);
  1926.             }
  1927.         }
  1928. #endif /* INCLUDE_END */
  1929.     
  1930.     for (pNif = netIf; pNif->ifName != 0; pNif++)
  1931. {
  1932. if (strncmp (pNif->ifName, "lo", 2) != 0)
  1933.     printf (" %s", pNif->ifName);
  1934. }
  1935. #endif  /* INCLUDE_NETWORK */
  1936. #ifdef INCLUDE_SCSI_BOOT
  1937.     printf (" scsi");
  1938. #endif /*INCLUDE_SCSI_BOOT*/
  1939. #ifdef  INCLUDE_FD
  1940.     printf (" fd");
  1941. #endif  /* INCLUDE_FD */
  1942. #ifdef  INCLUDE_IDE
  1943.     printf (" ide");
  1944. #endif  /* INCLUDE_IDE */
  1945. #ifdef  INCLUDE_ATA
  1946.     printf (" ata");
  1947. #endif  /* INCLUDE_ATA */
  1948. #ifdef  INCLUDE_TFFS
  1949. #ifdef BROADCOM_BSP
  1950.     printf (" flash");
  1951. #else
  1952.     printf (" tffs");
  1953. #endif
  1954. #endif  /* INCLUDE_TFFS */
  1955. #ifdef  INCLUDE_TSFS_BOOT
  1956.     printf (" tsfs");
  1957. #endif  /* INCLUDE_TSFS_BOOT */
  1958.     printf ("n");
  1959.     }
  1960. /******************************************************************************
  1961. *
  1962. * bootLoadModuleInflate
  1963. * by Curt McDowell, Broadcom Corp. 08/27/99
  1964. *
  1965. * Like bootLoadModuleInflate, except passes the data through inflate() first.
  1966. * This is a pain in the neck and a memory hog because bootLoadModule wants
  1967. * a file descriptor.  We use a hack described on the VxWorks support
  1968. * groups, which is to create a memDev on the decompressed data buffer,
  1969. * open it as a file, and pass that fd to bootLoadModule.
  1970. *
  1971. * TODO: don't call memDrv() if already initialized
  1972. *  delete mem: drive after load is complete
  1973. * These things may cause multiple calls to this routine to fail.
  1974. *
  1975. * RETURNS: OK or ERROR
  1976. */
  1977. #define DECOMP_BUF_SIZE (RAM_HIGH_ADRS - RAM_LOW_ADRS)
  1978. #define COMP_BUF_SIZE (DECOMP_BUF_SIZE / 3)
  1979. STATUS bootLoadModuleInflate(int zfd, FUNCPTR *pEntry)
  1980. {
  1981.     char *imageBuf = NULL;
  1982.     char *compBuf = NULL;
  1983.     int fd = -1;
  1984.     int rv = ERROR;
  1985.     int compSize, r;
  1986.     extern STATUS inflate(char *src, char *dst, int src_size);
  1987.     if ((compBuf = malloc(COMP_BUF_SIZE)) == NULL) {
  1988. printErr("Not enough memory for image buffern");
  1989. goto done;
  1990.     }
  1991.     compSize = 0;
  1992.     while ((r = read(zfd, /* Read loop required to support network */
  1993.      compBuf + compSize,
  1994.      COMP_BUF_SIZE - compSize)) > 0)
  1995. compSize += r;
  1996.     if (r < 0) {
  1997. printErr("Read failed: errno = %dn", errnoGet());
  1998. goto done;
  1999.     }
  2000.     if (compSize == COMP_BUF_SIZE) {
  2001. printErr("Compressed image too largen");
  2002. goto done;
  2003.     }
  2004.     printErr("Uncompressing %d bytes... ", compSize);
  2005.     if ((imageBuf = malloc(DECOMP_BUF_SIZE)) == NULL) {
  2006. printErr("Not enough memory for decompression buffern");
  2007. goto done;
  2008.     }
  2009.     if ((r = inflate(compBuf, imageBuf, compSize)) < 0) {
  2010. printErr("nUncompress failedn");
  2011. goto done;
  2012.     }
  2013.     printErr("nLoading image... ");
  2014.     memDrv();
  2015.     memDevCreate("mem:", imageBuf, DECOMP_BUF_SIZE);
  2016.     if ((fd = open("mem:0", O_RDONLY, 0)) < 0) {
  2017. printErr("nCannot open memory device.n");
  2018. goto done;
  2019.     }
  2020.     if (bootLoadModule(fd, pEntry) != OK) {
  2021. printErr("nError loading: errno = %dn", errnoGet());
  2022. goto done;
  2023.     }
  2024.     printErr("n");
  2025.     rv = OK;
  2026.  done:
  2027.     if (fd >= 0)
  2028. close(fd);
  2029.     if (imageBuf)
  2030. free(imageBuf);
  2031.     if (compBuf)
  2032. free(compBuf);
  2033.     return rv;
  2034. }
  2035. /*******************************************************************************
  2036. *
  2037. * bootLoad - load a module into memory
  2038. *
  2039. * RETURNS: OK or ERROR
  2040. */
  2041. LOCAL STATUS bootLoad 
  2042.     (
  2043.     char *   bootString,
  2044.     FUNCPTR *pEntry
  2045.     )
  2046.     {
  2047.     BOOT_PARAMS params;
  2048. #ifdef  INCLUDE_SCSI_BOOT
  2049. #ifdef  INCLUDE_SCSI2
  2050.      SCSI_OPTIONS options;
  2051.      UINT which;
  2052.      int devBusId;
  2053. #endif  /* INCLUDE_SCSI2 */
  2054. #endif  /* INCLUDE_SCSI_BOOT */
  2055. #ifdef  INCLUDE_NETWORK
  2056.     char nad [20]; /* host's network internet addr */
  2057.     int netmask = 0; /* temporary storage */
  2058.     int  result;  /* classification of address string */
  2059.     unsigned long  leaseLen;  /* lease length field (optional) */
  2060. #ifdef INCLUDE_DHCPC
  2061.     DHCP_LEASE_DATA dhcpLease;
  2062. #endif  /* INCLUDE_DHCPC */
  2063.     char buf [30]; /* string of netmask and timestamps */
  2064.     char  netDev [BOOT_DEV_LEN + 1];
  2065.     char  bootDev [BOOT_DEV_LEN];
  2066.     BOOL backplaneBoot;
  2067.     char * pBootAddr;
  2068.     BOOL  attached = FALSE; /* driver is attached */
  2069. #ifdef INCLUDE_END
  2070.     char muxDevName[8];
  2071. #endif /* INCLUDE_END */
  2072. #endif  /* INCLUDE_NETWORK */
  2073.     /* copy bootString to low mem address, if specified */
  2074.     if ((bootString != NULL) && (*bootString != EOS))
  2075. strcpy (BOOT_LINE_ADRS, bootString);
  2076.     /* interpret boot command */
  2077.     if (usrBootLineCrack (BOOT_LINE_ADRS, &params) != OK)
  2078. return (ERROR);
  2079.     /* Display boot parameters */
  2080. #ifdef BROADCOM_BSP
  2081.     printf("nboot string          : %d", bootActiveString);
  2082. #endif
  2083.     bootParamsShow (BOOT_LINE_ADRS);
  2084.     /* set our processor number: may establish vme access, etc. */
  2085.     sysFlags = params.flags;
  2086.     sysProcNumSet (params.procNum);
  2087. #ifdef INCLUDE_SCSI_BOOT
  2088.     /*
  2089.      * initialize either the SCSI1 or SCSI2 interface; initialize SCSI2 when
  2090.      * the SCSI2 interface is available.
  2091.      */
  2092. #ifndef INCLUDE_SCSI2
  2093.     scsi1IfInit ();
  2094. #else
  2095.     scsi2IfInit ();
  2096. #endif
  2097.     if (strncmp (params.bootDev, "scsi", 4) == 0)
  2098. {
  2099. int bootDevId = NONE;
  2100. int bootDevLUN = NONE;
  2101. #ifdef INCLUDE_SCSI2
  2102.         /* Set all devices to asynchronous data transfer */
  2103.         which = SCSI_SET_OPT_XFER_PARAMS;
  2104.         options.maxOffset = 0;
  2105.         options.minPeriod = SCSI_SYNC_XFER_MIN_PERIOD;
  2106.         for (devBusId = 0; devBusId < 8; devBusId++)
  2107.             {
  2108.             scsiTargetOptionsSet (pSysScsiCtrl, devBusId, &options, which);
  2109.             }
  2110. #endif /* INCLUDE_SCSI2 */
  2111. /* check for absence of bus ID and LUN, in which case
  2112.  * auto-configure and display results
  2113.  */
  2114. if (strlen (params.bootDev) == 4)
  2115.     {
  2116.     if (!scsiInitialized)
  2117. {
  2118.      if (sysScsiInit () == ERROR)
  2119.     {
  2120.     printErr ("Could not initialize SCSI.n");
  2121.     return (ERROR);
  2122.     }
  2123. scsiInitialized = TRUE;
  2124. }
  2125.     scsiAutoConfig (pSysScsiCtrl);
  2126.     scsiShow (pSysScsiCtrl);
  2127.     /* return ERROR to indicate that no file was loaded */
  2128.     return (ERROR);
  2129.     }
  2130. sscanf (params.bootDev, "%*4s%*c%d%*c%d", &bootDevId, &bootDevLUN);
  2131. if (scsiLoad (bootDevId, bootDevLUN, params.bootFile, pEntry) != OK)
  2132.     {
  2133.     printErr ("nError loading file: errno = 0x%x.n", errno);
  2134.     return (ERROR);
  2135.     }
  2136. return (OK);
  2137. }
  2138. #endif /* INCLUDE_SCSI_BOOT */
  2139. #ifdef  INCLUDE_FD
  2140.     if (strncmp (params.bootDev, "fd", 2) == 0)
  2141. {
  2142. int type = 0;
  2143. int drive = 0;
  2144. if (strlen (params.bootDev) == 2)
  2145.     return (ERROR);
  2146. else
  2147.     sscanf (params.bootDev, "%*2s%*c%d%*c%d", &drive, &type);
  2148. if (fdLoad (drive, type, params.bootFile, pEntry) != OK)
  2149.     {
  2150.     printErr ("nError loading file: errno = 0x%x.n", errno);
  2151.     return (ERROR);
  2152.     }
  2153. return (OK);
  2154. }
  2155. #endif  /* INCLUDE_FD */
  2156. #ifdef INCLUDE_IDE
  2157.     if (strncmp (params.bootDev, "ide", 3) == 0)
  2158. {
  2159. int type = 0;
  2160. int drive = 0;
  2161. if (strlen (params.bootDev) == 3)
  2162.     return (ERROR);
  2163. else
  2164.     sscanf (params.bootDev, "%*3s%*c%d%*c%d", &drive, &type);
  2165. if (ideLoad (drive, type, params.bootFile, pEntry) != OK)
  2166.     {
  2167.     printErr ("nError loading file: errno = 0x%x.n", errno);
  2168.     return (ERROR);
  2169.     }
  2170. return (OK);
  2171. }
  2172. #endif /* INCLUDE_IDE */
  2173. #ifdef INCLUDE_ATA
  2174.     if (strncmp (params.bootDev, "ata", 3) == 0)
  2175. {
  2176. int ctrl  = 0;
  2177. int drive = 0;
  2178. if (strlen (params.bootDev) == 3)
  2179.     return (ERROR);
  2180. else
  2181.     sscanf (params.bootDev, "%*3s%*c%d%*c%d", &ctrl, &drive);
  2182. if (ataLoad (ctrl, drive, params.bootFile, pEntry) != OK)
  2183.     {
  2184.     printErr ("nError loading file: errno = 0x%x.n", errno);
  2185.     return (ERROR);
  2186.     }
  2187. return (OK);
  2188. }
  2189. #endif /* INCLUDE_ATA */
  2190. #ifdef INCLUDE_PCMCIA
  2191.     pcmciaInit (); /* init PCMCIA Lib */
  2192.     if (strncmp (params.bootDev, "pcmcia", 6) == 0)
  2193. {
  2194. int sock = NONE;
  2195. if (strlen (params.bootDev) == 6)
  2196.     return (ERROR);
  2197. else
  2198.     sscanf (params.bootDev, "%*6s%*c%d", &sock);
  2199. if (pcmciaLoad (sock, params.bootFile, pEntry) == OK)
  2200.     return (OK);
  2201. /* fall through if the PC card is not a block device.
  2202.  * let's try to boot it from an ethernet device.
  2203.  */
  2204. }
  2205. #endif /* INCLUDE_PCMCIA */
  2206. #ifdef  INCLUDE_TFFS
  2207.     if (strncmp (params.bootDev, "tffs", 4) == 0)
  2208. {
  2209. int drive = 0;
  2210. int removable = 0;
  2211. if (strlen (params.bootDev) == 4)
  2212.     return (ERROR);
  2213. else
  2214.     sscanf (params.bootDev, "%*4s%*c%d%*c%d", &drive, &removable);
  2215. /* tffsLoad () should be after pcmciaInit () */
  2216. if (tffsLoad (drive, removable, params.bootFile, pEntry) != OK)
  2217.     {
  2218.     printErr ("nError loading file: errno = 0x%x.n", errno);
  2219.     return (ERROR);
  2220.     }
  2221. return (OK);
  2222. }
  2223. #ifdef BROADCOM_BSP
  2224.     /* BCM BSP has TFFS on DOC, uses device name "flash */
  2225.     if (strncmp (params.bootDev, "flash", 5) == 0)
  2226.         {
  2227.         if (tffsLoad (0, 0, params.bootFile, pEntry) != OK)
  2228.             {
  2229.             printErr ("nError loading file: errno = 0x%x.n", errno);
  2230.             return (ERROR);
  2231.             }
  2232.         return (OK);
  2233.         }
  2234. #endif  /* BROADCOM_BSP */
  2235. #endif  /* INCLUDE_TFFS */
  2236. #ifdef  INCLUDE_TSFS_BOOT
  2237.     if (strncmp (params.bootDev, "tsfs", 4) == 0)
  2238. {
  2239. if (tsfsLoad (params.bootFile, pEntry) != OK)
  2240.     {
  2241.     printErr ("nError loading file: errno = 0x%x.n", errno);
  2242.     return (ERROR);
  2243.     }
  2244. return (OK);
  2245. }
  2246. #endif  /* INCLUDE_TSFS_BOOT */
  2247. #ifndef  INCLUDE_NETWORK
  2248.     printf ("nError loading file: networking code not present.n");
  2249.     return (ERROR);
  2250.     }
  2251. #else  /* INCLUDE_NETWORK */
  2252.     /* start the network */
  2253.     /* initialize the generic socket library */
  2254.     if (sockLibInit (NUM_FILES) == ERROR)
  2255.         return (ERROR);
  2256. #if defined(INCLUDE_STREAMS) || defined(INCLUDE_STREAMS_ALL)
  2257.     if (usrStrmInit() == ERROR)         /* init Streams subsystem */
  2258.         return (ERROR);
  2259. #endif   
  2260. #if defined(INCLUDE_BSD) || defined(INCLUDE_BSD_SOCKET)
  2261.     /* add the BSD socket library interface */
  2262.     if (sockLibAdd ((FUNCPTR) bsdSockLibInit, AF_INET_BSD, AF_INET) == ERROR)
  2263.         return (ERROR);
  2264.     if (sockLibAdd ((FUNCPTR) bsdSockLibInit, AF_ROUTE, AF_ROUTE) == ERROR)
  2265.         return (ERROR);
  2266. #endif  /* INCLUDE_BSD || INCLUDE_BSD_SOCKET */
  2267.     /* install default socket library interface */
  2268. #ifndef DEFAULT_STREAMS_SOCKET
  2269.     if (sockLibAdd ((FUNCPTR) bsdSockLibInit, AF_INET, AF_INET) == ERROR)
  2270.         return (ERROR);
  2271. #endif  /* DEFAULT_STREAMS_SOCKET */
  2272.  
  2273.     hostTblInit (); /* initialize host table */
  2274.     usrNetProtoInit ();         /* initialize various protocols */
  2275.     netLibInit ();
  2276. #ifdef INCLUDE_PPP
  2277. #ifdef INCLUDE_PPP_CRYPT 
  2278.     cryptRtnInit (&pppCryptRtn); /* install crypt() routine */ 
  2279. #endif /* INCLUDE_PPP_CRYPT */
  2280. #endif /* INCLUDE_PPP */
  2281.     /* attach and configure boot interface */
  2282.     if (strncmp (params.bootDev, "ppp", 3) == 0)
  2283.         {
  2284.         /* booting via ppp */
  2285.         if (usrPPPInit (params.bootDev, params.unitNum, params.ead, 
  2286.                         ((params.gad[0] == EOS)? params.had : params.gad)) 
  2287.                         == ERROR)
  2288.             return (ERROR);
  2289.         }
  2290.     else if (strncmp (params.bootDev, "sl", 2) == 0)
  2291. {
  2292.    if (usrSlipInit (params.bootDev, params.unitNum, params.ead, 
  2293.                          ((params.gad[0] == EOS)? params.had : params.gad)) 
  2294.                          == ERROR)
  2295.     return (ERROR);
  2296.         }
  2297.     else
  2298. {
  2299.         strncpy (bootDev, params.bootDev, sizeof (bootDev));
  2300. if ((strncmp (params.bootDev, "bp", 2) != 0) &&
  2301.             (strncmp (params.bootDev, "sm", 2) != 0))
  2302.     {
  2303.     pBootAddr = params.ead;
  2304.     backplaneBoot = FALSE;
  2305.     }
  2306.         else
  2307.     {
  2308.     if (sysProcNumGet () == 0)
  2309. {
  2310.                 printf (
  2311.                   "Error: processor number must be non-zero to boot from bpn");
  2312.         return (ERROR);
  2313.                 }
  2314.     if (usrBpInit (bootDev, params.unitNum, 0) == ERROR)
  2315. return (ERROR);
  2316.     pBootAddr = params.bad;
  2317.     backplaneBoot = TRUE;
  2318.     }
  2319.         /* Save requested lease length, if any. Ignore lease origin value. */
  2320.         result = bootLeaseExtract (pBootAddr, &leaseLen, NULL);
  2321.         if (result < 0)
  2322.             {
  2323.             printf ("Error reading target address information.n");
  2324.             return (ERROR);
  2325.             }
  2326.         /* Handle any lease information attached to the address entry. */
  2327.         if (result == 2)
  2328.             {
  2329.             /* 
  2330.              * The current address contains both a duration value and a start
  2331.              * time, indicating that it was assigned by a DHCP server.
  2332.              */
  2333.             if (leaseLen != (ULONG)~0)
  2334.                 {
  2335.                 /* Handle a finite address assignment. */
  2336.                 if (sysFlags & SYSFLG_AUTOCONFIG)
  2337.                     *pBootAddr = EOS;    /* Remove for later replacement. */
  2338.                 else
  2339.                     {
  2340.                     /* 
  2341.                      * Technically, this address is invalid since it contains
  2342.                      * a finite interval that requires DHCP for verification
  2343.                      * and the automatic configuration flag is not set.
  2344.                      * However, this situation can only occur if caused 
  2345.                      * deliberately by the user. So, just ignore the timing
  2346.                      * information and assign the address permanently.
  2347.                      */
  2348.                     result = 0;    /* Prevents restoration of time values. */
  2349.                     }
  2350.                 }
  2351.             }
  2352. #ifdef INCLUDE_DHCPC
  2353.         /* Set the DHCP lease information, if needed. */
  2354.         if (sysFlags & SYSFLG_AUTOCONFIG)
  2355.             {
  2356.             /* Save the requested lease length if entered by the user. */
  2357.             if (result == 1)
  2358.                 dhcpLease.lease_duration = leaseLen;
  2359.             else
  2360.                 {
  2361.                 /* 
  2362.                  * The lease length is either not present or left over from
  2363.                  * an earlier lease. Use the default value.
  2364.                  */
  2365.                 dhcpLease.lease_duration = DHCPC_DEFAULT_LEASE;
  2366.                 }
  2367.             dhcpLease.lease_origin = 0;
  2368.             }
  2369. #endif  /* INCLUDE_DHCPC */
  2370.         netmask = 0;
  2371.         bootNetmaskExtract (pBootAddr, &netmask);
  2372. /* start of network attachment code block */
  2373. #ifdef INCLUDE_END
  2374. /* Try an END device first */
  2375.         pCookie=findCookie(params.unitNum, bootDev);
  2376. if (!attached && (pCookie != NULL))
  2377.     {
  2378.             if (muxDevStart (pCookie) != OK)
  2379.                 {
  2380.                 printf("Failed to start device %sn", bootDev);
  2381.                 return (ERROR);
  2382.                 }
  2383. #if 0
  2384.     if (muxIoctl (pEnd, EIOCGMIB2, (char *)&endM2Tbl)
  2385.     == ERROR)
  2386. return (ERROR);
  2387. #endif
  2388.     /* Add our default address resolution functions. */
  2389.     muxAddrResFuncAdd (M2_ifType_ethernet_csmacd, 0x800, ipEtherResolvRtn);
  2390.     if (ipAttach (params.unitNum, bootDev) != OK)
  2391. {
  2392. printf ("Failed to attach TCP/IP to device %s", muxDevName);
  2393. return (ERROR);
  2394. }
  2395.     printf ("Attached TCP/IP interface to %s%d.n", bootDev,
  2396.      params.unitNum);
  2397.     attached = TRUE;
  2398.     }
  2399. #endif /*INCLUDE_END*/
  2400. #ifdef INCLUDE_BSD
  2401. /* Try a BSD 4.4 device attach sequence */
  2402.         if (!attached)
  2403.     {
  2404.     if (usrNetIfAttach (bootDev, params.unitNum, pBootAddr) == OK)
  2405. {
  2406. attached = TRUE;
  2407. }
  2408.     else
  2409. return ERROR;
  2410.     }
  2411.             
  2412. #endif /* INCLUDE_BSD */
  2413. if (!attached)
  2414.     return ERROR; /* attachment failed */
  2415.         /*
  2416.          * Now that any extra parameters following an "=" sign have
  2417.          * been removed (e.g. the pcmcia socket number), build the
  2418.          * network device string by appending the unit number to the
  2419.          * device name.
  2420.          */
  2421.         sprintf (netDev, "%s%d", bootDev, params.unitNum);
  2422.         if ( (sysFlags & SYSFLG_AUTOCONFIG) || (sysFlags & SYSFLG_PROXY) ||
  2423.             (netmask == 0))
  2424.             {
  2425.             struct ifnet * pIf;
  2426.                 
  2427.             /* Initialize the boot device */
  2428.                 
  2429.             if ( (pIf = ifunit (netDev)) == NULL) 
  2430.                 {
  2431.                 printf ("invalid device "%s"n", netDev);
  2432.                 return (ERROR); /* device not attached */
  2433.                 }
  2434.                 
  2435.             if (pIf->if_init != NULL)
  2436.                 {
  2437.                 if ( (*pIf->if_init) (pIf->if_unit) != 0)
  2438.                     {
  2439.                     printf ("initialization failed for device "%s"n",netDev);
  2440.                     return (ERROR);
  2441.                     }
  2442.                 }
  2443.             }
  2444. #ifdef INCLUDE_SM_NET
  2445.   if (backplaneBoot)
  2446.     {
  2447.     if ((params.bad [0] == EOS) &&
  2448.      (strncmp (bootDev, "sm", 2) == 0) &&
  2449. (smNetInetGet (netDev, params.bad, NONE) == OK))
  2450.      printf ("Backplane inet address: %sn", params.bad);
  2451.     if (params.bad [0] == EOS) 
  2452.      {
  2453.      printf ("no backplane address specifiedn");
  2454. return (ERROR);
  2455. }
  2456.     if ((sysFlags & SYSFLG_AUTOCONFIG) && !(sysFlags & SYSFLG_PROXY))
  2457.         {
  2458. #ifdef INCLUDE_DHCPC
  2459.         printf ("Warning! DHCP over backplane may need proxy arpn");
  2460. #else
  2461.         printf ("Warning! BOOTP over backplane may need proxy arpn");
  2462. #endif
  2463.         }
  2464.     }
  2465. #endif /* INCLUDE_SM_NET */
  2466.         if (sysFlags & SYSFLG_PROXY)
  2467.             {
  2468. #ifdef INCLUDE_PROXY_CLIENT
  2469.             printf ("registering proxy client: %s...", pBootAddr);
  2470.             if (proxyReg (netDev, pBootAddr) == ERROR)
  2471.                 {
  2472.                 printf ("failed: error %xn", errno);
  2473.                 return (ERROR);
  2474.                 }
  2475.             printf ("done.n");
  2476. #else /* INCLUDE_PROXY_CLIENT */
  2477.             printf ("proxy client requested but not included.n");
  2478.             return (ERROR);
  2479. #endif /* INCLUDE_PROXY_CLIENT */
  2480.             }
  2481.         /* Get boot parameters over the network if requested. */
  2482.         if (sysFlags & SYSFLG_AUTOCONFIG)
  2483.             {
  2484.             if (bootpGet (netDev, pBootAddr, params.bootFile, params.had,
  2485.                           &netmask) == ERROR)
  2486.                 return (ERROR);
  2487. #ifdef INCLUDE_DHCPC
  2488.             if (dhcpGet (netDev, pBootAddr, params.bootFile, params.had,
  2489.                          &netmask, &dhcpLease) == ERROR)
  2490.                 return (ERROR);
  2491. #endif      /* INCLUDE_DHCPC */
  2492.             }
  2493.         /* configure the device */
  2494.         if (usrNetIfConfig (bootDev, params.unitNum, pBootAddr, 
  2495.                             (char *) NULL, netmask) != OK)
  2496.             return (ERROR);
  2497.         if (netmask == 0)
  2498.             {
  2499.             (void) icmpMaskGet (netDev, pBootAddr, backplaneBoot ?
  2500.                                 NULL : params.had, &netmask);
  2501.             if (netmask != 0)
  2502.                 {
  2503.                 sprintf (bootDev, "%s%d", bootDev, params.unitNum);
  2504.                 ifMaskSet (bootDev, netmask);
  2505.                 printf ("Subnet Mask: 0x%xn", netmask);
  2506.                 }
  2507.             }
  2508.   /* get gateway address */
  2509. #ifdef INCLUDE_SM_NET
  2510. if (backplaneBoot && (params.gad [0] == EOS) && 
  2511.     !(sysFlags & SYSFLG_PROXY))
  2512.     {
  2513.         struct in_addr host; /* Internet Address */
  2514.         struct in_addr backpl; /* Internet Address */
  2515.         host.s_addr = inet_addr (params.had);
  2516.         backpl.s_addr = inet_addr (params.bad);
  2517.         if ( in_netof(host) != in_netof(backpl) )
  2518.         {
  2519.         /* We can get the gateway address (assumed to be master)  */
  2520.         if ((strncmp (bootDev, "sm", 2) == 0) && 
  2521.             (smNetInetGet (netDev, params.gad, 0) == OK))
  2522.     printf ("Gateway inet address: %sn", params.gad);
  2523. }
  2524.     }
  2525. #endif /* INCLUDE_SM_NET */
  2526.         if (netmask != 0) /* reconstruct address with mask */
  2527.             {
  2528.             sprintf (buf, ":%x", netmask);
  2529.             strcat  (pBootAddr, buf);
  2530.             }
  2531.         /* 
  2532.          * If a value was specified for the requested lease length and the 
  2533.          * address information was not replaced by automatic configuration, 
  2534.          * restore that value for use by later reboots.
  2535.          */
  2536.         if (!(sysFlags & SYSFLG_AUTOCONFIG) && result == 1)
  2537.             {
  2538.             /* 
  2539.              * The value is ignored if <result> is 2, since that is only
  2540.              * possible at this point for permanent DHCP assignments, 
  2541.              * which need no special processing by later reboots.
  2542.              */
  2543.             if (netmask == 0)  /* Create empty netmask field. */
  2544.                 sprintf (buf, "::%lx", leaseLen);
  2545.             else  /* Append requested lease length to netmask. */
  2546.                 sprintf(buf, ":%lx", leaseLen);
  2547.             strcat (pBootAddr, buf);
  2548.             }
  2549. #ifdef INCLUDE_DHCPC
  2550.         /* 
  2551.          * If the target IP address was assigned by a DHCP server, append
  2552.          * the lease times. The presence of those fields in the address string 
  2553.          * will cause the runtime image to renew the corresponding lease.
  2554.          */
  2555.         if (sysFlags & SYSFLG_AUTOCONFIG)
  2556.             {
  2557.             /* Add lease origin and lease duration if needed. */
  2558.             if (dhcpcBindType == DHCP_NATIVE)
  2559.                 {
  2560.                 if (netmask == 0)  /* Create empty netmask field. */
  2561.                     sprintf (buf, "::%lx:%lx", dhcpLease.lease_duration, 
  2562.                                                dhcpLease.lease_origin);
  2563.                 else  /* Append lease timestamps to netmask. */
  2564.                     sprintf(buf, ":%lx:%lx", dhcpLease.lease_duration, 
  2565.                                              dhcpLease.lease_origin);
  2566.                 strcat (pBootAddr, buf);
  2567.                 }
  2568.             }
  2569. #endif    /* INCLUDE_DHCPC */
  2570.         bootStructToString (BOOT_LINE_ADRS, &params);
  2571.         }
  2572.     usrNetIfAttach ("lo", 0, "127.0.0.1");
  2573.     usrNetIfConfig ("lo", 0, "127.0.0.1", "localhost", 0);
  2574.     /* if a gateway was specified, extract the network part of the host's
  2575.      * address and add a route to this network
  2576.      */
  2577.     if (params.gad[0] != EOS)
  2578.         {
  2579. inet_netof_string (params.had, nad);
  2580. #ifdef BROADCOM_BSP
  2581.         /* Make the gateway the default route */
  2582.         routeAdd ("0.0.0.0", params.gad);
  2583. #else
  2584.         routeAdd (nad, params.gad);
  2585. #endif
  2586.         }
  2587.     /* associate hostName with the specified host address */
  2588.     hostAdd (params.hostName, params.had);
  2589. #ifdef BROADCOM_BSP
  2590.     {
  2591.         extern void sysBindFix (void);
  2592.         sysBindFix ();                   /* See sysLib.c */
  2593.     }
  2594. #endif
  2595.     /* load specified file */
  2596.     if (netLoad (params.had, params.bootFile, params.usr,
  2597.  params.passwd, pEntry) != OK)