hw/i386/isapc.c: warn rather than reject modern x86 CPU models

Commit e1e2909f8e ("hw/i386/pc_piix.c: restrict isapc machine to 32-bit CPUs")
restricted the isapc machine to 32-bit CPUs, but subsequent concern has been
expressed as to the effect this could have on users.

The outcome of the latest discussion is that we should exercise more caution
and follow the official deprecation route, so instead of rejecting modern x86
CPUs issue a deprecation warning but allow the user to continue.

Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Link: https://lore.kernel.org/r/20251023142926.964718-2-mark.caveayland@nutanix.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Mark Cave-Ayland 2025-10-23 15:28:09 +01:00 committed by Paolo Bonzini
parent 6763d7be6b
commit 329e36af94

View file

@ -41,29 +41,31 @@ static void pc_init_isa(MachineState *machine)
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
int i;
/*
* There is a small chance that someone unintentionally passes "-cpu max"
* for the isapc machine, which will provide a much more modern 32-bit
* CPU than would be expected for an ISA-era PC. If the "max" cpu type has
* been specified, choose the "best" 32-bit cpu possible which we consider
* be the pentium3 (deliberately choosing an Intel CPU given that the
* default 486 CPU for the isapc machine is also an Intel CPU).
*/
if (!strcmp(machine->cpu_type, X86_CPU_TYPE_NAME("max"))) {
machine->cpu_type = X86_CPU_TYPE_NAME("pentium3");
warn_report("-cpu max is invalid for isapc machine, using pentium3");
}
bool valid_cpu_type = false;
static const char * const valid_cpu_types[] = {
X86_CPU_TYPE_NAME("486"),
X86_CPU_TYPE_NAME("athlon"),
X86_CPU_TYPE_NAME("kvm32"),
X86_CPU_TYPE_NAME("pentium"),
X86_CPU_TYPE_NAME("pentium2"),
X86_CPU_TYPE_NAME("pentium3"),
X86_CPU_TYPE_NAME("qemu32"),
};
/*
* Similarly if someone unintentionally passes "-cpu host" for the isapc
* machine then display a warning and also switch to the "best" 32-bit
* cpu possible which we consider to be the pentium3. This is because any
* host CPU will already be modern than this, but it also ensures any
* newer CPU flags/features are filtered out for older guests.
* The isapc machine is supposed to represent a legacy ISA-only PC with a
* 32-bit processor. For historical reasons the machine can still accept
* almost any valid processor, but this is now deprecated in 10.2. Emit
* a warning if anyone tries to use a deprecated CPU.
*/
if (!strcmp(machine->cpu_type, X86_CPU_TYPE_NAME("host"))) {
machine->cpu_type = X86_CPU_TYPE_NAME("pentium3");
warn_report("-cpu host is invalid for isapc machine, using pentium3");
for (i = 0; i < ARRAY_SIZE(valid_cpu_types); i++) {
if (!strcmp(machine->cpu_type, valid_cpu_types[i])) {
valid_cpu_type = true;
}
}
if (!valid_cpu_type) {
warn_report("cpu type %s is deprecated for isapc machine", machine->cpu_type);
}
if (machine->ram_size > 3.5 * GiB) {
@ -154,18 +156,6 @@ static void pc_init_isa(MachineState *machine)
static void isapc_machine_options(MachineClass *m)
{
static const char * const valid_cpu_types[] = {
X86_CPU_TYPE_NAME("486"),
X86_CPU_TYPE_NAME("athlon"),
X86_CPU_TYPE_NAME("kvm32"),
X86_CPU_TYPE_NAME("pentium"),
X86_CPU_TYPE_NAME("pentium2"),
X86_CPU_TYPE_NAME("pentium3"),
X86_CPU_TYPE_NAME("qemu32"),
X86_CPU_TYPE_NAME("max"),
X86_CPU_TYPE_NAME("host"),
NULL
};
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
m->desc = "ISA-only PC";
@ -180,7 +170,6 @@ static void isapc_machine_options(MachineClass *m)
pcmc->has_reserved_memory = false;
m->default_nic = "ne2k_isa";
m->default_cpu_type = X86_CPU_TYPE_NAME("486");
m->valid_cpu_types = valid_cpu_types;
m->no_floppy = !module_object_class_by_name(TYPE_ISA_FDC);
m->no_parallel = !module_object_class_by_name(TYPE_ISA_PARALLEL);
}