All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 0/9] xen: drop hypercall function tables
@ 2022-03-24 14:01 Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
                   ` (11 more replies)
  0 siblings, 12 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Stefano Stabellini, Julien Grall,
	Bertrand Marquis, Volodymyr Babchuk, Andrew Cooper,
	George Dunlap, Jan Beulich, Wei Liu, Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith

In order to avoid indirect function calls on the hypercall path as
much as possible this series is removing the hypercall function tables
and is replacing the hypercall handler calls via the function array
by automatically generated call macros.

Another by-product of generating the call macros is the automatic
generating of the hypercall handler prototypes from the same data base
which is used to generate the macros.

This has the additional advantage of using type safe calls of the
handlers and to ensure related handler (e.g. PV and HVM ones) share
the same prototypes.

A very brief performance test (parallel build of the Xen hypervisor
in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
the performance with the patches applied. The test was performed using
a PV and a PVH guest.

Changes in V2:
- new patches 6, 14, 15
- patch 7: support hypercall priorities for faster code
- comments addressed

Changes in V3:
- patches 1 and 4 removed as already applied
- comments addressed

Changes in V4:
- 5 patches removed al already applied
- new patches 1, 3 and 11
- avoid switching Arm hypercall handlers to return long (no change of
  handlers returning long already)

Changes in V5:
- patch 3 of V4 has been applied already
- comments addressed
- rebase

Changes in V6:
- patch 1 of V5 has been applied already
- fix of a rebase artifact

Juergen Gross (9):
  xen: move do_vcpu_op() to arch specific code
  xen: harmonize return types of hypercall handlers
  xen: don't include asm/hypercall.h from C sources
  xen: include compat/platform.h from hypercall.h
  xen: generate hypercall interface related code
  xen: use generated prototypes for hypercall handlers
  xen/x86: call hypercall handlers via generated macro
  xen/arm: call hypercall handlers via generated macro
  xen/x86: remove cf_check attribute from hypercall handlers

 .gitignore                               |   1 +
 xen/arch/arm/domain.c                    |  15 +-
 xen/arch/arm/hvm.c                       |   3 +-
 xen/arch/arm/include/asm/hypercall.h     |   7 +-
 xen/arch/arm/platform_hypercall.c        |   1 +
 xen/arch/arm/traps.c                     | 117 ++-------
 xen/arch/x86/compat.c                    |   6 +-
 xen/arch/x86/cpu/mcheck/mce.c            |   2 +-
 xen/arch/x86/cpu/vpmu.c                  |   3 +-
 xen/arch/x86/domain.c                    |  11 +-
 xen/arch/x86/domctl.c                    |   4 +-
 xen/arch/x86/hvm/dm.c                    |   2 +-
 xen/arch/x86/hvm/hvm.c                   |   2 +-
 xen/arch/x86/hvm/hypercall.c             | 177 ++-----------
 xen/arch/x86/hypercall.c                 |  59 -----
 xen/arch/x86/include/asm/hypercall.h     | 201 ++++-----------
 xen/arch/x86/include/asm/paging.h        |   3 -
 xen/arch/x86/mm.c                        |  13 +-
 xen/arch/x86/mm/paging.c                 |   3 +-
 xen/arch/x86/physdev.c                   |   2 +-
 xen/arch/x86/platform_hypercall.c        |   3 +-
 xen/arch/x86/pv/callback.c               |  26 +-
 xen/arch/x86/pv/descriptor-tables.c      |   8 +-
 xen/arch/x86/pv/emul-priv-op.c           |   2 +-
 xen/arch/x86/pv/hypercall.c              | 187 ++------------
 xen/arch/x86/pv/iret.c                   |   5 +-
 xen/arch/x86/pv/misc-hypercalls.c        |  22 +-
 xen/arch/x86/pv/shim.c                   |   4 +-
 xen/arch/x86/traps.c                     |   2 +-
 xen/arch/x86/x86_64/compat/mm.c          |   3 +-
 xen/arch/x86/x86_64/domain.c             |  16 +-
 xen/arch/x86/x86_64/mm.c                 |   2 -
 xen/arch/x86/x86_64/platform_hypercall.c |   1 -
 xen/common/argo.c                        |   8 +-
 xen/common/compat/domain.c               |  15 +-
 xen/common/compat/grant_table.c          |   3 +-
 xen/common/compat/kernel.c               |   2 +-
 xen/common/compat/memory.c               |   3 +-
 xen/common/dm.c                          |   2 +-
 xen/common/domain.c                      |  14 +-
 xen/common/domctl.c                      |   2 +-
 xen/common/event_channel.c               |   3 +-
 xen/common/grant_table.c                 |   4 +-
 xen/common/hypfs.c                       |   2 +-
 xen/common/kernel.c                      |   2 +-
 xen/common/kexec.c                       |   6 +-
 xen/common/memory.c                      |   2 +-
 xen/common/multicall.c                   |   4 +-
 xen/common/sched/compat.c                |   2 +-
 xen/common/sched/core.c                  |   4 +-
 xen/common/sysctl.c                      |   2 +-
 xen/common/xenoprof.c                    |   2 +-
 xen/drivers/char/console.c               |   2 +-
 xen/include/Makefile                     |  13 +
 xen/include/hypercall-defs.c             | 285 ++++++++++++++++++++
 xen/include/xen/hypercall.h              | 185 +------------
 xen/scripts/gen_hypercall.awk            | 314 +++++++++++++++++++++++
 xen/xsm/xsm_core.c                       |   4 +-
 58 files changed, 861 insertions(+), 937 deletions(-)
 create mode 100644 xen/include/hypercall-defs.c
 create mode 100644 xen/scripts/gen_hypercall.awk

-- 
2.34.1



^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-06-07  5:00   ` Juergen Gross
                     ` (2 more replies)
  2022-03-24 14:01 ` [PATCH v6 2/9] xen: harmonize return types of hypercall handlers Juergen Gross
                   ` (10 subsequent siblings)
  11 siblings, 3 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Stefano Stabellini, Julien Grall,
	Bertrand Marquis, Volodymyr Babchuk, Andrew Cooper,
	George Dunlap, Jan Beulich, Wei Liu, Roger Pau Monné,
	Julien Grall

The entry point used for the vcpu_op hypercall on Arm is different
from the one on x86 today, as some of the common sub-ops are not
supported on Arm. The Arm specific handler filters out the not
supported sub-ops and then calls the common handler. This leads to the
weird call hierarchy:

  do_arm_vcpu_op()
    do_vcpu_op()
      arch_do_vcpu_op()

Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
of above calls can be avoided without restricting any potential
future use of common sub-ops for Arm.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
---
V4:
- don't remove HYPERCALL_ARM()
V4.1:
- add missing cf_check (Andrew Cooper)
V5:
- use v instead of current (Julien Grall)
---
 xen/arch/arm/domain.c                | 15 ++++++++-------
 xen/arch/arm/include/asm/hypercall.h |  2 --
 xen/arch/arm/traps.c                 |  2 +-
 xen/arch/x86/domain.c                | 12 ++++++++----
 xen/arch/x86/include/asm/hypercall.h |  2 +-
 xen/arch/x86/x86_64/domain.c         | 18 +++++++++++++-----
 xen/common/compat/domain.c           | 15 ++++++---------
 xen/common/domain.c                  | 12 ++++--------
 xen/include/xen/hypercall.h          |  2 +-
 9 files changed, 42 insertions(+), 38 deletions(-)

diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 8110c1df86..2f8eaab7b5 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -1079,23 +1079,24 @@ void arch_dump_domain_info(struct domain *d)
 }
 
 
-long do_arm_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
+long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
+    struct domain *d = current->domain;
+    struct vcpu *v;
+
+    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
+        return -ENOENT;
+
     switch ( cmd )
     {
         case VCPUOP_register_vcpu_info:
         case VCPUOP_register_runstate_memory_area:
-            return do_vcpu_op(cmd, vcpuid, arg);
+            return common_vcpu_op(cmd, v, arg);
         default:
             return -EINVAL;
     }
 }
 
-long arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
-{
-    return -ENOSYS;
-}
-
 void arch_dump_vcpu_info(struct vcpu *v)
 {
     gic_dump_info(v);
diff --git a/xen/arch/arm/include/asm/hypercall.h b/xen/arch/arm/include/asm/hypercall.h
index 39d2e7889d..fac4d60f17 100644
--- a/xen/arch/arm/include/asm/hypercall.h
+++ b/xen/arch/arm/include/asm/hypercall.h
@@ -4,8 +4,6 @@
 #include <public/domctl.h> /* for arch_do_domctl */
 int do_arm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
 
-long do_arm_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg);
-
 long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d,
                        XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
 
diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index 43f30747cf..e906bb4a89 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -1380,7 +1380,7 @@ static arm_hypercall_t arm_hypercall_table[] = {
 #endif
     HYPERCALL(multicall, 2),
     HYPERCALL(platform_op, 1),
-    HYPERCALL_ARM(vcpu_op, 3),
+    HYPERCALL(vcpu_op, 3),
     HYPERCALL(vm_assist, 2),
 #ifdef CONFIG_ARGO
     HYPERCALL(argo_op, 5),
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index a5048ed654..d566fc82b4 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1489,11 +1489,15 @@ int arch_vcpu_reset(struct vcpu *v)
     return 0;
 }
 
-long
-arch_do_vcpu_op(
-    int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
+long cf_check do_vcpu_op(int cmd, unsigned int vcpuid,
+                         XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     long rc = 0;
+    struct domain *d = current->domain;
+    struct vcpu *v;
+
+    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
+        return -ENOENT;
 
     switch ( cmd )
     {
@@ -1545,7 +1549,7 @@ arch_do_vcpu_op(
     }
 
     default:
-        rc = -ENOSYS;
+        rc = common_vcpu_op(cmd, v, arg);
         break;
     }
 
diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
index 61bf897147..d6daa7e4cb 100644
--- a/xen/arch/x86/include/asm/hypercall.h
+++ b/xen/arch/x86/include/asm/hypercall.h
@@ -145,7 +145,7 @@ compat_physdev_op(
     XEN_GUEST_HANDLE_PARAM(void) arg);
 
 extern int
-arch_compat_vcpu_op(
+compat_common_vcpu_op(
     int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
 
 extern int cf_check compat_mmuext_op(
diff --git a/xen/arch/x86/x86_64/domain.c b/xen/arch/x86/x86_64/domain.c
index c46dccc25a..9c559aa3ea 100644
--- a/xen/arch/x86/x86_64/domain.c
+++ b/xen/arch/x86/x86_64/domain.c
@@ -12,11 +12,15 @@
 CHECK_vcpu_get_physid;
 #undef xen_vcpu_get_physid
 
-int
-arch_compat_vcpu_op(
-    int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
+int cf_check
+compat_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
-    int rc = -ENOSYS;
+    int rc;
+    struct domain *d = current->domain;
+    struct vcpu *v;
+
+    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
+        return -ENOENT;
 
     switch ( cmd )
     {
@@ -55,7 +59,11 @@ arch_compat_vcpu_op(
     }
 
     case VCPUOP_get_physid:
-        rc = arch_do_vcpu_op(cmd, v, arg);
+        rc = do_vcpu_op(cmd, vcpuid, arg);
+        break;
+
+    default:
+        rc = compat_common_vcpu_op(cmd, v, arg);
         break;
     }
 
diff --git a/xen/common/compat/domain.c b/xen/common/compat/domain.c
index afae27eeba..1119534679 100644
--- a/xen/common/compat/domain.c
+++ b/xen/common/compat/domain.c
@@ -38,15 +38,12 @@ CHECK_vcpu_hvm_context;
 
 #endif
 
-int cf_check compat_vcpu_op(
-    int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
+int compat_common_vcpu_op(int cmd, struct vcpu *v,
+                          XEN_GUEST_HANDLE_PARAM(void) arg)
 {
-    struct domain *d = current->domain;
-    struct vcpu *v;
     int rc = 0;
-
-    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
-        return -ENOENT;
+    struct domain *d = current->domain;
+    unsigned int vcpuid = v->vcpu_id;
 
     switch ( cmd )
     {
@@ -103,7 +100,7 @@ int cf_check compat_vcpu_op(
     case VCPUOP_stop_singleshot_timer:
     case VCPUOP_register_vcpu_info:
     case VCPUOP_send_nmi:
-        rc = do_vcpu_op(cmd, vcpuid, arg);
+        rc = common_vcpu_op(cmd, v, arg);
         break;
 
     case VCPUOP_get_runstate_info:
@@ -134,7 +131,7 @@ int cf_check compat_vcpu_op(
     }
 
     default:
-        rc = arch_compat_vcpu_op(cmd, v, arg);
+        rc = -ENOSYS;
         break;
     }
 
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 351029f8b2..70747c02e6 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1570,15 +1570,11 @@ int default_initialise_vcpu(struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
     return rc;
 }
 
-long cf_check do_vcpu_op(
-    int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
+long common_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
-    struct domain *d = current->domain;
-    struct vcpu *v;
     long rc = 0;
-
-    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
-        return -ENOENT;
+    struct domain *d = v->domain;
+    unsigned int vcpuid = v->vcpu_id;
 
     switch ( cmd )
     {
@@ -1750,7 +1746,7 @@ long cf_check do_vcpu_op(
     }
 
     default:
-        rc = arch_do_vcpu_op(cmd, v, arg);
+        rc = -ENOSYS;
         break;
     }
 
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index a1b6575976..81aae7a662 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -110,7 +110,7 @@ do_vcpu_op(
 
 struct vcpu;
 extern long
-arch_do_vcpu_op(int cmd,
+common_vcpu_op(int cmd,
     struct vcpu *v,
     XEN_GUEST_HANDLE_PARAM(void) arg);
 
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 2/9] xen: harmonize return types of hypercall handlers
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-06-29  6:24   ` Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 3/9] xen: don't include asm/hypercall.h from C sources Juergen Gross
                   ` (9 subsequent siblings)
  11 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Jan Beulich, Andrew Cooper, Roger Pau Monné,
	Wei Liu, George Dunlap, Julien Grall, Stefano Stabellini,
	Christopher Clark

Today most hypercall handlers have a return type of long, while the
compat ones return an int. There are a few exceptions from that rule,
however.

Get rid of the exceptions by letting compat handlers always return int
and others always return long, with the exception of the Arm specific
physdev_op handler.

For the compat hvm case use eax instead of rax for the stored result as
it should have been from the beginning.

Additionally move some prototypes to include/asm-x86/hypercall.h
as they are x86 specific. Move the compat_platform_op() prototype to
the common header.

Rename paging_domctl_continuation() to do_paging_domctl_cont() and add
a matching define for the associated hypercall.

Make do_callback_op() and compat_callback_op() more similar by adding
the const attribute to compat_callback_op()'s 2nd parameter.

Change the type of the cmd parameter for [do|compat]_kexec_op() to
unsigned int, as this is more appropriate for the compat case.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
V2:
- rework platform_op compat handling (Jan Beulich)
V3:
- remove include of types.h (Jan Beulich)
V4:
- don't move do_physdev_op() (Julien Grall)
- carve out non style compliant parameter replacements (Julien Grall)
V6:
- remove rebase artifact (Jan Beulich)
---
 xen/arch/x86/domctl.c                |  4 ++--
 xen/arch/x86/hvm/hypercall.c         |  8 ++-----
 xen/arch/x86/hypercall.c             |  2 +-
 xen/arch/x86/include/asm/hypercall.h | 31 ++++++++++++++--------------
 xen/arch/x86/include/asm/paging.h    |  3 ---
 xen/arch/x86/mm/paging.c             |  3 ++-
 xen/arch/x86/pv/callback.c           | 14 ++++++-------
 xen/arch/x86/pv/emul-priv-op.c       |  2 +-
 xen/arch/x86/pv/hypercall.c          |  5 +----
 xen/arch/x86/pv/iret.c               |  4 ++--
 xen/arch/x86/pv/misc-hypercalls.c    | 14 ++++++++-----
 xen/common/argo.c                    |  6 +++---
 xen/common/kexec.c                   |  6 +++---
 xen/include/xen/hypercall.h          | 20 ++++++++----------
 14 files changed, 58 insertions(+), 64 deletions(-)

diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index e49f9e91b9..ea7d60ffb6 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -221,8 +221,8 @@ long arch_do_domctl(
     case XEN_DOMCTL_shadow_op:
         ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0);
         if ( ret == -ERESTART )
-            return hypercall_create_continuation(__HYPERVISOR_arch_1,
-                                                 "h", u_domctl);
+            return hypercall_create_continuation(
+                       __HYPERVISOR_paging_domctl_cont, "h", u_domctl);
         copyback = true;
         break;
 
diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
index 62b5349e7d..3a35543997 100644
--- a/xen/arch/x86/hvm/hypercall.c
+++ b/xen/arch/x86/hvm/hypercall.c
@@ -124,8 +124,6 @@ static long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
     [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,  \
                                (hypercall_fn_t *) compat_ ## x }
 
-#define do_arch_1             paging_domctl_continuation
-
 static const struct {
     hypercall_fn_t *native, *compat;
 } hvm_hypercall_table[] = {
@@ -158,11 +156,9 @@ static const struct {
 #ifdef CONFIG_HYPFS
     HYPERCALL(hypfs_op),
 #endif
-    HYPERCALL(arch_1)
+    HYPERCALL(paging_domctl_cont)
 };
 
-#undef do_arch_1
-
 #undef HYPERCALL
 #undef HVM_CALL
 #undef COMPAT_CALL
@@ -300,7 +296,7 @@ int hvm_hypercall(struct cpu_user_regs *regs)
 #endif
 
         curr->hcall_compat = true;
-        regs->rax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
+        regs->eax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
         curr->hcall_compat = false;
 
 #ifndef NDEBUG
diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
index 2370d31d3f..07e1a45ef5 100644
--- a/xen/arch/x86/hypercall.c
+++ b/xen/arch/x86/hypercall.c
@@ -75,7 +75,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] =
     ARGS(dm_op, 3),
     ARGS(hypfs_op, 5),
     ARGS(mca, 1),
-    ARGS(arch_1, 1),
+    ARGS(paging_domctl_cont, 1),
 };
 
 #undef COMP
diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
index d6daa7e4cb..49973820af 100644
--- a/xen/arch/x86/include/asm/hypercall.h
+++ b/xen/arch/x86/include/asm/hypercall.h
@@ -11,6 +11,8 @@
 #include <public/arch-x86/xen-mca.h> /* for do_mca */
 #include <asm/paging.h>
 
+#define __HYPERVISOR_paging_domctl_cont __HYPERVISOR_arch_1
+
 typedef unsigned long hypercall_fn_t(
     unsigned long, unsigned long, unsigned long,
     unsigned long, unsigned long);
@@ -80,7 +82,7 @@ do_set_debugreg(
     int reg,
     unsigned long value);
 
-extern unsigned long cf_check
+extern long cf_check
 do_get_debugreg(
     int reg);
 
@@ -118,7 +120,7 @@ do_mmuext_op(
 extern long cf_check do_callback_op(
     int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
 
-extern unsigned long cf_check
+extern long cf_check
 do_iret(
     void);
 
@@ -133,17 +135,20 @@ do_set_segment_base(
     unsigned int which,
     unsigned long base);
 
+long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
+
+long cf_check do_xenpmu_op(unsigned int op,
+                           XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
+
+long cf_check do_paging_domctl_cont(
+    XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
+
 #ifdef CONFIG_COMPAT
 
 #include <compat/arch-x86/xen.h>
 #include <compat/physdev.h>
 #include <compat/platform.h>
 
-extern int cf_check
-compat_physdev_op(
-    int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
 extern int
 compat_common_vcpu_op(
     int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
@@ -154,12 +159,8 @@ extern int cf_check compat_mmuext_op(
     XEN_GUEST_HANDLE_PARAM(uint) pdone,
     unsigned int foreigndom);
 
-DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
-extern int cf_check compat_platform_op(
-    XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
-
-extern long cf_check compat_callback_op(
-    int cmd, XEN_GUEST_HANDLE(void) arg);
+extern int cf_check compat_callback_op(
+    int cmd, XEN_GUEST_HANDLE(const_void) arg);
 
 extern int cf_check compat_update_va_mapping(
     unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags);
@@ -177,12 +178,12 @@ extern int cf_check compat_set_gdt(
 extern int cf_check compat_update_descriptor(
     uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi);
 
-extern unsigned int cf_check compat_iret(void);
+extern int cf_check compat_iret(void);
 
 extern int cf_check compat_nmi_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
 
-extern long cf_check compat_set_callbacks(
+extern int cf_check compat_set_callbacks(
     unsigned long event_selector, unsigned long event_address,
     unsigned long failsafe_selector, unsigned long failsafe_address);
 
diff --git a/xen/arch/x86/include/asm/paging.h b/xen/arch/x86/include/asm/paging.h
index f0b4efc66e..54c440be65 100644
--- a/xen/arch/x86/include/asm/paging.h
+++ b/xen/arch/x86/include/asm/paging.h
@@ -234,9 +234,6 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
                   XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl,
                   bool_t resuming);
 
-/* Helper hypercall for dealing with continuations. */
-long cf_check paging_domctl_continuation(XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
-
 /* Call when destroying a vcpu/domain */
 void paging_vcpu_teardown(struct vcpu *v);
 int paging_teardown(struct domain *d);
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index 1f0b94ad21..a7e2707ecc 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -21,6 +21,7 @@
 
 #include <xen/init.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <asm/paging.h>
 #include <asm/shadow.h>
 #include <asm/p2m.h>
@@ -759,7 +760,7 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
         return shadow_domctl(d, sc, u_domctl);
 }
 
-long cf_check paging_domctl_continuation(
+long cf_check do_paging_domctl_cont(
     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
 {
     struct xen_domctl op;
diff --git a/xen/arch/x86/pv/callback.c b/xen/arch/x86/pv/callback.c
index 55148c7f9e..1be9d3f731 100644
--- a/xen/arch/x86/pv/callback.c
+++ b/xen/arch/x86/pv/callback.c
@@ -207,9 +207,9 @@ long cf_check do_set_callbacks(
 #include <compat/callback.h>
 #include <compat/nmi.h>
 
-static long compat_register_guest_callback(struct compat_callback_register *reg)
+static int compat_register_guest_callback(struct compat_callback_register *reg)
 {
-    long ret = 0;
+    int ret = 0;
     struct vcpu *curr = current;
 
     fixup_guest_code_selector(curr->domain, reg->address.cs);
@@ -256,10 +256,10 @@ static long compat_register_guest_callback(struct compat_callback_register *reg)
     return ret;
 }
 
-static long compat_unregister_guest_callback(
+static int compat_unregister_guest_callback(
     struct compat_callback_unregister *unreg)
 {
-    long ret;
+    int ret;
 
     switch ( unreg->type )
     {
@@ -283,9 +283,9 @@ static long compat_unregister_guest_callback(
     return ret;
 }
 
-long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
+int cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
 {
-    long ret;
+    int ret;
 
     switch ( cmd )
     {
@@ -321,7 +321,7 @@ long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
     return ret;
 }
 
-long cf_check compat_set_callbacks(
+int cf_check compat_set_callbacks(
     unsigned long event_selector, unsigned long event_address,
     unsigned long failsafe_selector, unsigned long failsafe_address)
 {
diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
index 22b10dec2a..5da00e24e4 100644
--- a/xen/arch/x86/pv/emul-priv-op.c
+++ b/xen/arch/x86/pv/emul-priv-op.c
@@ -22,13 +22,13 @@
 #include <xen/domain_page.h>
 #include <xen/event.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/iocap.h>
 
 #include <asm/amd.h>
 #include <asm/debugreg.h>
 #include <asm/endbr.h>
 #include <asm/hpet.h>
-#include <asm/hypercall.h>
 #include <asm/mc146818rtc.h>
 #include <asm/pv/domain.h>
 #include <asm/pv/trace.h>
diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
index e8fbee7bbb..fe8dfe9e8f 100644
--- a/xen/arch/x86/pv/hypercall.c
+++ b/xen/arch/x86/pv/hypercall.c
@@ -47,8 +47,6 @@ typedef struct {
 #define COMPAT_CALL(x) HYPERCALL(x)
 #endif
 
-#define do_arch_1             paging_domctl_continuation
-
 static const pv_hypercall_table_t pv_hypercall_table[] = {
     COMPAT_CALL(set_trap_table),
     HYPERCALL(mmu_update),
@@ -109,11 +107,10 @@ static const pv_hypercall_table_t pv_hypercall_table[] = {
 #endif
     HYPERCALL(mca),
 #ifndef CONFIG_PV_SHIM_EXCLUSIVE
-    HYPERCALL(arch_1),
+    HYPERCALL(paging_domctl_cont),
 #endif
 };
 
-#undef do_arch_1
 #undef COMPAT_CALL
 #undef HYPERCALL
 
diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
index dd2965d8f0..55eb6a63bd 100644
--- a/xen/arch/x86/pv/iret.c
+++ b/xen/arch/x86/pv/iret.c
@@ -48,7 +48,7 @@ static void async_exception_cleanup(struct vcpu *curr)
         curr->arch.async_exception_state(trap).old_mask;
 }
 
-unsigned long cf_check do_iret(void)
+long cf_check do_iret(void)
 {
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct iret_context iret_saved;
@@ -105,7 +105,7 @@ unsigned long cf_check do_iret(void)
 }
 
 #ifdef CONFIG_PV32
-unsigned int cf_check compat_iret(void)
+int cf_check compat_iret(void)
 {
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct vcpu *v = current;
diff --git a/xen/arch/x86/pv/misc-hypercalls.c b/xen/arch/x86/pv/misc-hypercalls.c
index 5649aaab44..635f5a644a 100644
--- a/xen/arch/x86/pv/misc-hypercalls.c
+++ b/xen/arch/x86/pv/misc-hypercalls.c
@@ -28,12 +28,16 @@ long cf_check do_set_debugreg(int reg, unsigned long value)
     return set_debugreg(current, reg, value);
 }
 
-unsigned long cf_check do_get_debugreg(int reg)
+long cf_check do_get_debugreg(int reg)
 {
-    unsigned long val;
-    int res = x86emul_read_dr(reg, &val, NULL);
-
-    return res == X86EMUL_OKAY ? val : -ENODEV;
+    /* Avoid implementation defined behavior casting unsigned long to long. */
+    union {
+        unsigned long val;
+        long ret;
+    } u;
+    int res = x86emul_read_dr(reg, &u.val, NULL);
+
+    return res == X86EMUL_OKAY ? u.ret : -ENODEV;
 }
 
 long cf_check do_fpu_taskswitch(int set)
diff --git a/xen/common/argo.c b/xen/common/argo.c
index 297f6d11f0..26a01c2188 100644
--- a/xen/common/argo.c
+++ b/xen/common/argo.c
@@ -2207,13 +2207,13 @@ do_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
 }
 
 #ifdef CONFIG_COMPAT
-long cf_check
+int cf_check
 compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
                XEN_GUEST_HANDLE_PARAM(void) arg2, unsigned long arg3,
                unsigned long arg4)
 {
     struct domain *currd = current->domain;
-    long rc;
+    int rc;
     xen_argo_send_addr_t send_addr;
     xen_argo_iov_t iovs[XEN_ARGO_MAXIOV];
     compat_argo_iov_t compat_iovs[XEN_ARGO_MAXIOV];
@@ -2267,7 +2267,7 @@ compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
 
     rc = sendv(currd, &send_addr.src, &send_addr.dst, iovs, niov, arg4);
  out:
-    argo_dprintk("<-compat_argo_op(%u)=%ld\n", cmd, rc);
+    argo_dprintk("<-compat_argo_op(%u)=%d\n", cmd, rc);
 
     return rc;
 }
diff --git a/xen/common/kexec.c b/xen/common/kexec.c
index a2ffb6530c..41669964d2 100644
--- a/xen/common/kexec.c
+++ b/xen/common/kexec.c
@@ -1213,7 +1213,7 @@ static int kexec_status(XEN_GUEST_HANDLE_PARAM(void) uarg)
     return !!test_bit(bit, &kexec_flags);
 }
 
-static int do_kexec_op_internal(unsigned long op,
+static int do_kexec_op_internal(unsigned int op,
                                 XEN_GUEST_HANDLE_PARAM(void) uarg,
                                 bool_t compat)
 {
@@ -1265,13 +1265,13 @@ static int do_kexec_op_internal(unsigned long op,
     return ret;
 }
 
-long cf_check do_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
+long cf_check do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
 {
     return do_kexec_op_internal(op, uarg, 0);
 }
 
 #ifdef CONFIG_COMPAT
-int cf_check compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
+int cf_check compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
 {
     return do_kexec_op_internal(op, uarg, 1);
 }
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index 81aae7a662..a032ba2b4a 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -114,11 +114,6 @@ common_vcpu_op(int cmd,
     struct vcpu *v,
     XEN_GUEST_HANDLE_PARAM(void) arg);
 
-extern long cf_check
-do_nmi_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
 extern long cf_check
 do_hvm_op(
     unsigned long op,
@@ -126,7 +121,7 @@ do_hvm_op(
 
 extern long cf_check
 do_kexec_op(
-    unsigned long op,
+    unsigned int op,
     XEN_GUEST_HANDLE_PARAM(void) uarg);
 
 extern long cf_check
@@ -145,9 +140,6 @@ extern long cf_check do_argo_op(
 extern long cf_check
 do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
 
-extern long cf_check
-do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
-
 extern long cf_check
 do_dm_op(
     domid_t domid,
@@ -205,15 +197,21 @@ extern int cf_check compat_xsm_op(
     XEN_GUEST_HANDLE_PARAM(void) op);
 
 extern int cf_check compat_kexec_op(
-    unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg);
+    unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
 
 DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
 extern int cf_check compat_multicall(
     XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list,
     uint32_t nr_calls);
 
+int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
+
+typedef struct compat_platform_op compat_platform_op_t;
+DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
+int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
+
 #ifdef CONFIG_ARGO
-extern long cf_check compat_argo_op(
+extern int cf_check compat_argo_op(
     unsigned int cmd,
     XEN_GUEST_HANDLE_PARAM(void) arg1,
     XEN_GUEST_HANDLE_PARAM(void) arg2,
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 3/9] xen: don't include asm/hypercall.h from C sources
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 2/9] xen: harmonize return types of hypercall handlers Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 4/9] xen: include compat/platform.h from hypercall.h Juergen Gross
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Stefano Stabellini, Julien Grall,
	Bertrand Marquis, Volodymyr Babchuk, Andrew Cooper,
	George Dunlap, Jan Beulich, Wei Liu, Roger Pau Monné,
	Julien Grall

Instead of including asm/hypercall.h always use xen/hypercall.h.
Additionally include xen/hypercall.h from all sources containing a
hypercall handler.

This prepares for generating the handlers' prototypes at build time.

Add a guard in asm/hypercall.h to catch direct inclusion.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com> # arm
---
V2:
- remove platform_op hunk (Jan Beulich)
- remove including of xen/hypervisor.h from arch/x86/x86_64/mm.c
  (Jan Beulich)
- fix include order in common/compat/grant_table.c (Jan Beulich)
---
 xen/arch/arm/hvm.c                   | 3 +--
 xen/arch/arm/include/asm/hypercall.h | 4 ++++
 xen/arch/arm/platform_hypercall.c    | 1 +
 xen/arch/x86/cpu/vpmu.c              | 1 +
 xen/arch/x86/include/asm/hypercall.h | 4 ++++
 xen/arch/x86/mm.c                    | 1 -
 xen/arch/x86/platform_hypercall.c    | 1 +
 xen/arch/x86/pv/iret.c               | 1 +
 xen/arch/x86/traps.c                 | 2 +-
 xen/arch/x86/x86_64/compat/mm.c      | 1 +
 xen/arch/x86/x86_64/mm.c             | 2 --
 xen/common/compat/grant_table.c      | 1 +
 xen/common/event_channel.c           | 1 +
 xen/common/grant_table.c             | 1 +
 xen/common/multicall.c               | 1 +
 15 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/xen/arch/arm/hvm.c b/xen/arch/arm/hvm.c
index 8951b34086..fc1a52767d 100644
--- a/xen/arch/arm/hvm.c
+++ b/xen/arch/arm/hvm.c
@@ -20,6 +20,7 @@
 #include <xen/lib.h>
 #include <xen/errno.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/sched.h>
 #include <xen/monitor.h>
 
@@ -29,8 +30,6 @@
 #include <public/hvm/params.h>
 #include <public/hvm/hvm_op.h>
 
-#include <asm/hypercall.h>
-
 static int hvm_allow_set_param(const struct domain *d, unsigned int param)
 {
     switch ( param )
diff --git a/xen/arch/arm/include/asm/hypercall.h b/xen/arch/arm/include/asm/hypercall.h
index fac4d60f17..8182895358 100644
--- a/xen/arch/arm/include/asm/hypercall.h
+++ b/xen/arch/arm/include/asm/hypercall.h
@@ -1,3 +1,7 @@
+#ifndef __XEN_HYPERCALL_H__
+#error "asm/hypercall.h should not be included directly - include xen/hypercall.h instead"
+#endif
+
 #ifndef __ASM_ARM_HYPERCALL_H__
 #define __ASM_ARM_HYPERCALL_H__
 
diff --git a/xen/arch/arm/platform_hypercall.c b/xen/arch/arm/platform_hypercall.c
index 8efac7ee60..403cc84324 100644
--- a/xen/arch/arm/platform_hypercall.c
+++ b/xen/arch/arm/platform_hypercall.c
@@ -9,6 +9,7 @@
 #include <xen/types.h>
 #include <xen/sched.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/spinlock.h>
 #include <public/platform.h>
 #include <xsm/xsm.h>
diff --git a/xen/arch/x86/cpu/vpmu.c b/xen/arch/x86/cpu/vpmu.c
index 4fedc7c570..51d171615f 100644
--- a/xen/arch/x86/cpu/vpmu.c
+++ b/xen/arch/x86/cpu/vpmu.c
@@ -22,6 +22,7 @@
 #include <xen/param.h>
 #include <xen/event.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/sched.h>
 #include <asm/regs.h>
 #include <asm/types.h>
diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
index 49973820af..81ca25f7b3 100644
--- a/xen/arch/x86/include/asm/hypercall.h
+++ b/xen/arch/x86/include/asm/hypercall.h
@@ -2,6 +2,10 @@
  * asm-x86/hypercall.h
  */
 
+#ifndef __XEN_HYPERCALL_H__
+#error "asm/hypercall.h should not be included directly - include xen/hypercall.h instead"
+#endif
+
 #ifndef __ASM_X86_HYPERCALL_H__
 #define __ASM_X86_HYPERCALL_H__
 
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 2befd0c191..6cc73187ac 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -129,7 +129,6 @@
 #include <asm/ldt.h>
 #include <asm/x86_emulate.h>
 #include <asm/e820.h>
-#include <asm/hypercall.h>
 #include <asm/shared.h>
 #include <asm/mem_sharing.h>
 #include <public/memory.h>
diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
index b91ccff589..eeb4f7a20e 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -17,6 +17,7 @@
 #include <xen/console.h>
 #include <xen/iocap.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/acpi.h>
 #include <xen/efi.h>
 #include <xen/cpu.h>
diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
index 55eb6a63bd..58de9f7922 100644
--- a/xen/arch/x86/pv/iret.c
+++ b/xen/arch/x86/pv/iret.c
@@ -18,6 +18,7 @@
  */
 
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/lib.h>
 #include <xen/sched.h>
 
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 8659547970..4c38f6c015 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -29,6 +29,7 @@
 #include <xen/lib.h>
 #include <xen/err.h>
 #include <xen/errno.h>
+#include <xen/hypercall.h>
 #include <xen/mm.h>
 #include <xen/param.h>
 #include <xen/console.h>
@@ -70,7 +71,6 @@
 #include <asm/x86_emulate.h>
 #include <asm/traps.h>
 #include <asm/hvm/vpt.h>
-#include <asm/hypercall.h>
 #include <asm/mce.h>
 #include <asm/apic.h>
 #include <asm/mc146818rtc.h>
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index b3da8fafbb..70b08a832a 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -1,4 +1,5 @@
 #include <xen/event.h>
+#include <xen/hypercall.h>
 #include <xen/mem_access.h>
 #include <xen/multicall.h>
 #include <compat/memory.h>
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index 4f225da81e..3510a5affe 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -25,14 +25,12 @@ EMIT_FILE;
 #include <xen/numa.h>
 #include <xen/nodemask.h>
 #include <xen/guest_access.h>
-#include <xen/hypercall.h>
 #include <xen/mem_access.h>
 #include <asm/current.h>
 #include <asm/asm_defns.h>
 #include <asm/page.h>
 #include <asm/flushtlb.h>
 #include <asm/fixmap.h>
-#include <asm/hypercall.h>
 #include <asm/msr.h>
 #include <asm/pv/domain.h>
 #include <asm/setup.h>
diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c
index c6199e8918..d5787e3719 100644
--- a/xen/common/compat/grant_table.c
+++ b/xen/common/compat/grant_table.c
@@ -3,6 +3,7 @@
  *
  */
 
+#include <xen/hypercall.h>
 #include <compat/grant_table.h>
 
 #define xen_grant_entry_v1 grant_entry_v1
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index ffb042a241..0a82eb3ac2 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -24,6 +24,7 @@
 #include <xen/iocap.h>
 #include <xen/compat.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/keyhandler.h>
 #include <asm/current.h>
 
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index 1e0762b064..febbe12eab 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -33,6 +33,7 @@
 #include <xen/trace.h>
 #include <xen/grant_table.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/domain_page.h>
 #include <xen/iommu.h>
 #include <xen/paging.h>
diff --git a/xen/common/multicall.c b/xen/common/multicall.c
index e48f46dbe0..9db49092b4 100644
--- a/xen/common/multicall.c
+++ b/xen/common/multicall.c
@@ -9,6 +9,7 @@
 #include <xen/event.h>
 #include <xen/multicall.h>
 #include <xen/guest_access.h>
+#include <xen/hypercall.h>
 #include <xen/perfc.h>
 #include <xen/trace.h>
 #include <asm/current.h>
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 4/9] xen: include compat/platform.h from hypercall.h
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (2 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 3/9] xen: don't include asm/hypercall.h from C sources Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 5/9] xen: generate hypercall interface related code Juergen Gross
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Jan Beulich, Andrew Cooper, Roger Pau Monné,
	Wei Liu, George Dunlap, Julien Grall, Stefano Stabellini

The definition of compat_platform_op_t is in compat/platform.h
already, so include that file from hypercall.h instead of repeating
the typedef.

This allows to remove the related include statement from
arch/x86/x86_64/platform_hypercall.c.

Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
---
V3:
- new patch
---
 xen/arch/x86/x86_64/platform_hypercall.c | 1 -
 xen/include/xen/hypercall.h              | 4 +++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c
index 966fd27b5f..5bf6b958d2 100644
--- a/xen/arch/x86/x86_64/platform_hypercall.c
+++ b/xen/arch/x86/x86_64/platform_hypercall.c
@@ -5,7 +5,6 @@
 EMIT_FILE;
 
 #include <xen/lib.h>
-#include <compat/platform.h>
 #include <xen/hypercall.h>
 
 #define xen_platform_op     compat_platform_op
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index a032ba2b4a..ca8ee22717 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -15,6 +15,9 @@
 #include <public/version.h>
 #include <public/pmu.h>
 #include <public/hvm/dm_op.h>
+#ifdef CONFIG_COMPAT
+#include <compat/platform.h>
+#endif
 #include <asm/hypercall.h>
 #include <xsm/xsm.h>
 
@@ -206,7 +209,6 @@ extern int cf_check compat_multicall(
 
 int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
 
-typedef struct compat_platform_op compat_platform_op_t;
 DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
 int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
 
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 5/9] xen: generate hypercall interface related code
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (3 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 4/9] xen: include compat/platform.h from hypercall.h Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-07-11 10:18   ` Jan Beulich
  2022-03-24 14:01 ` [PATCH v6 6/9] xen: use generated prototypes for hypercall handlers Juergen Gross
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Andrew Cooper, George Dunlap, Jan Beulich,
	Julien Grall, Stefano Stabellini, Wei Liu, Julien Grall

Instead of repeating similar data multiple times use a single source
file and a generator script for producing prototypes and call sequences
of the hypercalls.

As the script already knows the number of parameters used add generating
a macro for populating an array with the number of parameters per
hypercall.

The priorities for the specific hypercalls are based on two benchamrks
performed in guests (PV and PVH):

- make -j 4 of the Xen hypervisor (resulting in cpu load with lots of
  processes created)
- scp of a large file to the guest (network load)

With a small additional debug patch applied the number of the
different hypercalls in the guest and in dom0 (for looking at backend
activity related hypercalls) were counted while the benchmark in domU
was running:

PV-hypercall    PV-guest build   PV-guest scp    dom0 build     dom0 scp
mmu_update           186175729           2865         20936        33725
stack_switch           1273311          62381        108589       270764
multicall              2182803             50           302          524
update_va_mapping       571868             10            60           80
xen_version              73061            850           859         5432
grant_table_op               0              0         35557       139110
iret                  75673006         484132        268157       757958
vcpu_op                 453037          71199        138224       334988
set_segment_base       1650249          62387        108645       270823
mmuext_op             11225681            188          7239         3426
sched_op                280153         134645         70729       137943
event_channel_op        192327          66204         71409       214191
physdev_op                   0              0          7721         4315
(the dom0 values are for the guest running the build or scp test, so
dom0 acting as backend)

HVM-hypercall   PVH-guest build    PVH-guest scp
vcpu_op                  277684             2324
event_channel_op         350233            57383
(the related dom0 counter values are in the same range as with the test
running in the PV guest)

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
---
V2:
- split platform_op for doe and compat prefixes (Jan Beulich)
- add "addline:" directive
- add priorities to handlers (Jan Beulich)
V2.1:
- add missing "delete" statement in awk script
- optimize case of 2 hypercalls with same priority
V2.2:
- avoid asort() function (Michal Orzel)
V3:
- drop "addline:" support, as no longer needed
- enclose call sequence macros in "({ ... })" (Jan Beulich)
- small style adjustment (Jan Beulich)
- move generating to xen/include/Makefile (Anthony PERARD)
V4:
- generate cf_check attribute for prototype (will be removed in later patch)
- add Arm-specific variant of physdev_op()
V5:
- user $(srctree) (Anthony Perard)
- specify priority 1 for arm evtchn_op (Julien Grall)
---
 .gitignore                    |   1 +
 xen/include/Makefile          |  13 ++
 xen/include/hypercall-defs.c  | 285 ++++++++++++++++++++++++++++++
 xen/scripts/gen_hypercall.awk | 314 ++++++++++++++++++++++++++++++++++
 4 files changed, 613 insertions(+)
 create mode 100644 xen/include/hypercall-defs.c
 create mode 100644 xen/scripts/gen_hypercall.awk

diff --git a/.gitignore b/.gitignore
index d425be4bd9..c6e5b31b98 100644
--- a/.gitignore
+++ b/.gitignore
@@ -324,6 +324,7 @@ xen/include/public/public
 xen/include/xen/*.new
 xen/include/xen/acm_policy.h
 xen/include/xen/compile.h
+xen/include/xen/hypercall-defs.h
 xen/include/xen/lib/x86/cpuid-autogen.h
 xen/test/livepatch/config.h
 xen/test/livepatch/expect_config.h
diff --git a/xen/include/Makefile b/xen/include/Makefile
index a3c2511f5f..dfc43f9fba 100644
--- a/xen/include/Makefile
+++ b/xen/include/Makefile
@@ -77,6 +77,18 @@ $(obj)/compat/xlat.h: $(addprefix $(obj)/compat/.xlat/,$(xlat-y)) $(obj)/config/
 	cat $(filter %.h,$^) >$@.new
 	mv -f $@.new $@
 
+quiet_cmd_genhyp = GEN     $@
+define cmd_genhyp
+    awk -f $(srctree)/scripts/gen_hypercall.awk <$< >$@
+endef
+
+all: $(obj)/xen/hypercall-defs.h
+
+$(obj)/xen/hypercall-defs.h: $(obj)/hypercall-defs.i $(srctree)/scripts/gen_hypercall.awk FORCE
+	$(call if_changed,genhyp)
+
+targets += xen/hypercall-defs.h
+
 ifeq ($(XEN_TARGET_ARCH),$(XEN_COMPILE_ARCH))
 
 all: $(obj)/headers.chk $(obj)/headers99.chk $(obj)/headers++.chk
@@ -132,3 +144,4 @@ all: lib-x86-all
 endif
 
 clean-files := compat config generated headers*.chk xen/lib/x86/cpuid-autogen.h
+clean-files += xen/hypercall-defs.h hypercall-defs.i
diff --git a/xen/include/hypercall-defs.c b/xen/include/hypercall-defs.c
new file mode 100644
index 0000000000..60cbeb18e4
--- /dev/null
+++ b/xen/include/hypercall-defs.c
@@ -0,0 +1,285 @@
+/*
+ * Hypercall interface description:
+ * Used by scripts/gen_hypercall.awk to generate hypercall prototypes and call
+ * sequences.
+ *
+ * Syntax is like a prototype, but without return type and without the ";" at
+ * the end. Pointer types will be automatically converted to use the
+ * XEN_GUEST_HANDLE_PARAM() macro. Handlers with no parameters just use a
+ * definition like "fn()".
+ * Hypercall/function names are without the leading "__HYPERVISOR_"/"do_"
+ * strings.
+ *
+ * The return type of a class of prototypes using the same prefix is set via:
+ * rettype: <prefix> <type>
+ * Default return type is "long". A return type for a prefix can be set only
+ * once and it needs to be set before that prefix is being used via the
+ * "prefix:" directive.
+ *
+ * The prefix of the prototypes is set via a line:
+ * prefix: <prefix> ...
+ * Multiple prefixes are possible (restriction see below). Prefixes are without
+ * a trailing "_". The current prefix settings are active until a new "prefix:"
+ * line.
+ *
+ * Caller macros are suffixed with a selectable name via lines like:
+ * caller: <suffix>
+ * When a caller suffix is active, there is only one active prefix allowed.
+ *
+ * With a "defhandle:" line it is possible to add a DEFINE_XEN_GUEST_HANDLE()
+ * to the generated header:
+ * defhandle: <handle-type> [<type>]
+ * Without specifying <type> only a DEFINE_XEN_GUEST_HANDLE(<handle-type>)
+ * will be generated, otherwise it will be a
+ * __DEFINE_XEN_GUEST_HANDLE(<handle-type>, <type>) being generated. Note that
+ * the latter will include the related "const" handle "const_<handle-type>".
+ *
+ * In order to support using coding style compliant pointers in the
+ * prototypes it is possible to add translation entries to generate the correct
+ * handle types:
+ * handle: <handle-type> <type>
+ * This will result in the prototype translation from "<type> *" to
+ * "XEN_GUEST_HANDLE_PARAM(<handle-type>)".
+ *
+ * The hypercall handler calling code will be generated from a final table in
+ * the source file, which is started via the line:
+ * table: <caller> <caller> ...
+ * with the <caller>s specifying the designated caller macro of each column of
+ * the table. Any column of a <caller> not having been set via a "caller:"
+ * line will be ignored.
+ * The first column of the table contains the hypercall/prototype, each
+ * <caller> column contains the prefix for the function to use for that caller.
+ * A function prefix can be annotated with a priority by adding ":<prio>" to it
+ * ("1" being the highest priority, higher numbers mean lower priority, no
+ * priority specified is the lowest priority). The generated code will try to
+ * achieve better performance for calling high priority handlers.
+ * A column not being supported by a <caller> is marked with "-". Lines with all
+ * entries being "-" after removal of inactive <caller> columns are ignored.
+ *
+ * This file is being preprocessed using $(CPP), so #ifdef CONFIG_* conditionals
+ * are possible.
+ */
+
+#ifdef CONFIG_HVM
+#define PREFIX_hvm hvm
+#else
+#define PREFIX_hvm
+#endif
+
+#ifdef CONFIG_COMPAT
+#define PREFIX_compat compat
+rettype: compat int
+#else
+#define PREFIX_compat
+#endif
+
+#ifdef CONFIG_ARM
+#define PREFIX_dep dep
+#define PREFIX_do_arm do_arm
+rettype: do_arm int
+#else
+#define PREFIX_dep
+#define PREFIX_do_arm
+#endif
+
+handle: uint unsigned int
+handle: const_void const void
+handle: const_char const char
+
+#ifdef CONFIG_COMPAT
+defhandle: multicall_entry_compat_t
+#ifndef CONFIG_PV_SHIM_EXCLUSIVE
+defhandle: compat_platform_op_t
+#endif
+#endif
+#ifdef CONFIG_PV32
+defhandle: trap_info_compat_t
+defhandle: physdev_op_compat_t
+#endif
+
+prefix: do PREFIX_hvm PREFIX_compat PREFIX_do_arm
+physdev_op(int cmd, void *arg)
+
+prefix: do PREFIX_hvm PREFIX_compat
+#if defined(CONFIG_GRANT_TABLE) || defined(CONFIG_PV_SHIM)
+grant_table_op(unsigned int cmd, void *uop, unsigned int count)
+#endif
+
+prefix: do PREFIX_hvm
+memory_op(unsigned long cmd, void *arg)
+
+prefix: do PREFIX_compat
+xen_version(int cmd, void *arg)
+vcpu_op(int cmd, unsigned int vcpuid, void *arg)
+sched_op(int cmd, void *arg)
+xsm_op(void *op)
+callback_op(int cmd, const void *arg)
+#ifdef CONFIG_ARGO
+argo_op(unsigned int cmd, void *arg1, void *arg2, unsigned long arg3, unsigned long arg4)
+#endif
+#ifdef CONFIG_KEXEC
+kexec_op(unsigned int op, void *uarg)
+#endif
+#ifdef CONFIG_PV
+iret()
+nmi_op(unsigned int cmd, void *arg)
+#ifdef CONFIG_XENOPROF
+xenoprof_op(int op, void *arg)
+#endif
+#endif /* CONFIG_PV */
+
+#ifdef CONFIG_COMPAT
+prefix: compat
+set_timer_op(uint32_t lo, int32_t hi)
+multicall(multicall_entry_compat_t *call_list, uint32_t nr_calls)
+memory_op(unsigned int cmd, void *arg)
+#ifdef CONFIG_IOREQ_SERVER
+dm_op(domid_t domid, unsigned int nr_bufs, void *bufs)
+#endif
+mmuext_op(void *arg, unsigned int count, uint *pdone, unsigned int foreigndom)
+#ifdef CONFIG_PV32
+set_trap_table(trap_info_compat_t *traps)
+set_gdt(unsigned int *frame_list, unsigned int entries)
+set_callbacks(unsigned long event_selector, unsigned long event_address, unsigned long failsafe_selector, unsigned long failsafe_address)
+update_descriptor(uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi)
+update_va_mapping(unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags)
+physdev_op_compat(physdev_op_compat_t *uop)
+update_va_mapping_otherdomain(unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags, domid_t domid)
+#endif
+#ifndef CONFIG_PV_SHIM_EXCLUSIVE
+platform_op(compat_platform_op_t *u_xenpf_op)
+#endif
+#endif /* CONFIG_COMPAT */
+
+#if defined(CONFIG_PV) || defined(CONFIG_ARM)
+prefix: do PREFIX_dep
+event_channel_op_compat(evtchn_op_t *uop)
+physdev_op_compat(physdev_op_t *uop)
+/* Legacy hypercall (as of 0x00030101). */
+sched_op_compat(int cmd, unsigned long arg)
+#endif
+
+prefix: do
+set_timer_op(s_time_t timeout)
+console_io(unsigned int cmd, unsigned int count, char *buffer)
+vm_assist(unsigned int cmd, unsigned int type)
+event_channel_op(int cmd, void *arg)
+mmuext_op(mmuext_op_t *uops, unsigned int count, unsigned int *pdone, unsigned int foreigndom)
+multicall(multicall_entry_t *call_list, unsigned int nr_calls)
+#ifdef CONFIG_PV
+mmu_update(mmu_update_t *ureqs, unsigned int count, unsigned int *pdone, unsigned int foreigndom)
+stack_switch(unsigned long ss, unsigned long esp)
+fpu_taskswitch(int set)
+set_debugreg(int reg, unsigned long value)
+get_debugreg(int reg)
+set_segment_base(unsigned int which, unsigned long base)
+mca(xen_mc_t *u_xen_mc)
+set_trap_table(const_trap_info_t *traps)
+set_gdt(xen_ulong_t *frame_list, unsigned int entries)
+set_callbacks(unsigned long event_address, unsigned long failsafe_address, unsigned long syscall_address)
+update_descriptor(uint64_t gaddr, seg_desc_t desc)
+update_va_mapping(unsigned long va, uint64_t val64, unsigned long flags)
+update_va_mapping_otherdomain(unsigned long va, uint64_t val64, unsigned long flags, domid_t domid)
+#endif
+#ifdef CONFIG_IOREQ_SERVER
+dm_op(domid_t domid, unsigned int nr_bufs, xen_dm_op_buf_t *bufs)
+#endif
+#ifndef CONFIG_PV_SHIM_EXCLUSIVE
+sysctl(xen_sysctl_t *u_sysctl)
+domctl(xen_domctl_t *u_domctl)
+paging_domctl_cont(xen_domctl_t *u_domctl)
+platform_op(xen_platform_op_t *u_xenpf_op)
+#endif
+#ifdef CONFIG_HVM
+hvm_op(unsigned long op, void *arg)
+#endif
+#ifdef CONFIG_HYPFS
+hypfs_op(unsigned int cmd, const char *arg1, unsigned long arg2, void *arg3, unsigned long arg4)
+#endif
+#ifdef CONFIG_X86
+xenpmu_op(unsigned int op, xen_pmu_params_t *arg)
+#endif
+
+#ifdef CONFIG_PV
+caller: pv64
+#ifdef CONFIG_PV32
+caller: pv32
+#endif
+#endif
+#if defined(CONFIG_HVM) && defined(CONFIG_X86)
+caller: hvm64
+#ifdef CONFIG_COMPAT
+caller: hvm32
+#endif
+#endif
+#ifdef CONFIG_ARM
+caller: arm
+#endif
+
+table:                             pv32     pv64     hvm32    hvm64    arm
+set_trap_table                     compat   do       -        -        -
+mmu_update                         do:1     do:1     -        -        -
+set_gdt                            compat   do       -        -        -
+stack_switch                       do:2     do:2     -        -        -
+set_callbacks                      compat   do       -        -        -
+fpu_taskswitch                     do       do       -        -        -
+sched_op_compat                    do       do       -        -        dep
+#ifndef CONFIG_PV_SHIM_EXCLUSIVE
+platform_op                        compat   do       compat   do       do
+#endif
+set_debugreg                       do       do       -        -        -
+get_debugreg                       do       do       -        -        -
+update_descriptor                  compat   do       -        -        -
+memory_op                          compat   do       hvm      hvm      do
+multicall                          compat:2 do:2     compat   do       do
+update_va_mapping                  compat   do       -        -        -
+set_timer_op                       compat   do       compat   do       -
+event_channel_op_compat            do       do       -        -        dep
+xen_version                        compat   do       compat   do       do
+console_io                         do       do       do       do       do
+physdev_op_compat                  compat   do       -        -        dep
+#if defined(CONFIG_GRANT_TABLE) || defined(CONFIG_PV_SHIM)
+grant_table_op                     compat   do       hvm      hvm      do
+#endif
+vm_assist                          do       do       do       do       do
+update_va_mapping_otherdomain      compat   do       -        -        -
+iret                               compat:1 do:1     -        -        -
+vcpu_op                            compat   do       compat:1 do:1     do
+set_segment_base                   do:2     do:2     -        -        -
+#ifdef CONFIG_PV
+mmuext_op                          compat:2 do:2     compat   do       -
+#endif
+xsm_op                             compat   do       compat   do       do
+nmi_op                             compat   do       -        -        -
+sched_op                           compat   do       compat   do       do
+callback_op                        compat   do       -        -        -
+#ifdef CONFIG_XENOPROF
+xenoprof_op                        compat   do       -        -        -
+#endif
+event_channel_op                   do       do       do:1     do:1     do:1
+physdev_op                         compat   do       hvm      hvm      do_arm
+#ifdef CONFIG_HVM
+hvm_op                             do       do       do       do       do
+#endif
+#ifndef CONFIG_PV_SHIM_EXCLUSIVE
+sysctl                             do       do       do       do       do
+domctl                             do       do       do       do       do
+#endif
+#ifdef CONFIG_KEXEC
+kexec_op                           compat   do       -        -        -
+#endif
+tmem_op                            -        -        -        -        -
+#ifdef CONFIG_ARGO
+argo_op                            compat   do       compat   do       do
+#endif
+xenpmu_op                          do       do       do       do       -
+#ifdef CONFIG_IOREQ_SERVER
+dm_op                              compat   do       compat   do       do
+#endif
+#ifdef CONFIG_HYPFS
+hypfs_op                           do       do       do       do       do
+#endif
+mca                                do       do       -        -        -
+#ifndef CONFIG_PV_SHIM_EXCLUSIVE
+paging_domctl_cont                 do       do       do       do       -
+#endif
diff --git a/xen/scripts/gen_hypercall.awk b/xen/scripts/gen_hypercall.awk
new file mode 100644
index 0000000000..403758be21
--- /dev/null
+++ b/xen/scripts/gen_hypercall.awk
@@ -0,0 +1,314 @@
+# awk script to generate hypercall handler prototypes and a macro for doing
+# the calls of the handlers inside a switch() statement.
+
+BEGIN {
+    printf("/* Generated file, do not edit! */\n\n");
+    e = 0;
+    n = 0;
+    p = 0;
+    nc = 0;
+}
+
+# Issue error to stderr
+function do_err(msg) {
+    print "Error: "msg": "$0 >"/dev/stderr";
+    exit 1;
+}
+
+# Generate handler call
+function do_call(f, p,    i) {
+    printf("            ret = %s_%s(", pre[f, p], fn[f]);
+    for (i = 1; i <= n_args[f]; i++) {
+        if (i > 1)
+            printf(", ");
+        if (ptr[f, i])
+            printf("(XEN_GUEST_HANDLE_PARAM(%s)){ _p(a%d) }", typ[f, i], i);
+        else
+            printf("(%s)(a%d)", typ[f, i], i);
+    }
+    printf("); \\\n");
+}
+
+# Generate case statement for call
+function do_case(f, p) {
+    printf("        case __HYPERVISOR_%s: \\\n", fn[f]);
+    do_call(f, p);
+    printf("            break; \\\n");
+}
+
+# Generate switch statement for calling handlers
+function do_switch(ca, p,    i) {
+    printf("        switch ( num ) \\\n");
+    printf("        { \\\n");
+    for (i = 1; i <= nc; i++)
+        if (call[i] == ca && call_prio[i] == p)
+            do_case(call_fn[i], call_p[i]);
+    printf("        default: \\\n");
+    printf("            ret = -ENOSYS; \\\n");
+    printf("            break; \\\n");
+    printf("        } \\\n");
+}
+
+function rest_of_line(par,    i, val) {
+    val = $(par);
+    for (i = par + 1; i <= NF; i++)
+        val = val " " $(i);
+    return val;
+}
+
+# Handle comments (multi- and single line)
+$1 == "/*" {
+    comment = 1;
+}
+comment == 1 {
+    if ($(NF) == "*/") comment = 0;
+    next;
+}
+
+# Skip preprocessing artefacts
+$1 == "extern" {
+    next;
+}
+/^#/ {
+    next;
+}
+
+# Drop empty lines
+NF == 0 {
+    next;
+}
+
+# Handle "handle:" line
+$1 == "handle:" {
+    if (NF < 3)
+        do_err("\"handle:\" requires at least two parameters");
+    val = rest_of_line(3);
+    xlate[val] = $2;
+    next;
+}
+
+# Handle "defhandle:" line
+$1 == "defhandle:" {
+    if (NF < 2)
+        do_err("\"defhandle:\" requires at least one parameter");
+    e++;
+    if (NF == 2) {
+        emit[e] = sprintf("DEFINE_XEN_GUEST_HANDLE(%s);", $2);
+    } else {
+        val = rest_of_line(3);
+        emit[e] = sprintf("__DEFINE_XEN_GUEST_HANDLE(%s, %s);", $2, val);
+        xlate[val] = $2;
+    }
+    next;
+}
+
+# Handle "rettype:" line
+$1 == "rettype:" {
+    if (NF < 3)
+        do_err("\"rettype:\" requires at least two parameters");
+    if ($2 in rettype)
+        do_err("rettype can be set only once for each prefix");
+    rettype[$2] = rest_of_line(3);
+    next;
+}
+
+# Handle "caller:" line
+$1 == "caller:" {
+    caller[$2] = 1;
+    next;
+}
+
+# Handle "prefix:" line
+$1 == "prefix:" {
+    p = NF - 1;
+    for (i = 2; i <= NF; i++) {
+        prefix[i - 1] = $(i);
+        if (!(prefix[i - 1] in rettype))
+            rettype[prefix[i - 1]] = "long";
+    }
+    next;
+}
+
+# Handle "table:" line
+$1 == "table:" {
+    table = 1;
+    for (i = 2; i <= NF; i++)
+        col[i - 1] = $(i);
+    n_cols = NF - 1;
+    next;
+}
+
+# Handle table definition line
+table == 1 {
+    if (NF != n_cols + 1)
+        do_err("Table definition line has wrong number of fields");
+    for (c = 1; c <= n_cols; c++) {
+        if (caller[col[c]] != 1)
+            continue;
+        if ($(c + 1) == "-")
+            continue;
+        pref = $(c + 1);
+        idx = index(pref, ":");
+        if (idx == 0)
+            prio = 100;
+        else {
+            prio = substr(pref, idx + 1) + 0;
+            pref = substr(pref, 1, idx - 1);
+            if (prio >= 100 || prio < 1)
+                do_err("Priority must be in the range 1..99");
+        }
+        fnd = 0;
+        for (i = 1; i <= n; i++) {
+            if (fn[i] != $1)
+                continue;
+            for (j = 1; j <= n_pre[i]; j++) {
+                if (pre[i, j] == pref) {
+                    prios[col[c], prio]++;
+                    if (prios[col[c], prio] == 1) {
+                        n_prios[col[c]]++;
+                        prio_list[col[c], n_prios[col[c]]] = prio;
+                        prio_mask[col[c], prio] = "(1ULL << __HYPERVISOR_"$1")";
+                    } else
+                        prio_mask[col[c], prio] = prio_mask[col[c], prio] " | (1ULL << __HYPERVISOR_"$1")";
+                    nc++;
+                    call[nc] = col[c];
+                    call_fn[nc] = i;
+                    call_p[nc] = j;
+                    call_prio[nc] = prio;
+                    fnd = 1;
+                }
+            }
+        }
+        if (fnd == 0)
+            do_err("No prototype for prefix/hypercall combination");
+    }
+    next;
+}
+
+# Prototype line
+{
+    bro = index($0, "(");
+    brc = index($0, ")");
+    if (bro < 2 || brc < bro)
+        do_err("No valid prototype line");
+    n++;
+    fn[n] = substr($0, 1, bro - 1);
+    n_pre[n] = p;
+    for (i = 1; i <= p; i++)
+        pre[n, i] = prefix[i];
+    args = substr($0, bro + 1, brc - bro - 1);
+    n_args[n] = split(args, a, ",");
+    if (n_args[n] > 5)
+        do_err("Too many parameters");
+    for (i = 1; i <= n_args[n]; i++) {
+        sub("^ *", "", a[i]);         # Remove leading white space
+        sub(" +", " ", a[i]);         # Replace multiple spaces with single ones
+        sub(" *$", "", a[i]);         # Remove trailing white space
+        ptr[n, i] = index(a[i], "*"); # Is it a pointer type?
+        sub("[*]", "", a[i]);         # Remove "*"
+        if (index(a[i], " ") == 0)
+            do_err("Parameter with no type or no name");
+        typ[n, i] = a[i];
+        sub(" [^ ]+$", "", typ[n, i]);    # Remove parameter name
+        if (ptr[n, i] && (typ[n, i] in xlate))
+            typ[n, i] = xlate[typ[n, i]];
+        arg[n, i] = a[i];
+        sub("^([^ ]+ )+", "", arg[n, i]); # Remove parameter type
+    }
+}
+
+# Generate the output
+END {
+    # Verbatim generated lines
+    for (i = 1; i <= e; i++)
+        printf("%s\n", emit[i]);
+    printf("\n");
+    # Generate prototypes
+    for (i = 1; i <= n; i++) {
+        for (p = 1; p <= n_pre[i]; p++) {
+            printf("%s cf_check %s_%s(", rettype[pre[i, p]], pre[i, p], fn[i]);
+            if (n_args[i] == 0)
+                printf("void");
+            else
+                for (j = 1; j <= n_args[i]; j++) {
+                    if (j > 1)
+                        printf(", ");
+                    if (ptr[i, j])
+                        printf("XEN_GUEST_HANDLE_PARAM(%s)", typ[i, j]);
+                    else
+                        printf("%s", typ[i, j]);
+                    printf(" %s", arg[i, j]);
+                }
+            printf(");\n");
+        }
+    }
+    # Generate call sequences and args array contents
+    for (ca in caller) {
+        if (caller[ca] != 1)
+            continue;
+        need_mask = 0;
+        for (pl = 1; pl <= n_prios[ca]; pl++) {
+            for (pll = pl; pll > 1; pll--) {
+                if (prio_list[ca, pl] > p_list[pll - 1])
+                    break;
+                else
+                    p_list[pll] = p_list[pll - 1];
+            }
+            p_list[pll] = prio_list[ca, pl];
+            # If any prio but the default one has more than 1 entry we need "mask"
+            if (p_list[pll] != 100 && prios[ca, p_list[pll]] > 1)
+                need_mask = 1;
+        }
+        printf("\n");
+        printf("#define call_handlers_%s(num, ret, a1, a2, a3, a4, a5) \\\n", ca);
+        printf("({ \\\n");
+        if (need_mask)
+            printf("    uint64_t mask = 1ULL << num; \\\n");
+        printf("    ");
+        for (pl = 1; pl <= n_prios[ca]; pl++) {
+            if (prios[ca, p_list[pl]] > 1) {
+                if (pl < n_prios[ca]) {
+                    printf("    if ( likely(mask & (%s)) ) \\\n", prio_mask[ca, p_list[pl]]);
+                    printf("    { \\\n");
+                }
+                if (prios[ca, p_list[pl]] == 2) {
+                    fnd = 0;
+                    for (i = 1; i <= nc; i++)
+                        if (call[i] == ca && call_prio[i] == p_list[pl]) {
+                            fnd++;
+                            if (fnd == 1)
+                                printf("        if ( num == __HYPERVISOR_%s ) \\\n", fn[call_fn[i]]);
+                            else
+                                printf("        else \\\n");
+                            do_call(call_fn[i], call_p[i]);
+                        }
+                } else {
+                    do_switch(ca, p_list[pl]);
+                }
+                if (pl < n_prios[ca])
+                    printf("    } \\\n");
+            } else {
+                for (i = 1; i <= nc; i++)
+                    if (call[i] == ca && call_prio[i] == p_list[pl]) {
+                        printf("if ( likely(num == __HYPERVISOR_%s) ) \\\n", fn[call_fn[i]]);
+                        do_call(call_fn[i], call_p[i]);
+                    }
+            }
+            if (pl < n_prios[ca] || prios[ca, p_list[pl]] <= 2)
+                printf("    else \\\n");
+        }
+        if (prios[ca, p_list[n_prios[ca]]] <= 2) {
+            printf("\\\n");
+            printf("        ret = -ENOSYS; \\\n");
+        }
+        printf("})\n");
+        delete p_list;
+        printf("\n");
+        printf("#define hypercall_args_%s \\\n", ca);
+        printf("{ \\\n");
+        for (i = 1; i <= nc; i++)
+            if (call[i] == ca)
+                printf("[__HYPERVISOR_%s] = %d, \\\n", fn[call_fn[i]], n_args[call_fn[i]]);
+        printf("}\n");
+    }
+}
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 6/9] xen: use generated prototypes for hypercall handlers
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (4 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 5/9] xen: generate hypercall interface related code Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 7/9] xen/x86: call hypercall handlers via generated macro Juergen Gross
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Stefano Stabellini, Julien Grall,
	Bertrand Marquis, Volodymyr Babchuk, Andrew Cooper,
	George Dunlap, Jan Beulich, Wei Liu, Roger Pau Monné,
	Julien Grall

Remove the hypercall handler's prototypes in the related header files
and use the generated ones instead.

Some handlers having been static before need to be made globally
visible.

Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Julien Grall <jgrall@amazon.com>
---
 xen/arch/arm/include/asm/hypercall.h |   1 -
 xen/arch/x86/hvm/hypercall.c         |   7 +-
 xen/arch/x86/include/asm/hypercall.h | 141 ---------------------
 xen/include/xen/hypercall.h          | 177 +--------------------------
 4 files changed, 5 insertions(+), 321 deletions(-)

diff --git a/xen/arch/arm/include/asm/hypercall.h b/xen/arch/arm/include/asm/hypercall.h
index 8182895358..ccd26c5184 100644
--- a/xen/arch/arm/include/asm/hypercall.h
+++ b/xen/arch/arm/include/asm/hypercall.h
@@ -6,7 +6,6 @@
 #define __ASM_ARM_HYPERCALL_H__
 
 #include <public/domctl.h> /* for arch_do_domctl */
-int do_arm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
 
 long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d,
                        XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
index 3a35543997..a9c9ad721f 100644
--- a/xen/arch/x86/hvm/hypercall.c
+++ b/xen/arch/x86/hvm/hypercall.c
@@ -31,8 +31,7 @@
 #include <public/hvm/hvm_op.h>
 #include <public/hvm/params.h>
 
-static long cf_check hvm_memory_op(
-    unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long cf_check hvm_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     long rc;
 
@@ -52,7 +51,7 @@ static long cf_check hvm_memory_op(
 }
 
 #ifdef CONFIG_GRANT_TABLE
-static long cf_check hvm_grant_table_op(
+long cf_check hvm_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
 {
     switch ( cmd )
@@ -78,7 +77,7 @@ static long cf_check hvm_grant_table_op(
 }
 #endif
 
-static long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     const struct vcpu *curr = current;
     const struct domain *currd = curr->domain;
diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
index 81ca25f7b3..2d243b48bc 100644
--- a/xen/arch/x86/include/asm/hypercall.h
+++ b/xen/arch/x86/include/asm/hypercall.h
@@ -44,109 +44,6 @@ void pv_ring3_init_hypercall_page(void *ptr);
  */
 #define MMU_UPDATE_PREEMPTED          (~(~0U>>1))
 
-extern long cf_check
-do_event_channel_op_compat(
-    XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop);
-
-/* Legacy hypercall (as of 0x00030202). */
-extern long cf_check do_physdev_op_compat(
-    XEN_GUEST_HANDLE(physdev_op_t) uop);
-
-/* Legacy hypercall (as of 0x00030101). */
-extern long cf_check do_sched_op_compat(
-    int cmd, unsigned long arg);
-
-extern long cf_check
-do_set_trap_table(
-    XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps);
-
-extern long cf_check
-do_mmu_update(
-    XEN_GUEST_HANDLE_PARAM(mmu_update_t) ureqs,
-    unsigned int count,
-    XEN_GUEST_HANDLE_PARAM(uint) pdone,
-    unsigned int foreigndom);
-
-extern long cf_check
-do_set_gdt(
-    XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list,
-    unsigned int entries);
-
-extern long cf_check
-do_stack_switch(
-    unsigned long ss,
-    unsigned long esp);
-
-extern long cf_check
-do_fpu_taskswitch(
-    int set);
-
-extern long cf_check
-do_set_debugreg(
-    int reg,
-    unsigned long value);
-
-extern long cf_check
-do_get_debugreg(
-    int reg);
-
-extern long cf_check
-do_update_descriptor(
-    uint64_t gaddr, seg_desc_t desc);
-
-extern long cf_check
-do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc);
-
-extern long cf_check
-do_update_va_mapping(
-    unsigned long va,
-    uint64_t val64,
-    unsigned long flags);
-
-extern long cf_check
-do_physdev_op(
-    int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_update_va_mapping_otherdomain(
-    unsigned long va,
-    uint64_t val64,
-    unsigned long flags,
-    domid_t domid);
-
-extern long cf_check
-do_mmuext_op(
-    XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops,
-    unsigned int count,
-    XEN_GUEST_HANDLE_PARAM(uint) pdone,
-    unsigned int foreigndom);
-
-extern long cf_check do_callback_op(
-    int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
-
-extern long cf_check
-do_iret(
-    void);
-
-extern long cf_check
-do_set_callbacks(
-    unsigned long event_address,
-    unsigned long failsafe_address,
-    unsigned long syscall_address);
-
-extern long cf_check
-do_set_segment_base(
-    unsigned int which,
-    unsigned long base);
-
-long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-long cf_check do_xenpmu_op(unsigned int op,
-                           XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
-
-long cf_check do_paging_domctl_cont(
-    XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
-
 #ifdef CONFIG_COMPAT
 
 #include <compat/arch-x86/xen.h>
@@ -157,44 +54,6 @@ extern int
 compat_common_vcpu_op(
     int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
 
-extern int cf_check compat_mmuext_op(
-    XEN_GUEST_HANDLE_PARAM(void) arg,
-    unsigned int count,
-    XEN_GUEST_HANDLE_PARAM(uint) pdone,
-    unsigned int foreigndom);
-
-extern int cf_check compat_callback_op(
-    int cmd, XEN_GUEST_HANDLE(const_void) arg);
-
-extern int cf_check compat_update_va_mapping(
-    unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags);
-
-extern int cf_check compat_update_va_mapping_otherdomain(
-    unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags, domid_t domid);
-
-DEFINE_XEN_GUEST_HANDLE(trap_info_compat_t);
-extern int cf_check compat_set_trap_table(
-    XEN_GUEST_HANDLE(trap_info_compat_t) traps);
-
-extern int cf_check compat_set_gdt(
-    XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries);
-
-extern int cf_check compat_update_descriptor(
-    uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi);
-
-extern int cf_check compat_iret(void);
-
-extern int cf_check compat_nmi_op(
-    unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern int cf_check compat_set_callbacks(
-    unsigned long event_selector, unsigned long event_address,
-    unsigned long failsafe_selector, unsigned long failsafe_address);
-
-DEFINE_XEN_GUEST_HANDLE(physdev_op_compat_t);
-extern int cf_check compat_physdev_op_compat(
-    XEN_GUEST_HANDLE(physdev_op_compat_t) uop);
-
 #endif /* CONFIG_COMPAT */
 
 #endif /* __ASM_X86_HYPERCALL_H__ */
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index ca8ee22717..f307dfb597 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -21,33 +21,19 @@
 #include <asm/hypercall.h>
 #include <xsm/xsm.h>
 
-extern long cf_check
-do_sched_op(
-    int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_domctl(
-    XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
+/* Needs to be after asm/hypercall.h. */
+#include <xen/hypercall-defs.h>
 
 extern long
 arch_do_domctl(
     struct xen_domctl *domctl, struct domain *d,
     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
 
-extern long cf_check
-do_sysctl(
-    XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl);
-
 extern long
 arch_do_sysctl(
     struct xen_sysctl *sysctl,
     XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl);
 
-extern long cf_check
-do_platform_op(
-    XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op);
-
 extern long
 pci_physdev_op(
     int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
@@ -65,170 +51,11 @@ pci_physdev_op(
 #define MEMOP_EXTENT_SHIFT 6 /* cmd[:6] == start_extent */
 #define MEMOP_CMD_MASK     ((1 << MEMOP_EXTENT_SHIFT) - 1)
 
-extern long cf_check
-do_memory_op(
-    unsigned long cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_multicall(
-    XEN_GUEST_HANDLE_PARAM(multicall_entry_t) call_list,
-    unsigned int nr_calls);
-
-extern long cf_check
-do_set_timer_op(
-    s_time_t timeout);
-
-extern long cf_check
-do_event_channel_op(
-    int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_xen_version(
-    int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_console_io(
-    unsigned int cmd,
-    unsigned int count,
-    XEN_GUEST_HANDLE_PARAM(char) buffer);
-
-extern long cf_check
-do_grant_table_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) uop,
-    unsigned int count);
-
-extern long cf_check
-do_vm_assist(
-    unsigned int cmd,
-    unsigned int type);
-
-extern long cf_check
-do_vcpu_op(
-    int cmd,
-    unsigned int vcpuid,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-struct vcpu;
 extern long
 common_vcpu_op(int cmd,
     struct vcpu *v,
     XEN_GUEST_HANDLE_PARAM(void) arg);
 
-extern long cf_check
-do_hvm_op(
-    unsigned long op,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_kexec_op(
-    unsigned int op,
-    XEN_GUEST_HANDLE_PARAM(void) uarg);
-
-extern long cf_check
-do_xsm_op(
-    XEN_GUEST_HANDLE_PARAM(void) u_xsm_op);
-
-#ifdef CONFIG_ARGO
-extern long cf_check do_argo_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg1,
-    XEN_GUEST_HANDLE_PARAM(void) arg2,
-    unsigned long arg3,
-    unsigned long arg4);
-#endif
-
-extern long cf_check
-do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern long cf_check
-do_dm_op(
-    domid_t domid,
-    unsigned int nr_bufs,
-    XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs);
-
-#ifdef CONFIG_HYPFS
-extern long cf_check
-do_hypfs_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(const_char) arg1,
-    unsigned long arg2,
-    XEN_GUEST_HANDLE_PARAM(void) arg3,
-    unsigned long arg4);
-#endif
-
-#ifdef CONFIG_COMPAT
-
-extern int cf_check
-compat_memory_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern int cf_check
-compat_grant_table_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) uop,
-    unsigned int count);
-
-extern int cf_check
-compat_vcpu_op(
-    int cmd,
-    unsigned int vcpuid,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern int cf_check
-compat_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern int cf_check
-compat_xen_version(
-    int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern int cf_check
-compat_sched_op(
-    int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg);
-
-extern int cf_check
-compat_set_timer_op(
-    uint32_t lo,
-    int32_t hi);
-
-extern int cf_check compat_xsm_op(
-    XEN_GUEST_HANDLE_PARAM(void) op);
-
-extern int cf_check compat_kexec_op(
-    unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
-
-DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
-extern int cf_check compat_multicall(
-    XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list,
-    uint32_t nr_calls);
-
-int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
-
-DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
-int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
-
-#ifdef CONFIG_ARGO
-extern int cf_check compat_argo_op(
-    unsigned int cmd,
-    XEN_GUEST_HANDLE_PARAM(void) arg1,
-    XEN_GUEST_HANDLE_PARAM(void) arg2,
-    unsigned long arg3,
-    unsigned long arg4);
-#endif
-
-extern int cf_check
-compat_dm_op(
-    domid_t domid,
-    unsigned int nr_bufs,
-    XEN_GUEST_HANDLE_PARAM(void) bufs);
-
-#endif
-
 void arch_get_xen_caps(xen_capabilities_info_t *info);
 
 #endif /* __XEN_HYPERCALL_H__ */
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 7/9] xen/x86: call hypercall handlers via generated macro
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (5 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 6/9] xen: use generated prototypes for hypercall handlers Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 8/9] xen/arm: " Juergen Gross
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Jan Beulich, Andrew Cooper, Roger Pau Monné, Wei Liu

Instead of using a function table use the generated macros for calling
the appropriate hypercall handlers.

This is beneficial to performance and avoids speculation issues.

With calling the handlers using the correct number of parameters now
it is possible to do the parameter register clobbering in the NDEBUG
case after returning from the handler. With the additional generated
data the hard coded hypercall_args_table[] can be replaced by tables
using the generated number of parameters.

Note that this change modifies behavior of clobbering registers in a
minor way: in case a hypercall is returning -ENOSYS (or the unsigned
equivalent thereof) for any reason the parameter registers will no
longer be clobbered. This should be of no real concern, as those cases
ought to be extremely rare and reuse of the registers in those cases
seems rather far fetched.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
V2:
- make hypercall_args_*[] const (Jan Beulich)
- make clobber_regs*() independent from NDEBUG (Jan Beulich)
- drop "L" suffix for 32-bit register clobber value (Jan Beulich)
V3:
- add array_access_nospec() (Jan Beulich)
- remove local variables in hvm_hypercall() (Andrew Cooper)
---
 xen/arch/x86/hvm/hypercall.c         | 166 +++---------------------
 xen/arch/x86/hypercall.c             |  59 ---------
 xen/arch/x86/include/asm/hypercall.h |  55 ++++++--
 xen/arch/x86/pv/hypercall.c          | 184 +++------------------------
 4 files changed, 76 insertions(+), 388 deletions(-)

diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
index a9c9ad721f..ae601185fc 100644
--- a/xen/arch/x86/hvm/hypercall.c
+++ b/xen/arch/x86/hvm/hypercall.c
@@ -111,56 +111,10 @@ long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
         return compat_physdev_op(cmd, arg);
 }
 
-#define HYPERCALL(x)                                         \
-    [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,  \
-                               (hypercall_fn_t *) do_ ## x }
-
-#define HVM_CALL(x)                                          \
-    [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) hvm_ ## x, \
-                               (hypercall_fn_t *) hvm_ ## x }
-
-#define COMPAT_CALL(x)                                       \
-    [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,  \
-                               (hypercall_fn_t *) compat_ ## x }
-
-static const struct {
-    hypercall_fn_t *native, *compat;
-} hvm_hypercall_table[] = {
-    HVM_CALL(memory_op),
-    COMPAT_CALL(multicall),
-#ifdef CONFIG_GRANT_TABLE
-    HVM_CALL(grant_table_op),
-#endif
-    HYPERCALL(vm_assist),
-    COMPAT_CALL(vcpu_op),
-    HVM_CALL(physdev_op),
-    COMPAT_CALL(xen_version),
-    HYPERCALL(console_io),
-    HYPERCALL(event_channel_op),
-    COMPAT_CALL(sched_op),
-    COMPAT_CALL(set_timer_op),
-    COMPAT_CALL(xsm_op),
-    HYPERCALL(hvm_op),
-    HYPERCALL(sysctl),
-    HYPERCALL(domctl),
-#ifdef CONFIG_ARGO
-    COMPAT_CALL(argo_op),
-#endif
-    COMPAT_CALL(platform_op),
-#ifdef CONFIG_PV
-    COMPAT_CALL(mmuext_op),
-#endif
-    HYPERCALL(xenpmu_op),
-    COMPAT_CALL(dm_op),
-#ifdef CONFIG_HYPFS
-    HYPERCALL(hypfs_op),
+#ifndef NDEBUG
+static const unsigned char hypercall_args_64[] = hypercall_args_hvm64;
+static const unsigned char hypercall_args_32[] = hypercall_args_hvm32;
 #endif
-    HYPERCALL(paging_domctl_cont)
-};
-
-#undef HYPERCALL
-#undef HVM_CALL
-#undef COMPAT_CALL
 
 int hvm_hypercall(struct cpu_user_regs *regs)
 {
@@ -206,23 +160,6 @@ int hvm_hypercall(struct cpu_user_regs *regs)
         return ret;
     }
 
-    BUILD_BUG_ON(ARRAY_SIZE(hvm_hypercall_table) >
-                 ARRAY_SIZE(hypercall_args_table));
-
-    if ( eax >= ARRAY_SIZE(hvm_hypercall_table) )
-    {
-        regs->rax = -ENOSYS;
-        return HVM_HCALL_completed;
-    }
-
-    eax = array_index_nospec(eax, ARRAY_SIZE(hvm_hypercall_table));
-
-    if ( !hvm_hypercall_table[eax].native )
-    {
-        regs->rax = -ENOSYS;
-        return HVM_HCALL_completed;
-    }
-
     /*
      * Caching is intended for instruction emulation only. Disable it
      * for any accesses by hypercall argument copy-in / copy-out.
@@ -233,85 +170,27 @@ int hvm_hypercall(struct cpu_user_regs *regs)
 
     if ( mode == 8 )
     {
-        unsigned long rdi = regs->rdi;
-        unsigned long rsi = regs->rsi;
-        unsigned long rdx = regs->rdx;
-        unsigned long r10 = regs->r10;
-        unsigned long r8 = regs->r8;
-
         HVM_DBG_LOG(DBG_LEVEL_HCALL, "hcall%lu(%lx, %lx, %lx, %lx, %lx)",
-                    eax, rdi, rsi, rdx, r10, r8);
-
-#ifndef NDEBUG
-        /* Deliberately corrupt parameter regs not used by this hypercall. */
-        switch ( hypercall_args_table[eax].native )
-        {
-        case 0: rdi = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 1: rsi = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 2: rdx = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 3: r10 = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 4: r8 = 0xdeadbeefdeadf00dUL;
-        }
-#endif
+                    eax, regs->rdi, regs->rsi, regs->rdx, regs->r10, regs->r8);
 
-        regs->rax = hvm_hypercall_table[eax].native(rdi, rsi, rdx, r10, r8);
+        call_handlers_hvm64(eax, regs->rax, regs->rdi, regs->rsi, regs->rdx,
+                            regs->r10, regs->r8);
 
-#ifndef NDEBUG
-        if ( !curr->hcall_preempted )
-        {
-            /* Deliberately corrupt parameter regs used by this hypercall. */
-            switch ( hypercall_args_table[eax].native )
-            {
-            case 5: regs->r8  = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 4: regs->r10 = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 3: regs->rdx = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 2: regs->rsi = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 1: regs->rdi = 0xdeadbeefdeadf00dUL;
-            }
-        }
-#endif
+        if ( !curr->hcall_preempted && regs->rax != -ENOSYS )
+            clobber_regs(regs, get_nargs(hypercall_args_64, eax));
     }
     else
     {
-        unsigned int ebx = regs->ebx;
-        unsigned int ecx = regs->ecx;
-        unsigned int edx = regs->edx;
-        unsigned int esi = regs->esi;
-        unsigned int edi = regs->edi;
-
         HVM_DBG_LOG(DBG_LEVEL_HCALL, "hcall%lu(%x, %x, %x, %x, %x)", eax,
-                    ebx, ecx, edx, esi, edi);
-
-#ifndef NDEBUG
-        /* Deliberately corrupt parameter regs not used by this hypercall. */
-        switch ( hypercall_args_table[eax].compat )
-        {
-        case 0: ebx = 0xdeadf00d; fallthrough;
-        case 1: ecx = 0xdeadf00d; fallthrough;
-        case 2: edx = 0xdeadf00d; fallthrough;
-        case 3: esi = 0xdeadf00d; fallthrough;
-        case 4: edi = 0xdeadf00d;
-        }
-#endif
+                    regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi);
 
         curr->hcall_compat = true;
-        regs->eax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
+        call_handlers_hvm32(eax, regs->eax, regs->ebx, regs->ecx, regs->edx,
+                            regs->esi, regs->edi);
         curr->hcall_compat = false;
 
-#ifndef NDEBUG
-        if ( !curr->hcall_preempted )
-        {
-            /* Deliberately corrupt parameter regs used by this hypercall. */
-            switch ( hypercall_args_table[eax].compat )
-            {
-            case 5: regs->rdi = 0xdeadf00d; fallthrough;
-            case 4: regs->rsi = 0xdeadf00d; fallthrough;
-            case 3: regs->rdx = 0xdeadf00d; fallthrough;
-            case 2: regs->rcx = 0xdeadf00d; fallthrough;
-            case 1: regs->rbx = 0xdeadf00d;
-            }
-        }
-#endif
+        if ( !curr->hcall_preempted && regs->eax != -ENOSYS )
+            clobber_regs32(regs, get_nargs(hypercall_args_32, eax));
     }
 
     hvmemul_cache_restore(curr, token);
@@ -332,31 +211,20 @@ int hvm_hypercall(struct cpu_user_regs *regs)
 enum mc_disposition hvm_do_multicall_call(struct mc_state *state)
 {
     struct vcpu *curr = current;
-    hypercall_fn_t *func = NULL;
 
     if ( hvm_guest_x86_mode(curr) == 8 )
     {
         struct multicall_entry *call = &state->call;
 
-        if ( call->op < ARRAY_SIZE(hvm_hypercall_table) )
-            func = array_access_nospec(hvm_hypercall_table, call->op).native;
-        if ( func )
-            call->result = func(call->args[0], call->args[1], call->args[2],
-                                call->args[3], call->args[4]);
-        else
-            call->result = -ENOSYS;
+        call_handlers_hvm64(call->op, call->result, call->args[0], call->args[1],
+                            call->args[2], call->args[3], call->args[4]);
     }
     else
     {
         struct compat_multicall_entry *call = &state->compat_call;
 
-        if ( call->op < ARRAY_SIZE(hvm_hypercall_table) )
-            func = array_access_nospec(hvm_hypercall_table, call->op).compat;
-        if ( func )
-            call->result = func(call->args[0], call->args[1], call->args[2],
-                                call->args[3], call->args[4]);
-        else
-            call->result = -ENOSYS;
+        call_handlers_hvm32(call->op, call->result, call->args[0], call->args[1],
+                            call->args[2], call->args[3], call->args[4]);
     }
 
     return !hvm_get_cpl(curr) ? mc_continue : mc_preempt;
diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
index 07e1a45ef5..6b73cff9b9 100644
--- a/xen/arch/x86/hypercall.c
+++ b/xen/arch/x86/hypercall.c
@@ -22,65 +22,6 @@
 #include <xen/hypercall.h>
 #include <asm/multicall.h>
 
-#ifdef CONFIG_COMPAT
-#define ARGS(x, n)                              \
-    [ __HYPERVISOR_ ## x ] = { n, n }
-#define COMP(x, n, c)                           \
-    [ __HYPERVISOR_ ## x ] = { n, c }
-#else
-#define ARGS(x, n)    [ __HYPERVISOR_ ## x ] = { n }
-#define COMP(x, n, c) ARGS(x, n)
-#endif
-
-const hypercall_args_t hypercall_args_table[NR_hypercalls] =
-{
-    ARGS(set_trap_table, 1),
-    ARGS(mmu_update, 4),
-    ARGS(set_gdt, 2),
-    ARGS(stack_switch, 2),
-    COMP(set_callbacks, 3, 4),
-    ARGS(fpu_taskswitch, 1),
-    ARGS(sched_op_compat, 2),
-    ARGS(platform_op, 1),
-    ARGS(set_debugreg, 2),
-    ARGS(get_debugreg, 1),
-    COMP(update_descriptor, 2, 4),
-    ARGS(memory_op, 2),
-    ARGS(multicall, 2),
-    COMP(update_va_mapping, 3, 4),
-    COMP(set_timer_op, 1, 2),
-    ARGS(event_channel_op_compat, 1),
-    ARGS(xen_version, 2),
-    ARGS(console_io, 3),
-    ARGS(physdev_op_compat, 1),
-    ARGS(grant_table_op, 3),
-    ARGS(vm_assist, 2),
-    COMP(update_va_mapping_otherdomain, 4, 5),
-    ARGS(vcpu_op, 3),
-    COMP(set_segment_base, 2, 0),
-    ARGS(mmuext_op, 4),
-    ARGS(xsm_op, 1),
-    ARGS(nmi_op, 2),
-    ARGS(sched_op, 2),
-    ARGS(callback_op, 2),
-    ARGS(xenoprof_op, 2),
-    ARGS(event_channel_op, 2),
-    ARGS(physdev_op, 2),
-    ARGS(sysctl, 1),
-    ARGS(domctl, 1),
-    ARGS(kexec_op, 2),
-    ARGS(argo_op, 5),
-    ARGS(xenpmu_op, 2),
-    ARGS(hvm_op, 2),
-    ARGS(dm_op, 3),
-    ARGS(hypfs_op, 5),
-    ARGS(mca, 1),
-    ARGS(paging_domctl_cont, 1),
-};
-
-#undef COMP
-#undef ARGS
-
 #define NEXT_ARG(fmt, args)                                                 \
 ({                                                                          \
     unsigned long __arg;                                                    \
diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
index 2d243b48bc..ab8bd12e60 100644
--- a/xen/arch/x86/include/asm/hypercall.h
+++ b/xen/arch/x86/include/asm/hypercall.h
@@ -17,19 +17,6 @@
 
 #define __HYPERVISOR_paging_domctl_cont __HYPERVISOR_arch_1
 
-typedef unsigned long hypercall_fn_t(
-    unsigned long, unsigned long, unsigned long,
-    unsigned long, unsigned long);
-
-typedef struct {
-    uint8_t native;
-#ifdef CONFIG_COMPAT
-    uint8_t compat;
-#endif
-} hypercall_args_t;
-
-extern const hypercall_args_t hypercall_args_table[NR_hypercalls];
-
 #ifdef CONFIG_PV
 void pv_hypercall(struct cpu_user_regs *regs);
 #endif
@@ -56,4 +43,46 @@ compat_common_vcpu_op(
 
 #endif /* CONFIG_COMPAT */
 
+#ifndef NDEBUG
+static inline unsigned int _get_nargs(const unsigned char *tbl, unsigned int c)
+{
+    return tbl[c];
+}
+#define get_nargs(t, c) _get_nargs(t, array_index_nospec(c, ARRAY_SIZE(t)))
+#else
+#define get_nargs(tbl, c) 0
+#endif
+
+static inline void clobber_regs(struct cpu_user_regs *regs,
+                                unsigned int nargs)
+{
+#ifndef NDEBUG
+    /* Deliberately corrupt used parameter regs. */
+    switch ( nargs )
+    {
+    case 5: regs->r8  = 0xdeadbeefdeadf00dUL; fallthrough;
+    case 4: regs->r10 = 0xdeadbeefdeadf00dUL; fallthrough;
+    case 3: regs->rdx = 0xdeadbeefdeadf00dUL; fallthrough;
+    case 2: regs->rsi = 0xdeadbeefdeadf00dUL; fallthrough;
+    case 1: regs->rdi = 0xdeadbeefdeadf00dUL;
+    }
+#endif
+}
+
+static inline void clobber_regs32(struct cpu_user_regs *regs,
+                                  unsigned int nargs)
+{
+#ifndef NDEBUG
+    /* Deliberately corrupt used parameter regs. */
+    switch ( nargs )
+    {
+    case 5: regs->edi = 0xdeadf00dU; fallthrough;
+    case 4: regs->esi = 0xdeadf00dU; fallthrough;
+    case 3: regs->edx = 0xdeadf00dU; fallthrough;
+    case 2: regs->ecx = 0xdeadf00dU; fallthrough;
+    case 1: regs->ebx = 0xdeadf00dU;
+    }
+#endif
+}
+
 #endif /* __ASM_X86_HYPERCALL_H__ */
diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
index fe8dfe9e8f..bf64bb41bb 100644
--- a/xen/arch/x86/pv/hypercall.c
+++ b/xen/arch/x86/pv/hypercall.c
@@ -27,119 +27,22 @@
 #include <asm/multicall.h>
 #include <irq_vectors.h>
 
-typedef struct {
-    hypercall_fn_t *native;
-#ifdef CONFIG_PV32
-    hypercall_fn_t *compat;
-#endif
-} pv_hypercall_table_t;
-
+#ifndef NDEBUG
+static const unsigned char hypercall_args_64[] = hypercall_args_pv64;
 #ifdef CONFIG_PV32
-#define HYPERCALL(x)                                                \
-    [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,         \
-                               (hypercall_fn_t *) do_ ## x }
-#define COMPAT_CALL(x)                                              \
-    [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,         \
-                               (hypercall_fn_t *) compat_ ## x }
-#else
-#define HYPERCALL(x)                                                \
-    [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x }
-#define COMPAT_CALL(x) HYPERCALL(x)
-#endif
-
-static const pv_hypercall_table_t pv_hypercall_table[] = {
-    COMPAT_CALL(set_trap_table),
-    HYPERCALL(mmu_update),
-    COMPAT_CALL(set_gdt),
-    HYPERCALL(stack_switch),
-    COMPAT_CALL(set_callbacks),
-    HYPERCALL(fpu_taskswitch),
-    HYPERCALL(sched_op_compat),
-#ifndef CONFIG_PV_SHIM_EXCLUSIVE
-    COMPAT_CALL(platform_op),
-#endif
-    HYPERCALL(set_debugreg),
-    HYPERCALL(get_debugreg),
-    COMPAT_CALL(update_descriptor),
-    COMPAT_CALL(memory_op),
-    COMPAT_CALL(multicall),
-    COMPAT_CALL(update_va_mapping),
-    COMPAT_CALL(set_timer_op),
-    HYPERCALL(event_channel_op_compat),
-    COMPAT_CALL(xen_version),
-    HYPERCALL(console_io),
-    COMPAT_CALL(physdev_op_compat),
-#if defined(CONFIG_GRANT_TABLE) || defined(CONFIG_PV_SHIM)
-    COMPAT_CALL(grant_table_op),
-#endif
-    HYPERCALL(vm_assist),
-    COMPAT_CALL(update_va_mapping_otherdomain),
-    COMPAT_CALL(iret),
-    COMPAT_CALL(vcpu_op),
-    HYPERCALL(set_segment_base),
-    COMPAT_CALL(mmuext_op),
-    COMPAT_CALL(xsm_op),
-    COMPAT_CALL(nmi_op),
-    COMPAT_CALL(sched_op),
-    COMPAT_CALL(callback_op),
-#ifdef CONFIG_XENOPROF
-    COMPAT_CALL(xenoprof_op),
-#endif
-    HYPERCALL(event_channel_op),
-    COMPAT_CALL(physdev_op),
-#ifndef CONFIG_PV_SHIM_EXCLUSIVE
-    HYPERCALL(sysctl),
-    HYPERCALL(domctl),
-#endif
-#ifdef CONFIG_KEXEC
-    COMPAT_CALL(kexec_op),
+static const unsigned char hypercall_args_32[] = hypercall_args_pv32;
 #endif
-#ifdef CONFIG_ARGO
-    COMPAT_CALL(argo_op),
 #endif
-    HYPERCALL(xenpmu_op),
-#ifdef CONFIG_HVM
-    HYPERCALL(hvm_op),
-    COMPAT_CALL(dm_op),
-#endif
-#ifdef CONFIG_HYPFS
-    HYPERCALL(hypfs_op),
-#endif
-    HYPERCALL(mca),
-#ifndef CONFIG_PV_SHIM_EXCLUSIVE
-    HYPERCALL(paging_domctl_cont),
-#endif
-};
-
-#undef COMPAT_CALL
-#undef HYPERCALL
 
 /* Forced inline to cause 'compat' to be evaluated at compile time. */
 static void always_inline
 _pv_hypercall(struct cpu_user_regs *regs, bool compat)
 {
     struct vcpu *curr = current;
-    unsigned long eax = compat ? regs->eax : regs->rax;
+    unsigned long eax;
 
     ASSERT(guest_kernel_mode(curr, regs));
 
-    BUILD_BUG_ON(ARRAY_SIZE(pv_hypercall_table) >
-                 ARRAY_SIZE(hypercall_args_table));
-
-    if ( eax >= ARRAY_SIZE(pv_hypercall_table) )
-    {
-        regs->rax = -ENOSYS;
-        return;
-    }
-
-    eax = array_index_nospec(eax, ARRAY_SIZE(pv_hypercall_table));
-
-    if ( !pv_hypercall_table[eax].native )
-    {
-        regs->rax = -ENOSYS;
-        return;
-    }
-
     curr->hcall_preempted = false;
 
     if ( !compat )
@@ -150,17 +53,8 @@ _pv_hypercall(struct cpu_user_regs *regs, bool compat)
         unsigned long r10 = regs->r10;
         unsigned long r8 = regs->r8;
 
-#ifndef NDEBUG
-        /* Deliberately corrupt parameter regs not used by this hypercall. */
-        switch ( hypercall_args_table[eax].native )
-        {
-        case 0: rdi = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 1: rsi = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 2: rdx = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 3: r10 = 0xdeadbeefdeadf00dUL; fallthrough;
-        case 4: r8 = 0xdeadbeefdeadf00dUL;
-        }
-#endif
+        eax = regs->rax;
+
         if ( unlikely(tb_init_done) )
         {
             unsigned long args[5] = { rdi, rsi, rdx, r10, r8 };
@@ -168,22 +62,10 @@ _pv_hypercall(struct cpu_user_regs *regs, bool compat)
             __trace_hypercall(TRC_PV_HYPERCALL_V2, eax, args);
         }
 
-        regs->rax = pv_hypercall_table[eax].native(rdi, rsi, rdx, r10, r8);
+        call_handlers_pv64(eax, regs->rax, rdi, rsi, rdx, r10, r8);
 
-#ifndef NDEBUG
-        if ( !curr->hcall_preempted )
-        {
-            /* Deliberately corrupt parameter regs used by this hypercall. */
-            switch ( hypercall_args_table[eax].native )
-            {
-            case 5: regs->r8  = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 4: regs->r10 = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 3: regs->rdx = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 2: regs->rsi = 0xdeadbeefdeadf00dUL; fallthrough;
-            case 1: regs->rdi = 0xdeadbeefdeadf00dUL;
-            }
-        }
-#endif
+        if ( !curr->hcall_preempted && regs->rax != -ENOSYS )
+            clobber_regs(regs, get_nargs(hypercall_args_64, eax));
     }
 #ifdef CONFIG_PV32
     else
@@ -194,17 +76,7 @@ _pv_hypercall(struct cpu_user_regs *regs, bool compat)
         unsigned int esi = regs->esi;
         unsigned int edi = regs->edi;
 
-#ifndef NDEBUG
-        /* Deliberately corrupt parameter regs not used by this hypercall. */
-        switch ( hypercall_args_table[eax].compat )
-        {
-        case 0: ebx = 0xdeadf00d; fallthrough;
-        case 1: ecx = 0xdeadf00d; fallthrough;
-        case 2: edx = 0xdeadf00d; fallthrough;
-        case 3: esi = 0xdeadf00d; fallthrough;
-        case 4: edi = 0xdeadf00d;
-        }
-#endif
+        eax = regs->eax;
 
         if ( unlikely(tb_init_done) )
         {
@@ -214,23 +86,11 @@ _pv_hypercall(struct cpu_user_regs *regs, bool compat)
         }
 
         curr->hcall_compat = true;
-        regs->eax = pv_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
+        call_handlers_pv32(eax, regs->eax, ebx, ecx, edx, esi, edi);
         curr->hcall_compat = false;
 
-#ifndef NDEBUG
-        if ( !curr->hcall_preempted )
-        {
-            /* Deliberately corrupt parameter regs used by this hypercall. */
-            switch ( hypercall_args_table[eax].compat )
-            {
-            case 5: regs->edi = 0xdeadf00d; fallthrough;
-            case 4: regs->esi = 0xdeadf00d; fallthrough;
-            case 3: regs->edx = 0xdeadf00d; fallthrough;
-            case 2: regs->ecx = 0xdeadf00d; fallthrough;
-            case 1: regs->ebx = 0xdeadf00d;
-            }
-        }
-#endif
+        if ( !curr->hcall_preempted && regs->eax != -ENOSYS )
+            clobber_regs32(regs, get_nargs(hypercall_args_32, eax));
     }
 #endif /* CONFIG_PV32 */
 
@@ -256,13 +116,8 @@ enum mc_disposition pv_do_multicall_call(struct mc_state *state)
         struct compat_multicall_entry *call = &state->compat_call;
 
         op = call->op;
-        if ( (op < ARRAY_SIZE(pv_hypercall_table)) &&
-             pv_hypercall_table[op].compat )
-            call->result = pv_hypercall_table[op].compat(
-                call->args[0], call->args[1], call->args[2],
-                call->args[3], call->args[4]);
-        else
-            call->result = -ENOSYS;
+        call_handlers_pv32(op, call->result, call->args[0], call->args[1],
+                           call->args[2], call->args[3], call->args[4]);
     }
     else
 #endif
@@ -270,13 +125,8 @@ enum mc_disposition pv_do_multicall_call(struct mc_state *state)
         struct multicall_entry *call = &state->call;
 
         op = call->op;
-        if ( (op < ARRAY_SIZE(pv_hypercall_table)) &&
-             pv_hypercall_table[op].native )
-            call->result = pv_hypercall_table[op].native(
-                call->args[0], call->args[1], call->args[2],
-                call->args[3], call->args[4]);
-        else
-            call->result = -ENOSYS;
+        call_handlers_pv64(op, call->result, call->args[0], call->args[1],
+                           call->args[2], call->args[3], call->args[4]);
     }
 
     return unlikely(op == __HYPERVISOR_iret)
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 8/9] xen/arm: call hypercall handlers via generated macro
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (6 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 7/9] xen/x86: call hypercall handlers via generated macro Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-03-24 14:01 ` [PATCH v6 9/9] xen/x86: remove cf_check attribute from hypercall handlers Juergen Gross
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Stefano Stabellini, Julien Grall,
	Bertrand Marquis, Volodymyr Babchuk, Julien Grall, Michal Orzel

