[PATCH] x86/pv: Provide more helpful error when CONFIG_PV32 is absent

Jane Malalane posted 1 patch 3 years, 3 months ago
Test gitlab-ci failed
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20210812114857.20971-1-jane.malalane@citrix.com
xen/arch/x86/pv/dom0_build.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
[PATCH] x86/pv: Provide more helpful error when CONFIG_PV32 is absent
Posted by Jane Malalane 3 years, 3 months ago
Currently, when booting a 32bit dom0 kernel, the message isn't very
helpful:

  (XEN)  Xen  kernel: 64-bit, lsb
  (XEN)  Dom0 kernel: 32-bit, PAE, lsb, paddr 0x100000 -> 0x112000
  (XEN) Mismatch between Xen and DOM0 kernel
  (XEN)
  (XEN) ****************************************
  (XEN) Panic on CPU 0:
  (XEN) Could not construct domain 0
  (XEN) ****************************************

With this adjustment, it now looks like this:

  (XEN)  Xen  kernel: 64-bit, lsb
  (XEN) Found 32-bit PV kernel, but CONFIG_PV32 missing
  (XEN)
  (XEN) ****************************************
  (XEN) Panic on CPU 0:
  (XEN) Could not construct domain 0
  (XEN) ****************************************

Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jane Malalane <jane.malalane@citrix.com>
---
CC: Jan Beulich <jbeulich@suse.com>
CC: Andrew Cooper <andrew.cooper3@citrix.com>
CC: "Roger Pau Monné" <roger.pau@citrix.com>
CC: Wei Liu <wl@xen.org>
---
 xen/arch/x86/pv/dom0_build.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index af47615b22..80e6c6e35b 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -362,9 +362,9 @@ int __init dom0_construct_pv(struct domain *d,
     compatible = false;
     machine = elf_uval(&elf, elf.ehdr, e_machine);
 
-#ifdef CONFIG_PV32
     if ( elf_32bit(&elf) )
     {
+#ifdef CONFIG_PV32
         if ( parms.pae == XEN_PAE_BIMODAL )
             parms.pae = XEN_PAE_EXTCR3;
         if ( parms.pae && machine == EM_386 )
@@ -377,8 +377,12 @@ int __init dom0_construct_pv(struct domain *d,
 
             compatible = true;
         }
-    }
+#else
+        printk("Found 32-bit PV kernel, but CONFIG_PV32 missing\n");
+        rc = -ENODEV;
+        goto out;
 #endif
+    }
 
     compat = is_pv_32bit_domain(d);
 
-- 
2.11.0


Re: [PATCH] x86/pv: Provide more helpful error when CONFIG_PV32 is absent
Posted by Jan Beulich 3 years, 3 months ago
On 12.08.2021 13:48, Jane Malalane wrote:
> Currently, when booting a 32bit dom0 kernel, the message isn't very
> helpful:
> 
>   (XEN)  Xen  kernel: 64-bit, lsb
>   (XEN)  Dom0 kernel: 32-bit, PAE, lsb, paddr 0x100000 -> 0x112000
>   (XEN) Mismatch between Xen and DOM0 kernel
>   (XEN)
>   (XEN) ****************************************
>   (XEN) Panic on CPU 0:
>   (XEN) Could not construct domain 0
>   (XEN) ****************************************
> 
> With this adjustment, it now looks like this:
> 
>   (XEN)  Xen  kernel: 64-bit, lsb
>   (XEN) Found 32-bit PV kernel, but CONFIG_PV32 missing
>   (XEN)
>   (XEN) ****************************************
>   (XEN) Panic on CPU 0:
>   (XEN) Could not construct domain 0
>   (XEN) ****************************************
> 
> Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
> Signed-off-by: Jane Malalane <jane.malalane@citrix.com>
> ---
> CC: Jan Beulich <jbeulich@suse.com>
> CC: Andrew Cooper <andrew.cooper3@citrix.com>
> CC: "Roger Pau Monné" <roger.pau@citrix.com>
> CC: Wei Liu <wl@xen.org>
> ---
>  xen/arch/x86/pv/dom0_build.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
> index af47615b22..80e6c6e35b 100644
> --- a/xen/arch/x86/pv/dom0_build.c
> +++ b/xen/arch/x86/pv/dom0_build.c
> @@ -362,9 +362,9 @@ int __init dom0_construct_pv(struct domain *d,
>      compatible = false;
>      machine = elf_uval(&elf, elf.ehdr, e_machine);
>  
> -#ifdef CONFIG_PV32
>      if ( elf_32bit(&elf) )
>      {
> +#ifdef CONFIG_PV32
>          if ( parms.pae == XEN_PAE_BIMODAL )
>              parms.pae = XEN_PAE_EXTCR3;
>          if ( parms.pae && machine == EM_386 )
> @@ -377,8 +377,12 @@ int __init dom0_construct_pv(struct domain *d,
>  
>              compatible = true;
>          }
> -    }
> +#else
> +        printk("Found 32-bit PV kernel, but CONFIG_PV32 missing\n");
> +        rc = -ENODEV;
> +        goto out;

I don't see the "goto" as warranted here, not the least because the
code fragment right above the "#else" you add also uses plain "return".
With just "return -ENODEV;" (or maybe better "return -EOPNOTSUPP;")
Reviewed-by: Jan Beulich <jbeulich@suse.com>

In fact I think most "goto out;" are unwarranted in this function.
The only two places that want elf_check_broken() to be invoked are
after elf_xen_parse() and after elf_load_binary(). You'd be welcome
to add a 2nd patch to clean this up.

Jan