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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: head.S,v 1.86 2001/12/05 01:02:16 davem Exp $
  2.  * head.S: Initial boot code for the Sparc64 port of Linux.
  3.  *
  4.  * Copyright (C) 1996,1997 David S. Miller (davem@caip.rutgers.edu)
  5.  * Copyright (C) 1996 David Sitsky (David.Sitsky@anu.edu.au)
  6.  * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  7.  * Copyright (C) 1997 Miguel de Icaza (miguel@nuclecu.unam.mx)
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/version.h>
  11. #include <linux/errno.h>
  12. #include <asm/asm_offsets.h>
  13. #include <asm/asi.h>
  14. #include <asm/pstate.h>
  15. #include <asm/ptrace.h>
  16. #include <asm/spitfire.h>
  17. #include <asm/page.h>
  18. #include <asm/pgtable.h>
  19. #include <asm/errno.h>
  20. #include <asm/signal.h>
  21. #include <asm/processor.h>
  22. #include <asm/lsu.h>
  23. #include <asm/dcr.h>
  24. #include <asm/dcu.h>
  25. #include <asm/head.h>
  26. #include <asm/ttable.h>
  27. /* This section from from _start to sparc64_boot_end should fit into
  28.  * 0x0000.0000.0040.4000 to 0x0000.0000.0040.8000 and will be sharing space
  29.  * with bootup_user_stack, which is from 0x0000.0000.0040.4000 to
  30.  * 0x0000.0000.0040.6000 and empty_bad_page, which is from
  31.  * 0x0000.0000.0040.6000 to 0x0000.0000.0040.8000. 
  32.  */
  33. .text
  34. .globl start, _start, stext, _stext
  35. _start:
  36. start:
  37. _stext:
  38. stext:
  39. bootup_user_stack:
  40. ! 0x0000000000404000
  41. b sparc64_boot
  42.  flushw /* Flush register file.      */
  43. /* This stuff has to be in sync with SILO and other potential boot loaders
  44.  * Fields should be kept upward compatible and whenever any change is made,
  45.  * HdrS version should be incremented.
  46.  */
  47.         .global root_flags, ram_flags, root_dev
  48.         .global sparc_ramdisk_image, sparc_ramdisk_size
  49. .globl silo_args
  50.         .ascii  "HdrS"
  51.         .word   LINUX_VERSION_CODE
  52.         .half   0x0203          /* HdrS version */
  53. root_flags:
  54.         .half   1
  55. root_dev:
  56.         .half   0
  57. ram_flags:
  58.         .half   0
  59. sparc_ramdisk_image:
  60.         .word   0
  61. sparc_ramdisk_size:
  62.         .word   0
  63.         .xword  reboot_command
  64. .xword bootstr_len
  65. .word _end
  66. /* We must be careful, 32-bit OpenBOOT will get confused if it
  67.  * tries to save away a register window to a 64-bit kernel
  68.  * stack address.  Flush all windows, disable interrupts,
  69.  * remap if necessary, jump onto kernel trap table, then kernel
  70.  * stack, or else we die.
  71.  *
  72.  * PROM entry point is on %o4
  73.  */
  74. sparc64_boot:
  75. rdpr %ver, %g1
  76. sethi %hi(0x003e0014), %g5
  77. srlx %g1, 32, %g1
  78. or %g5, %lo(0x003e0014), %g5
  79. cmp %g1, %g5
  80. bne,pt %icc, spitfire_boot
  81.  nop
  82. cheetah_boot:
  83. mov DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1
  84. wr %g1, %asr18
  85. sethi %uhi(DCU_ME | DCU_RE | /*DCU_PE |*/ DCU_HPE | DCU_SPE | DCU_SL | DCU_WE), %g5
  86. or %g5, %ulo(DCU_ME | DCU_RE | /*DCU_PE |*/ DCU_HPE | DCU_SPE | DCU_SL | DCU_WE), %g5
  87. sllx %g5, 32, %g5
  88. or %g5, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g5
  89. stxa %g5, [%g0] ASI_DCU_CONTROL_REG
  90. membar #Sync
  91. mov TSB_EXTENSION_P, %g3
  92. stxa %g0, [%g3] ASI_DMMU
  93. stxa %g0, [%g3] ASI_IMMU
  94. membar #Sync
  95. mov TSB_EXTENSION_S, %g3
  96. stxa %g0, [%g3] ASI_DMMU
  97. membar #Sync
  98. mov TSB_EXTENSION_N, %g3
  99. stxa %g0, [%g3] ASI_DMMU
  100. stxa %g0, [%g3] ASI_IMMU
  101. membar #Sync
  102. wrpr    %g0, (PSTATE_PRIV|PSTATE_PEF|PSTATE_IE), %pstate
  103. wr %g0, 0, %fprs
  104. /* Just like for Spitfire, we probe itlb-2 for a mapping which
  105.  * matches our current %pc.  We take the physical address in
  106.  * that mapping and use it to make our own.
  107.  */
  108. /* %g5 holds the tlb data */
  109.         sethi   %uhi(_PAGE_VALID | _PAGE_SZ4MB), %g5
  110.         sllx    %g5, 32, %g5
  111.         or      %g5, (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_L | _PAGE_W | _PAGE_G), %g5
  112. /* Put PADDR tlb data mask into %g3. */
  113. sethi %uhi(_PAGE_PADDR), %g3
  114. or %g3, %ulo(_PAGE_PADDR), %g3
  115. sllx %g3, 32, %g3
  116. sethi %hi(_PAGE_PADDR), %g7
  117. or %g7, %lo(_PAGE_PADDR), %g7
  118. or %g3, %g7, %g3
  119. set 2 << 16, %l0 /* TLB entry walker. */
  120. set 0x1fff, %l2 /* Page mask. */
  121. rd %pc, %l3
  122. andn %l3, %l2, %g2 /* vaddr comparator */
  123. 1: ldxa [%l0] ASI_ITLB_TAG_READ, %g1
  124. membar #Sync
  125. andn %g1, %l2, %g1
  126. cmp %g1, %g2
  127. be,pn %xcc, cheetah_got_tlbentry
  128.  nop
  129. and %l0, (127 << 3), %g1
  130. cmp %g1, (127 << 3)
  131. blu,pt %xcc, 1b
  132.  add %l0, (1 << 3), %l0
  133. cheetah_got_tlbentry:
  134. ldxa [%l0] ASI_ITLB_DATA_ACCESS, %g1
  135. membar #Sync
  136. and %g1, %g3, %g1
  137. sub %g1, %g2, %g1
  138. or %g5, %g1, %g5
  139. /* Clear out any KERNBASE area entries. */
  140. set 2 << 16, %l0
  141. sethi %hi(KERNBASE), %g3
  142. sethi %hi(KERNBASE<<1), %g7
  143. mov TLB_TAG_ACCESS, %l7
  144. /* First, check ITLB */
  145. 1: ldxa [%l0] ASI_ITLB_TAG_READ, %g1
  146. membar #Sync
  147. andn %g1, %l2, %g1
  148. cmp %g1, %g3
  149. blu,pn %xcc, 2f
  150.  cmp %g1, %g7
  151. bgeu,pn %xcc, 2f
  152.  nop
  153. stxa %g0, [%l7] ASI_IMMU
  154. membar #Sync
  155. stxa %g0, [%l0] ASI_ITLB_DATA_ACCESS
  156. membar #Sync
  157. 2: and %l0, (127 << 3), %g1
  158. cmp %g1, (127 << 3)
  159. blu,pt %xcc, 1b
  160.  add %l0, (1 << 3), %l0
  161. /* Next, check DTLB */
  162. set 2 << 16, %l0
  163. 1: ldxa [%l0] ASI_DTLB_TAG_READ, %g1
  164. membar #Sync
  165. andn %g1, %l2, %g1
  166. cmp %g1, %g3
  167. blu,pn %xcc, 2f
  168.  cmp %g1, %g7
  169. bgeu,pn %xcc, 2f
  170.  nop
  171. stxa %g0, [%l7] ASI_DMMU
  172. membar #Sync
  173. stxa %g0, [%l0] ASI_DTLB_DATA_ACCESS
  174. membar #Sync
  175. 2: and %l0, (511 << 3), %g1
  176. cmp %g1, (511 << 3)
  177. blu,pt %xcc, 1b
  178.  add %l0, (1 << 3), %l0
  179. /* Now lock the TTE we created into ITLB-0 and DTLB-0,
  180.  * entry 15 (and maybe 14 too).
  181.  */
  182. sethi %hi(KERNBASE), %g3
  183. set (0 << 16) | (15 << 3), %g7
  184. stxa %g3, [%l7] ASI_DMMU
  185. membar #Sync
  186. stxa %g5, [%g7] ASI_DTLB_DATA_ACCESS
  187. membar #Sync
  188. stxa %g3, [%l7] ASI_IMMU
  189. membar #Sync
  190. stxa %g5, [%g7] ASI_ITLB_DATA_ACCESS
  191. membar #Sync
  192. flush %g3
  193. membar #Sync
  194. sethi %hi(_end), %g3 /* Check for bigkernel case */
  195. or %g3, %lo(_end), %g3
  196. srl %g3, 23, %g3 /* Check if _end > 8M */
  197. brz,pt %g3, 1f
  198.  sethi %hi(KERNBASE), %g3 /* Restore for fixup code below */
  199. sethi %hi(0x400000), %g3
  200. or %g3, %lo(0x400000), %g3
  201. add %g5, %g3, %g5 /* New tte data */
  202. andn %g5, (_PAGE_G), %g5
  203. sethi %hi(KERNBASE+0x400000), %g3
  204. or %g3, %lo(KERNBASE+0x400000), %g3
  205. set (0 << 16) | (14 << 3), %g7
  206. stxa %g3, [%l7] ASI_DMMU
  207. membar #Sync
  208. stxa %g5, [%g7] ASI_DTLB_DATA_ACCESS
  209. membar #Sync
  210. stxa %g3, [%l7] ASI_IMMU
  211. membar #Sync
  212. stxa %g5, [%g7] ASI_ITLB_DATA_ACCESS
  213. membar #Sync
  214. flush %g3
  215. membar #Sync
  216. sethi %hi(KERNBASE), %g3 /* Restore for fixup code below */
  217. ba,pt %xcc, 1f
  218.  nop
  219. 1: set sun4u_init, %g2
  220. jmpl    %g2 + %g0, %g0
  221.  nop
  222. spitfire_boot:
  223. /* Typically PROM has already enabled both MMU's and both on-chip
  224.  * caches, but we do it here anyway just to be paranoid.
  225.  */
  226. mov (LSU_CONTROL_IC|LSU_CONTROL_DC|LSU_CONTROL_IM|LSU_CONTROL_DM), %g1
  227. stxa %g1, [%g0] ASI_LSU_CONTROL
  228. membar #Sync
  229. /*
  230.  * Make sure we are in privileged mode, have address masking,
  231.          * using the ordinary globals and have enabled floating
  232.          * point.
  233.  *
  234.  * Again, typically PROM has left %pil at 13 or similar, and
  235.  * (PSTATE_PRIV | PSTATE_PEF | PSTATE_IE) in %pstate.
  236.          */
  237. wrpr    %g0, (PSTATE_PRIV|PSTATE_PEF|PSTATE_IE), %pstate
  238. wr %g0, 0, %fprs
  239. spitfire_create_mappings:
  240. /* %g5 holds the tlb data */
  241.         sethi   %uhi(_PAGE_VALID | _PAGE_SZ4MB), %g5
  242.         sllx    %g5, 32, %g5
  243.         or      %g5, (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_L | _PAGE_W | _PAGE_G), %g5
  244. /* Base of physical memory cannot reliably be assumed to be
  245.  * at 0x0!  Figure out where it happens to be. -DaveM
  246.  */
  247. /* Put PADDR tlb data mask into %g3. */
  248. sethi %uhi(_PAGE_PADDR_SF), %g3
  249. or %g3, %ulo(_PAGE_PADDR_SF), %g3
  250. sllx %g3, 32, %g3
  251. sethi %hi(_PAGE_PADDR_SF), %g7
  252. or %g7, %lo(_PAGE_PADDR_SF), %g7
  253. or %g3, %g7, %g3
  254. /* Walk through entire ITLB, looking for entry which maps
  255.  * our %pc currently, stick PADDR from there into %g5 tlb data.
  256.  */
  257. clr %l0 /* TLB entry walker. */
  258. set 0x1fff, %l2 /* Page mask. */
  259. rd %pc, %l3
  260. andn %l3, %l2, %g2 /* vaddr comparator */
  261. 1:
  262. /* Yes, the nops seem to be necessary for now, don't ask me why. -DaveM */
  263. ldxa [%l0] ASI_ITLB_TAG_READ, %g1
  264. nop
  265. nop
  266. nop
  267. andn %g1, %l2, %g1 /* Get vaddr */
  268. cmp %g1, %g2
  269. be,a,pn %xcc, spitfire_got_tlbentry
  270.  ldxa [%l0] ASI_ITLB_DATA_ACCESS, %g1
  271. cmp %l0, (63 << 3)
  272. blu,pt %xcc, 1b
  273.  add %l0, (1 << 3), %l0
  274. spitfire_got_tlbentry:
  275. /* Nops here again, perhaps Cheetah/Blackbird are better behaved... */
  276. nop
  277. nop
  278. nop
  279. and %g1, %g3, %g1 /* Mask to just get paddr bits.       */
  280. sub %g1, %g2, %g1 /* Get rid of %pc offset to get base. */
  281. /* NOTE: We hold on to %g1 paddr base as we need it below to lock
  282.  * NOTE: the PROM cif code into the TLB.
  283.  */
  284. or %g5, %g1, %g5 /* Or it into TAG being built.        */
  285. clr %l0 /* TLB entry walker. */
  286. sethi %hi(KERNBASE), %g3 /* 4M lower limit */
  287. sethi %hi(KERNBASE<<1), %g7 /* 8M upper limit */
  288. mov TLB_TAG_ACCESS, %l7
  289. 1:
  290. /* Yes, the nops seem to be necessary for now, don't ask me why. -DaveM */
  291. ldxa [%l0] ASI_ITLB_TAG_READ, %g1
  292. nop
  293. nop
  294. nop
  295. andn %g1, %l2, %g1 /* Get vaddr */
  296. cmp %g1, %g3
  297. blu,pn %xcc, 2f
  298.  cmp %g1, %g7
  299. bgeu,pn %xcc, 2f
  300.  nop
  301. stxa %g0, [%l7] ASI_IMMU
  302. stxa %g0, [%l0] ASI_ITLB_DATA_ACCESS
  303. membar #Sync
  304. 2:
  305. cmp %l0, (63 << 3)
  306. blu,pt %xcc, 1b
  307.  add %l0, (1 << 3), %l0
  308. nop; nop; nop
  309. clr %l0 /* TLB entry walker. */
  310. 1:
  311. /* Yes, the nops seem to be necessary for now, don't ask me why. -DaveM */
  312. ldxa [%l0] ASI_DTLB_TAG_READ, %g1
  313. nop
  314. nop
  315. nop
  316. andn %g1, %l2, %g1 /* Get vaddr */
  317. cmp %g1, %g3
  318. blu,pn %xcc, 2f
  319.  cmp %g1, %g7
  320. bgeu,pn %xcc, 2f
  321.  nop
  322. stxa %g0, [%l7] ASI_DMMU
  323. stxa %g0, [%l0] ASI_DTLB_DATA_ACCESS
  324. membar #Sync
  325. 2:
  326. cmp %l0, (63 << 3)
  327. blu,pt %xcc, 1b
  328.  add %l0, (1 << 3), %l0
  329. nop; nop; nop
  330. /* PROM never puts any TLB entries into the MMU with the lock bit
  331.  * set.  So we gladly use tlb entry 63 for KERNBASE. And maybe 62 too.
  332.  */
  333. sethi %hi(KERNBASE), %g3
  334. mov (63 << 3), %g7
  335. stxa %g3, [%l7] ASI_DMMU /* KERNBASE into TLB TAG */
  336. stxa %g5, [%g7] ASI_DTLB_DATA_ACCESS /* TTE into TLB DATA */
  337. membar #Sync
  338. stxa %g3, [%l7] ASI_IMMU /* KERNBASE into TLB TAG */
  339. stxa %g5, [%g7] ASI_ITLB_DATA_ACCESS /* TTE into TLB DATA */
  340. membar #Sync
  341. flush %g3
  342. membar #Sync
  343. sethi %hi(_end), %g3 /* Check for bigkernel case */
  344. or %g3, %lo(_end), %g3
  345. srl %g3, 23, %g3 /* Check if _end > 8M */
  346. brz,pt %g3, 2f
  347.  sethi %hi(KERNBASE), %g3 /* Restore for fixup code below */
  348. sethi %hi(0x400000), %g3
  349. or %g3, %lo(0x400000), %g3
  350. add %g5, %g3, %g5 /* New tte data */
  351. andn %g5, (_PAGE_G), %g5
  352. sethi %hi(KERNBASE+0x400000), %g3
  353. or %g3, %lo(KERNBASE+0x400000), %g3
  354. mov (62 << 3), %g7
  355. stxa %g3, [%l7] ASI_DMMU
  356. stxa %g5, [%g7] ASI_DTLB_DATA_ACCESS
  357. membar #Sync
  358. stxa %g3, [%l7] ASI_IMMU
  359. stxa %g5, [%g7] ASI_ITLB_DATA_ACCESS
  360. membar #Sync
  361. flush %g3
  362. membar #Sync
  363. sethi %hi(KERNBASE), %g3 /* Restore for fixup code below */
  364. 2: ba,pt %xcc, 1f
  365.  nop
  366. 1:
  367. set sun4u_init, %g2
  368. jmpl    %g2 + %g0, %g0
  369.  nop
  370. sun4u_init:
  371. /* Set ctx 0 */
  372. mov PRIMARY_CONTEXT, %g7
  373. stxa %g0, [%g7] ASI_DMMU
  374. membar #Sync
  375. mov SECONDARY_CONTEXT, %g7
  376. stxa %g0, [%g7] ASI_DMMU
  377. membar #Sync
  378. sethi %uhi(PAGE_OFFSET), %g4
  379. sllx %g4, 32, %g4
  380. /* We are now safely (we hope) in Nucleus context (0), rewrite
  381.  * the KERNBASE TTE's so they no longer have the global bit set.
  382.  * Don't forget to setup TAG_ACCESS first 8-)
  383.  */
  384. mov TLB_TAG_ACCESS, %g2
  385. stxa %g3, [%g2] ASI_IMMU
  386. stxa %g3, [%g2] ASI_DMMU
  387. membar #Sync
  388. rdpr %ver, %g1
  389. sethi %hi(0x003e0014), %g5
  390. srlx %g1, 32, %g1
  391. or %g5, %lo(0x003e0014), %g5
  392. cmp %g1, %g5
  393. bne,pt %icc, spitfire_tlb_fixup
  394.  nop
  395. cheetah_tlb_fixup:
  396. set (0 << 16) | (15 << 3), %g7
  397. ldxa [%g7] ASI_ITLB_DATA_ACCESS, %g1
  398. andn %g1, (_PAGE_G), %g1
  399. stxa %g1, [%g7] ASI_ITLB_DATA_ACCESS
  400. membar #Sync
  401. ldxa [%g7] ASI_DTLB_DATA_ACCESS, %g1
  402. andn %g1, (_PAGE_G), %g1
  403. stxa %g1, [%g7] ASI_DTLB_DATA_ACCESS
  404. membar #Sync
  405. /* Kill instruction prefetch queues. */
  406. flush %g3
  407. membar #Sync
  408. /* Set TLB type to cheetah. */
  409. mov 1, %g2
  410. sethi %hi(tlb_type), %g5
  411. stw %g2, [%g5 + %lo(tlb_type)]
  412. /* Patch copy/page operations to cheetah optimized versions. */
  413. call cheetah_patch_copyops
  414.  nop
  415. call cheetah_patch_pgcopyops
  416.  nop
  417. ba,pt %xcc, tlb_fixup_done
  418.  nop
  419. spitfire_tlb_fixup:
  420. mov (63 << 3), %g7
  421. ldxa [%g7] ASI_ITLB_DATA_ACCESS, %g1
  422. andn %g1, (_PAGE_G), %g1
  423. stxa %g1, [%g7] ASI_ITLB_DATA_ACCESS
  424. membar #Sync
  425. ldxa [%g7] ASI_DTLB_DATA_ACCESS, %g1
  426. andn %g1, (_PAGE_G), %g1
  427. stxa %g1, [%g7] ASI_DTLB_DATA_ACCESS
  428. membar #Sync
  429. /* Kill instruction prefetch queues. */
  430. flush %g3
  431. membar #Sync
  432. /* Set TLB type to spitfire. */
  433. mov 0, %g2
  434. sethi %hi(tlb_type), %g5
  435. stw %g2, [%g5 + %lo(tlb_type)]
  436. tlb_fixup_done:
  437. sethi %hi(init_task_union), %g6
  438. or %g6, %lo(init_task_union), %g6
  439. mov %sp, %l6
  440. mov %o4, %l7
  441. #if 0 /* We don't do it like this anymore, but for historical hack value
  442.  * I leave this snippet here to show how crazy we can be sometimes. 8-)
  443.  */
  444. /* Setup "Linux Current Register", thanks Sun 8-) */
  445. wr %g0, 0x1, %pcr
  446. /* Blackbird errata workaround.  See commentary in
  447.  * smp.c:smp_percpu_timer_interrupt() for more
  448.  * information.
  449.  */
  450. ba,pt %xcc, 99f
  451.  nop
  452. .align 64
  453. 99: wr %g6, %g0, %pic
  454. rd %pic, %g0
  455. #endif
  456. wr %g0, ASI_P, %asi
  457. mov 1, %g5
  458. sllx %g5, THREAD_SHIFT, %g5
  459. sub %g5, (REGWIN_SZ + STACK_BIAS), %g5
  460. add %g6, %g5, %sp
  461. mov 0, %fp
  462. wrpr %g0, 0, %wstate
  463. wrpr %g0, 0x0, %tl
  464. /* Clear the bss */
  465. sethi %hi(__bss_start), %o0
  466. or %o0, %lo(__bss_start), %o0
  467. sethi %hi(_end), %o1
  468. or %o1, %lo(_end), %o1
  469. call __bzero
  470.  sub %o1, %o0, %o1
  471. mov %l6, %o1 ! OpenPROM stack
  472. call prom_init
  473.  mov %l7, %o0 ! OpenPROM cif handler
  474. /* Off we go.... */
  475. call start_kernel
  476.  nop
  477. /* Not reached... */
  478. /* IMPORTANT NOTE: Whenever making changes here, check
  479.  * trampoline.S as well. -jj */
  480. .globl setup_tba
  481. setup_tba: /* i0 = is_starfire */
  482. save %sp, -160, %sp
  483. rdpr %tba, %g7
  484. sethi %hi(prom_tba), %o1
  485. or %o1, %lo(prom_tba), %o1
  486. stx %g7, [%o1]
  487. /* Setup "Linux" globals 8-) */
  488. rdpr %pstate, %o1
  489. mov %g6, %o2
  490. wrpr %o1, (PSTATE_AG|PSTATE_IE), %pstate
  491. sethi %hi(sparc64_ttable_tl0), %g5
  492. wrpr %g5, %tba
  493. mov %o2, %g6
  494. /* Set up MMU globals */
  495. wrpr %o1, (PSTATE_MG|PSTATE_IE), %pstate
  496. /* Set fixed globals used by dTLB miss handler. */
  497. #define KERN_HIGHBITS ((_PAGE_VALID|_PAGE_SZ4MB)^0xfffff80000000000)
  498. #define KERN_LOWBITS (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
  499. #define VPTE_BASE_SPITFIRE 0xfffffffe00000000
  500. #if 1
  501. #define VPTE_BASE_CHEETAH VPTE_BASE_SPITFIRE
  502. #else
  503. #define VPTE_BASE_CHEETAH 0xffe0000000000000
  504. #endif
  505. mov TSB_REG, %g1
  506. stxa %g0, [%g1] ASI_DMMU
  507. membar #Sync
  508. mov TLB_SFSR, %g1
  509. sethi %uhi(KERN_HIGHBITS), %g2
  510. or %g2, %ulo(KERN_HIGHBITS), %g2
  511. sllx %g2, 32, %g2
  512. or %g2, KERN_LOWBITS, %g2
  513. rdpr %ver, %g3
  514. sethi %hi(0x003e0014), %g7
  515. srlx %g3, 32, %g3
  516. or %g7, %lo(0x003e0014), %g7
  517. cmp %g3, %g7
  518. bne,pt %icc, 1f
  519.  nop
  520. sethi %uhi(VPTE_BASE_CHEETAH), %g3
  521. or %g3, %ulo(VPTE_BASE_CHEETAH), %g3
  522. ba,pt %xcc, 2f
  523.  sllx %g3, 32, %g3
  524. 1:
  525. sethi %uhi(VPTE_BASE_SPITFIRE), %g3
  526. or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3
  527. sllx %g3, 32, %g3
  528. 2:
  529. clr %g7
  530. #undef KERN_HIGHBITS
  531. #undef KERN_LOWBITS
  532. #undef VPTE_BASE_SPITFIRE
  533. #undef VPTE_BASE_CHEETAH
  534. /* Setup Interrupt globals */
  535. wrpr %o1, (PSTATE_IG|PSTATE_IE), %pstate
  536. #ifndef CONFIG_SMP
  537. sethi %hi(__up_workvec), %g5
  538. or %g5, %lo(__up_workvec), %g6
  539. #else
  540. /* By definition of where we are, this is boot_cpu. */
  541. brz,pt %i0, not_starfire
  542.  sethi %hi(0x1fff4000), %g1
  543. or %g1, %lo(0x1fff4000), %g1
  544. sllx %g1, 12, %g1
  545. or %g1, 0xd0, %g1
  546. lduwa [%g1] ASI_PHYS_BYPASS_EC_E, %g1
  547. b,pt %xcc, set_worklist
  548.  nop
  549. not_starfire:
  550. rdpr %ver, %g1
  551. sethi %hi(0x003e0014), %g5
  552. srlx %g1, 32, %g1
  553. or %g7, %lo(0x003e0014), %g5
  554. cmp %g1, %g5
  555. bne,pt %icc, not_cheetah
  556.  nop
  557. ldxa [%g0] ASI_SAFARI_CONFIG, %g1
  558. srlx %g1, 17, %g1
  559. ba,pt %xcc, set_worklist
  560.  and %g1, 0x3ff, %g1 ! 10bit Safari Agent ID
  561. not_cheetah:
  562. ldxa [%g0] ASI_UPA_CONFIG, %g1
  563. srlx %g1, 17, %g1
  564. and %g1, 0x1f, %g1
  565. /* In theory this is: &(cpu_data[boot_cpu_id].irq_worklists[0]) */
  566. set_worklist:
  567. sethi %hi(cpu_data), %g5
  568. or %g5, %lo(cpu_data), %g5
  569. sllx %g1, 7, %g1
  570. add %g5, %g1, %g5
  571. add %g5, 64, %g6
  572. #endif
  573. /* Kill PROM timer */
  574. wr %g0, 0, %tick_cmpr
  575. rdpr %ver, %g1
  576. sethi %hi(0x003e0014), %g5
  577. srlx %g1, 32, %g1
  578. or %g7, %lo(0x003e0014), %g5
  579. cmp %g1, %g5
  580. bne,pt %icc, 1f
  581.  nop
  582. /* Disable STICK_INT interrupts. */
  583. sethi %hi(0x80000000), %g1
  584. sllx %g1, 32, %g1
  585. wr %g1, %asr25
  586. /* Ok, we're done setting up all the state our trap mechanims needs,
  587.  * now get back into normal globals and let the PROM know what is up.
  588.  */
  589. 1:
  590. wrpr %g0, %g0, %wstate
  591. wrpr %o1, PSTATE_IE, %pstate
  592. sethi %hi(sparc64_ttable_tl0), %g5
  593. call prom_set_trap_table
  594.  mov %g5, %o0
  595. rdpr %pstate, %o1
  596. or %o1, PSTATE_IE, %o1
  597. wrpr %o1, 0, %pstate
  598. ret
  599.  restore
  600. /*
  601.  * The following skips make sure the trap table in ttable.S is aligned
  602.  * on a 32K boundary as required by the v9 specs for TBA register.
  603.  */
  604. sparc64_boot_end:
  605. .skip 0x2000 + _start - sparc64_boot_end
  606. bootup_user_stack_end:
  607. .skip 0x2000
  608. #ifdef CONFIG_SBUS
  609. /* This is just a hack to fool make depend config.h discovering
  610.    strategy: As the .S files below need config.h, but
  611.    make depend does not find it for them, we include config.h
  612.    in head.S */
  613. #endif
  614. ! 0x0000000000408000
  615. #include "ttable.S"
  616. #include "systbls.S"
  617. .align 1024
  618. .globl swapper_pg_dir
  619. swapper_pg_dir:
  620. .word 0
  621. #include "etrap.S"
  622. #include "rtrap.S"
  623. #include "winfixup.S"
  624. #include "entry.S"
  625. /* This is just anal retentiveness on my part... */
  626. .align 16384
  627. .data
  628. .align 8
  629. .globl prom_tba
  630. prom_tba: .xword 0
  631. .section ".fixup",#alloc,#execinstr
  632. .globl __ret_efault
  633. __ret_efault:
  634. ret
  635.  restore %g0, -EFAULT, %o0