1*1ae08745Sheppo/* 2*1ae08745Sheppo * CDDL HEADER START 3*1ae08745Sheppo * 4*1ae08745Sheppo * The contents of this file are subject to the terms of the 5*1ae08745Sheppo * Common Development and Distribution License (the "License"). 6*1ae08745Sheppo * You may not use this file except in compliance with the License. 7*1ae08745Sheppo * 8*1ae08745Sheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*1ae08745Sheppo * or http://www.opensolaris.org/os/licensing. 10*1ae08745Sheppo * See the License for the specific language governing permissions 11*1ae08745Sheppo * and limitations under the License. 12*1ae08745Sheppo * 13*1ae08745Sheppo * When distributing Covered Code, include this CDDL HEADER in each 14*1ae08745Sheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*1ae08745Sheppo * If applicable, add the following below this CDDL HEADER, with the 16*1ae08745Sheppo * fields enclosed by brackets "[]" replaced with your own identifying 17*1ae08745Sheppo * information: Portions Copyright [yyyy] [name of copyright owner] 18*1ae08745Sheppo * 19*1ae08745Sheppo * CDDL HEADER END 20*1ae08745Sheppo */ 21*1ae08745Sheppo 22*1ae08745Sheppo/* 23*1ae08745Sheppo * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24*1ae08745Sheppo * Use is subject to license terms. 25*1ae08745Sheppo */ 26*1ae08745Sheppo 27*1ae08745Sheppo#pragma ident "%Z%%M% %I% %E% SMI" 28*1ae08745Sheppo 29*1ae08745Sheppo/* 30*1ae08745Sheppo * sun4v processor initialization 31*1ae08745Sheppo * 32*1ae08745Sheppo * This is the kernel entry point for CPUs that enter Solaris 33*1ae08745Sheppo * directly from the hypervisor. i.e. without going through OBP. 34*1ae08745Sheppo */ 35*1ae08745Sheppo 36*1ae08745Sheppo#if !defined(lint) 37*1ae08745Sheppo#include "assym.h" 38*1ae08745Sheppo#endif /* !lint */ 39*1ae08745Sheppo 40*1ae08745Sheppo#include <sys/asm_linkage.h> 41*1ae08745Sheppo#include <sys/hypervisor_api.h> 42*1ae08745Sheppo#include <sys/machasi.h> 43*1ae08745Sheppo#include <sys/machpcb.h> 44*1ae08745Sheppo#include <sys/machlock.h> 45*1ae08745Sheppo#include <sys/mmu.h> 46*1ae08745Sheppo#include <sys/lpad.h> 47*1ae08745Sheppo 48*1ae08745Sheppo#if defined(lint) 49*1ae08745Sheppo 50*1ae08745Sheppo/* ARGSUSED */ 51*1ae08745Sheppovoid 52*1ae08745Sheppomach_cpu_startup(uint64_t rabase, uint64_t memsz) 53*1ae08745Sheppo{} 54*1ae08745Sheppo 55*1ae08745Sheppo#else /* lint */ 56*1ae08745Sheppo 57*1ae08745Sheppo /* 58*1ae08745Sheppo * %o0 - hcall specified arg (cpuid) 59*1ae08745Sheppo * %i0 - real memory base 60*1ae08745Sheppo * %i1 - memory size 61*1ae08745Sheppo */ 62*1ae08745Sheppo ENTRY_NP(mach_cpu_startup) 63*1ae08745Sheppo /* 64*1ae08745Sheppo * Calculate the data pointer. The landing pad 65*1ae08745Sheppo * data immediately follows the landing pad text. 66*1ae08745Sheppo */ 67*1ae08745Sheppo rd %pc, %l0 68*1ae08745Sheppo add %l0, LPAD_TEXT_SIZE, %l1 ! %l1 has start of data 69*1ae08745Sheppo 70*1ae08745Sheppo /* 71*1ae08745Sheppo * Setup the initial state of the CPU. 72*1ae08745Sheppo */ 73*1ae08745Sheppo wrpr %g0, 0, %tl 74*1ae08745Sheppo wrpr %g0, 0, %gl 75*1ae08745Sheppo wrpr %g0, MAXWIN - 2, %cansave 76*1ae08745Sheppo wrpr %g0, MAXWIN - 2, %cleanwin 77*1ae08745Sheppo wrpr %g0, 0, %canrestore 78*1ae08745Sheppo wrpr %g0, 0, %otherwin 79*1ae08745Sheppo wrpr %g0, 0, %cwp 80*1ae08745Sheppo wrpr %g0, 0, %wstate 81*1ae08745Sheppo wr %g0, %y 82*1ae08745Sheppo wrpr %g0, PIL_MAX, %pil 83*1ae08745Sheppo 84*1ae08745Sheppo set trap_table, %g1 85*1ae08745Sheppo wrpr %g1, %tba 86*1ae08745Sheppo 87*1ae08745Sheppo ! initialize cpuid into scratchpad register 88*1ae08745Sheppo mov SCRATCHPAD_CPUID, %g1 89*1ae08745Sheppo stxa %o0, [%g1]ASI_SCRATCHPAD 90*1ae08745Sheppo 91*1ae08745Sheppo ! sanity check the data section 92*1ae08745Sheppo setx LPAD_MAGIC_VAL, %g2, %g1 93*1ae08745Sheppo ldx [%l1 + LPAD_MAGIC], %g2 94*1ae08745Sheppo cmp %g1, %g2 95*1ae08745Sheppo bne startup_error 96*1ae08745Sheppo nop 97*1ae08745Sheppo 98*1ae08745Sheppo /* 99*1ae08745Sheppo * Loop through the array of TTE's, installing the 100*1ae08745Sheppo * VA to RA mapping for each one. 101*1ae08745Sheppo */ 102*1ae08745Sheppo ldx [%l1 + LPAD_NMAP], %l2 ! %l2 = number of mappings 103*1ae08745Sheppo add %l1, LPAD_MAP, %l3 ! %l3 = the current mapping 104*1ae08745Sheppo 105*1ae08745Sheppo /* 106*1ae08745Sheppo * Sanity check the number of mappings. 107*1ae08745Sheppo */ 108*1ae08745Sheppo mulx %l2, LPAD_MAP_SIZE, %g1 109*1ae08745Sheppo add %l3, %g1, %g1 ! %g1 = end of the array 110*1ae08745Sheppo add %l1, LPAD_DATA_SIZE, %g2 ! %g2 = end of data section 111*1ae08745Sheppo sub %g2, %g1, %g2 112*1ae08745Sheppo brlz %g2, startup_error 113*1ae08745Sheppo nop 114*1ae08745Sheppo 115*1ae08745Sheppo0: 116*1ae08745Sheppo cmp %l2, %g0 117*1ae08745Sheppo be 3f 118*1ae08745Sheppo nop 119*1ae08745Sheppo 120*1ae08745Sheppo ldx [%l3 + LPAD_MAP_FLAGS], %l4 ! %l4 = flags 121*1ae08745Sheppo 122*1ae08745Sheppo /* 123*1ae08745Sheppo * Generate args for the HV call 124*1ae08745Sheppo */ 125*1ae08745Sheppo ldx [%l3 + LPAD_MAP_VA], %o0 ! %o0 = virtual address 126*1ae08745Sheppo mov KCONTEXT, %o1 ! %o1 = context 127*1ae08745Sheppo ldx [%l3 + LPAD_MAP_TTE], %o2 ! %o2 = TTE 128*1ae08745Sheppo and %l4, FLAG_MMUFLAGS_MASK, %o3 ! %o3 = MMU flags 129*1ae08745Sheppo 130*1ae08745Sheppo ! check if this is a locked TTE 131*1ae08745Sheppo and %l4, FLAG_LOCK_MASK, %l4 132*1ae08745Sheppo cmp %l4, %g0 133*1ae08745Sheppo bne 1f 134*1ae08745Sheppo nop 135*1ae08745Sheppo 136*1ae08745Sheppo ! install an unlocked entry 137*1ae08745Sheppo ta MMU_MAP_ADDR 138*1ae08745Sheppo ba 2f 139*1ae08745Sheppo nop 140*1ae08745Sheppo1: 141*1ae08745Sheppo ! install a locked entry 142*1ae08745Sheppo mov MAP_PERM_ADDR, %o5 143*1ae08745Sheppo ta FAST_TRAP 144*1ae08745Sheppo 145*1ae08745Sheppo2: 146*1ae08745Sheppo ! check for errors from the hcall 147*1ae08745Sheppo cmp %o0, %g0 148*1ae08745Sheppo bne startup_error 149*1ae08745Sheppo nop 150*1ae08745Sheppo 151*1ae08745Sheppo sub %l2, 1, %l2 ! decrement counter 152*1ae08745Sheppo add %l3, LPAD_MAP_SIZE, %l3 ! increment pointer 153*1ae08745Sheppo 154*1ae08745Sheppo ba 0b 155*1ae08745Sheppo nop 156*1ae08745Sheppo 157*1ae08745Sheppo3: 158*1ae08745Sheppo /* 159*1ae08745Sheppo * Set the MMU fault status area 160*1ae08745Sheppo */ 161*1ae08745Sheppo ldx [%l1 + LPAD_MMFSA_RA], %o0 162*1ae08745Sheppo 163*1ae08745Sheppo mov MMU_SET_INFOPTR, %o5 164*1ae08745Sheppo ta FAST_TRAP 165*1ae08745Sheppo 166*1ae08745Sheppo ! check for errors from the hcall 167*1ae08745Sheppo cmp %o0, %g0 168*1ae08745Sheppo bne startup_error 169*1ae08745Sheppo nop 170*1ae08745Sheppo 171*1ae08745Sheppo /* 172*1ae08745Sheppo * Load remaining arguments before enabling the 173*1ae08745Sheppo * MMU so that the loads can be done using real 174*1ae08745Sheppo * addresses. 175*1ae08745Sheppo */ 176*1ae08745Sheppo ldx [%l1 + LPAD_PC], %l3 ! %l3 = specified entry point 177*1ae08745Sheppo ldx [%l1 + LPAD_ARG], %l4 ! %l4 = specified argument 178*1ae08745Sheppo ldx [%l1 + LPAD_INUSE], %l5 ! %l5 = va of inuse mailbox 179*1ae08745Sheppo 180*1ae08745Sheppo /* 181*1ae08745Sheppo * Enable the MMU. On success, it returns to the 182*1ae08745Sheppo * global version of the landing pad text, rather 183*1ae08745Sheppo * than the text copied into the lpad buffer. 184*1ae08745Sheppo */ 185*1ae08745Sheppo mov 1, %o0 ! %o0 = enable flag (1 = enable) 186*1ae08745Sheppo set startup_complete, %o1 ! VA of return address 187*1ae08745Sheppo mov MMU_ENABLE, %o5 188*1ae08745Sheppo ta FAST_TRAP 189*1ae08745Sheppo 190*1ae08745Sheppo /* 191*1ae08745Sheppo * On errors, just enter a spin loop until the 192*1ae08745Sheppo * CPU that initiated the start recovers the CPU. 193*1ae08745Sheppo */ 194*1ae08745Sheppostartup_error: 195*1ae08745Sheppo ba startup_error 196*1ae08745Sheppo nop 197*1ae08745Sheppo 198*1ae08745Sheppo /* 199*1ae08745Sheppo * Jump to the generic CPU initialization code. 200*1ae08745Sheppo */ 201*1ae08745Sheppostartup_complete: 202*1ae08745Sheppo mov %l4, %o0 203*1ae08745Sheppo jmpl %l3, %g0 204*1ae08745Sheppo stx %g0, [%l5] ! clear the inuse mailbox 205*1ae08745Sheppo 206*1ae08745Sheppo SET_SIZE(mach_cpu_startup) 207*1ae08745Sheppo 208*1ae08745Sheppo .global mach_cpu_startup_end 209*1ae08745Sheppomach_cpu_startup_end: 210*1ae08745Sheppo 211*1ae08745Sheppo#endif /* lint */ 212