sysALib.s
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysALib.s - ixp425 IXDP425 system-dependent routines */
  2. /* Copyright 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,24sep02,jb3  Going for Csr_Gold
  7. 01c,05sep02,jb3  Merge in changes from w/ t2.1 ongiong development
  8. 01c,20aug02,jb  Adding visionClick download support
  9. 01b,13jun02,jb  Fixing sysToMonitor support
  10. 01a,05jun02,jb  initial version...
  11. */
  12. /*
  13. DESCRIPTION
  14. This module contains system-dependent routines written in assembly
  15. language.
  16. This module must be the first specified in the f3ldf1 command used to
  17. build the system.  The sysInit() routine is the system start-up code.
  18. INTERNAL
  19. Many routines in this module doesn't use the "c" frame pointer %r11@ !
  20. This is only for the benefit of the stacktrace facility to allow it 
  21. to properly trace tasks executing within these routines.
  22. SEE ALSO: 
  23. .I "ARM Architecture Reference Manual"
  24. */
  25. #define _ASMLANGUAGE
  26. #include "vxWorks.h"
  27. #include "regs.h"
  28. #include "arch/arm/arm.h"
  29. #include "arch/arm/mmuArmLib.h"
  30. #include "arch/arm/excArmLib.h"
  31. #include "sysLib.h"
  32. #include "ixdp425.h"
  33. #include "ixp425IntrCtl.h"
  34. #include "config.h"
  35.         .data
  36. .globl  FUNC(copyright_wind_river)
  37. .long   FUNC(copyright_wind_river)
  38. #define SYS_A_LIB_DEBUG
  39. /* internals */
  40. .globl FUNC(sysInit) /* start of system code */
  41. .globl  FUNC(sysIntStackSplit)
  42. .globl  FUNC(sysEnableIRQMasks)
  43.         .globl  FUNC(sysPhysMemSize)
  44. .globl  FUNC(sysByteSwap)
  45. .globl  FUNC(sysToMonSwitchFlashRam)
  46. /* externals */
  47. .extern FUNC(usrInit) /* system initialization routine */
  48. .extern FUNC(vxSvcIntStackBase) /* base of SVC-mode interrupt stack */
  49. .extern FUNC(vxSvcIntStackEnd) /* end of SVC-mode interrupt stack */
  50. .extern FUNC(vxIrqIntStackBase) /* base of IRQ-mode interrupt stack */
  51. .extern FUNC(vxIrqIntStackEnd) /* end of IRQ-mode interrupt stack */
  52. .text
  53. .align 4
  54. /*******************************************************************************
  55. *
  56. * sysInit - start after boot
  57. *
  58. * This routine is the system start-up entry point for VxWorks in RAM, the
  59. * first code executed after booting.  It disables interrupts, sets up
  60. * the stack, and jumps to the C routine usrInit() in usrConfig.c.
  61. *
  62. * The initial stack is set to grow down from the address of sysInit().  This
  63. * stack is used only by usrInit() and is never used again.  Memory for the
  64. * stack must be accounted for when determining the system load address.
  65. *
  66. * NOTE: This routine should not be called by the user.
  67. *
  68. * RETURNS: N/A
  69. * sysInit ()              /@ THIS IS NOT A CALLABLE ROUTINE @/
  70.  
  71. */
  72. FUNC_LABEL(sysInit)
  73. /* Disable Interrupts */
  74.         MRS     r1, cpsr                /* get current status */
  75.         ORR     r1, r1, #I_BIT | F_BIT  /* disable IRQ and FIQ */
  76.         MSR     cpsr, r1
  77. /* Interrupts Disabled */
  78.         ldr     r1, =IXP425_ICMR  /* Zero-out Interrupt Mask */
  79.         mov     r2, #0x0
  80.         str     r2, [r1] 
  81. adr sp, FUNC(sysInit) /* initialise stack pointer */
  82. mov fp, #0 /* initialise frame pointer */
  83. /* Make sure Boot type is set correctly. visionClick doesn't */
  84. mov r1,#BOOT_NORMAL
  85.         cmp r1,r0
  86. beq L$_Good_Boot
  87. mov r1,#BOOT_NO_AUTOBOOT
  88.         cmp r1,r0
  89. beq L$_Good_Boot
  90. mov r1,#BOOT_CLEAR
  91.         cmp r1,r0
  92. beq L$_Good_Boot
  93. mov r1,#BOOT_QUICK_AUTOBOOT
  94.         cmp r1,r0
  95. beq L$_Good_Boot
  96.         mov     r0, #BOOT_NORMAL /* pass startType */
  97. /* Pass r0 through */
  98. L$_Good_Boot:
  99. /* now call usrInit */
  100. b FUNC(usrInit)
  101. /*******************************************************************************
  102. *
  103. * sysIntStackSplit - split interrupt stack and set interrupt stack pointers
  104. *
  105. * This routine is called, via a function pointer, during kernel
  106. * initialisation.  It splits the allocated interrupt stack into IRQ and
  107. * SVC-mode stacks and sets the processor's IRQ stack pointer. Note that
  108. * the pointer passed points to the bottom of the stack allocated i.e.
  109. * highest address+1.
  110. *
  111. * NOMANUAL
  112. * void sysIntStackSplit
  113. *     (
  114. *     char *pBotStack   /@ pointer to bottom of interrupt stack @/
  115. *     long size /@ size of stack @/
  116. *     )
  117. */
  118. FUNC_LABEL(sysIntStackSplit)
  119. /*
  120.  * Split stack into 2 - IRQ and SVC-mode interrupt stacks.
  121.  * IRQ stack needs 6 words per nested interrupt;
  122.  * SVC-mode will need a good deal more for the C interrupt handlers.
  123.  * For now, use ratio 1:7 with any excess allocated to the SVC-mode stack
  124.  * at the lowest address.
  125.  *
  126.  * Note that FIQ is not handled by VxWorks so no stack is allocated for it.
  127.  *
  128.  * The stacks and the variables that describe them look like this.
  129.  *
  130.  *         - HIGH MEMORY -
  131.  *     ------------------------ <--- vxIrqIntStackBase (r0 on entry)
  132.  *     |                      |  
  133.  *     |       IRQ-mode       |  
  134.  *     |    interrupt stack   |
  135.  *     |                      |  
  136.  *     ------------------------ <--{ vxIrqIntStackEnd
  137.  *     |                      |    { vxSvcIntStackBase
  138.  *     |       SVC-mode       |  
  139.  *     |    interrupt stack   |
  140.  *     |                      |  
  141.  *     ------------------------ <--- vxSvcIntStackEnd
  142.  *         - LOW  MEMORY -
  143.  *
  144.  *
  145.  * r0 = base of space allocated for stacks (i.e. highest address)
  146.  * r1 = size of space
  147.  */
  148.  
  149.         SUB     r2,r0,r1                /* r2 -> lowest usable address */
  150.         LDR     r3,L$_vxSvcIntStackEnd
  151.         STR     r2,[r3]                 /*  == end of SVC-mode stack */
  152.         SUB     r2,r0,r1,ASR #3         /* leave 1/8 for IRQ */
  153.         LDR     r3,L$_vxSvcIntStackBase
  154.         STR     r2,[r3]
  155.  
  156. /* now allocate IRQ stack, setting irq_sp */
  157.  
  158.         LDR     r3,L$_vxIrqIntStackEnd
  159.         STR     r2,[r3]
  160.         LDR     r3,L$_vxIrqIntStackBase
  161.         STR     r0,[r3]
  162.  
  163.         MRS     r2,cpsr
  164.         BIC     r3,r2,#MASK_MODE
  165.         ORR     r3,r3,#MODE_IRQ32 | I_BIT       /* set irq_sp */
  166.         MSR     cpsr,r3
  167.         MOV     sp,r0
  168.  
  169. /* switch back to original mode and return */
  170.  
  171.         MSR     cpsr,r2
  172.         MOV     pc,lr
  173. FUNC_LABEL(sysEnableIRQMasks)
  174. /**************************************************
  175. INTCTL : Nothing to do. Just return. 
  176. *****************************************************/
  177.         mov     pc, lr
  178. /* Retrieve auto-sized memory. */
  179. /* UINT32 sysPhysMemSize(void) */
  180. FUNC_LABEL(sysPhysMemSize)
  181. /* No support for dynamic memory sizeing, return Configured size. */
  182.         mov     r0, #LOCAL_MEM_SIZE                      /* return Configured size*/
  183.       
  184. ALL_DONE_NOW:
  185.         mov     pc, lr
  186. FUNC_LABEL(sysByteSwap)
  187. EOR r1,r0,r0,ROR #16
  188. BIC r1,r1,#0xff0000
  189. MOV r0,r0,ROR #8
  190. EOR r0,r0,r1,LSR #8
  191.         mov     pc, lr
  192. /*
  193.  * This is called from sysToMonitor, it jumps to an aliased version of code currently running.
  194.  * Then it puts flash down at 0x0 so that sysToMonitor may perform a reboot.
  195.  * There is an implicit asumption that physical=locgical memory if the MMU is enabled.
  196.  * Note: distroys r0,r1 
  197.  */
  198. FUNC_LABEL(sysToMonSwitchFlashRam)
  199. /* Jump back to relocated ram */
  200. ldr r0, =IXP425_SDRAM_BASE_ALT
  201. orr r0,r0,pc
  202. mov pc,r0 
  203. nop
  204. /* Adjust the link register, frame pointer, and stack pointer
  205.  * to reference the first aliased memory area (+ 0x10000000)
  206.  */
  207. add lr,lr,#IXP425_SDRAM_BASE_ALT
  208. add fp,fp,#IXP425_SDRAM_BASE_ALT
  209. add sp,sp,#IXP425_SDRAM_BASE_ALT
  210. /* Write to Expansion Bus controller to swap Flash & Ram  Now running from low down */
  211.         ldr     r0,=IXP425_EXP_CNFG0
  212.         ldr     r1,[r0]
  213.         orr      r1,r1,#0x80000000
  214.         str     r1,[r0]
  215. mov pc,lr
  216. L$_vxSvcIntStackBase:
  217. .long FUNC(vxSvcIntStackBase)
  218. L$_vxSvcIntStackEnd:
  219. .long FUNC(vxSvcIntStackEnd)
  220. L$_vxIrqIntStackBase:
  221. .long FUNC(vxIrqIntStackBase)
  222. L$_vxIrqIntStackEnd: .long FUNC(vxIrqIntStackEnd)
  223. /***EOF***/