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

VxWorks

开发平台:

C/C++

  1. /* bootConfig.c - system configuration module for boot ROMs */
  2. /*
  3.  * Copyright (c) 1984-2006 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 15k,18jul06,md   fixed warning about iosFdValue (WIND00039006)
  13. 15j,07jul06,pcs  Updated call to memInit to take the partition options as the
  14.                  third parameter.
  15. 15i,08may06,dtr  SPR#120513 - check status of sysNetMacNVRamAddrGet.
  16. 15h,29mar06,mdo  HEnd drivers do not use endDevTbl to display boot devices
  17. 15i,31may06,h_k  reverted the change for WIND00055378 in mEnet called by "N"
  18.                  command to keep backward compatibility.
  19. 15h,26may06,wap  Don't byte swap MAC addresses (WIND00055378)
  20. 15g,09feb06,jlk  Updated iosInit() call to take the IOS_POSIX_PSE52_MODE
  21.                  parameter.
  22. 15f,13jan06,agf  move symbols from sysLib to [usr,boot]Config (SPR 114346)
  23. 15e,06sep05,h_k  removed compressedEntry. (SPR #111954)
  24. 15d,26aug05,dlk  Remove extra call to usrKernelCoreInit().
  25. 15c,27aug05,pcm  added xbdBlkDevLibInit()
  26. 15b,11aug05,pcm  added conditional directives for INCLUDE_DOSFS_MAIN
  27. 15a,10aug05,pcm  added dosFsCacheLibInit()
  28. 14z,04aug05,dcc  added DOSFS_DEFAULT_CACHE_SIZE parameter to usrDosfsInit()
  29. 14y,03aug05,pcm  added parameters to usrDosfsInit()
  30. 14x,15aug05,vvv  fixed warnings when DHCP is included
  31. 14w,13aug05,vvv  fixed bootrom build error
  32. 14v,04aug05,wap  add usrKernelCoreInit() to usrRoot() (SPR# 110587)
  33. 14u,14jun05,pcm  XBD'ized dos boot process
  34. 14t,08jul05,kk   add usrKernelCoreInit() to usrRoot() (SPR# 110587)
  35. 14s,04jul05,pcm  fixed scsi compile error
  36. 14r,27jun05,pcm  Renamed fsEventUtil.h to fsEventUtilLib.h
  37. 14q,23jun05,jlk  Rename of fsPathWaitLibInit() to fsEventUtilLibInit().
  38. 14p,23jun05,jlk  Added fsPathWaitLibInit().
  39. 14o,16jun05,yvp  Deleted call to jobLibTaskInit.
  40. 14n,26may05,ijm  clear bootFile in dhcpcConfigSet(), SPR#109627
  41. 14m,11may05,dlk  Use the configlette usrNetApplUtil.c rather than defining
  42.  a special version of usrNetApplUtilInit() here. SPR #108879.
  43.  Fix hashLibInit() warning. Replace #include "..." with
  44.  #include <...> where appropriate..
  45. 14l,15mar05,dlk  Do not define INCLUDE_OBJ_OPEN when INCLUDE_APP_LOG_UTIL is
  46.                  defined (SPR #104991).
  47. 14k,09feb05,jmt  SPR 105999 & 106000: Fix MIPS Bootrom issue.
  48.                  Added prototype for palInit().
  49. 14j,17feb05,tam  Updated Copyright to 2005
  50. 14i,09feb05,wap  Don't include net sysctl support in bootrom by default
  51. 14h,02feb05,vvv  fixed warning
  52. 14g,20nov04,pes  SPR 104358: Add '#define's of INCLUDE_APPL_LOG when
  53.                  INCLUDE_NETWORK is defined, and INCLUDE_SEM_BINARY and
  54.  INCLUDE_OBJ_OPEN when INCLUDE_APPL_LOG is defined.
  55. 14f,29oct04,dlk  Documentation: remove extraneous () from title line of
  56.                  usrNetApplUtilInit() routine. Make routine NOMANUAL.
  57. 14e,13oct04,j_b  fix warnings (SPR 96917)
  58. 14d,13oct04,kk   updated kernelBaseLib.h to private/kernelBaseLibP.h
  59. 14c,11oct04,j_b  added INCLUDE_JOB_TASK and updated excInit () parameter list
  60. 14b,07oct04,pes  Fix Apigen problems caused by 13y. Change registers
  61.                  used in WRS_ASM statements from k0 to $26 to permit
  62.          compilation with GNU.
  63. 14a,04oct04,pes  Add MIPS specific routines used to stub MMU functions
  64.                  when building bootroms with .o files built for mapped kernels.
  65. 13z,30sep04,mig  Clear bss segment before cacheLibInit()
  66. 13y,30sep04,tam  removed INCLUDE_EDR_KH
  67. 13x,28sep04,dbt  Fixed TSFS boot support.
  68. 13w,23sep04,ann  merged from networking: App Log Util changes, hostname
  69.                  initialization, vxWorks 5x equivalent PPP changes, scalability
  70.                  changes.
  71. 13v,20jul04,rec  implement 'M' command (SPR #93020)
  72. 13u,26aug04,mem  obtain usrSysctl.c from config/comps/src instead of src/config
  73. 13t,10aug04,kk   renamed rtpBaseLib kernelBaseLib
  74. 13t,28jul04,md   removed INCLUDE_EDR_SYMBOLIC, INCLUDE_EDR_POLICIES
  75. 13s,29jun04,job  Removed usrHwSysctl.c inclusion
  76. 13r,28jun04,job  Changed INCLUDE_SYSCTL_API to INCLUDE_SYSCTL
  77. 13q,14jun04,dlk  removed SOCK_FD_MAX argument to sockLibInit(). Fixed
  78.                  some compiler warnings
  79. 13p,14jun04,job  renamed usrSysctl2 to usrSysctl
  80. 13o,12jun04,to   re-add usrSysctl2.c
  81. 13n,03jun04,rec  change usrSysctl.c to usrHwSysctl.c
  82. 13m,01jun04,mem  added call to palInit().
  83. 13l,08jun04,elg  Fix dependencies issues when including TSFS boot method.
  84. 13k,04jun04,job  Added define of INCLUDE_NET_SYSCTL_API to fix network build
  85. 13j,10may04,rec  add call for usrSysctl
  86. 13i,21may04,job  Updated SYSCTL inclusion (split between base & network)
  87.                  Fixed usrNetworkInit to only call sysctlInit() if
  88.                  INCLUDE_NET_SYSCTL_API is defined.
  89. 13h,15mar04,md   Add ED&R options to boot menu
  90. 13g,21apr04,spm  added INCLUDE_SM_NET to boot with shared memory slaves
  91. 13f,14apr04,pch  SPR 95355: enable interrupts in root task after MMU is set up.
  92.                  Fix warnings re constant conditionals involving NUM_TTY.
  93. 13e,07apr04,j_b  add startType argument to entry point called by go()
  94. 13d,05apr04,tra  fixed SPR#95129, bootrom image fails to get a lease
  95.                  after rebooting
  96. 13c,20feb04,vvv  updated for socket/sysctl separation changes
  97. 13b,18feb04,rp   need bpf if dhcp/bootp is included
  98. 13a,06jan04,rp   fixed SPR 92684
  99. 12z,15dec03,dat  Copyright 2004
  100. 12y,05dec03,jn   Remove references to unsupported object module formats
  101. 12x,26nov03,rp   ppplite changes
  102. 12w,17nov03,rp   header file path update
  103. 12w,17nov03,aim  added edrStub
  104. 12x,20nov03,rhe  UBM Base 6 Itn 3 Merge from WRAMP branch
  105. 12w,17nov03,rhe  Added netBuf Pool files &  init routine
  106. 12v,20jun03,t_m  add INCLUDE_PCCARD
  107. 01m,15sep03,asr  updated from clarinet VOB after accordion merge
  108. 01l,12sep03,vvv  updated include paths for headers and configlettes
  109. 01k,08sep03,vvv  updated for merge from Accordion
  110. 01j,18aug03,htm  added support for BootP v4 Client
  111. 01i,17jun03,vvv  fixed to print messages by default and allow booting even if
  112.                  target name not specified in boot parameters (SPR #88691)
  113. 01h,14may03,vvv  removed adv_net.h
  114. 01g,23apr03,vvv  updated from T2.2.1, ver12u (SPRs 65782, 83157)
  115. 01f,26mar03,vvv  fixed memory pool configuration (SPR #87113); fixed warnings
  116. 01e,18mar03,vvv  added DHCPC_DISCOVER_RETRIES (SPR #83246)
  117. 01d,06mar03,vvv  fixed netmask problem
  118. 01c,06mar03,vvv  added hostTblInit()
  119. 01b,06mar03,vvv  call usrNetHostSetup() only if the component is included
  120. 01a,28feb03,vvv  copied from T2.2, ver12q; modified for Clarinet
  121. */
  122. /*
  123. DESCRIPTION
  124. This is the WRS-supplied configuration module for the VxWorks boot ROM.
  125. It is a stripped-down version of usrConfig.c, having no VxWorks shell or
  126. debugging facilities.  Its primary function is to load an object module
  127. over the network with RSH, FTP or TFTP.  Additionally, a simple set of
  128. single letter commands is provided for displaying and modifying memory
  129. contents. Use this module as a starting point for placing applications
  130. in ROM.
  131. */
  132. #include <vxWorks.h>
  133. #include <bootElfLib.h>
  134. #include <bootLib.h>
  135. #include <bootLoadLib.h>
  136. #include <cacheLib.h>
  137. #include <cbioLib.h>
  138. #include <ctype.h>
  139. #include <dosFsLib.h>
  140. #include <hashLib.h>
  141. #include <dpartCbio.h>
  142. #include <errno.h>
  143. #include <errnoLib.h>
  144. #include <fcntl.h>
  145. #include <fioLib.h>
  146. #include <intLib.h>
  147. #include <ioLib.h>
  148. #include <iosLib.h>
  149. #include <loadLib.h>
  150. #include <logLib.h>
  151. #include <memLib.h>
  152. #include <msgQLib.h>
  153. #include <pipeDrv.h>
  154. #include <proxyLib.h>
  155. #include <qLib.h>
  156. #include <qPriBMapLib.h>
  157. #include <rebootLib.h>
  158. #include <rngLib.h>
  159. #include <semLib.h>
  160. #include <stdio.h>
  161. #include <string.h>
  162. #include <sysLib.h>
  163. #include <sysSymTbl.h>
  164. #include <taskHookLib.h>
  165. #include <taskLib.h>
  166. #include <tickLib.h>
  167. #include <trcLib.h>
  168. #include <unistd.h>
  169. #include <usrFdiskPartLib.h>
  170. #include <version.h>
  171. #include <wdLib.h>
  172. #include <private/excLibP.h>
  173. #include <private/jobLibP.h>
  174. #include <private/kernelLibP.h>
  175. #include <private/workQLibP.h>
  176. #include "rawFsLib.h"
  177. #include "fsMonitor.h"
  178. #include "drv/erf/erfLib.h"
  179. #include "drv/manager/device.h"
  180. #include "drv/xbd/xbd.h"
  181. #include "fsEventUtilLib.h"
  182. #include <netCore.h>
  183. #include <netLib.h>
  184. #include <ipLib.h>
  185. #include <protos/tcpLib.h>
  186. #include <protos/udpLib.h>
  187. #include <arpa/inet.h>
  188. #include <hostLib.h>
  189. #include <ftpLib.h>
  190. #include <tftpLib.h>
  191. #include <private/ftpLibP.h>
  192. #include <netDrv.h>
  193. #include <remLib.h>
  194. #include <sockFunc.h>
  195. #include <sockLib.h>
  196. #include <sys/mem_stru.h>
  197. #include <sys/ds_conf.h>
  198. #include <net/route.h>
  199. #include <route/ipRouteLib.h>
  200. #include <private/kernelBaseLibP.h> /* for kernelBaseInit() */
  201. #include <private/isrLibP.h>    /* for isrLibInit() */
  202. #include <hookLib.h>        /* for hookLibInit() */
  203. #include <private/vmLibP.h> /* for VM_PAGE_SIZE_GET() */
  204. #include <pmLib.h>
  205. #include <edrLib.h>
  206. /*
  207.  * The BOOTCONFIG define must be before the inclusion of config.h, as
  208.  * it affects the defaults for inclusion of some components such as TFTP.
  209.  */
  210. #define BOOTCONFIG
  211. #include "config.h"
  212. #include <scsiLib.h>
  213. #ifdef   INCLUDE_NETWORK
  214. #define  INCLUDE_BSD_SOCKET
  215. #define  INCLUDE_SOCKLIB
  216. #define  INCLUDE_DOMAIN_INIT
  217. #define  INCLUDE_SYSCTL
  218. #undef   INCLUDE_NET_SYSCTL
  219. #define  INCLUDE_UNIXLIB
  220. #define  INCLUDE_GTF
  221. #define  INCLUDE_GTF_TIMER_START
  222. #define  INCLUDE_NET_POOL
  223. #define  INCLUDE_NETBUFLIB
  224. #define  INCLUDE_APPL_LOG_UTIL
  225. #endif
  226. #ifdef INCLUDE_DHCPC
  227. #undef INCLUDE_BOOTP
  228. #endif
  229. #ifdef INCLUDE_END
  230. #define INCLUDE_MUX
  231. #endif
  232. #ifdef INCLUDE_ETHERNET
  233. #define INCLUDE_MUX
  234. #endif
  235. #ifdef INCLUDE_BSD_SOCKET
  236. #include <bsdSockLib.h>
  237. #include <net/socketvar.h>
  238. #endif
  239. #ifdef INCLUDE_SYSCTL
  240. #include <sysctlLib.h>
  241. #endif
  242. #ifdef INCLUDE_MUX
  243. #include <muxLib.h>
  244. #endif
  245. #ifdef INCLUDE_END
  246. #include <m2IfLib.h>
  247. #include <endLib.h>
  248. #endif
  249. #if (defined(INCLUDE_DHCPC) || defined(INCLUDE_BOOTP))
  250. #define INCLUDE_BPF
  251. #endif /* INCLUDE_DHCPC.. */
  252. #ifdef INCLUDE_BPF
  253. #include <bpfDrv.h>
  254. #endif
  255. #ifdef  INCLUDE_FLASH_BOOT
  256. #include <bootElfLib.h>
  257. #include <loadElfLib.h>
  258. #include <elf.h>
  259. #include <elftypes.h>
  260. #include "flashDrvLib.h"        /* Flash driver for MBZ */
  261. #include "flashFsLib.h"     /* Flash filesystem driver */
  262. #endif  /* INCLUDE_FLASH_BOOT */
  263. #ifdef INCLUDE_DHCPC
  264. #include <dhcpcBootLib.h>
  265. #include <dhcp/dhcpcCommonLib.h>
  266. #include <inetLib.h>
  267. #endif /* INCLUDE_DHCPC */
  268. #ifdef INCLUDE_BOOTP
  269. #include <bootpLib.h>
  270. #include <inetLib.h>
  271. #endif /* INCLUDE_BOOTP */
  272. #ifdef INCLUDE_PCCARD
  273. #include <drv/pccard/csLib.h>
  274. #endif /* INCLUDE_PCCARD */
  275. #ifdef  INCLUDE_SM_NET
  276. #ifndef  INCLUDE_SMEND
  277. #warning  "INCLUDE_SM_NET requires INCLUDE_SMEND for shared memory driver!"
  278. #endif /* !INCLUDE_SMEND */
  279. #endif /* INCLUDE_SM_NET */
  280. #ifdef INCLUDE_SM_NET
  281. #include <drv/end/smEnd.h>
  282. #endif /* INCLUDE_SM_NET */
  283. #ifdef ETHERNET_MAC_HANDLER
  284. #include "sysNet.h"
  285. #endif /* ETHERNET_MAC_HANDLER */
  286. /* defines */
  287. #ifdef ETHERNET_MAC_HANDLER
  288. #define MAX_MAC_SHOW_BUF_SIZE 40
  289. #define IFG_MAC_SUPPLIED 1 /* remaining boot line identifies new MAC address */
  290. #define IFG_DEV_SUPPLIED 2 /* operator elects to quit the dialog */
  291. #define IFG_OPR_QUIT 3     /* device is selected, but no MAC address */
  292. #define NOTEOS(arg) (*arg!=0 && (*arg!= (char)EOF))
  293. #define SKIPSPACE(arg) while( NOTEOS(arg) && 
  294.                         (isspace ((int) *arg))) arg++
  295. #endif /* ETHERNET_MAC_HANDLER */
  296. #define STREQ(A, B) (strcmp(A, B) == 0 ? 1 : 0)
  297. #define TIMEOUT     7   /* number of seconds before auto-boot */
  298. /* maximum line length for cmd input to 'm' and 'mEnet' routine */
  299. #define MAX_LINE        160
  300. /* maximum line length for bootCmdLoop() command line input */
  301. #define BOOT_CMD_MAX_LINE        BOOT_LINE_SIZE
  302. #define RSHD        514 /* rshd service */
  303. #define DEC     FALSE   /* getArg parameters */
  304. #define HEX     TRUE
  305. #define OPT     TRUE
  306. #define MAX_ADR_SIZE    6
  307. #define DOS_ID_OFFSET                   3
  308. #define FIRST_PARTITION_SECTOR_OFFSET   (0x1be + 8)
  309. #define VXDOS                           "VXDOS"
  310. #define VXEXT                           "VXEXT"
  311. #ifndef    NUM_PARTITIONS_DISK_BOOT
  312. #   define NUM_PARTITIONS_DISK_BOOT    1 /* one partition on the disk */
  313. #endif  /* NUM_PARTITIONS_DISK_BOOT */
  314. #ifndef    PARTITION_DISK_BOOT
  315. #   define PARTITION_DISK_BOOT         1 /* partition mounted during boot */
  316. #endif  /* PARTITION_DISK_BOOT */
  317. void        usrInit ();
  318. IMPORT void     sysInitAlt ();
  319. #if (CPU_FAMILY==MIPS)
  320. IMPORT void     sysGpInit ();
  321. #endif  /* (CPU_FAMILY==MIPS) */
  322. #if (CPU_FAMILY == PPC)
  323. #include <arch/ppc/vxPpcLib.h>  /* for vxMsrGet() and vxMsrSet() */
  324. IMPORT _RType taskMsrDefault;   /* from taskArchLib.c */
  325. #endif  /* (CPU_FAMILY == PPC) */
  326. #ifdef INCLUDE_DHCPC
  327. LOCAL DHCP_LEASE_DATA dhcpLease;
  328. #endif
  329. #undef  INCLUDE_SHOW_ROUTINES       /* keep out kernel show routines */
  330. #undef  INCLUDE_SM_NET_SHOW
  331. #include <usrKernel.c>          /* kernel configuration facility */
  332. /* ED&R stub functions */
  333. #undef INCLUDE_RTP /* RTP support not valid in bootrom's */
  334. #include "../comps/src/edrStub.c"
  335. #ifdef INCLUDE_EDR_PM
  336. #include "../comps/src/usrPmInit.c"
  337. #endif
  338. #ifdef INCLUDE_EDR_ERRLOG
  339. #include "../comps/src/usrEdrInit.c"
  340. #endif
  341. /* imports */
  342. IMPORT char edata [];       /* defined by the loader */
  343. IMPORT char end [];         /* defined by the loader */
  344. #define FREE_MEM_START_ADRS FREE_RAM_ADRS
  345. #ifdef  INCLUDE_INITIAL_MEM_ALLOCATION
  346. #define MEM_POOL_START_ADRS 
  347.         (ROUND_UP(FREE_MEM_START_ADRS, (INITIAL_MEM_ALIGNMENT)) + 
  348.         (INITIAL_MEM_SIZE))
  349. #else   /* INCLUDE_INITIAL_MEM_ALLOCATION */
  350. #define MEM_POOL_START_ADRS FREE_MEM_START_ADRS
  351. #endif  /* INCLUDE_INITIAL_MEM_ALLOCATION */
  352. #ifdef  INCLUDE_TSFS_BOOT       /* boot via Target Server File System */
  353. #if ((WDB_COMM_TYPE == WDB_COMM_SERIAL) && 
  354.     (CONSOLE_TTY == NONE || CONSOLE_TTY == WDB_TTY_CHANNEL))
  355. #define INCLUDE_TSFS_BOOT_VIO_CONSOLE   /* needed for Target Server Console */
  356. #endif
  357. #define INCLUDE_WDB         /* WDB agent needed for TSFS Boot */
  358. #define INCLUDE_WDB_TSFS        /* target-server file system */
  359. #undef  INCLUDE_WDB_BANNER      /* print banner after agent starts */
  360. #undef  INCLUDE_WDB_TTY_TEST        /* test serial line communcation */
  361. #undef  INCLUDE_WDB_START_NOTIFY    /* notify the host of task creation */
  362. #undef  INCLUDE_WDB_USER_EVENT      /* user events handling */
  363. #undef  INCLUDE_WDB_CTXT        /* context control */
  364. #undef  INCLUDE_WDB_FUNC_CALL       /* spawn function as separate task */
  365. #undef  INCLUDE_WDB_GOPHER      /* gopher info gathering */
  366. #undef  INCLUDE_WDB_EXIT_NOTIFY     /* notify the host of task exit */
  367. #undef  INCLUDE_WDB_REG         /* get/set hardware registers */
  368. #undef  INCLUDE_WDB_EVENTPOINTS     /* eventpoints handling */
  369. #undef  INCLUDE_WDB_MEM         /* optional memory services */
  370. #undef  INCLUDE_WDB_BP          /* breakpoint support */
  371. #undef  INCLUDE_WDB_EXC_NOTIFY      /* exception notification */
  372. #include <wdb/wdbEvtLib.h>
  373. #include <usrWdb.c>                     /* WDB agent configuration */
  374. #else   /* INCLUDE_TSFS_BOOT not defined */
  375. #undef INCLUDE_WDB
  376. #endif  /* INCLUDE_TSFS_BOOT */
  377. BOOT_PARAMS sysBootParams;
  378. SYMTAB_ID       statSymTbl;  /* XXX strerror requires it */
  379. /*
  380.  * ################ NETWORK INITIALIZATION #######################
  381.  */
  382. #ifdef INCLUDE_APPL_LOG_UTIL
  383. /*
  384.  * Since bootroms don't include INCLUDE_NBIO_LOG, the
  385.  * default output destination of KERN_LOG_FD (LOG_FD_NBIO)
  386.  * for the KERN_LOG facility will result in no output being
  387.  * seen.  Also, STD_OUT for a VxWorks bootrom is unlikely to
  388.  * be directed to a telnet socket for which logging from the
  389.  * stack inside splnet() would cause a problem. So we reset
  390.  * KERN_LOG facility logging to STD_OUT.
  391.  */
  392. #undef APPL_KERN_LOG_FD_CFG
  393. #define APPL_KERN_LOG_FD_CFG STD_OUT
  394. #undef VIRTUAL_STACK   /* Just to be sure. INCLUDE_RTP is undef'ed above. */
  395. #include <applUtilLib.h>
  396. #include "../comps/src/net/coreip/usrNetApplUtil.c"
  397. #endif /* INCLUDE_APPL_LOG_UTIL */
  398. #ifdef  INCLUDE_NETWORK /* hama */
  399. #ifdef ETHERNET_MAC_HANDLER
  400. void sEnet (char *Num);
  401. void mEnet (char *pNum, int unitNum, char *ifName);
  402. #ifdef ETHERNET_ADR_SET
  403. #error "ETHERNET_MAC_HANDLER and ETHERNET_ADR_SET are mutually exclusive"
  404. #endif  /* ETHERNET_ADR_SET */
  405. #endif /* ETHERNET_MAC_HANDLER */
  406. #ifdef ETHERNET_ADR_SET
  407. void        mEnet (char *);
  408. void        sysEnetAddrGet ();
  409. void        sysEnetAddrSet ();
  410. #ifdef ETHERNET_MAC_HANDLER
  411. #error "ETHERNET_MAC_HANDLER and ETHERNET_ADR_SET are mutually exclusive"
  412. #endif /* ETHERNET_MAC_HANDLER */
  413. #endif  /* ETHERNET_ADR_SET */
  414. #ifdef INCLUDE_END
  415. #include "configNet.h"
  416. IMPORT END_TBL_ENTRY endDevTbl [];
  417. typedef struct cookie_tbl
  418.     {
  419.     int unitNo;
  420.     char devName [END_NAME_MAX];
  421.     void * pCookie;
  422.     } COOKIE_TBL;
  423. COOKIE_TBL cookieTbl [32];
  424. #endif  /* INCLUDE_END */
  425. #ifdef INCLUDE_VXBUS
  426. #include <vxBusLib.h>
  427. IMPORT char * muxDevConnect_desc;
  428. LOCAL void vxbFindHend (VXB_DEVICE_ID pDev, void * pArg);
  429. #endif /* INCLUDE_VXBUS */
  430. #ifndef IP_MAX_UNITS
  431. #define IP_MAX_UNITS 1
  432. #endif
  433. /*
  434.  * mBlk, clBlk configuration table for network stack *SYSTEM* pool.
  435.  * Used for network stack system structures such as routes, sockets,
  436.  * protocol control blocks, interface addresses, mulitcast addresses,
  437.  * and multicast routing entries.
  438.  */
  439. M_CL_CONFIG sysMblkClBlkDesc =
  440.     {
  441.     /*
  442.       no. mBlks        no. clBlks          memArea      memSize
  443.       -----------      ----------          -------      -------
  444.     */
  445.     NUM_SYS_MBLKS_MIN, NUM_SYS_CLBLKS_MIN, PMA_SYSPOOL, PMS_SYSPOOL
  446.     };
  447. /*
  448.  * network stack *SYSTEM* cluster pool configuration table
  449.  * Used for network stack system structures such as routes, sockets,
  450.  * protocol control blocks, interface addresses, mulitcast addresses,
  451.  * and multicast routing entries.
  452.  */
  453. CL_DESC sysClDescTbl [] =
  454.     {
  455.     /*
  456.       clusterSize      num             memArea       memSize
  457.       -----------      ----            -------       -------
  458.     */
  459.     {SIZ_SYS_16,   NUM_SYS_16_MIN,   PMA_SYS_16,   PMS_SYS_16},
  460.     {SIZ_SYS_32,   NUM_SYS_32_MIN,   PMA_SYS_32,   PMS_SYS_32},
  461.     {SIZ_SYS_64,   NUM_SYS_64_MIN,   PMA_SYS_64,   PMS_SYS_64},
  462.     {SIZ_SYS_128,  NUM_SYS_128_MIN,  PMA_SYS_128,  PMS_SYS_128},
  463.     {SIZ_SYS_256,  NUM_SYS_256_MIN,  PMA_SYS_256,  PMS_SYS_256},
  464.     {SIZ_SYS_512,  NUM_SYS_512_MIN,  PMA_SYS_512,  PMS_SYS_512},
  465.     {SIZ_SYS_1024, NUM_SYS_1024_MIN, PMA_SYS_1024, PMS_SYS_1024}
  466.     };
  467. UINT sysClDescTblNumEnt = (NELEMENTS(sysClDescTbl));
  468. /*
  469.  * mBlk, clBlk configuration table for network stack *DATA* pool.
  470.  * Only used for data transfer in the network stack.
  471.  */
  472. M_CL_CONFIG pktMblkClBlkDesc =
  473.     {
  474.     /*
  475.       no. mBlks         no. clBlks         memArea      memSize
  476.       -----------       ----------         -------      -------
  477.     */
  478.     NUM_DAT_MBLKS_MIN, NUM_DAT_CLBLKS_MIN, PMA_DATPOOL, PMS_DATPOOL
  479.     };
  480. /*
  481.  * network stack *DATA* cluster pool configuration table
  482.  * Only used for data transfer in the network stack.
  483.  */
  484. CL_DESC pktClDescTbl [] =
  485.     {
  486.     /*
  487.       clusterSize  num          memArea        memSize
  488.       -----------  ----         -------        -------
  489.     */
  490.     {  64,  NUM_DAT_64_MIN,    PMA_DAT_64,    PMS_DAT_64},
  491.     { 128,  NUM_DAT_128_MIN,   PMA_DAT_128,   PMS_DAT_128},
  492.     { 256,  NUM_DAT_256_MIN,   PMA_DAT_256,   PMS_DAT_256},
  493.     { 512,  NUM_DAT_512_MIN,   PMA_DAT_512,   PMS_DAT_512},
  494.     { 1024, NUM_DAT_1024_MIN,  PMA_DAT_1024,  PMS_DAT_1024},
  495.     { 2048, NUM_DAT_2048_MIN,  PMA_DAT_2048,  PMS_DAT_2048},
  496.     { 4096, NUM_DAT_4096_MIN,  PMA_DAT_4096,  PMS_DAT_4096},
  497.     { 8192, NUM_DAT_8192_MIN,  PMA_DAT_8192,  PMS_DAT_8192},
  498.     {16384, NUM_DAT_16384_MIN, PMA_DAT_16384, PMS_DAT_16384},
  499.     {32768, NUM_DAT_32768_MIN, PMA_DAT_32768, PMS_DAT_32768},
  500.     {65536, NUM_DAT_65536_MIN, PMA_DAT_65536, PMS_DAT_65536}
  501.     };
  502. UINT pktClDescTblNumEnt = (NELEMENTS(pktClDescTbl));
  503. #include "../comps/src/net/coreip/usrNetBoot.c"       /* INCLUDE_NET_BOOT */
  504. #include "../comps/src/net/coreip/usrNetIpAttachCommon.c" /* INCLUDE_IPATTACH */
  505. #include "../comps/src/net/coreip/usrNetBootConfig.c" /* INCLUDE_NET_BOOT_CONFIG */
  506. #include "../comps/src/net/coreip/usrNetBsdSocket.c"    /* INCLUDE_BSD_SOCKET */
  507. #ifdef INCLUDE_END
  508. #include "../comps/src/net/coreip/usrNetEndLib.c"   /* INCLUDE_END */
  509. #endif /* INCLUDE_END */
  510. #ifdef INCLUDE_ETHERNET
  511. #include "../comps/src/net/coreip/usrNetEther.c"    /* INCLUDE_ETHERNET */
  512. #endif /* INCLUDE_ETHERNET */
  513. #include "../comps/src/net/coreip/usrNetLoopback.c" /* INCLUDE_LOOPBACK */
  514. #include "../comps/src/net/coreip/usrNetIf.c"           /* INCLUDE_IF */
  515. #include "../comps/src/net/coreip/usrNetIpv4.c"     /* INCLUDE_IPV4 */
  516. #include "../comps/src/net/coreip/usrNetIcmpv4.c"   /* INCLUDE_ICMPV4 */
  517. #include "../comps/src/net/coreip/usrNetRawv4.c"    /* INCLUDE_RAWV4 */
  518. #include "../comps/src/net/coreip/usrNetDaemon.c"   /* INCLUDE_NET_DAEMON */
  519. #include "../comps/src/net/coreip/usrNetGtf.c"      /* INCLUDE_GTF */
  520. #include "../comps/src/net/coreip/usrNetGtfTimerStart.c" /* INCLUDE_GTF_TIMER_START */
  521. #include "../comps/src/net/coreip/usrNetRouteStorage.c" /* INCLUDE_ROUTE_STORAGE */
  522. #include "../comps/src/net/coreip/usrNetRtSock.c"   /* INCLUDE_ROUTING_SOCKET */
  523. #ifdef INCLUDE_UDPV4
  524. #include "../comps/src/net/coreip/usrNetUdpv4.c"
  525. #endif
  526. #ifdef INCLUDE_TCPV4
  527. #include "../comps/src/net/coreip/usrNetTcpv4.c"
  528. #endif
  529. #ifdef INCLUDE_IGMP
  530. #include "../comps/src/net/coreip/usrNetIgmp.c"
  531. #endif
  532. #ifdef INCLUDE_HOST_TBL
  533. #include "../comps/src/net/coreip/apps/usrNetHostTblCfg.c"
  534. #endif
  535. #ifdef INCLUDE_NET_REM_IO
  536. #include "../comps/src/net/coreip/usrNetRemoteCfg.c"
  537. #endif
  538. #ifdef INCLUDE_BPF
  539. #include "../comps/src/net/coreip/usrNetBpfDrv.c"
  540. #endif
  541. #ifdef INCLUDE_FTP
  542. #include "../comps/src/net/coreip/apps/usrFtp.c"
  543. #endif
  544. #ifdef INCLUDE_SYSCTL
  545. #include "../comps/src/usrSysctl.c"
  546. #endif
  547. /* Wind kernel configuration facility */
  548. /* forward declarations */
  549. IMPORT int  loattach ();
  550. IMPORT struct ifnet *   ifunit ();
  551. IMPORT int  pcmciaattach ();
  552. IMPORT int route_init ();
  553. IMPORT STATUS hostInstInit (void *);
  554. IMPORT STATUS netSysctlInit (void);
  555. extern FUNCPTR _phostAdd;
  556. extern NET_POOL_CONFIG_PARAMS netPoolDefaultConfigParams;
  557. #if defined(INCLUDE_DOSFS_MAIN) || defined(INCLUDE_DOSFS)
  558. #include "usrDosfs.c"
  559. #endif
  560. #ifdef INCLUDE_VXWORKS_5_X_EQUIV_PPP
  561. #include "../comps/src/net/ppp/usrBasicPPPFrameworkInit.c"
  562. #endif /* INCLUDE_VXWORKS_5_X_EQUIV_PPP */
  563. #endif  /* INCLUDE_NETWORK */
  564. /* global variables */
  565. SYMTAB_ID   sysSymTbl;
  566. int     consoleFd;      /* fd of initial console device */
  567. char    consoleName [20];   /* console device name, eg. "/tyCo/0" */
  568. int     sysStartType;       /* BOOT_CLEAR, BOOT_NO_AUTOBOOT, ... */
  569. int     sysFlags;                       /* boot flags */
  570. char    sysBootHost [BOOT_FIELD_LEN];   /* name of boot host */
  571. char    sysBootFile [BOOT_FIELD_LEN];   /* name of boot file */
  572. BOOL    scsiInitialized      = FALSE;
  573. int     bootCmdTaskPriority  = 1;
  574. int     bootCmdTaskOptions   = VX_SUPERVISOR_MODE;
  575. int     bootCmdTaskStackSize = BOOT_CMD_STACK_SIZE;
  576. #if (CPU_FAMILY == MIPS)
  577. IMPORT void palInit ();
  578. #endif  /* (CPU_FAMILY == MIPS) */
  579. /* Two magic cookies used to detect data section misalignment */
  580. #define TRAP_VALUE_1    0x12348765
  581. #define TRAP_VALUE_2    0x5a5ac3c3
  582. LOCAL volatile UINT32   trapValue1  = TRAP_VALUE_1;
  583. LOCAL volatile UINT32   trapValue2  = TRAP_VALUE_2;
  584. #ifdef ETHERNET_MAC_HANDLER
  585. LOCAL char macShowStr[MAX_MAC_ADRS] [MAX_MAC_SHOW_BUF_SIZE];
  586. LOCAL const char macErrStr[] = "** invalid device idn";
  587. #endif /* ETHERNET_MAC_HANDLER */
  588. /* forward declarations */
  589. #ifdef __STDC__
  590. void        usrRoot (char *pMemPoolStart, unsigned memPoolSize);
  591. void        usrClock (void);
  592. void        usrKernelInit (void);
  593. LOCAL void  bootCmdLoop (void);
  594. LOCAL char  autoboot (int timeout);
  595. LOCAL void  printBootLogo (void);
  596. LOCAL void  bootHelp (void);
  597. LOCAL STATUS    bootLoad (char *bootString, FUNCPTR *pEntry);
  598. LOCAL void  go (FUNCPTR entry);
  599. LOCAL void  m (char *adrs);
  600. LOCAL void  d (char *adrs, int nwords);
  601. LOCAL void  bootExcHandler (int tid);
  602. LOCAL void  skipSpace (char **strptr);
  603. LOCAL void  printExcMsg (char *string);
  604. LOCAL STATUS    getArg (char **ppString, int *pValue, BOOL defaultHex,
  605.             BOOL optional);
  606. LOCAL void  usrBootLineInit (int startType);
  607. LOCAL STATUS    usrBootLineCrack (char *bootString, BOOT_PARAMS *pParams);
  608. #ifdef  INCLUDE_NETWORK
  609. LOCAL STATUS    netLoad (char *hostName, char *fileName, char *usr,
  610.              char *passwd, FUNCPTR *pEntry);
  611. LOCAL void  netifAdrsPrint (char *ifname);
  612. LOCAL STATUS    checkInetAddrField (char *pInetAddr, BOOL subnetMaskOK);
  613. #ifdef INCLUDE_BOOTP
  614. LOCAL STATUS    bootpGet (char *pNetDev, char *pBootDevAddr, char *pBootFile,
  615.               char *pHostAddr, int *pMask);
  616. #endif
  617. #endif  /* INCLUDE_NETWORK */
  618. #ifdef  INCLUDE_FLASH_BOOT
  619. LOCAL STATUS flashLoad(char    *fileName, FUNCPTR *pEntry);
  620. #endif  /* INCLUDE_FLASH_BOOT */
  621. #ifdef  INCLUDE_SCSI_BOOT
  622. LOCAL STATUS    scsiLoad (int bootDevId, int bootDevLUN, char *fileName,
  623.                   FUNCPTR *pEntry);
  624. #endif  /* INCLUDE_SCSI_BOOT */
  625. #ifdef  INCLUDE_FD
  626. LOCAL STATUS    fdLoad (int drive, int type, char *fileName, FUNCPTR *pEntry);
  627. #endif  /* INCLUDE_FD */
  628. #ifdef  INCLUDE_IDE
  629. LOCAL STATUS    ideLoad (int drive, int type, char *fileName, FUNCPTR *pEntry);
  630. #endif  /* INCLUDE_IDE */
  631. #ifdef  INCLUDE_ATA
  632. LOCAL STATUS    ataLoad (int ctrl, int drive, char *fileName, FUNCPTR *pEntry);
  633. #endif  /* INCLUDE_ATA */
  634. #ifdef  INCLUDE_PCMCIA
  635. LOCAL STATUS    pcmciaLoad (int sock, char *fileName, FUNCPTR *pEntry);
  636. #endif  /* INCLUDE_PCMCIA */
  637. #ifdef  INCLUDE_TFFS
  638. LOCAL STATUS    tffsLoad (int drive, int removable, char *fileName,
  639.               FUNCPTR *pEntry);
  640. #endif  /* INCLUDE_TFFS */
  641. #ifdef  INCLUDE_TSFS_BOOT
  642. LOCAL STATUS    tsfsLoad (char * fileName, FUNCPTR * pEntry);
  643. LOCAL void  wdbRebootEventGet (void * pNode, WDB_EVT_DATA * pEvtData);
  644. #endif  /* INCLUDE_TSFS_BOOT */
  645. #ifdef INCLUDE_PCCARD
  646. LOCAL void      usrPccardDevShow (UINT16 type);
  647. #endif /* INCLUDE_PCCARD */
  648. #else
  649. void        usrRoot ();
  650. void        usrClock ();
  651. void        usrKernelInit ();
  652. LOCAL void  bootCmdLoop ();
  653. LOCAL char  autoboot ();
  654. LOCAL void  printBootLogo ();
  655. LOCAL void  bootHelp ();
  656. LOCAL STATUS    bootLoad ();
  657. LOCAL void  go ();
  658. LOCAL void  m ();
  659. LOCAL void  d ();
  660. LOCAL void  bootExcHandler ();
  661. LOCAL void  skipSpace ();
  662. LOCAL void  printExcMsg ();
  663. LOCAL STATUS    getArg ();
  664. LOCAL void  usrBootLineInit ();
  665. LOCAL STATUS    usrBootLineCrack ();
  666. #ifdef  INCLUDE_NETWORK
  667. LOCAL STATUS    netLoad ();
  668. LOCAL void  netifAdrsPrint ();
  669. LOCAL STATUS    checkInetAddrField ();
  670. LOCAL STATUS    usrNetIfConfig ();
  671. #ifdef INCLUDE_BOOTP
  672. LOCAL STATUS    bootpGet ();
  673. #endif
  674. #endif  /* INCLUDE_NETWORK */
  675. #ifdef  INCLUDE_SCSI_BOOT
  676. LOCAL STATUS    scsiLoad();
  677. #endif  /* INCLUDE_SCSI_BOOT */
  678. #ifdef  INCLUDE_FD
  679. LOCAL STATUS    fdLoad ();
  680. #endif  /* INCLUDE_FD */
  681. #ifdef  INCLUDE_IDE
  682. LOCAL STATUS    ideLoad ();
  683. #endif  /* INCLUDE_IDE */
  684. #ifdef  INCLUDE_ATA
  685. LOCAL STATUS    ataLoad ();
  686. #endif  /* INCLUDE_ATA */
  687. #ifdef  INCLUDE_PCMCIA
  688. LOCAL STATUS    pcmciaLoad ();
  689. #endif  /* INCLUDE_PCMCIA */
  690. #ifdef  INCLUDE_TFFS
  691. LOCAL STATUS    tffsLoad ();
  692. #endif  /* INCLUDE_TFFS */
  693. #ifdef  INCLUDE_TSFS_BOOT
  694. LOCAL STATUS    tsfsLoad ();
  695. LOCAL void  wdbRebootEventGet ();
  696. #endif  /* INCLUDE_TSFS_BOOT */
  697. #ifdef INCLUDE_PCCARD
  698. LOCAL void      usrPccardDevShow ();
  699. #endif /* INCLUDE_PCCARD */
  700. #endif  /* __STDC__ */
  701. /*******************************************************************************
  702. *
  703. * usrInit - user-defined system initialization routine
  704. *
  705. * This routine is called by the start-up code in romStart().  It is called
  706. * before kernel multi-tasking is enabled, with the interrupts locked out.
  707. *
  708. * It starts by clearing BSS, so all variables are initialized to 0 as per
  709. * the C specification.  Then it sets up exception vectors, initializes the
  710. * hardware by calling sysHwInit(), and finally starts the kernel with the
  711. * usrRoot() task to do the remainder of the initialization.
  712. *
  713. * NOMANUAL
  714. */
  715. void usrInit
  716.     (
  717.     int startType
  718.     )
  719.     {
  720.     /*
  721.      * This trap will catch improper loading of the data section.
  722.      * We check the magic cookie values to make sure the data section is
  723.      * in the expected memory location. We do not want
  724.      * to proceed further if the data segment is not correct.
  725.      *
  726.      * It should be easy to detect entry into the trap using an ICE, JTAG,
  727.      * or logic analyzer. Without the trap, the processor is likely to run
  728.      * away out of control.
  729.      *
  730.      * Data section misalignment can occur when there is a change in tool
  731.      * chain, build rules, compiler, host utilities,  etc.
  732.      */
  733.     while (trapValue1 != TRAP_VALUE_1 || trapValue2 != TRAP_VALUE_2)
  734.     {
  735.     /* infinite loop */;
  736.     }
  737. #if (CPU_FAMILY == MIPS)
  738.     palInit ();
  739. #endif  /* (CPU_FAMILY == MIPS) */
  740. #if (CPU_FAMILY == SPARC)
  741.     excWindowInit ();               /* SPARC window management */
  742. #endif
  743. #if (CPU_FAMILY == MIPS)
  744.     sysGpInit ();               /* MIPS global pointer */
  745. #endif  /* (CPU_FAMILY == MIPS) */
  746. #ifdef INCLUDE_SYS_HW_INIT_0
  747.     /*
  748.      * Perform any BSP-specific initialisation that must be done before
  749.      * cacheLibInit() is called and/or BSS is cleared.
  750.      */
  751.     SYS_HW_INIT_0 ();
  752. #endif /* INCLUDE_SYS_HW_INIT_0 */
  753.     /* don't assume bss variables are zero before this call */
  754.     bzero (edata, end - edata); /* zero out bss variables */
  755.     /* configure data and instruction cache if available and leave disabled */
  756. #ifdef  INCLUDE_CACHE_SUPPORT
  757.     /*
  758.      * SPR 73609:  If a cache is not to be enabled, don't require
  759.      * its mode to be defined.  Instead, default it to disabled.
  760.      */
  761. # if (!defined(USER_D_CACHE_ENABLE) && !defined(USER_D_CACHE_MODE))
  762. #  define USER_D_CACHE_MODE CACHE_DISABLED
  763. # endif /* !USER_D_CACHE_ENABLE && !USER_D_CACHE_MODE */
  764. # if (!defined(USER_I_CACHE_ENABLE) && !defined(USER_I_CACHE_MODE))
  765. #  define USER_I_CACHE_MODE CACHE_DISABLED
  766. # endif /* !USER_I_CACHE_ENABLE && !USER_I_CACHE_MODE */
  767.     cacheLibInit (USER_I_CACHE_MODE, USER_D_CACHE_MODE);
  768. #endif  /* INCLUDE_CACHE_SUPPORT */
  769. #if (CPU == SPARClite)
  770.     cacheLib.textUpdateRtn = NULL;      /* XXX - mod hist 07u */
  771. #endif
  772.     sysStartType = startType;
  773.     intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS);  /* set vector base table */
  774. #if (CPU_FAMILY == AM29XXX)
  775.     excSpillFillInit ();                        /* am29k stack cache management */
  776. #endif
  777.     excVecInit ();              /* install exception vectors */
  778.     sysHwInit ();               /* initialize system hardware */
  779.     usrKernelInit ();               /* configure the Wind kernel */
  780. #if (CPU==SPARC) || (CPU_FAMILY==I80X86)    /* XXX workaround for sun1e */
  781. #undef USER_I_CACHE_ENABLE  /* XXX disable instruction cache */
  782. #endif  /* (CPU==SPARC) || (CPU_FAMILY==I80X86) */
  783. #ifdef  INCLUDE_CACHE_SUPPORT
  784. #ifdef  USER_I_CACHE_ENABLE
  785.     cacheEnable (INSTRUCTION_CACHE);        /* enable instruction cache */
  786. #endif  /* USER_I_CACHE_ENABLE */
  787. #endif  /* INCLUDE_CACHE_SUPPORT */
  788.     /* start the kernel specifying usrRoot as the root task */
  789.     kernelInit ((FUNCPTR) usrRoot, ROOT_STACK_SIZE,
  790.         (char *) MEM_POOL_START_ADRS,
  791.         sysMemTop (), ISR_STACK_SIZE, INT_LOCK_LEVEL);
  792.     }
  793. /*******************************************************************************
  794. *
  795. * usrRoot - user-defined root task
  796. *
  797. * The root task performs any initialization that should be done
  798. * subsequent to the kernel initialization.
  799. *
  800. * It initializes the I/O system, install drivers, create devices,
  801. * sets up the network, etc., as necessary for the particular configuration.
  802. * It may also create the system symbol table if one is to be included.
  803. * Finally, it spawns the boot command loop task.
  804. *
  805. * NOMANUAL
  806. */
  807. void usrRoot
  808.     (
  809.     char *      pMemPoolStart,          /* start of system memory partition */
  810.     unsigned    memPoolSize             /* initial size of mem pool */
  811.     )
  812.     {
  813.     char tyName [20];
  814.     int ix;
  815.     /* initialize core kernel facilities */
  816.     usrKernelCoreInit();
  817.     /*
  818.      * Initialize the memory pool before initializing any other package.
  819.      * The memory associated with the root task will be reclaimed at the
  820.      * completion of its activities.
  821.      */
  822. #ifdef INCLUDE_MEM_MGR_FULL
  823.     memInit (pMemPoolStart, memPoolSize,MEM_PART_DEFAULT_OPTIONS); 
  824. #else
  825.     memPartLibInit (pMemPoolStart, memPoolSize);/* initialize memory pool */
  826. #endif /* INCLUDE_MEM_MGR_FULL */
  827.     /* Initialize sysctl if required */
  828. #ifdef INCLUDE_SYSCTL
  829.     usrSysctlInit ();
  830. #ifdef INCLUDE_SYSCTL_HW
  831.     usrHwSysctlInit();                          /* System control h/w access */
  832. #endif /* INCLUDE_SYSCTL_HW */
  833. #endif /* INCLUDE_SYSCTL */
  834. #if (CPU_FAMILY == PPC)
  835.     /* Enable interrupts before setting up clock */
  836.     vxMsrSet(vxMsrGet() | taskMsrDefault);
  837. #endif  /* (CPU_FAMILY == PPC) */
  838.     /* EDR configuration */
  839. #ifdef INCLUDE_EDR_PM
  840.     usrPmInit ();
  841. #endif /* INCLUDE_EDR_PM */
  842. #ifdef INCLUDE_EDR_SYSDBG_FLAG
  843.     edrSystemDebugModeSet (FALSE); /* always run in deployed mode */
  844. #endif /* INCLUDE_EDR_SYSDBG_FLAG */
  845. #ifdef INCLUDE_EDR_ERRLOG
  846.     /* initialize the ED&R subsystem */
  847.     usrEdrInit ();
  848. #ifdef INCLUDE_EDR_SHOW
  849.     edrShowInit ();
  850. #endif /* INCLUDE_EDR_SHOW */
  851. #endif /* INCLUDE_EDR_ERRLOG */
  852.     /* set up system timer */
  853.     sysClkConnect ((FUNCPTR) usrClock, 0);/* connect clock interrupt routine */
  854.     sysClkRateSet (SYS_CLK_RATE);     /* set system clock rate */
  855.     sysClkEnable ();              /* start it */
  856.     /* initialize I/O and file system */
  857.     iosInit (NUM_DRIVERS, NUM_FILES, "/null", IOS_POSIX_PSE52_MODE);
  858.     consoleFd = NONE;
  859.     /*
  860.      * The select library needs to be initialized before the tyLib module
  861.      * since the _func_selWakeupListInit FUNCPTR is required (SPR #3314).
  862.      * The installation of the select task delete hook is not performed
  863.      * for boot ROMs.
  864.      */
  865. #ifdef INCLUDE_SELECT
  866.     selectInit (NUM_FILES);
  867. #endif  /* INCLUDE_SELECT */
  868.     /* install driver for on-board serial ports and make devices */
  869. #ifdef  INCLUDE_TYCODRV_5_2
  870. #ifdef  INCLUDE_TTY_DEV
  871.     if ((NUM_TTY > 0))
  872.         {
  873.         tyCoDrv ();                             /* install console driver */
  874.         for (ix = 0; ix < NUM_TTY; ix++)        /* create serial devices */
  875.             {
  876.             sprintf (tyName, "%s%d", "/tyCo/", ix);
  877.             (void) tyCoDevCreate (tyName, ix, 512, 512);
  878.             if (ix == CONSOLE_TTY)
  879.                 strcpy (consoleName, tyName);   /* store console name */
  880.             }
  881.         consoleFd = open (consoleName, O_RDWR, 0);
  882.         /* set baud rate */
  883.         (void) ioctl (consoleFd, FIOBAUDRATE, CONSOLE_BAUD_RATE);
  884.         (void) ioctl (consoleFd, FIOSETOPTIONS,
  885.             OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);
  886.         }
  887. #endif  /* INCLUDE_TTY_DEV */
  888. #else   /* !INCLUDE_TYCODRV_5_2 */
  889. #ifdef  INCLUDE_TTY_DEV
  890.     if ((NUM_TTY > 0))
  891.         {
  892.         ttyDrv();                               /* install console driver */
  893.         for (ix = 0; ix < NUM_TTY; ix++)        /* create serial devices */
  894.             {
  895. #if (defined(INCLUDE_WDB) && (WDB_COMM_TYPE == WDB_COMM_SERIAL))
  896.         if (ix == WDB_TTY_CHANNEL)          /* don't use WDBs channel */
  897.             continue;
  898. #endif
  899.             sprintf (tyName, "%s%d", "/tyCo/", ix);
  900.             (void) ttyDevCreate (tyName, sysSerialChanGet(ix), 512, 512);
  901.             if (ix == CONSOLE_TTY)              /* init the tty console */
  902.                 {
  903.                 strcpy (consoleName, tyName);
  904.                 consoleFd = open (consoleName, O_RDWR, 0);
  905.                 (void) ioctl (consoleFd, FIOBAUDRATE, CONSOLE_BAUD_RATE);
  906.                 (void) ioctl (consoleFd, FIOSETOPTIONS,
  907.             OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);
  908.                 }
  909.             }
  910.         }
  911. #endif  /* INCLUDE_TTY_DEV */
  912. #ifdef INCLUDE_PC_CONSOLE
  913.     pcConDrv ();
  914.     for (ix = 0; ix < N_VIRTUAL_CONSOLES; ix++)
  915.         {
  916.         sprintf (tyName, "%s%d", "/pcConsole/", ix);
  917.         (void) pcConDevCreate (tyName,ix, 512, 512);
  918.         if (ix == PC_CONSOLE)           /* init the console device */
  919.             {
  920.             strcpy (consoleName, tyName);
  921.             consoleFd = open (consoleName, O_RDWR, 0);
  922.             (void) ioctl (consoleFd, FIOBAUDRATE, CONSOLE_BAUD_RATE);
  923.             (void) ioctl (consoleFd, FIOSETOPTIONS,
  924.             OPT_ECHO | OPT_CRMOD | OPT_TANDEM | OPT_7_BIT);
  925.             }
  926.         }
  927. #endif  /* INCLUDE_PC_CONSOLE */
  928. #endif  /* !INCLUDE_TYCODRV_5_2 */
  929. #ifdef INCLUDE_WDB
  930.     usrWdbInit(); /* configure and initialize the WDB agent */
  931.     vxBootFile[0] = NULL; /* clear boot line set by usrWdbInit() */
  932. #if defined(INCLUDE_TSFS_BOOT) && defined(INCLUDE_TSFS_BOOT_VIO_CONSOLE)
  933.     consoleFd = open ("/vio/0", O_RDWR, 0); /* for Target Server Console */
  934. #endif
  935. #endif  /* INCLUDE_WDB */
  936.     ioGlobalStdSet (STD_IN,  consoleFd);
  937.     ioGlobalStdSet (STD_OUT, consoleFd);
  938.     ioGlobalStdSet (STD_ERR, consoleFd);
  939. #ifdef  INCLUDE_PIPES
  940.     pipeDrv ();                 /* install pipe driver */
  941. #endif  /* INCLUDE_PIPES */
  942. #if     defined(INCLUDE_EXC_HANDLING) && defined(INCLUDE_EXC_TASK)
  943. #ifdef  INCLUDE_EXC_SHOW
  944.     excShowInit ();         /* init exception show routines */
  945. #endif
  946.     /* initialize exception handling */
  947.     excInit (MAX_ISR_JOBS);
  948. #endif  /* defined(INCLUDE_EXC_HANDLING) && defined(INCLUDE_EXC_TASK) */
  949. #if defined(INCLUDE_JOB_TASK)
  950.     jobLibInit (JOB_TASK_STACK_SIZE);
  951. #endif /* INCLUDE_JOB_TASK */
  952.     excHookAdd ((FUNCPTR) bootExcHandler);  /* install exc handler */
  953.     logInit (consoleFd, 5);         /* initialize logging */
  954. #ifdef INCLUDE_ERF
  955.     erfLibInit (ERF_MAX_USR_CATEGORIES, ERF_MAX_USR_TYPES);
  956. #endif
  957. #ifdef INCLUDE_DEVICE_MANAGER
  958.     devInit (DEVICE_MANAGER_MAX_NUM_DEVICES);
  959. #endif
  960. #ifdef INCLUDE_XBD
  961.     xbdInit ();
  962. #endif
  963. #ifdef INCLUDE_XBD_BLK_DEV
  964.     xbdBlkDevLibInit ();
  965. #endif
  966. #ifdef INCLUDE_FS_MONITOR
  967.     fsMonitorInit ();
  968. #endif
  969. #ifdef INCLUDE_FS_EVENT_UTIL
  970.     fsEventUtilLibInit ();
  971. #endif
  972. #if defined(INCLUDE_DOSFS_MAIN) || defined(INCLUDE_DOSFS)
  973.     usrDosfsInit (DOSFS_DEFAULT_MAX_FILES, DOSFS_DEFAULT_CREATE_OPTIONS);
  974. #endif
  975. #ifdef INCLUDE_DOSFS_CACHE
  976.     dosFsCacheLibInit (DOSFS_DEFAULT_CACHE_SIZE);
  977. #endif
  978. #ifdef INCLUDE_RAWFS
  979.     rawFsInit (NUM_RAWFS_FILES);
  980. #endif
  981.     /* initialize object module loader */
  982. #if defined(INCLUDE_ELF)
  983.     bootElfInit ();             /* use elf format */
  984. #endif
  985. #ifdef  INCLUDE_PCMCIA
  986.     pcmciaInit ();                      /* init PCMCIA Lib */
  987. #endif /* INCLUDE_PCMCIA */
  988. #ifdef INCLUDE_PCCARD
  989.     csInit (CS_PCCARD_STACK);
  990. #endif /* INCLUDE_PCCARD */
  991. /* initialize the MUX */
  992. #ifdef INCLUDE_MUX
  993.     /* initialize the MUX */
  994.     if (muxLibInit() == ERROR)
  995.     return;                              /* can't return ERROR */
  996. #endif /* INCLUDE_MUX */
  997.     taskSpawn ("tBoot", bootCmdTaskPriority, bootCmdTaskOptions,
  998.         bootCmdTaskStackSize, (FUNCPTR) bootCmdLoop,
  999.         0,0,0,0,0,0,0,0,0,0);
  1000.     }
  1001. /*******************************************************************************
  1002. *
  1003. * usrClock - user defined system clock interrupt routine
  1004. *
  1005. * This routine is called at interrupt level on each clock interrupt.  It is
  1006. * installed a call to sysClkConnect().  It calls any other facilities that
  1007. * need to know about clock ticks, including the kernel itself.
  1008. *
  1009. * If the application needs anything to happen at clock interrupt level,
  1010. * it should be added to this routine.
  1011. *
  1012. * NOMANUAL
  1013. */
  1014. void usrClock (void)
  1015.     {
  1016.     tickAnnounce ();    /* announce system tick to kernel */
  1017.     }
  1018. /*******************************************************************************
  1019. *
  1020. * bootCmdLoop - read and execute user commands forever (until boot)
  1021. */
  1022. LOCAL void bootCmdLoop (void)
  1023.     {
  1024.     BOOT_PARAMS params;
  1025.     char line [BOOT_CMD_MAX_LINE];
  1026.     char *pLine;
  1027.     int nwords;
  1028.     int nbytes;
  1029.     int value;
  1030.     int adr;
  1031.     int adr2;
  1032.     FUNCPTR entry;
  1033.     char key = 0;
  1034.     /* flush standard input to get rid of any garbage;
  1035.      * E.g. the Heurikon HKV2F gets junk in USART if no terminal connected.
  1036.      */
  1037.     (void) ioctl (STD_IN, FIOFLUSH, 0 /*XXX*/);
  1038. #if 0
  1039.     if (sysStartType & BOOT_CLEAR)
  1040.     printBootLogo ();
  1041. #endif
  1042.     usrBootLineInit (sysStartType);
  1043.     /* print out any new exception message -
  1044.      * the first byte is zeroed after printing so that we won't print
  1045.      * it again automatically.  However, 'e' command will still print out
  1046.      * the remainder. */
  1047.     printExcMsg (sysExcMsg);
  1048.     *sysExcMsg = EOS;       /* indicate exception message is old */
  1049.     /* start autoboot, unless no-autoboot specified */
  1050.     bootStringToStruct (BOOT_LINE_ADRS, &params);
  1051.     sysFlags = params.flags;
  1052. #if defined(INCLUDE_TSFS_BOOT) && defined(INCLUDE_TSFS_BOOT_VIO_CONSOLE)
  1053.     /* Wait for Target Server connection */
  1054.     while (!wdbTargetIsConnected())
  1055.         taskDelay (sysClkRateGet());
  1056.     /*
  1057.      * disable the auto-boot mechanism, because the Target Server may not have
  1058.      * time to start its VIO Console before the end of the auto-boot countdown.
  1059.      */
  1060.     sysStartType |= BOOT_NO_AUTOBOOT;
  1061. #endif
  1062.     if (!(sysStartType & BOOT_NO_AUTOBOOT) &&
  1063.     !(sysFlags & SYSFLG_NO_AUTOBOOT))
  1064.     {
  1065.     int timeout = TIMEOUT;
  1066.     if ((sysStartType & BOOT_QUICK_AUTOBOOT) ||
  1067.         (sysFlags & SYSFLG_QUICK_AUTOBOOT))
  1068.         {
  1069.         timeout = 1;
  1070.         }
  1071.     key = autoboot (timeout);   /* doesn't return if successful */
  1072.     }
  1073.     /* If we're here, either we aren't auto-booting, or we got an error
  1074.      * auto-booting, or the auto-booting was stopped. */
  1075.     /* put console in line mode */
  1076.     (void) ioctl (consoleFd, FIOSETOPTIONS, OPT_TERMINAL);
  1077.     /* read and execute the ROM commands */
  1078.     printf ("n");
  1079.     FOREVER
  1080.     {
  1081.     if (key == '@')
  1082.         {
  1083.         line [0] = key;
  1084.         line [1] = EOS;
  1085.         key = 0;
  1086.         }
  1087.     else
  1088.         {
  1089.         printf ("[VxWorks Boot]: ");
  1090.         fioRdString (STD_IN, line, sizeof (line));
  1091.         }
  1092.     adr = adr2 = 0;
  1093.     nwords = 0;
  1094.     /* take blanks off end of line */
  1095.     pLine = line + strlen (line) - 1;       /* point at last char */
  1096.     while ((pLine >= line) && (*pLine == ' '))
  1097.         {
  1098.         *pLine = EOS;
  1099.         pLine--;
  1100.         }
  1101.     pLine = line;
  1102.     skipSpace (&pLine);
  1103.     switch (*(pLine++))
  1104.         {
  1105.         case EOS:       /* blank line */
  1106.         break;
  1107.         case 'd':       /* display */
  1108.         if ((getArg (&pLine, &adr, HEX, OPT) == OK) &&
  1109.             (getArg (&pLine, &nwords, DEC, OPT) == OK))
  1110.             d ((char *) adr, nwords);
  1111.         break;
  1112.         case 'e':       /* exception */
  1113.         printExcMsg (sysExcMsg + 1);
  1114.         break;
  1115.         case 'f':       /* fill */
  1116.         if ((getArg (&pLine, &adr, HEX, !OPT) == OK) &&
  1117.             (getArg (&pLine, &nbytes, DEC, !OPT) == OK) &&
  1118.             (getArg (&pLine, &value, DEC, !OPT) == OK))
  1119.             {
  1120.             bfillBytes ((char *) adr, nbytes, value);
  1121.             }
  1122.         break;
  1123.         case 't':       /* transpose(?) (running out of letters!) */
  1124.         if ((getArg (&pLine, &adr, HEX, !OPT) == OK) &&
  1125.             (getArg (&pLine, &adr2, HEX, !OPT) == OK) &&
  1126.             (getArg (&pLine, &nbytes, HEX, !OPT) == OK))
  1127.             {
  1128.             bcopy ((char *) adr, (char *) adr2, nbytes);
  1129.             }
  1130.         break;
  1131.         case 'm':       /* modify */
  1132.         if (getArg (&pLine, &adr, HEX, !OPT) == OK)
  1133.             m ((char *) adr);
  1134.         break;
  1135. #ifdef  TARGET_HK_V2F
  1136.         case 's':       /* system controller */
  1137.         {
  1138.         extern ULONG sysBCLSet ();
  1139.         if (getArg (&pLine, &value, DEC, !OPT) == OK)
  1140.             {
  1141.             if (value != 0)
  1142.             {
  1143.             (void) sysBCLSet ((ULONG)HK_BCL_SYS_CONTROLLER,
  1144.                       (ULONG)HK_BCL_SYS_CONTROLLER);
  1145.             printf ("System controller on.n");
  1146.             }
  1147.             else
  1148.             {
  1149.             (void) sysBCLSet ((ULONG)HK_BCL_SYS_CONTROLLER,
  1150.                       (ULONG)0);
  1151.             printf ("System controller off.n");
  1152.             }
  1153.             }
  1154.         break;
  1155.         }
  1156. #endif  /* TARGET_HK_V2F */
  1157. #if defined(TARGET_FRC_30) || defined(TARGET_FRC_31) || defined(TARGET_FRC_33)
  1158.         case 's':       /* system controller */
  1159.         if (getArg (&pLine, &value, DEC, !OPT) == OK)
  1160.             {
  1161.             if (value != 0)
  1162.             {
  1163.             *FGA_CTL1 |= FGA_CTL1_SCON;
  1164.             printf ("System controller on.n");
  1165.             }
  1166.             else
  1167.             {
  1168.             *FGA_CTL1 &= ~FGA_CTL1_SCON;
  1169.             printf ("System controller off.n");
  1170.             }
  1171.             }
  1172.         break;
  1173. #endif  /* TARGET_FRC_30 || TARGET_FRC_31 || TARGET_FRC_33 */
  1174.         case 'p':       /* print boot params */
  1175.         bootParamsShow (BOOT_LINE_ADRS);
  1176.         break;
  1177.         case 'c':       /* change boot params */
  1178.         bootParamsPrompt (BOOT_LINE_ADRS);
  1179.                 if (strlen(BOOT_LINE_ADRS) <= BOOT_LINE_SIZE)
  1180.                     {
  1181.                     if ((sysNvRamSet (BOOT_LINE_ADRS,
  1182.                         strlen (BOOT_LINE_ADRS) + 1, 0)) == ERROR)
  1183.                         printf("nNOTE: Bootline not saved to NVRAMn");
  1184.                     }
  1185.                 else
  1186.                     printf("nWARNING:Bootline longer than BOOT_LINE_SIZE "
  1187.                "(%d bytes). Not saved to NVRAMn",
  1188.                (int) BOOT_LINE_SIZE);
  1189.                 break;
  1190.         case 'g':       /* go */
  1191.         {
  1192.         int entryAddr;
  1193.         if (getArg (&pLine, &entryAddr, HEX, !OPT) == OK)
  1194.             {
  1195.             entry = (FUNCPTR)entryAddr;
  1196.             go (entry);
  1197.             }
  1198.         }
  1199.         break;
  1200. #ifdef  INCLUDE_NETWORK
  1201.         case 'n':
  1202.         netifAdrsPrint (pLine);
  1203.         break;
  1204. #ifdef ETHERNET_ADR_SET
  1205.         case 'N': /* this command is replaced by the 'M' command below */
  1206.         mEnet (pLine);
  1207.         break;
  1208. #endif  /* ETHERNET_ADR_SET */
  1209. #ifdef ETHERNET_MAC_HANDLER
  1210.         case 'M':
  1211.         sEnet (pLine);
  1212.         break;
  1213. #endif  /* ETHERNET_MAC_HANDLER */
  1214. #endif  /* INCLUDE_NETWORK */
  1215.         case '?':           /* help */
  1216.             case 'h':           /* help */
  1217.         bootHelp ();
  1218.         break;
  1219.             case '@':           /* load and go with internal params */
  1220.         case '$':           /* load and go with internal params */
  1221.         if (bootLoad (pLine, &entry) == OK)
  1222.             {
  1223.             go (entry);
  1224.             }
  1225.         else
  1226.             {
  1227.             taskDelay (sysClkRateGet ());   /* pause a second */
  1228.             reboot (BOOT_NO_AUTOBOOT);      /* something is awry */
  1229.             }
  1230.         break;
  1231.         case 'l':           /* load with internal params */
  1232.         if (bootLoad (pLine, &entry) == OK)
  1233.             {
  1234.             printf ("entry = 0x%xn", (int) entry);
  1235.             }
  1236.         else
  1237.             {
  1238.             taskDelay (sysClkRateGet ());   /* pause a second */
  1239.             reboot (BOOT_NO_AUTOBOOT);      /* something is awry */
  1240.             }
  1241.         break;
  1242.             case 'v':                   /* print version & logo */
  1243.                 printBootLogo ();
  1244.                 break;
  1245. #ifdef INCLUDE_EDR_ERRLOG
  1246.         case 'P':           /* display ED&R log */
  1247.         edrShow (0,0,0,0);
  1248.         break;
  1249.         case 'C':           /* clear ED&R log */
  1250.         edrClear ();
  1251.         break;
  1252. #endif
  1253.         default:
  1254.         printf ("Unrecognized command. Type '?' for help.n");
  1255.         break;
  1256.             } /* switch */
  1257.         } /* FOREVER */
  1258.     }
  1259. /******************************************************************************
  1260. *
  1261. * autoboot - do automatic boot sequence
  1262. *
  1263. * RETURNS: Doesn't return if successful (starts execution of booted system).
  1264. */
  1265. LOCAL char autoboot
  1266.     (
  1267.     int timeout     /* timeout time in seconds */
  1268.     )
  1269.     {
  1270.     ULONG   autoBootTime;
  1271.     int     timeLeft;
  1272.     UINT    timeMarker;
  1273.     int     bytesRead = 0;
  1274.     FUNCPTR entry;
  1275.     char    key;
  1276.     if (timeout > 0)
  1277.     {
  1278.     printf ("nPress any key to stop auto-boot...n");
  1279.     /* Loop looking for a char, or timeout after specified seconds */
  1280.     autoBootTime = tickGet () + sysClkRateGet () * timeout;
  1281.     timeMarker = tickGet () + sysClkRateGet ();
  1282.     timeLeft = timeout;
  1283.     printf ("%2dr", timeLeft);
  1284.      while ((tickGet () < autoBootTime) && (bytesRead == 0))
  1285.         {
  1286.         (void) ioctl (consoleFd, FIONREAD, (int) &bytesRead);
  1287.         if (tickGet () == timeMarker)
  1288.         {
  1289.         timeMarker = tickGet () + sysClkRateGet ();
  1290.         printf ("%2dr", --timeLeft);
  1291.         }
  1292.         }
  1293.     }
  1294.     if (bytesRead == 0)    /* nothing typed so auto-boot */
  1295.     {
  1296.     /* put the console back in line mode so it echoes (so's you can bang
  1297.      * on it to see if it's still alive) */
  1298.     (void) ioctl (consoleFd, FIOSETOPTIONS, OPT_TERMINAL);
  1299.     printf ("nauto-booting...nn");
  1300.     if (bootLoad (BOOT_LINE_ADRS, &entry) == OK)
  1301.         go (entry);             /* ... and never return */
  1302.     else
  1303.         {
  1304.         printf ("Can't load boot file!!n");
  1305.         taskDelay (sysClkRateGet ());   /* pause a second */
  1306.         reboot (BOOT_NO_AUTOBOOT);      /* something is awry */
  1307.         }
  1308.     }
  1309.     else
  1310.     {
  1311.     /* read the key that stopped autoboot */
  1312.     read (consoleFd, &key, 1);
  1313.     return (key & 0x7f);        /* mask off parity in raw mode */
  1314.     }
  1315.     return ((char)ERROR);           /* for lint - can't really get here */
  1316.     }
  1317. /******************************************************************************
  1318. *
  1319. * printBootLogo - print initial boot banner page
  1320. */
  1321. LOCAL void printBootLogo (void)
  1322.     {
  1323.     printf ("nnnnnnnnnnn");
  1324.     printf ("%28s%s", "","VxWorks System Boot");
  1325.     printf ("nnnCopyright 1984-2005  Wind River Systems, Inc.nnnnnn");
  1326.     printf ("CPU: %sn", sysModel ());
  1327.     printf ("Version: %sn", vxWorksVersion);
  1328.     printf ("BSP version: " BSP_VERSION BSP_REV "n");
  1329.     printf ("Creation date: %snn", creationDate);
  1330.     }
  1331. /*******************************************************************************
  1332. *
  1333. * bootHelp - print brief help list
  1334. */
  1335. LOCAL void bootHelp (void)
  1336.     {
  1337.     static char *helpMsg[] =
  1338.     {
  1339.     "?",                      "- print this list",
  1340.     "@",                      "- boot (load and go)",
  1341.     "p",                      "- print boot params",
  1342.     "c",                      "- change boot params",
  1343.     "l",                      "- load boot file",
  1344.     "g adrs",                 "- go to adrs",
  1345.     "d adrs[,n]",             "- display memory",
  1346.     "m adrs",                 "- modify memory",
  1347.     "f adrs, nbytes, value",  "- fill memory",
  1348.     "t adrs, adrs, nbytes",   "- copy memory",
  1349.     "e",                      "- print fatal exception",
  1350.         "v",                      "- print boot logo with version",
  1351. #ifdef INCLUDE_EDR_ERRLOG
  1352.         "P",                      "- print error log",
  1353.         "C",                      "- clear error log",
  1354. #endif /* INCLUDE_EDR_ERRLOG */
  1355. #ifdef INCLUDE_NETWORK
  1356.     "n netif",        "- print network interface device address",
  1357. #if defined(ETHERNET_ADR_SET)
  1358.     "N",              "- set ethernet address",
  1359. #endif  /* ETHERNET_ADR_SET */
  1360. #if defined(ETHERNET_MAC_HANDLER)
  1361.         "M [dev][unitNo] [MAC]",  "- set/display ethernet address",
  1362. #endif  /* ETHERNET_MAC_HANDLER */
  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. #ifdef INCLUDE_BOOTP
  1405.     "  0x40  - use bootp to get boot parameters",   "",
  1406. #else
  1407.     "  0x40  - autoconfigure: NOT AVAILABLE (no method installed)", "",
  1408. #endif /* INCLUDE_BOOTP */
  1409. #endif /* INCLUDE_DHCPC */
  1410.     "  0x80  - use tftp to get boot image",     "",
  1411.     "  0x100 - use proxy arp",          "",
  1412. #endif  /* INCLUDE_NETWORK */
  1413.     NULL
  1414.     };
  1415.     FAST char **pMsg;
  1416. #ifdef INCLUDE_END
  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 ("nEnhanced Network Devicesn");
  1427.     for (pDevTbl = endDevTbl; pDevTbl->endLoadFunc != END_TBL_END; pDevTbl++)
  1428.         {
  1429.         if (!pDevTbl->processed)
  1430.             {
  1431.             muxDevName [0] = EOS;
  1432.             pDevTbl->endLoadFunc (muxDevName, NULL);
  1433.             printf (" %s%d", muxDevName, pDevTbl->unit);
  1434.             }
  1435.         }
  1436. #endif /* INCLUDE_END */
  1437. #ifdef INCLUDE_VXBUS
  1438. vxbDevIterate((FUNCPTR)vxbFindHend,(void *)NULL,VXB_ITERATE_INSTANCES);
  1439. #endif /* INCLUDE_VXBUS */
  1440. #endif  /* INCLUDE_NETWORK */
  1441. #ifdef  INCLUDE_SCSI_BOOT
  1442.     printf (" scsi");
  1443. #endif  /*INCLUDE_SCSI_BOOT*/
  1444. #ifdef  INCLUDE_FD
  1445.     printf (" fd");
  1446. #endif  /* INCLUDE_FD */
  1447. #ifdef  INCLUDE_IDE
  1448.     printf (" ide");
  1449. #endif  /* INCLUDE_IDE */
  1450. #ifdef  INCLUDE_ATA
  1451.     printf (" ata");
  1452. #endif  /* INCLUDE_ATA */
  1453. #ifdef  INCLUDE_TFFS
  1454.     printf (" tffs");
  1455. #endif  /* INCLUDE_TFFS */
  1456. #ifdef  INCLUDE_TSFS_BOOT
  1457.     printf (" tsfs");
  1458. #endif  /* INCLUDE_TSFS_BOOT */
  1459. #ifdef INCLUDE_PCCARD
  1460.     printf ("nnPC Card boot devices:n");
  1461.     usrPccardDevShow (CS_END_ENABLER);
  1462.     usrPccardDevShow (CS_ATA_ENABLER);
  1463. #endif /* INCLUDE_PCCARD */
  1464.     printf ("n");
  1465.     }
  1466. #ifdef INCLUDE_NETWORK
  1467. #ifdef INCLUDE_BOOTP
  1468. /******************************************************************************
  1469. *
  1470. * bootpGet - get boot parameters via BOOTP.
  1471. *
  1472. * This routine retrieves a boot file name, host and target IP addresses, and
  1473. * subnet mask from a BOOTP server, using the bootstrap protocol defined in
  1474. * RFC 1542. The IP address and subnet mask values will only be stored in the
  1475. * boot parameters if not already specified. In order to use BOOTP, the boot
  1476. * device indicated by <pNetDev> must be capable of sending broadcast messages.
  1477. * Currently, only Ethernet devices and the shared-memory network drivers are
  1478. * supported. To use the shared-memory drivers, the target IP address must
  1479. * already be specified.
  1480. * .IP
  1481. * The routine is called when the SYSFLG_AUTOCONFIG boot flag is set and the
  1482. * BOOTP client is included in the boot program. If the DHCP client is also
  1483. * included, that protocol is used instead.
  1484. *
  1485. * RETURNS: OK if successful, or ERROR otherwise.
  1486. *
  1487. * ERRNO: N/A
  1488. *
  1489. * SEE ALSO: bootpLib, RFC 1542, RFC 951
  1490. */
  1491. LOCAL STATUS bootpGet
  1492.     (
  1493.     char *pNetDev,      /* boot device */
  1494.     char *pBootDevAddr,     /* device address */
  1495.     char *pBootFile,        /* file name */
  1496.     char *pHostAddr,        /* host address */
  1497.     int  *pMask         /* mask */
  1498.     )
  1499.     {
  1500. #ifndef INCLUDE_DHCPC
  1501.     struct bootpParams      bootParams;     /* parameter descriptor */
  1502.     struct in_addr      clntAddr;   /* client address */
  1503.     struct in_addr      hostAddr;   /* server address */
  1504.     struct in_addr      subnetMask; /* subnet mask */
  1505.     struct ifnet *              pIf;            /* network boot device */
  1506.     char    bootServer [INET_ADDR_LEN];/* boot server */
  1507.     subnetMask.s_addr         = 0;
  1508.     bzero ( (char *)&clntAddr, sizeof (struct in_addr));
  1509.     bzero ( (char *)&hostAddr, sizeof (struct in_addr));
  1510.     bzero (bootServer, INET_ADDR_LEN);
  1511.     bzero ((char *)&bootParams, sizeof (struct bootpParams));
  1512.     pIf = ifunit (pNetDev);
  1513.     if (pIf == NULL)
  1514.     return (ERROR);
  1515.     /* Need inet address to boot over the backplane */
  1516.     if ( (strncmp (pNetDev, "bp", 2) == 0) ||
  1517.             (strncmp (pNetDev, "sm", 2) == 0))
  1518.     {
  1519.     if (pBootDevAddr [0] == EOS)
  1520.         return (ERROR);
  1521.         clntAddr.s_addr = inet_addr (pBootDevAddr);
  1522.         if (clntAddr.s_addr == (ULONG)ERROR)
  1523.             return (ERROR);
  1524.     }
  1525.     /* Set pointers to retrieve needed boot parameters. */
  1526.     bootParams.netmask = &subnetMask;
  1527.     printf ("Getting boot parameters via network interface %s", pNetDev);
  1528.     if (bootpLibInit (BOOTP_MAX_HDRSIZE) == ERROR)
  1529.         return (ERROR);
  1530.     if (bootpParamsGet (pIf, BOOTP_MAX_REQUESTS, &clntAddr, &hostAddr,
  1531.                 NULL, pBootFile, &bootParams) == ERROR)
  1532.     return (ERROR);
  1533.     inet_ntoa_b (hostAddr, bootServer);
  1534.     printf ("nBootp Server:%sn", bootServer);
  1535.     if (pBootFile [0] == EOS)
  1536.     return (ERROR);             /* no bootfile */
  1537.     printf ("    Boot file: %sn", pBootFile);
  1538.     /* copies to params.had */
  1539.     if (pHostAddr [0] == EOS)           /* fill in host address */
  1540.     {
  1541.     strncpy (pHostAddr, bootServer, INET_ADDR_LEN);
  1542.     printf ("    Boot host: %sn", pHostAddr);
  1543.     }
  1544.     /*
  1545.      * copies to pBootDevAddr (params.ead or params.bad) if not using bp or sm
  1546.      * drivers and address is not already present.
  1547.      */
  1548.     if (pBootDevAddr [0] == EOS)        /* fill in inet address */
  1549.     {
  1550.         inet_ntoa_b (clntAddr, pBootDevAddr);
  1551.     printf ("    Boot device Addr (%s): %sn", pNetDev, pBootDevAddr);
  1552.     }
  1553.     /* copies to netmask */
  1554.     if ((*pMask == 0) && (subnetMask.s_addr != 0))
  1555.     {
  1556.         *pMask = ntohl (subnetMask.s_addr);
  1557.     printf ("    Subnet mask: 0x%xn", *pMask);
  1558.     }
  1559.     return (OK);
  1560. #else
  1561.     return (OK);            /* DHCP client used instead. */
  1562. #endif /* INCLUDE_DHCPC */
  1563.     }
  1564. #endif /* INCLUDE_BOOTP */
  1565. #ifdef INCLUDE_DHCPC
  1566. /******************************************************************************
  1567. *
  1568. * dhcpGet - get boot parameters with DHCP
  1569. *
  1570. * This routine retrieves a boot file name, host and target IP addresses, and
  1571. * subnet mask from a DHCP or BOOTP server, using the lease negotiation process
  1572. * defined in RFC 1541. The IP address and subnet mask values will only be
  1573. * stored in the boot parameters if not already specified. The DHCP client will
  1574. * select the longest offered lease which exceeds the DHCPC_MIN_LEASE value.
  1575. * Any DHCP lease will be given preference over BOOTP replies. Unless a
  1576. * specific lease duration is provided in the target IP address entry, the
  1577. * client requests the lease length defined by DHCPC_DEFAULT_LEASE. The client
  1578. * will collect additional DHCP offers until the interval specified by
  1579. * DHCPC_OFFER_TIMEOUT expires.
  1580. * .IP
  1581. * The <pNetDev> argument indicates the network device which will be used to
  1582. * send and receive DHCP messages. The DHCP client only supports devices
  1583. * attached to the IP protocol with the MUX/END interface. The MTU size of the
  1584. * network interface must be large enough to receive an IP datagram of 576
  1585. * bytes and the device also must be capable of sending broadcast messages.
  1586. * Finally, the target IP address must already be specified to use the
  1587. * shared-memory driver.
  1588. * .IP
  1589. * This routine executes when the SYSFLG_AUTOCONFIG boot flag is set and the
  1590. * DHCP client is included in the boot program.
  1591. *
  1592. * NOTE
  1593. * The boot file to be loaded must also contain the DHCP client library in
  1594. * order to continue using the assigned target IP address. In addition, the
  1595. * DHCP server included with Windows NT does not supply boot file names. If
  1596. * that server is used to supply the boot parameters, the boot file name must
  1597. * be entered manually.
  1598. *
  1599. * RETURNS: OK if successful, or ERROR otherwise.
  1600. *
  1601. * ERRNO: N/A
  1602. *
  1603. * SEE ALSO: dhcpcBootLib, RFC 1541
  1604. */
  1605. LOCAL STATUS dhcpGet
  1606.     (
  1607.     char *              pNetDev,        /* boot device */
  1608.     char *              pBootDevAddr,   /* device IP address */
  1609.     char *              pBootFile,      /* boot file name */
  1610.     char *              pHostAddr,      /* host IP address */
  1611.     int *               pMask,          /* target subnet mask */
  1612.     DHCP_LEASE_DATA *   pDhcpLease      /* lease times and addresses */
  1613.     )
  1614.     {
  1615.     STATUS              result;
  1616.     struct ifnet *      pIf;            /* pointer to network interface data */
  1617.     char                serverAddr [INET_ADDR_LEN];   /* DHCP server address */
  1618.     char                bootFile [BOOT_FILE_LEN];       /* name of boot file */
  1619.     int                 subnetMask;                     /* subnet mask */
  1620.     void *              pCookie;
  1621.     unsigned long       duration;
  1622.     struct dhcp_param bootParams;
  1623.     bzero (serverAddr, INET_ADDR_LEN);
  1624.     bzero ((char *) &bootParams, sizeof (struct dhcp_param));
  1625.     bootFile [0] = EOS;
  1626.     /*
  1627.      * Using pBootFile directly only works if all the DHCP servers supply a
  1628.      * bootfile. The Windows NT server does not, so we can't do this.
  1629.      */
  1630.     /* bootParams.file = pBootFile;  - Desired assignment to save memory. */
  1631.     bootParams.file = bootFile;
  1632.     bootParams.subnet_mask = (struct in_addr *) &subnetMask;
  1633.     pIf = ifunit (pNetDev);
  1634.     if (pIf == NULL)
  1635.         return (ERROR);
  1636.     printf ("Getting boot parameters via network interface %s.n", pNetDev);
  1637.     /* Setup client to retrieve address information from a DHCP server. */
  1638.     pCookie = dhcpcBootInit (pIf, DHCPC_SPORT, DHCPC_CPORT, DHCPC_MAX_MSGSIZE,
  1639.                              DHCPC_OFFER_TIMEOUT, DHCPC_DEFAULT_LEASE,
  1640.                              DHCPC_MIN_LEASE);
  1641.     if (pCookie == NULL)
  1642.         {
  1643.         printf ("Error initializing DHCP client.n");
  1644.         return (ERROR);
  1645.         }
  1646. #if (DHCPC_DISCOVER_RETRIES)
  1647.     dhcpcDiscoverRetries = DHCPC_DISCOVER_RETRIES;
  1648. #endif
  1649.     /*
  1650.      * Set requested lease length to value from bootline, and
  1651.      * make sure we specify it in network byte order.
  1652.      */
  1653.     duration = htonl (pDhcpLease->lease_duration);
  1654.     dhcpcOptionAdd (pCookie, _DHCP_LEASE_TIME_TAG, sizeof (int),
  1655.                     (UCHAR *) &duration);
  1656.     if (pBootDevAddr [0] == EOS)
  1657.         {
  1658.         /* Attempt to retrieve address information from a DHCP server. */
  1659.         result = dhcpcBootBind ();
  1660.         if (result != OK)
  1661.             return (ERROR);
  1662.         }
  1663.     else
  1664.         {
  1665.         /*
  1666.          * Externally configured address. Get any additional parameters.
  1667.          * Ignore any failure (since the network device can be configured)
  1668.          * as long as a boot file is available.
  1669.          */
  1670.         result = dhcpcBootInformGet (pBootDevAddr);
  1671.         if (result != OK)
  1672.             {
  1673.             if (pBootFile[0] == EOS)
  1674.                 return (ERROR);
  1675.             else
  1676.                 return (OK);
  1677.             }
  1678.         }
  1679.     result = dhcpcBootParamsGet (&bootParams);
  1680.     if (result == ERROR)
  1681.         return (ERROR);
  1682.     /* Fill in configuration parameters for storage in bootline. */
  1683.     if (pBootDevAddr[0] == EOS)
  1684.         {
  1685.         /*
  1686.          * If the DHCP process established a lease (which includes an IP
  1687.          * address assignment), get the assigned address and timestamp
  1688.          * values. This information is not available if an address is
  1689.          * assigned externally. (A DHCP inform message is sent in that case).
  1690.          */
  1691.         bcopy ((char *) &bootParams.yiaddr, (char *) &pDhcpLease->yiaddr,
  1692.                sizeof (struct in_addr));
  1693.         pDhcpLease->lease_duration = bootParams.lease_duration;
  1694.         pDhcpLease->lease_origin = bootParams.lease_origin;
  1695.         }
  1696.     inet_ntoa_b (bootParams.server_id, serverAddr);
  1697.     printf ("nDHCP Server:%sn", serverAddr);
  1698.     if (pBootFile [0] == EOS && bootFile[0] == EOS)
  1699.         return (ERROR);                         /* no bootfile */
  1700.     if (bootFile[0] != EOS)                     /* Save new bootfile */
  1701.         {
  1702.         bcopy (bootFile, pBootFile, BOOT_FILE_LEN);
  1703.         printf ("    Boot file: %sn", pBootFile);
  1704.         }
  1705.     if (pHostAddr [0] == EOS)                   /* fill in host address */
  1706.         {
  1707.         inet_ntoa_b (bootParams.siaddr, pHostAddr);
  1708.         printf ("    Boot host: %sn", pHostAddr);
  1709.         }
  1710.     /*
  1711.      * Fill in the target's IP address, if needed. The status
  1712.      * variable indicates the source of the IP address as follows:
  1713.      *    DHCP_NATIVE - assigned by a DHCP server
  1714.      *    DHCP_BOOTP - issued by a BOOTP server
  1715.      *    DHCP_MANUAL - entered in boot parameters
  1716.      */
  1717.     if (pBootDevAddr [0] == EOS)                /* fill in inet address */
  1718.         {
  1719.         /*
  1720.          * Use the IP address from the DHCP protocol.
  1721.          * The status variable has already been set.
  1722.          */
  1723.         inet_ntoa_b (bootParams.yiaddr, pBootDevAddr);
  1724.         printf ("    Boot device Addr (%s): %sn", pNetDev, pBootDevAddr);
  1725.         }
  1726.     if ((*pMask == 0) && (subnetMask != 0))
  1727.         {
  1728.         *pMask = ntohl (subnetMask);
  1729.         printf ("    Subnet mask: 0x%xn", *pMask);
  1730.         }
  1731.     return (OK);
  1732.     }
  1733. #endif /* INCLUDE_DHCPC */
  1734. /*******************************************************************************
  1735. *
  1736. * usrNetPoolConfig - initialize the network memory pools
  1737. *
  1738. * This routine allocates memory for and initializes the network memory pools.
  1739. *
  1740. * RETURNS: N/A
  1741. */
  1742. LOCAL void usrNetPoolConfig ()
  1743.     {
  1744.     netPoolDefaultConfigParams.cfgh.len = sizeof (NET_POOL_CONFIG_PARAMS);
  1745.     netPoolDefaultConfigParams.sysMblkClBlkConf = &sysMblkClBlkDesc;
  1746.     netPoolDefaultConfigParams.sysClDesc = &sysClDescTbl [0];
  1747.     netPoolDefaultConfigParams.sysClDescNum = sysClDescTblNumEnt;
  1748.     netPoolDefaultConfigParams.pktMblkClBlkConf = &pktMblkClBlkDesc;
  1749.     netPoolDefaultConfigParams.pktClDesc = &pktClDescTbl [0];
  1750.     netPoolDefaultConfigParams.pktClDescNum = pktClDescTblNumEnt;
  1751.     /* initialize _pNetDPool, _pNetSysPool */
  1752.     mbinit (&netPoolDefaultConfigParams);
  1753. #ifdef INCLUDE_NET_SYSCTL
  1754.     mbufSysctlInit ();
  1755. #endif
  1756.     }
  1757. /*******************************************************************************
  1758. *
  1759. * usrNetInit - initializes static tables for network stack
  1760. *
  1761. * This routine initializes static tables for the network stack.
  1762. *
  1763. * RETURNS: OK, or ERROR if initialization fails
  1764. */
  1765. LOCAL STATUS usrNetInit ()
  1766.     {
  1767.     int status;
  1768.     /* set up the default configuration parameters */
  1769.     status = netCoreSetup (MAX_LINKHDR_CFG, MAX_PROTOHDR_CFG,
  1770.    NMBCLUSTERS_CFG, IP_MAX_UNITS);
  1771.     if (status == ERROR)
  1772.     return (ERROR);
  1773. #ifdef INCLUDE_NET_SYSCTL
  1774.     netSysctlInit ();
  1775. #endif
  1776.     return (OK);
  1777.     }
  1778. /*******************************************************************************
  1779. *
  1780. * usrNetworkInit - bootrom version of network initialization
  1781. *
  1782. * This routine initializes all network components that are necessary for
  1783. * booting vxWorks.
  1784. *
  1785. * The bootrom version of network initialization is slightly different from
  1786. * the project facility version of InitGroup usrNetworkInit or the one in
  1787. * usrNetwork.c regarding to the following:
  1788. *
  1789. * RETURNS: OK or ERROR
  1790. */
  1791. LOCAL STATUS usrNetworkInit (void)
  1792.     {
  1793. #ifdef INCLUDE_DHCPC
  1794.     char netDev [BOOT_DEV_LEN + 1];
  1795. #endif
  1796. #ifdef INCLUDE_BOOTP
  1797.     char netDev [BOOT_DEV_LEN + 1];
  1798. #endif
  1799.     /* by default print messages during network initialization */
  1800.     _func_printErr = (FUNCPTR) printf;
  1801. #ifdef INCLUDE_APPL_LOG_UTIL
  1802.     usrNetApplUtilInit ();
  1803. #endif
  1804.     usrNetBoot (); /* INCLUDE_NET_BOOT */
  1805.     /* check if booting with shared memory driver */
  1806. #ifdef INCLUDE_SM_NET
  1807.     if (strncmp (sysBootParams.bootDev, "sm", 2) == 0)
  1808.        {
  1809.        if (sysProcNumGet () == 0)
  1810.       {
  1811.           printf ("Error: processor number must be non-zero to boot from smn");
  1812.       return (ERROR);
  1813.           }
  1814.     pAddrString = sysBootParams.bad;
  1815.     backplaneBoot = TRUE;
  1816.         }
  1817. #endif /* INCLUDE_SM_NET */
  1818.     usrNetmaskGet ();                           /* INCLUDE_NETMASK_GET */
  1819.     if (usrNetInit (NULL) == ERROR)     /* INCLUDE_NET_INIT */
  1820.     return (ERROR);
  1821.     netBufLibInit ();               /* INCLUDE_NETBUFLIB */
  1822. #ifdef INCLUDE_NETBUFPOOL
  1823.     netBufPoolInit ();              /* INCLUDE_NETBUFPOOL */
  1824. #endif
  1825. #ifdef INCLUDE_LINKBUFPOOL
  1826.     linkBufPoolInit ();             /* INCLUDE_LINKBUFPOOL */
  1827. #endif
  1828.     if (usrNetDaemonInit (NET_JOB_NUM_CFG,  /* INCLUDE_NET_DAEMON */
  1829.                   NET_TASK_PRIORITY,
  1830.                   NET_TASK_OPTIONS,
  1831.                   NET_TASK_STACKSIZE) == ERROR)
  1832.         return (ERROR);
  1833.     if (usrNetGtfInit () == ERROR)      /* INCLUDE_GTF */
  1834.     return (ERROR);
  1835.     usrNetPoolConfig ();                    /* INCLUDE_NET_POOL */
  1836.     usrNetRouteStorageInit ();                  /* INCLUDE_ROUTE_STORAGE */
  1837.                     /* InitGroup usrNetSocketInit */
  1838.     if (sockLibInit () == ERROR)        /* INCLUDE_SOCKLIB */
  1839.     return (ERROR);
  1840.     if (usrNetBsdSocket () == ERROR)        /* INCLUDE_BSD_SOCKET */
  1841.     return (ERROR);
  1842.                     /* InitGroup usrNetProtoInit */
  1843.     usrNetIfInit ();                            /* INCLUDE_IF */
  1844.     usrNetIpv4Init ();              /* INCLUDE_IPV4 */
  1845.     usrNetIcmpv4Init ();            /* INCLUDE_ICMPV4 */
  1846. #ifdef INCLUDE_UDPV4
  1847.     usrNetUdpv4Init ();
  1848. #endif
  1849. #ifdef INCLUDE_TCPV4
  1850.     usrNetTcpv4Init ();
  1851. #endif
  1852.     usrNetRawv4Init ();                 /* INCLUDE_RAWV4 */
  1853. #ifdef INCLUDE_IGMP
  1854.     usrNetIgmpInit ();
  1855. #endif
  1856.     usrNetRtSockInit ();            /* INCLUDE_ROUTING_SOCKET */
  1857.                     /* InitGroup usrNetMib2Init */
  1858.     if (m2IfInit (MIB2IF_TRAP_RTN,          /* INCLUDE_MIB2_IF */
  1859.               (void *) MIB2IF_TRAP_ARG) == ERROR)
  1860.         return (ERROR);
  1861.     domaininit (NULL);              /* INCLUDE_DOMAIN_INIT */
  1862.     route_init ();              /* INCLUDE_ROUTE */
  1863.     usrNetGtfTimerStart ();         /* INCLUDE_GTF_TIMER_START */
  1864.                     /* InitGroup usrNetDevStart */
  1865.     usrNetLoopbackStart ();                 /* INCLUDE_LOOPBACK */
  1866. #ifdef INCLUDE_ETHERNET
  1867.     if (usrNetEther () == ERROR)        /* INCLUDE_ETHERNET */
  1868.     return (ERROR);
  1869. #endif
  1870. #ifdef INCLUDE_END
  1871.     usrNetEndLibInit ();            /* INCLUDE_END */
  1872. #endif
  1873. #ifdef INCLUDE_BPF
  1874.     if (usrNetBpfDrvInit () == ERROR)
  1875.     return (ERROR);
  1876. #endif
  1877.     if (strncmp (sysBootParams.bootDev, "ppp", 3) == 0)
  1878.         {
  1879.         /* booting via ppp */
  1880. #ifdef INCLUDE_VXWORKS_5_X_EQUIV_PPP
  1881.         usrBasicPPPFrameworkInit ();
  1882.         printf ("Attaching network interface ppp...n");
  1883.         pppBootHandle = usrWindNetPPPInit (sysBootParams.bootDev,
  1884.                                            sysBootParams.ead,
  1885.                                            ((sysBootParams.gad[0] == EOS)?
  1886.                                             sysBootParams.had:
  1887.                                             sysBootParams.gad));
  1888.         if (pppBootHandle == NULL)
  1889.             return (ERROR);
  1890.         rebootHookAdd ((FUNCPTR) pppRebootHook);
  1891. #else
  1892.         printf ("nError: PPP not included.n");
  1893.         return (ERROR);
  1894. #endif /* INCLUDE_VXWORKS_5_X_EQUIV_PPP */
  1895.         }
  1896.     else
  1897.         {
  1898.         usrNetIpAttachCommon (pDevName, uNum,   /* INCLUDE_IPATTACH */
  1899.                       "IPv4", ipAttach);
  1900. #ifdef INCLUDE_SM_NET
  1901.         /*
  1902.          * Shared memory slaves do not require an address from the boot
  1903.          * parameters. If the backplane address is not given, those devices
  1904.          * will retrieve an address from the shared memory master.
  1905.          */
  1906.         if (backplaneBoot)
  1907.             {
  1908.             if (sysBootParams.bad [0] == EOS &&
  1909.                 (smEndInetAddrGet ("sm", uNum, NONE, sysBootParams.bad) == OK))
  1910.                 {
  1911.                 printf ("SM backplane IP address: %sn", sysBootParams.bad);
  1912.                 }
  1913.             if (sysBootParams.bad [0] == EOS)
  1914.                 {
  1915.                 printf ("Error: no backplane address specified.n");
  1916.                 return (ERROR);
  1917.                 }
  1918.             /* get gateway address if no specified */
  1919.             if ((sysBootParams.gad [0] == EOS) && !(sysFlags & SYSFLG_PROXY))
  1920.                 {
  1921.                 struct in_addr host;    /* Internet Address */
  1922.                 struct in_addr backpl;  /* Internet Address */
  1923.                 host.s_addr = inet_addr (sysBootParams.had);
  1924.                 backpl.s_addr = inet_addr (sysBootParams.bad);
  1925.                 if (in_netof(host) != in_netof(backpl))
  1926.                     {
  1927.                     /* Gateway address is available (assumed to be master) */
  1928.                     if (smEndInetAddrGet ("sm", uNum,
  1929.                                           0, sysBootParams.gad) == OK)
  1930.                         printf ("Gateway inet address: %sn",
  1931.                                 sysBootParams.gad);
  1932.                     }
  1933.                 }
  1934.             }
  1935. #endif /* INCLUDE_SM_NET */
  1936.                                         /* InitGroup usrNetworkAddrInit */
  1937.         if (sysFlags & SYSFLG_AUTOCONFIG)
  1938.         {
  1939. #ifdef INCLUDE_DHCPC
  1940.             sprintf (netDev, "%s%d", pDevName, uNum);
  1941.             if (dhcpGet (netDev, pAddrString, sysBootParams.bootFile,
  1942.                  sysBootParams.had, &netmask, &dhcpLease) == ERROR)
  1943.                 return (ERROR);
  1944. #else
  1945. #ifdef INCLUDE_BOOTP
  1946.             sprintf (netDev, "%s%d", pDevName, uNum);
  1947.             if (bootpGet (netDev, pAddrString, sysBootParams.bootFile, sysBootParams.had,
  1948.                          &netmask) == ERROR)
  1949.                 return (ERROR);
  1950. #else
  1951.             if (_func_printErr)
  1952.             (*_func_printErr) ("automatic address assignment requested but not included.n");
  1953.             return (ERROR);
  1954. #endif
  1955. #endif
  1956.             }
  1957.         if (usrNetBootConfig (pDevName, uNum,   /* INCLUDE_NET_BOOT_CONFIG */
  1958.                               pAddrString, netmask,
  1959.                               sysBootParams.gad) == ERROR)
  1960.             return (ERROR);
  1961.         }
  1962. #ifdef INCLUDE_HOST_TBL
  1963.     usrNetHostTblSetup ();
  1964. #endif
  1965. /* InitGroup usrNetRemoteInit */
  1966. #ifdef INCLUDE_REMLIB
  1967.     remLibInit (RSH_STDERR_SETUP_TIMEOUT);
  1968. #endif
  1969. #ifdef INCLUDE_NET_REM_IO
  1970.     usrNetRemoteCreate ();          /* INCLUDE_NET_REMIO, NET_DRV */
  1971. #endif
  1972.                     /* InitGroup usrNetAppInit */
  1973. #ifdef INCLUDE_FTP
  1974.     usrFtpStart ();
  1975. #endif
  1976.     return (OK);
  1977.     }
  1978. #endif /* INCLUDE_NETWORK */
  1979. /*******************************************************************************
  1980. *
  1981. * bootLoad - load a module into memory
  1982. *
  1983. * RETURNS: OK or ERROR
  1984. */
  1985. LOCAL STATUS bootLoad
  1986.     (
  1987.     char *   bootString,
  1988.     FUNCPTR *pEntry
  1989.     )
  1990.     {
  1991. #ifdef  INCLUDE_SCSI_BOOT
  1992. #ifdef  INCLUDE_SCSI2
  1993.      SCSI_OPTIONS   options;
  1994.      UINT       which;
  1995.      int        devBusId;
  1996. #endif  /* INCLUDE_SCSI2 */
  1997. #endif  /* INCLUDE_SCSI_BOOT */
  1998. #ifdef  INCLUDE_NETWORK
  1999.     int         result;     /* classification of address string */
  2000.     unsigned long   leaseLen;   /* lease length field (optional) */
  2001.     char                buf [30];
  2002.     char        bootDev [BOOT_DEV_LEN];
  2003.     char *      pBootAddr;
  2004.     IMPORT int          netTaskPriority;
  2005.     int                 oldTaskPriority;
  2006.     STATUS              status;
  2007. #endif  /* INCLUDE_NETWORK */
  2008.     /* copy bootString to low mem address, if specified */
  2009.     if ((bootString != NULL) && (*bootString != EOS))
  2010.         strcpy (BOOT_LINE_ADRS, bootString);
  2011.     /* interpret boot command */
  2012.     if (usrBootLineCrack (BOOT_LINE_ADRS, &sysBootParams) != OK)
  2013.         return (ERROR);
  2014.     /* Display boot parameters */
  2015.     bootParamsShow (BOOT_LINE_ADRS);
  2016.     /* set our processor number: may establish vme access, etc. */
  2017.     sysFlags = sysBootParams.flags;
  2018.     sysProcNumSet (sysBootParams.procNum);
  2019. #ifdef  INCLUDE_SCSI_BOOT
  2020.     /*
  2021.      * initialize either the SCSI1 or SCSI2 interface; initialize SCSI2 when
  2022.      * the SCSI2 interface is available.
  2023.      */
  2024. #ifndef INCLUDE_SCSI2
  2025.     scsi1IfInit ();
  2026. #else
  2027.     scsi2IfInit ();
  2028. #endif
  2029.     if (strncmp (sysBootParams.bootDev, "scsi", 4) == 0)
  2030.         {
  2031.         int bootDevId = NONE;
  2032.         int bootDevLUN = NONE;
  2033. #ifdef INCLUDE_SCSI2
  2034.         /* Set all devices to asynchronous data transfer */
  2035.         which = SCSI_SET_OPT_XFER_PARAMS;
  2036.         options.maxOffset = 0;
  2037.         options.minPeriod = SCSI_SYNC_XFER_MIN_PERIOD;
  2038.         for (devBusId = 0; devBusId < 8; devBusId++)
  2039.             {
  2040.             scsiTargetOptionsSet (pSysScsiCtrl, devBusId, &options, which);
  2041.             }
  2042. #endif /* INCLUDE_SCSI2 */
  2043.         /*
  2044.          * check for absence of bus ID and LUN, in which case
  2045.          * auto-configure and display results
  2046.          */
  2047.         if (sysBootParams.bootDev[4] == EOS)
  2048.             {
  2049.             if (!scsiInitialized)
  2050.                 {
  2051.                 if (sysScsiInit () == ERROR)
  2052.                     {
  2053.                     printErr ("Could not initialize SCSI.n");
  2054.                     return (ERROR);
  2055.                     }
  2056.                 scsiInitialized = TRUE;
  2057.                 }
  2058.             scsiAutoConfig (pSysScsiCtrl);
  2059.             scsiShow (pSysScsiCtrl);
  2060.             /* return ERROR to indicate that no file was loaded */
  2061.             return (ERROR);
  2062.             }
  2063.         sscanf (sysBootParams.bootDev, "%*4s%*c%d%*c%d",
  2064.                 &bootDevId, &bootDevLUN);
  2065.         if (scsiLoad (bootDevId, bootDevLUN,
  2066.                       sysBootParams.bootFile, pEntry) != OK)
  2067.             {
  2068.             printErr ("nError loading file: errno = 0x%x.n", errno);
  2069.             return (ERROR);
  2070.             }
  2071.         return (OK);
  2072.         }
  2073. #endif  /* INCLUDE_SCSI_BOOT */
  2074. #ifdef  INCLUDE_FD
  2075.     if (strncmp (sysBootParams.bootDev, "fd", 2) == 0)
  2076.         {
  2077.         int type = 0;
  2078.         int drive = 0;
  2079.         if (sysBootParams.bootDev[2] == EOS)     /* was strlen() == 2 */
  2080.             return (ERROR);
  2081.         sscanf (sysBootParams.bootDev, "%*2s%*c%d%*c%d", &drive, &type);
  2082.         if (fdLoad (drive, type, sysBootParams.bootFile, pEntry) != OK)
  2083.             {
  2084.             printErr ("nError loading file: errno = 0x%x.n", errno);
  2085.             return (ERROR);
  2086.             }
  2087.         return (OK);
  2088.         }
  2089. #endif  /* INCLUDE_FD */
  2090. #ifdef  INCLUDE_IDE
  2091.     if (strncmp (sysBootParams.bootDev, "ide", 3) == 0)
  2092.         {
  2093.         int type = 0;
  2094.         int drive = 0;
  2095.         if (sysBootParams.bootDev[3] == EOS)
  2096.             return (ERROR);
  2097.         sscanf (sysBootParams.bootDev, "%*3s%*c%d%*c%d", &drive, &type);
  2098.         if (ideLoad (drive, type, sysBootParams.bootFile, pEntry) != OK)
  2099.             {
  2100.             printErr ("nError loading file: errno = 0x%x.n", errno);
  2101.             return (ERROR);
  2102.             }
  2103.         return (OK);
  2104.         }
  2105. #endif  /* INCLUDE_IDE */
  2106. #ifdef  INCLUDE_ATA
  2107.     if (strncmp (sysBootParams.bootDev, "ata", 3) == 0)
  2108.         {
  2109.         int ctrl  = 0;
  2110.         int drive = 0;
  2111.         if (sysBootParams.bootDev[3] == EOS)
  2112.             return (ERROR);
  2113.         sscanf (sysBootParams.bootDev, "%*3s%*c%d%*c%d", &ctrl, &drive);
  2114.         if (ataLoad (ctrl, drive, sysBootParams.bootFile, pEntry) != OK)
  2115.             {
  2116.             printErr ("nError loading file: errno = 0x%x.n", errno);
  2117.             return (ERROR);
  2118.             }
  2119.         return (OK);
  2120.         }
  2121. #endif  /* INCLUDE_ATA */
  2122. #ifdef  INCLUDE_PCMCIA
  2123.     if (strncmp (sysBootParams.bootDev, "pcmcia", 6) == 0)
  2124.         {
  2125.         int sock    = NONE;
  2126.         if (sysBootParams.bootDev[6] == EOS)
  2127.             return (ERROR);
  2128.         sscanf (sysBootParams.bootDev, "%*6s%*c%d", &sock);
  2129.         if (pcmciaLoad (sock, sysBootParams.bootFile, pEntry) == OK)
  2130.             return (OK);
  2131.         /*
  2132.          * fall through if the PC card is not a block device.
  2133.          * let's try to boot it from an ethernet device.
  2134.          */
  2135.         printErr ("nCannot load from PCMCIA block device."
  2136.                   "nTrying alternate PCMCIA devices ... ");
  2137.         }
  2138. #endif  /* INCLUDE_PCMCIA */
  2139. #ifdef  INCLUDE_FLASH_BOOT
  2140.     if (strncmp (sysBootParams.bootDev, "flash:", 5) == 0)
  2141.         {
  2142.         if (flashLoad (sysBootParams.bootFile, pEntry) != OK)
  2143.             {
  2144.             printErr ("nError loading file: errno = 0x%x.n", errno);
  2145.             return (ERROR);
  2146.             }
  2147.         return (OK);
  2148.         }
  2149. #endif  /* INCLUDE_FLASH_BOOT */