1*843e1988Sjohnlev/* 2*843e1988Sjohnlev * CDDL HEADER START 3*843e1988Sjohnlev * 4*843e1988Sjohnlev * The contents of this file are subject to the terms of the 5*843e1988Sjohnlev * Common Development and Distribution License (the "License"). 6*843e1988Sjohnlev * You may not use this file except in compliance with the License. 7*843e1988Sjohnlev * 8*843e1988Sjohnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*843e1988Sjohnlev * or http://www.opensolaris.org/os/licensing. 10*843e1988Sjohnlev * See the License for the specific language governing permissions 11*843e1988Sjohnlev * and limitations under the License. 12*843e1988Sjohnlev * 13*843e1988Sjohnlev * When distributing Covered Code, include this CDDL HEADER in each 14*843e1988Sjohnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*843e1988Sjohnlev * If applicable, add the following below this CDDL HEADER, with the 16*843e1988Sjohnlev * fields enclosed by brackets "[]" replaced with your own identifying 17*843e1988Sjohnlev * information: Portions Copyright [yyyy] [name of copyright owner] 18*843e1988Sjohnlev * 19*843e1988Sjohnlev * CDDL HEADER END 20*843e1988Sjohnlev */ 21*843e1988Sjohnlev 22*843e1988Sjohnlev/* 23*843e1988Sjohnlev * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24*843e1988Sjohnlev * Use is subject to license terms. 25*843e1988Sjohnlev */ 26*843e1988Sjohnlev 27*843e1988Sjohnlev#pragma ident "%Z%%M% %I% %E% SMI" 28*843e1988Sjohnlev 29*843e1988Sjohnlev/ 30*843e1988Sjohnlev/ Inline functions for the x64 kernel running on the hypervisor 31*843e1988Sjohnlev/ 32*843e1988Sjohnlev 33*843e1988Sjohnlev .inline __hypercall0, 0 34*843e1988Sjohnlev movq %rdi, %rax 35*843e1988Sjohnlev syscall 36*843e1988Sjohnlev .end 37*843e1988Sjohnlev 38*843e1988Sjohnlev .inline __hypercall1, 0 39*843e1988Sjohnlev movq %rdi, %rax 40*843e1988Sjohnlev movq %rsi, %rdi / arg 1 41*843e1988Sjohnlev syscall 42*843e1988Sjohnlev .end 43*843e1988Sjohnlev 44*843e1988Sjohnlev .inline __hypercall2, 0 45*843e1988Sjohnlev movq %rdi, %rax 46*843e1988Sjohnlev movq %rsi, %rdi / arg 1 47*843e1988Sjohnlev movq %rdx, %rsi / arg 2 48*843e1988Sjohnlev syscall 49*843e1988Sjohnlev .end 50*843e1988Sjohnlev 51*843e1988Sjohnlev .inline __hypercall3, 0 52*843e1988Sjohnlev movq %rdi, %rax 53*843e1988Sjohnlev movq %rsi, %rdi / arg 1 54*843e1988Sjohnlev movq %rdx, %rsi / arg 2 55*843e1988Sjohnlev movq %rcx, %rdx / arg 3 56*843e1988Sjohnlev syscall 57*843e1988Sjohnlev .end 58*843e1988Sjohnlev 59*843e1988Sjohnlev/* XXPV studio bug r10 is changed to eax by compiler */ 60*843e1988Sjohnlev .inline __hypercall4_broken, 0 61*843e1988Sjohnlev movq %rdi, %rax 62*843e1988Sjohnlev movq %rsi, %rdi / arg 1 63*843e1988Sjohnlev movq %rdx, %rsi / arg 2 64*843e1988Sjohnlev movq %rcx, %rdx / arg 3 65*843e1988Sjohnlev movq %r8, %r10 / r10 = 4th arg 66*843e1988Sjohnlev syscall 67*843e1988Sjohnlev .end 68*843e1988Sjohnlev 69*843e1988Sjohnlev .inline __hypercall5_broken, 0 70*843e1988Sjohnlev movq %rdi, %rax 71*843e1988Sjohnlev movq %rsi, %rdi / arg 1 72*843e1988Sjohnlev movq %rdx, %rsi / arg 2 73*843e1988Sjohnlev movq %rcx, %rdx / arg 3 74*843e1988Sjohnlev movq %r8, %r10 / r10 = 4th arg 75*843e1988Sjohnlev movq %r9, %r8 / arg 5 76*843e1988Sjohnlev syscall 77*843e1988Sjohnlev .end 78*843e1988Sjohnlev 79*843e1988Sjohnlev/* 80*843e1988Sjohnlev * Read the -real- TSC. 81*843e1988Sjohnlev * This is difficult to virtualize on the hypervisor given there is 82*843e1988Sjohnlev * no way to prevent preemption; thus this inline function 83*843e1988Sjohnlev * should only be used in the middle of the paravirtualized 84*843e1988Sjohnlev * implementation of tsc_read. 85*843e1988Sjohnlev */ 86*843e1988Sjohnlev .inline __rdtsc_insn, 0 87*843e1988Sjohnlev rdtsc 88*843e1988Sjohnlev shlq $32, %rdx 89*843e1988Sjohnlev orq %rdx, %rax 90*843e1988Sjohnlev .end 91