Instead of using a function table use the generated macros for calling
the appropriate hypercall handlers.

This makes the calls of the handlers type safe.

For deprecated hypercalls define stub functions.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Tested-by: Michal Orzel <michal.orzel@arm.com>
---
V2:
- make hypercall_args[] const (Jan Beulich)
V5:
- move out-of-bounds check (Julien Grall)
---
 xen/arch/arm/traps.c | 117 +++++++++----------------------------------
 1 file changed, 24 insertions(+), 93 deletions(-)

diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
index e906bb4a89..e0fca3b4d8 100644
--- a/xen/arch/arm/traps.c
+++ b/xen/arch/arm/traps.c
@@ -1331,67 +1331,20 @@ static register_t do_deprecated_hypercall(void)
     return -ENOSYS;
 }
 
-typedef register_t (*arm_hypercall_fn_t)(
-    register_t, register_t, register_t, register_t, register_t);
-
-typedef struct {
-    arm_hypercall_fn_t fn;
-    int nr_args;
-} arm_hypercall_t;
-
-#define HYPERCALL(_name, _nr_args)                                   \
-    [ __HYPERVISOR_ ## _name ] =  {                                  \
-        .fn = (arm_hypercall_fn_t) &do_ ## _name,                    \
-        .nr_args = _nr_args,                                         \
-    }
+long dep_sched_op_compat(int cmd, unsigned long arg)
+{
+    return do_deprecated_hypercall();
+}
 
