@@ -234,6 +234,71 @@ static int set_s390_cpu_alias(const char *name, const char *model)
return 0;
}
+/* return host specific properties */
+int s390_fetch_kvm_host_props(struct S390HostProps *prop)
+{
+ int ret;
+
+ ret = get_s390_config_attr(KVM_DEV_S390_CONFIG_CPU_TYPE,
+ &prop->vcpu.type);
+ if (ret) {
+ return ret;
+ }
+ ret = get_s390_config_attr(KVM_DEV_S390_CONFIG_CPU_FACILITIES,
+ &prop->vcpu.facilities);
+ if (ret) {
+ return ret;
+ }
+
+ ret = get_s390_config_attr(KVM_DEV_S390_CONFIG_KVM_FACILITY_MASK,
+ &prop->host.facility_mask);
+ if (ret) {
+ return ret;
+ }
+
+ return 0;
+}
+
+/* request cpu configuration defined in S390 cpu class */
+int s390_request_kvm_cpu_config(S390CPUClass *cc)
+{
+ int ret = 0;
+
+ {
+ struct kvm_s390_attr_cpu_type cpu;
+ ret = set_s390_config_attr(KVM_DEV_S390_CONFIG_CPU_TYPE, &cc->type);
+ if (ret) {
+ goto out;
+ }
+ ret = get_s390_config_attr(KVM_DEV_S390_CONFIG_CPU_TYPE, &cpu.type);
+ if (ret) {
+ goto out;
+ }
+ if (cc->type != cpu.type) {
+ goto out;
+ }
+ }
+ {
+ struct kvm_s390_attr_cpu_facilities cpu;
+ int i;
+ ret = set_s390_config_attr(KVM_DEV_S390_CONFIG_CPU_FACILITIES, cc->kvm_facilities);
+ if (ret) {
+ goto out;
+ }
+ ret = get_s390_config_attr(KVM_DEV_S390_CONFIG_CPU_FACILITIES, &cpu.facilities);
+ if (ret) {
+ goto out;
+ }
+ for (i = 0; i < sizeof(cpu.facilities) / sizeof(unsigned long); i++) {
+ if (cc->kvm_facilities[i] != cpu.facilities[i]) {
+ goto out;
+ }
+ }
+ }
+out:
+ return ret;
+}
+
/* define S390 CPU model classes */
S390_PROC_DEF("2064-ga1", CPU_S390_2064_GA1, "IBM zSeries 900 GA1")
S390_PROC_DEF("2064-ga2", CPU_S390_2064_GA2, "IBM zSeries 900 GA2")
@@ -34,6 +34,22 @@ typedef struct S390CPUAlias {
} S390CPUAlias;
extern GSList *s390_cpu_aliases;
+/*
+ * host system properties used to trim s390
+ * cpu class attributes during initial kvm setup
+ */
+struct S390HostProps {
+ struct {
+ unsigned long facility_mask[256];
+ } host;
+ struct {
+ unsigned short type;
+ unsigned long facilities[256];
+ } vcpu;
+};
+
+int s390_fetch_kvm_host_props(struct S390HostProps *prop);
+int s390_request_kvm_cpu_config(S390CPUClass *cc);
ObjectClass *s390_cpu_class_by_name(const char *name);
/*
This patch implements the functions s390_fetch_kvm_host_props() and s390_request_kvm_cpu_config(). They respectively retrieve or request the machine type, cpu facilities and KVM facility mask supported by the host. Both functions are based on the s390 configuration device interface. Signed-off-by: Michael Mueller <mimu@linux.vnet.ibm.com> --- target-s390x/cpu-models.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++ target-s390x/cpu-models.h | 16 ++++++++++++ 2 files changed, 81 insertions(+)