diff mbox series

[for-4.18,v2,2/2] x86: Clarify that only 5 hypercall parameters are supported

Message ID 20231006185402.1098400-3-andrew.cooper3@citrix.com (mailing list archive)
State New, archived
Headers show
Series docs:Clarify that only 5 hypercall parameters are supported | expand

Commit Message

Andrew Cooper Oct. 6, 2023, 6:54 p.m. UTC
From: Michal Orzel <michal.orzel@amd.com>

The x86 hypercall ABI really used to have 6-argument hypercalls.  V4V, the
downstream predecessor to Argo did take 6th args.

However, the 6th arg being %ebp in the 32bit ABI makes it unusable in
practice, because that's the frame pointer in builds with frame pointers
enabled.  Therefore Argo was altered to being a 5-arg hypercall when it was
upstreamed.

c/s 2f531c122e95 ("x86: limit number of hypercall parameters to 5") removed
the ability for hypercalls to take 6 arguments.

Update the documentation to match reality.

Signed-off-by: Michal Orzel <michal.orzel@amd.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: George Dunlap <George.Dunlap@eu.citrix.com>
CC: Jan Beulich <JBeulich@suse.com>
CC: Stefano Stabellini <sstabellini@kernel.org>
CC: Wei Liu <wl@xen.org>
CC: Julien Grall <julien@xen.org>
CC: Michal Orzel <michal.orzel@amd.com>
CC: Henry Wang <Henry.Wang@arm.com>

v2:
 * Extend with the historical context of how 6-arg hypercalls have come and gone.
---
 docs/guest-guide/x86/hypercall-abi.rst   | 15 +++++++++++----
 xen/include/public/arch-x86/xen-x86_32.h |  2 +-
 xen/include/public/arch-x86/xen-x86_64.h |  2 +-
 3 files changed, 13 insertions(+), 6 deletions(-)

Comments

Henry Wang Oct. 6, 2023, 11:58 p.m. UTC | #1
Hi,

> On Oct 7, 2023, at 02:54, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> 
> From: Michal Orzel <michal.orzel@amd.com>
> 
> The x86 hypercall ABI really used to have 6-argument hypercalls.  V4V, the
> downstream predecessor to Argo did take 6th args.
> 
> However, the 6th arg being %ebp in the 32bit ABI makes it unusable in
> practice, because that's the frame pointer in builds with frame pointers
> enabled.  Therefore Argo was altered to being a 5-arg hypercall when it was
> upstreamed.
> 
> c/s 2f531c122e95 ("x86: limit number of hypercall parameters to 5") removed
> the ability for hypercalls to take 6 arguments.
> 
> Update the documentation to match reality.
> 
> Signed-off-by: Michal Orzel <michal.orzel@amd.com>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Release-acked-by: Henry Wang <Henry.Wang@arm.com>

Kind regards,
Henry