-#define HYPERCALL_ARM(_name, _nr_args)                        \
-    [ __HYPERVISOR_ ## _name ] =  {                                  \
-        .fn = (arm_hypercall_fn_t) &do_arm_ ## _name,                \
-        .nr_args = _nr_args,                                         \
-    }
-/*
- * Only use this for hypercalls which were deprecated (i.e. replaced
- * by something else) before Xen on ARM was created, i.e. *not* for
- * hypercalls which are simply not yet used on ARM.
- */
-#define HYPERCALL_DEPRECATED(_name, _nr_args)                   \
-    [ __HYPERVISOR_##_name ] = {                                \
-        .fn = (arm_hypercall_fn_t) &do_deprecated_hypercall,    \
-        .nr_args = _nr_args,                                    \
-    }
+long dep_event_channel_op_compat(XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop)
+{
+    return do_deprecated_hypercall();
+}
 
-static arm_hypercall_t arm_hypercall_table[] = {
-    HYPERCALL(memory_op, 2),
-    HYPERCALL(domctl, 1),
-    HYPERCALL(sched_op, 2),
-    HYPERCALL_DEPRECATED(sched_op_compat, 2),
-    HYPERCALL(console_io, 3),
-    HYPERCALL(xen_version, 2),
-    HYPERCALL(xsm_op, 1),
-    HYPERCALL(event_channel_op, 2),
-    HYPERCALL_DEPRECATED(event_channel_op_compat, 1),
-    HYPERCALL_ARM(physdev_op, 2),
-    HYPERCALL_DEPRECATED(physdev_op_compat, 1),
-    HYPERCALL(sysctl, 2),
-    HYPERCALL(hvm_op, 2),
-#ifdef CONFIG_GRANT_TABLE
-    HYPERCALL(grant_table_op, 3),
-#endif
-    HYPERCALL(multicall, 2),
-    HYPERCALL(platform_op, 1),
-    HYPERCALL(vcpu_op, 3),
-    HYPERCALL(vm_assist, 2),
-#ifdef CONFIG_ARGO
-    HYPERCALL(argo_op, 5),
-#endif
-#ifdef CONFIG_HYPFS
-    HYPERCALL(hypfs_op, 5),
-#endif
-#ifdef CONFIG_IOREQ_SERVER
-    HYPERCALL(dm_op, 3),
-#endif
-};
+long dep_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop)
+{
+    return do_deprecated_hypercall();
+}
 
 #ifndef NDEBUG
 static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code)
