Features used by various Xen drivers, i.e. xenbus.
Signed-off-by: Sergiy Kibrik <[email protected]>
Reviewed-by: Nadav Har'El <[email protected]>
---
arch/aarch64/cpuid.cc | 18 ++++++++++++++++++
arch/aarch64/cpuid.hh | 9 +++++++++
arch/aarch64/xen.cc | 28 ++++++++++++++++++++++++++++
arch/aarch64/xen.hh | 4 ++++
4 files changed, 59 insertions(+)
diff --git a/arch/aarch64/cpuid.cc b/arch/aarch64/cpuid.cc
index 3ac4b24..daf820a 100644
--- a/arch/aarch64/cpuid.cc
+++ b/arch/aarch64/cpuid.cc
@@ -7,6 +7,7 @@
#include "cpuid.hh"
#include "processor.hh"
+#include "xen.hh"
namespace processor {
@@ -76,4 +77,21 @@ const std::string& features_str()
return cpuid_str;
}
+void process_cpuid(features_type& features)
+{
+ xen::get_features(features);
+}
+
+const features_type& features()
+{
+ // features() can be used very early, make sure it is initialized
+ static features_type f;
+ return f;
+}
+
+features_type::features_type()
+{
+ process_cpuid(*this);
+}
+
}
diff --git a/arch/aarch64/cpuid.hh b/arch/aarch64/cpuid.hh
index 919f62d..a97b605 100644
--- a/arch/aarch64/cpuid.hh
+++ b/arch/aarch64/cpuid.hh
@@ -28,6 +28,15 @@ enum hwcap_bit {
HWCAP_BIT_N
};
+struct features_type {
+ features_type();
+ bool xen_clocksource;
+ bool xen_vector_callback;
+ bool xen_pci;
+};
+
+extern const features_type& features();
+
}
#endif /* CPUID_HH_ */
diff --git a/arch/aarch64/xen.cc b/arch/aarch64/xen.cc
index 6a7d58f..9f44b15 100644
--- a/arch/aarch64/xen.cc
+++ b/arch/aarch64/xen.cc
@@ -8,13 +8,16 @@
#include <osv/types.h>
#include <osv/xen.hh>
#include <xen/interface/xen.h>
+#include <xen/features.h>
#include <bsd/porting/netport.h> /* __dead2 defined here */
#include <machine/xen/xen-os.h>
#include <xen/evtchn.h>
#include "arch-dtb.hh"
+#include "cpuid.hh"
shared_info_t *HYPERVISOR_shared_info;
+uint8_t xen_features[XENFEAT_NR_SUBMAPS * 32];
namespace xen {
@@ -22,6 +25,31 @@ shared_info_t dummy_info;
struct xen_shared_info xen_shared_info __attribute__((aligned(4096)));
constexpr int events_irq = 31; /*FIXME: get from FDT */
+/*TODO: this can be common x64/aarch64 code */
+void get_features(processor::features_type &features)
+{
+ if (!is_xen())
+ return;
+
+ for (unsigned int i = 0; i < XENFEAT_NR_SUBMAPS; i++) {
+ struct xen_feature_info info = {
+ .submap_idx = i,
+ };
+
+ if (HYPERVISOR_xen_version(XENVER_get_features, &info) < 0)
+ assert(0);
+
+ for (int j = 0; j < 32; j++)
+ xen_features[i * 32 + j] = !!(info.submap & 1<<j);
+ }
+
+ features.xen_clocksource = xen_feature(XENFEAT_hvm_safe_pvclock);
+ features.xen_vector_callback = xen_feature(XENFEAT_hvm_callback_vector);
+
+ if (!processor::features().xen_vector_callback)
+ evtchn_irq_is_legacy();
+}
+
void irq_init()
{
if (!is_xen())
diff --git a/arch/aarch64/xen.hh b/arch/aarch64/xen.hh
index aa5da27..d5046cb 100644
--- a/arch/aarch64/xen.hh
+++ b/arch/aarch64/xen.hh
@@ -8,8 +8,12 @@
#ifndef XEN_ARCH_HH
#define XEN_ARCH_HH
+#include "cpuid.hh"
+
namespace xen {
+void get_features(processor::features_type &features);
+
}
#endif /* XEN_ARCH_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.