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

VxWorks

开发平台:

C/C++

  1.  /* romMipsInit.s - MIPS ROM initialization module   */
  2. /* Copyright 2001-2002 Wind River Systems, Inc. */
  3.     .data
  4.     .globl  copyright_wind_river
  5. /*
  6.  * This file has been developed or significantly modified by the
  7.  * MIPS Center of Excellence Dedicated Engineering Staff.
  8.  * This notice is as per the MIPS Center of Excellence Master Partner
  9.  * Agreement, do not remove this notice without checking first with
  10.  * WR/Platforms MIPS Center of Excellence engineering management.
  11.  */
  12. /*
  13. modification history
  14. --------------------
  15. 01h,07jun02,jmt  Modified to add override of exception table
  16. 01g,18jan02,tlc  Add .set noreorder to ROM vector section.
  17. 01f,05sep01,tlc  Revise boot vector table.
  18. 01e,16jul01,tlc  Add CofE copyright.
  19. 01d,18jun01,tlc  Add relocation to KSEG0 for cached ROMS.  Add sysLedErr()
  20.  routine.
  21. 01c,14jun01,tlc  Remove definition of WBFL.
  22. 01b,13jun01,tlc  Use INITIAL_SR macro to initialize the Status Register.
  23. 01a,12jun01,tlc  Add MACRO to perform initial configuration of CONFIG
  24.  register.
  25. */
  26. /*
  27. DESCRIPTION
  28. This module contains the common MIPS entry code for the VxWorks bootrom.
  29. The entry point romInit, is the first code executed on power-up.  All MIPS
  30. BSPs can utilize this source code for the romInit routine.  To do so 
  31. requires the following steps.
  32. 1) Determine if the CONFIG_INIT macro is suitable for the target BSP.  It
  33.    simply loads the macro INITIAL_CFG into the CONFIG register.  BSPs
  34.    requiring other means of CONFIG register initialization should #define
  35.    an alternative CONFIG_INIT macro in their romInit.s files.
  36. 2) Determine if the CONFIG1_INIT macro is suitable for the target BSP. Some
  37.    MIPS targets have a CONFIG 1 coprocessor register that must be initialized
  38.    in romInit.s.  The default simply performs a noop.  BSPs requiring CONFIG 1
  39.    initialization should #define an alternative CONFIG1_INIT macro in their
  40.    romInit.s files.
  41. 3) Determine if the default vector table is suitable for the target BSP.  Some
  42.    MIPS targets have a larger vector table or different vector requirements.
  43.    To create a different vector table, define the MIPS_VECTOR_TABLE macro in
  44.    romInit.s.  The macro should be of the form:
  45.       #define MIPS_VECTOR_TABLE
  46.       RVECENT(__romInit,0)       /@ PROM entry point @/ 
  47.       RVECENT(romReboot,1)       /@ software reboot @/ 
  48.       RVECENT(romReserved,2) 
  49.       RVECENT(romReserved,3) 
  50.       ...
  51.    If no MIPS_VECTOR_TABLE macro is defined, the default table is included.
  52. 4) Create a routine, sysMemInit(), which is called by the common romInit()
  53.    routine and initializes memory for the system.  This routine should be
  54.    placed in the BSP's romInit.s file.
  55. 5) Create a routine, sysCacheInit(), which is called by the common romInit()
  56.    routine and initializes memory for the system.  This routine should be
  57.    placed in the BSP's romInit.s file.
  58. 6) Create a macro, INITIAL_SR, which defines the initial Status Register
  59.    value for the system.  This may be placed in <bsp>.h.
  60. 7) Include the file "romMipsInit.s" at the *top* of the BSP's romInit.s file;
  61.    just after header and macro definitions.
  62. */
  63. /* 
  64.  * Configure the CONFIG register
  65.  * 
  66.  * This macro configures the config register using the INITIAL_CFG
  67.  * value in <bsp>.h.
  68.  *
  69.  * NOTE: This macro may have already been defined by the BSP.
  70.  */
  71.  
  72. #ifndef CONFIG_INIT
  73. #define CONFIG_INIT 
  74. mfc0 t0, C0_CONFIG ;    
  75. HAZARD_CP_READ ;    
  76. and t0, ~0x07 ;    
  77. or t0, KSEG0_CACHE_MODE;
  78. mtc0 t0, C0_CONFIG ;    
  79. HAZARD_CP_WRITE
  80. #endif
  81.  
  82.  
  83. /* Configure the CONFIG 1 register
  84.  *
  85.  * This macro configures the config 1 register available on only
  86.  * some MIPS devices.  The default macro performs no operation.
  87.  *
  88.  * NOTE: This macro may have already been defined by the BSP.
  89.  */
  90.  
  91. #ifndef CONFIG1_INIT
  92. #define CONFIG1_INIT ssnop
  93. #endif
  94.     
  95. /* Relocate an address.
  96.  * 
  97.  * This macro is used to call routines from romInit() that are
  98.  * outside the romInit.s file. This routine trashes the ra
  99.  * register.
  100.  *
  101.  * NOTE: This macro may have already been defined by the BSP.
  102.  */
  103.  
  104. #ifndef RELOC
  105. #define RELOC(toreg,address)      
  106. bal 9f              ; 
  107. 9: ; 
  108. la toreg,address   ; 
  109. addu toreg,ra        ; 
  110. la ra,9b           ; 
  111. subu toreg,ra
  112. #endif
  113. #define RVECENT(f,n) 
  114. b f; nop
  115. #define XVECENT(f,bev) 
  116. b f; li k0,bev
  117. /* internals */
  118. .globl romInit        /* start of system code       */
  119. .globl romTextUpdate
  120. /* externals */
  121. .extern romStart               /* system initialization routine       */
  122.  
  123. .data
  124. /* ensure data segment is 16-byte aligned */
  125. .align 4
  126. _sdata:
  127. .asciiz "start of data"
  128. .text
  129. .set noreorder
  130. promEntry:
  131. romInit:
  132. _romInit:
  133. #ifdef  MIPS_VECTOR_TABLE
  134. MIPS_VECTOR_TABLE
  135. #else /* MIPS_VECTOR_TABLE */
  136. RVECENT(__romInit,  0)         /* PROM entry point       */
  137. RVECENT(romReboot,  1)        /* software reboot       */
  138. RVECENT(romReserved,2)
  139. RVECENT(romReserved,3)
  140. RVECENT(romReserved,4)
  141. RVECENT(romReserved,5)
  142. RVECENT(romReserved,6)
  143. RVECENT(romReserved,7)
  144. RVECENT(romReserved,8)
  145. RVECENT(romReserved,9)
  146. RVECENT(romReserved,10)
  147. RVECENT(romReserved,11)
  148. RVECENT(romReserved,12)
  149. RVECENT(romReserved,13)
  150. RVECENT(romReserved,14)
  151. RVECENT(romReserved,15)
  152. RVECENT(romReserved,16)
  153. RVECENT(romReserved,17)
  154. RVECENT(romReserved,18)
  155. RVECENT(romReserved,19)
  156. RVECENT(romReserved,20)
  157. RVECENT(romReserved,21)
  158. RVECENT(romReserved,22)
  159. RVECENT(romReserved,23)
  160. RVECENT(romReserved,24)
  161. RVECENT(romReserved,25)
  162. RVECENT(romReserved,26)
  163. RVECENT(romReserved,27)
  164. RVECENT(romReserved,28)
  165. RVECENT(romReserved,29)
  166. RVECENT(romReserved,30)
  167. RVECENT(romReserved,31)
  168. RVECENT(romReserved,32)
  169. RVECENT(romReserved,33)
  170. RVECENT(romReserved,34)
  171. RVECENT(romReserved,35)
  172. RVECENT(romReserved,36)
  173. RVECENT(romReserved,37)
  174. RVECENT(romReserved,38)
  175. RVECENT(romReserved,39)
  176. RVECENT(romReserved,40)
  177. RVECENT(romReserved,41)
  178. RVECENT(romReserved,42)
  179. RVECENT(romReserved,43)
  180. RVECENT(romReserved,44)
  181. RVECENT(romReserved,45)
  182. RVECENT(romReserved,46)
  183. RVECENT(romReserved,47)
  184. RVECENT(romReserved,48)
  185. RVECENT(romReserved,49)
  186. RVECENT(romReserved,50)
  187. RVECENT(romReserved,51)
  188. RVECENT(romReserved,52)
  189. RVECENT(romReserved,53)
  190. RVECENT(romReserved,54)
  191. RVECENT(romReserved,55)
  192. RVECENT(romReserved,56)
  193. RVECENT(romReserved,57)
  194. RVECENT(romReserved,58)
  195. RVECENT(romReserved,59)
  196. RVECENT(romReserved,60)
  197. RVECENT(romReserved,61)
  198. RVECENT(romReserved,62)
  199. RVECENT(romReserved,63)
  200. XVECENT(romExcHandle,0x200)    /* bfc00200: R4000 tlbmiss vector      */
  201. RVECENT(romReserved,65)
  202. RVECENT(romReserved,66)
  203. RVECENT(romReserved,67)
  204. RVECENT(romReserved,68)
  205. RVECENT(romReserved,69)
  206. RVECENT(romReserved,70)
  207. RVECENT(romReserved,71)
  208. RVECENT(romReserved,72)
  209. RVECENT(romReserved,73)
  210. RVECENT(romReserved,74)
  211. RVECENT(romReserved,75)
  212. RVECENT(romReserved,76)
  213. RVECENT(romReserved,77)
  214. RVECENT(romReserved,78)
  215. RVECENT(romReserved,79)
  216. XVECENT(romExcHandle,0x280)    /* bfc00280: R4000 xtlbmiss vector     */
  217. RVECENT(romReserved,81)
  218. RVECENT(romReserved,82)
  219. RVECENT(romReserved,83)
  220. RVECENT(romReserved,84)
  221. RVECENT(romReserved,85)
  222. RVECENT(romReserved,86)
  223. RVECENT(romReserved,87)
  224. RVECENT(romReserved,88)
  225. RVECENT(romReserved,89)
  226. RVECENT(romReserved,90)
  227. RVECENT(romReserved,91)
  228. RVECENT(romReserved,92)
  229. RVECENT(romReserved,93)
  230. RVECENT(romReserved,94)
  231. RVECENT(romReserved,95)
  232. XVECENT(romExcHandle,0x300)    /* bfc00300: R4000 cache vector       */
  233. RVECENT(romReserved,97)
  234. RVECENT(romReserved,98)
  235. RVECENT(romReserved,99)
  236. RVECENT(romReserved,100)
  237. RVECENT(romReserved,101)
  238. RVECENT(romReserved,102)
  239. RVECENT(romReserved,103)
  240. RVECENT(romReserved,104)
  241. RVECENT(romReserved,105)
  242. RVECENT(romReserved,106)
  243. RVECENT(romReserved,107)
  244. RVECENT(romReserved,108)
  245. RVECENT(romReserved,109)
  246. RVECENT(romReserved,110)
  247. RVECENT(romReserved,111)
  248. XVECENT(romExcHandle,0x380)    /* bfc00380: R4000 general vector      */
  249. RVECENT(romReserved,113)
  250. RVECENT(romReserved,114)
  251. RVECENT(romReserved,115)
  252. RVECENT(romReserved,116)
  253. RVECENT(romReserved,117)
  254. RVECENT(romReserved,118)
  255. RVECENT(romReserved,119)
  256. RVECENT(romReserved,120)
  257. RVECENT(romReserved,121)
  258. RVECENT(romReserved,122)
  259. RVECENT(romReserved,123)
  260. RVECENT(romReserved,124)
  261. RVECENT(romReserved,125)
  262. RVECENT(romReserved,126)
  263. RVECENT(romReserved,127)
  264. /* We hope there are no more reserved vectors!
  265.  * 128 * 8 == 1024 == 0x400
  266.  * so this is address R_VEC+0x400 == 0xbfc00400
  267.  */
  268. #endif /* MIPS_VECTOR_TABLE */
  269. .set reorder
  270. .align 4
  271. /*****************************************************************************
  272. *
  273. * romInit - entry point for VxWorks in ROM
  274. *
  275. *
  276. * romInit 
  277. *     (
  278. *     int startType
  279. *     )
  280. */
  281. __romInit:
  282. /* force power-on startType */
  283. li a0, BOOT_CLEAR
  284. /*
  285.  * If there was some way to distinguish between a cold and warm
  286.  * restart AND the memory system is guaranteed to be intact then
  287.  * we could load BOOT_NORMAL instead
  288. */
  289. romReboot:  
  290.                            /* sw reboot inherits a0 startType */
  291. move s0, a0                     /* save startType       */
  292.  
  293. /* clear software interrupts */
  294.     
  295. mtc0 zero, C0_CAUSE
  296. mtc0 zero, C0_WATCHLO
  297. mtc0 zero, C0_WATCHHI
  298. HAZARD_CP_WRITE
  299. /* initialize status register */
  300.     
  301. li t0, INITIAL_SR
  302. mtc0 t0, C0_SR
  303. HAZARD_INTERRUPT
  304. /* give us as long as possible before a clock interrupt */
  305. li t0, 1
  306. mtc0 t0, C0_COUNT
  307. mtc0 zero, C0_COMPARE
  308. /* setup CONFIG registers using pre-defined macro */
  309. CONFIG_INIT
  310.     
  311. /* absolutely basic initialization to allow things to continue */
  312. bal sysMemInit                      /* Initialize the DDR Memory  */
  313. nop
  314. bal sysCacheInit                    /* Initialize the 4Kc Cache   */
  315. nop
  316.  
  317.   andi t0, s0, BOOT_CLEAR
  318. beqz t0, romWarm
  319. nop
  320. bal romClearEdac
  321.     
  322. romWarm:
  323. #if (ROM_TEXT_ADRS == 0x9fc00000)
  324.        
  325. /* Switch to cached space so that copying ROM into RAM is faster */
  326.        
  327. RELOC(t0,0f)
  328. and t0, ~0x20000000
  329. jal t0
  330. 0:
  331. #endif
  332.  
  333. /* Set stack to grow down from beginning of data and call init       */
  334. la gp, _gp       /* set global ptr from compiler */
  335. la sp, STACK_ADRS-(4*_RTypeSize) /* set stack to begin of data   */
  336. move a0, s0       /* push arg = start type       */
  337. sync       /* flush any last-minute writes */
  338.   
  339. RELOC(t0, romStart)
  340. jal t0    
  341. nop                       /* starts kernel, never returns */
  342. nop
  343. 1:
  344. b 1b
  345. nop
  346. /***************************************************************************
  347. *
  348. * romTextUpdate - do cache-text-update from bootApp
  349. *
  350. * Tail-call to 4kc cache routine, as we don't need to allocate a stack.
  351. */
  352. .ent romTextUpdate
  353. romTextUpdate:
  354. li a0, 0x4000                     /* I-cache size                */
  355. li a1, 16                         /* I-cache line size           */
  356. li a2, 0x4000                     /* D-cache size                */
  357. li a3, 16                         /* D-cache line size           */
  358. la t0, cache4kcRomTextUpdate
  359. j t0
  360. .end romTextUpdate
  361. /***************************************************************************
  362. *
  363. * romReserved -  Handle a jump to an unknown vector
  364. *
  365. *
  366. */
  367. .ent romReserved
  368. romReserved:
  369. b romInit                /* just start over             */
  370. .end romReserved