^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* hvtramp.S: Hypervisor start-cpu trampoline code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2007, 2008 David S. Miller <davem@davemloft.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/hypervisor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/scratchpad.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/spitfire.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/hvtramp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/pstate.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/asi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/pil.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .align 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .globl hv_cpu_startup, hv_cpu_startup_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* This code executes directly out of the hypervisor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * with physical addressing (va==pa). %o0 contains
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * our client argument which for Linux points to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * a descriptor data structure which defines the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * MMU entries we need to load up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * After we set things up we enable the MMU and call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * into the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * First setup basic privileged cpu state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) hv_cpu_startup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) SET_GL(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) wrpr %g0, PIL_NORMAL_MAX, %pil
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) wrpr %g0, 0, %canrestore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) wrpr %g0, 0, %otherwin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) wrpr %g0, 6, %cansave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) wrpr %g0, 6, %cleanwin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) wrpr %g0, 0, %cwp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) wrpr %g0, 0, %wstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) wrpr %g0, 0, %tl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) sethi %hi(sparc64_ttable_tl0), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) wrpr %g1, %tba
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) mov %o0, %l0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) lduw [%l0 + HVTRAMP_DESCR_CPU], %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) mov SCRATCHPAD_CPUID, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) stxa %g1, [%g2] ASI_SCRATCHPAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ldx [%l0 + HVTRAMP_DESCR_FAULT_INFO_VA], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) stxa %g2, [%g0] ASI_SCRATCHPAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) mov 0, %l1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) lduw [%l0 + HVTRAMP_DESCR_NUM_MAPPINGS], %l2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) add %l0, HVTRAMP_DESCR_MAPS, %l3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 1: ldx [%l3 + HVTRAMP_MAPPING_VADDR], %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) clr %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ldx [%l3 + HVTRAMP_MAPPING_TTE], %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) mov HV_MMU_IMMU | HV_MMU_DMMU, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) mov HV_FAST_MMU_MAP_PERM_ADDR, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ta HV_FAST_TRAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) brnz,pn %o0, 80f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) add %l1, 1, %l1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) cmp %l1, %l2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) blt,a,pt %xcc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) add %l3, HVTRAMP_MAPPING_SIZE, %l3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ldx [%l0 + HVTRAMP_DESCR_FAULT_INFO_PA], %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) mov HV_FAST_MMU_FAULT_AREA_CONF, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ta HV_FAST_TRAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) brnz,pn %o0, 80f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) wrpr %g0, (PSTATE_PRIV | PSTATE_PEF), %pstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ldx [%l0 + HVTRAMP_DESCR_THREAD_REG], %l6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) mov 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) set 1f, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) mov HV_FAST_MMU_ENABLE, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ta HV_FAST_TRAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ba,pt %xcc, 80f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) wr %g0, 0, %fprs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) wr %g0, ASI_P, %asi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) mov PRIMARY_CONTEXT, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) stxa %g0, [%g7] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) mov SECONDARY_CONTEXT, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) stxa %g0, [%g7] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) membar #Sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) mov %l6, %g6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ldx [%g6 + TI_TASK], %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) mov 1, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) sllx %g5, THREAD_SHIFT, %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) sub %g5, (STACKFRAME_SZ + STACK_BIAS), %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) add %g6, %g5, %sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) call init_irqwork_curcpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) call hard_smp_processor_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) call sun4v_register_mondo_queues
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) call init_cur_cpu_trap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) mov %g6, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) wrpr %g0, (PSTATE_PRIV | PSTATE_PEF | PSTATE_IE), %pstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) call smp_callin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) call cpu_panic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 80: ba,pt %xcc, 80b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .align 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) hv_cpu_startup_end: