1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2a88b5ba8SSam Ravnborg/* 3a88b5ba8SSam Ravnborg * trampoline.S: Jump start slave processors on sparc64. 4a88b5ba8SSam Ravnborg * 5a88b5ba8SSam Ravnborg * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) 6a88b5ba8SSam Ravnborg */ 7a88b5ba8SSam Ravnborg 8a88b5ba8SSam Ravnborg 9*65fddcfcSMike Rapoport#include <linux/pgtable.h> 10a88b5ba8SSam Ravnborg#include <asm/head.h> 11a88b5ba8SSam Ravnborg#include <asm/asi.h> 12a88b5ba8SSam Ravnborg#include <asm/lsu.h> 13a88b5ba8SSam Ravnborg#include <asm/dcr.h> 14a88b5ba8SSam Ravnborg#include <asm/dcu.h> 15a88b5ba8SSam Ravnborg#include <asm/pstate.h> 16a88b5ba8SSam Ravnborg#include <asm/page.h> 17a88b5ba8SSam Ravnborg#include <asm/spitfire.h> 18a88b5ba8SSam Ravnborg#include <asm/processor.h> 19a88b5ba8SSam Ravnborg#include <asm/thread_info.h> 20a88b5ba8SSam Ravnborg#include <asm/mmu.h> 21a88b5ba8SSam Ravnborg#include <asm/hypervisor.h> 22a88b5ba8SSam Ravnborg#include <asm/cpudata.h> 23a88b5ba8SSam Ravnborg 24a88b5ba8SSam Ravnborg .data 25a88b5ba8SSam Ravnborg .align 8 26a88b5ba8SSam Ravnborgcall_method: 27a88b5ba8SSam Ravnborg .asciz "call-method" 28a88b5ba8SSam Ravnborg .align 8 29a88b5ba8SSam Ravnborgitlb_load: 30a88b5ba8SSam Ravnborg .asciz "SUNW,itlb-load" 31a88b5ba8SSam Ravnborg .align 8 32a88b5ba8SSam Ravnborgdtlb_load: 33a88b5ba8SSam Ravnborg .asciz "SUNW,dtlb-load" 34a88b5ba8SSam Ravnborg 35a88b5ba8SSam Ravnborg#define TRAMP_STACK_SIZE 1024 36a88b5ba8SSam Ravnborg .align 16 37a88b5ba8SSam Ravnborgtramp_stack: 38a88b5ba8SSam Ravnborg .skip TRAMP_STACK_SIZE 39a88b5ba8SSam Ravnborg 40a88b5ba8SSam Ravnborg .align 8 41a88b5ba8SSam Ravnborg .globl sparc64_cpu_startup, sparc64_cpu_startup_end 42a88b5ba8SSam Ravnborgsparc64_cpu_startup: 43a88b5ba8SSam Ravnborg BRANCH_IF_SUN4V(g1, niagara_startup) 44a88b5ba8SSam Ravnborg BRANCH_IF_CHEETAH_BASE(g1, g5, cheetah_startup) 45a88b5ba8SSam Ravnborg BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1, g5, cheetah_plus_startup) 46a88b5ba8SSam Ravnborg 47a88b5ba8SSam Ravnborg ba,pt %xcc, spitfire_startup 48a88b5ba8SSam Ravnborg nop 49a88b5ba8SSam Ravnborg 50a88b5ba8SSam Ravnborgcheetah_plus_startup: 51a88b5ba8SSam Ravnborg /* Preserve OBP chosen DCU and DCR register settings. */ 52a88b5ba8SSam Ravnborg ba,pt %xcc, cheetah_generic_startup 53a88b5ba8SSam Ravnborg nop 54a88b5ba8SSam Ravnborg 55a88b5ba8SSam Ravnborgcheetah_startup: 56a88b5ba8SSam Ravnborg mov DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1 57a88b5ba8SSam Ravnborg wr %g1, %asr18 58a88b5ba8SSam Ravnborg 59a88b5ba8SSam Ravnborg sethi %uhi(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5 60a88b5ba8SSam Ravnborg or %g5, %ulo(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5 61a88b5ba8SSam Ravnborg sllx %g5, 32, %g5 62a88b5ba8SSam Ravnborg or %g5, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g5 63a88b5ba8SSam Ravnborg stxa %g5, [%g0] ASI_DCU_CONTROL_REG 64a88b5ba8SSam Ravnborg membar #Sync 65a88b5ba8SSam Ravnborg /* fallthru */ 66a88b5ba8SSam Ravnborg 67a88b5ba8SSam Ravnborgcheetah_generic_startup: 68a88b5ba8SSam Ravnborg mov TSB_EXTENSION_P, %g3 69a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_DMMU 70a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_IMMU 71a88b5ba8SSam Ravnborg membar #Sync 72a88b5ba8SSam Ravnborg 73a88b5ba8SSam Ravnborg mov TSB_EXTENSION_S, %g3 74a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_DMMU 75a88b5ba8SSam Ravnborg membar #Sync 76a88b5ba8SSam Ravnborg 77a88b5ba8SSam Ravnborg mov TSB_EXTENSION_N, %g3 78a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_DMMU 79a88b5ba8SSam Ravnborg stxa %g0, [%g3] ASI_IMMU 80a88b5ba8SSam Ravnborg membar #Sync 81a88b5ba8SSam Ravnborg /* fallthru */ 82a88b5ba8SSam Ravnborg 83a88b5ba8SSam Ravnborgniagara_startup: 84a88b5ba8SSam Ravnborg /* Disable STICK_INT interrupts. */ 85a88b5ba8SSam Ravnborg sethi %hi(0x80000000), %g5 86a88b5ba8SSam Ravnborg sllx %g5, 32, %g5 87a88b5ba8SSam Ravnborg wr %g5, %asr25 88a88b5ba8SSam Ravnborg 89a88b5ba8SSam Ravnborg ba,pt %xcc, startup_continue 90a88b5ba8SSam Ravnborg nop 91a88b5ba8SSam Ravnborg 92a88b5ba8SSam Ravnborgspitfire_startup: 93a88b5ba8SSam Ravnborg mov (LSU_CONTROL_IC | LSU_CONTROL_DC | LSU_CONTROL_IM | LSU_CONTROL_DM), %g1 94a88b5ba8SSam Ravnborg stxa %g1, [%g0] ASI_LSU_CONTROL 95a88b5ba8SSam Ravnborg membar #Sync 96a88b5ba8SSam Ravnborg 97a88b5ba8SSam Ravnborgstartup_continue: 98a88b5ba8SSam Ravnborg mov %o0, %l0 99a88b5ba8SSam Ravnborg BRANCH_IF_SUN4V(g1, niagara_lock_tlb) 100a88b5ba8SSam Ravnborg 101a88b5ba8SSam Ravnborg sethi %hi(0x80000000), %g2 102a88b5ba8SSam Ravnborg sllx %g2, 32, %g2 103a88b5ba8SSam Ravnborg wr %g2, 0, %tick_cmpr 104a88b5ba8SSam Ravnborg 105a88b5ba8SSam Ravnborg /* Call OBP by hand to lock KERNBASE into i/d tlbs. 106a88b5ba8SSam Ravnborg * We lock 'num_kernel_image_mappings' consequetive entries. 107a88b5ba8SSam Ravnborg */ 108a88b5ba8SSam Ravnborg sethi %hi(prom_entry_lock), %g2 109a88b5ba8SSam Ravnborg1: ldstub [%g2 + %lo(prom_entry_lock)], %g1 110a88b5ba8SSam Ravnborg brnz,pn %g1, 1b 111a88b5ba8SSam Ravnborg nop 112a88b5ba8SSam Ravnborg 113ef3e035cSDavid S. Miller /* Get onto temporary stack which will be in the locked 114ef3e035cSDavid S. Miller * kernel image. 115ef3e035cSDavid S. Miller */ 116ef3e035cSDavid S. Miller sethi %hi(tramp_stack), %g1 117ef3e035cSDavid S. Miller or %g1, %lo(tramp_stack), %g1 118ef3e035cSDavid S. Miller add %g1, TRAMP_STACK_SIZE, %g1 119ef3e035cSDavid S. Miller sub %g1, STACKFRAME_SZ + STACK_BIAS + 256, %sp 120a88b5ba8SSam Ravnborg flushw 121a88b5ba8SSam Ravnborg 122a88b5ba8SSam Ravnborg /* Setup the loop variables: 123a88b5ba8SSam Ravnborg * %l3: VADDR base 124a88b5ba8SSam Ravnborg * %l4: TTE base 125a88b5ba8SSam Ravnborg * %l5: Loop iterator, iterates from 0 to 'num_kernel_image_mappings' 126a88b5ba8SSam Ravnborg * %l6: Number of TTE entries to map 127a88b5ba8SSam Ravnborg * %l7: Highest TTE entry number, we count down 128a88b5ba8SSam Ravnborg */ 129a88b5ba8SSam Ravnborg sethi %hi(KERNBASE), %l3 130a88b5ba8SSam Ravnborg sethi %hi(kern_locked_tte_data), %l4 131a88b5ba8SSam Ravnborg ldx [%l4 + %lo(kern_locked_tte_data)], %l4 132a88b5ba8SSam Ravnborg clr %l5 133a88b5ba8SSam Ravnborg sethi %hi(num_kernel_image_mappings), %l6 134a88b5ba8SSam Ravnborg lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 135a88b5ba8SSam Ravnborg 136a88b5ba8SSam Ravnborg mov 15, %l7 137a88b5ba8SSam Ravnborg BRANCH_IF_ANY_CHEETAH(g1,g5,2f) 138a88b5ba8SSam Ravnborg 139a88b5ba8SSam Ravnborg mov 63, %l7 140a88b5ba8SSam Ravnborg2: 141a88b5ba8SSam Ravnborg 142a88b5ba8SSam Ravnborg3: 143a88b5ba8SSam Ravnborg /* Lock into I-MMU */ 144a88b5ba8SSam Ravnborg sethi %hi(call_method), %g2 145a88b5ba8SSam Ravnborg or %g2, %lo(call_method), %g2 146a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x00] 147a88b5ba8SSam Ravnborg mov 5, %g2 148a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x08] 149a88b5ba8SSam Ravnborg mov 1, %g2 150a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x10] 151a88b5ba8SSam Ravnborg sethi %hi(itlb_load), %g2 152a88b5ba8SSam Ravnborg or %g2, %lo(itlb_load), %g2 153a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x18] 154a88b5ba8SSam Ravnborg sethi %hi(prom_mmu_ihandle_cache), %g2 155a88b5ba8SSam Ravnborg lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2 156a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x20] 157a88b5ba8SSam Ravnborg 158a88b5ba8SSam Ravnborg /* Each TTE maps 4MB, convert index to offset. */ 159a88b5ba8SSam Ravnborg sllx %l5, 22, %g1 160a88b5ba8SSam Ravnborg 161a88b5ba8SSam Ravnborg add %l3, %g1, %g2 162a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x28] ! VADDR 163a88b5ba8SSam Ravnborg add %l4, %g1, %g2 164a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x30] ! TTE 165a88b5ba8SSam Ravnborg 166a88b5ba8SSam Ravnborg /* TTE index is highest minus loop index. */ 167a88b5ba8SSam Ravnborg sub %l7, %l5, %g2 168a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x38] 169a88b5ba8SSam Ravnborg 170a88b5ba8SSam Ravnborg sethi %hi(p1275buf), %g2 171a88b5ba8SSam Ravnborg or %g2, %lo(p1275buf), %g2 172a88b5ba8SSam Ravnborg ldx [%g2 + 0x08], %o1 173a88b5ba8SSam Ravnborg call %o1 174a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 175a88b5ba8SSam Ravnborg 176a88b5ba8SSam Ravnborg /* Lock into D-MMU */ 177a88b5ba8SSam Ravnborg sethi %hi(call_method), %g2 178a88b5ba8SSam Ravnborg or %g2, %lo(call_method), %g2 179a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x00] 180a88b5ba8SSam Ravnborg mov 5, %g2 181a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x08] 182a88b5ba8SSam Ravnborg mov 1, %g2 183a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x10] 184a88b5ba8SSam Ravnborg sethi %hi(dtlb_load), %g2 185a88b5ba8SSam Ravnborg or %g2, %lo(dtlb_load), %g2 186a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x18] 187a88b5ba8SSam Ravnborg sethi %hi(prom_mmu_ihandle_cache), %g2 188a88b5ba8SSam Ravnborg lduw [%g2 + %lo(prom_mmu_ihandle_cache)], %g2 189a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x20] 190a88b5ba8SSam Ravnborg 191a88b5ba8SSam Ravnborg /* Each TTE maps 4MB, convert index to offset. */ 192a88b5ba8SSam Ravnborg sllx %l5, 22, %g1 193a88b5ba8SSam Ravnborg 194a88b5ba8SSam Ravnborg add %l3, %g1, %g2 195a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x28] ! VADDR 196a88b5ba8SSam Ravnborg add %l4, %g1, %g2 197a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x30] ! TTE 198a88b5ba8SSam Ravnborg 199a88b5ba8SSam Ravnborg /* TTE index is highest minus loop index. */ 200a88b5ba8SSam Ravnborg sub %l7, %l5, %g2 201a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x38] 202a88b5ba8SSam Ravnborg 203a88b5ba8SSam Ravnborg sethi %hi(p1275buf), %g2 204a88b5ba8SSam Ravnborg or %g2, %lo(p1275buf), %g2 205a88b5ba8SSam Ravnborg ldx [%g2 + 0x08], %o1 206a88b5ba8SSam Ravnborg call %o1 207a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 208a88b5ba8SSam Ravnborg 209a88b5ba8SSam Ravnborg add %l5, 1, %l5 210a88b5ba8SSam Ravnborg cmp %l5, %l6 211a88b5ba8SSam Ravnborg bne,pt %xcc, 3b 212a88b5ba8SSam Ravnborg nop 213a88b5ba8SSam Ravnborg 214a88b5ba8SSam Ravnborg sethi %hi(prom_entry_lock), %g2 215a88b5ba8SSam Ravnborg stb %g0, [%g2 + %lo(prom_entry_lock)] 216a88b5ba8SSam Ravnborg 217a88b5ba8SSam Ravnborg ba,pt %xcc, after_lock_tlb 218a88b5ba8SSam Ravnborg nop 219a88b5ba8SSam Ravnborg 220a88b5ba8SSam Ravnborgniagara_lock_tlb: 221a88b5ba8SSam Ravnborg sethi %hi(KERNBASE), %l3 222a88b5ba8SSam Ravnborg sethi %hi(kern_locked_tte_data), %l4 223a88b5ba8SSam Ravnborg ldx [%l4 + %lo(kern_locked_tte_data)], %l4 224a88b5ba8SSam Ravnborg clr %l5 225a88b5ba8SSam Ravnborg sethi %hi(num_kernel_image_mappings), %l6 226a88b5ba8SSam Ravnborg lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 227a88b5ba8SSam Ravnborg 228a88b5ba8SSam Ravnborg1: 229a88b5ba8SSam Ravnborg mov HV_FAST_MMU_MAP_PERM_ADDR, %o5 230a88b5ba8SSam Ravnborg sllx %l5, 22, %g2 231a88b5ba8SSam Ravnborg add %l3, %g2, %o0 232a88b5ba8SSam Ravnborg clr %o1 233a88b5ba8SSam Ravnborg add %l4, %g2, %o2 234a88b5ba8SSam Ravnborg mov HV_MMU_IMMU, %o3 235a88b5ba8SSam Ravnborg ta HV_FAST_TRAP 236a88b5ba8SSam Ravnborg 237a88b5ba8SSam Ravnborg mov HV_FAST_MMU_MAP_PERM_ADDR, %o5 238a88b5ba8SSam Ravnborg sllx %l5, 22, %g2 239a88b5ba8SSam Ravnborg add %l3, %g2, %o0 240a88b5ba8SSam Ravnborg clr %o1 241a88b5ba8SSam Ravnborg add %l4, %g2, %o2 242a88b5ba8SSam Ravnborg mov HV_MMU_DMMU, %o3 243a88b5ba8SSam Ravnborg ta HV_FAST_TRAP 244a88b5ba8SSam Ravnborg 245a88b5ba8SSam Ravnborg add %l5, 1, %l5 246a88b5ba8SSam Ravnborg cmp %l5, %l6 247a88b5ba8SSam Ravnborg bne,pt %xcc, 1b 248a88b5ba8SSam Ravnborg nop 249a88b5ba8SSam Ravnborg 250a88b5ba8SSam Ravnborgafter_lock_tlb: 251a88b5ba8SSam Ravnborg wrpr %g0, (PSTATE_PRIV | PSTATE_PEF), %pstate 252a88b5ba8SSam Ravnborg wr %g0, 0, %fprs 253a88b5ba8SSam Ravnborg 254a88b5ba8SSam Ravnborg wr %g0, ASI_P, %asi 255a88b5ba8SSam Ravnborg 256a88b5ba8SSam Ravnborg mov PRIMARY_CONTEXT, %g7 257a88b5ba8SSam Ravnborg 258a88b5ba8SSam Ravnborg661: stxa %g0, [%g7] ASI_DMMU 259a88b5ba8SSam Ravnborg .section .sun4v_1insn_patch, "ax" 260a88b5ba8SSam Ravnborg .word 661b 261a88b5ba8SSam Ravnborg stxa %g0, [%g7] ASI_MMU 262a88b5ba8SSam Ravnborg .previous 263a88b5ba8SSam Ravnborg 264a88b5ba8SSam Ravnborg membar #Sync 265a88b5ba8SSam Ravnborg mov SECONDARY_CONTEXT, %g7 266a88b5ba8SSam Ravnborg 267a88b5ba8SSam Ravnborg661: stxa %g0, [%g7] ASI_DMMU 268a88b5ba8SSam Ravnborg .section .sun4v_1insn_patch, "ax" 269a88b5ba8SSam Ravnborg .word 661b 270a88b5ba8SSam Ravnborg stxa %g0, [%g7] ASI_MMU 271a88b5ba8SSam Ravnborg .previous 272a88b5ba8SSam Ravnborg 273a88b5ba8SSam Ravnborg membar #Sync 274a88b5ba8SSam Ravnborg 275a88b5ba8SSam Ravnborg /* Everything we do here, until we properly take over the 276a88b5ba8SSam Ravnborg * trap table, must be done with extreme care. We cannot 277a88b5ba8SSam Ravnborg * make any references to %g6 (current thread pointer), 278a88b5ba8SSam Ravnborg * %g4 (current task pointer), or %g5 (base of current cpu's 279a88b5ba8SSam Ravnborg * per-cpu area) until we properly take over the trap table 280a88b5ba8SSam Ravnborg * from the firmware and hypervisor. 281a88b5ba8SSam Ravnborg * 282a88b5ba8SSam Ravnborg * Get onto temporary stack which is in the locked kernel image. 283a88b5ba8SSam Ravnborg */ 284a88b5ba8SSam Ravnborg sethi %hi(tramp_stack), %g1 285a88b5ba8SSam Ravnborg or %g1, %lo(tramp_stack), %g1 286a88b5ba8SSam Ravnborg add %g1, TRAMP_STACK_SIZE, %g1 287a88b5ba8SSam Ravnborg sub %g1, STACKFRAME_SZ + STACK_BIAS + 256, %sp 288a88b5ba8SSam Ravnborg mov 0, %fp 289a88b5ba8SSam Ravnborg 290a88b5ba8SSam Ravnborg /* Put garbage in these registers to trap any access to them. */ 291a88b5ba8SSam Ravnborg set 0xdeadbeef, %g4 292a88b5ba8SSam Ravnborg set 0xdeadbeef, %g5 293a88b5ba8SSam Ravnborg set 0xdeadbeef, %g6 294a88b5ba8SSam Ravnborg 295a88b5ba8SSam Ravnborg call init_irqwork_curcpu 296a88b5ba8SSam Ravnborg nop 297a88b5ba8SSam Ravnborg 298a88b5ba8SSam Ravnborg sethi %hi(tlb_type), %g3 299a88b5ba8SSam Ravnborg lduw [%g3 + %lo(tlb_type)], %g2 300a88b5ba8SSam Ravnborg cmp %g2, 3 301a88b5ba8SSam Ravnborg bne,pt %icc, 1f 302a88b5ba8SSam Ravnborg nop 303a88b5ba8SSam Ravnborg 304a88b5ba8SSam Ravnborg call hard_smp_processor_id 305a88b5ba8SSam Ravnborg nop 306a88b5ba8SSam Ravnborg 307a88b5ba8SSam Ravnborg call sun4v_register_mondo_queues 308a88b5ba8SSam Ravnborg nop 309a88b5ba8SSam Ravnborg 310a88b5ba8SSam Ravnborg1: call init_cur_cpu_trap 311a88b5ba8SSam Ravnborg ldx [%l0], %o0 312a88b5ba8SSam Ravnborg 313a88b5ba8SSam Ravnborg /* Start using proper page size encodings in ctx register. */ 314a88b5ba8SSam Ravnborg sethi %hi(sparc64_kern_pri_context), %g3 315a88b5ba8SSam Ravnborg ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2 316a88b5ba8SSam Ravnborg mov PRIMARY_CONTEXT, %g1 317a88b5ba8SSam Ravnborg 318a88b5ba8SSam Ravnborg661: stxa %g2, [%g1] ASI_DMMU 319a88b5ba8SSam Ravnborg .section .sun4v_1insn_patch, "ax" 320a88b5ba8SSam Ravnborg .word 661b 321a88b5ba8SSam Ravnborg stxa %g2, [%g1] ASI_MMU 322a88b5ba8SSam Ravnborg .previous 323a88b5ba8SSam Ravnborg 324a88b5ba8SSam Ravnborg membar #Sync 325a88b5ba8SSam Ravnborg 326a88b5ba8SSam Ravnborg wrpr %g0, 0, %wstate 327a88b5ba8SSam Ravnborg 328a88b5ba8SSam Ravnborg sethi %hi(prom_entry_lock), %g2 329a88b5ba8SSam Ravnborg1: ldstub [%g2 + %lo(prom_entry_lock)], %g1 330a88b5ba8SSam Ravnborg brnz,pn %g1, 1b 331a88b5ba8SSam Ravnborg nop 332a88b5ba8SSam Ravnborg 333a88b5ba8SSam Ravnborg /* As a hack, put &init_thread_union into %g6. 334a88b5ba8SSam Ravnborg * prom_world() loads from here to restore the %asi 335a88b5ba8SSam Ravnborg * register. 336a88b5ba8SSam Ravnborg */ 337a88b5ba8SSam Ravnborg sethi %hi(init_thread_union), %g6 338a88b5ba8SSam Ravnborg or %g6, %lo(init_thread_union), %g6 339a88b5ba8SSam Ravnborg 340a88b5ba8SSam Ravnborg sethi %hi(is_sun4v), %o0 341a88b5ba8SSam Ravnborg lduw [%o0 + %lo(is_sun4v)], %o0 342a88b5ba8SSam Ravnborg brz,pt %o0, 2f 343a88b5ba8SSam Ravnborg nop 344a88b5ba8SSam Ravnborg 345a88b5ba8SSam Ravnborg TRAP_LOAD_TRAP_BLOCK(%g2, %g3) 346a88b5ba8SSam Ravnborg add %g2, TRAP_PER_CPU_FAULT_INFO, %g2 347a88b5ba8SSam Ravnborg stxa %g2, [%g0] ASI_SCRATCHPAD 348a88b5ba8SSam Ravnborg 349a88b5ba8SSam Ravnborg /* Compute physical address: 350a88b5ba8SSam Ravnborg * 351a88b5ba8SSam Ravnborg * paddr = kern_base + (mmfsa_vaddr - KERNBASE) 352a88b5ba8SSam Ravnborg */ 353a88b5ba8SSam Ravnborg sethi %hi(KERNBASE), %g3 354a88b5ba8SSam Ravnborg sub %g2, %g3, %g2 355a88b5ba8SSam Ravnborg sethi %hi(kern_base), %g3 356a88b5ba8SSam Ravnborg ldx [%g3 + %lo(kern_base)], %g3 357a88b5ba8SSam Ravnborg add %g2, %g3, %o1 358a88b5ba8SSam Ravnborg sethi %hi(sparc64_ttable_tl0), %o0 359a88b5ba8SSam Ravnborg 360a88b5ba8SSam Ravnborg set prom_set_trap_table_name, %g2 361a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x00] 362a88b5ba8SSam Ravnborg mov 2, %g2 363a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x08] 364a88b5ba8SSam Ravnborg mov 0, %g2 365a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x10] 366a88b5ba8SSam Ravnborg stx %o0, [%sp + 2047 + 128 + 0x18] 367a88b5ba8SSam Ravnborg stx %o1, [%sp + 2047 + 128 + 0x20] 368a88b5ba8SSam Ravnborg sethi %hi(p1275buf), %g2 369a88b5ba8SSam Ravnborg or %g2, %lo(p1275buf), %g2 370a88b5ba8SSam Ravnborg ldx [%g2 + 0x08], %o1 371a88b5ba8SSam Ravnborg call %o1 372a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 373a88b5ba8SSam Ravnborg 374a88b5ba8SSam Ravnborg ba,pt %xcc, 3f 375a88b5ba8SSam Ravnborg nop 376a88b5ba8SSam Ravnborg 377a88b5ba8SSam Ravnborg2: sethi %hi(sparc64_ttable_tl0), %o0 378a88b5ba8SSam Ravnborg set prom_set_trap_table_name, %g2 379a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x00] 380a88b5ba8SSam Ravnborg mov 1, %g2 381a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x08] 382a88b5ba8SSam Ravnborg mov 0, %g2 383a88b5ba8SSam Ravnborg stx %g2, [%sp + 2047 + 128 + 0x10] 384a88b5ba8SSam Ravnborg stx %o0, [%sp + 2047 + 128 + 0x18] 385a88b5ba8SSam Ravnborg sethi %hi(p1275buf), %g2 386a88b5ba8SSam Ravnborg or %g2, %lo(p1275buf), %g2 387a88b5ba8SSam Ravnborg ldx [%g2 + 0x08], %o1 388a88b5ba8SSam Ravnborg call %o1 389a88b5ba8SSam Ravnborg add %sp, (2047 + 128), %o0 390a88b5ba8SSam Ravnborg 391a88b5ba8SSam Ravnborg3: sethi %hi(prom_entry_lock), %g2 392a88b5ba8SSam Ravnborg stb %g0, [%g2 + %lo(prom_entry_lock)] 393a88b5ba8SSam Ravnborg 394a88b5ba8SSam Ravnborg ldx [%l0], %g6 395a88b5ba8SSam Ravnborg ldx [%g6 + TI_TASK], %g4 396a88b5ba8SSam Ravnborg 397a88b5ba8SSam Ravnborg mov 1, %g5 398a88b5ba8SSam Ravnborg sllx %g5, THREAD_SHIFT, %g5 399a88b5ba8SSam Ravnborg sub %g5, (STACKFRAME_SZ + STACK_BIAS), %g5 400a88b5ba8SSam Ravnborg add %g6, %g5, %sp 401a88b5ba8SSam Ravnborg 402a88b5ba8SSam Ravnborg rdpr %pstate, %o1 403a88b5ba8SSam Ravnborg or %o1, PSTATE_IE, %o1 404a88b5ba8SSam Ravnborg wrpr %o1, 0, %pstate 405a88b5ba8SSam Ravnborg 406a88b5ba8SSam Ravnborg call smp_callin 407a88b5ba8SSam Ravnborg nop 40887fa05aeSSam Ravnborg 409a88b5ba8SSam Ravnborg call cpu_panic 410a88b5ba8SSam Ravnborg nop 411a88b5ba8SSam Ravnborg1: b,a,pt %xcc, 1b 412a88b5ba8SSam Ravnborg 413a88b5ba8SSam Ravnborg .align 8 414a88b5ba8SSam Ravnborgsparc64_cpu_startup_end: 415