|
@@ -121,11 +121,29 @@ static void subsystem_reset(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void s390_memory_init(MemoryRegion *ram)
|
|
|
+static void set_memory_limit(uint64_t new_limit)
|
|
|
+{
|
|
|
+ uint64_t hw_limit;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = s390_set_memory_limit(new_limit, &hw_limit);
|
|
|
+ if (ret == -E2BIG) {
|
|
|
+ error_report("host supports a maximum of %" PRIu64 " GB",
|
|
|
+ hw_limit / GiB);
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+ } else if (ret) {
|
|
|
+ error_report("setting the guest size failed");
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void s390_memory_init(MachineState *machine)
|
|
|
{
|
|
|
MemoryRegion *sysmem = get_system_memory();
|
|
|
+ MemoryRegion *ram = machine->ram;
|
|
|
+ uint64_t ram_size = memory_region_size(ram);
|
|
|
|
|
|
- if (!QEMU_IS_ALIGNED(memory_region_size(ram), 1 * MiB)) {
|
|
|
+ if (!QEMU_IS_ALIGNED(ram_size, 1 * MiB)) {
|
|
|
/*
|
|
|
* SCLP cannot possibly expose smaller granularity right now and KVM
|
|
|
* cannot handle smaller granularity. As we don't support NUMA, the
|
|
@@ -136,7 +154,9 @@ static void s390_memory_init(MemoryRegion *ram)
|
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
|
|
|
|
- /* allocate RAM for core */
|
|
|
+ set_memory_limit(ram_size);
|
|
|
+
|
|
|
+ /* Map the initial memory. Must happen after setting the memory limit. */
|
|
|
memory_region_add_subregion(sysmem, 0, ram);
|
|
|
|
|
|
/*
|
|
@@ -211,7 +231,7 @@ static void ccw_init(MachineState *machine)
|
|
|
qdev_realize_and_unref(DEVICE(ms->sclp), NULL, &error_fatal);
|
|
|
|
|
|
/* init memory + setup max page size. Required for the CPU model */
|
|
|
- s390_memory_init(machine->ram);
|
|
|
+ s390_memory_init(machine);
|
|
|
|
|
|
/* init CPUs (incl. CPU model) early so s390_has_feature() works */
|
|
|
s390_init_cpus(machine);
|