xref: /titanic_41/usr/src/uts/i86xpv/ml/amd64.il (revision 843e19887f64dde75055cf8842fc4db2171eff45)
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