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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. #define XEN_HC "r12"
  11. #define XEN_REG1 "r0"
  12. #define XEN_REG2 "r1"
  13. #define XEN_REG3 "r2"
  14. #define XEN_REG4 "r3"
  15. #define XEN_REG5 "r4"
  16. /**
  17. * Issue hypercall with one argument
  18. *
  19. * @v xen Xen hypervisor
  20. * @v hypercall Hypercall number
  21. * @v arg1 First argument
  22. * @ret retval Return value
  23. */
  24. static inline __attribute__ (( always_inline )) unsigned long
  25. xen_hypercall_1 ( struct xen_hypervisor *xen __unused, unsigned int hypercall,
  26. unsigned long arg1 ) {
  27. register unsigned long hc asm ( XEN_HC ) = hypercall;
  28. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  29. __asm__ __volatile__ ( "hvc %1"
  30. : "+r" ( reg1 )
  31. : "i" ( XEN_HYPERCALL_TAG ), "r" ( hc )
  32. : "memory", "cc" );
  33. return reg1;
  34. }
  35. /**
  36. * Issue hypercall with two arguments
  37. *
  38. * @v xen Xen hypervisor
  39. * @v hypercall Hypercall number
  40. * @v arg1 First argument
  41. * @v arg2 Second argument
  42. * @ret retval Return value
  43. */
  44. static inline __attribute__ (( always_inline )) unsigned long
  45. xen_hypercall_2 ( struct xen_hypervisor *xen __unused, unsigned int hypercall,
  46. unsigned long arg1, unsigned long arg2 ) {
  47. register unsigned long hc asm ( XEN_HC ) = hypercall;
  48. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  49. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  50. __asm__ __volatile__ ( "hvc %2"
  51. : "+r" ( reg1 ), "+r" ( reg2 )
  52. : "i" ( XEN_HYPERCALL_TAG ), "r" ( hc )
  53. : "memory", "cc" );
  54. return reg1;
  55. }
  56. /**
  57. * Issue hypercall with three arguments
  58. *
  59. * @v xen Xen hypervisor
  60. * @v hypercall Hypercall number
  61. * @v arg1 First argument
  62. * @v arg2 Second argument
  63. * @v arg3 Third argument
  64. * @ret retval Return value
  65. */
  66. static inline __attribute__ (( always_inline )) unsigned long
  67. xen_hypercall_3 ( struct xen_hypervisor *xen __unused, unsigned int hypercall,
  68. unsigned long arg1, unsigned long arg2, unsigned long arg3 ) {
  69. register unsigned long hc asm ( XEN_HC ) = hypercall;
  70. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  71. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  72. register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
  73. __asm__ __volatile__ ( "hvc %3"
  74. : "+r" ( reg1 ), "+r" ( reg2 ), "+r" ( reg3 )
  75. : "i" ( XEN_HYPERCALL_TAG ), "r" ( hc )
  76. : "memory", "cc" );
  77. return reg1;
  78. }
  79. /**
  80. * Issue hypercall with four arguments
  81. *
  82. * @v xen Xen hypervisor
  83. * @v hypercall Hypercall number
  84. * @v arg1 First argument
  85. * @v arg2 Second argument
  86. * @v arg3 Third argument
  87. * @v arg4 Fourth argument
  88. * @ret retval Return value
  89. */
  90. static inline __attribute__ (( always_inline )) unsigned long
  91. xen_hypercall_4 ( struct xen_hypervisor *xen __unused, unsigned int hypercall,
  92. unsigned long arg1, unsigned long arg2, unsigned long arg3,
  93. unsigned long arg4 ) {
  94. register unsigned long hc asm ( XEN_HC ) = hypercall;
  95. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  96. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  97. register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
  98. register unsigned long reg4 asm ( XEN_REG4 ) = arg4;
  99. __asm__ __volatile__ ( "hvc %4"
  100. : "+r" ( reg1 ), "+r" ( reg2 ), "+r" ( reg3 ),
  101. "+r" ( reg4 )
  102. : "i" ( XEN_HYPERCALL_TAG ), "r" ( hc )
  103. : "memory", "cc" );
  104. return reg1;
  105. }
  106. /**
  107. * Issue hypercall with five arguments
  108. *
  109. * @v xen Xen hypervisor
  110. * @v hypercall Hypercall number
  111. * @v arg1 First argument
  112. * @v arg2 Second argument
  113. * @v arg3 Third argument
  114. * @v arg4 Fourth argument
  115. * @v arg5 Fifth argument
  116. * @ret retval Return value
  117. */
  118. static inline __attribute__ (( always_inline )) unsigned long
  119. xen_hypercall_5 ( struct xen_hypervisor *xen __unused, unsigned int hypercall,
  120. unsigned long arg1, unsigned long arg2, unsigned long arg3,
  121. unsigned long arg4, unsigned long arg5 ) {
  122. register unsigned long hc asm ( XEN_HC ) = hypercall;
  123. register unsigned long reg1 asm ( XEN_REG1 ) = arg1;
  124. register unsigned long reg2 asm ( XEN_REG2 ) = arg2;
  125. register unsigned long reg3 asm ( XEN_REG3 ) = arg3;
  126. register unsigned long reg4 asm ( XEN_REG4 ) = arg4;
  127. register unsigned long reg5 asm ( XEN_REG5 ) = arg5;
  128. __asm__ __volatile__ ( "hvc %5"
  129. : "+r" ( reg1 ), "+r" ( reg2 ), "+r" ( reg3 ),
  130. "+r" ( reg4 ), "+r" ( reg5 )
  131. : "i" ( XEN_HYPERCALL_TAG ), "r" ( hc )
  132. : "memory", "cc" );
  133. return reg1;
  134. }
  135. #endif /* _BITS_XEN_H */