Mailing List Archive

[xen master] x86: slightly re-arrange 32-bit handling in dom0_construct_pv()
commit 16dcc135e89663628ee2eaf2d02991fc9ce954bf
Author: Jan Beulich <jbeulich@suse.com>
AuthorDate: Fri Aug 7 13:14:02 2020 +0200
Commit: Jan Beulich <jbeulich@suse.com>
CommitDate: Fri Aug 7 13:14:02 2020 +0200

x86: slightly re-arrange 32-bit handling in dom0_construct_pv()

Add #ifdef-s (the 2nd one will be needed in particular, to guard the
uses of m2p_compat_vstart and HYPERVISOR_COMPAT_VIRT_START()) and fold
duplicate uses of elf_32bit().

Also adjust what gets logged: Avoid "compat32" when support isn't built
in, and don't assume ELF class <> ELFCLASS64 means ELFCLASS32.

While doing this, in code getting touched anyway:
- use ROUNDUP() instead of open-coding it,
- drop a stale (dead) BUG_ON(),
- replace panic() by printk() plus error return, for being consistent
with other code.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
xen/arch/x86/pv/dom0_build.c | 73 ++++++++++++++++++++++++++------------------
1 file changed, 44 insertions(+), 29 deletions(-)

diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
index 3522eb0114..171519e285 100644
--- a/xen/arch/x86/pv/dom0_build.c
+++ b/xen/arch/x86/pv/dom0_build.c
@@ -300,7 +300,6 @@ int __init dom0_construct_pv(struct domain *d,
struct page_info *page = NULL;
start_info_t *si;
struct vcpu *v = d->vcpu[0];
- unsigned long long value;
void *image_base = bootstrap_map(image);
unsigned long image_len = image->mod_end;
void *image_start = image_base + image_headroom;
@@ -357,27 +356,36 @@ int __init dom0_construct_pv(struct domain *d,
goto out;

/* compatibility check */
+ printk(" Xen kernel: 64-bit, lsb%s\n",
+ IS_ENABLED(CONFIG_PV32) ? ", compat32" : "");
compatible = 0;
machine = elf_uval(&elf, elf.ehdr, e_machine);
- printk(" Xen kernel: 64-bit, lsb, compat32\n");
- if ( elf_32bit(&elf) && parms.pae == XEN_PAE_BIMODAL )
- parms.pae = XEN_PAE_EXTCR3;
- if ( elf_32bit(&elf) && parms.pae && machine == EM_386 )
+
+#ifdef CONFIG_PV32
+ if ( elf_32bit(&elf) )
{
- if ( unlikely(rc = switch_compat(d)) )
+ if ( parms.pae == XEN_PAE_BIMODAL )
+ parms.pae = XEN_PAE_EXTCR3;
+ if ( parms.pae && machine == EM_386 )
{
- printk("Dom0 failed to switch to compat: %d\n", rc);
- return rc;
- }
+ if ( unlikely(rc = switch_compat(d)) )
+ {
+ printk("Dom0 failed to switch to compat: %d\n", rc);
+ return rc;
+ }

- compatible = 1;
+ compatible = 1;
+ }
}
- if (elf_64bit(&elf) && machine == EM_X86_64)
+#endif
+
+ if ( elf_64bit(&elf) && machine == EM_X86_64 )
compatible = 1;
- printk(" Dom0 kernel: %s%s, %s, paddr %#" PRIx64 " -> %#" PRIx64 "\n",
- elf_64bit(&elf) ? "64-bit" : "32-bit",
- parms.pae ? ", PAE" : "",
- elf_msb(&elf) ? "msb" : "lsb",
+
+ printk(" Dom0 kernel: %s-bit%s, %s, paddr %#" PRIx64 " -> %#" PRIx64 "\n",
+ elf_64bit(&elf) ? "64" : elf_32bit(&elf) ? "32" : "??",
+ parms.pae ? ", PAE" : "",
+ elf_msb(&elf) ? "msb" : "lsb",
elf.pstart, elf.pend);
if ( elf.bsd_symtab_pstart )
printk(" Dom0 symbol map %#" PRIx64 " -> %#" PRIx64 "\n",
@@ -405,23 +413,30 @@ int __init dom0_construct_pv(struct domain *d,
if ( parms.pae == XEN_PAE_EXTCR3 )
set_bit(VMASST_TYPE_pae_extended_cr3, &d->vm_assist);

- if ( !pv_shim && (parms.virt_hv_start_low != UNSET_ADDR) &&
- elf_32bit(&elf) )
+#ifdef CONFIG_PV32
+ if ( elf_32bit(&elf) )
{
- unsigned long mask = (1UL << L2_PAGETABLE_SHIFT) - 1;
- value = (parms.virt_hv_start_low + mask) & ~mask;
- BUG_ON(!is_pv_32bit_domain(d));
- if ( value > __HYPERVISOR_COMPAT_VIRT_START )
- panic("Domain 0 expects too high a hypervisor start address\n");
- HYPERVISOR_COMPAT_VIRT_START(d) =
- max_t(unsigned int, m2p_compat_vstart, value);
- }
+ if ( !pv_shim && (parms.virt_hv_start_low != UNSET_ADDR) )
+ {
+ unsigned long value = ROUNDUP(parms.virt_hv_start_low,
+ 1UL << L2_PAGETABLE_SHIFT);

- if ( (parms.p2m_base != UNSET_ADDR) && elf_32bit(&elf) )
- {
- printk(XENLOG_WARNING "P2M table base ignored\n");
- parms.p2m_base = UNSET_ADDR;
+ if ( value > __HYPERVISOR_COMPAT_VIRT_START )
+ {
+ printk("Dom0 expects too high a hypervisor start address\n");
+ return -ERANGE;
+ }
+ HYPERVISOR_COMPAT_VIRT_START(d) =
+ max_t(unsigned int, m2p_compat_vstart, value);
+ }
+
+ if ( parms.p2m_base != UNSET_ADDR )
+ {
+ printk(XENLOG_WARNING "P2M table base ignored\n");
+ parms.p2m_base = UNSET_ADDR;
+ }
}
+#endif

/*
* Why do we need this? The number of page-table frames depends on the
--
generated by git-patchbot for /home/xen/git/xen.git#master