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

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