callwrap.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Convert SysV calling convention to EFI x86_64 calling convention
  3. *
  4. * Copyright (C) 2007-2010 Intel Corp
  5. * Bibo Mao <bibo.mao@intel.com>
  6. * Chandramouli Narayanan<mouli@linux.intel.com>
  7. * Huang Ying <ying.huang@intel.com>
  8. *
  9. * All rights reserved.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * - Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. * - Redistributions in binary form must reproduce the above
  18. * copyright notice, this list of conditions and the following
  19. * disclaimer in the documentation and/or other materials
  20. * provided with the distribution.
  21. * - Neither the name of Hewlett-Packard Co. nor the names of its
  22. * contributors may be used to endorse or promote products derived
  23. * from this software without specific prior written permission.
  24. *
  25. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  26. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  27. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  28. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  29. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
  30. * BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
  31. * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  32. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  33. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  34. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
  35. * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  36. * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  37. * SUCH DAMAGE.
  38. */
  39. #include "efi.h"
  40. #include "efistdarg.h"
  41. #if !defined(HAVE_USE_MS_ABI)
  42. UINT64 efi_call0(void *func);
  43. UINT64 efi_call1(void *func, UINT64 arg1);
  44. UINT64 efi_call2(void *func, UINT64 arg1, UINT64 arg2);
  45. UINT64 efi_call3(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3);
  46. UINT64 efi_call4(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  47. UINT64 arg4);
  48. UINT64 efi_call5(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  49. UINT64 arg4, UINT64 arg5);
  50. UINT64 efi_call6(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  51. UINT64 arg4, UINT64 arg5, UINT64 arg6);
  52. UINT64 efi_call7(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  53. UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7);
  54. UINT64 efi_call8(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  55. UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
  56. UINT64 arg8);
  57. UINT64 efi_call9(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  58. UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
  59. UINT64 arg8, UINT64 arg9);
  60. UINT64 efi_call10(void *func, UINT64 arg1, UINT64 arg2, UINT64 arg3,
  61. UINT64 arg4, UINT64 arg5, UINT64 arg6, UINT64 arg7,
  62. UINT64 arg8, UINT64 arg9, UINT64 arg10);
  63. #define EFI_ARG_NUM_MAX 10
  64. EFI_STATUS uefi_call_wrapper(void *fp, unsigned long va_num, ...)
  65. {
  66. va_list ap;
  67. int i;
  68. unsigned long args[EFI_ARG_NUM_MAX];
  69. if (va_num > EFI_ARG_NUM_MAX || va_num < 0) {
  70. return EFI_LOAD_ERROR;
  71. }
  72. va_start(ap, va_num);
  73. for (i = 0; i < va_num; i++) {
  74. args[i] = va_arg(ap, UINT64);
  75. }
  76. va_end(ap);
  77. /* As the number of args grows extend it appropriately */
  78. switch (va_num) {
  79. case 0:
  80. return efi_call0(fp);
  81. case 1:
  82. return efi_call1(fp, args[0]);
  83. case 2:
  84. return efi_call2(fp,
  85. args[0], args[1]);
  86. case 3:
  87. return efi_call3(fp,
  88. args[0], args[1], args[2]);
  89. case 4:
  90. return efi_call4(fp,
  91. args[0], args[1], args[2], args[3]);
  92. case 5:
  93. return efi_call5(fp,
  94. args[0], args[1], args[2], args[3],
  95. args[4]);
  96. case 6:
  97. return efi_call6(fp,
  98. args[0], args[1], args[2], args[3],
  99. args[4], args[5]);
  100. case 7:
  101. return efi_call7(fp,
  102. args[0], args[1], args[2], args[3],
  103. args[4], args[5], args[6]);
  104. case 8:
  105. return efi_call8(fp,
  106. args[0], args[1], args[2], args[3],
  107. args[4], args[5], args[6], args[7]);
  108. case 9:
  109. return efi_call9(fp,
  110. args[0], args[1], args[2], args[3],
  111. args[4], args[5], args[6], args[7],
  112. args[8]);
  113. case 10:
  114. return efi_call10(fp,
  115. args[0], args[1], args[2], args[3],
  116. args[4], args[5], args[6], args[7],
  117. args[8], args[9]);
  118. default:
  119. return EFI_LOAD_ERROR;
  120. }
  121. }
  122. #endif