@@ -1430,7 +1383,6 @@ static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code)
 #define HYPERCALL_ARG3(r) (r)->x2
 #define HYPERCALL_ARG4(r) (r)->x3
 #define HYPERCALL_ARG5(r) (r)->x4
-#define HYPERCALL_ARGS(r) (r)->x0, (r)->x1, (r)->x2, (r)->x3, (r)->x4
 #else
 #define HYPERCALL_RESULT_REG(r) (r)->r0
 #define HYPERCALL_ARG1(r) (r)->r0
@@ -1438,52 +1390,40 @@ static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code)
 #define HYPERCALL_ARG3(r) (r)->r2
 #define HYPERCALL_ARG4(r) (r)->r3
 #define HYPERCALL_ARG5(r) (r)->r4
-#define HYPERCALL_ARGS(r) (r)->r0, (r)->r1, (r)->r2, (r)->r3, (r)->r4
 #endif
 
+static const unsigned char hypercall_args[] = hypercall_args_arm;
+
 static void do_trap_hypercall(struct cpu_user_regs *regs, register_t *nr,
                               const union hsr hsr)
 {
-    arm_hypercall_fn_t call = NULL;
     struct vcpu *curr = current;
 
-    BUILD_BUG_ON(NR_hypercalls < ARRAY_SIZE(arm_hypercall_table) );
-
     if ( hsr.iss != XEN_HYPERCALL_TAG )
     {
         gprintk(XENLOG_WARNING, "Invalid HVC imm 0x%x\n", hsr.iss);
         return inject_undef_exception(regs, hsr);
     }
 
-    if ( *nr >= ARRAY_SIZE(arm_hypercall_table) )
-    {
-        perfc_incr(invalid_hypercalls);
-        HYPERCALL_RESULT_REG(regs) = -ENOSYS;
-        return;
-    }
-
     curr->hcall_preempted = false;
 
     perfc_incra(hypercalls, *nr);
-    call = arm_hypercall_table[*nr].fn;
-    if ( call == NULL )
-    {
-        HYPERCALL_RESULT_REG(regs) = -ENOSYS;
-        return;
-    }
 
-    HYPERCALL_RESULT_REG(regs) = call(HYPERCALL_ARGS(regs));
+    call_handlers_arm(*nr, HYPERCALL_RESULT_REG(regs), HYPERCALL_ARG1(regs),
+                      HYPERCALL_ARG2(regs), HYPERCALL_ARG3(regs),
+                      HYPERCALL_ARG4(regs), HYPERCALL_ARG5(regs));
 
 #ifndef NDEBUG
-    if ( !curr->hcall_preempted )
+    if ( !curr->hcall_preempted && HYPERCALL_RESULT_REG(regs) != -ENOSYS )
     {
         /* Deliberately corrupt parameter regs used by this hypercall. */
-        switch ( arm_hypercall_table[*nr].nr_args ) {
+        switch ( hypercall_args[*nr] ) {
         case 5: HYPERCALL_ARG5(regs) = 0xDEADBEEF;
         case 4: HYPERCALL_ARG4(regs) = 0xDEADBEEF;
         case 3: HYPERCALL_ARG3(regs) = 0xDEADBEEF;
         case 2: HYPERCALL_ARG2(regs) = 0xDEADBEEF;
         case 1: /* Don't clobber x0/r0 -- it's the return value */
+        case 0: /* -ENOSYS case */
             break;
         default: BUG();
         }
@@ -1520,7 +1460,7 @@ static bool check_multicall_32bit_clean(struct multicall_entry *multi)
 {
     int i;
 
-    for ( i = 0; i < arm_hypercall_table[multi->op].nr_args; i++ )
+    for ( i = 0; i < hypercall_args[multi->op]; i++ )
     {
         if ( unlikely(multi->args[i] & 0xffffffff00000000ULL) )
         {
@@ -1537,16 +1477,8 @@ static bool check_multicall_32bit_clean(struct multicall_entry *multi)
 enum mc_disposition arch_do_multicall_call(struct mc_state *state)
 {
     struct multicall_entry *multi = &state->call;
-    arm_hypercall_fn_t call = NULL;
-
-    if ( multi->op >= ARRAY_SIZE(arm_hypercall_table) )
-    {
-        multi->result = -ENOSYS;
-        return mc_continue;
-    }
 
-    call = arm_hypercall_table[multi->op].fn;
-    if ( call == NULL )
+    if ( multi->op >= ARRAY_SIZE(hypercall_args) )
     {
         multi->result = -ENOSYS;
         return mc_continue;
@@ -1556,9 +1488,8 @@ enum mc_disposition arch_do_multicall_call(struct mc_state *state)
          !check_multicall_32bit_clean(multi) )
         return mc_continue;
 
-    multi->result = call(multi->args[0], multi->args[1],
-                         multi->args[2], multi->args[3],
-                         multi->args[4]);
+    call_handlers_arm(multi->op, multi->result, multi->args[0], multi->args[1],
+                      multi->args[2], multi->args[3], multi->args[4]);
 
     return likely(!regs_mode_is_user(guest_cpu_user_regs()))
            ? mc_continue : mc_preempt;
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v6 9/9] xen/x86: remove cf_check attribute from hypercall handlers
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (7 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 8/9] xen/arm: " Juergen Gross
@ 2022-03-24 14:01 ` Juergen Gross
  2022-04-08 10:36   ` Dario Faggioli
  2022-04-19  8:01 ` [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-03-24 14:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Juergen Gross, Jan Beulich, Andrew Cooper, Roger Pau Monné,
	Wei Liu, George Dunlap, Julien Grall, Stefano Stabellini,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith, Téo Couprie Diaz

Now that the hypercall handlers are all being called directly instead
through a function vector, the "cf_check" attribute can be removed.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Daniel P. Smith <dpsmith@apertussolutions.com> # xsm parts
Acked-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Téo Couprie Diaz <teo.coupriediaz@arm.com>
---
V4:
- new patch
---
 xen/arch/x86/compat.c               |  6 +++---
 xen/arch/x86/cpu/mcheck/mce.c       |  2 +-
 xen/arch/x86/cpu/vpmu.c             |  2 +-
 xen/arch/x86/domain.c               |  3 +--
 xen/arch/x86/hvm/dm.c               |  2 +-
 xen/arch/x86/hvm/hvm.c              |  2 +-
 xen/arch/x86/hvm/hypercall.c        |  6 +++---
 xen/arch/x86/mm.c                   | 12 ++++++------
 xen/arch/x86/mm/paging.c            |  2 +-
 xen/arch/x86/physdev.c              |  2 +-
 xen/arch/x86/platform_hypercall.c   |  2 +-
 xen/arch/x86/pv/callback.c          | 16 ++++++++--------
 xen/arch/x86/pv/descriptor-tables.c |  8 ++++----
 xen/arch/x86/pv/iret.c              |  4 ++--
 xen/arch/x86/pv/misc-hypercalls.c   | 10 +++++-----
 xen/arch/x86/pv/shim.c              |  4 ++--
 xen/arch/x86/x86_64/compat/mm.c     |  2 +-
 xen/arch/x86/x86_64/domain.c        |  2 +-
 xen/common/argo.c                   |  4 ++--
 xen/common/compat/grant_table.c     |  2 +-
 xen/common/compat/kernel.c          |  2 +-
 xen/common/compat/memory.c          |  3 +--
 xen/common/dm.c                     |  2 +-
 xen/common/domain.c                 |  2 +-
 xen/common/domctl.c                 |  2 +-
 xen/common/event_channel.c          |  2 +-
 xen/common/grant_table.c            |  3 +--
 xen/common/hypfs.c                  |  2 +-
 xen/common/kernel.c                 |  2 +-
 xen/common/kexec.c                  |  4 ++--
 xen/common/memory.c                 |  2 +-
 xen/common/multicall.c              |  3 +--
 xen/common/sched/compat.c           |  2 +-
 xen/common/sched/core.c             |  4 ++--
 xen/common/sysctl.c                 |  2 +-
 xen/common/xenoprof.c               |  2 +-
 xen/drivers/char/console.c          |  2 +-
 xen/scripts/gen_hypercall.awk       |  2 +-
 xen/xsm/xsm_core.c                  |  4 ++--
 39 files changed, 68 insertions(+), 72 deletions(-)

diff --git a/xen/arch/x86/compat.c b/xen/arch/x86/compat.c
index 28281a262a..a031062830 100644
--- a/xen/arch/x86/compat.c
+++ b/xen/arch/x86/compat.c
@@ -15,7 +15,7 @@ typedef long ret_t;
 #endif
 
 /* Legacy hypercall (as of 0x00030202). */
-ret_t cf_check do_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop)
+ret_t do_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop)
 {
     struct physdev_op op;
 
@@ -28,7 +28,7 @@ ret_t cf_check do_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop)
 #ifndef COMPAT
 
 /* Legacy hypercall (as of 0x00030101). */
-long cf_check do_sched_op_compat(int cmd, unsigned long arg)
+long do_sched_op_compat(int cmd, unsigned long arg)
 {
     switch ( cmd )
     {
@@ -50,7 +50,7 @@ long cf_check do_sched_op_compat(int cmd, unsigned long arg)
 }
 
 /* Legacy hypercall (as of 0x00030202). */
-long cf_check do_event_channel_op_compat(
+long do_event_channel_op_compat(
     XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop)
 {
     struct evtchn_op op;
diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c
index 275c54be7c..f68e31b643 100644
--- a/xen/arch/x86/cpu/mcheck/mce.c
+++ b/xen/arch/x86/cpu/mcheck/mce.c
@@ -1351,7 +1351,7 @@ CHECK_mcinfo_recovery;
 # endif /* CONFIG_COMPAT */
 
 /* Machine Check Architecture Hypercall */
-long cf_check do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc)
+long do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc)
 {
     long ret = 0;
     struct xen_mc curop, *op = &curop;
diff --git a/xen/arch/x86/cpu/vpmu.c b/xen/arch/x86/cpu/vpmu.c
index 51d171615f..d2c03a1104 100644
--- a/xen/arch/x86/cpu/vpmu.c
+++ b/xen/arch/x86/cpu/vpmu.c
@@ -672,7 +672,7 @@ void vpmu_dump(struct vcpu *v)
         alternative_vcall(vpmu_ops.arch_vpmu_dump, v);
 }
 
-long cf_check do_xenpmu_op(
+long do_xenpmu_op(
     unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg)
 {
     int ret;
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index d566fc82b4..ddf969f76e 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1489,8 +1489,7 @@ int arch_vcpu_reset(struct vcpu *v)
     return 0;
 }
 
-long cf_check do_vcpu_op(int cmd, unsigned int vcpuid,
-                         XEN_GUEST_HANDLE_PARAM(void) arg)
+long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     long rc = 0;
     struct domain *d = current->domain;
diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c
index d80975efcf..f8e6089870 100644
--- a/xen/arch/x86/hvm/dm.c
+++ b/xen/arch/x86/hvm/dm.c
@@ -654,7 +654,7 @@ CHECK_dm_op_relocate_memory;
 CHECK_dm_op_pin_memory_cacheattr;
 CHECK_dm_op_nr_vcpus;
 
-int cf_check compat_dm_op(
+int compat_dm_op(
     domid_t domid, unsigned int nr_bufs, XEN_GUEST_HANDLE_PARAM(void) bufs)
 {
     struct dmop_args args;
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 709a4191ef..9b3973dad8 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -5022,7 +5022,7 @@ static int hvmop_get_mem_type(
     return rc;
 }
 
-long cf_check do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
+long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     long rc = 0;
 
diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
index ae601185fc..29d1ca7a13 100644
--- a/xen/arch/x86/hvm/hypercall.c
+++ b/xen/arch/x86/hvm/hypercall.c
@@ -31,7 +31,7 @@
 #include <public/hvm/hvm_op.h>
 #include <public/hvm/params.h>
 
-long cf_check hvm_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long hvm_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     long rc;
 
@@ -51,7 +51,7 @@ long cf_check hvm_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 }
 
 #ifdef CONFIG_GRANT_TABLE
-long cf_check hvm_grant_table_op(
+long hvm_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
 {
     switch ( cmd )
@@ -77,7 +77,7 @@ long cf_check hvm_grant_table_op(
 }
 #endif
 
-long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     const struct vcpu *curr = current;
     const struct domain *currd = curr->domain;
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 6cc73187ac..a958142d17 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -3377,7 +3377,7 @@ static int vcpumask_to_pcpumask(
     }
 }
 
-long cf_check do_mmuext_op(
+long do_mmuext_op(
     XEN_GUEST_HANDLE_PARAM(mmuext_op_t) uops,
     unsigned int count,
     XEN_GUEST_HANDLE_PARAM(uint) pdone,
@@ -3916,7 +3916,7 @@ long cf_check do_mmuext_op(
     return rc;
 }
 
-long cf_check do_mmu_update(
+long do_mmu_update(
     XEN_GUEST_HANDLE_PARAM(mmu_update_t) ureqs,
     unsigned int count,
     XEN_GUEST_HANDLE_PARAM(uint) pdone,
@@ -4501,7 +4501,7 @@ static int __do_update_va_mapping(
     return rc;
 }
 
-long cf_check do_update_va_mapping(
+long do_update_va_mapping(
     unsigned long va, u64 val64, unsigned long flags)
 {
     int rc = __do_update_va_mapping(va, val64, flags, current->domain);
@@ -4513,7 +4513,7 @@ long cf_check do_update_va_mapping(
     return rc;
 }
 
-long cf_check do_update_va_mapping_otherdomain(
+long do_update_va_mapping_otherdomain(
     unsigned long va, u64 val64, unsigned long flags, domid_t domid)
 {
     struct domain *pg_owner;
@@ -4536,7 +4536,7 @@ long cf_check do_update_va_mapping_otherdomain(
 #endif /* CONFIG_PV */
 
 #ifdef CONFIG_PV32
-int cf_check compat_update_va_mapping(
+int compat_update_va_mapping(
     unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags)
 {
     int rc = __do_update_va_mapping(va, ((uint64_t)hi << 32) | lo,
@@ -4549,7 +4549,7 @@ int cf_check compat_update_va_mapping(
     return rc;
 }
 
-int cf_check compat_update_va_mapping_otherdomain(
+int compat_update_va_mapping_otherdomain(
     unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags,
     domid_t domid)
 {
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index a7e2707ecc..cb1bfcbde5 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -760,7 +760,7 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
         return shadow_domctl(d, sc, u_domctl);
 }
 
-long cf_check do_paging_domctl_cont(
+long do_paging_domctl_cont(
     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
 {
     struct xen_domctl op;
diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c
index 2ddcf44f33..ea38be8b79 100644
--- a/xen/arch/x86/physdev.c
+++ b/xen/arch/x86/physdev.c
@@ -174,7 +174,7 @@ int physdev_unmap_pirq(domid_t domid, int pirq)
 }
 #endif /* COMPAT */
 
-ret_t cf_check do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     int irq;
     ret_t ret;
diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
index eeb4f7a20e..a7341dc3d7 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -214,7 +214,7 @@ void cf_check resource_access(void *info)
 }
 #endif
 
-ret_t cf_check do_platform_op(
+ret_t do_platform_op(
     XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
 {
     ret_t ret;
diff --git a/xen/arch/x86/pv/callback.c b/xen/arch/x86/pv/callback.c
index 1be9d3f731..067ee3b795 100644
--- a/xen/arch/x86/pv/callback.c
+++ b/xen/arch/x86/pv/callback.c
@@ -140,7 +140,7 @@ static long unregister_guest_callback(struct callback_unregister *unreg)
     return ret;
 }
 
-long cf_check do_callback_op(int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg)
+long do_callback_op(int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg)
 {
     long ret;
 
@@ -178,7 +178,7 @@ long cf_check do_callback_op(int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg)
     return ret;
 }
 
-long cf_check do_set_callbacks(
+long do_set_callbacks(
     unsigned long event_address, unsigned long failsafe_address,
     unsigned long syscall_address)
 {
@@ -283,7 +283,7 @@ static int compat_unregister_guest_callback(
     return ret;
 }
 
-int cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
+int compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
 {
     int ret;
 
@@ -321,7 +321,7 @@ int cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
     return ret;
 }
 
-int cf_check compat_set_callbacks(
+int compat_set_callbacks(
     unsigned long event_selector, unsigned long event_address,
     unsigned long failsafe_selector, unsigned long failsafe_address)
 {
@@ -348,7 +348,7 @@ int cf_check compat_set_callbacks(
 
 #endif /* CONFIG_PV32 */
 
-long cf_check do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps)
+long do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps)
 {
     struct trap_info cur;
     struct vcpu *curr = current;
@@ -394,7 +394,7 @@ long cf_check do_set_trap_table(XEN_GUEST_HANDLE_PARAM(const_trap_info_t) traps)
 }
 
 #ifdef CONFIG_PV32
-int cf_check compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps)
+int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps)
 {
     struct vcpu *curr = current;
     struct compat_trap_info cur;
@@ -437,7 +437,7 @@ int cf_check compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps)
 }
 #endif
 
-long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     struct xennmi_callback cb;
     long rc = 0;
@@ -463,7 +463,7 @@ long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 }
 
 #ifdef CONFIG_PV32
-int cf_check compat_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+int compat_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     struct compat_nmi_callback cb;
     int rc = 0;
diff --git a/xen/arch/x86/pv/descriptor-tables.c b/xen/arch/x86/pv/descriptor-tables.c
index 653a61d0b5..b4135b450c 100644
--- a/xen/arch/x86/pv/descriptor-tables.c
+++ b/xen/arch/x86/pv/descriptor-tables.c
@@ -124,7 +124,7 @@ int pv_set_gdt(struct vcpu *v, const unsigned long frames[],
     return -EINVAL;
 }
 
-long cf_check do_set_gdt(
+long do_set_gdt(
     XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list, unsigned int entries)
 {
     unsigned int nr_frames = DIV_ROUND_UP(entries, 512);
@@ -151,7 +151,7 @@ long cf_check do_set_gdt(
 
 #ifdef CONFIG_PV32
 
-int cf_check compat_set_gdt(
+int compat_set_gdt(
     XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries)
 {
     struct vcpu *curr = current;
@@ -187,7 +187,7 @@ int cf_check compat_set_gdt(
     return ret;
 }
 
-int cf_check compat_update_descriptor(
+int compat_update_descriptor(
     uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi)
 {
     seg_desc_t d;
@@ -299,7 +299,7 @@ int validate_segdesc_page(struct page_info *page)
     return i == 512 ? 0 : -EINVAL;
 }
 
-long cf_check do_update_descriptor(uint64_t gaddr, seg_desc_t d)
+long do_update_descriptor(uint64_t gaddr, seg_desc_t d)
 {
     struct domain *currd = current->domain;
     gfn_t gfn = gaddr_to_gfn(gaddr);
diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
index 58de9f7922..316a23e77e 100644
--- a/xen/arch/x86/pv/iret.c
+++ b/xen/arch/x86/pv/iret.c
@@ -49,7 +49,7 @@ static void async_exception_cleanup(struct vcpu *curr)
         curr->arch.async_exception_state(trap).old_mask;
 }
 
-long cf_check do_iret(void)
+long do_iret(void)
 {
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct iret_context iret_saved;
@@ -106,7 +106,7 @@ long cf_check do_iret(void)
 }
 
 #ifdef CONFIG_PV32
-int cf_check compat_iret(void)
+int compat_iret(void)
 {
     struct cpu_user_regs *regs = guest_cpu_user_regs();
     struct vcpu *v = current;
diff --git a/xen/arch/x86/pv/misc-hypercalls.c b/xen/arch/x86/pv/misc-hypercalls.c
index 635f5a644a..aaaf70eb63 100644
--- a/xen/arch/x86/pv/misc-hypercalls.c
+++ b/xen/arch/x86/pv/misc-hypercalls.c
@@ -23,12 +23,12 @@
 
 #include <asm/debugreg.h>
 
-long cf_check do_set_debugreg(int reg, unsigned long value)
+long do_set_debugreg(int reg, unsigned long value)
 {
     return set_debugreg(current, reg, value);
 }
 
-long cf_check do_get_debugreg(int reg)
+long do_get_debugreg(int reg)
 {
     /* Avoid implementation defined behavior casting unsigned long to long. */
     union {
@@ -40,7 +40,7 @@ long cf_check do_get_debugreg(int reg)
     return res == X86EMUL_OKAY ? u.ret : -ENODEV;
 }
 
-long cf_check do_fpu_taskswitch(int set)
+long do_fpu_taskswitch(int set)
 {
     struct vcpu *v = current;
 
@@ -175,7 +175,7 @@ long set_debugreg(struct vcpu *v, unsigned int reg, unsigned long value)
     return 0;
 }
 
-long cf_check do_stack_switch(unsigned long ss, unsigned long esp)
+long do_stack_switch(unsigned long ss, unsigned long esp)
 {
     fixup_guest_stack_selector(current->domain, ss);
     current->arch.pv.kernel_ss = ss;
@@ -184,7 +184,7 @@ long cf_check do_stack_switch(unsigned long ss, unsigned long esp)
     return 0;
 }
 
-long cf_check do_set_segment_base(unsigned int which, unsigned long base)
+long do_set_segment_base(unsigned int which, unsigned long base)
 {
     struct vcpu *v = current;
     long ret = 0;
diff --git a/xen/arch/x86/pv/shim.c b/xen/arch/x86/pv/shim.c
index 2ee290a392..2b74fea181 100644
--- a/xen/arch/x86/pv/shim.c
+++ b/xen/arch/x86/pv/shim.c
@@ -824,7 +824,7 @@ long pv_shim_grant_table_op(unsigned int cmd,
 
 #ifndef CONFIG_GRANT_TABLE
 /* Thin wrapper(s) needed. */
-long cf_check do_grant_table_op(
+long do_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
 {
     if ( !pv_shim )
@@ -834,7 +834,7 @@ long cf_check do_grant_table_op(
 }
 
 #ifdef CONFIG_PV32
-int cf_check compat_grant_table_op(
+int compat_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
 {
     if ( !pv_shim )
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 70b08a832a..d54efaad21 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -177,7 +177,7 @@ int compat_arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 #ifdef CONFIG_PV
 DEFINE_XEN_GUEST_HANDLE(mmuext_op_compat_t);
 
-int cf_check compat_mmuext_op(
+int compat_mmuext_op(
     XEN_GUEST_HANDLE_PARAM(void) arg, unsigned int count,
     XEN_GUEST_HANDLE_PARAM(uint) pdone, unsigned int foreigndom)
 {
diff --git a/xen/arch/x86/x86_64/domain.c b/xen/arch/x86/x86_64/domain.c
index 9c559aa3ea..62fe51ee74 100644
--- a/xen/arch/x86/x86_64/domain.c
+++ b/xen/arch/x86/x86_64/domain.c
@@ -12,7 +12,7 @@
 CHECK_vcpu_get_physid;
 #undef xen_vcpu_get_physid
 
-int cf_check
+int
 compat_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     int rc;
diff --git a/xen/common/argo.c b/xen/common/argo.c
index 26a01c2188..748b8714d6 100644
--- a/xen/common/argo.c
+++ b/xen/common/argo.c
@@ -2069,7 +2069,7 @@ sendv(struct domain *src_d, xen_argo_addr_t *src_addr,
     return ( ret < 0 ) ? ret : len;
 }
 
-long cf_check
+long
 do_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
            XEN_GUEST_HANDLE_PARAM(void) arg2, unsigned long raw_arg3,
            unsigned long raw_arg4)
@@ -2207,7 +2207,7 @@ do_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
 }
 
 #ifdef CONFIG_COMPAT
-int cf_check
+int
 compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
                XEN_GUEST_HANDLE_PARAM(void) arg2, unsigned long arg3,
                unsigned long arg4)
diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c
index d5787e3719..4705ee5f76 100644
--- a/xen/common/compat/grant_table.c
+++ b/xen/common/compat/grant_table.c
@@ -56,7 +56,7 @@ CHECK_gnttab_swap_grant_ref;
 CHECK_gnttab_cache_flush;
 #undef xen_gnttab_cache_flush
 
-int cf_check compat_grant_table_op(
+int compat_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) cmp_uop, unsigned int count)
 {
     int rc = 0;
diff --git a/xen/common/compat/kernel.c b/xen/common/compat/kernel.c
index 8e8c413bf1..804b919bdc 100644
--- a/xen/common/compat/kernel.c
+++ b/xen/common/compat/kernel.c
@@ -37,7 +37,7 @@ CHECK_TYPE(capabilities_info);
 
 CHECK_TYPE(domain_handle);
 
-#define DO(fn) int cf_check compat_##fn
+#define DO(fn) int compat_##fn
 #define COMPAT
 
 #include "../kernel.c"
diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c
index 077ded4a75..ce1de1b307 100644
--- a/xen/common/compat/memory.c
+++ b/xen/common/compat/memory.c
@@ -53,8 +53,7 @@ static int cf_check get_reserved_device_memory(
 }
 #endif
 
-int cf_check compat_memory_op(
-    unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat)
+int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat)
 {
     struct vcpu *curr = current;
     struct domain *currd = curr->domain;
diff --git a/xen/common/dm.c b/xen/common/dm.c
index fcb3a1aa05..201b652deb 100644
--- a/xen/common/dm.c
+++ b/xen/common/dm.c
@@ -19,7 +19,7 @@
 #include <xen/hypercall.h>
 #include <xen/nospec.h>
 
-long cf_check do_dm_op(
+long do_dm_op(
     domid_t domid, unsigned int nr_bufs,
     XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs)
 {
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 70747c02e6..2f8efbb6d8 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1754,7 +1754,7 @@ long common_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
 }
 
 #ifdef arch_vm_assist_valid_mask
-long cf_check do_vm_assist(unsigned int cmd, unsigned int type)
+long do_vm_assist(unsigned int cmd, unsigned int type)
 {
     struct domain *currd = current->domain;
     const unsigned long valid = arch_vm_assist_valid_mask(currd);
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index 9606fa4f1a..879a2adcbe 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -274,7 +274,7 @@ static struct vnuma_info *vnuma_init(const struct xen_domctl_vnuma *uinfo,
     return ERR_PTR(ret);
 }
 
-long cf_check do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
+long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
 {
     long ret = 0;
     bool_t copyback = 0;
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index 0a82eb3ac2..5e2420fa12 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -1191,7 +1191,7 @@ static int evtchn_set_priority(const struct evtchn_set_priority *set_priority)
     return ret;
 }
 
-long cf_check do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long do_event_channel_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     int rc;
 
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index febbe12eab..c71d3ad24b 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -3559,8 +3559,7 @@ gnttab_cache_flush(XEN_GUEST_HANDLE_PARAM(gnttab_cache_flush_t) uop,
     return 0;
 }
 
-long cf_check
-do_grant_table_op(
+long do_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) uop, unsigned int count)
 {
     long rc;
diff --git a/xen/common/hypfs.c b/xen/common/hypfs.c
index 0d22396f5d..acd258edf2 100644
--- a/xen/common/hypfs.c
+++ b/xen/common/hypfs.c
@@ -670,7 +670,7 @@ static int hypfs_write(struct hypfs_entry *entry,
     return entry->funcs->write(l, uaddr, ulen);
 }
 
-long cf_check do_hypfs_op(
+long do_hypfs_op(
     unsigned int cmd, XEN_GUEST_HANDLE_PARAM(const_char) arg1,
     unsigned long arg2, XEN_GUEST_HANDLE_PARAM(void) arg3, unsigned long arg4)
 {
diff --git a/xen/common/kernel.c b/xen/common/kernel.c
index adff2d2c77..08bdae082a 100644
--- a/xen/common/kernel.c
+++ b/xen/common/kernel.c
@@ -451,7 +451,7 @@ static int __init cf_check param_init(void)
 __initcall(param_init);
 #endif
 
-# define DO(fn) long cf_check do_##fn
+# define DO(fn) long do_##fn
 
 #endif
 
diff --git a/xen/common/kexec.c b/xen/common/kexec.c
index 41669964d2..7095651605 100644
--- a/xen/common/kexec.c
+++ b/xen/common/kexec.c
@@ -1265,13 +1265,13 @@ static int do_kexec_op_internal(unsigned int op,
     return ret;
 }
 
-long cf_check do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
+long do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
 {
     return do_kexec_op_internal(op, uarg, 0);
 }
 
 #ifdef CONFIG_COMPAT
-int cf_check compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
+int compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
 {
     return do_kexec_op_internal(op, uarg, 1);
 }
diff --git a/xen/common/memory.c b/xen/common/memory.c
index 69b0cd1e50..963f4df1b6 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -1367,7 +1367,7 @@ static int acquire_resource(
     return rc;
 }
 
-long cf_check do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     struct domain *d, *curr_d = current->domain;
     long rc;
diff --git a/xen/common/multicall.c b/xen/common/multicall.c
index 9db49092b4..1f0cc4cb26 100644
--- a/xen/common/multicall.c
+++ b/xen/common/multicall.c
@@ -33,8 +33,7 @@ static void trace_multicall_call(multicall_entry_t *call)
     __trace_multicall_call(call);
 }
 
-ret_t cf_check
-do_multicall(
+ret_t do_multicall(
     XEN_GUEST_HANDLE_PARAM(multicall_entry_t) call_list, uint32_t nr_calls)
 {
     struct vcpu *curr = current;
diff --git a/xen/common/sched/compat.c b/xen/common/sched/compat.c
index 66ba0fe88f..040b4caca2 100644
--- a/xen/common/sched/compat.c
+++ b/xen/common/sched/compat.c
@@ -39,7 +39,7 @@ static int compat_poll(struct compat_sched_poll *compat)
 
 #include "core.c"
 
-int cf_check compat_set_timer_op(u32 lo, s32 hi)
+int compat_set_timer_op(u32 lo, s32 hi)
 {
     return do_set_timer_op(((s64)hi << 32) | lo);
 }
diff --git a/xen/common/sched/core.c b/xen/common/sched/core.c
index 19ab678181..25885b5640 100644
--- a/xen/common/sched/core.c
+++ b/xen/common/sched/core.c
@@ -1862,7 +1862,7 @@ typedef long ret_t;
 
 #endif /* !COMPAT */
 
-ret_t cf_check do_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
+ret_t do_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     ret_t ret = 0;
 
@@ -1999,7 +1999,7 @@ ret_t cf_check do_sched_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
 #ifndef COMPAT
 
 /* Per-vcpu oneshot-timer hypercall. */
-long cf_check do_set_timer_op(s_time_t timeout)
+long do_set_timer_op(s_time_t timeout)
 {
     struct vcpu *v = current;
     s_time_t offset = timeout - NOW();
diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c
index fc4a0b31d6..1ad3c29351 100644
--- a/xen/common/sysctl.c
+++ b/xen/common/sysctl.c
@@ -29,7 +29,7 @@
 #include <xen/livepatch.h>
 #include <xen/coverage.h>
 
-long cf_check do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
+long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
 {
     long ret = 0;
     int copyback = -1;
diff --git a/xen/common/xenoprof.c b/xen/common/xenoprof.c
index af617f1d0b..1926a92fe4 100644
--- a/xen/common/xenoprof.c
+++ b/xen/common/xenoprof.c
@@ -721,7 +721,7 @@ static int xenoprof_op_get_buffer(XEN_GUEST_HANDLE_PARAM(void) arg)
                       || (op == XENOPROF_disable_virq)  \
                       || (op == XENOPROF_get_buffer))
  
-ret_t cf_check do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
+ret_t do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
 {
     int ret = 0;
     
diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c
index d9d6556c22..c53fe30313 100644
--- a/xen/drivers/char/console.c
+++ b/xen/drivers/char/console.c
@@ -675,7 +675,7 @@ static long guest_console_write(XEN_GUEST_HANDLE_PARAM(char) buffer,
     return 0;
 }
 
-long cf_check do_console_io(
+long do_console_io(
     unsigned int cmd, unsigned int count, XEN_GUEST_HANDLE_PARAM(char) buffer)
 {
     long rc;
diff --git a/xen/scripts/gen_hypercall.awk b/xen/scripts/gen_hypercall.awk
index 403758be21..34840c514f 100644
--- a/xen/scripts/gen_hypercall.awk
+++ b/xen/scripts/gen_hypercall.awk
@@ -226,7 +226,7 @@ END {
     # Generate prototypes
     for (i = 1; i <= n; i++) {
         for (p = 1; p <= n_pre[i]; p++) {
-            printf("%s cf_check %s_%s(", rettype[pre[i, p]], pre[i, p], fn[i]);
+            printf("%s %s_%s(", rettype[pre[i, p]], pre[i, p], fn[i]);
             if (n_args[i] == 0)
                 printf("void");
             else
diff --git a/xen/xsm/xsm_core.c b/xen/xsm/xsm_core.c
index 2286a502e3..eaa028109b 100644
--- a/xen/xsm/xsm_core.c
+++ b/xen/xsm/xsm_core.c
@@ -219,13 +219,13 @@ bool __init has_xsm_magic(paddr_t start)
 
 #endif
 
-long cf_check do_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op)
+long do_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op)
 {
     return xsm_do_xsm_op(op);
 }
 
 #ifdef CONFIG_COMPAT
-int cf_check compat_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op)
+int compat_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op)
 {
     return xsm_do_compat_op(op);
 }
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 9/9] xen/x86: remove cf_check attribute from hypercall handlers
  2022-03-24 14:01 ` [PATCH v6 9/9] xen/x86: remove cf_check attribute from hypercall handlers Juergen Gross
@ 2022-04-08 10:36   ` Dario Faggioli
  0 siblings, 0 replies; 34+ messages in thread
From: Dario Faggioli @ 2022-04-08 10:36 UTC (permalink / raw)
  To: Juergen Gross, xen-devel
  Cc: Jan Beulich, julien, wl, roger.pau, sstabellini,
	christopher.w.clark, george.dunlap, dgdegra, andrew.cooper3,
	dpsmith, teo.coupriediaz

[-- Attachment #1: Type: text/plain, Size: 767 bytes --]

On Thu, 2022-03-24 at 15:01 +0100, Juergen Gross wrote:
> Now that the hypercall handlers are all being called directly instead
> through a function vector, the "cf_check" attribute can be removed.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> Reviewed-by: Daniel P. Smith <dpsmith@apertussolutions.com> # xsm
> parts
> Acked-by: Jan Beulich <jbeulich@suse.com>
> Tested-by: Téo Couprie Diaz <teo.coupriediaz@arm.com>
>
Acked-by: Dario Faggioli <dfaggioli@suse.com>

Regards
-- 
Dario Faggioli, Ph.D
http://about.me/dario.faggioli
Virtualization Software Engineer
SUSE Labs, SUSE https://www.suse.com/
-------------------------------------------------------------------
<<This happens because _I_ choose it to happen!>> (Raistlin Majere)

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (8 preceding siblings ...)
  2022-03-24 14:01 ` [PATCH v6 9/9] xen/x86: remove cf_check attribute from hypercall handlers Juergen Gross
@ 2022-04-19  8:01 ` Juergen Gross
  2022-05-04  7:53   ` Juergen Gross
  2022-07-06  7:30 ` Henry Wang
  2022-07-07 16:10 ` ***PING***: " Jan Beulich
  11 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-04-19  8:01 UTC (permalink / raw)
  To: xen-devel
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith


[-- Attachment #1.1.1: Type: text/plain, Size: 1258 bytes --]

On 24.03.22 15:01, Juergen Gross wrote:
> In order to avoid indirect function calls on the hypercall path as
> much as possible this series is removing the hypercall function tables
> and is replacing the hypercall handler calls via the function array
> by automatically generated call macros.
> 
> Another by-product of generating the call macros is the automatic
> generating of the hypercall handler prototypes from the same data base
> which is used to generate the macros.
> 
> This has the additional advantage of using type safe calls of the
> handlers and to ensure related handler (e.g. PV and HVM ones) share
> the same prototypes.
> 
> A very brief performance test (parallel build of the Xen hypervisor
> in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
> the performance with the patches applied. The test was performed using
> a PV and a PVH guest.

A gentle ping regarding this series.

I think patch 1 still lacks an Ack from x86 side. Other than that
patches 1, 2 and 4 should be fine to go in, as they are cleanups which
are fine on their own IMHO.

Andrew, you wanted to get some performance numbers of the series using
the Citrix test environment. Any news on the progress here?


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-04-19  8:01 ` [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
@ 2022-05-04  7:53   ` Juergen Gross
  2022-05-18  9:45     ` Juergen Gross
  0 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-05-04  7:53 UTC (permalink / raw)
  To: xen-devel, Andrew Cooper
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Jan Beulich, Wei Liu,
	Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith


[-- Attachment #1.1.1: Type: text/plain, Size: 1442 bytes --]

On 19.04.22 10:01, Juergen Gross wrote:
> On 24.03.22 15:01, Juergen Gross wrote:
>> In order to avoid indirect function calls on the hypercall path as
>> much as possible this series is removing the hypercall function tables
>> and is replacing the hypercall handler calls via the function array
>> by automatically generated call macros.
>>
>> Another by-product of generating the call macros is the automatic
>> generating of the hypercall handler prototypes from the same data base
>> which is used to generate the macros.
>>
>> This has the additional advantage of using type safe calls of the
>> handlers and to ensure related handler (e.g. PV and HVM ones) share
>> the same prototypes.
>>
>> A very brief performance test (parallel build of the Xen hypervisor
>> in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
>> the performance with the patches applied. The test was performed using
>> a PV and a PVH guest.
> 
> A gentle ping regarding this series.
> 
> I think patch 1 still lacks an Ack from x86 side. Other than that
> patches 1, 2 and 4 should be fine to go in, as they are cleanups which
> are fine on their own IMHO.
> 
> Andrew, you wanted to get some performance numbers of the series using
> the Citrix test environment. Any news on the progress here?

And another ping.

Andrew, could you please give some feedback regarding performance
testing progress?


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-05-04  7:53   ` Juergen Gross
@ 2022-05-18  9:45     ` Juergen Gross
  2022-05-18  9:50       ` Jan Beulich
                         ` (2 more replies)
  0 siblings, 3 replies; 34+ messages in thread
From: Juergen Gross @ 2022-05-18  9:45 UTC (permalink / raw)
  To: xen-devel, Andrew Cooper
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Jan Beulich, Wei Liu,
	Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith


[-- Attachment #1.1.1: Type: text/plain, Size: 1740 bytes --]

On 04.05.22 09:53, Juergen Gross wrote:
> On 19.04.22 10:01, Juergen Gross wrote:
>> On 24.03.22 15:01, Juergen Gross wrote:
>>> In order to avoid indirect function calls on the hypercall path as
>>> much as possible this series is removing the hypercall function tables
>>> and is replacing the hypercall handler calls via the function array
>>> by automatically generated call macros.
>>>
>>> Another by-product of generating the call macros is the automatic
>>> generating of the hypercall handler prototypes from the same data base
>>> which is used to generate the macros.
>>>
>>> This has the additional advantage of using type safe calls of the
>>> handlers and to ensure related handler (e.g. PV and HVM ones) share
>>> the same prototypes.
>>>
>>> A very brief performance test (parallel build of the Xen hypervisor
>>> in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
>>> the performance with the patches applied. The test was performed using
>>> a PV and a PVH guest.
>>
>> A gentle ping regarding this series.
>>
>> I think patch 1 still lacks an Ack from x86 side. Other than that
>> patches 1, 2 and 4 should be fine to go in, as they are cleanups which
>> are fine on their own IMHO.
>>
>> Andrew, you wanted to get some performance numbers of the series using
>> the Citrix test environment. Any news on the progress here?
> 
> And another ping.
> 
> Andrew, could you please give some feedback regarding performance
> testing progress?

This is becoming ridiculous. Andrew, I know you are busy, but not reacting
at all to explicit questions is kind of annoying.

BTW, the question regarding patches 1, 2 and 4 to go in as being cleanups
still stands.


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-05-18  9:45     ` Juergen Gross
@ 2022-05-18  9:50       ` Jan Beulich
  2022-06-07  5:05       ` Juergen Gross
  2022-06-23 13:07       ` Juergen Gross
  2 siblings, 0 replies; 34+ messages in thread
From: Jan Beulich @ 2022-05-18  9:50 UTC (permalink / raw)
  To: Juergen Gross
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Wei Liu, Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith, xen-devel, Andrew Cooper

On 18.05.2022 11:45, Juergen Gross wrote:
> BTW, the question regarding patches 1, 2 and 4 to go in as being cleanups
> still stands.

I would long have committed these (without waiting for Andrew), but patch 1
continues to lack an x86 side ack (which, as indicated before, I'm not
happy to provide, while I also don't mean to nak the change). From an
earlier attempt I also seem to recall that patches 2 and 4 can't go in
ahead of patch 1.

Jan



^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
@ 2022-06-07  5:00   ` Juergen Gross
  2022-06-27 10:28   ` Roger Pau Monné
  2022-06-27 13:00   ` Roger Pau Monné
  2 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-06-07  5:00 UTC (permalink / raw)
  To: xen-devel, Andrew Cooper, Roger Pau Monné
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Jan Beulich, Wei Liu,
	Julien Grall


[-- Attachment #1.1.1: Type: text/plain, Size: 9086 bytes --]

On 24.03.22 15:01, Juergen Gross wrote:
> The entry point used for the vcpu_op hypercall on Arm is different
> from the one on x86 today, as some of the common sub-ops are not
> supported on Arm. The Arm specific handler filters out the not
> supported sub-ops and then calls the common handler. This leads to the
> weird call hierarchy:
> 
>    do_arm_vcpu_op()
>      do_vcpu_op()
>        arch_do_vcpu_op()
> 
> Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
> arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
> of above calls can be avoided without restricting any potential
> future use of common sub-ops for Arm.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> Reviewed-by: Julien Grall <jgrall@amazon.com>

There is still an Ack missing for x86 side. Jan already said he isn't
happy to give one, but won't Nack it. Roger, Andrew, any comments for
this patch? It is blocking further cleanup patches to go in (patches
2 and 4 of this series).


Juergen

> ---
> V4:
> - don't remove HYPERCALL_ARM()
> V4.1:
> - add missing cf_check (Andrew Cooper)
> V5:
> - use v instead of current (Julien Grall)
> ---
>   xen/arch/arm/domain.c                | 15 ++++++++-------
>   xen/arch/arm/include/asm/hypercall.h |  2 --
>   xen/arch/arm/traps.c                 |  2 +-
>   xen/arch/x86/domain.c                | 12 ++++++++----
>   xen/arch/x86/include/asm/hypercall.h |  2 +-
>   xen/arch/x86/x86_64/domain.c         | 18 +++++++++++++-----
>   xen/common/compat/domain.c           | 15 ++++++---------
>   xen/common/domain.c                  | 12 ++++--------
>   xen/include/xen/hypercall.h          |  2 +-
>   9 files changed, 42 insertions(+), 38 deletions(-)
> 
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index 8110c1df86..2f8eaab7b5 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -1079,23 +1079,24 @@ void arch_dump_domain_info(struct domain *d)
>   }
>   
>   
> -long do_arm_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
> +long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
>   {
> +    struct domain *d = current->domain;
> +    struct vcpu *v;
> +
> +    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
> +        return -ENOENT;
> +
>       switch ( cmd )
>       {
>           case VCPUOP_register_vcpu_info:
>           case VCPUOP_register_runstate_memory_area:
> -            return do_vcpu_op(cmd, vcpuid, arg);
> +            return common_vcpu_op(cmd, v, arg);
>           default:
>               return -EINVAL;
>       }
>   }
>   
> -long arch_do_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
> -{
> -    return -ENOSYS;
> -}
> -
>   void arch_dump_vcpu_info(struct vcpu *v)
>   {
>       gic_dump_info(v);
> diff --git a/xen/arch/arm/include/asm/hypercall.h b/xen/arch/arm/include/asm/hypercall.h
> index 39d2e7889d..fac4d60f17 100644
> --- a/xen/arch/arm/include/asm/hypercall.h
> +++ b/xen/arch/arm/include/asm/hypercall.h
> @@ -4,8 +4,6 @@
>   #include <public/domctl.h> /* for arch_do_domctl */
>   int do_arm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
>   
> -long do_arm_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg);
> -
>   long subarch_do_domctl(struct xen_domctl *domctl, struct domain *d,
>                          XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
>   
> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
> index 43f30747cf..e906bb4a89 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -1380,7 +1380,7 @@ static arm_hypercall_t arm_hypercall_table[] = {
>   #endif
>       HYPERCALL(multicall, 2),
>       HYPERCALL(platform_op, 1),
> -    HYPERCALL_ARM(vcpu_op, 3),
> +    HYPERCALL(vcpu_op, 3),
>       HYPERCALL(vm_assist, 2),
>   #ifdef CONFIG_ARGO
>       HYPERCALL(argo_op, 5),
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index a5048ed654..d566fc82b4 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1489,11 +1489,15 @@ int arch_vcpu_reset(struct vcpu *v)
>       return 0;
>   }
>   
> -long
> -arch_do_vcpu_op(
> -    int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
> +long cf_check do_vcpu_op(int cmd, unsigned int vcpuid,
> +                         XEN_GUEST_HANDLE_PARAM(void) arg)
>   {
>       long rc = 0;
> +    struct domain *d = current->domain;
> +    struct vcpu *v;
> +
> +    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
> +        return -ENOENT;
>   
>       switch ( cmd )
>       {
> @@ -1545,7 +1549,7 @@ arch_do_vcpu_op(
>       }
>   
>       default:
> -        rc = -ENOSYS;
> +        rc = common_vcpu_op(cmd, v, arg);
>           break;
>       }
>   
> diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
> index 61bf897147..d6daa7e4cb 100644
> --- a/xen/arch/x86/include/asm/hypercall.h
> +++ b/xen/arch/x86/include/asm/hypercall.h
> @@ -145,7 +145,7 @@ compat_physdev_op(
>       XEN_GUEST_HANDLE_PARAM(void) arg);
>   
>   extern int
> -arch_compat_vcpu_op(
> +compat_common_vcpu_op(
>       int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
>   
>   extern int cf_check compat_mmuext_op(
> diff --git a/xen/arch/x86/x86_64/domain.c b/xen/arch/x86/x86_64/domain.c
> index c46dccc25a..9c559aa3ea 100644
> --- a/xen/arch/x86/x86_64/domain.c
> +++ b/xen/arch/x86/x86_64/domain.c
> @@ -12,11 +12,15 @@
>   CHECK_vcpu_get_physid;
>   #undef xen_vcpu_get_physid
>   
> -int
> -arch_compat_vcpu_op(
> -    int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
> +int cf_check
> +compat_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
>   {
> -    int rc = -ENOSYS;
> +    int rc;
> +    struct domain *d = current->domain;
> +    struct vcpu *v;
> +
> +    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
> +        return -ENOENT;
>   
>       switch ( cmd )
>       {
> @@ -55,7 +59,11 @@ arch_compat_vcpu_op(
>       }
>   
>       case VCPUOP_get_physid:
> -        rc = arch_do_vcpu_op(cmd, v, arg);
> +        rc = do_vcpu_op(cmd, vcpuid, arg);
> +        break;
> +
> +    default:
> +        rc = compat_common_vcpu_op(cmd, v, arg);
>           break;
>       }
>   
> diff --git a/xen/common/compat/domain.c b/xen/common/compat/domain.c
> index afae27eeba..1119534679 100644
> --- a/xen/common/compat/domain.c
> +++ b/xen/common/compat/domain.c
> @@ -38,15 +38,12 @@ CHECK_vcpu_hvm_context;
>   
>   #endif
>   
> -int cf_check compat_vcpu_op(
> -    int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
> +int compat_common_vcpu_op(int cmd, struct vcpu *v,
> +                          XEN_GUEST_HANDLE_PARAM(void) arg)
>   {
> -    struct domain *d = current->domain;
> -    struct vcpu *v;
>       int rc = 0;
> -
> -    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
> -        return -ENOENT;
> +    struct domain *d = current->domain;
> +    unsigned int vcpuid = v->vcpu_id;
>   
>       switch ( cmd )
>       {
> @@ -103,7 +100,7 @@ int cf_check compat_vcpu_op(
>       case VCPUOP_stop_singleshot_timer:
>       case VCPUOP_register_vcpu_info:
>       case VCPUOP_send_nmi:
> -        rc = do_vcpu_op(cmd, vcpuid, arg);
> +        rc = common_vcpu_op(cmd, v, arg);
>           break;
>   
>       case VCPUOP_get_runstate_info:
> @@ -134,7 +131,7 @@ int cf_check compat_vcpu_op(
>       }
>   
>       default:
> -        rc = arch_compat_vcpu_op(cmd, v, arg);
> +        rc = -ENOSYS;
>           break;
>       }
>   
> diff --git a/xen/common/domain.c b/xen/common/domain.c
> index 351029f8b2..70747c02e6 100644
> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -1570,15 +1570,11 @@ int default_initialise_vcpu(struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
>       return rc;
>   }
>   
> -long cf_check do_vcpu_op(
> -    int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
> +long common_vcpu_op(int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg)
>   {
> -    struct domain *d = current->domain;
> -    struct vcpu *v;
>       long rc = 0;
> -
> -    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
> -        return -ENOENT;
> +    struct domain *d = v->domain;
> +    unsigned int vcpuid = v->vcpu_id;
>   
>       switch ( cmd )
>       {
> @@ -1750,7 +1746,7 @@ long cf_check do_vcpu_op(
>       }
>   
>       default:
> -        rc = arch_do_vcpu_op(cmd, v, arg);
> +        rc = -ENOSYS;
>           break;
>       }
>   
> diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
> index a1b6575976..81aae7a662 100644
> --- a/xen/include/xen/hypercall.h
> +++ b/xen/include/xen/hypercall.h
> @@ -110,7 +110,7 @@ do_vcpu_op(
>   
>   struct vcpu;
>   extern long
> -arch_do_vcpu_op(int cmd,
> +common_vcpu_op(int cmd,
>       struct vcpu *v,
>       XEN_GUEST_HANDLE_PARAM(void) arg);
>   


[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-05-18  9:45     ` Juergen Gross
  2022-05-18  9:50       ` Jan Beulich
@ 2022-06-07  5:05       ` Juergen Gross
  2022-06-23 13:07       ` Juergen Gross
  2 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-06-07  5:05 UTC (permalink / raw)
  To: xen-devel, Andrew Cooper
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Jan Beulich, Wei Liu,
	Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith


[-- Attachment #1.1.1: Type: text/plain, Size: 1849 bytes --]

On 18.05.22 11:45, Juergen Gross wrote:
> On 04.05.22 09:53, Juergen Gross wrote:
>> On 19.04.22 10:01, Juergen Gross wrote:
>>> On 24.03.22 15:01, Juergen Gross wrote:
>>>> In order to avoid indirect function calls on the hypercall path as
>>>> much as possible this series is removing the hypercall function tables
>>>> and is replacing the hypercall handler calls via the function array
>>>> by automatically generated call macros.
>>>>
>>>> Another by-product of generating the call macros is the automatic
>>>> generating of the hypercall handler prototypes from the same data base
>>>> which is used to generate the macros.
>>>>
>>>> This has the additional advantage of using type safe calls of the
>>>> handlers and to ensure related handler (e.g. PV and HVM ones) share
>>>> the same prototypes.
>>>>
>>>> A very brief performance test (parallel build of the Xen hypervisor
>>>> in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
>>>> the performance with the patches applied. The test was performed using
>>>> a PV and a PVH guest.
>>>
>>> A gentle ping regarding this series.
>>>
>>> I think patch 1 still lacks an Ack from x86 side. Other than that
>>> patches 1, 2 and 4 should be fine to go in, as they are cleanups which
>>> are fine on their own IMHO.
>>>
>>> Andrew, you wanted to get some performance numbers of the series using
>>> the Citrix test environment. Any news on the progress here?
>>
>> And another ping.
>>
>> Andrew, could you please give some feedback regarding performance
>> testing progress?
> 
> This is becoming ridiculous. Andrew, I know you are busy, but not reacting
> at all to explicit questions is kind of annoying.

  ____ ___ _   _  ____
|  _ \_ _| \ | |/ ___|
| |_) | ||  \| | |  _
|  __/| || |\  | |_| |
|_|  |___|_| \_|\____|


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-05-18  9:45     ` Juergen Gross
  2022-05-18  9:50       ` Jan Beulich
  2022-06-07  5:05       ` Juergen Gross
@ 2022-06-23 13:07       ` Juergen Gross
  2 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-06-23 13:07 UTC (permalink / raw)
  To: xen-devel, Andrew Cooper
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Jan Beulich, Wei Liu,
	Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith


[-- Attachment #1.1.1: Type: text/plain, Size: 1850 bytes --]

On 18.05.22 11:45, Juergen Gross wrote:
> On 04.05.22 09:53, Juergen Gross wrote:
>> On 19.04.22 10:01, Juergen Gross wrote:
>>> On 24.03.22 15:01, Juergen Gross wrote:
>>>> In order to avoid indirect function calls on the hypercall path as
>>>> much as possible this series is removing the hypercall function tables
>>>> and is replacing the hypercall handler calls via the function array
>>>> by automatically generated call macros.
>>>>
>>>> Another by-product of generating the call macros is the automatic
>>>> generating of the hypercall handler prototypes from the same data base
>>>> which is used to generate the macros.
>>>>
>>>> This has the additional advantage of using type safe calls of the
>>>> handlers and to ensure related handler (e.g. PV and HVM ones) share
>>>> the same prototypes.
>>>>
>>>> A very brief performance test (parallel build of the Xen hypervisor
>>>> in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
>>>> the performance with the patches applied. The test was performed using
>>>> a PV and a PVH guest.
>>>
>>> A gentle ping regarding this series.
>>>
>>> I think patch 1 still lacks an Ack from x86 side. Other than that
>>> patches 1, 2 and 4 should be fine to go in, as they are cleanups which
>>> are fine on their own IMHO.
>>>
>>> Andrew, you wanted to get some performance numbers of the series using
>>> the Citrix test environment. Any news on the progress here?
>>
>> And another ping.
>>
>> Andrew, could you please give some feedback regarding performance
>> testing progress?
> 
> This is becoming ridiculous. Andrew, I know you are busy, but not reacting
> at all to explicit questions is kind of annoying.

   ____ ___ _   _  ____
|  _ \_ _| \ | |/ ___|
| |_) | ||  \| | |  _
|  __/| || |\  | |_| |
|_|  |___|_| \_|\____|


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3151 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
  2022-06-07  5:00   ` Juergen Gross
@ 2022-06-27 10:28   ` Roger Pau Monné
  2022-06-27 10:40     ` Juergen Gross
  2022-06-27 13:00   ` Roger Pau Monné
  2 siblings, 1 reply; 34+ messages in thread
From: Roger Pau Monné @ 2022-06-27 10:28 UTC (permalink / raw)
  To: Juergen Gross
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall

On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
> The entry point used for the vcpu_op hypercall on Arm is different
> from the one on x86 today, as some of the common sub-ops are not
> supported on Arm. The Arm specific handler filters out the not
> supported sub-ops and then calls the common handler. This leads to the
> weird call hierarchy:
> 
>   do_arm_vcpu_op()
>     do_vcpu_op()
>       arch_do_vcpu_op()
> 
> Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
> arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
> of above calls can be avoided without restricting any potential
> future use of common sub-ops for Arm.

Wouldn't it be more natural to have do_vcpu_op() contain the common
code (AFAICT handlers for
VCPUOP_register_{vcpu_info,runstate_memory_area}) and then everything
else handled by the x86 arch_do_vcpu_op() handler?

I find the common prefix misleading, as not all the VCPUOP hypercalls
are available to all the architectures.

Thanks, Roger.


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-06-27 10:28   ` Roger Pau Monné
@ 2022-06-27 10:40     ` Juergen Gross
  2022-06-27 11:02       ` Roger Pau Monné
  0 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-06-27 10:40 UTC (permalink / raw)
  To: Roger Pau Monné
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall


[-- Attachment #1.1.1: Type: text/plain, Size: 1407 bytes --]

On 27.06.22 12:28, Roger Pau Monné wrote:
> On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
>> The entry point used for the vcpu_op hypercall on Arm is different
>> from the one on x86 today, as some of the common sub-ops are not
>> supported on Arm. The Arm specific handler filters out the not
>> supported sub-ops and then calls the common handler. This leads to the
>> weird call hierarchy:
>>
>>    do_arm_vcpu_op()
>>      do_vcpu_op()
>>        arch_do_vcpu_op()
>>
>> Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
>> arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
>> of above calls can be avoided without restricting any potential
>> future use of common sub-ops for Arm.
> 
> Wouldn't it be more natural to have do_vcpu_op() contain the common
> code (AFAICT handlers for
> VCPUOP_register_{vcpu_info,runstate_memory_area}) and then everything
> else handled by the x86 arch_do_vcpu_op() handler?
> 
> I find the common prefix misleading, as not all the VCPUOP hypercalls
> are available to all the architectures.

This would end up in Arm suddenly supporting the sub-ops it doesn't
(want to) support today. Otherwise it would make no sense that Arm has
a dedicated entry for this hypercall.

The "common" just wants to express that the code is common. I'm open
for a better suggestion, though. :-)


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-06-27 10:40     ` Juergen Gross
@ 2022-06-27 11:02       ` Roger Pau Monné
  2022-06-27 11:08         ` Juergen Gross
  0 siblings, 1 reply; 34+ messages in thread
From: Roger Pau Monné @ 2022-06-27 11:02 UTC (permalink / raw)
  To: Juergen Gross
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall

On Mon, Jun 27, 2022 at 12:40:41PM +0200, Juergen Gross wrote:
> On 27.06.22 12:28, Roger Pau Monné wrote:
> > On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
> > > The entry point used for the vcpu_op hypercall on Arm is different
> > > from the one on x86 today, as some of the common sub-ops are not
> > > supported on Arm. The Arm specific handler filters out the not
> > > supported sub-ops and then calls the common handler. This leads to the
> > > weird call hierarchy:
> > > 
> > >    do_arm_vcpu_op()
> > >      do_vcpu_op()
> > >        arch_do_vcpu_op()
> > > 
> > > Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
> > > arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
> > > of above calls can be avoided without restricting any potential
> > > future use of common sub-ops for Arm.
> > 
> > Wouldn't it be more natural to have do_vcpu_op() contain the common
> > code (AFAICT handlers for
> > VCPUOP_register_{vcpu_info,runstate_memory_area}) and then everything
> > else handled by the x86 arch_do_vcpu_op() handler?
> > 
> > I find the common prefix misleading, as not all the VCPUOP hypercalls
> > are available to all the architectures.
> 
> This would end up in Arm suddenly supporting the sub-ops it doesn't
> (want to) support today. Otherwise it would make no sense that Arm has
> a dedicated entry for this hypercall.

My preference would be for a common do_vcpu_op() that just contains
handlers for VCPUOP_register_{vcpu_info,runstate_memory_area} and then
an empty arch_ handler for Arm, and everything else moved to the x86
arch_ handler.  That obviously implies some code churn, but results in
a cleaner implementation IMO.

Also has the nice benefit of removing unreachable code from the Arm
build, which is also a MISRA-C rule.

> The "common" just wants to express that the code is common. I'm open
> for a better suggestion, though. :-)

Right, it lives in common/ anyway, so there's not a much better name.

Thanks, Roger.


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-06-27 11:02       ` Roger Pau Monné
@ 2022-06-27 11:08         ` Juergen Gross
  2022-06-27 11:35           ` Roger Pau Monné
  0 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-06-27 11:08 UTC (permalink / raw)
  To: Roger Pau Monné
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall


[-- Attachment #1.1.1: Type: text/plain, Size: 2168 bytes --]

On 27.06.22 13:02, Roger Pau Monné wrote:
> On Mon, Jun 27, 2022 at 12:40:41PM +0200, Juergen Gross wrote:
>> On 27.06.22 12:28, Roger Pau Monné wrote:
>>> On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
>>>> The entry point used for the vcpu_op hypercall on Arm is different
>>>> from the one on x86 today, as some of the common sub-ops are not
>>>> supported on Arm. The Arm specific handler filters out the not
>>>> supported sub-ops and then calls the common handler. This leads to the
>>>> weird call hierarchy:
>>>>
>>>>     do_arm_vcpu_op()
>>>>       do_vcpu_op()
>>>>         arch_do_vcpu_op()
>>>>
>>>> Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
>>>> arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
>>>> of above calls can be avoided without restricting any potential
>>>> future use of common sub-ops for Arm.
>>>
>>> Wouldn't it be more natural to have do_vcpu_op() contain the common
>>> code (AFAICT handlers for
>>> VCPUOP_register_{vcpu_info,runstate_memory_area}) and then everything
>>> else handled by the x86 arch_do_vcpu_op() handler?
>>>
>>> I find the common prefix misleading, as not all the VCPUOP hypercalls
>>> are available to all the architectures.
>>
>> This would end up in Arm suddenly supporting the sub-ops it doesn't
>> (want to) support today. Otherwise it would make no sense that Arm has
>> a dedicated entry for this hypercall.
> 
> My preference would be for a common do_vcpu_op() that just contains
> handlers for VCPUOP_register_{vcpu_info,runstate_memory_area} and then
> an empty arch_ handler for Arm, and everything else moved to the x86
> arch_ handler.  That obviously implies some code churn, but results in
> a cleaner implementation IMO.

I'd be fine with that.

I did it in V2 of the (then secret) series, and Jan replied:

   I'm afraid I don't agree with this movement. I could see things getting
   moved that are purely PV (on the assumption that no new PV ports will
   appear), but anything that's also usable by PVH / HVM ought to be usable
   in principle also by Arm or other PV-free ports.


Juergen

[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-06-27 11:08         ` Juergen Gross
@ 2022-06-27 11:35           ` Roger Pau Monné
  2022-06-27 11:47             ` Juergen Gross
  0 siblings, 1 reply; 34+ messages in thread
From: Roger Pau Monné @ 2022-06-27 11:35 UTC (permalink / raw)
  To: Juergen Gross
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall

On Mon, Jun 27, 2022 at 01:08:11PM +0200, Juergen Gross wrote:
> On 27.06.22 13:02, Roger Pau Monné wrote:
> > On Mon, Jun 27, 2022 at 12:40:41PM +0200, Juergen Gross wrote:
> > > On 27.06.22 12:28, Roger Pau Monné wrote:
> > > > On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
> > > > > The entry point used for the vcpu_op hypercall on Arm is different
> > > > > from the one on x86 today, as some of the common sub-ops are not
> > > > > supported on Arm. The Arm specific handler filters out the not
> > > > > supported sub-ops and then calls the common handler. This leads to the
> > > > > weird call hierarchy:
> > > > > 
> > > > >     do_arm_vcpu_op()
> > > > >       do_vcpu_op()
> > > > >         arch_do_vcpu_op()
> > > > > 
> > > > > Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
> > > > > arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
> > > > > of above calls can be avoided without restricting any potential
> > > > > future use of common sub-ops for Arm.
> > > > 
> > > > Wouldn't it be more natural to have do_vcpu_op() contain the common
> > > > code (AFAICT handlers for
> > > > VCPUOP_register_{vcpu_info,runstate_memory_area}) and then everything
> > > > else handled by the x86 arch_do_vcpu_op() handler?
> > > > 
> > > > I find the common prefix misleading, as not all the VCPUOP hypercalls
> > > > are available to all the architectures.
> > > 
> > > This would end up in Arm suddenly supporting the sub-ops it doesn't
> > > (want to) support today. Otherwise it would make no sense that Arm has
> > > a dedicated entry for this hypercall.
> > 
> > My preference would be for a common do_vcpu_op() that just contains
> > handlers for VCPUOP_register_{vcpu_info,runstate_memory_area} and then
> > an empty arch_ handler for Arm, and everything else moved to the x86
> > arch_ handler.  That obviously implies some code churn, but results in
> > a cleaner implementation IMO.
> 
> I'd be fine with that.
> 
> I did it in V2 of the (then secret) series, and Jan replied:
> 
>   I'm afraid I don't agree with this movement. I could see things getting
>   moved that are purely PV (on the assumption that no new PV ports will
>   appear), but anything that's also usable by PVH / HVM ought to be usable
>   in principle also by Arm or other PV-free ports.

I see. My opinion is that when other ports need those functions they
should be pulled out of arch code into common code, until then it just
adds confusion to have them in common code.

I will take a look at the current patch, as we need to make progress
on this.

Thanks, Roger.


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-06-27 11:35           ` Roger Pau Monné
@ 2022-06-27 11:47             ` Juergen Gross
  0 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-06-27 11:47 UTC (permalink / raw)
  To: Roger Pau Monné
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall


[-- Attachment #1.1.1: Type: text/plain, Size: 2684 bytes --]

On 27.06.22 13:35, Roger Pau Monné wrote:
> On Mon, Jun 27, 2022 at 01:08:11PM +0200, Juergen Gross wrote:
>> On 27.06.22 13:02, Roger Pau Monné wrote:
>>> On Mon, Jun 27, 2022 at 12:40:41PM +0200, Juergen Gross wrote:
>>>> On 27.06.22 12:28, Roger Pau Monné wrote:
>>>>> On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
>>>>>> The entry point used for the vcpu_op hypercall on Arm is different
>>>>>> from the one on x86 today, as some of the common sub-ops are not
>>>>>> supported on Arm. The Arm specific handler filters out the not
>>>>>> supported sub-ops and then calls the common handler. This leads to the
>>>>>> weird call hierarchy:
>>>>>>
>>>>>>      do_arm_vcpu_op()
>>>>>>        do_vcpu_op()
>>>>>>          arch_do_vcpu_op()
>>>>>>
>>>>>> Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
>>>>>> arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
>>>>>> of above calls can be avoided without restricting any potential
>>>>>> future use of common sub-ops for Arm.
>>>>>
>>>>> Wouldn't it be more natural to have do_vcpu_op() contain the common
>>>>> code (AFAICT handlers for
>>>>> VCPUOP_register_{vcpu_info,runstate_memory_area}) and then everything
>>>>> else handled by the x86 arch_do_vcpu_op() handler?
>>>>>
>>>>> I find the common prefix misleading, as not all the VCPUOP hypercalls
>>>>> are available to all the architectures.
>>>>
>>>> This would end up in Arm suddenly supporting the sub-ops it doesn't
>>>> (want to) support today. Otherwise it would make no sense that Arm has
>>>> a dedicated entry for this hypercall.
>>>
>>> My preference would be for a common do_vcpu_op() that just contains
>>> handlers for VCPUOP_register_{vcpu_info,runstate_memory_area} and then
>>> an empty arch_ handler for Arm, and everything else moved to the x86
>>> arch_ handler.  That obviously implies some code churn, but results in
>>> a cleaner implementation IMO.
>>
>> I'd be fine with that.
>>
>> I did it in V2 of the (then secret) series, and Jan replied:
>>
>>    I'm afraid I don't agree with this movement. I could see things getting
>>    moved that are purely PV (on the assumption that no new PV ports will
>>    appear), but anything that's also usable by PVH / HVM ought to be usable
>>    in principle also by Arm or other PV-free ports.
> 
> I see. My opinion is that when other ports need those functions they
> should be pulled out of arch code into common code, until then it just
> adds confusion to have them in common code.
> 
> I will take a look at the current patch, as we need to make progress
> on this.

Thanks for that.


Juergen


[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code
  2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
  2022-06-07  5:00   ` Juergen Gross
  2022-06-27 10:28   ` Roger Pau Monné
@ 2022-06-27 13:00   ` Roger Pau Monné
  2 siblings, 0 replies; 34+ messages in thread
From: Roger Pau Monné @ 2022-06-27 13:00 UTC (permalink / raw)
  To: Juergen Gross
  Cc: xen-devel, Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Andrew Cooper, George Dunlap, Jan Beulich,
	Wei Liu, Julien Grall

On Thu, Mar 24, 2022 at 03:01:31PM +0100, Juergen Gross wrote:
> The entry point used for the vcpu_op hypercall on Arm is different
> from the one on x86 today, as some of the common sub-ops are not
> supported on Arm. The Arm specific handler filters out the not
> supported sub-ops and then calls the common handler. This leads to the
> weird call hierarchy:
> 
>   do_arm_vcpu_op()
>     do_vcpu_op()
>       arch_do_vcpu_op()
> 
> Clean this up by renaming do_vcpu_op() to common_vcpu_op() and
> arch_do_vcpu_op() in each architecture to do_vcpu_op(). This way one
> of above calls can be avoided without restricting any potential
> future use of common sub-ops for Arm.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> Reviewed-by: Julien Grall <jgrall@amazon.com>

Acked-by: Roger Pau Monné <roger.pau@cirtrix.com>

From an x86 only PoV I prefer the previous arrangement (do_vcpu_op() ->
arch_do_vcpu_op()), but this approach seems to be better for Arm, so
that's a reasonable argument for changing it.

My preference would have been to move the handling of hypercalls not
used by Arm into arch_do_vcpu_op() for x86, but that's also not widely
liked.

> ---
> V4:
> - don't remove HYPERCALL_ARM()
> V4.1:
> - add missing cf_check (Andrew Cooper)
> V5:
> - use v instead of current (Julien Grall)
> ---
>  xen/arch/arm/domain.c                | 15 ++++++++-------
>  xen/arch/arm/include/asm/hypercall.h |  2 --
>  xen/arch/arm/traps.c                 |  2 +-
>  xen/arch/x86/domain.c                | 12 ++++++++----
>  xen/arch/x86/include/asm/hypercall.h |  2 +-
>  xen/arch/x86/x86_64/domain.c         | 18 +++++++++++++-----
>  xen/common/compat/domain.c           | 15 ++++++---------
>  xen/common/domain.c                  | 12 ++++--------
>  xen/include/xen/hypercall.h          |  2 +-
>  9 files changed, 42 insertions(+), 38 deletions(-)
> 
> diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
> index 8110c1df86..2f8eaab7b5 100644
> --- a/xen/arch/arm/domain.c
> +++ b/xen/arch/arm/domain.c
> @@ -1079,23 +1079,24 @@ void arch_dump_domain_info(struct domain *d)
>  }
>  
>  
> -long do_arm_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
> +long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
>  {
> +    struct domain *d = current->domain;
> +    struct vcpu *v;
> +
> +    if ( (v = domain_vcpu(d, vcpuid)) == NULL )
> +        return -ENOENT;

My preference (here and in x86) code would be to do the initialization
at definition, and then just check for v here, ie:

struct vcpu *v = domain_vcpu(d, vcpuid);

if ( !v )
    return -ENOENT;

But that's just my taste.

Thanks, Roger.


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 2/9] xen: harmonize return types of hypercall handlers
  2022-03-24 14:01 ` [PATCH v6 2/9] xen: harmonize return types of hypercall handlers Juergen Gross
@ 2022-06-29  6:24   ` Juergen Gross
  2022-07-06 19:22     ` Christopher Clark
  0 siblings, 1 reply; 34+ messages in thread
From: Juergen Gross @ 2022-06-29  6:24 UTC (permalink / raw)
  To: xen-devel, Christopher Clark, Andrew Cooper
  Cc: Jan Beulich, Roger Pau Monné,
	Wei Liu, George Dunlap, Julien Grall, Stefano Stabellini


[-- Attachment #1.1.1: Type: text/plain, Size: 18333 bytes --]

On 24.03.22 15:01, Juergen Gross wrote:
> Today most hypercall handlers have a return type of long, while the
> compat ones return an int. There are a few exceptions from that rule,
> however.
> 
> Get rid of the exceptions by letting compat handlers always return int
> and others always return long, with the exception of the Arm specific
> physdev_op handler.
> 
> For the compat hvm case use eax instead of rax for the stored result as
> it should have been from the beginning.
> 
> Additionally move some prototypes to include/asm-x86/hypercall.h
> as they are x86 specific. Move the compat_platform_op() prototype to
> the common header.
> 
> Rename paging_domctl_continuation() to do_paging_domctl_cont() and add
> a matching define for the associated hypercall.
> 
> Make do_callback_op() and compat_callback_op() more similar by adding
> the const attribute to compat_callback_op()'s 2nd parameter.
> 
> Change the type of the cmd parameter for [do|compat]_kexec_op() to
> unsigned int, as this is more appropriate for the compat case.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>
> Reviewed-by: Jan Beulich <jbeulich@suse.com>

Could I please have some feedback regarding the kexec and argo changes?


Juergen

> ---
> V2:
> - rework platform_op compat handling (Jan Beulich)
> V3:
> - remove include of types.h (Jan Beulich)
> V4:
> - don't move do_physdev_op() (Julien Grall)
> - carve out non style compliant parameter replacements (Julien Grall)
> V6:
> - remove rebase artifact (Jan Beulich)
> ---
>   xen/arch/x86/domctl.c                |  4 ++--
>   xen/arch/x86/hvm/hypercall.c         |  8 ++-----
>   xen/arch/x86/hypercall.c             |  2 +-
>   xen/arch/x86/include/asm/hypercall.h | 31 ++++++++++++++--------------
>   xen/arch/x86/include/asm/paging.h    |  3 ---
>   xen/arch/x86/mm/paging.c             |  3 ++-
>   xen/arch/x86/pv/callback.c           | 14 ++++++-------
>   xen/arch/x86/pv/emul-priv-op.c       |  2 +-
>   xen/arch/x86/pv/hypercall.c          |  5 +----
>   xen/arch/x86/pv/iret.c               |  4 ++--
>   xen/arch/x86/pv/misc-hypercalls.c    | 14 ++++++++-----
>   xen/common/argo.c                    |  6 +++---
>   xen/common/kexec.c                   |  6 +++---
>   xen/include/xen/hypercall.h          | 20 ++++++++----------
>   14 files changed, 58 insertions(+), 64 deletions(-)
> 
> diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
> index e49f9e91b9..ea7d60ffb6 100644
> --- a/xen/arch/x86/domctl.c
> +++ b/xen/arch/x86/domctl.c
> @@ -221,8 +221,8 @@ long arch_do_domctl(
>       case XEN_DOMCTL_shadow_op:
>           ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0);
>           if ( ret == -ERESTART )
> -            return hypercall_create_continuation(__HYPERVISOR_arch_1,
> -                                                 "h", u_domctl);
> +            return hypercall_create_continuation(
> +                       __HYPERVISOR_paging_domctl_cont, "h", u_domctl);
>           copyback = true;
>           break;
>   
> diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
> index 62b5349e7d..3a35543997 100644
> --- a/xen/arch/x86/hvm/hypercall.c
> +++ b/xen/arch/x86/hvm/hypercall.c
> @@ -124,8 +124,6 @@ static long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
>       [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,  \
>                                  (hypercall_fn_t *) compat_ ## x }
>   
> -#define do_arch_1             paging_domctl_continuation
> -
>   static const struct {
>       hypercall_fn_t *native, *compat;
>   } hvm_hypercall_table[] = {
> @@ -158,11 +156,9 @@ static const struct {
>   #ifdef CONFIG_HYPFS
>       HYPERCALL(hypfs_op),
>   #endif
> -    HYPERCALL(arch_1)
> +    HYPERCALL(paging_domctl_cont)
>   };
>   
> -#undef do_arch_1
> -
>   #undef HYPERCALL
>   #undef HVM_CALL
>   #undef COMPAT_CALL
> @@ -300,7 +296,7 @@ int hvm_hypercall(struct cpu_user_regs *regs)
>   #endif
>   
>           curr->hcall_compat = true;
> -        regs->rax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
> +        regs->eax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
>           curr->hcall_compat = false;
>   
>   #ifndef NDEBUG
> diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
> index 2370d31d3f..07e1a45ef5 100644
> --- a/xen/arch/x86/hypercall.c
> +++ b/xen/arch/x86/hypercall.c
> @@ -75,7 +75,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] =
>       ARGS(dm_op, 3),
>       ARGS(hypfs_op, 5),
>       ARGS(mca, 1),
> -    ARGS(arch_1, 1),
> +    ARGS(paging_domctl_cont, 1),
>   };
>   
>   #undef COMP
> diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
> index d6daa7e4cb..49973820af 100644
> --- a/xen/arch/x86/include/asm/hypercall.h
> +++ b/xen/arch/x86/include/asm/hypercall.h
> @@ -11,6 +11,8 @@
>   #include <public/arch-x86/xen-mca.h> /* for do_mca */
>   #include <asm/paging.h>
>   
> +#define __HYPERVISOR_paging_domctl_cont __HYPERVISOR_arch_1
> +
>   typedef unsigned long hypercall_fn_t(
>       unsigned long, unsigned long, unsigned long,
>       unsigned long, unsigned long);
> @@ -80,7 +82,7 @@ do_set_debugreg(
>       int reg,
>       unsigned long value);
>   
> -extern unsigned long cf_check
> +extern long cf_check
>   do_get_debugreg(
>       int reg);
>   
> @@ -118,7 +120,7 @@ do_mmuext_op(
>   extern long cf_check do_callback_op(
>       int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
>   
> -extern unsigned long cf_check
> +extern long cf_check
>   do_iret(
>       void);
>   
> @@ -133,17 +135,20 @@ do_set_segment_base(
>       unsigned int which,
>       unsigned long base);
>   
> +long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> +
> +long cf_check do_xenpmu_op(unsigned int op,
> +                           XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
> +
> +long cf_check do_paging_domctl_cont(
> +    XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
> +
>   #ifdef CONFIG_COMPAT
>   
>   #include <compat/arch-x86/xen.h>
>   #include <compat/physdev.h>
>   #include <compat/platform.h>
>   
> -extern int cf_check
> -compat_physdev_op(
> -    int cmd,
> -    XEN_GUEST_HANDLE_PARAM(void) arg);
> -
>   extern int
>   compat_common_vcpu_op(
>       int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
> @@ -154,12 +159,8 @@ extern int cf_check compat_mmuext_op(
>       XEN_GUEST_HANDLE_PARAM(uint) pdone,
>       unsigned int foreigndom);
>   
> -DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
> -extern int cf_check compat_platform_op(
> -    XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
> -
> -extern long cf_check compat_callback_op(
> -    int cmd, XEN_GUEST_HANDLE(void) arg);
> +extern int cf_check compat_callback_op(
> +    int cmd, XEN_GUEST_HANDLE(const_void) arg);
>   
>   extern int cf_check compat_update_va_mapping(
>       unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags);
> @@ -177,12 +178,12 @@ extern int cf_check compat_set_gdt(
>   extern int cf_check compat_update_descriptor(
>       uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi);
>   
> -extern unsigned int cf_check compat_iret(void);
> +extern int cf_check compat_iret(void);
>   
>   extern int cf_check compat_nmi_op(
>       unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
>   
> -extern long cf_check compat_set_callbacks(
> +extern int cf_check compat_set_callbacks(
>       unsigned long event_selector, unsigned long event_address,
>       unsigned long failsafe_selector, unsigned long failsafe_address);
>   
> diff --git a/xen/arch/x86/include/asm/paging.h b/xen/arch/x86/include/asm/paging.h
> index f0b4efc66e..54c440be65 100644
> --- a/xen/arch/x86/include/asm/paging.h
> +++ b/xen/arch/x86/include/asm/paging.h
> @@ -234,9 +234,6 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
>                     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl,
>                     bool_t resuming);
>   
> -/* Helper hypercall for dealing with continuations. */
> -long cf_check paging_domctl_continuation(XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
> -
>   /* Call when destroying a vcpu/domain */
>   void paging_vcpu_teardown(struct vcpu *v);
>   int paging_teardown(struct domain *d);
> diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
> index 1f0b94ad21..a7e2707ecc 100644
> --- a/xen/arch/x86/mm/paging.c
> +++ b/xen/arch/x86/mm/paging.c
> @@ -21,6 +21,7 @@
>   
>   #include <xen/init.h>
>   #include <xen/guest_access.h>
> +#include <xen/hypercall.h>
>   #include <asm/paging.h>
>   #include <asm/shadow.h>
>   #include <asm/p2m.h>
> @@ -759,7 +760,7 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
>           return shadow_domctl(d, sc, u_domctl);
>   }
>   
> -long cf_check paging_domctl_continuation(
> +long cf_check do_paging_domctl_cont(
>       XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
>   {
>       struct xen_domctl op;
> diff --git a/xen/arch/x86/pv/callback.c b/xen/arch/x86/pv/callback.c
> index 55148c7f9e..1be9d3f731 100644
> --- a/xen/arch/x86/pv/callback.c
> +++ b/xen/arch/x86/pv/callback.c
> @@ -207,9 +207,9 @@ long cf_check do_set_callbacks(
>   #include <compat/callback.h>
>   #include <compat/nmi.h>
>   
> -static long compat_register_guest_callback(struct compat_callback_register *reg)
> +static int compat_register_guest_callback(struct compat_callback_register *reg)
>   {
> -    long ret = 0;
> +    int ret = 0;
>       struct vcpu *curr = current;
>   
>       fixup_guest_code_selector(curr->domain, reg->address.cs);
> @@ -256,10 +256,10 @@ static long compat_register_guest_callback(struct compat_callback_register *reg)
>       return ret;
>   }
>   
> -static long compat_unregister_guest_callback(
> +static int compat_unregister_guest_callback(
>       struct compat_callback_unregister *unreg)
>   {
> -    long ret;
> +    int ret;
>   
>       switch ( unreg->type )
>       {
> @@ -283,9 +283,9 @@ static long compat_unregister_guest_callback(
>       return ret;
>   }
>   
> -long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> +int cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
>   {
> -    long ret;
> +    int ret;
>   
>       switch ( cmd )
>       {
> @@ -321,7 +321,7 @@ long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
>       return ret;
>   }
>   
> -long cf_check compat_set_callbacks(
> +int cf_check compat_set_callbacks(
>       unsigned long event_selector, unsigned long event_address,
>       unsigned long failsafe_selector, unsigned long failsafe_address)
>   {
> diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
> index 22b10dec2a..5da00e24e4 100644
> --- a/xen/arch/x86/pv/emul-priv-op.c
> +++ b/xen/arch/x86/pv/emul-priv-op.c
> @@ -22,13 +22,13 @@
>   #include <xen/domain_page.h>
>   #include <xen/event.h>
>   #include <xen/guest_access.h>
> +#include <xen/hypercall.h>
>   #include <xen/iocap.h>
>   
>   #include <asm/amd.h>
>   #include <asm/debugreg.h>
>   #include <asm/endbr.h>
>   #include <asm/hpet.h>
> -#include <asm/hypercall.h>
>   #include <asm/mc146818rtc.h>
>   #include <asm/pv/domain.h>
>   #include <asm/pv/trace.h>
> diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
> index e8fbee7bbb..fe8dfe9e8f 100644
> --- a/xen/arch/x86/pv/hypercall.c
> +++ b/xen/arch/x86/pv/hypercall.c
> @@ -47,8 +47,6 @@ typedef struct {
>   #define COMPAT_CALL(x) HYPERCALL(x)
>   #endif
>   
> -#define do_arch_1             paging_domctl_continuation
> -
>   static const pv_hypercall_table_t pv_hypercall_table[] = {
>       COMPAT_CALL(set_trap_table),
>       HYPERCALL(mmu_update),
> @@ -109,11 +107,10 @@ static const pv_hypercall_table_t pv_hypercall_table[] = {
>   #endif
>       HYPERCALL(mca),
>   #ifndef CONFIG_PV_SHIM_EXCLUSIVE
> -    HYPERCALL(arch_1),
> +    HYPERCALL(paging_domctl_cont),
>   #endif
>   };
>   
> -#undef do_arch_1
>   #undef COMPAT_CALL
>   #undef HYPERCALL
>   
> diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
> index dd2965d8f0..55eb6a63bd 100644
> --- a/xen/arch/x86/pv/iret.c
> +++ b/xen/arch/x86/pv/iret.c
> @@ -48,7 +48,7 @@ static void async_exception_cleanup(struct vcpu *curr)
>           curr->arch.async_exception_state(trap).old_mask;
>   }
>   
> -unsigned long cf_check do_iret(void)
> +long cf_check do_iret(void)
>   {
>       struct cpu_user_regs *regs = guest_cpu_user_regs();
>       struct iret_context iret_saved;
> @@ -105,7 +105,7 @@ unsigned long cf_check do_iret(void)
>   }
>   
>   #ifdef CONFIG_PV32
> -unsigned int cf_check compat_iret(void)
> +int cf_check compat_iret(void)
>   {
>       struct cpu_user_regs *regs = guest_cpu_user_regs();
>       struct vcpu *v = current;
> diff --git a/xen/arch/x86/pv/misc-hypercalls.c b/xen/arch/x86/pv/misc-hypercalls.c
> index 5649aaab44..635f5a644a 100644
> --- a/xen/arch/x86/pv/misc-hypercalls.c
> +++ b/xen/arch/x86/pv/misc-hypercalls.c
> @@ -28,12 +28,16 @@ long cf_check do_set_debugreg(int reg, unsigned long value)
>       return set_debugreg(current, reg, value);
>   }
>   
> -unsigned long cf_check do_get_debugreg(int reg)
> +long cf_check do_get_debugreg(int reg)
>   {
> -    unsigned long val;
> -    int res = x86emul_read_dr(reg, &val, NULL);
> -
> -    return res == X86EMUL_OKAY ? val : -ENODEV;
> +    /* Avoid implementation defined behavior casting unsigned long to long. */
> +    union {
> +        unsigned long val;
> +        long ret;
> +    } u;
> +    int res = x86emul_read_dr(reg, &u.val, NULL);
> +
> +    return res == X86EMUL_OKAY ? u.ret : -ENODEV;
>   }
>   
>   long cf_check do_fpu_taskswitch(int set)
> diff --git a/xen/common/argo.c b/xen/common/argo.c
> index 297f6d11f0..26a01c2188 100644
> --- a/xen/common/argo.c
> +++ b/xen/common/argo.c
> @@ -2207,13 +2207,13 @@ do_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
>   }
>   
>   #ifdef CONFIG_COMPAT
> -long cf_check
> +int cf_check
>   compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
>                  XEN_GUEST_HANDLE_PARAM(void) arg2, unsigned long arg3,
>                  unsigned long arg4)
>   {
>       struct domain *currd = current->domain;
> -    long rc;
> +    int rc;
>       xen_argo_send_addr_t send_addr;
>       xen_argo_iov_t iovs[XEN_ARGO_MAXIOV];
>       compat_argo_iov_t compat_iovs[XEN_ARGO_MAXIOV];
> @@ -2267,7 +2267,7 @@ compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
>   
>       rc = sendv(currd, &send_addr.src, &send_addr.dst, iovs, niov, arg4);
>    out:
> -    argo_dprintk("<-compat_argo_op(%u)=%ld\n", cmd, rc);
> +    argo_dprintk("<-compat_argo_op(%u)=%d\n", cmd, rc);
>   
>       return rc;
>   }
> diff --git a/xen/common/kexec.c b/xen/common/kexec.c
> index a2ffb6530c..41669964d2 100644
> --- a/xen/common/kexec.c
> +++ b/xen/common/kexec.c
> @@ -1213,7 +1213,7 @@ static int kexec_status(XEN_GUEST_HANDLE_PARAM(void) uarg)
>       return !!test_bit(bit, &kexec_flags);
>   }
>   
> -static int do_kexec_op_internal(unsigned long op,
> +static int do_kexec_op_internal(unsigned int op,
>                                   XEN_GUEST_HANDLE_PARAM(void) uarg,
>                                   bool_t compat)
>   {
> @@ -1265,13 +1265,13 @@ static int do_kexec_op_internal(unsigned long op,
>       return ret;
>   }
>   
> -long cf_check do_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> +long cf_check do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
>   {
>       return do_kexec_op_internal(op, uarg, 0);
>   }
>   
>   #ifdef CONFIG_COMPAT
> -int cf_check compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> +int cf_check compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
>   {
>       return do_kexec_op_internal(op, uarg, 1);
>   }
> diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
> index 81aae7a662..a032ba2b4a 100644
> --- a/xen/include/xen/hypercall.h
> +++ b/xen/include/xen/hypercall.h
> @@ -114,11 +114,6 @@ common_vcpu_op(int cmd,
>       struct vcpu *v,
>       XEN_GUEST_HANDLE_PARAM(void) arg);
>   
> -extern long cf_check
> -do_nmi_op(
> -    unsigned int cmd,
> -    XEN_GUEST_HANDLE_PARAM(void) arg);
> -
>   extern long cf_check
>   do_hvm_op(
>       unsigned long op,
> @@ -126,7 +121,7 @@ do_hvm_op(
>   
>   extern long cf_check
>   do_kexec_op(
> -    unsigned long op,
> +    unsigned int op,
>       XEN_GUEST_HANDLE_PARAM(void) uarg);
>   
>   extern long cf_check
> @@ -145,9 +140,6 @@ extern long cf_check do_argo_op(
>   extern long cf_check
>   do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
>   
> -extern long cf_check
> -do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
> -
>   extern long cf_check
>   do_dm_op(
>       domid_t domid,
> @@ -205,15 +197,21 @@ extern int cf_check compat_xsm_op(
>       XEN_GUEST_HANDLE_PARAM(void) op);
>   
>   extern int cf_check compat_kexec_op(
> -    unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg);
> +    unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
>   
>   DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
>   extern int cf_check compat_multicall(
>       XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list,
>       uint32_t nr_calls);
>   
> +int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> +
> +typedef struct compat_platform_op compat_platform_op_t;
> +DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
> +int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
> +
>   #ifdef CONFIG_ARGO
> -extern long cf_check compat_argo_op(
> +extern int cf_check compat_argo_op(
>       unsigned int cmd,
>       XEN_GUEST_HANDLE_PARAM(void) arg1,
>       XEN_GUEST_HANDLE_PARAM(void) arg2,


[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

* RE: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (9 preceding siblings ...)
  2022-04-19  8:01 ` [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
@ 2022-07-06  7:30 ` Henry Wang
  2022-07-06  8:57   ` Jan Beulich
  2022-07-07 16:10 ` ***PING***: " Jan Beulich
  11 siblings, 1 reply; 34+ messages in thread
From: Henry Wang @ 2022-07-06  7:30 UTC (permalink / raw)
  To: xen-devel, christopher.w.clark, Andrew Cooper
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Juergen Gross, Andrew Cooper, George Dunlap,
	Jan Beulich, Wei Liu, Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith

Hi,

It seems that this series has been stale for more than 3 months, with:

Patch #1 merged.
Patch #2 need feedback regarding the kexec and argo changes.
Patch #3 #4 #5 #6 #7 #8 #9 reviewed/acked.

So sending this as a gentle reminder for kexec and argo maintainers.
Thanks!

Kind regards,
Henry

> -----Original Message-----
> Subject: [PATCH v6 0/9] xen: drop hypercall function tables
> 
> In order to avoid indirect function calls on the hypercall path as
> much as possible this series is removing the hypercall function tables
> and is replacing the hypercall handler calls via the function array
> by automatically generated call macros.
> 
> Another by-product of generating the call macros is the automatic
> generating of the hypercall handler prototypes from the same data base
> which is used to generate the macros.
> 
> This has the additional advantage of using type safe calls of the
> handlers and to ensure related handler (e.g. PV and HVM ones) share
> the same prototypes.
> 
> A very brief performance test (parallel build of the Xen hypervisor
> in a 6 vcpu guest) showed a very slim improvement (less than 1%) of
> the performance with the patches applied. The test was performed using
> a PV and a PVH guest.
> 
> Changes in V2:
> - new patches 6, 14, 15
> - patch 7: support hypercall priorities for faster code
> - comments addressed
> 
> Changes in V3:
> - patches 1 and 4 removed as already applied
> - comments addressed
> 
> Changes in V4:
> - 5 patches removed al already applied
> - new patches 1, 3 and 11
> - avoid switching Arm hypercall handlers to return long (no change of
>   handlers returning long already)
> 
> Changes in V5:
> - patch 3 of V4 has been applied already
> - comments addressed
> - rebase
> 
> Changes in V6:
> - patch 1 of V5 has been applied already
> - fix of a rebase artifact
> 
> Juergen Gross (9):
>   xen: move do_vcpu_op() to arch specific code
>   xen: harmonize return types of hypercall handlers
>   xen: don't include asm/hypercall.h from C sources
>   xen: include compat/platform.h from hypercall.h
>   xen: generate hypercall interface related code
>   xen: use generated prototypes for hypercall handlers
>   xen/x86: call hypercall handlers via generated macro
>   xen/arm: call hypercall handlers via generated macro
>   xen/x86: remove cf_check attribute from hypercall handlers
> 
>  .gitignore                               |   1 +
>  xen/arch/arm/domain.c                    |  15 +-
>  xen/arch/arm/hvm.c                       |   3 +-
>  xen/arch/arm/include/asm/hypercall.h     |   7 +-
>  xen/arch/arm/platform_hypercall.c        |   1 +
>  xen/arch/arm/traps.c                     | 117 ++-------
>  xen/arch/x86/compat.c                    |   6 +-
>  xen/arch/x86/cpu/mcheck/mce.c            |   2 +-
>  xen/arch/x86/cpu/vpmu.c                  |   3 +-
>  xen/arch/x86/domain.c                    |  11 +-
>  xen/arch/x86/domctl.c                    |   4 +-
>  xen/arch/x86/hvm/dm.c                    |   2 +-
>  xen/arch/x86/hvm/hvm.c                   |   2 +-
>  xen/arch/x86/hvm/hypercall.c             | 177 ++-----------
>  xen/arch/x86/hypercall.c                 |  59 -----
>  xen/arch/x86/include/asm/hypercall.h     | 201 ++++-----------
>  xen/arch/x86/include/asm/paging.h        |   3 -
>  xen/arch/x86/mm.c                        |  13 +-
>  xen/arch/x86/mm/paging.c                 |   3 +-
>  xen/arch/x86/physdev.c                   |   2 +-
>  xen/arch/x86/platform_hypercall.c        |   3 +-
>  xen/arch/x86/pv/callback.c               |  26 +-
>  xen/arch/x86/pv/descriptor-tables.c      |   8 +-
>  xen/arch/x86/pv/emul-priv-op.c           |   2 +-
>  xen/arch/x86/pv/hypercall.c              | 187 ++------------
>  xen/arch/x86/pv/iret.c                   |   5 +-
>  xen/arch/x86/pv/misc-hypercalls.c        |  22 +-
>  xen/arch/x86/pv/shim.c                   |   4 +-
>  xen/arch/x86/traps.c                     |   2 +-
>  xen/arch/x86/x86_64/compat/mm.c          |   3 +-
>  xen/arch/x86/x86_64/domain.c             |  16 +-
>  xen/arch/x86/x86_64/mm.c                 |   2 -
>  xen/arch/x86/x86_64/platform_hypercall.c |   1 -
>  xen/common/argo.c                        |   8 +-
>  xen/common/compat/domain.c               |  15 +-
>  xen/common/compat/grant_table.c          |   3 +-
>  xen/common/compat/kernel.c               |   2 +-
>  xen/common/compat/memory.c               |   3 +-
>  xen/common/dm.c                          |   2 +-
>  xen/common/domain.c                      |  14 +-
>  xen/common/domctl.c                      |   2 +-
>  xen/common/event_channel.c               |   3 +-
>  xen/common/grant_table.c                 |   4 +-
>  xen/common/hypfs.c                       |   2 +-
>  xen/common/kernel.c                      |   2 +-
>  xen/common/kexec.c                       |   6 +-
>  xen/common/memory.c                      |   2 +-
>  xen/common/multicall.c                   |   4 +-
>  xen/common/sched/compat.c                |   2 +-
>  xen/common/sched/core.c                  |   4 +-
>  xen/common/sysctl.c                      |   2 +-
>  xen/common/xenoprof.c                    |   2 +-
>  xen/drivers/char/console.c               |   2 +-
>  xen/include/Makefile                     |  13 +
>  xen/include/hypercall-defs.c             | 285 ++++++++++++++++++++
>  xen/include/xen/hypercall.h              | 185 +------------
>  xen/scripts/gen_hypercall.awk            | 314 +++++++++++++++++++++++
>  xen/xsm/xsm_core.c                       |   4 +-
>  58 files changed, 861 insertions(+), 937 deletions(-)
>  create mode 100644 xen/include/hypercall-defs.c
>  create mode 100644 xen/scripts/gen_hypercall.awk
> 
> --
> 2.34.1
> 


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-07-06  7:30 ` Henry Wang
@ 2022-07-06  8:57   ` Jan Beulich
  2022-07-06  9:35     ` Henry Wang
  0 siblings, 1 reply; 34+ messages in thread
From: Jan Beulich @ 2022-07-06  8:57 UTC (permalink / raw)
  To: Henry Wang
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Juergen Gross, George Dunlap, Wei Liu,
	Roger Pau Monné,
	Dario Faggioli, Daniel De Graaf, Daniel P. Smith, xen-devel,
	christopher.w.clark, Andrew Cooper

On 06.07.2022 09:30, Henry Wang wrote:
> It seems that this series has been stale for more than 3 months, with:
> 
> Patch #1 merged.
> Patch #2 need feedback regarding the kexec and argo changes.
> Patch #3 #4 #5 #6 #7 #8 #9 reviewed/acked.
> 
> So sending this as a gentle reminder for kexec and argo maintainers.

Patch 3 was also merged. Patch 2 and 4 indeed only wait for said acks.
Patches 5 and onwards are pending a clarification by Andrew as to
performance concerns he had voiced. Jürgen did send a number of pings,
with no result at all.

Jan


^ permalink raw reply	[flat|nested] 34+ messages in thread

* RE: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-07-06  8:57   ` Jan Beulich
@ 2022-07-06  9:35     ` Henry Wang
  0 siblings, 0 replies; 34+ messages in thread
From: Henry Wang @ 2022-07-06  9:35 UTC (permalink / raw)
  To: Jan Beulich, Andrew Cooper, christopher.w.clark
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, Juergen Gross, George Dunlap, Wei Liu,
	Roger Pau Monné,
	Dario Faggioli, Daniel De Graaf, Daniel P. Smith, xen-devel

Hi Jan,

> -----Original Message-----
> From: Jan Beulich <jbeulich@suse.com>
> Subject: Re: [PATCH v6 0/9] xen: drop hypercall function tables
> 
> On 06.07.2022 09:30, Henry Wang wrote:
> > It seems that this series has been stale for more than 3 months, with:
> >
> > Patch #1 merged.
> > Patch #2 need feedback regarding the kexec and argo changes.
> > Patch #3 #4 #5 #6 #7 #8 #9 reviewed/acked.
> >
> > So sending this as a gentle reminder for kexec and argo maintainers.
> 
> Patch 3 was also merged. Patch 2 and 4 indeed only wait for said acks.
> Patches 5 and onwards are pending a clarification by Andrew as to
> performance concerns he had voiced. Jürgen did send a number of pings,
> with no result at all.

Thanks for the information, let me just put Andrew (for kexec and Patch from
#5) and Christopher (for argo) in the TO: list to see if they can receive the ping.

Kind regards,
Henry

> 
> Jan

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 2/9] xen: harmonize return types of hypercall handlers
  2022-06-29  6:24   ` Juergen Gross
@ 2022-07-06 19:22     ` Christopher Clark
  2022-07-07 16:12       ` Christopher Clark
  0 siblings, 1 reply; 34+ messages in thread
From: Christopher Clark @ 2022-07-06 19:22 UTC (permalink / raw)
  To: Juergen Gross
  Cc: xen-devel, Andrew Cooper, Jan Beulich, Roger Pau Monné,
	Wei Liu, George Dunlap, Julien Grall, Stefano Stabellini

On Tue, Jun 28, 2022 at 11:24 PM Juergen Gross <jgross@suse.com> wrote:
>
> On 24.03.22 15:01, Juergen Gross wrote:
> > Today most hypercall handlers have a return type of long, while the
> > compat ones return an int. There are a few exceptions from that rule,
> > however.
> >
> > Get rid of the exceptions by letting compat handlers always return int
> > and others always return long, with the exception of the Arm specific
> > physdev_op handler.
> >
> > For the compat hvm case use eax instead of rax for the stored result as
> > it should have been from the beginning.
> >
> > Additionally move some prototypes to include/asm-x86/hypercall.h
> > as they are x86 specific. Move the compat_platform_op() prototype to
> > the common header.
> >
> > Rename paging_domctl_continuation() to do_paging_domctl_cont() and add
> > a matching define for the associated hypercall.
> >
> > Make do_callback_op() and compat_callback_op() more similar by adding
> > the const attribute to compat_callback_op()'s 2nd parameter.
> >
> > Change the type of the cmd parameter for [do|compat]_kexec_op() to
> > unsigned int, as this is more appropriate for the compat case.
> >
> > Signed-off-by: Juergen Gross <jgross@suse.com>
> > Reviewed-by: Jan Beulich <jbeulich@suse.com>
>
> Could I please have some feedback regarding the kexec and argo changes?

Thanks for the ping on this and apologies for the delay. The
Argo-related changes in this patch look ok, and I have built and
tested Argo functionality with this patch applied with PV 32 and 64
bit guests, using XTF -- with successful results for the patch -- but
I am behind on exercising it on a system that can run HVM guests,
sorry. Given the HVM-related change described in the description of
the patch, I think that such a test is needed and I am working on
getting a build and a system installed to get that done.

Christopher

>
>
> Juergen
>
> > ---
> > V2:
> > - rework platform_op compat handling (Jan Beulich)
> > V3:
> > - remove include of types.h (Jan Beulich)
> > V4:
> > - don't move do_physdev_op() (Julien Grall)
> > - carve out non style compliant parameter replacements (Julien Grall)
> > V6:
> > - remove rebase artifact (Jan Beulich)
> > ---
> >   xen/arch/x86/domctl.c                |  4 ++--
> >   xen/arch/x86/hvm/hypercall.c         |  8 ++-----
> >   xen/arch/x86/hypercall.c             |  2 +-
> >   xen/arch/x86/include/asm/hypercall.h | 31 ++++++++++++++--------------
> >   xen/arch/x86/include/asm/paging.h    |  3 ---
> >   xen/arch/x86/mm/paging.c             |  3 ++-
> >   xen/arch/x86/pv/callback.c           | 14 ++++++-------
> >   xen/arch/x86/pv/emul-priv-op.c       |  2 +-
> >   xen/arch/x86/pv/hypercall.c          |  5 +----
> >   xen/arch/x86/pv/iret.c               |  4 ++--
> >   xen/arch/x86/pv/misc-hypercalls.c    | 14 ++++++++-----
> >   xen/common/argo.c                    |  6 +++---
> >   xen/common/kexec.c                   |  6 +++---
> >   xen/include/xen/hypercall.h          | 20 ++++++++----------
> >   14 files changed, 58 insertions(+), 64 deletions(-)
> >
> > diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
> > index e49f9e91b9..ea7d60ffb6 100644
> > --- a/xen/arch/x86/domctl.c
> > +++ b/xen/arch/x86/domctl.c
> > @@ -221,8 +221,8 @@ long arch_do_domctl(
> >       case XEN_DOMCTL_shadow_op:
> >           ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0);
> >           if ( ret == -ERESTART )
> > -            return hypercall_create_continuation(__HYPERVISOR_arch_1,
> > -                                                 "h", u_domctl);
> > +            return hypercall_create_continuation(
> > +                       __HYPERVISOR_paging_domctl_cont, "h", u_domctl);
> >           copyback = true;
> >           break;
> >
> > diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
> > index 62b5349e7d..3a35543997 100644
> > --- a/xen/arch/x86/hvm/hypercall.c
> > +++ b/xen/arch/x86/hvm/hypercall.c
> > @@ -124,8 +124,6 @@ static long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> >       [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,  \
> >                                  (hypercall_fn_t *) compat_ ## x }
> >
> > -#define do_arch_1             paging_domctl_continuation
> > -
> >   static const struct {
> >       hypercall_fn_t *native, *compat;
> >   } hvm_hypercall_table[] = {
> > @@ -158,11 +156,9 @@ static const struct {
> >   #ifdef CONFIG_HYPFS
> >       HYPERCALL(hypfs_op),
> >   #endif
> > -    HYPERCALL(arch_1)
> > +    HYPERCALL(paging_domctl_cont)
> >   };
> >
> > -#undef do_arch_1
> > -
> >   #undef HYPERCALL
> >   #undef HVM_CALL
> >   #undef COMPAT_CALL
> > @@ -300,7 +296,7 @@ int hvm_hypercall(struct cpu_user_regs *regs)
> >   #endif
> >
> >           curr->hcall_compat = true;
> > -        regs->rax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
> > +        regs->eax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
> >           curr->hcall_compat = false;
> >
> >   #ifndef NDEBUG
> > diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
> > index 2370d31d3f..07e1a45ef5 100644
> > --- a/xen/arch/x86/hypercall.c
> > +++ b/xen/arch/x86/hypercall.c
> > @@ -75,7 +75,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] =
> >       ARGS(dm_op, 3),
> >       ARGS(hypfs_op, 5),
> >       ARGS(mca, 1),
> > -    ARGS(arch_1, 1),
> > +    ARGS(paging_domctl_cont, 1),
> >   };
> >
> >   #undef COMP
> > diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
> > index d6daa7e4cb..49973820af 100644
> > --- a/xen/arch/x86/include/asm/hypercall.h
> > +++ b/xen/arch/x86/include/asm/hypercall.h
> > @@ -11,6 +11,8 @@
> >   #include <public/arch-x86/xen-mca.h> /* for do_mca */
> >   #include <asm/paging.h>
> >
> > +#define __HYPERVISOR_paging_domctl_cont __HYPERVISOR_arch_1
> > +
> >   typedef unsigned long hypercall_fn_t(
> >       unsigned long, unsigned long, unsigned long,
> >       unsigned long, unsigned long);
> > @@ -80,7 +82,7 @@ do_set_debugreg(
> >       int reg,
> >       unsigned long value);
> >
> > -extern unsigned long cf_check
> > +extern long cf_check
> >   do_get_debugreg(
> >       int reg);
> >
> > @@ -118,7 +120,7 @@ do_mmuext_op(
> >   extern long cf_check do_callback_op(
> >       int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
> >
> > -extern unsigned long cf_check
> > +extern long cf_check
> >   do_iret(
> >       void);
> >
> > @@ -133,17 +135,20 @@ do_set_segment_base(
> >       unsigned int which,
> >       unsigned long base);
> >
> > +long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> > +
> > +long cf_check do_xenpmu_op(unsigned int op,
> > +                           XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
> > +
> > +long cf_check do_paging_domctl_cont(
> > +    XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
> > +
> >   #ifdef CONFIG_COMPAT
> >
> >   #include <compat/arch-x86/xen.h>
> >   #include <compat/physdev.h>
> >   #include <compat/platform.h>
> >
> > -extern int cf_check
> > -compat_physdev_op(
> > -    int cmd,
> > -    XEN_GUEST_HANDLE_PARAM(void) arg);
> > -
> >   extern int
> >   compat_common_vcpu_op(
> >       int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
> > @@ -154,12 +159,8 @@ extern int cf_check compat_mmuext_op(
> >       XEN_GUEST_HANDLE_PARAM(uint) pdone,
> >       unsigned int foreigndom);
> >
> > -DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
> > -extern int cf_check compat_platform_op(
> > -    XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
> > -
> > -extern long cf_check compat_callback_op(
> > -    int cmd, XEN_GUEST_HANDLE(void) arg);
> > +extern int cf_check compat_callback_op(
> > +    int cmd, XEN_GUEST_HANDLE(const_void) arg);
> >
> >   extern int cf_check compat_update_va_mapping(
> >       unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags);
> > @@ -177,12 +178,12 @@ extern int cf_check compat_set_gdt(
> >   extern int cf_check compat_update_descriptor(
> >       uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi);
> >
> > -extern unsigned int cf_check compat_iret(void);
> > +extern int cf_check compat_iret(void);
> >
> >   extern int cf_check compat_nmi_op(
> >       unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> >
> > -extern long cf_check compat_set_callbacks(
> > +extern int cf_check compat_set_callbacks(
> >       unsigned long event_selector, unsigned long event_address,
> >       unsigned long failsafe_selector, unsigned long failsafe_address);
> >
> > diff --git a/xen/arch/x86/include/asm/paging.h b/xen/arch/x86/include/asm/paging.h
> > index f0b4efc66e..54c440be65 100644
> > --- a/xen/arch/x86/include/asm/paging.h
> > +++ b/xen/arch/x86/include/asm/paging.h
> > @@ -234,9 +234,6 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
> >                     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl,
> >                     bool_t resuming);
> >
> > -/* Helper hypercall for dealing with continuations. */
> > -long cf_check paging_domctl_continuation(XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
> > -
> >   /* Call when destroying a vcpu/domain */
> >   void paging_vcpu_teardown(struct vcpu *v);
> >   int paging_teardown(struct domain *d);
> > diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
> > index 1f0b94ad21..a7e2707ecc 100644
> > --- a/xen/arch/x86/mm/paging.c
> > +++ b/xen/arch/x86/mm/paging.c
> > @@ -21,6 +21,7 @@
> >
> >   #include <xen/init.h>
> >   #include <xen/guest_access.h>
> > +#include <xen/hypercall.h>
> >   #include <asm/paging.h>
> >   #include <asm/shadow.h>
> >   #include <asm/p2m.h>
> > @@ -759,7 +760,7 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
> >           return shadow_domctl(d, sc, u_domctl);
> >   }
> >
> > -long cf_check paging_domctl_continuation(
> > +long cf_check do_paging_domctl_cont(
> >       XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
> >   {
> >       struct xen_domctl op;
> > diff --git a/xen/arch/x86/pv/callback.c b/xen/arch/x86/pv/callback.c
> > index 55148c7f9e..1be9d3f731 100644
> > --- a/xen/arch/x86/pv/callback.c
> > +++ b/xen/arch/x86/pv/callback.c
> > @@ -207,9 +207,9 @@ long cf_check do_set_callbacks(
> >   #include <compat/callback.h>
> >   #include <compat/nmi.h>
> >
> > -static long compat_register_guest_callback(struct compat_callback_register *reg)
> > +static int compat_register_guest_callback(struct compat_callback_register *reg)
> >   {
> > -    long ret = 0;
> > +    int ret = 0;
> >       struct vcpu *curr = current;
> >
> >       fixup_guest_code_selector(curr->domain, reg->address.cs);
> > @@ -256,10 +256,10 @@ static long compat_register_guest_callback(struct compat_callback_register *reg)
> >       return ret;
> >   }
> >
> > -static long compat_unregister_guest_callback(
> > +static int compat_unregister_guest_callback(
> >       struct compat_callback_unregister *unreg)
> >   {
> > -    long ret;
> > +    int ret;
> >
> >       switch ( unreg->type )
> >       {
> > @@ -283,9 +283,9 @@ static long compat_unregister_guest_callback(
> >       return ret;
> >   }
> >
> > -long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> > +int cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
> >   {
> > -    long ret;
> > +    int ret;
> >
> >       switch ( cmd )
> >       {
> > @@ -321,7 +321,7 @@ long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> >       return ret;
> >   }
> >
> > -long cf_check compat_set_callbacks(
> > +int cf_check compat_set_callbacks(
> >       unsigned long event_selector, unsigned long event_address,
> >       unsigned long failsafe_selector, unsigned long failsafe_address)
> >   {
> > diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
> > index 22b10dec2a..5da00e24e4 100644
> > --- a/xen/arch/x86/pv/emul-priv-op.c
> > +++ b/xen/arch/x86/pv/emul-priv-op.c
> > @@ -22,13 +22,13 @@
> >   #include <xen/domain_page.h>
> >   #include <xen/event.h>
> >   #include <xen/guest_access.h>
> > +#include <xen/hypercall.h>
> >   #include <xen/iocap.h>
> >
> >   #include <asm/amd.h>
> >   #include <asm/debugreg.h>
> >   #include <asm/endbr.h>
> >   #include <asm/hpet.h>
> > -#include <asm/hypercall.h>
> >   #include <asm/mc146818rtc.h>
> >   #include <asm/pv/domain.h>
> >   #include <asm/pv/trace.h>
> > diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
> > index e8fbee7bbb..fe8dfe9e8f 100644
> > --- a/xen/arch/x86/pv/hypercall.c
> > +++ b/xen/arch/x86/pv/hypercall.c
> > @@ -47,8 +47,6 @@ typedef struct {
> >   #define COMPAT_CALL(x) HYPERCALL(x)
> >   #endif
> >
> > -#define do_arch_1             paging_domctl_continuation
> > -
> >   static const pv_hypercall_table_t pv_hypercall_table[] = {
> >       COMPAT_CALL(set_trap_table),
> >       HYPERCALL(mmu_update),
> > @@ -109,11 +107,10 @@ static const pv_hypercall_table_t pv_hypercall_table[] = {
> >   #endif
> >       HYPERCALL(mca),
> >   #ifndef CONFIG_PV_SHIM_EXCLUSIVE
> > -    HYPERCALL(arch_1),
> > +    HYPERCALL(paging_domctl_cont),
> >   #endif
> >   };
> >
> > -#undef do_arch_1
> >   #undef COMPAT_CALL
> >   #undef HYPERCALL
> >
> > diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
> > index dd2965d8f0..55eb6a63bd 100644
> > --- a/xen/arch/x86/pv/iret.c
> > +++ b/xen/arch/x86/pv/iret.c
> > @@ -48,7 +48,7 @@ static void async_exception_cleanup(struct vcpu *curr)
> >           curr->arch.async_exception_state(trap).old_mask;
> >   }
> >
> > -unsigned long cf_check do_iret(void)
> > +long cf_check do_iret(void)
> >   {
> >       struct cpu_user_regs *regs = guest_cpu_user_regs();
> >       struct iret_context iret_saved;
> > @@ -105,7 +105,7 @@ unsigned long cf_check do_iret(void)
> >   }
> >
> >   #ifdef CONFIG_PV32
> > -unsigned int cf_check compat_iret(void)
> > +int cf_check compat_iret(void)
> >   {
> >       struct cpu_user_regs *regs = guest_cpu_user_regs();
> >       struct vcpu *v = current;
> > diff --git a/xen/arch/x86/pv/misc-hypercalls.c b/xen/arch/x86/pv/misc-hypercalls.c
> > index 5649aaab44..635f5a644a 100644
> > --- a/xen/arch/x86/pv/misc-hypercalls.c
> > +++ b/xen/arch/x86/pv/misc-hypercalls.c
> > @@ -28,12 +28,16 @@ long cf_check do_set_debugreg(int reg, unsigned long value)
> >       return set_debugreg(current, reg, value);
> >   }
> >
> > -unsigned long cf_check do_get_debugreg(int reg)
> > +long cf_check do_get_debugreg(int reg)
> >   {
> > -    unsigned long val;
> > -    int res = x86emul_read_dr(reg, &val, NULL);
> > -
> > -    return res == X86EMUL_OKAY ? val : -ENODEV;
> > +    /* Avoid implementation defined behavior casting unsigned long to long. */
> > +    union {
> > +        unsigned long val;
> > +        long ret;
> > +    } u;
> > +    int res = x86emul_read_dr(reg, &u.val, NULL);
> > +
> > +    return res == X86EMUL_OKAY ? u.ret : -ENODEV;
> >   }
> >
> >   long cf_check do_fpu_taskswitch(int set)
> > diff --git a/xen/common/argo.c b/xen/common/argo.c
> > index 297f6d11f0..26a01c2188 100644
> > --- a/xen/common/argo.c
> > +++ b/xen/common/argo.c
> > @@ -2207,13 +2207,13 @@ do_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
> >   }
> >
> >   #ifdef CONFIG_COMPAT
> > -long cf_check
> > +int cf_check
> >   compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
> >                  XEN_GUEST_HANDLE_PARAM(void) arg2, unsigned long arg3,
> >                  unsigned long arg4)
> >   {
> >       struct domain *currd = current->domain;
> > -    long rc;
> > +    int rc;
> >       xen_argo_send_addr_t send_addr;
> >       xen_argo_iov_t iovs[XEN_ARGO_MAXIOV];
> >       compat_argo_iov_t compat_iovs[XEN_ARGO_MAXIOV];
> > @@ -2267,7 +2267,7 @@ compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
> >
> >       rc = sendv(currd, &send_addr.src, &send_addr.dst, iovs, niov, arg4);
> >    out:
> > -    argo_dprintk("<-compat_argo_op(%u)=%ld\n", cmd, rc);
> > +    argo_dprintk("<-compat_argo_op(%u)=%d\n", cmd, rc);
> >
> >       return rc;
> >   }
> > diff --git a/xen/common/kexec.c b/xen/common/kexec.c
> > index a2ffb6530c..41669964d2 100644
> > --- a/xen/common/kexec.c
> > +++ b/xen/common/kexec.c
> > @@ -1213,7 +1213,7 @@ static int kexec_status(XEN_GUEST_HANDLE_PARAM(void) uarg)
> >       return !!test_bit(bit, &kexec_flags);
> >   }
> >
> > -static int do_kexec_op_internal(unsigned long op,
> > +static int do_kexec_op_internal(unsigned int op,
> >                                   XEN_GUEST_HANDLE_PARAM(void) uarg,
> >                                   bool_t compat)
> >   {
> > @@ -1265,13 +1265,13 @@ static int do_kexec_op_internal(unsigned long op,
> >       return ret;
> >   }
> >
> > -long cf_check do_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> > +long cf_check do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> >   {
> >       return do_kexec_op_internal(op, uarg, 0);
> >   }
> >
> >   #ifdef CONFIG_COMPAT
> > -int cf_check compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> > +int cf_check compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> >   {
> >       return do_kexec_op_internal(op, uarg, 1);
> >   }
> > diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
> > index 81aae7a662..a032ba2b4a 100644
> > --- a/xen/include/xen/hypercall.h
> > +++ b/xen/include/xen/hypercall.h
> > @@ -114,11 +114,6 @@ common_vcpu_op(int cmd,
> >       struct vcpu *v,
> >       XEN_GUEST_HANDLE_PARAM(void) arg);
> >
> > -extern long cf_check
> > -do_nmi_op(
> > -    unsigned int cmd,
> > -    XEN_GUEST_HANDLE_PARAM(void) arg);
> > -
> >   extern long cf_check
> >   do_hvm_op(
> >       unsigned long op,
> > @@ -126,7 +121,7 @@ do_hvm_op(
> >
> >   extern long cf_check
> >   do_kexec_op(
> > -    unsigned long op,
> > +    unsigned int op,
> >       XEN_GUEST_HANDLE_PARAM(void) uarg);
> >
> >   extern long cf_check
> > @@ -145,9 +140,6 @@ extern long cf_check do_argo_op(
> >   extern long cf_check
> >   do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
> >
> > -extern long cf_check
> > -do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
> > -
> >   extern long cf_check
> >   do_dm_op(
> >       domid_t domid,
> > @@ -205,15 +197,21 @@ extern int cf_check compat_xsm_op(
> >       XEN_GUEST_HANDLE_PARAM(void) op);
> >
> >   extern int cf_check compat_kexec_op(
> > -    unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg);
> > +    unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
> >
> >   DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
> >   extern int cf_check compat_multicall(
> >       XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list,
> >       uint32_t nr_calls);
> >
> > +int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> > +
> > +typedef struct compat_platform_op compat_platform_op_t;
> > +DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
> > +int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
> > +
> >   #ifdef CONFIG_ARGO
> > -extern long cf_check compat_argo_op(
> > +extern int cf_check compat_argo_op(
> >       unsigned int cmd,
> >       XEN_GUEST_HANDLE_PARAM(void) arg1,
> >       XEN_GUEST_HANDLE_PARAM(void) arg2,
>


^ permalink raw reply	[flat|nested] 34+ messages in thread

* ***PING***: [PATCH v6 0/9] xen: drop hypercall function tables
  2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
                   ` (10 preceding siblings ...)
  2022-07-06  7:30 ` Henry Wang
@ 2022-07-07 16:10 ` Jan Beulich
  11 siblings, 0 replies; 34+ messages in thread
From: Jan Beulich @ 2022-07-07 16:10 UTC (permalink / raw)
  To: Andrew Cooper
  Cc: Stefano Stabellini, Julien Grall, Bertrand Marquis,
	Volodymyr Babchuk, George Dunlap, Wei Liu, Roger Pau Monné,
	Christopher Clark, Dario Faggioli, Daniel De Graaf,
	Daniel P. Smith, xen-devel, Juergen Gross

Andrew,

On 24.03.2022 15:01, Juergen Gross wrote:
> Juergen Gross (9):
>   xen: move do_vcpu_op() to arch specific code
>   xen: harmonize return types of hypercall handlers
>   xen: don't include asm/hypercall.h from C sources
>   xen: include compat/platform.h from hypercall.h
>   xen: generate hypercall interface related code
>   xen: use generated prototypes for hypercall handlers
>   xen/x86: call hypercall handlers via generated macro
>   xen/arm: call hypercall handlers via generated macro
>   xen/x86: remove cf_check attribute from hypercall handlers

we've discussed the state of this on the Community Call today.
Unfortunately you weren't there. It was common consensus that we've
waited long enough here, so unless very good reasons (including a
timeline) appear very quickly, the plan is to commit the series
(with REST acks to stand in for the few small areas were acks are
still missing) early next week. Should performance issues really
turn out excessively bad, we can still consider reverting down the
road; I don't expect we would want to go that route though, and
rather make incremental adjustments as necessary.

Thanks for your understanding,
Jan


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 2/9] xen: harmonize return types of hypercall handlers
  2022-07-06 19:22     ` Christopher Clark
@ 2022-07-07 16:12       ` Christopher Clark
  0 siblings, 0 replies; 34+ messages in thread
From: Christopher Clark @ 2022-07-07 16:12 UTC (permalink / raw)
  To: Juergen Gross
  Cc: xen-devel, Andrew Cooper, Jan Beulich, Roger Pau Monné,
	Wei Liu, George Dunlap, Julien Grall, Stefano Stabellini

On Wed, Jul 6, 2022 at 12:22 PM Christopher Clark
<christopher.w.clark@gmail.com> wrote:
>
> On Tue, Jun 28, 2022 at 11:24 PM Juergen Gross <jgross@suse.com> wrote:
> >
> > On 24.03.22 15:01, Juergen Gross wrote:
> > > Today most hypercall handlers have a return type of long, while the
> > > compat ones return an int. There are a few exceptions from that rule,
> > > however.
> > >
> > > Get rid of the exceptions by letting compat handlers always return int
> > > and others always return long, with the exception of the Arm specific
> > > physdev_op handler.
> > >
> > > For the compat hvm case use eax instead of rax for the stored result as
> > > it should have been from the beginning.
> > >
> > > Additionally move some prototypes to include/asm-x86/hypercall.h
> > > as they are x86 specific. Move the compat_platform_op() prototype to
> > > the common header.
> > >
> > > Rename paging_domctl_continuation() to do_paging_domctl_cont() and add
> > > a matching define for the associated hypercall.
> > >
> > > Make do_callback_op() and compat_callback_op() more similar by adding
> > > the const attribute to compat_callback_op()'s 2nd parameter.
> > >
> > > Change the type of the cmd parameter for [do|compat]_kexec_op() to
> > > unsigned int, as this is more appropriate for the compat case.
> > >
> > > Signed-off-by: Juergen Gross <jgross@suse.com>
> > > Reviewed-by: Jan Beulich <jbeulich@suse.com>
> >
> > Could I please have some feedback regarding the kexec and argo changes?
>
> Thanks for the ping on this and apologies for the delay. The
> Argo-related changes in this patch look ok, and I have built and
> tested Argo functionality with this patch applied with PV 32 and 64
> bit guests, using XTF -- with successful results for the patch -- but
> I am behind on exercising it on a system that can run HVM guests,
> sorry. Given the HVM-related change described in the description of
> the patch, I think that such a test is needed and I am working on
> getting a build and a system installed to get that done.

As discussed on the Xen Community Call today, for the Argo changes:

Reviewed-by: Christopher Clark <christopher.w.clark@gmail.com>

and tested for 32 and 64-bit PV guests on x86.
thanks,

Christopher

>
> Christopher
>
> >
> >
> > Juergen
> >
> > > ---
> > > V2:
> > > - rework platform_op compat handling (Jan Beulich)
> > > V3:
> > > - remove include of types.h (Jan Beulich)
> > > V4:
> > > - don't move do_physdev_op() (Julien Grall)
> > > - carve out non style compliant parameter replacements (Julien Grall)
> > > V6:
> > > - remove rebase artifact (Jan Beulich)
> > > ---
> > >   xen/arch/x86/domctl.c                |  4 ++--
> > >   xen/arch/x86/hvm/hypercall.c         |  8 ++-----
> > >   xen/arch/x86/hypercall.c             |  2 +-
> > >   xen/arch/x86/include/asm/hypercall.h | 31 ++++++++++++++--------------
> > >   xen/arch/x86/include/asm/paging.h    |  3 ---
> > >   xen/arch/x86/mm/paging.c             |  3 ++-
> > >   xen/arch/x86/pv/callback.c           | 14 ++++++-------
> > >   xen/arch/x86/pv/emul-priv-op.c       |  2 +-
> > >   xen/arch/x86/pv/hypercall.c          |  5 +----
> > >   xen/arch/x86/pv/iret.c               |  4 ++--
> > >   xen/arch/x86/pv/misc-hypercalls.c    | 14 ++++++++-----
> > >   xen/common/argo.c                    |  6 +++---
> > >   xen/common/kexec.c                   |  6 +++---
> > >   xen/include/xen/hypercall.h          | 20 ++++++++----------
> > >   14 files changed, 58 insertions(+), 64 deletions(-)
> > >
> > > diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
> > > index e49f9e91b9..ea7d60ffb6 100644
> > > --- a/xen/arch/x86/domctl.c
> > > +++ b/xen/arch/x86/domctl.c
> > > @@ -221,8 +221,8 @@ long arch_do_domctl(
> > >       case XEN_DOMCTL_shadow_op:
> > >           ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0);
> > >           if ( ret == -ERESTART )
> > > -            return hypercall_create_continuation(__HYPERVISOR_arch_1,
> > > -                                                 "h", u_domctl);
> > > +            return hypercall_create_continuation(
> > > +                       __HYPERVISOR_paging_domctl_cont, "h", u_domctl);
> > >           copyback = true;
> > >           break;
> > >
> > > diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c
> > > index 62b5349e7d..3a35543997 100644
> > > --- a/xen/arch/x86/hvm/hypercall.c
> > > +++ b/xen/arch/x86/hvm/hypercall.c
> > > @@ -124,8 +124,6 @@ static long cf_check hvm_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
> > >       [ __HYPERVISOR_ ## x ] = { (hypercall_fn_t *) do_ ## x,  \
> > >                                  (hypercall_fn_t *) compat_ ## x }
> > >
> > > -#define do_arch_1             paging_domctl_continuation
> > > -
> > >   static const struct {
> > >       hypercall_fn_t *native, *compat;
> > >   } hvm_hypercall_table[] = {
> > > @@ -158,11 +156,9 @@ static const struct {
> > >   #ifdef CONFIG_HYPFS
> > >       HYPERCALL(hypfs_op),
> > >   #endif
> > > -    HYPERCALL(arch_1)
> > > +    HYPERCALL(paging_domctl_cont)
> > >   };
> > >
> > > -#undef do_arch_1
> > > -
> > >   #undef HYPERCALL
> > >   #undef HVM_CALL
> > >   #undef COMPAT_CALL
> > > @@ -300,7 +296,7 @@ int hvm_hypercall(struct cpu_user_regs *regs)
> > >   #endif
> > >
> > >           curr->hcall_compat = true;
> > > -        regs->rax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
> > > +        regs->eax = hvm_hypercall_table[eax].compat(ebx, ecx, edx, esi, edi);
> > >           curr->hcall_compat = false;
> > >
> > >   #ifndef NDEBUG
> > > diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c
> > > index 2370d31d3f..07e1a45ef5 100644
> > > --- a/xen/arch/x86/hypercall.c
> > > +++ b/xen/arch/x86/hypercall.c
> > > @@ -75,7 +75,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] =
> > >       ARGS(dm_op, 3),
> > >       ARGS(hypfs_op, 5),
> > >       ARGS(mca, 1),
> > > -    ARGS(arch_1, 1),
> > > +    ARGS(paging_domctl_cont, 1),
> > >   };
> > >
> > >   #undef COMP
> > > diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h
> > > index d6daa7e4cb..49973820af 100644
> > > --- a/xen/arch/x86/include/asm/hypercall.h
> > > +++ b/xen/arch/x86/include/asm/hypercall.h
> > > @@ -11,6 +11,8 @@
> > >   #include <public/arch-x86/xen-mca.h> /* for do_mca */
> > >   #include <asm/paging.h>
> > >
> > > +#define __HYPERVISOR_paging_domctl_cont __HYPERVISOR_arch_1
> > > +
> > >   typedef unsigned long hypercall_fn_t(
> > >       unsigned long, unsigned long, unsigned long,
> > >       unsigned long, unsigned long);
> > > @@ -80,7 +82,7 @@ do_set_debugreg(
> > >       int reg,
> > >       unsigned long value);
> > >
> > > -extern unsigned long cf_check
> > > +extern long cf_check
> > >   do_get_debugreg(
> > >       int reg);
> > >
> > > @@ -118,7 +120,7 @@ do_mmuext_op(
> > >   extern long cf_check do_callback_op(
> > >       int cmd, XEN_GUEST_HANDLE_PARAM(const_void) arg);
> > >
> > > -extern unsigned long cf_check
> > > +extern long cf_check
> > >   do_iret(
> > >       void);
> > >
> > > @@ -133,17 +135,20 @@ do_set_segment_base(
> > >       unsigned int which,
> > >       unsigned long base);
> > >
> > > +long cf_check do_nmi_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> > > +
> > > +long cf_check do_xenpmu_op(unsigned int op,
> > > +                           XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
> > > +
> > > +long cf_check do_paging_domctl_cont(
> > > +    XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
> > > +
> > >   #ifdef CONFIG_COMPAT
> > >
> > >   #include <compat/arch-x86/xen.h>
> > >   #include <compat/physdev.h>
> > >   #include <compat/platform.h>
> > >
> > > -extern int cf_check
> > > -compat_physdev_op(
> > > -    int cmd,
> > > -    XEN_GUEST_HANDLE_PARAM(void) arg);
> > > -
> > >   extern int
> > >   compat_common_vcpu_op(
> > >       int cmd, struct vcpu *v, XEN_GUEST_HANDLE_PARAM(void) arg);
> > > @@ -154,12 +159,8 @@ extern int cf_check compat_mmuext_op(
> > >       XEN_GUEST_HANDLE_PARAM(uint) pdone,
> > >       unsigned int foreigndom);
> > >
> > > -DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
> > > -extern int cf_check compat_platform_op(
> > > -    XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
> > > -
> > > -extern long cf_check compat_callback_op(
> > > -    int cmd, XEN_GUEST_HANDLE(void) arg);
> > > +extern int cf_check compat_callback_op(
> > > +    int cmd, XEN_GUEST_HANDLE(const_void) arg);
> > >
> > >   extern int cf_check compat_update_va_mapping(
> > >       unsigned int va, uint32_t lo, uint32_t hi, unsigned int flags);
> > > @@ -177,12 +178,12 @@ extern int cf_check compat_set_gdt(
> > >   extern int cf_check compat_update_descriptor(
> > >       uint32_t pa_lo, uint32_t pa_hi, uint32_t desc_lo, uint32_t desc_hi);
> > >
> > > -extern unsigned int cf_check compat_iret(void);
> > > +extern int cf_check compat_iret(void);
> > >
> > >   extern int cf_check compat_nmi_op(
> > >       unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> > >
> > > -extern long cf_check compat_set_callbacks(
> > > +extern int cf_check compat_set_callbacks(
> > >       unsigned long event_selector, unsigned long event_address,
> > >       unsigned long failsafe_selector, unsigned long failsafe_address);
> > >
> > > diff --git a/xen/arch/x86/include/asm/paging.h b/xen/arch/x86/include/asm/paging.h
> > > index f0b4efc66e..54c440be65 100644
> > > --- a/xen/arch/x86/include/asm/paging.h
> > > +++ b/xen/arch/x86/include/asm/paging.h
> > > @@ -234,9 +234,6 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
> > >                     XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl,
> > >                     bool_t resuming);
> > >
> > > -/* Helper hypercall for dealing with continuations. */
> > > -long cf_check paging_domctl_continuation(XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
> > > -
> > >   /* Call when destroying a vcpu/domain */
> > >   void paging_vcpu_teardown(struct vcpu *v);
> > >   int paging_teardown(struct domain *d);
> > > diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
> > > index 1f0b94ad21..a7e2707ecc 100644
> > > --- a/xen/arch/x86/mm/paging.c
> > > +++ b/xen/arch/x86/mm/paging.c
> > > @@ -21,6 +21,7 @@
> > >
> > >   #include <xen/init.h>
> > >   #include <xen/guest_access.h>
> > > +#include <xen/hypercall.h>
> > >   #include <asm/paging.h>
> > >   #include <asm/shadow.h>
> > >   #include <asm/p2m.h>
> > > @@ -759,7 +760,7 @@ int paging_domctl(struct domain *d, struct xen_domctl_shadow_op *sc,
> > >           return shadow_domctl(d, sc, u_domctl);
> > >   }
> > >
> > > -long cf_check paging_domctl_continuation(
> > > +long cf_check do_paging_domctl_cont(
> > >       XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
> > >   {
> > >       struct xen_domctl op;
> > > diff --git a/xen/arch/x86/pv/callback.c b/xen/arch/x86/pv/callback.c
> > > index 55148c7f9e..1be9d3f731 100644
> > > --- a/xen/arch/x86/pv/callback.c
> > > +++ b/xen/arch/x86/pv/callback.c
> > > @@ -207,9 +207,9 @@ long cf_check do_set_callbacks(
> > >   #include <compat/callback.h>
> > >   #include <compat/nmi.h>
> > >
> > > -static long compat_register_guest_callback(struct compat_callback_register *reg)
> > > +static int compat_register_guest_callback(struct compat_callback_register *reg)
> > >   {
> > > -    long ret = 0;
> > > +    int ret = 0;
> > >       struct vcpu *curr = current;
> > >
> > >       fixup_guest_code_selector(curr->domain, reg->address.cs);
> > > @@ -256,10 +256,10 @@ static long compat_register_guest_callback(struct compat_callback_register *reg)
> > >       return ret;
> > >   }
> > >
> > > -static long compat_unregister_guest_callback(
> > > +static int compat_unregister_guest_callback(
> > >       struct compat_callback_unregister *unreg)
> > >   {
> > > -    long ret;
> > > +    int ret;
> > >
> > >       switch ( unreg->type )
> > >       {
> > > @@ -283,9 +283,9 @@ static long compat_unregister_guest_callback(
> > >       return ret;
> > >   }
> > >
> > > -long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> > > +int cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(const_void) arg)
> > >   {
> > > -    long ret;
> > > +    int ret;
> > >
> > >       switch ( cmd )
> > >       {
> > > @@ -321,7 +321,7 @@ long cf_check compat_callback_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> > >       return ret;
> > >   }
> > >
> > > -long cf_check compat_set_callbacks(
> > > +int cf_check compat_set_callbacks(
> > >       unsigned long event_selector, unsigned long event_address,
> > >       unsigned long failsafe_selector, unsigned long failsafe_address)
> > >   {
> > > diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
> > > index 22b10dec2a..5da00e24e4 100644
> > > --- a/xen/arch/x86/pv/emul-priv-op.c
> > > +++ b/xen/arch/x86/pv/emul-priv-op.c
> > > @@ -22,13 +22,13 @@
> > >   #include <xen/domain_page.h>
> > >   #include <xen/event.h>
> > >   #include <xen/guest_access.h>
> > > +#include <xen/hypercall.h>
> > >   #include <xen/iocap.h>
> > >
> > >   #include <asm/amd.h>
> > >   #include <asm/debugreg.h>
> > >   #include <asm/endbr.h>
> > >   #include <asm/hpet.h>
> > > -#include <asm/hypercall.h>
> > >   #include <asm/mc146818rtc.h>
> > >   #include <asm/pv/domain.h>
> > >   #include <asm/pv/trace.h>
> > > diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c
> > > index e8fbee7bbb..fe8dfe9e8f 100644
> > > --- a/xen/arch/x86/pv/hypercall.c
> > > +++ b/xen/arch/x86/pv/hypercall.c
> > > @@ -47,8 +47,6 @@ typedef struct {
> > >   #define COMPAT_CALL(x) HYPERCALL(x)
> > >   #endif
> > >
> > > -#define do_arch_1             paging_domctl_continuation
> > > -
> > >   static const pv_hypercall_table_t pv_hypercall_table[] = {
> > >       COMPAT_CALL(set_trap_table),
> > >       HYPERCALL(mmu_update),
> > > @@ -109,11 +107,10 @@ static const pv_hypercall_table_t pv_hypercall_table[] = {
> > >   #endif
> > >       HYPERCALL(mca),
> > >   #ifndef CONFIG_PV_SHIM_EXCLUSIVE
> > > -    HYPERCALL(arch_1),
> > > +    HYPERCALL(paging_domctl_cont),
> > >   #endif
> > >   };
> > >
> > > -#undef do_arch_1
> > >   #undef COMPAT_CALL
> > >   #undef HYPERCALL
> > >
> > > diff --git a/xen/arch/x86/pv/iret.c b/xen/arch/x86/pv/iret.c
> > > index dd2965d8f0..55eb6a63bd 100644
> > > --- a/xen/arch/x86/pv/iret.c
> > > +++ b/xen/arch/x86/pv/iret.c
> > > @@ -48,7 +48,7 @@ static void async_exception_cleanup(struct vcpu *curr)
> > >           curr->arch.async_exception_state(trap).old_mask;
> > >   }
> > >
> > > -unsigned long cf_check do_iret(void)
> > > +long cf_check do_iret(void)
> > >   {
> > >       struct cpu_user_regs *regs = guest_cpu_user_regs();
> > >       struct iret_context iret_saved;
> > > @@ -105,7 +105,7 @@ unsigned long cf_check do_iret(void)
> > >   }
> > >
> > >   #ifdef CONFIG_PV32
> > > -unsigned int cf_check compat_iret(void)
> > > +int cf_check compat_iret(void)
> > >   {
> > >       struct cpu_user_regs *regs = guest_cpu_user_regs();
> > >       struct vcpu *v = current;
> > > diff --git a/xen/arch/x86/pv/misc-hypercalls.c b/xen/arch/x86/pv/misc-hypercalls.c
> > > index 5649aaab44..635f5a644a 100644
> > > --- a/xen/arch/x86/pv/misc-hypercalls.c
> > > +++ b/xen/arch/x86/pv/misc-hypercalls.c
> > > @@ -28,12 +28,16 @@ long cf_check do_set_debugreg(int reg, unsigned long value)
> > >       return set_debugreg(current, reg, value);
> > >   }
> > >
> > > -unsigned long cf_check do_get_debugreg(int reg)
> > > +long cf_check do_get_debugreg(int reg)
> > >   {
> > > -    unsigned long val;
> > > -    int res = x86emul_read_dr(reg, &val, NULL);
> > > -
> > > -    return res == X86EMUL_OKAY ? val : -ENODEV;
> > > +    /* Avoid implementation defined behavior casting unsigned long to long. */
> > > +    union {
> > > +        unsigned long val;
> > > +        long ret;
> > > +    } u;
> > > +    int res = x86emul_read_dr(reg, &u.val, NULL);
> > > +
> > > +    return res == X86EMUL_OKAY ? u.ret : -ENODEV;
> > >   }
> > >
> > >   long cf_check do_fpu_taskswitch(int set)
> > > diff --git a/xen/common/argo.c b/xen/common/argo.c
> > > index 297f6d11f0..26a01c2188 100644
> > > --- a/xen/common/argo.c
> > > +++ b/xen/common/argo.c
> > > @@ -2207,13 +2207,13 @@ do_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
> > >   }
> > >
> > >   #ifdef CONFIG_COMPAT
> > > -long cf_check
> > > +int cf_check
> > >   compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
> > >                  XEN_GUEST_HANDLE_PARAM(void) arg2, unsigned long arg3,
> > >                  unsigned long arg4)
> > >   {
> > >       struct domain *currd = current->domain;
> > > -    long rc;
> > > +    int rc;
> > >       xen_argo_send_addr_t send_addr;
> > >       xen_argo_iov_t iovs[XEN_ARGO_MAXIOV];
> > >       compat_argo_iov_t compat_iovs[XEN_ARGO_MAXIOV];
> > > @@ -2267,7 +2267,7 @@ compat_argo_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg1,
> > >
> > >       rc = sendv(currd, &send_addr.src, &send_addr.dst, iovs, niov, arg4);
> > >    out:
> > > -    argo_dprintk("<-compat_argo_op(%u)=%ld\n", cmd, rc);
> > > +    argo_dprintk("<-compat_argo_op(%u)=%d\n", cmd, rc);
> > >
> > >       return rc;
> > >   }
> > > diff --git a/xen/common/kexec.c b/xen/common/kexec.c
> > > index a2ffb6530c..41669964d2 100644
> > > --- a/xen/common/kexec.c
> > > +++ b/xen/common/kexec.c
> > > @@ -1213,7 +1213,7 @@ static int kexec_status(XEN_GUEST_HANDLE_PARAM(void) uarg)
> > >       return !!test_bit(bit, &kexec_flags);
> > >   }
> > >
> > > -static int do_kexec_op_internal(unsigned long op,
> > > +static int do_kexec_op_internal(unsigned int op,
> > >                                   XEN_GUEST_HANDLE_PARAM(void) uarg,
> > >                                   bool_t compat)
> > >   {
> > > @@ -1265,13 +1265,13 @@ static int do_kexec_op_internal(unsigned long op,
> > >       return ret;
> > >   }
> > >
> > > -long cf_check do_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> > > +long cf_check do_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> > >   {
> > >       return do_kexec_op_internal(op, uarg, 0);
> > >   }
> > >
> > >   #ifdef CONFIG_COMPAT
> > > -int cf_check compat_kexec_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> > > +int cf_check compat_kexec_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg)
> > >   {
> > >       return do_kexec_op_internal(op, uarg, 1);
> > >   }
> > > diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
> > > index 81aae7a662..a032ba2b4a 100644
> > > --- a/xen/include/xen/hypercall.h
> > > +++ b/xen/include/xen/hypercall.h
> > > @@ -114,11 +114,6 @@ common_vcpu_op(int cmd,
> > >       struct vcpu *v,
> > >       XEN_GUEST_HANDLE_PARAM(void) arg);
> > >
> > > -extern long cf_check
> > > -do_nmi_op(
> > > -    unsigned int cmd,
> > > -    XEN_GUEST_HANDLE_PARAM(void) arg);
> > > -
> > >   extern long cf_check
> > >   do_hvm_op(
> > >       unsigned long op,
> > > @@ -126,7 +121,7 @@ do_hvm_op(
> > >
> > >   extern long cf_check
> > >   do_kexec_op(
> > > -    unsigned long op,
> > > +    unsigned int op,
> > >       XEN_GUEST_HANDLE_PARAM(void) uarg);
> > >
> > >   extern long cf_check
> > > @@ -145,9 +140,6 @@ extern long cf_check do_argo_op(
> > >   extern long cf_check
> > >   do_xenoprof_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg);
> > >
> > > -extern long cf_check
> > > -do_xenpmu_op(unsigned int op, XEN_GUEST_HANDLE_PARAM(xen_pmu_params_t) arg);
> > > -
> > >   extern long cf_check
> > >   do_dm_op(
> > >       domid_t domid,
> > > @@ -205,15 +197,21 @@ extern int cf_check compat_xsm_op(
> > >       XEN_GUEST_HANDLE_PARAM(void) op);
> > >
> > >   extern int cf_check compat_kexec_op(
> > > -    unsigned long op, XEN_GUEST_HANDLE_PARAM(void) uarg);
> > > +    unsigned int op, XEN_GUEST_HANDLE_PARAM(void) uarg);
> > >
> > >   DEFINE_XEN_GUEST_HANDLE(multicall_entry_compat_t);
> > >   extern int cf_check compat_multicall(
> > >       XEN_GUEST_HANDLE_PARAM(multicall_entry_compat_t) call_list,
> > >       uint32_t nr_calls);
> > >
> > > +int compat_physdev_op(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg);
> > > +
> > > +typedef struct compat_platform_op compat_platform_op_t;
> > > +DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
> > > +int compat_platform_op(XEN_GUEST_HANDLE_PARAM(compat_platform_op_t) u_xenpf_op);
> > > +
> > >   #ifdef CONFIG_ARGO
> > > -extern long cf_check compat_argo_op(
> > > +extern int cf_check compat_argo_op(
> > >       unsigned int cmd,
> > >       XEN_GUEST_HANDLE_PARAM(void) arg1,
> > >       XEN_GUEST_HANDLE_PARAM(void) arg2,
> >


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 5/9] xen: generate hypercall interface related code
  2022-03-24 14:01 ` [PATCH v6 5/9] xen: generate hypercall interface related code Juergen Gross
@ 2022-07-11 10:18   ` Jan Beulich
  2022-07-11 10:50     ` Juergen Gross
  0 siblings, 1 reply; 34+ messages in thread
From: Jan Beulich @ 2022-07-11 10:18 UTC (permalink / raw)
  To: Juergen Gross, Anthony Perard
  Cc: Andrew Cooper, George Dunlap, Julien Grall, Stefano Stabellini,
	Wei Liu, Julien Grall, xen-devel

On 24.03.2022 15:01, Juergen Gross wrote:
> --- a/xen/include/Makefile
> +++ b/xen/include/Makefile
> @@ -77,6 +77,18 @@ $(obj)/compat/xlat.h: $(addprefix $(obj)/compat/.xlat/,$(xlat-y)) $(obj)/config/
>  	cat $(filter %.h,$^) >$@.new
>  	mv -f $@.new $@
>  
> +quiet_cmd_genhyp = GEN     $@
> +define cmd_genhyp
> +    awk -f $(srctree)/scripts/gen_hypercall.awk <$< >$@
> +endef
> +
> +all: $(obj)/xen/hypercall-defs.h
> +
> +$(obj)/xen/hypercall-defs.h: $(obj)/hypercall-defs.i $(srctree)/scripts/gen_hypercall.awk FORCE
> +	$(call if_changed,genhyp)
> +
> +targets += xen/hypercall-defs.h
> +
>  ifeq ($(XEN_TARGET_ARCH),$(XEN_COMPILE_ARCH))
>  
>  all: $(obj)/headers.chk $(obj)/headers99.chk $(obj)/headers++.chk
> @@ -132,3 +144,4 @@ all: lib-x86-all
>  endif
>  
>  clean-files := compat config generated headers*.chk xen/lib/x86/cpuid-autogen.h
> +clean-files += xen/hypercall-defs.h hypercall-defs.i

I've committed this as-is (with just fuzz suitably resolved), despite
being uncertain whether xen/hypercall-defs.h - being part of targets -
actually needs enumerating here (anymore).

Jan


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v6 5/9] xen: generate hypercall interface related code
  2022-07-11 10:18   ` Jan Beulich
@ 2022-07-11 10:50     ` Juergen Gross
  0 siblings, 0 replies; 34+ messages in thread
From: Juergen Gross @ 2022-07-11 10:50 UTC (permalink / raw)
  To: Jan Beulich, Anthony Perard
  Cc: Andrew Cooper, George Dunlap, Julien Grall, Stefano Stabellini,
	Wei Liu, Julien Grall, xen-devel


[-- Attachment #1.1.1: Type: text/plain, Size: 1346 bytes --]

On 11.07.22 12:18, Jan Beulich wrote:
> On 24.03.2022 15:01, Juergen Gross wrote:
>> --- a/xen/include/Makefile
>> +++ b/xen/include/Makefile
>> @@ -77,6 +77,18 @@ $(obj)/compat/xlat.h: $(addprefix $(obj)/compat/.xlat/,$(xlat-y)) $(obj)/config/
>>   	cat $(filter %.h,$^) >$@.new
>>   	mv -f $@.new $@
>>   
>> +quiet_cmd_genhyp = GEN     $@
>> +define cmd_genhyp
>> +    awk -f $(srctree)/scripts/gen_hypercall.awk <$< >$@
>> +endef
>> +
>> +all: $(obj)/xen/hypercall-defs.h
>> +
>> +$(obj)/xen/hypercall-defs.h: $(obj)/hypercall-defs.i $(srctree)/scripts/gen_hypercall.awk FORCE
>> +	$(call if_changed,genhyp)
>> +
>> +targets += xen/hypercall-defs.h
>> +
>>   ifeq ($(XEN_TARGET_ARCH),$(XEN_COMPILE_ARCH))
>>   
>>   all: $(obj)/headers.chk $(obj)/headers99.chk $(obj)/headers++.chk
>> @@ -132,3 +144,4 @@ all: lib-x86-all
>>   endif
>>   
>>   clean-files := compat config generated headers*.chk xen/lib/x86/cpuid-autogen.h
>> +clean-files += xen/hypercall-defs.h hypercall-defs.i
> 
> I've committed this as-is (with just fuzz suitably resolved), despite
> being uncertain whether xen/hypercall-defs.h - being part of targets -
> actually needs enumerating here (anymore).

Without it being enumerated "make clean" will still remove it. So it is
obviously not needed.

Sending a patch ...


Juergen


[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]

^ permalink raw reply	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2022-07-11 10:50 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-24 14:01 [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
2022-03-24 14:01 ` [PATCH v6 1/9] xen: move do_vcpu_op() to arch specific code Juergen Gross
2022-06-07  5:00   ` Juergen Gross
2022-06-27 10:28   ` Roger Pau Monné
2022-06-27 10:40     ` Juergen Gross
2022-06-27 11:02       ` Roger Pau Monné
2022-06-27 11:08         ` Juergen Gross
2022-06-27 11:35           ` Roger Pau Monné
2022-06-27 11:47             ` Juergen Gross
2022-06-27 13:00   ` Roger Pau Monné
2022-03-24 14:01 ` [PATCH v6 2/9] xen: harmonize return types of hypercall handlers Juergen Gross
2022-06-29  6:24   ` Juergen Gross
2022-07-06 19:22     ` Christopher Clark
2022-07-07 16:12       ` Christopher Clark
2022-03-24 14:01 ` [PATCH v6 3/9] xen: don't include asm/hypercall.h from C sources Juergen Gross
2022-03-24 14:01 ` [PATCH v6 4/9] xen: include compat/platform.h from hypercall.h Juergen Gross
2022-03-24 14:01 ` [PATCH v6 5/9] xen: generate hypercall interface related code Juergen Gross
2022-07-11 10:18   ` Jan Beulich
2022-07-11 10:50     ` Juergen Gross
2022-03-24 14:01 ` [PATCH v6 6/9] xen: use generated prototypes for hypercall handlers Juergen Gross
2022-03-24 14:01 ` [PATCH v6 7/9] xen/x86: call hypercall handlers via generated macro Juergen Gross
2022-03-24 14:01 ` [PATCH v6 8/9] xen/arm: " Juergen Gross
2022-03-24 14:01 ` [PATCH v6 9/9] xen/x86: remove cf_check attribute from hypercall handlers Juergen Gross
2022-04-08 10:36   ` Dario Faggioli
2022-04-19  8:01 ` [PATCH v6 0/9] xen: drop hypercall function tables Juergen Gross
2022-05-04  7:53   ` Juergen Gross
2022-05-18  9:45     ` Juergen Gross
2022-05-18  9:50       ` Jan Beulich
2022-06-07  5:05       ` Juergen Gross
2022-06-23 13:07       ` Juergen Gross
2022-07-06  7:30 ` Henry Wang
2022-07-06  8:57   ` Jan Beulich
2022-07-06  9:35     ` Henry Wang
2022-07-07 16:10 ` ***PING***: " Jan Beulich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.