boot_head.S 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Copyright (C) 1998-2003 Hewlett-Packard Co
  3. * David Mosberger-Tang <davidm@hpl.hp.com>
  4. */
  5. #include <asm/asmmacro.h>
  6. #include <asm/pal.h>
  7. .bss
  8. .align 16
  9. stack_mem:
  10. .skip 16834
  11. .text
  12. /* This needs to be defined because lib/string.c:strlcat() calls it in case of error... */
  13. GLOBAL_ENTRY(printk)
  14. break 0
  15. END(printk)
  16. GLOBAL_ENTRY(_start)
  17. .prologue
  18. .save rp, r0
  19. .body
  20. movl gp = __gp
  21. movl sp = stack_mem+16384-16
  22. bsw.1
  23. br.call.sptk.many rp=start_bootloader
  24. END(_start)
  25. /*
  26. * Set a break point on this function so that symbols are available to set breakpoints in
  27. * the kernel being debugged.
  28. */
  29. GLOBAL_ENTRY(debug_break)
  30. br.ret.sptk.many b0
  31. END(debug_break)
  32. GLOBAL_ENTRY(ssc)
  33. .regstk 5,0,0,0
  34. mov r15=in4
  35. break 0x80001
  36. br.ret.sptk.many b0
  37. END(ssc)
  38. GLOBAL_ENTRY(jmp_to_kernel)
  39. .regstk 2,0,0,0
  40. mov r28=in0
  41. mov b7=in1
  42. br.sptk.few b7
  43. END(jmp_to_kernel)
  44. /*
  45. * r28 contains the index of the PAL function
  46. * r29--31 the args
  47. * Return values in ret0--3 (r8--11)
  48. */
  49. GLOBAL_ENTRY(pal_emulator_static)
  50. mov r8=-1
  51. mov r9=256
  52. ;;
  53. cmp.gtu p6,p7=r9,r28 /* r28 <= 255? */
  54. (p6) br.cond.sptk.few static
  55. ;;
  56. mov r9=512
  57. ;;
  58. cmp.gtu p6,p7=r9,r28
  59. (p6) br.cond.sptk.few stacked
  60. ;;
  61. static: cmp.eq p6,p7=PAL_PTCE_INFO,r28
  62. (p7) br.cond.sptk.few 1f
  63. ;;
  64. mov r8=0 /* status = 0 */
  65. movl r9=0x100000000 /* tc.base */
  66. movl r10=0x0000000200000003 /* count[0], count[1] */
  67. movl r11=0x1000000000002000 /* stride[0], stride[1] */
  68. br.cond.sptk.few rp
  69. 1: cmp.eq p6,p7=PAL_FREQ_RATIOS,r28
  70. (p7) br.cond.sptk.few 1f
  71. mov r8=0 /* status = 0 */
  72. movl r9 =0x100000064 /* proc_ratio (1/100) */
  73. movl r10=0x100000100 /* bus_ratio<<32 (1/256) */
  74. movl r11=0x100000064 /* itc_ratio<<32 (1/100) */
  75. ;;
  76. 1: cmp.eq p6,p7=PAL_RSE_INFO,r28
  77. (p7) br.cond.sptk.few 1f
  78. mov r8=0 /* status = 0 */
  79. mov r9=96 /* num phys stacked */
  80. mov r10=0 /* hints */
  81. mov r11=0
  82. br.cond.sptk.few rp
  83. 1: cmp.eq p6,p7=PAL_CACHE_FLUSH,r28 /* PAL_CACHE_FLUSH */
  84. (p7) br.cond.sptk.few 1f
  85. mov r9=ar.lc
  86. movl r8=524288 /* flush 512k million cache lines (16MB) */
  87. ;;
  88. mov ar.lc=r8
  89. movl r8=0xe000000000000000
  90. ;;
  91. .loop: fc r8
  92. add r8=32,r8
  93. br.cloop.sptk.few .loop
  94. sync.i
  95. ;;
  96. srlz.i
  97. ;;
  98. mov ar.lc=r9
  99. mov r8=r0
  100. ;;
  101. 1: cmp.eq p6,p7=PAL_PERF_MON_INFO,r28
  102. (p7) br.cond.sptk.few 1f
  103. mov r8=0 /* status = 0 */
  104. movl r9 =0x08122f04 /* generic=4 width=47 retired=8 cycles=18 */
  105. mov r10=0 /* reserved */
  106. mov r11=0 /* reserved */
  107. mov r16=0xffff /* implemented PMC */
  108. mov r17=0x3ffff /* implemented PMD */
  109. add r18=8,r29 /* second index */
  110. ;;
  111. st8 [r29]=r16,16 /* store implemented PMC */
  112. st8 [r18]=r0,16 /* clear remaining bits */
  113. ;;
  114. st8 [r29]=r0,16 /* clear remaining bits */
  115. st8 [r18]=r0,16 /* clear remaining bits */
  116. ;;
  117. st8 [r29]=r17,16 /* store implemented PMD */
  118. st8 [r18]=r0,16 /* clear remaining bits */
  119. mov r16=0xf0 /* cycles count capable PMC */
  120. ;;
  121. st8 [r29]=r0,16 /* clear remaining bits */
  122. st8 [r18]=r0,16 /* clear remaining bits */
  123. mov r17=0xf0 /* retired bundles capable PMC */
  124. ;;
  125. st8 [r29]=r16,16 /* store cycles capable */
  126. st8 [r18]=r0,16 /* clear remaining bits */
  127. ;;
  128. st8 [r29]=r0,16 /* clear remaining bits */
  129. st8 [r18]=r0,16 /* clear remaining bits */
  130. ;;
  131. st8 [r29]=r17,16 /* store retired bundle capable */
  132. st8 [r18]=r0,16 /* clear remaining bits */
  133. ;;
  134. st8 [r29]=r0,16 /* clear remaining bits */
  135. st8 [r18]=r0,16 /* clear remaining bits */
  136. ;;
  137. 1: cmp.eq p6,p7=PAL_VM_SUMMARY,r28
  138. (p7) br.cond.sptk.few 1f
  139. mov r8=0 /* status = 0 */
  140. movl r9=0x2044040020F1865 /* num_tc_levels=2, num_unique_tcs=4 */
  141. /* max_itr_entry=64, max_dtr_entry=64 */
  142. /* hash_tag_id=2, max_pkr=15 */
  143. /* key_size=24, phys_add_size=50, vw=1 */
  144. movl r10=0x183C /* rid_size=24, impl_va_msb=60 */
  145. ;;
  146. 1: cmp.eq p6,p7=PAL_MEM_ATTRIB,r28
  147. (p7) br.cond.sptk.few 1f
  148. mov r8=0 /* status = 0 */
  149. mov r9=0x80|0x01 /* NatPage|WB */
  150. ;;
  151. 1: br.cond.sptk.few rp
  152. stacked:
  153. br.ret.sptk.few rp
  154. END(pal_emulator_static)