crt0.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.crt0.S 1.12 08/09/01 17:09:10 paulus
  3.  */
  4. /*    Copyright (c) 1997 Paul Mackerras <paulus@cs.anu.edu.au>
  5.  *      Initial Power Macintosh COFF version.
  6.  *    Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
  7.  *      Modifications for IBM PowerPC 400-class processor evaluation
  8.  *      boards.
  9.  *
  10.  *    Module name: crt0.S
  11.  *
  12.  *    Description:
  13.  *      Boot loader execution entry point. Clears out .bss section as per
  14.  *      ANSI C requirements. Invalidates and flushes the caches over the
  15.  *      range covered by the boot loader's .text section. Sets up a stack
  16.  *      below the .text section entry point.
  17.  *
  18.  *    This program is free software; you can redistribute it and/or
  19.  *    modify it under the terms of the GNU General Public License
  20.  *    as published by the Free Software Foundation; either version
  21.  *    2 of the License, or (at your option) any later version.
  22.  */
  23. #include <linux/config.h>
  24. #include "../../kernel/ppc_asm.tmpl"
  25. .text
  26. .globl _start
  27. _start:
  28. #ifdef XCOFF
  29. .long __start,0,0
  30. .globl __start
  31. __start:
  32. #endif
  33. ## Flush and invalidate the caches for the range in memory covering
  34. ## the .text section of the boot loader
  35. lis r9,_start@h # r9 = &_start
  36. lis r8,_etext@ha # 
  37. addi r8,r8,_etext@l # r8 = &_etext
  38. 3: dcbf r0,r9 # Flush the data cache
  39. icbi r0,r9 # Invalidate the instruction cache
  40. addi r9,r9,0x10 # Increment by one cache line
  41. cmplw cr0,r9,r8 # Are we at the end yet?
  42. blt 3b # No, keep flushing and invalidating
  43. sync # sync ; isync after flushing the icache
  44. isync
  45. ## Clear out the BSS as per ANSI C requirements
  46. lis r7,_end@ha
  47. addi r7,r7,_end@l # r7 = &_end
  48. lis r8,__bss_start@ha # 
  49. addi r8,r8,__bss_start@l # r8 = &_bss_start
  50. ## Determine how large an area, in number of words, to clear
  51. subf r7,r8,r7 # r7 = &_end - &_bss_start + 1 
  52. addi r7,r7,3 # r7 += 3
  53. srwi. r7,r7,2 # r7 = size in words.
  54. beq 2f # If the size is zero, do not bother
  55. addi r8,r8,-4 # r8 -= 4
  56. mtctr r7 # SPRN_CTR = number of words to clear
  57. li r0,0 # r0 = 0
  58. 1: stwu r0,4(r8) # Clear out a word
  59. bdnz 1b # If we are not done yet, keep clearing
  60. 2:
  61. #ifdef CONFIG_4xx
  62. ## Set up the stack
  63. lis r9,_start@h # r9 = &_start (text section entry)
  64. addi r9,r9,_start@l
  65. subi r1,r9,64 # Start the stack 64 bytes below _start
  66. clrrwi r1,r1,4 # Make sure it is aligned on 16 bytes.
  67. li r0,0
  68. stwu r0,-16(r1)
  69. mtlr r9
  70. #endif
  71. b start # All done, start the real work.