Xen crafts and provides a DTB with special node by which we can know which hypervisor we're using and load corresponding drivers.
xen::is_xen_found flag is set up for future use. Signed-off-by: Sergiy Kibrik <[email protected]> --- Makefile | 1 + arch/aarch64/arch-dtb.cc | 8 ++++++++ arch/aarch64/arch-dtb.hh | 7 +++++++ arch/aarch64/boot.S | 3 +++ arch/aarch64/xen.cc | 27 +++++++++++++++++++++++++++ arch/aarch64/xen.hh | 17 +++++++++++++++++ 6 files changed, 63 insertions(+) create mode 100644 arch/aarch64/xen.cc create mode 100644 arch/aarch64/xen.hh diff --git a/Makefile b/Makefile index 4f3d9b5..9d47ce3 100644 --- a/Makefile +++ b/Makefile @@ -858,6 +858,7 @@ objects += arch/$(arch)/psci.o objects += arch/$(arch)/arm-clock.o objects += arch/$(arch)/gic.o objects += arch/$(arch)/arch-dtb.o +objects += arch/$(arch)/xen.o objects += $(libfdt) endif diff --git a/arch/aarch64/arch-dtb.cc b/arch/aarch64/arch-dtb.cc index 0cc507f..986b3c3 100644 --- a/arch/aarch64/arch-dtb.cc +++ b/arch/aarch64/arch-dtb.cc @@ -569,3 +569,11 @@ bool dtb_get_pci_irqmap(u32 *bdfs, int *irq_ids, int n) } return true; } + +bool dtb_get_vmm_is_xen() +{ + if (fdt_check_header(dtb) != 0) + return false; /* broken header will be handled later */ + + return fdt_node_offset_by_compatible(dtb, -1, "xen,xen") >= 0; +} diff --git a/arch/aarch64/arch-dtb.hh b/arch/aarch64/arch-dtb.hh index ef3a3a6..9acacd9 100644 --- a/arch/aarch64/arch-dtb.hh +++ b/arch/aarch64/arch-dtb.hh @@ -131,4 +131,11 @@ bool dtb_get_pci_irqmap(u32 *bdfs, int *irq_ids, int n); #define DTB_PHYSHI_D_SH 11 #define DTB_PHYSHI_F_SH 8 +/* bool dtb_get_vmm_is_xen(); + * + * Returns true if Xen hypervisor is detected. + */ + +bool dtb_get_vmm_is_xen(); + #endif /* ARCH_DTB_HH */ diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S index 072c95b..f415cee 100644 --- a/arch/aarch64/boot.S +++ b/arch/aarch64/boot.S @@ -31,6 +31,9 @@ start_elf: str x5, [x1, #:lo12:dtb] mov x29, xzr + bl init_xen + + mov x29, xzr bl premain adrp x3, __argc diff --git a/arch/aarch64/xen.cc b/arch/aarch64/xen.cc new file mode 100644 index 0000000..ccdc687 --- /dev/null +++ b/arch/aarch64/xen.cc @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2017 Sergiy Kibrik <[email protected]> + * + * This work is open source software, licensed under the terms of the + * BSD license as described in the LICENSE file in the top-level directory. + */ + +#include <osv/types.h> +#include <xen/interface/xen.h> + +#include "arch-dtb.hh" +#include "xen.hh" + +shared_info_t *HYPERVISOR_shared_info; + +namespace xen { + +bool is_xen_found; + +} + +extern "C" { +void init_xen() +{ + xen::is_xen_found = dtb_get_vmm_is_xen(); +} +} diff --git a/arch/aarch64/xen.hh b/arch/aarch64/xen.hh new file mode 100644 index 0000000..ba9b7ec --- /dev/null +++ b/arch/aarch64/xen.hh @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2017 Sergiy Kibrik <[email protected]> + * + * This work is open source software, licensed under the terms of the + * BSD license as described in the LICENSE file in the top-level directory. + */ + +#ifndef XEN_HH +#define XEN_HH + +namespace xen { + +extern bool is_xen_found; + +} + +#endif /* XEN_HH */ -- 2.7.4 -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
