2 * x86 HVF CPU type initialization
4 * Copyright 2021 SUSE LLC
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
10 #include "qemu/osdep.h"
13 #include "qapi/error.h"
14 #include "sysemu/sysemu.h"
15 #include "hw/boards.h"
16 #include "sysemu/hvf.h"
17 #include "hw/core/accel-cpu.h"
19 static void hvf_cpu_max_instance_init(X86CPU
*cpu
)
21 CPUX86State
*env
= &cpu
->env
;
23 host_cpu_max_instance_init(cpu
);
25 env
->cpuid_min_level
=
26 hvf_get_supported_cpuid(0x0, 0, R_EAX
);
27 env
->cpuid_min_xlevel
=
28 hvf_get_supported_cpuid(0x80000000, 0, R_EAX
);
29 env
->cpuid_min_xlevel2
=
30 hvf_get_supported_cpuid(0xC0000000, 0, R_EAX
);
33 static void hvf_cpu_xsave_init(void)
35 static bool first
= true;
43 /* x87 and SSE states are in the legacy region of the XSAVE area. */
44 x86_ext_save_areas
[XSTATE_FP_BIT
].offset
= 0;
45 x86_ext_save_areas
[XSTATE_SSE_BIT
].offset
= 0;
47 for (i
= XSTATE_SSE_BIT
+ 1; i
< XSAVE_STATE_AREA_COUNT
; i
++) {
48 ExtSaveArea
*esa
= &x86_ext_save_areas
[i
];
51 int sz
= hvf_get_supported_cpuid(0xd, i
, R_EAX
);
53 assert(esa
->size
== sz
);
54 esa
->offset
= hvf_get_supported_cpuid(0xd, i
, R_EBX
);
60 static void hvf_cpu_instance_init(CPUState
*cs
)
62 X86CPU
*cpu
= X86_CPU(cs
);
64 host_cpu_instance_init(cpu
);
66 /* Special cases not set in the X86CPUDefinition structs: */
67 /* TODO: in-kernel irqchip for hvf */
69 if (cpu
->max_features
) {
70 hvf_cpu_max_instance_init(cpu
);
76 static void hvf_cpu_accel_class_init(ObjectClass
*oc
, void *data
)
78 AccelCPUClass
*acc
= ACCEL_CPU_CLASS(oc
);
80 acc
->cpu_realizefn
= host_cpu_realizefn
;
81 acc
->cpu_instance_init
= hvf_cpu_instance_init
;
84 static const TypeInfo hvf_cpu_accel_type_info
= {
85 .name
= ACCEL_CPU_NAME("hvf"),
87 .parent
= TYPE_ACCEL_CPU
,
88 .class_init
= hvf_cpu_accel_class_init
,
92 static void hvf_cpu_accel_register_types(void)
94 type_register_static(&hvf_cpu_accel_type_info
);
97 type_init(hvf_cpu_accel_register_types
);