home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / s390 / include / asm / kvm_para.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.5 KB  |  151 lines

  1. /*
  2.  * asm-s390/kvm_para.h - definition for paravirtual devices on s390
  3.  *
  4.  * Copyright IBM Corp. 2008
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License (version 2 only)
  8.  * as published by the Free Software Foundation.
  9.  *
  10.  *    Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
  11.  */
  12.  
  13. #ifndef __S390_KVM_PARA_H
  14. #define __S390_KVM_PARA_H
  15.  
  16. /*
  17.  * Hypercalls for KVM on s390. The calling convention is similar to the
  18.  * s390 ABI, so we use R2-R6 for parameters 1-5. In addition we use R1
  19.  * as hypercall number and R7 as parameter 6. The return value is
  20.  * written to R2. We use the diagnose instruction as hypercall. To avoid
  21.  * conflicts with existing diagnoses for LPAR and z/VM, we do not use
  22.  * the instruction encoded number, but specify the number in R1 and
  23.  * use 0x500 as KVM hypercall
  24.  *
  25.  * Copyright IBM Corp. 2007,2008
  26.  * Author(s): Christian Borntraeger <borntraeger@de.ibm.com>
  27.  *
  28.  * This work is licensed under the terms of the GNU GPL, version 2.
  29.  */
  30.  
  31. static inline long kvm_hypercall0(unsigned long nr)
  32. {
  33.     register unsigned long __nr asm("1") = nr;
  34.     register long __rc asm("2");
  35.  
  36.     asm volatile ("diag 2,4,0x500\n"
  37.               : "=d" (__rc) : "d" (__nr): "memory", "cc");
  38.     return __rc;
  39. }
  40.  
  41. static inline long kvm_hypercall1(unsigned long nr, unsigned long p1)
  42. {
  43.     register unsigned long __nr asm("1") = nr;
  44.     register unsigned long __p1 asm("2") = p1;
  45.     register long __rc asm("2");
  46.  
  47.     asm volatile ("diag 2,4,0x500\n"
  48.               : "=d" (__rc) : "d" (__nr), "0" (__p1) : "memory", "cc");
  49.     return __rc;
  50. }
  51.  
  52. static inline long kvm_hypercall2(unsigned long nr, unsigned long p1,
  53.                    unsigned long p2)
  54. {
  55.     register unsigned long __nr asm("1") = nr;
  56.     register unsigned long __p1 asm("2") = p1;
  57.     register unsigned long __p2 asm("3") = p2;
  58.     register long __rc asm("2");
  59.  
  60.     asm volatile ("diag 2,4,0x500\n"
  61.               : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2)
  62.               : "memory", "cc");
  63.     return __rc;
  64. }
  65.  
  66. static inline long kvm_hypercall3(unsigned long nr, unsigned long p1,
  67.                    unsigned long p2, unsigned long p3)
  68. {
  69.     register unsigned long __nr asm("1") = nr;
  70.     register unsigned long __p1 asm("2") = p1;
  71.     register unsigned long __p2 asm("3") = p2;
  72.     register unsigned long __p3 asm("4") = p3;
  73.     register long __rc asm("2");
  74.  
  75.     asm volatile ("diag 2,4,0x500\n"
  76.               : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  77.             "d" (__p3) : "memory", "cc");
  78.     return __rc;
  79. }
  80.  
  81.  
  82. static inline long kvm_hypercall4(unsigned long nr, unsigned long p1,
  83.                    unsigned long p2, unsigned long p3,
  84.                    unsigned long p4)
  85. {
  86.     register unsigned long __nr asm("1") = nr;
  87.     register unsigned long __p1 asm("2") = p1;
  88.     register unsigned long __p2 asm("3") = p2;
  89.     register unsigned long __p3 asm("4") = p3;
  90.     register unsigned long __p4 asm("5") = p4;
  91.     register long __rc asm("2");
  92.  
  93.     asm volatile ("diag 2,4,0x500\n"
  94.               : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  95.             "d" (__p3), "d" (__p4) : "memory", "cc");
  96.     return __rc;
  97. }
  98.  
  99. static inline long kvm_hypercall5(unsigned long nr, unsigned long p1,
  100.                    unsigned long p2, unsigned long p3,
  101.                    unsigned long p4, unsigned long p5)
  102. {
  103.     register unsigned long __nr asm("1") = nr;
  104.     register unsigned long __p1 asm("2") = p1;
  105.     register unsigned long __p2 asm("3") = p2;
  106.     register unsigned long __p3 asm("4") = p3;
  107.     register unsigned long __p4 asm("5") = p4;
  108.     register unsigned long __p5 asm("6") = p5;
  109.     register long __rc asm("2");
  110.  
  111.     asm volatile ("diag 2,4,0x500\n"
  112.               : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  113.             "d" (__p3), "d" (__p4), "d" (__p5)  : "memory", "cc");
  114.     return __rc;
  115. }
  116.  
  117. static inline long kvm_hypercall6(unsigned long nr, unsigned long p1,
  118.                    unsigned long p2, unsigned long p3,
  119.                    unsigned long p4, unsigned long p5,
  120.                    unsigned long p6)
  121. {
  122.     register unsigned long __nr asm("1") = nr;
  123.     register unsigned long __p1 asm("2") = p1;
  124.     register unsigned long __p2 asm("3") = p2;
  125.     register unsigned long __p3 asm("4") = p3;
  126.     register unsigned long __p4 asm("5") = p4;
  127.     register unsigned long __p5 asm("6") = p5;
  128.     register unsigned long __p6 asm("7") = p6;
  129.     register long __rc asm("2");
  130.  
  131.     asm volatile ("diag 2,4,0x500\n"
  132.               : "=d" (__rc) : "d" (__nr), "0" (__p1), "d" (__p2),
  133.             "d" (__p3), "d" (__p4), "d" (__p5), "d" (__p6)
  134.               : "memory", "cc");
  135.     return __rc;
  136. }
  137.  
  138. /* kvm on s390 is always paravirtualization enabled */
  139. static inline int kvm_para_available(void)
  140. {
  141.     return 1;
  142. }
  143.  
  144. /* No feature bits are currently assigned for kvm on s390 */
  145. static inline unsigned int kvm_arch_para_features(void)
  146. {
  147.     return 0;
  148. }
  149.  
  150. #endif /* __S390_KVM_PARA_H */
  151.