From abcbbb14a44a83b4cdf90137307a62e7b58e6720 Mon Sep 17 00:00:00 2001 From: Anthony PERARD Date: Wed, 29 Oct 2014 06:49:10 +0000 Subject: OvmfPkg/XenBusDxe: Add support to make Xen Hypercalls. Change in V4: - Replace the license by the commonly used file header text. - add file header to XenHypercall.h (license, copyright, brief desc) Change in V3: - adding IA32 support. (not reviewed yet) both XenBusDxe/Ia32/hypercall.{S,asm} file are new Change in V2: - file header, copyright - Add License - Add push/pop instruction. - fix types - Comment of exported functions - Improve coding style - Add error handling in the main init function (of the drivers) - Comment assembly Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Anthony PERARD Reviewed-by: Konrad Rzeszutek Wilk Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16260 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/XenBusDxe/X64/hypercall.S | 22 ++++++++++++++++++++++ OvmfPkg/XenBusDxe/X64/hypercall.asm | 26 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 OvmfPkg/XenBusDxe/X64/hypercall.S create mode 100644 OvmfPkg/XenBusDxe/X64/hypercall.asm (limited to 'OvmfPkg/XenBusDxe/X64') diff --git a/OvmfPkg/XenBusDxe/X64/hypercall.S b/OvmfPkg/XenBusDxe/X64/hypercall.S new file mode 100644 index 0000000000..83cf466953 --- /dev/null +++ b/OvmfPkg/XenBusDxe/X64/hypercall.S @@ -0,0 +1,22 @@ +# INTN +# EFIAPI +# XenHypercall2 ( +# IN VOID *HypercallAddr, +# IN OUT INTN Arg1, +# IN OUT INTN Arg2 +# ); +ASM_GLOBAL ASM_PFX(XenHypercall2) +ASM_PFX(XenHypercall2): + push %rdi + push %rsi + # Copy HypercallAddr to rax + movq %rcx, %rax + # Copy Arg1 to the register expected by Xen + movq %rdx, %rdi + # Copy Arg2 to the register expected by Xen + movq %r8, %rsi + # Call HypercallAddr + call *%rax + pop %rsi + pop %rdi + ret diff --git a/OvmfPkg/XenBusDxe/X64/hypercall.asm b/OvmfPkg/XenBusDxe/X64/hypercall.asm new file mode 100644 index 0000000000..5b3451473d --- /dev/null +++ b/OvmfPkg/XenBusDxe/X64/hypercall.asm @@ -0,0 +1,26 @@ +.code + +; INTN +; EFIAPI +; XenHypercall2 ( +; IN VOID *HypercallAddr, +; IN OUT INTN Arg1, +; IN OUT INTN Arg2 +; ); +XenHypercall2 PROC + push rdi + push rsi + ; Copy HypercallAddr to rax + mov rax, rcx + ; Copy Arg1 to the register expected by Xen + mov rdi, rdx + ; Copy Arg2 to the register expected by Xen + mov rsi, r8 + ; Call HypercallAddr + call rax + pop rsi + pop rdi + ret +XenHypercall2 ENDP + +END -- cgit v1.2.3