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