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

VxWorks

开发平台:

C/C++

  1. /* sysALib.s - IDT79PMC438 system-dependent assembly routines */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5.  * This file has been developed or significantly modified by the
  6.  * MIPS Center of Excellence Dedicated Engineering Staff.
  7.  * This notice is as per the MIPS Center of Excellence Master Partner
  8.  * Agreement, do not remove this notice without checking first with
  9.  * WR/Platforms MIPS Center of Excellence engineering management.
  10.  */
  11.         .data
  12.         .globl  copyright_wind_river
  13. /*
  14. modification history
  15. --------------------
  16.  
  17. 01a,28may02,krao  written
  18. */
  19. /*
  20. DESCRIPTION
  21. This module contains system-dependent routines written in assembly
  22. language.
  23. This module must be the first specified in the command used to
  24. build the system.  The sysInit() routine is the system start-up code.
  25. */
  26. /* includes */
  27. #define _ASMLANGUAGE
  28. #include "vxWorks.h"
  29. #include "arch/mips/ivMips.h"
  30. #include "arch/mips/asmMips.h"
  31. #include "arch/mips/esfMips.h"
  32. #include "sysLib.h"
  33. #include "config.h"
  34. #include "asm.h"
  35. #include "esf.h"
  36. /* defines */
  37. #define  CHAR_DISPLAY_DELAY (CPU_CLOCK_RATE/2)
  38. #ifndef RC32438_N_TLB_ENTRIES
  39. #define RC32438_N_TLB_ENTRIES   16
  40. #define MIPS_N_TLB_ENTRIES RC32438_N_TLB_ENTRIES
  41. #endif
  42.  
  43. #define P_ENTRY_SHIFT  12 /* shift to convert VM page# to virt address */
  44. #define KSEG1(addr) (((addr) & 0x1fffffff) | K1BASE)
  45.  
  46.         
  47. /* externals */
  48. .globl usrInit              /* system initialization routine */
  49.  
  50. /* internals */
  51. .globl  sysWait /* wait for keyboard ready */
  52. .globl sysInit /* start of system code */
  53. .globl sysGpInit /* initialize global pointer */
  54. .globl sysClearTlbEntry /* clear entry in tlb */
  55. .globl  sysWbFlush /* flush write buffers */
  56. .globl  sysFpaAck /* flush write buffers */
  57. .globl  sysCompareSet
  58. .globl  sysCompareGet
  59. .globl  sysCountSet
  60. .globl  sysCountGet
  61. .globl  sysTimerIntClr
  62. .globl sysConfigGet
  63. .globl sysConfig1Get
  64. .globl  sysSetPageSize 
  65. .globl  sysSetTlbEntry
  66. .text
  67.         
  68. /*******************************************************************************
  69. *
  70. * sysInit - start after boot
  71. *
  72. * This routine is the system start-up entry point for VxWorks in RAM, the
  73. * first code executed after booting.  It disables interrupts, sets up the
  74. * stack, and jumps to the C routine usrInit() in usrConfig.c.
  75. *
  76. * The initial stack is set to grow down from the address of sysInit().  This
  77. * stack is used only by usrInit() and is never used again.  Memory for the
  78. * stack must be accounted for when determining the system load address.
  79. *
  80. * NOTE: This routine should not be called by the user.
  81. *
  82. * RETURNS: N/A
  83. *
  84. * sysInit (void) /@ THIS IS NOT A CALLABLE ROUTINE @/
  85. *
  86. */
  87. .set reorder
  88. .ent sysInit
  89. sysInit:
  90.  
  91.  
  92. /* disable all interrupts */
  93. li t0, SR_CU0
  94. mtc0 t0, C0_SR
  95. mtc0 zero, C0_CAUSE /* clear software interrupts */
  96. /* give us as long as possible before a clock interrupt */
  97.  
  98. li v0,1
  99. mtc0 v0,C0_COUNT
  100. mtc0 zero,C0_COMPARE
  101.  
  102. /* set stack to grow down from code, leave room for four parameters */
  103. la sp, sysInit-(4*_RTypeSize)
  104. la gp,_gp /* set global ptr from cmplr */
  105.  
  106. li a0, BOOT_WARM_AUTOBOOT  /* push start type arg = WARM_BOOT */
  107. jal usrInit /* never returns - starts up kernel */
  108. nop
  109. nop
  110.  
  111. li ra, R_VEC /* load prom reset address */
  112. j ra /* just in case */
  113. .end sysInit
  114. /*******************************************************************************
  115. *
  116. * sysClearTlbEntry - clear translation lookaside buffer entry
  117. *
  118. * This routine clears a specified translation lookaside buffer (TLB)
  119. * entry by writing a zero to the virtual page number and valid bit.
  120. *
  121. * RETURNS: N/A
  122. *
  123. * void sysClearTlbEntry
  124. *     (
  125. *     int entry
  126. *     )
  127. *
  128. */
  129. .ent sysClearTlbEntry
  130. sysClearTlbEntry:
  131.  
  132. subu t0, a0, MIPS_N_TLB_ENTRIES - 1
  133. bgtz t0, invalidEntry /* is my index bad ? */
  134. move t1, a0 /* generate unique tlbhi value */
  135. sll t1, P_ENTRY_SHIFT+1 /* leave Valid bit set to zero */
  136. /* +1 because VPN2 field maps 2 pages */
  137. mtc0 t1,C0_TLBHI /* set tlbhi entry */
  138. mtc0 zero,C0_TLBLO0 /* set valid bit to zero */
  139. mtc0 zero,C0_TLBLO1 /* set valid bit to zero */
  140. mtc0 zero,C0_PAGEMASK /* 4k pages */
  141. mtc0 a0,C0_INX /* set up index for write     */
  142. HAZARD_CP_WRITE 
  143. c0 C0_WRITEI /* write entry */
  144. HAZARD_CP_WRITE 
  145. invalidEntry:
  146. j ra
  147. .end sysClearTlbEntry
  148. /***************************************************
  149. *
  150. * sysSetTlbEntry - sets one MMU entry
  151. *
  152. * RETURNS: N/A
  153. *
  154. * void sysSetTlbEntry
  155. *     (
  156. *     UINT32 tlbInx          /@ C0_INX reg value @/
  157. *     UINT32 tlbHi,          /@ C0_TLBHI reg value @/
  158. *     UINT32 tlbLo0,         /@ C0_TLBLO0 reg value @/
  159. *     UINT32 tlbLo1          /@ C0_TLBLO1 reg value @/
  160. *     )
  161. */
  162. .ent sysSetTlbEntry
  163. sysSetTlbEntry:
  164.         .set noreorder
  165. HAZARD_CP_WRITE
  166. mtc0 a0,C0_INX
  167.         mtc0 a1,C0_TLBHI
  168.         mtc0 a2,C0_TLBLO0
  169.         mtc0 a3,C0_TLBLO1
  170. HAZARD_CP_WRITE
  171.         tlbwi
  172. HAZARD_TLB
  173.         .set reorder
  174.  
  175.         j      ra
  176.         nop
  177.         .end sysSetTlbEntry
  178. /*******************************************************************************
  179. *
  180. * sysCompareSet - set the timer compare register
  181. *
  182. * Care is taken to make sure that no interrupts are missed.
  183. *
  184. * RETURNS: N/A
  185. *
  186. * int sysCompareSet (void)
  187. *
  188. */
  189. .lcomm softCompare, 4
  190. .ent sysCompareSet
  191. sysCompareSet:
  192.  
  193.  
  194. li v1,CNTR_TMR0_COUNTREG
  195.  
  196. sw a0,CNTR_TMR0_COMPREG
  197. nop
  198. nop
  199. 1:
  200. j ra
  201. .end sysCompareSet
  202. /*******************************************************************************
  203. *
  204. * sysCompareGet - get the timer compare register
  205. *
  206. * Care is taken to make sure that no interrupts are missed.
  207. *
  208. * RETURNS: N/A
  209. *
  210. * int sysCompareGet (void)
  211. *
  212. */
  213. .ent sysCompareGet
  214. sysCompareGet:
  215.  
  216. li t0,CNTR_TMR0_COMPREG
  217. lw v0,0x0(t0)
  218. nop
  219. j ra
  220. .end sysCompareGet
  221. /*******************************************************************************
  222. *
  223. * sysWbFlush - flush the write buffer
  224. *
  225. * This routine flushes the write buffers, making certain all subsequent
  226. * memory writes have occurred.  It is used during critical periods only, e.g.,
  227. * after memory-mapped I/O register access.
  228. *
  229. * RETURNS:  N/A
  230. *
  231. * sysWbFlush (void)
  232. *
  233. */
  234.         .ent    sysWbFlush
  235. sysWbFlush:
  236.  
  237.         sync
  238.         j       ra
  239.         .end    sysWbFlush
  240. /*******************************************************************************
  241. *
  242. * sysFpaAck - acknowledge a floating point unit interrupt
  243. *
  244. * This routine writes the floating point unit (FPU) status register to
  245. * acknowledge the appropriate FPU interrupt.  It returns an index to the vector
  246. * table.
  247. *
  248. * RETURNS: An interrupt vector.
  249. * int sysFpaAck (void)
  250. */
  251. .ent sysFpaAck
  252. sysFpaAck:
  253. j ra /* return to caller */
  254. .end sysFpaAck
  255. /****************************************************************************** 
  256. *
  257. * sysPciBusErrEnable - Enable PCI bus errors
  258. *
  259. * This routine sets the Bus Error Control Register bit 7
  260. * to enable PCI bus error generation.
  261. *
  262. * RETURNS: N/A
  263. *
  264. * void sysPciBusErrEnable (void)
  265. *
  266. */
  267. .globl  sysPciBusErrEnable
  268. .ent  sysPciBusErrEnable
  269. sysPciBusErrEnable:
  270. .set noreorder
  271. li   t0, PCI_BASE
  272. lw   t1, 0x0(t0)
  273. ori  t1, PCIC_IEN 
  274. sw   t1, 0x0(t0)
  275. j   ra
  276. nop
  277. .set  reorder
  278. .end  sysPciBusErrEnable
  279. /******************************************************************************
  280. *
  281. * sysPciBusErrDisable - Disable PCI bus errors
  282. *
  283. * This routine resets the Bus Error Control Register bit 7
  284. * to disable PCI bus error generation.
  285. *
  286. * RETURNS: N/A
  287. *
  288. * void sysPciBusErrDisable (void)
  289. *
  290. */
  291.  
  292. .globl  sysPciBusErrDisable
  293. .ent  sysPciBusErrDisable
  294. sysPciBusErrDisable:
  295. .set  noreorder
  296. li   t0, PCI_BASE
  297. lw   t1, 0(t0)
  298. li   t2, ~PCIC_IEN
  299. and  t1, t2
  300. sw   t1, 0x0(t0)
  301. j    ra
  302. nop
  303. .set  reorder
  304. .end  sysPciBusErrDisable
  305.  
  306. /******************************************************************************
  307. *
  308. * sysTimerIntClr - clear the intyerrupt generated by the CPU internal timer
  309. *
  310. * This routine clears the interrupt pending bit ,IP7, of the CAUSE register
  311. * using a side effect of writing to the COMPARE register
  312. *
  313. * This routine is loaded into the static interrupt priority table.
  314. * It is called by jumping to the address in this table, not by
  315. * user calls.
  316. *
  317. * SEE ALSO: sysSetCompare()
  318. *
  319. * int sysTimerIntClr ()
  320. */
  321. .ent sysTimerIntClr
  322. sysTimerIntClr:
  323. /* give us as long as possible before a clock interrupt */
  324. li t0, 1
  325. mtc0 t0, C0_COUNT
  326. mtc0 zero, C0_COMPARE
  327. nop
  328. j ra /* return */
  329. .end sysTimerIntClr
  330. /*******************************************************************************
  331. *
  332. * sysWait - wait until the input buffer become empty
  333. *
  334. * wait until the input buffer become empty
  335. *
  336. * RETURNS: N/A
  337. * void sysWait (void)
  338.  
  339. */
  340. .ent sysWait
  341. sysWait:
  342.  
  343. j ra /* dummy routine for now */
  344. .end sysWait
  345. /*******************************************************************************
  346. *
  347. * sysSetPageSize - Set the MMU page size
  348. *
  349. * RETURNS: N/A
  350. *
  351. * void sysSetPageSize
  352. *     (
  353. *     UINT32 PageSize          /@ The page size @/
  354. *     )
  355. */
  356. .ent sysSetPageSize
  357. sysSetPageSize:
  358.         .set noreorder
  359. HAZARD_CP_WRITE
  360.         mtc0  a0,C0_PAGEMASK
  361. HAZARD_CP_WRITE
  362.         .set reorder
  363.         j    ra
  364.         nop
  365.         .end sysSetPageSize
  366. /*******************************************************************************
  367. *
  368. * sysConfig1Get - get the processor Config1 register
  369. *
  370. * RETURNS: N/A
  371. * int sysConfig1Get (void)
  372. */
  373. .ent sysConfig1Get
  374. sysConfig1Get:
  375.  
  376. .word 0x40028001
  377. j ra
  378. .end sysConfig1Get
  379.  
  380. /* Include Generic MIPS Support */
  381. #define SYS_COMPARE_SET    /* The BSP implements specialized */
  382. #define SYS_COMPARE_GET    /* versions of these routines     */
  383.          
  384. #include "sysMipsALib.s"
  385. #ifdef BROADCOM_BSP
  386.               .globl  vxSpGet
  387.               .ent vxSpGet
  388. vxSpGet:
  389.               .set noreorder
  390.                j ra
  391.                or v0,sp,sp
  392.                .set reorder
  393.                .end vxSpGet
  394.               .globl  vxPcGet
  395.               .ent vxPcGet
  396. vxPcGet:
  397.               .set noreorder
  398.                or v0,ra,ra
  399.                j ra
  400.                nop
  401.                .set reorder
  402.                .end vxPcGet
  403. #endif /*!BROADCOM_BSP */