You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

xen.h 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #ifndef _BITS_XEN_H
  2. #define _BITS_XEN_H
  3. /** @file
  4. *
  5. * Xen interface
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. /* Hypercall registers */
  10. #ifdef __x86_64__
  11. #define XEN_REG1 "rdi"
  12. #define XEN_REG2 "rsi"
  13. #define XEN_REG3 "rdx"
  14. #define XEN_REG4 "r10"
  15. #define XEN_REG5 "r8"
  16. #else
  17. #define XEN_REG1 "ebx"
  18. #define XEN_REG2 "ecx"
  19. #define XEN_REG3 "edx"
  20. #define XEN_REG4 "esi"
  21. #define XEN_REG5 "edi"
  22. #endif
  23. /** A hypercall entry point */
  24. struct xen_hypercall {
  25. /** Code generated by hypervisor */
  26. uint8_t code[32];
  27. } __attribute__ (( packed ));
  28. /**
  29. * Issue hypercall with one argument
  30. *
  31. * @v xen Xen hypervisor
  32. * @v hypercall Hypercall number
  33. * @v arg1 First argument
  34. * @ret retval Return value
  35. */
  36. static inline __attribute__ (( always_inline )) unsigned long
  37. xen_hypercall_1 ( struct xen_hypervisor *xen, unsigned int hypercall,
  38. unsigned long arg1 ) {
  39. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  40. unsigned long retval;
  41. __asm__ __volatile__ ( "call *%2"
  42. : "=a" ( retval ), "+r" ( reg1 )
  43. : "r" ( &xen->hypercall[hypercall] )
  44. : XEN_REG2, XEN_REG3, XEN_REG4, XEN_REG5,
  45. "memory" );
  46. return retval;
  47. }
  48. /**
  49. * Issue hypercall with two arguments
  50. *
  51. * @v xen Xen hypervisor
  52. * @v hypercall Hypercall number
  53. * @v arg1 First argument
  54. * @v arg2 Second argument
  55. * @ret retval Return value
  56. */
  57. static inline __attribute__ (( always_inline )) unsigned long
  58. xen_hypercall_2 ( struct xen_hypervisor *xen, unsigned int hypercall,
  59. unsigned long arg1, unsigned long arg2 ) {
  60. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  61. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  62. unsigned long retval;
  63. __asm__ __volatile__ ( "call *%3"
  64. : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 )
  65. : "r" ( &xen->hypercall[hypercall] )
  66. : XEN_REG3, XEN_REG4, XEN_REG5, "memory" );
  67. return retval;
  68. }
  69. /**
  70. * Issue hypercall with three arguments
  71. *
  72. * @v xen Xen hypervisor
  73. * @v hypercall Hypercall number
  74. * @v arg1 First argument
  75. * @v arg2 Second argument
  76. * @v arg3 Third argument
  77. * @ret retval Return value
  78. */
  79. static inline __attribute__ (( always_inline )) unsigned long
  80. xen_hypercall_3 ( struct xen_hypervisor *xen, unsigned int hypercall,
  81. unsigned long arg1, unsigned long arg2, unsigned long arg3 ) {
  82. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  83. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  84. register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
  85. unsigned long retval;
  86. __asm__ __volatile__ ( "call *%4"
  87. : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
  88. "+r" ( reg3 )
  89. : "r" ( &xen->hypercall[hypercall] )
  90. : XEN_REG4, XEN_REG5, "memory" );
  91. return retval;
  92. }
  93. /**
  94. * Issue hypercall with four arguments
  95. *
  96. * @v xen Xen hypervisor
  97. * @v hypercall Hypercall number
  98. * @v arg1 First argument
  99. * @v arg2 Second argument
  100. * @v arg3 Third argument
  101. * @v arg4 Fourth argument
  102. * @ret retval Return value
  103. */
  104. static inline __attribute__ (( always_inline )) unsigned long
  105. xen_hypercall_4 ( struct xen_hypervisor *xen, unsigned int hypercall,
  106. unsigned long arg1, unsigned long arg2, unsigned long arg3,
  107. unsigned long arg4 ) {
  108. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  109. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  110. register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
  111. register unsigned long reg4 asm ( XEN_REG4 ) = arg4;
  112. unsigned long retval;
  113. __asm__ __volatile__ ( "call *%5"
  114. : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
  115. "+r" ( reg3 ), "+r" ( reg4 )
  116. : "r" ( &xen->hypercall[hypercall] )
  117. : XEN_REG5, "memory" );
  118. return retval;
  119. }
  120. /**
  121. * Issue hypercall with five arguments
  122. *
  123. * @v xen Xen hypervisor
  124. * @v hypercall Hypercall number
  125. * @v arg1 First argument
  126. * @v arg2 Second argument
  127. * @v arg3 Third argument
  128. * @v arg4 Fourth argument
  129. * @v arg5 Fifth argument
  130. * @ret retval Return value
  131. */
  132. static inline __attribute__ (( always_inline )) unsigned long
  133. xen_hypercall_5 ( struct xen_hypervisor *xen, unsigned int hypercall,
  134. unsigned long arg1, unsigned long arg2, unsigned long arg3,
  135. unsigned long arg4, unsigned long arg5 ) {
  136. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  137. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  138. register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
  139. register unsigned long reg4 asm ( XEN_REG4 ) = arg4;
  140. register unsigned long reg5 asm ( XEN_REG5 ) = arg5;
  141. unsigned long retval;
  142. __asm__ __volatile__ ( "call *%6"
  143. : "=a" ( retval ), "+r" ( reg1 ), "+r" ( reg2 ),
  144. "+r" ( reg3 ), "+r" ( reg4 ), "+r" ( reg5 )
  145. : "r" ( &xen->hypercall[hypercall] )
  146. : "memory" );
  147. return retval;
  148. }
  149. #endif /* _BITS_XEN_H */