On 2024-11-18 22:41, Andrew Cooper wrote:
Hello,

Eclair reports Rule 8.4 violations for these two.  They're real
violations, but fixing them is proving challenging.

Because of how x86_64/platform_hypercall.c sets up some defines and
includes ../platform_hypercall.c, the declarations of
compat_set_{cx,px}_pminfo() of pmstat.h become compat ones.

Therefore the real hypercall handler does see a correct declaration.

However, the implementation in cpufreq.c does not get the compat-ified
version of pmstat.h, so misses the declaration and thus the violation.

Worse however is the fact that cpufreq.c depends on not having the:

#define xen_processor_performance compat_processor_performance

in scope while it's transforming between the two formats, meaning we
can't simply reuse pmstat.h with suitable defines.

Any clever ideas for how to untangle this mess, before I go for the
brute force approach of an #if COMPAT section in the main hypercall handler?


Yeah, that is why these were among the last ones. I'm afraid I didn't come up with a reasonable to deal with this either.

You can find attached a tentative patch I made (not build tested, and also based on an older tree). A last resort may be to special-case those declarations, but that's undesirable.

--
Nicola Vetrini, BSc
Software Engineer, BUGSENG srl (https://bugseng.com)
commit caffa89a06275b6b50ace99170b99b500b7b32f7
Author: Nicola Vetrini <nicola.vetr...@bugseng.com>
Date:   Wed Nov 29 12:23:25 2023 +0100

    x86_64/platform_hypercall: provide proper declarations for compat_*
    
    Signed-off-by: Nicola Vetrini <nicola.vetr...@bugseng.com>

diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c
index 347f5d65330e..3ad15742d9ef 100644
--- a/xen/arch/x86/x86_64/platform_hypercall.c
+++ b/xen/arch/x86/x86_64/platform_hypercall.c
@@ -5,6 +5,7 @@
 EMIT_FILE;
 
 #include <xen/lib.h>
+#include <xen/pmstat.h>
 #include <xen/hypercall.h>
 
 #define xen_platform_op     compat_platform_op
@@ -14,11 +15,13 @@ EMIT_FILE;
 #define efi_get_info        efi_compat_get_info
 #define efi_runtime_call(x) efi_compat_runtime_call(x)
 
-#define xen_processor_performance compat_processor_performance
-#define set_px_pminfo       compat_set_px_pminfo
+#define xen_processor_performance compat_xen_processor_performance
+int compat_set_px_pminfo(uint32_t acpi_id, 
+                         struct compat_xen_processor_performance *perf);
 
-#define xen_processor_power compat_processor_power
-#define set_cx_pminfo       compat_set_cx_pminfo
+#define xen_processor_power       compat_xen_processor_power
+long compat_set_cx_pminfo(uint32_t acpi_id,
+                          struct compat_xen_processor_power *power);
 
 #define xen_pf_pcpuinfo xenpf_pcpuinfo
 CHECK_pf_pcpuinfo;

Reply via email to