On s390x, we sometimes have to shrink ram_size in order to be able to correctly indicate the size to the guest.
In case maxmem is not set, ram_size and maxram_size should always be kept equal. Make sure to also fixup maxram_size if necessary. In case maxmem is set, we really want to bail out in case we have to round down, as it basically can screw up the size of the device memory area later on. Pleas note that this fixup ususally does not happen with sane values for the ram size. Signed-off-by: David Hildenbrand <da...@redhat.com> --- hw/s390x/sclp.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index 047d577313..0757914374 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -21,6 +21,8 @@ #include "hw/s390x/event-facility.h" #include "hw/s390x/s390-pci-bus.h" #include "hw/s390x/ipl.h" +#include "qemu/error-report.h" + static inline SCLPDevice *get_sclp_device(void) { @@ -318,9 +320,19 @@ static void sclp_memory_init(SCLPDevice *sclp) * down to align with the nearest increment boundary. */ initial_mem = initial_mem >> increment_size << increment_size; - machine->ram_size = initial_mem; - /* let's propagate the changed ram size into the global variable. */ - ram_size = initial_mem; + /* also shrink maxram_size in case we don't have maxmem configured */ + if (initial_mem != machine->ram_size) { + if (machine->ram_size < machine->maxram_size) { + error_report("Ram size ('" RAM_ADDR_FMT "') had to be rounded " + "down to ('" RAM_ADDR_FMT "'), maxmem not supported", + machine->ram_size, initial_mem); + exit(1); + } + /* propagate the changed ram size into the different places */ + machine->ram_size = initial_mem; + ram_size = initial_mem; + machine->maxram_size = initial_mem; + } } static void sclp_init(Object *obj) -- 2.14.3