Currently it is possible to start a guest with memory that is beyond the addressable range of CPU and QEMU does not even warn about it. The default phys_bits is 40 and can address 1TB. However it allows to start a guest with greater than 1TB memory.
Prevent this by erroring out in such a scenario. Reported-by: Shaju Abraham <abraham.sh...@amd.com> Signed-off-by: Nikunj A Dadhania <nik...@amd.com> --- target/i386/cpu.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 6a57ef13af..1afbdbac7d 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -6376,6 +6376,7 @@ static void x86_cpu_hyperv_realize(X86CPU *cpu) static void x86_cpu_realizefn(DeviceState *dev, Error **errp) { + MachineState *machine = MACHINE(qdev_get_machine()); CPUState *cs = CPU(dev); X86CPU *cpu = X86_CPU(dev); X86CPUClass *xcc = X86_CPU_GET_CLASS(dev); @@ -6541,6 +6542,15 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) } } + if (BIT_ULL(cpu->phys_bits) < machine->maxram_size) { + error_setg(&local_err, "cannot setup guest memory: " + "%s memory(%lu MiB) exceeds addressable limit(%llu MiB)", + machine->maxram_size == machine->ram_size ? "" : "max", + machine->maxram_size / MiB, + BIT_ULL(cpu->phys_bits) / MiB); + goto out; + } + /* Cache information initialization */ if (!cpu->legacy_cache) { if (!xcc->model || !xcc->model->cpudef->cache_info) { -- 2.32.0