> ---
> CC: George Dunlap <George.Dunlap@eu.citrix.com>
> CC: Jan Beulich <JBeulich@suse.com>
> CC: Stefano Stabellini <sstabellini@kernel.org>
> CC: Wei Liu <wl@xen.org>
> CC: Julien Grall <julien@xen.org>
> CC: Michal Orzel <michal.orzel@amd.com>
> CC: Henry Wang <Henry.Wang@arm.com>
> 
> v2:
> * Extend with the historical context of how 6-arg hypercalls have come and gone.
> ---
> docs/guest-guide/x86/hypercall-abi.rst   | 15 +++++++++++----
> xen/include/public/arch-x86/xen-x86_32.h |  2 +-
> xen/include/public/arch-x86/xen-x86_64.h |  2 +-
> 3 files changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/docs/guest-guide/x86/hypercall-abi.rst b/docs/guest-guide/x86/hypercall-abi.rst
> index 42a820386b68..c7a11a76712f 100644
> --- a/docs/guest-guide/x86/hypercall-abi.rst
> +++ b/docs/guest-guide/x86/hypercall-abi.rst
> @@ -4,7 +4,7 @@ Hypercall ABI
> =============
> 
> Hypercalls are system calls to Xen.  Two modes of guest operation are
> -supported, and up to 6 individual parameters are supported.
> +supported, and up to 5 individual parameters are supported.
> 
> Hypercalls may only be issued by kernel-level software [#kern]_.
> 
> @@ -18,17 +18,17 @@ The registers used for hypercalls depends on the operating mode of the guest.
> 
>    * - ABI
>      - Hypercall Index
> -     - Parameters (1 - 6)
> +     - Parameters (1 - 5) [#params]_
>      - Result
> 
>    * - 64bit
>      - RAX
> -     - RDI RSI RDX R10 R8 R9
> +     - RDI RSI RDX R10 R8
>      - RAX
> 
>    * - 32bit
>      - EAX
> -     - EBX ECX EDX ESI EDI EBP
> +     - EBX ECX EDX ESI EDI
>      - EAX
> 
> 32 and 64bit PV guests have an ABI fixed by their guest type.  The ABI for an
> @@ -119,6 +119,13 @@ means.
> .. [#kern] For HVM guests, ``HVMOP_guest_request_vm_event`` may be configured
>    to be usable from userspace, but this behaviour is not default.
> 
> +.. [#params] Xen's ABI used to declare support for 6 hypercall arguments,
> +   using ``r9`` and ``ebp``.  However, such an ABI clobbers the frame pointer
> +   in the 32bit code and does interact nicely with guest-side debugging.  The
> +   predecessor to ``HYPERCALL_argo_op`` was a 6-argument hypercall, but the
> +   ABI was intentionally altered when Argo was upstreamed (Xen 4.13) to be the
> +   5-argument hypercall it now is.
> +
> .. [#mode] While it is possible to use compatibility mode segments in a 64bit
>    kernel, hypercalls issues from such a mode will be interpreted with the
>    32bit ABI.  Such a setup is not expected in production scenarios.
> diff --git a/xen/include/public/arch-x86/xen-x86_32.h b/xen/include/public/arch-x86/xen-x86_32.h
> index 139438e83534..9e3bf06b121e 100644
> --- a/xen/include/public/arch-x86/xen-x86_32.h
> +++ b/xen/include/public/arch-x86/xen-x86_32.h
> @@ -12,7 +12,7 @@
> 
> /*
>  * Hypercall interface:
> - *  Input:  %ebx, %ecx, %edx, %esi, %edi, %ebp (arguments 1-6)
> + *  Input:  %ebx, %ecx, %edx, %esi, %edi (arguments 1-5)
>  *  Output: %eax
>  * Access is via hypercall page (set up by guest loader or via a Xen MSR):
>  *  call hypercall_page + hypercall-number * 32
> diff --git a/xen/include/public/arch-x86/xen-x86_64.h b/xen/include/public/arch-x86/xen-x86_64.h
> index 5d9035ed2230..43f6e3d22001 100644
> --- a/xen/include/public/arch-x86/xen-x86_64.h
> +++ b/xen/include/public/arch-x86/xen-x86_64.h
> @@ -12,7 +12,7 @@
> 
> /*
>  * Hypercall interface:
> - *  Input:  %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6)
> + *  Input:  %rdi, %rsi, %rdx, %r10, %r8 (arguments 1-5)
>  *  Output: %rax
>  * Access is via hypercall page (set up by guest loader or via a Xen MSR):
>  *  call hypercall_page + hypercall-number * 32
> -- 
> 2.30.2
>
Jason Andryuk Oct. 7, 2023, 3:08 p.m. UTC | #2
On Fri, Oct 6, 2023 at 4:29 PM Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>
> From: Michal Orzel <michal.orzel@amd.com>
>
> The x86 hypercall ABI really used to have 6-argument hypercalls.  V4V, the
> downstream predecessor to Argo did take 6th args.
>
> However, the 6th arg being %ebp in the 32bit ABI makes it unusable in
> practice, because that's the frame pointer in builds with frame pointers
> enabled.  Therefore Argo was altered to being a 5-arg hypercall when it was
> upstreamed.
>
> c/s 2f531c122e95 ("x86: limit number of hypercall parameters to 5") removed
> the ability for hypercalls to take 6 arguments.
>
> Update the documentation to match reality.
>
> Signed-off-by: Michal Orzel <michal.orzel@amd.com>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: George Dunlap <George.Dunlap@eu.citrix.com>
> CC: Jan Beulich <JBeulich@suse.com>
> CC: Stefano Stabellini <sstabellini@kernel.org>
> CC: Wei Liu <wl@xen.org>
> CC: Julien Grall <julien@xen.org>
> CC: Michal Orzel <michal.orzel@amd.com>
> CC: Henry Wang <Henry.Wang@arm.com>
>
> v2:
>  * Extend with the historical context of how 6-arg hypercalls have come and gone.
> ---
>  docs/guest-guide/x86/hypercall-abi.rst   | 15 +++++++++++----
>  xen/include/public/arch-x86/xen-x86_32.h |  2 +-
>  xen/include/public/arch-x86/xen-x86_64.h |  2 +-
>  3 files changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/docs/guest-guide/x86/hypercall-abi.rst b/docs/guest-guide/x86/hypercall-abi.rst
> index 42a820386b68..c7a11a76712f 100644
> --- a/docs/guest-guide/x86/hypercall-abi.rst
> +++ b/docs/guest-guide/x86/hypercall-abi.rst

> @@ -119,6 +119,13 @@ means.
>  .. [#kern] For HVM guests, ``HVMOP_guest_request_vm_event`` may be configured
>     to be usable from userspace, but this behaviour is not default.
>
> +.. [#params] Xen's ABI used to declare support for 6 hypercall arguments,
> +   using ``r9`` and ``ebp``.  However, such an ABI clobbers the frame pointer
> +   in the 32bit code and does interact nicely with guest-side debugging.  The

I think you want s/does/does not/.

With that,

Reviewed-by: Jason Andryuk <jandryuk@gmail.com>

> +   predecessor to ``HYPERCALL_argo_op`` was a 6-argument hypercall, but the

Also, I think it would be worth just naming v4v with "...predecessor
to ``HYPERCALL_argo_op``, v4v, was...", so a future reader doesn't
have to investigate to find out what the predecessor was.

Regards,
Jason

> +   ABI was intentionally altered when Argo was upstreamed (Xen 4.13) to be the
> +   5-argument hypercall it now is.
> +
>  .. [#mode] While it is possible to use compatibility mode segments in a 64bit
>     kernel, hypercalls issues from such a mode will be interpreted with the
>     32bit ABI.  Such a setup is not expected in production scenarios.
diff mbox series

Patch

diff --git a/docs/guest-guide/x86/hypercall-abi.rst b/docs/guest-guide/x86/hypercall-abi.rst
index 42a820386b68..c7a11a76712f 100644
--- a/docs/guest-guide/x86/hypercall-abi.rst
+++ b/docs/guest-guide/x86/hypercall-abi.rst
@@ -4,7 +4,7 @@  Hypercall ABI
 =============
 
 Hypercalls are system calls to Xen.  Two modes of guest operation are
-supported, and up to 6 individual parameters are supported.
+supported, and up to 5 individual parameters are supported.
 
 Hypercalls may only be issued by kernel-level software [#kern]_.
 
@@ -18,17 +18,17 @@  The registers used for hypercalls depends on the operating mode of the guest.
 
    * - ABI
      - Hypercall Index
-     - Parameters (1 - 6)
+     - Parameters (1 - 5) [#params]_
      - Result
 
    * - 64bit
      - RAX
-     - RDI RSI RDX R10 R8 R9
+     - RDI RSI RDX R10 R8
      - RAX
 
    * - 32bit
      - EAX
-     - EBX ECX EDX ESI EDI EBP
+     - EBX ECX EDX ESI EDI
      - EAX
 
 32 and 64bit PV guests have an ABI fixed by their guest type.  The ABI for an
@@ -119,6 +119,13 @@  means.
 .. [#kern] For HVM guests, ``HVMOP_guest_request_vm_event`` may be configured
    to be usable from userspace, but this behaviour is not default.
 
+.. [#params] Xen's ABI used to declare support for 6 hypercall arguments,
+   using ``r9`` and ``ebp``.  However, such an ABI clobbers the frame pointer
+   in the 32bit code and does interact nicely with guest-side debugging.  The
+   predecessor to ``HYPERCALL_argo_op`` was a 6-argument hypercall, but the
+   ABI was intentionally altered when Argo was upstreamed (Xen 4.13) to be the
+   5-argument hypercall it now is.
+
 .. [#mode] While it is possible to use compatibility mode segments in a 64bit
    kernel, hypercalls issues from such a mode will be interpreted with the
    32bit ABI.  Such a setup is not expected in production scenarios.
diff --git a/xen/include/public/arch-x86/xen-x86_32.h b/xen/include/public/arch-x86/xen-x86_32.h
index 139438e83534..9e3bf06b121e 100644
--- a/xen/include/public/arch-x86/xen-x86_32.h
+++ b/xen/include/public/arch-x86/xen-x86_32.h
@@ -12,7 +12,7 @@ 
 
 /*
  * Hypercall interface:
- *  Input:  %ebx, %ecx, %edx, %esi, %edi, %ebp (arguments 1-6)
+ *  Input:  %ebx, %ecx, %edx, %esi, %edi (arguments 1-5)
  *  Output: %eax
  * Access is via hypercall page (set up by guest loader or via a Xen MSR):
  *  call hypercall_page + hypercall-number * 32
diff --git a/xen/include/public/arch-x86/xen-x86_64.h b/xen/include/public/arch-x86/xen-x86_64.h
index 5d9035ed2230..43f6e3d22001 100644
--- a/xen/include/public/arch-x86/xen-x86_64.h
+++ b/xen/include/public/arch-x86/xen-x86_64.h
@@ -12,7 +12,7 @@ 
 
 /*
  * Hypercall interface:
- *  Input:  %rdi, %rsi, %rdx, %r10, %r8, %r9 (arguments 1-6)
+ *  Input:  %rdi, %rsi, %rdx, %r10, %r8 (arguments 1-5)
  *  Output: %rax
  * Access is via hypercall page (set up by guest loader or via a Xen MSR):
  *  call hypercall_page + hypercall-number * 32