efi_stub_64.S 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Function calling ABI conversion from Linux to EFI for x86_64
  4. *
  5. * Copyright (C) 2007 Intel Corp
  6. * Bibo Mao <bibo.mao@intel.com>
  7. * Huang Ying <ying.huang@intel.com>
  8. */
  9. #include <linux/linkage.h>
  10. #include <asm/segment.h>
  11. #include <asm/msr.h>
  12. #include <asm/processor-flags.h>
  13. #include <asm/page_types.h>
  14. #define SAVE_XMM \
  15. mov %rsp, %rax; \
  16. subq $0x70, %rsp; \
  17. and $~0xf, %rsp; \
  18. mov %rax, (%rsp); \
  19. mov %cr0, %rax; \
  20. clts; \
  21. mov %rax, 0x8(%rsp); \
  22. movaps %xmm0, 0x60(%rsp); \
  23. movaps %xmm1, 0x50(%rsp); \
  24. movaps %xmm2, 0x40(%rsp); \
  25. movaps %xmm3, 0x30(%rsp); \
  26. movaps %xmm4, 0x20(%rsp); \
  27. movaps %xmm5, 0x10(%rsp)
  28. #define RESTORE_XMM \
  29. movaps 0x60(%rsp), %xmm0; \
  30. movaps 0x50(%rsp), %xmm1; \
  31. movaps 0x40(%rsp), %xmm2; \
  32. movaps 0x30(%rsp), %xmm3; \
  33. movaps 0x20(%rsp), %xmm4; \
  34. movaps 0x10(%rsp), %xmm5; \
  35. mov 0x8(%rsp), %rsi; \
  36. mov %rsi, %cr0; \
  37. mov (%rsp), %rsp
  38. ENTRY(efi_call)
  39. pushq %rbp
  40. movq %rsp, %rbp
  41. SAVE_XMM
  42. mov 16(%rbp), %rax
  43. subq $48, %rsp
  44. mov %r9, 32(%rsp)
  45. mov %rax, 40(%rsp)
  46. mov %r8, %r9
  47. mov %rcx, %r8
  48. mov %rsi, %rcx
  49. call *%rdi
  50. addq $48, %rsp
  51. RESTORE_XMM
  52. popq %rbp
  53. ret
  54. ENDPROC(efi_call)