hypercall.S 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Support routines for Xen hypercalls
  3. *
  4. * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
  5. * Copyright (C) 2008 Yaozu (Eddie) Dong <eddie.dong@intel.com>
  6. */
  7. #include <asm/asmmacro.h>
  8. #include <asm/intrinsics.h>
  9. #include <asm/xen/privop.h>
  10. #ifdef __INTEL_COMPILER
  11. /*
  12. * Hypercalls without parameter.
  13. */
  14. #define __HCALL0(name,hcall) \
  15. GLOBAL_ENTRY(name); \
  16. break hcall; \
  17. br.ret.sptk.many rp; \
  18. END(name)
  19. /*
  20. * Hypercalls with 1 parameter.
  21. */
  22. #define __HCALL1(name,hcall) \
  23. GLOBAL_ENTRY(name); \
  24. mov r8=r32; \
  25. break hcall; \
  26. br.ret.sptk.many rp; \
  27. END(name)
  28. /*
  29. * Hypercalls with 2 parameters.
  30. */
  31. #define __HCALL2(name,hcall) \
  32. GLOBAL_ENTRY(name); \
  33. mov r8=r32; \
  34. mov r9=r33; \
  35. break hcall; \
  36. br.ret.sptk.many rp; \
  37. END(name)
  38. __HCALL0(xen_get_psr, HYPERPRIVOP_GET_PSR)
  39. __HCALL0(xen_get_ivr, HYPERPRIVOP_GET_IVR)
  40. __HCALL0(xen_get_tpr, HYPERPRIVOP_GET_TPR)
  41. __HCALL0(xen_hyper_ssm_i, HYPERPRIVOP_SSM_I)
  42. __HCALL1(xen_set_tpr, HYPERPRIVOP_SET_TPR)
  43. __HCALL1(xen_eoi, HYPERPRIVOP_EOI)
  44. __HCALL1(xen_thash, HYPERPRIVOP_THASH)
  45. __HCALL1(xen_set_itm, HYPERPRIVOP_SET_ITM)
  46. __HCALL1(xen_get_rr, HYPERPRIVOP_GET_RR)
  47. __HCALL1(xen_fc, HYPERPRIVOP_FC)
  48. __HCALL1(xen_get_cpuid, HYPERPRIVOP_GET_CPUID)
  49. __HCALL1(xen_get_pmd, HYPERPRIVOP_GET_PMD)
  50. __HCALL2(xen_ptcga, HYPERPRIVOP_PTC_GA)
  51. __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR)
  52. __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR)
  53. #ifdef CONFIG_IA32_SUPPORT
  54. __HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG)
  55. __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8
  56. #endif /* CONFIG_IA32_SUPPORT */
  57. GLOBAL_ENTRY(xen_set_rr0_to_rr4)
  58. mov r8=r32
  59. mov r9=r33
  60. mov r10=r34
  61. mov r11=r35
  62. mov r14=r36
  63. XEN_HYPER_SET_RR0_TO_RR4
  64. br.ret.sptk.many rp
  65. ;;
  66. END(xen_set_rr0_to_rr4)
  67. #endif
  68. GLOBAL_ENTRY(xen_send_ipi)
  69. mov r14=r32
  70. mov r15=r33
  71. mov r2=0x400
  72. break 0x1000
  73. ;;
  74. br.ret.sptk.many rp
  75. ;;
  76. END(xen_send_ipi)
  77. GLOBAL_ENTRY(__hypercall)
  78. mov r2=r37
  79. break 0x1000
  80. br.ret.sptk.many b0
  81. ;;
  82. END(__hypercall)