diff mbox series

[v1,3/3] xen/domain: rewrite emulation_flags_ok()

Message ID 20250401005224.461325-4-dmukhin@ford.com (mailing list archive)
State New
Headers show
Series xen/domain: updates to hardware emulation flags | expand

Commit Message

Denis Mukhin April 1, 2025, 12:52 a.m. UTC
From: Denis Mukhin <dmukhin@ford.com>

Rewrite emulation_flags_ok() using XEN_X86_EMU_{OPTIONAL,BASELINE}
to simplify future modifications.

Signed-off-by: Denis Mukhin <dmukhin@ford.com>
---
Came in the context of NS16550 emulator v3 series:
  https://lore.kernel.org/xen-devel/20250103-vuart-ns8250-v3-v1-0-c5d36b31d66c@ford.com/

After modifying emulation_flags_ok() with a new NS16550 vUART
configuration switch passed from the toolstack for the HVM
case, I decided to look into how to improve emulation_flags_ok().
---
 xen/arch/x86/domain.c | 29 +++++++++++------------------
 1 file changed, 11 insertions(+), 18 deletions(-)
diff mbox series

Patch

diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 15c5e2a652..23051bb176 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -750,25 +750,18 @@  static bool emulation_flags_ok(const struct domain *d, uint32_t emflags)
     BUILD_BUG_ON(X86_EMU_ALL != XEN_X86_EMU_ALL);
 #endif
 
-    if ( is_hvm_domain(d) )
-    {
-        if ( is_hardware_domain(d) &&
-             emflags != (X86_EMU_VPCI | X86_EMU_LAPIC | X86_EMU_IOAPIC) )
-            return false;
-        if ( !is_hardware_domain(d) &&
-             /* HVM PIRQ feature is user-selectable. */
-             (emflags & ~X86_EMU_USE_PIRQ) !=
-             (X86_EMU_ALL & ~(X86_EMU_VPCI | X86_EMU_USE_PIRQ)) &&
-             emflags != X86_EMU_LAPIC )
-            return false;
-    }
-    else if ( emflags != 0 && emflags != X86_EMU_PIT )
-    {
-        /* PV or classic PVH. */
-        return false;
-    }
+    /* PV or classic PVH */
+    if ( !is_hvm_domain(d) )
+        return emflags == 0 || emflags == XEN_X86_EMU_PIT;
 
-    return true;
+    /* HVM */
+    if ( is_hardware_domain(d) )
+        return emflags == (XEN_X86_EMU_LAPIC |
+                           XEN_X86_EMU_IOAPIC |
+                           XEN_X86_EMU_VPCI);
+
+    return (emflags & ~XEN_X86_EMU_OPTIONAL) == XEN_X86_EMU_BASELINE ||
+            emflags == XEN_X86_EMU_LAPIC;
 }
 
 void __init arch_init_idle_domain(struct domain *d)