Merge tag 'patchew/20200219160953.13771-1-imammedo@redhat.com' of https://github.com/patchew-project/qemu into HEAD

This series removes ad hoc RAM allocation API (memory_region_allocate_system_memory)
and consolidates it around hostmem backend. It allows to

* resolve conflicts between global -mem-prealloc and hostmem's "policy" option,
  fixing premature allocation before binding policy is applied

* simplify complicated memory allocation routines which had to deal with 2 ways
  to allocate RAM.

* reuse hostmem backends of a choice for main RAM without adding extra CLI
  options to duplicate hostmem features.  A recent case was -mem-shared, to
  enable vhost-user on targets that don't support hostmem backends [1] (ex: s390)

* move RAM allocation from individual boards into generic machine code and
  provide them with prepared MemoryRegion.

* clean up deprecated NUMA features which were tied to the old API (see patches)
  - "numa: remove deprecated -mem-path fallback to anonymous RAM"
  - (POSTPONED, waiting on libvirt side) "forbid '-numa node,mem' for 5.0 and newer machine types"
  - (POSTPONED) "numa: remove deprecated implicit RAM distribution between nodes"

Introduce a new machine.memory-backend property and wrapper code that aliases
global -mem-path and -mem-alloc into automatically created hostmem backend
properties (provided memory-backend was not set explicitly given by user).
A bulk of trivial patches then follow to incrementally convert individual
boards to using machine.memory-backend provided MemoryRegion.

Board conversion typically involves:

* providing MachineClass::default_ram_size and MachineClass::default_ram_id
  so generic code could create default backend if user didn't explicitly provide
  memory-backend or -m options

* dropping memory_region_allocate_system_memory() call

* using convenience MachineState::ram MemoryRegion, which points to MemoryRegion
   allocated by ram-memdev

On top of that for some boards:

* missing ram_size checks are added (typically it were boards with fixed ram size)

* ram_size fixups are replaced by checks and hard errors, forcing user to
  provide correct "-m" values instead of ignoring it and continuing running.

After all boards are converted, the old API is removed and memory allocation
routines are cleaned up.
This commit is contained in:
Paolo Bonzini 2020-02-25 09:19:00 +01:00
commit ca6155c0f2
78 changed files with 828 additions and 774 deletions

View File

@ -18,13 +18,6 @@
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "qom/object_interfaces.h" #include "qom/object_interfaces.h"
/* hostmem-file.c */
/**
* @TYPE_MEMORY_BACKEND_FILE:
* name of backend that uses mmap on a file descriptor
*/
#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
#define MEMORY_BACKEND_FILE(obj) \ #define MEMORY_BACKEND_FILE(obj) \
OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE) OBJECT_CHECK(HostMemoryBackendFile, (obj), TYPE_MEMORY_BACKEND_FILE)
@ -58,7 +51,6 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
return; return;
} }
backend->force_prealloc = mem_prealloc;
name = host_memory_backend_get_name(backend); name = host_memory_backend_get_name(backend);
memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
name, name,

View File

@ -45,7 +45,6 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
return; return;
} }
backend->force_prealloc = mem_prealloc;
fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size,
m->hugetlb, m->hugetlbsize, m->seal ? m->hugetlb, m->hugetlbsize, m->seal ?
F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0, F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL : 0,

View File

@ -16,8 +16,6 @@
#include "qemu/module.h" #include "qemu/module.h"
#include "qom/object_interfaces.h" #include "qom/object_interfaces.h"
#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
static void static void
ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
{ {

View File

@ -215,7 +215,7 @@ static bool host_memory_backend_get_prealloc(Object *obj, Error **errp)
{ {
HostMemoryBackend *backend = MEMORY_BACKEND(obj); HostMemoryBackend *backend = MEMORY_BACKEND(obj);
return backend->prealloc || backend->force_prealloc; return backend->prealloc;
} }
static void host_memory_backend_set_prealloc(Object *obj, bool value, static void host_memory_backend_set_prealloc(Object *obj, bool value,
@ -223,15 +223,6 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
{ {
Error *local_err = NULL; Error *local_err = NULL;
HostMemoryBackend *backend = MEMORY_BACKEND(obj); HostMemoryBackend *backend = MEMORY_BACKEND(obj);
MachineState *ms = MACHINE(qdev_get_machine());
if (backend->force_prealloc) {
if (value) {
error_setg(errp,
"remove -mem-prealloc to use the prealloc property");
return;
}
}
if (!host_memory_backend_mr_inited(backend)) { if (!host_memory_backend_mr_inited(backend)) {
backend->prealloc = value; backend->prealloc = value;
@ -243,7 +234,7 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
void *ptr = memory_region_get_ram_ptr(&backend->mr); void *ptr = memory_region_get_ram_ptr(&backend->mr);
uint64_t sz = memory_region_size(&backend->mr); uint64_t sz = memory_region_size(&backend->mr);
os_mem_prealloc(fd, ptr, sz, ms->smp.cpus, &local_err); os_mem_prealloc(fd, ptr, sz, backend->prealloc_threads, &local_err);
if (local_err) { if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return; return;
@ -252,14 +243,43 @@ static void host_memory_backend_set_prealloc(Object *obj, bool value,
} }
} }
static void host_memory_backend_get_prealloc_threads(Object *obj, Visitor *v,
const char *name, void *opaque, Error **errp)
{
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
visit_type_uint32(v, name, &backend->prealloc_threads, errp);
}
static void host_memory_backend_set_prealloc_threads(Object *obj, Visitor *v,
const char *name, void *opaque, Error **errp)
{
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
Error *local_err = NULL;
uint32_t value;
visit_type_uint32(v, name, &value, &local_err);
if (local_err) {
goto out;
}
if (value <= 0) {
error_setg(&local_err,
"property '%s' of %s doesn't take value '%d'",
name, object_get_typename(obj), value);
goto out;
}
backend->prealloc_threads = value;
out:
error_propagate(errp, local_err);
}
static void host_memory_backend_init(Object *obj) static void host_memory_backend_init(Object *obj)
{ {
HostMemoryBackend *backend = MEMORY_BACKEND(obj); HostMemoryBackend *backend = MEMORY_BACKEND(obj);
MachineState *machine = MACHINE(qdev_get_machine()); MachineState *machine = MACHINE(qdev_get_machine());
/* TODO: convert access to globals to compat properties */
backend->merge = machine_mem_merge(machine); backend->merge = machine_mem_merge(machine);
backend->dump = machine_dump_guest_core(machine); backend->dump = machine_dump_guest_core(machine);
backend->prealloc = mem_prealloc;
} }
static void host_memory_backend_post_init(Object *obj) static void host_memory_backend_post_init(Object *obj)
@ -313,7 +333,6 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
{ {
HostMemoryBackend *backend = MEMORY_BACKEND(uc); HostMemoryBackend *backend = MEMORY_BACKEND(uc);
HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc); HostMemoryBackendClass *bc = MEMORY_BACKEND_GET_CLASS(uc);
MachineState *ms = MACHINE(qdev_get_machine());
Error *local_err = NULL; Error *local_err = NULL;
void *ptr; void *ptr;
uint64_t sz; uint64_t sz;
@ -378,7 +397,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
*/ */
if (backend->prealloc) { if (backend->prealloc) {
os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz, os_mem_prealloc(memory_region_get_fd(&backend->mr), ptr, sz,
ms->smp.cpus, &local_err); backend->prealloc_threads, &local_err);
if (local_err) { if (local_err) {
goto out; goto out;
} }
@ -456,6 +475,12 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
host_memory_backend_set_prealloc, &error_abort); host_memory_backend_set_prealloc, &error_abort);
object_class_property_set_description(oc, "prealloc", object_class_property_set_description(oc, "prealloc",
"Preallocate memory", &error_abort); "Preallocate memory", &error_abort);
object_class_property_add(oc, "prealloc-threads", "int",
host_memory_backend_get_prealloc_threads,
host_memory_backend_set_prealloc_threads,
NULL, NULL, &error_abort);
object_class_property_set_description(oc, "prealloc-threads",
"Number of CPU threads to use for prealloc", &error_abort);
object_class_property_add(oc, "size", "int", object_class_property_add(oc, "size", "int",
host_memory_backend_get_size, host_memory_backend_get_size,
host_memory_backend_set_size, host_memory_backend_set_size,

64
exec.c
View File

@ -1668,59 +1668,18 @@ static int find_max_backend_pagesize(Object *obj, void *opaque)
long qemu_minrampagesize(void) long qemu_minrampagesize(void)
{ {
long hpsize = LONG_MAX; long hpsize = LONG_MAX;
long mainrampagesize; Object *memdev_root = object_resolve_path("/objects", NULL);
Object *memdev_root;
MachineState *ms = MACHINE(qdev_get_machine());
mainrampagesize = qemu_mempath_getpagesize(mem_path);
/* it's possible we have memory-backend objects with
* hugepage-backed RAM. these may get mapped into system
* address space via -numa parameters or memory hotplug
* hooks. we want to take these into account, but we
* also want to make sure these supported hugepage
* sizes are applicable across the entire range of memory
* we may boot from, so we take the min across all
* backends, and assume normal pages in cases where a
* backend isn't backed by hugepages.
*/
memdev_root = object_resolve_path("/objects", NULL);
if (memdev_root) {
object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
}
if (hpsize == LONG_MAX) {
/* No additional memory regions found ==> Report main RAM page size */
return mainrampagesize;
}
/* If NUMA is disabled or the NUMA nodes are not backed with a
* memory-backend, then there is at least one node using "normal" RAM,
* so if its page size is smaller we have got to report that size instead.
*/
if (hpsize > mainrampagesize &&
(ms->numa_state == NULL ||
ms->numa_state->num_nodes == 0 ||
ms->numa_state->nodes[0].node_memdev == NULL)) {
static bool warned;
if (!warned) {
error_report("Huge page support disabled (n/a for main memory).");
warned = true;
}
return mainrampagesize;
}
object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
return hpsize; return hpsize;
} }
long qemu_maxrampagesize(void) long qemu_maxrampagesize(void)
{ {
long pagesize = qemu_mempath_getpagesize(mem_path); long pagesize = 0;
Object *memdev_root = object_resolve_path("/objects", NULL); Object *memdev_root = object_resolve_path("/objects", NULL);
if (memdev_root) { object_child_foreach(memdev_root, find_max_backend_pagesize, &pagesize);
object_child_foreach(memdev_root, find_max_backend_pagesize,
&pagesize);
}
return pagesize; return pagesize;
} }
#else #else
@ -1843,8 +1802,6 @@ static void *file_ram_alloc(RAMBlock *block,
bool truncate, bool truncate,
Error **errp) Error **errp)
{ {
Error *err = NULL;
MachineState *ms = MACHINE(qdev_get_machine());
void *area; void *area;
block->page_size = qemu_fd_getpagesize(fd); block->page_size = qemu_fd_getpagesize(fd);
@ -1900,15 +1857,6 @@ static void *file_ram_alloc(RAMBlock *block,
return NULL; return NULL;
} }
if (mem_prealloc) {
os_mem_prealloc(fd, area, memory, ms->smp.cpus, &err);
if (err) {
error_propagate(errp, err);
qemu_ram_munmap(fd, area, memory);
return NULL;
}
}
block->fd = fd; block->fd = fd;
return area; return area;
} }
@ -2356,9 +2304,9 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
size = HOST_PAGE_ALIGN(size); size = HOST_PAGE_ALIGN(size);
file_size = get_file_size(fd); file_size = get_file_size(fd);
if (file_size > 0 && file_size < size) { if (file_size > 0 && file_size < size) {
error_setg(errp, "backing store %s size 0x%" PRIx64 error_setg(errp, "backing store size 0x%" PRIx64
" does not match 'size' option 0x" RAM_ADDR_FMT, " does not match 'size' option 0x" RAM_ADDR_FMT,
mem_path, file_size, size); file_size, size);
return NULL; return NULL;
} }

View File

@ -11,7 +11,7 @@
#include "hw/intc/i8259.h" #include "hw/intc/i8259.h"
PCIBus *typhoon_init(ram_addr_t, ISABus **, qemu_irq *, AlphaCPU *[4], PCIBus *typhoon_init(MemoryRegion *, ISABus **, qemu_irq *, AlphaCPU *[4],
pci_map_irq_fn); pci_map_irq_fn);
/* alpha_pci.c. */ /* alpha_pci.c. */

View File

@ -75,7 +75,7 @@ static void clipper_init(MachineState *machine)
cpus[0]->env.trap_arg2 = smp_cpus; cpus[0]->env.trap_arg2 = smp_cpus;
/* Init the chipset. */ /* Init the chipset. */
pci_bus = typhoon_init(ram_size, &isa_bus, &rtc_irq, cpus, pci_bus = typhoon_init(machine->ram, &isa_bus, &rtc_irq, cpus,
clipper_pci_map_irq); clipper_pci_map_irq);
/* Since we have an SRM-compatible PALcode, use the SRM epoch. */ /* Since we have an SRM-compatible PALcode, use the SRM epoch. */
@ -183,6 +183,7 @@ static void clipper_machine_init(MachineClass *mc)
mc->max_cpus = 4; mc->max_cpus = 4;
mc->is_default = 1; mc->is_default = 1;
mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67"); mc->default_cpu_type = ALPHA_CPU_TYPE_NAME("ev67");
mc->default_ram_id = "ram";
} }
DEFINE_MACHINE("clipper", clipper_machine_init) DEFINE_MACHINE("clipper", clipper_machine_init)

View File

@ -58,7 +58,6 @@ typedef struct TyphoonState {
TyphoonCchip cchip; TyphoonCchip cchip;
TyphoonPchip pchip; TyphoonPchip pchip;
MemoryRegion dchip_region; MemoryRegion dchip_region;
MemoryRegion ram_region;
} TyphoonState; } TyphoonState;
/* Called when one of DRIR or DIM changes. */ /* Called when one of DRIR or DIM changes. */
@ -817,8 +816,7 @@ static void typhoon_alarm_timer(void *opaque)
cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER); cpu_interrupt(CPU(s->cchip.cpu[cpu]), CPU_INTERRUPT_TIMER);
} }
PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus, PCIBus *typhoon_init(MemoryRegion *ram, ISABus **isa_bus, qemu_irq *p_rtc_irq,
qemu_irq *p_rtc_irq,
AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq) AlphaCPU *cpus[4], pci_map_irq_fn sys_map_irq)
{ {
MemoryRegion *addr_space = get_system_memory(); MemoryRegion *addr_space = get_system_memory();
@ -851,9 +849,7 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
/* Main memory region, 0x00.0000.0000. Real hardware supports 32GB, /* Main memory region, 0x00.0000.0000. Real hardware supports 32GB,
but the address space hole reserved at this point is 8TB. */ but the address space hole reserved at this point is 8TB. */
memory_region_allocate_system_memory(&s->ram_region, OBJECT(s), "ram", memory_region_add_subregion(addr_space, 0, ram);
ram_size);
memory_region_add_subregion(addr_space, 0, &s->ram_region);
/* TIGbus, 0x801.0000.0000, 1GB. */ /* TIGbus, 0x801.0000.0000, 1GB. */
/* ??? The TIGbus is used for delivering interrupts, and access to /* ??? The TIGbus is used for delivering interrupts, and access to

View File

@ -35,7 +35,6 @@ static struct arm_boot_info aspeed_board_binfo = {
struct AspeedBoardState { struct AspeedBoardState {
AspeedSoCState soc; AspeedSoCState soc;
MemoryRegion ram_container; MemoryRegion ram_container;
MemoryRegion ram;
MemoryRegion max_ram; MemoryRegion max_ram;
}; };
@ -197,6 +196,7 @@ static void aspeed_machine_init(MachineState *machine)
memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container", memory_region_init(&bmc->ram_container, NULL, "aspeed-ram-container",
UINT32_MAX); UINT32_MAX);
memory_region_add_subregion(&bmc->ram_container, 0, machine->ram);
object_initialize_child(OBJECT(machine), "soc", &bmc->soc, object_initialize_child(OBJECT(machine), "soc", &bmc->soc,
(sizeof(bmc->soc)), amc->soc_name, &error_abort, (sizeof(bmc->soc)), amc->soc_name, &error_abort,
@ -204,8 +204,12 @@ static void aspeed_machine_init(MachineState *machine)
sc = ASPEED_SOC_GET_CLASS(&bmc->soc); sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
/*
* This will error out if isize is not supported by memory controller.
*/
object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size", object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size",
&error_abort); &error_fatal);
object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap1, "hw-strap1", object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap1, "hw-strap1",
&error_abort); &error_abort);
object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap2, "hw-strap2", object_property_set_int(OBJECT(&bmc->soc), amc->hw_strap2, "hw-strap2",
@ -228,15 +232,6 @@ static void aspeed_machine_init(MachineState *machine)
object_property_set_bool(OBJECT(&bmc->soc), true, "realized", object_property_set_bool(OBJECT(&bmc->soc), true, "realized",
&error_abort); &error_abort);
/*
* Allocate RAM after the memory controller has checked the size
* was valid. If not, a default value is used.
*/
ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
&error_abort);
memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
memory_region_add_subregion(&bmc->ram_container, 0, &bmc->ram);
memory_region_add_subregion(get_system_memory(), memory_region_add_subregion(get_system_memory(),
sc->memmap[ASPEED_SDRAM], sc->memmap[ASPEED_SDRAM],
&bmc->ram_container); &bmc->ram_container);
@ -439,6 +434,7 @@ static void aspeed_machine_class_init(ObjectClass *oc, void *data)
mc->no_floppy = 1; mc->no_floppy = 1;
mc->no_cdrom = 1; mc->no_cdrom = 1;
mc->no_parallel = 1; mc->no_parallel = 1;
mc->default_ram_id = "ram";
aspeed_machine_class_props_init(oc); aspeed_machine_class_props_init(oc);
} }

View File

@ -10,6 +10,7 @@
*/ */
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/cutils.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "hw/boards.h" #include "hw/boards.h"
#include "strongarm.h" #include "strongarm.h"
@ -27,13 +28,18 @@ static void collie_init(MachineState *machine)
{ {
StrongARMState *s; StrongARMState *s;
DriveInfo *dinfo; DriveInfo *dinfo;
MemoryRegion *sdram = g_new(MemoryRegion, 1); MachineClass *mc = MACHINE_GET_CLASS(machine);
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
s = sa1110_init(machine->cpu_type); s = sa1110_init(machine->cpu_type);
memory_region_allocate_system_memory(sdram, NULL, "strongarm.sdram", memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
collie_binfo.ram_size);
memory_region_add_subregion(get_system_memory(), SA_SDCS0, sdram);
dinfo = drive_get(IF_PFLASH, 0, 0); dinfo = drive_get(IF_PFLASH, 0, 0);
pflash_cfi01_register(SA_CS0, "collie.fl1", 0x02000000, pflash_cfi01_register(SA_CS0, "collie.fl1", 0x02000000,
@ -57,6 +63,8 @@ static void collie_machine_init(MachineClass *mc)
mc->init = collie_init; mc->init = collie_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("sa1110"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("sa1110");
mc->default_ram_size = 0x20000000;
mc->default_ram_id = "strongarm.sdram";
} }
DEFINE_MACHINE("collie", collie_machine_init) DEFINE_MACHINE("collie", collie_machine_init)

View File

@ -28,52 +28,42 @@ static struct arm_boot_info cubieboard_binfo = {
.board_id = 0x1008, .board_id = 0x1008,
}; };
typedef struct CubieBoardState {
AwA10State *a10;
MemoryRegion sdram;
} CubieBoardState;
static void cubieboard_init(MachineState *machine) static void cubieboard_init(MachineState *machine)
{ {
CubieBoardState *s = g_new(CubieBoardState, 1); AwA10State *a10 = AW_A10(object_new(TYPE_AW_A10));
Error *err = NULL; Error *err = NULL;
s->a10 = AW_A10(object_new(TYPE_AW_A10)); object_property_set_int(OBJECT(&a10->emac), 1, "phy-addr", &err);
object_property_set_int(OBJECT(&s->a10->emac), 1, "phy-addr", &err);
if (err != NULL) { if (err != NULL) {
error_reportf_err(err, "Couldn't set phy address: "); error_reportf_err(err, "Couldn't set phy address: ");
exit(1); exit(1);
} }
object_property_set_int(OBJECT(&s->a10->timer), 32768, "clk0-freq", &err); object_property_set_int(OBJECT(&a10->timer), 32768, "clk0-freq", &err);
if (err != NULL) { if (err != NULL) {
error_reportf_err(err, "Couldn't set clk0 frequency: "); error_reportf_err(err, "Couldn't set clk0 frequency: ");
exit(1); exit(1);
} }
object_property_set_int(OBJECT(&s->a10->timer), 24000000, "clk1-freq", object_property_set_int(OBJECT(&a10->timer), 24000000, "clk1-freq", &err);
&err);
if (err != NULL) { if (err != NULL) {
error_reportf_err(err, "Couldn't set clk1 frequency: "); error_reportf_err(err, "Couldn't set clk1 frequency: ");
exit(1); exit(1);
} }
object_property_set_bool(OBJECT(s->a10), true, "realized", &err); object_property_set_bool(OBJECT(a10), true, "realized", &err);
if (err != NULL) { if (err != NULL) {
error_reportf_err(err, "Couldn't realize Allwinner A10: "); error_reportf_err(err, "Couldn't realize Allwinner A10: ");
exit(1); exit(1);
} }
memory_region_allocate_system_memory(&s->sdram, NULL, "cubieboard.ram",
machine->ram_size);
memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE, memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
&s->sdram); machine->ram);
/* TODO create and connect IDE devices for ide_drive_get() */ /* TODO create and connect IDE devices for ide_drive_get() */
cubieboard_binfo.ram_size = machine->ram_size; cubieboard_binfo.ram_size = machine->ram_size;
arm_load_kernel(&s->a10->cpu, machine, &cubieboard_binfo); arm_load_kernel(&a10->cpu, machine, &cubieboard_binfo);
} }
static void cubieboard_machine_init(MachineClass *mc) static void cubieboard_machine_init(MachineClass *mc)
@ -84,6 +74,7 @@ static void cubieboard_machine_init(MachineClass *mc)
mc->block_default_type = IF_IDE; mc->block_default_type = IF_IDE;
mc->units_per_default_bus = 1; mc->units_per_default_bus = 1;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "cubieboard.ram";
} }
DEFINE_MACHINE("cubieboard", cubieboard_machine_init) DEFINE_MACHINE("cubieboard", cubieboard_machine_init)

View File

@ -35,39 +35,40 @@
#include "hw/loader.h" #include "hw/loader.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
#include "qemu/units.h"
#include "qemu/cutils.h"
#define DIGIC4_ROM0_BASE 0xf0000000 #define DIGIC4_ROM0_BASE 0xf0000000
#define DIGIC4_ROM1_BASE 0xf8000000 #define DIGIC4_ROM1_BASE 0xf8000000
#define DIGIC4_ROM_MAX_SIZE 0x08000000 #define DIGIC4_ROM_MAX_SIZE 0x08000000
typedef struct DigicBoardState {
DigicState *digic;
MemoryRegion ram;
} DigicBoardState;
typedef struct DigicBoard { typedef struct DigicBoard {
hwaddr ram_size; void (*add_rom0)(DigicState *, hwaddr, const char *);
void (*add_rom0)(DigicBoardState *, hwaddr, const char *);
const char *rom0_def_filename; const char *rom0_def_filename;
void (*add_rom1)(DigicBoardState *, hwaddr, const char *); void (*add_rom1)(DigicState *, hwaddr, const char *);
const char *rom1_def_filename; const char *rom1_def_filename;
} DigicBoard; } DigicBoard;
static void digic4_board_init(DigicBoard *board) static void digic4_board_init(MachineState *machine, DigicBoard *board)
{ {
Error *err = NULL; Error *err = NULL;
DigicState *s = DIGIC(object_new(TYPE_DIGIC));
MachineClass *mc = MACHINE_GET_CLASS(machine);
DigicBoardState *s = g_new(DigicBoardState, 1); if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
s->digic = DIGIC(object_new(TYPE_DIGIC)); object_property_set_bool(OBJECT(s), true, "realized", &err);
object_property_set_bool(OBJECT(s->digic), true, "realized", &err);
if (err != NULL) { if (err != NULL) {
error_reportf_err(err, "Couldn't realize DIGIC SoC: "); error_reportf_err(err, "Couldn't realize DIGIC SoC: ");
exit(1); exit(1);
} }
memory_region_allocate_system_memory(&s->ram, NULL, "ram", board->ram_size); memory_region_add_subregion(get_system_memory(), 0, machine->ram);
memory_region_add_subregion(get_system_memory(), 0, &s->ram);
if (board->add_rom0) { if (board->add_rom0) {
board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename); board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename);
@ -78,7 +79,7 @@ static void digic4_board_init(DigicBoard *board)
} }
} }
static void digic_load_rom(DigicBoardState *s, hwaddr addr, static void digic_load_rom(DigicState *s, hwaddr addr,
hwaddr max_size, const char *def_filename) hwaddr max_size, const char *def_filename)
{ {
target_long rom_size; target_long rom_size;
@ -118,7 +119,7 @@ static void digic_load_rom(DigicBoardState *s, hwaddr addr,
* Samsung K8P3215UQB * Samsung K8P3215UQB
* 64M Bit (4Mx16) Page Mode / Multi-Bank NOR Flash Memory * 64M Bit (4Mx16) Page Mode / Multi-Bank NOR Flash Memory
*/ */
static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr, static void digic4_add_k8p3215uqb_rom(DigicState *s, hwaddr addr,
const char *def_filename) const char *def_filename)
{ {
#define FLASH_K8P3215UQB_SIZE (4 * 1024 * 1024) #define FLASH_K8P3215UQB_SIZE (4 * 1024 * 1024)
@ -135,14 +136,13 @@ static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr,
} }
static DigicBoard digic4_board_canon_a1100 = { static DigicBoard digic4_board_canon_a1100 = {
.ram_size = 64 * 1024 * 1024,
.add_rom1 = digic4_add_k8p3215uqb_rom, .add_rom1 = digic4_add_k8p3215uqb_rom,
.rom1_def_filename = "canon-a1100-rom1.bin", .rom1_def_filename = "canon-a1100-rom1.bin",
}; };
static void canon_a1100_init(MachineState *machine) static void canon_a1100_init(MachineState *machine)
{ {
digic4_board_init(&digic4_board_canon_a1100); digic4_board_init(machine, &digic4_board_canon_a1100);
} }
static void canon_a1100_machine_init(MachineClass *mc) static void canon_a1100_machine_init(MachineClass *mc)
@ -150,6 +150,8 @@ static void canon_a1100_machine_init(MachineClass *mc)
mc->desc = "Canon PowerShot A1100 IS"; mc->desc = "Canon PowerShot A1100 IS";
mc->init = &canon_a1100_init; mc->init = &canon_a1100_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_size = 64 * MiB;
mc->default_ram_id = "ram";
} }
DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init) DEFINE_MACHINE("canon-a1100", canon_a1100_machine_init)

View File

@ -236,7 +236,6 @@ enum cxmachines {
*/ */
static void calxeda_init(MachineState *machine, enum cxmachines machine_id) static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
{ {
ram_addr_t ram_size = machine->ram_size;
DeviceState *dev = NULL; DeviceState *dev = NULL;
SysBusDevice *busdev; SysBusDevice *busdev;
qemu_irq pic[128]; qemu_irq pic[128];
@ -247,7 +246,6 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
qemu_irq cpu_virq[4]; qemu_irq cpu_virq[4];
qemu_irq cpu_vfiq[4]; qemu_irq cpu_vfiq[4];
MemoryRegion *sysram; MemoryRegion *sysram;
MemoryRegion *dram;
MemoryRegion *sysmem; MemoryRegion *sysmem;
char *sysboot_filename; char *sysboot_filename;
@ -290,10 +288,8 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
} }
sysmem = get_system_memory(); sysmem = get_system_memory();
dram = g_new(MemoryRegion, 1);
memory_region_allocate_system_memory(dram, NULL, "highbank.dram", ram_size);
/* SDRAM at address zero. */ /* SDRAM at address zero. */
memory_region_add_subregion(sysmem, 0, dram); memory_region_add_subregion(sysmem, 0, machine->ram);
sysram = g_new(MemoryRegion, 1); sysram = g_new(MemoryRegion, 1);
memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000, memory_region_init_ram(sysram, NULL, "highbank.sysram", 0x8000,
@ -387,7 +383,7 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
/* TODO create and connect IDE devices for ide_drive_get() */ /* TODO create and connect IDE devices for ide_drive_get() */
highbank_binfo.ram_size = ram_size; highbank_binfo.ram_size = machine->ram_size;
/* highbank requires a dtb in order to boot, and the dtb will override /* highbank requires a dtb in order to boot, and the dtb will override
* the board ID. The following value is ignored, so set it to -1 to be * the board ID. The following value is ignored, so set it to -1 to be
* clear that the value is meaningless. * clear that the value is meaningless.
@ -430,6 +426,7 @@ static void highbank_class_init(ObjectClass *oc, void *data)
mc->units_per_default_bus = 1; mc->units_per_default_bus = 1;
mc->max_cpus = 4; mc->max_cpus = 4;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "highbank.dram";
} }
static const TypeInfo highbank_type = { static const TypeInfo highbank_type = {
@ -448,6 +445,7 @@ static void midway_class_init(ObjectClass *oc, void *data)
mc->units_per_default_bus = 1; mc->units_per_default_bus = 1;
mc->max_cpus = 4; mc->max_cpus = 4;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "highbank.dram";
} }
static const TypeInfo midway_type = { static const TypeInfo midway_type = {

View File

@ -32,6 +32,7 @@
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
#include "hw/i2c/i2c.h" #include "hw/i2c/i2c.h"
#include "qemu/cutils.h"
/* Memory map for PDK Emulation Baseboard: /* Memory map for PDK Emulation Baseboard:
* 0x00000000-0x7fffffff See i.MX25 SOC fr support * 0x00000000-0x7fffffff See i.MX25 SOC fr support
@ -58,7 +59,6 @@
typedef struct IMX25PDK { typedef struct IMX25PDK {
FslIMX25State soc; FslIMX25State soc;
MemoryRegion ram;
MemoryRegion ram_alias; MemoryRegion ram_alias;
} IMX25PDK; } IMX25PDK;
@ -66,6 +66,7 @@ static struct arm_boot_info imx25_pdk_binfo;
static void imx25_pdk_init(MachineState *machine) static void imx25_pdk_init(MachineState *machine)
{ {
MachineClass *mc = MACHINE_GET_CLASS(machine);
IMX25PDK *s = g_new0(IMX25PDK, 1); IMX25PDK *s = g_new0(IMX25PDK, 1);
unsigned int ram_size; unsigned int ram_size;
unsigned int alias_offset; unsigned int alias_offset;
@ -78,16 +79,14 @@ static void imx25_pdk_init(MachineState *machine)
/* We need to initialize our memory */ /* We need to initialize our memory */
if (machine->ram_size > (FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE)) { if (machine->ram_size > (FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE)) {
warn_report("RAM size " RAM_ADDR_FMT " above max supported, " char *sz = size_to_str(mc->default_ram_size);
"reduced to %x", machine->ram_size, error_report("Invalid RAM size, should be %s", sz);
FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE); g_free(sz);
machine->ram_size = FSL_IMX25_SDRAM0_SIZE + FSL_IMX25_SDRAM1_SIZE; exit(EXIT_FAILURE);
} }
memory_region_allocate_system_memory(&s->ram, NULL, "imx25.ram",
machine->ram_size);
memory_region_add_subregion(get_system_memory(), FSL_IMX25_SDRAM0_ADDR, memory_region_add_subregion(get_system_memory(), FSL_IMX25_SDRAM0_ADDR,
&s->ram); machine->ram);
/* initialize the alias memory if any */ /* initialize the alias memory if any */
for (i = 0, ram_size = machine->ram_size, alias_offset = 0; for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
@ -107,7 +106,8 @@ static void imx25_pdk_init(MachineState *machine)
if (size < ram[i].size) { if (size < ram[i].size) {
memory_region_init_alias(&s->ram_alias, NULL, "ram.alias", memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
&s->ram, alias_offset, ram[i].size - size); machine->ram,
alias_offset, ram[i].size - size);
memory_region_add_subregion(get_system_memory(), memory_region_add_subregion(get_system_memory(),
ram[i].addr + size, &s->ram_alias); ram[i].addr + size, &s->ram_alias);
} }
@ -135,6 +135,7 @@ static void imx25_pdk_machine_init(MachineClass *mc)
mc->desc = "ARM i.MX25 PDK board (ARM926)"; mc->desc = "ARM i.MX25 PDK board (ARM926)";
mc->init = imx25_pdk_init; mc->init = imx25_pdk_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "imx25.ram";
} }
DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init) DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init)

View File

@ -585,7 +585,6 @@ static void integratorcp_init(MachineState *machine)
Object *cpuobj; Object *cpuobj;
ARMCPU *cpu; ARMCPU *cpu;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *ram_alias = g_new(MemoryRegion, 1); MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
qemu_irq pic[32]; qemu_irq pic[32];
DeviceState *dev, *sic, *icp; DeviceState *dev, *sic, *icp;
@ -605,14 +604,13 @@ static void integratorcp_init(MachineState *machine)
cpu = ARM_CPU(cpuobj); cpu = ARM_CPU(cpuobj);
memory_region_allocate_system_memory(ram, NULL, "integrator.ram",
ram_size);
/* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */ /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */
/* ??? RAM should repeat to fill physical memory space. */ /* ??? RAM should repeat to fill physical memory space. */
/* SDRAM at address zero*/ /* SDRAM at address zero*/
memory_region_add_subregion(address_space_mem, 0, ram); memory_region_add_subregion(address_space_mem, 0, machine->ram);
/* And again at address 0x80000000 */ /* And again at address 0x80000000 */
memory_region_init_alias(ram_alias, NULL, "ram.alias", ram, 0, ram_size); memory_region_init_alias(ram_alias, NULL, "ram.alias", machine->ram,
0, ram_size);
memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias); memory_region_add_subregion(address_space_mem, 0x80000000, ram_alias);
dev = qdev_create(NULL, TYPE_INTEGRATOR_CM); dev = qdev_create(NULL, TYPE_INTEGRATOR_CM);
@ -660,6 +658,7 @@ static void integratorcp_machine_init(MachineClass *mc)
mc->init = integratorcp_init; mc->init = integratorcp_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
mc->default_ram_id = "integrator.ram";
} }
DEFINE_MACHINE("integratorcp", integratorcp_machine_init) DEFINE_MACHINE("integratorcp", integratorcp_machine_init)

View File

@ -25,6 +25,7 @@
#include "hw/char/serial.h" #include "hw/char/serial.h"
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "qemu/cutils.h"
/* Memory map for Kzm Emulation Baseboard: /* Memory map for Kzm Emulation Baseboard:
* 0x00000000-0x7fffffff See i.MX31 SOC for support * 0x00000000-0x7fffffff See i.MX31 SOC for support
@ -51,7 +52,6 @@
typedef struct IMX31KZM { typedef struct IMX31KZM {
FslIMX31State soc; FslIMX31State soc;
MemoryRegion ram;
MemoryRegion ram_alias; MemoryRegion ram_alias;
} IMX31KZM; } IMX31KZM;
@ -78,16 +78,14 @@ static void kzm_init(MachineState *machine)
/* Check the amount of memory is compatible with the SOC */ /* Check the amount of memory is compatible with the SOC */
if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) { if (machine->ram_size > (FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE)) {
warn_report("RAM size " RAM_ADDR_FMT " above max supported, " char *sz = size_to_str(FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE);
"reduced to %x", machine->ram_size, error_report("RAM size more than %s is not supported", sz);
FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE); g_free(sz);
machine->ram_size = FSL_IMX31_SDRAM0_SIZE + FSL_IMX31_SDRAM1_SIZE; exit(EXIT_FAILURE);
} }
memory_region_allocate_system_memory(&s->ram, NULL, "kzm.ram",
machine->ram_size);
memory_region_add_subregion(get_system_memory(), FSL_IMX31_SDRAM0_ADDR, memory_region_add_subregion(get_system_memory(), FSL_IMX31_SDRAM0_ADDR,
&s->ram); machine->ram);
/* initialize the alias memory if any */ /* initialize the alias memory if any */
for (i = 0, ram_size = machine->ram_size, alias_offset = 0; for (i = 0, ram_size = machine->ram_size, alias_offset = 0;
@ -107,7 +105,8 @@ static void kzm_init(MachineState *machine)
if (size < ram[i].size) { if (size < ram[i].size) {
memory_region_init_alias(&s->ram_alias, NULL, "ram.alias", memory_region_init_alias(&s->ram_alias, NULL, "ram.alias",
&s->ram, alias_offset, ram[i].size - size); machine->ram,
alias_offset, ram[i].size - size);
memory_region_add_subregion(get_system_memory(), memory_region_add_subregion(get_system_memory(),
ram[i].addr + size, &s->ram_alias); ram[i].addr + size, &s->ram_alias);
} }
@ -139,6 +138,7 @@ static void kzm_machine_init(MachineClass *mc)
mc->desc = "ARM KZM Emulation Baseboard (ARM1136)"; mc->desc = "ARM KZM Emulation Baseboard (ARM1136)";
mc->init = kzm_init; mc->init = kzm_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "kzm.ram";
} }
DEFINE_MACHINE("kzm", kzm_machine_init) DEFINE_MACHINE("kzm", kzm_machine_init)

View File

@ -19,15 +19,10 @@
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
typedef struct {
FslIMX6ULState soc;
MemoryRegion ram;
} MCIMX6ULEVK;
static void mcimx6ul_evk_init(MachineState *machine) static void mcimx6ul_evk_init(MachineState *machine)
{ {
static struct arm_boot_info boot_info; static struct arm_boot_info boot_info;
MCIMX6ULEVK *s = g_new0(MCIMX6ULEVK, 1); FslIMX6ULState *s;
int i; int i;
if (machine->ram_size > FSL_IMX6UL_MMDC_SIZE) { if (machine->ram_size > FSL_IMX6UL_MMDC_SIZE) {
@ -43,15 +38,12 @@ static void mcimx6ul_evk_init(MachineState *machine)
.nb_cpus = machine->smp.cpus, .nb_cpus = machine->smp.cpus,
}; };
object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc), s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
TYPE_FSL_IMX6UL, &error_fatal, NULL); object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
object_property_set_bool(OBJECT(s), true, "realized", &error_fatal);
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal); memory_region_add_subregion(get_system_memory(), FSL_IMX6UL_MMDC_ADDR,
machine->ram);
memory_region_allocate_system_memory(&s->ram, NULL, "mcimx6ul-evk.ram",
machine->ram_size);
memory_region_add_subregion(get_system_memory(),
FSL_IMX6UL_MMDC_ADDR, &s->ram);
for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) { for (i = 0; i < FSL_IMX6UL_NUM_USDHCS; i++) {
BusState *bus; BusState *bus;
@ -61,7 +53,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
di = drive_get_next(IF_SD); di = drive_get_next(IF_SD);
blk = di ? blk_by_legacy_dinfo(di) : NULL; blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus"); bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
carddev = qdev_create(bus, TYPE_SD_CARD); carddev = qdev_create(bus, TYPE_SD_CARD);
qdev_prop_set_drive(carddev, "drive", blk, &error_fatal); qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
object_property_set_bool(OBJECT(carddev), true, object_property_set_bool(OBJECT(carddev), true,
@ -69,7 +61,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
} }
if (!qtest_enabled()) { if (!qtest_enabled()) {
arm_load_kernel(&s->soc.cpu, machine, &boot_info); arm_load_kernel(&s->cpu, machine, &boot_info);
} }
} }
@ -78,5 +70,6 @@ static void mcimx6ul_evk_machine_init(MachineClass *mc)
mc->desc = "Freescale i.MX6UL Evaluation Kit (Cortex A7)"; mc->desc = "Freescale i.MX6UL Evaluation Kit (Cortex A7)";
mc->init = mcimx6ul_evk_init; mc->init = mcimx6ul_evk_init;
mc->max_cpus = FSL_IMX6UL_NUM_CPUS; mc->max_cpus = FSL_IMX6UL_NUM_CPUS;
mc->default_ram_id = "mcimx6ul-evk.ram";
} }
DEFINE_MACHINE("mcimx6ul-evk", mcimx6ul_evk_machine_init) DEFINE_MACHINE("mcimx6ul-evk", mcimx6ul_evk_machine_init)

View File

@ -21,15 +21,10 @@
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
typedef struct {
FslIMX7State soc;
MemoryRegion ram;
} MCIMX7Sabre;
static void mcimx7d_sabre_init(MachineState *machine) static void mcimx7d_sabre_init(MachineState *machine)
{ {
static struct arm_boot_info boot_info; static struct arm_boot_info boot_info;
MCIMX7Sabre *s = g_new0(MCIMX7Sabre, 1); FslIMX7State *s;
int i; int i;
if (machine->ram_size > FSL_IMX7_MMDC_SIZE) { if (machine->ram_size > FSL_IMX7_MMDC_SIZE) {
@ -45,15 +40,12 @@ static void mcimx7d_sabre_init(MachineState *machine)
.nb_cpus = machine->smp.cpus, .nb_cpus = machine->smp.cpus,
}; };
object_initialize_child(OBJECT(machine), "soc", s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
&s->soc, sizeof(s->soc), object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
TYPE_FSL_IMX7, &error_fatal, NULL); object_property_set_bool(OBJECT(s), true, "realized", &error_fatal);
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
memory_region_allocate_system_memory(&s->ram, NULL, "mcimx7d-sabre.ram", memory_region_add_subregion(get_system_memory(), FSL_IMX7_MMDC_ADDR,
machine->ram_size); machine->ram);
memory_region_add_subregion(get_system_memory(),
FSL_IMX7_MMDC_ADDR, &s->ram);
for (i = 0; i < FSL_IMX7_NUM_USDHCS; i++) { for (i = 0; i < FSL_IMX7_NUM_USDHCS; i++) {
BusState *bus; BusState *bus;
@ -63,7 +55,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
di = drive_get_next(IF_SD); di = drive_get_next(IF_SD);
blk = di ? blk_by_legacy_dinfo(di) : NULL; blk = di ? blk_by_legacy_dinfo(di) : NULL;
bus = qdev_get_child_bus(DEVICE(&s->soc.usdhc[i]), "sd-bus"); bus = qdev_get_child_bus(DEVICE(&s->usdhc[i]), "sd-bus");
carddev = qdev_create(bus, TYPE_SD_CARD); carddev = qdev_create(bus, TYPE_SD_CARD);
qdev_prop_set_drive(carddev, "drive", blk, &error_fatal); qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
object_property_set_bool(OBJECT(carddev), true, object_property_set_bool(OBJECT(carddev), true,
@ -71,7 +63,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
} }
if (!qtest_enabled()) { if (!qtest_enabled()) {
arm_load_kernel(&s->soc.cpu[0], machine, &boot_info); arm_load_kernel(&s->cpu[0], machine, &boot_info);
} }
} }
@ -80,5 +72,6 @@ static void mcimx7d_sabre_machine_init(MachineClass *mc)
mc->desc = "Freescale i.MX7 DUAL SABRE (Cortex A7)"; mc->desc = "Freescale i.MX7 DUAL SABRE (Cortex A7)";
mc->init = mcimx7d_sabre_init; mc->init = mcimx7d_sabre_init;
mc->max_cpus = FSL_IMX7_NUM_CPUS; mc->max_cpus = FSL_IMX7_NUM_CPUS;
mc->default_ram_id = "mcimx7d-sabre.ram";
} }
DEFINE_MACHINE("mcimx7d-sabre", mcimx7d_sabre_machine_init) DEFINE_MACHINE("mcimx7d-sabre", mcimx7d_sabre_machine_init)

View File

@ -39,6 +39,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/cutils.h"
#include "qapi/error.h" #include "qapi/error.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "hw/arm/boot.h" #include "hw/arm/boot.h"
@ -79,7 +80,6 @@ typedef struct {
MachineState parent; MachineState parent;
ARMSSE iotkit; ARMSSE iotkit;
MemoryRegion psram;
MemoryRegion ssram[3]; MemoryRegion ssram[3];
MemoryRegion ssram1_m; MemoryRegion ssram1_m;
MPS2SCC scc; MPS2SCC scc;
@ -388,6 +388,13 @@ static void mps2tz_common_init(MachineState *machine)
exit(1); exit(1);
} }
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit, sysbus_init_child_obj(OBJECT(machine), "iotkit", &mms->iotkit,
sizeof(mms->iotkit), mmc->armsse_type); sizeof(mms->iotkit), mmc->armsse_type);
iotkitdev = DEVICE(&mms->iotkit); iotkitdev = DEVICE(&mms->iotkit);
@ -458,9 +465,7 @@ static void mps2tz_common_init(MachineState *machine)
* tradeoffs. For QEMU they're all just RAM, though. We arbitrarily * tradeoffs. For QEMU they're all just RAM, though. We arbitrarily
* call the 16MB our "system memory", as it's the largest lump. * call the 16MB our "system memory", as it's the largest lump.
*/ */
memory_region_allocate_system_memory(&mms->psram, memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
NULL, "mps.ram", 16 * MiB);
memory_region_add_subregion(system_memory, 0x80000000, &mms->psram);
/* The overflow IRQs for all UARTs are ORed together. /* The overflow IRQs for all UARTs are ORed together.
* Tx, Rx and "combined" IRQs are sent to the NVIC separately. * Tx, Rx and "combined" IRQs are sent to the NVIC separately.
@ -642,6 +647,8 @@ static void mps2tz_class_init(ObjectClass *oc, void *data)
mc->init = mps2tz_common_init; mc->init = mps2tz_common_init;
iic->check = mps2_tz_idau_check; iic->check = mps2_tz_idau_check;
mc->default_ram_size = 16 * MiB;
mc->default_ram_id = "mps.ram";
} }
static void mps2tz_an505_class_init(ObjectClass *oc, void *data) static void mps2tz_an505_class_init(ObjectClass *oc, void *data)

View File

@ -24,6 +24,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/cutils.h"
#include "qapi/error.h" #include "qapi/error.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "hw/arm/boot.h" #include "hw/arm/boot.h"
@ -55,7 +56,6 @@ typedef struct {
MachineState parent; MachineState parent;
ARMv7MState armv7m; ARMv7MState armv7m;
MemoryRegion psram;
MemoryRegion ssram1; MemoryRegion ssram1;
MemoryRegion ssram1_m; MemoryRegion ssram1_m;
MemoryRegion ssram23; MemoryRegion ssram23;
@ -118,6 +118,13 @@ static void mps2_common_init(MachineState *machine)
exit(1); exit(1);
} }
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
/* The FPGA images have an odd combination of different RAMs, /* The FPGA images have an odd combination of different RAMs,
* because in hardware they are different implementations and * because in hardware they are different implementations and
* connected to different buses, giving varying performance/size * connected to different buses, giving varying performance/size
@ -146,9 +153,7 @@ static void mps2_common_init(MachineState *machine)
* This is of no use for QEMU so we don't implement it (as if * This is of no use for QEMU so we don't implement it (as if
* zbt_boot_ctrl is always zero). * zbt_boot_ctrl is always zero).
*/ */
memory_region_allocate_system_memory(&mms->psram, memory_region_add_subregion(system_memory, 0x21000000, machine->ram);
NULL, "mps.ram", 16 * MiB);
memory_region_add_subregion(system_memory, 0x21000000, &mms->psram);
switch (mmc->fpga_type) { switch (mmc->fpga_type) {
case FPGA_AN385: case FPGA_AN385:
@ -338,6 +343,8 @@ static void mps2_class_init(ObjectClass *oc, void *data)
mc->init = mps2_common_init; mc->init = mps2_common_init;
mc->max_cpus = 1; mc->max_cpus = 1;
mc->default_ram_size = 16 * MiB;
mc->default_ram_id = "mps.ram";
} }
static void mps2_an385_class_init(ObjectClass *oc, void *data) static void mps2_an385_class_init(ObjectClass *oc, void *data)

View File

@ -32,6 +32,7 @@
#include "sysemu/runstate.h" #include "sysemu/runstate.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "ui/pixel_ops.h" #include "ui/pixel_ops.h"
#include "qemu/cutils.h"
#define MP_MISC_BASE 0x80002000 #define MP_MISC_BASE 0x80002000
#define MP_MISC_SIZE 0x00001000 #define MP_MISC_SIZE 0x00001000
@ -1589,16 +1590,21 @@ static void musicpal_init(MachineState *machine)
int i; int i;
unsigned long flash_size; unsigned long flash_size;
DriveInfo *dinfo; DriveInfo *dinfo;
MachineClass *mc = MACHINE_GET_CLASS(machine);
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *sram = g_new(MemoryRegion, 1); MemoryRegion *sram = g_new(MemoryRegion, 1);
/* For now we use a fixed - the original - RAM size */
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
cpu = ARM_CPU(cpu_create(machine->cpu_type)); cpu = ARM_CPU(cpu_create(machine->cpu_type));
/* For now we use a fixed - the original - RAM size */ memory_region_add_subregion(address_space_mem, 0, machine->ram);
memory_region_allocate_system_memory(ram, NULL, "musicpal.ram",
MP_RAM_DEFAULT_SIZE);
memory_region_add_subregion(address_space_mem, 0, ram);
memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE, memory_region_init_ram(sram, NULL, "musicpal.sram", MP_SRAM_SIZE,
&error_fatal); &error_fatal);
@ -1714,6 +1720,8 @@ static void musicpal_machine_init(MachineClass *mc)
mc->init = musicpal_init; mc->init = musicpal_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
mc->default_ram_size = MP_RAM_DEFAULT_SIZE;
mc->default_ram_id = "musicpal.ram";
} }
DEFINE_MACHINE("musicpal", musicpal_machine_init) DEFINE_MACHINE("musicpal", musicpal_machine_init)

View File

@ -47,7 +47,6 @@
/* Nokia N8x0 support */ /* Nokia N8x0 support */
struct n800_s { struct n800_s {
MemoryRegion sdram;
struct omap_mpu_state_s *mpu; struct omap_mpu_state_s *mpu;
struct rfbi_chip_s blizzard; struct rfbi_chip_s blizzard;
@ -1311,13 +1310,19 @@ static void n8x0_init(MachineState *machine,
struct arm_boot_info *binfo, int model) struct arm_boot_info *binfo, int model)
{ {
struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s)); struct n800_s *s = (struct n800_s *) g_malloc0(sizeof(*s));
uint64_t sdram_size = binfo->ram_size; MachineClass *mc = MACHINE_GET_CLASS(machine);
memory_region_allocate_system_memory(&s->sdram, NULL, "omap2.dram", if (machine->ram_size != mc->default_ram_size) {
sdram_size); char *sz = size_to_str(mc->default_ram_size);
memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE, &s->sdram); error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
s->mpu = omap2420_mpu_init(&s->sdram, machine->cpu_type); memory_region_add_subregion(get_system_memory(), OMAP2_Q2_BASE,
machine->ram);
s->mpu = omap2420_mpu_init(machine->ram, machine->cpu_type);
/* Setup peripherals /* Setup peripherals
* *
@ -1383,9 +1388,8 @@ static void n8x0_init(MachineState *machine,
* *
* The code above is for loading the `zImage' file from Nokia * The code above is for loading the `zImage' file from Nokia
* images. */ * images. */
load_image_targphys(option_rom[0].name, load_image_targphys(option_rom[0].name, OMAP2_Q2_BASE + 0x400000,
OMAP2_Q2_BASE + 0x400000, machine->ram_size - 0x400000);
sdram_size - 0x400000);
n800_setup_nolo_tags(nolo_tags); n800_setup_nolo_tags(nolo_tags);
cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000); cpu_physical_memory_write(OMAP2_SRAM_BASE, nolo_tags, 0x10000);
@ -1395,16 +1399,12 @@ static void n8x0_init(MachineState *machine,
static struct arm_boot_info n800_binfo = { static struct arm_boot_info n800_binfo = {
.loader_start = OMAP2_Q2_BASE, .loader_start = OMAP2_Q2_BASE,
/* Actually two chips of 0x4000000 bytes each */
.ram_size = 0x08000000,
.board_id = 0x4f7, .board_id = 0x4f7,
.atag_board = n800_atag_setup, .atag_board = n800_atag_setup,
}; };
static struct arm_boot_info n810_binfo = { static struct arm_boot_info n810_binfo = {
.loader_start = OMAP2_Q2_BASE, .loader_start = OMAP2_Q2_BASE,
/* Actually two chips of 0x4000000 bytes each */
.ram_size = 0x08000000,
/* 0x60c and 0x6bf (WiMAX Edition) have been assigned but are not /* 0x60c and 0x6bf (WiMAX Edition) have been assigned but are not
* used by some older versions of the bootloader and 5555 is used * used by some older versions of the bootloader and 5555 is used
* instead (including versions that shipped with many devices). */ * instead (including versions that shipped with many devices). */
@ -1431,6 +1431,9 @@ static void n800_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = ""; mc->default_boot_order = "";
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
/* Actually two chips of 0x4000000 bytes each */
mc->default_ram_size = 0x08000000;
mc->default_ram_id = "omap2.dram";
} }
static const TypeInfo n800_type = { static const TypeInfo n800_type = {
@ -1448,6 +1451,9 @@ static void n810_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = ""; mc->default_boot_order = "";
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm1136-r2");
/* Actually two chips of 0x4000000 bytes each */
mc->default_ram_size = 0x08000000;
mc->default_ram_id = "omap2.dram";
} }
static const TypeInfo n810_type = { static const TypeInfo n810_type = {

View File

@ -35,6 +35,7 @@
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "cpu.h" #include "cpu.h"
#include "qemu/cutils.h"
/*****************************************************************************/ /*****************************************************************************/
/* Siemens SX1 Cellphone V1 */ /* Siemens SX1 Cellphone V1 */
@ -102,8 +103,8 @@ static struct arm_boot_info sx1_binfo = {
static void sx1_init(MachineState *machine, const int version) static void sx1_init(MachineState *machine, const int version)
{ {
struct omap_mpu_state_s *mpu; struct omap_mpu_state_s *mpu;
MachineClass *mc = MACHINE_GET_CLASS(machine);
MemoryRegion *address_space = get_system_memory(); MemoryRegion *address_space = get_system_memory();
MemoryRegion *dram = g_new(MemoryRegion, 1);
MemoryRegion *flash = g_new(MemoryRegion, 1); MemoryRegion *flash = g_new(MemoryRegion, 1);
MemoryRegion *cs = g_new(MemoryRegion, 4); MemoryRegion *cs = g_new(MemoryRegion, 4);
static uint32_t cs0val = 0x00213090; static uint32_t cs0val = 0x00213090;
@ -115,15 +116,20 @@ static void sx1_init(MachineState *machine, const int version)
uint32_t flash_size = flash0_size; uint32_t flash_size = flash0_size;
int be; int be;
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
if (version == 2) { if (version == 2) {
flash_size = flash2_size; flash_size = flash2_size;
} }
memory_region_allocate_system_memory(dram, NULL, "omap1.dram", memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, machine->ram);
sx1_binfo.ram_size);
memory_region_add_subregion(address_space, OMAP_EMIFF_BASE, dram);
mpu = omap310_mpu_init(dram, machine->cpu_type); mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
/* External Flash (EMIFS) */ /* External Flash (EMIFS) */
memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size, memory_region_init_ram(flash, NULL, "omap_sx1.flash0-0", flash_size,
@ -223,6 +229,8 @@ static void sx1_machine_v2_class_init(ObjectClass *oc, void *data)
mc->init = sx1_init_v2; mc->init = sx1_init_v2;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
mc->default_ram_size = sdram_size;
mc->default_ram_id = "omap1.dram";
} }
static const TypeInfo sx1_machine_v2_type = { static const TypeInfo sx1_machine_v2_type = {
@ -239,6 +247,8 @@ static void sx1_machine_v1_class_init(ObjectClass *oc, void *data)
mc->init = sx1_init_v1; mc->init = sx1_init_v1;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
mc->default_ram_size = sdram_size;
mc->default_ram_id = "omap1.dram";
} }
static const TypeInfo sx1_machine_v1_type = { static const TypeInfo sx1_machine_v1_type = {

View File

@ -31,6 +31,7 @@
#include "hw/loader.h" #include "hw/loader.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "cpu.h" #include "cpu.h"
#include "qemu/cutils.h"
static uint64_t static_read(void *opaque, hwaddr offset, unsigned size) static uint64_t static_read(void *opaque, hwaddr offset, unsigned size)
{ {
@ -195,15 +196,21 @@ static void palmte_init(MachineState *machine)
static uint32_t cs2val = 0x0000e1a0; static uint32_t cs2val = 0x0000e1a0;
static uint32_t cs3val = 0xe1a0e1a0; static uint32_t cs3val = 0xe1a0e1a0;
int rom_size, rom_loaded = 0; int rom_size, rom_loaded = 0;
MemoryRegion *dram = g_new(MemoryRegion, 1); MachineClass *mc = MACHINE_GET_CLASS(machine);
MemoryRegion *flash = g_new(MemoryRegion, 1); MemoryRegion *flash = g_new(MemoryRegion, 1);
MemoryRegion *cs = g_new(MemoryRegion, 4); MemoryRegion *cs = g_new(MemoryRegion, 4);
memory_region_allocate_system_memory(dram, NULL, "omap1.dram", if (machine->ram_size != mc->default_ram_size) {
palmte_binfo.ram_size); char *sz = size_to_str(mc->default_ram_size);
memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE, dram); error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
mpu = omap310_mpu_init(dram, machine->cpu_type); memory_region_add_subregion(address_space_mem, OMAP_EMIFF_BASE,
machine->ram);
mpu = omap310_mpu_init(machine->ram, machine->cpu_type);
/* External Flash (EMIFS) */ /* External Flash (EMIFS) */
memory_region_init_ram(flash, NULL, "palmte.flash", flash_size, memory_region_init_ram(flash, NULL, "palmte.flash", flash_size,
@ -265,6 +272,8 @@ static void palmte_machine_init(MachineClass *mc)
mc->init = palmte_init; mc->init = palmte_init;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("ti925t");
mc->default_ram_size = 0x02000000;
mc->default_ram_id = "omap1.dram";
} }
DEFINE_MACHINE("cheetah", palmte_machine_init) DEFINE_MACHINE("cheetah", palmte_machine_init)

View File

@ -39,7 +39,6 @@ typedef struct RaspiMachineState {
MachineState parent_obj; MachineState parent_obj;
/*< public >*/ /*< public >*/
BCM283XState soc; BCM283XState soc;
MemoryRegion ram;
} RaspiMachineState; } RaspiMachineState;
typedef struct RaspiMachineClass { typedef struct RaspiMachineClass {
@ -277,16 +276,14 @@ static void raspi_machine_init(MachineState *machine)
exit(1); exit(1);
} }
/* Allocate and map RAM */
memory_region_allocate_system_memory(&s->ram, OBJECT(machine), "ram",
machine->ram_size);
/* FIXME: Remove when we have custom CPU address space support */ /* FIXME: Remove when we have custom CPU address space support */
memory_region_add_subregion_overlap(get_system_memory(), 0, &s->ram, 0); memory_region_add_subregion_overlap(get_system_memory(), 0,
machine->ram, 0);
/* Setup the SOC */ /* Setup the SOC */
object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc), object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
board_soc_type(board_rev), &error_abort, NULL); board_soc_type(board_rev), &error_abort, NULL);
object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(&s->ram), object_property_add_const_link(OBJECT(&s->soc), "ram", OBJECT(machine->ram),
&error_abort); &error_abort);
object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev", object_property_set_int(OBJECT(&s->soc), board_rev, "board-rev",
&error_abort); &error_abort);
@ -324,6 +321,7 @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
mc->no_cdrom = 1; mc->no_cdrom = 1;
mc->default_cpus = mc->min_cpus = mc->max_cpus = cores_count(board_rev); mc->default_cpus = mc->min_cpus = mc->max_cpus = cores_count(board_rev);
mc->default_ram_size = board_ram_size(board_rev); mc->default_ram_size = board_ram_size(board_rev);
mc->default_ram_id = "ram";
if (board_version(board_rev) == 2) { if (board_version(board_rev) == 2) {
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
} }

View File

@ -19,11 +19,6 @@
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
typedef struct IMX6Sabrelite {
FslIMX6State soc;
MemoryRegion ram;
} IMX6Sabrelite;
static struct arm_boot_info sabrelite_binfo = { static struct arm_boot_info sabrelite_binfo = {
/* DDR memory start */ /* DDR memory start */
.loader_start = FSL_IMX6_MMDC_ADDR, .loader_start = FSL_IMX6_MMDC_ADDR,
@ -45,7 +40,7 @@ static void sabrelite_reset_secondary(ARMCPU *cpu,
static void sabrelite_init(MachineState *machine) static void sabrelite_init(MachineState *machine)
{ {
IMX6Sabrelite *s = g_new0(IMX6Sabrelite, 1); FslIMX6State *s;
Error *err = NULL; Error *err = NULL;
/* Check the amount of memory is compatible with the SOC */ /* Check the amount of memory is compatible with the SOC */
@ -55,19 +50,16 @@ static void sabrelite_init(MachineState *machine)
exit(1); exit(1);
} }
object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc), s = FSL_IMX6(object_new(TYPE_FSL_IMX6));
TYPE_FSL_IMX6, &error_abort, NULL); object_property_add_child(OBJECT(machine), "soc", OBJECT(s), &error_fatal);
object_property_set_bool(OBJECT(s), true, "realized", &err);
object_property_set_bool(OBJECT(&s->soc), true, "realized", &err);
if (err != NULL) { if (err != NULL) {
error_report("%s", error_get_pretty(err)); error_report("%s", error_get_pretty(err));
exit(1); exit(1);
} }
memory_region_allocate_system_memory(&s->ram, NULL, "sabrelite.ram",
machine->ram_size);
memory_region_add_subregion(get_system_memory(), FSL_IMX6_MMDC_ADDR, memory_region_add_subregion(get_system_memory(), FSL_IMX6_MMDC_ADDR,
&s->ram); machine->ram);
{ {
/* /*
@ -78,7 +70,7 @@ static void sabrelite_init(MachineState *machine)
/* Add the sst25vf016b NOR FLASH memory to first SPI */ /* Add the sst25vf016b NOR FLASH memory to first SPI */
Object *spi_dev; Object *spi_dev;
spi_dev = object_resolve_path_component(OBJECT(&s->soc), "spi1"); spi_dev = object_resolve_path_component(OBJECT(s), "spi1");
if (spi_dev) { if (spi_dev) {
SSIBus *spi_bus; SSIBus *spi_bus;
@ -109,7 +101,7 @@ static void sabrelite_init(MachineState *machine)
sabrelite_binfo.secondary_cpu_reset_hook = sabrelite_reset_secondary; sabrelite_binfo.secondary_cpu_reset_hook = sabrelite_reset_secondary;
if (!qtest_enabled()) { if (!qtest_enabled()) {
arm_load_kernel(&s->soc.cpu[0], machine, &sabrelite_binfo); arm_load_kernel(&s->cpu[0], machine, &sabrelite_binfo);
} }
} }
@ -119,6 +111,7 @@ static void sabrelite_machine_init(MachineClass *mc)
mc->init = sabrelite_init; mc->init = sabrelite_init;
mc->max_cpus = FSL_IMX6_NUM_CPUS; mc->max_cpus = FSL_IMX6_NUM_CPUS;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "sabrelite.ram";
} }
DEFINE_MACHINE("sabrelite", sabrelite_machine_init) DEFINE_MACHINE("sabrelite", sabrelite_machine_init)

View File

@ -593,7 +593,6 @@ static void sbsa_ref_init(MachineState *machine)
MachineClass *mc = MACHINE_GET_CLASS(machine); MachineClass *mc = MACHINE_GET_CLASS(machine);
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *secure_sysmem = g_new(MemoryRegion, 1); MemoryRegion *secure_sysmem = g_new(MemoryRegion, 1);
MemoryRegion *ram = g_new(MemoryRegion, 1);
bool firmware_loaded; bool firmware_loaded;
const CPUArchIdList *possible_cpus; const CPUArchIdList *possible_cpus;
int n, sbsa_max_cpus; int n, sbsa_max_cpus;
@ -685,9 +684,8 @@ static void sbsa_ref_init(MachineState *machine)
object_unref(cpuobj); object_unref(cpuobj);
} }
memory_region_allocate_system_memory(ram, NULL, "sbsa-ref.ram", memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base,
machine->ram_size); machine->ram);
memory_region_add_subregion(sysmem, sbsa_ref_memmap[SBSA_MEM].base, ram);
create_fdt(sms); create_fdt(sms);
@ -785,6 +783,7 @@ static void sbsa_ref_class_init(ObjectClass *oc, void *data)
mc->block_default_type = IF_IDE; mc->block_default_type = IF_IDE;
mc->no_cdrom = 1; mc->no_cdrom = 1;
mc->default_ram_size = 1 * GiB; mc->default_ram_size = 1 * GiB;
mc->default_ram_id = "sbsa-ref.ram";
mc->default_cpus = 4; mc->default_cpus = 4;
mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids; mc->possible_cpu_arch_ids = sbsa_ref_possible_cpu_arch_ids;
mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props; mc->cpu_index_to_instance_props = sbsa_ref_cpu_index_to_props;

View File

@ -184,7 +184,6 @@ static void versatile_init(MachineState *machine, int board_id)
Object *cpuobj; Object *cpuobj;
ARMCPU *cpu; ARMCPU *cpu;
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
qemu_irq pic[32]; qemu_irq pic[32];
qemu_irq sic[32]; qemu_irq sic[32];
DeviceState *dev, *sysctl; DeviceState *dev, *sysctl;
@ -220,11 +219,9 @@ static void versatile_init(MachineState *machine, int board_id)
cpu = ARM_CPU(cpuobj); cpu = ARM_CPU(cpuobj);
memory_region_allocate_system_memory(ram, NULL, "versatile.ram",
machine->ram_size);
/* ??? RAM should repeat to fill physical memory space. */ /* ??? RAM should repeat to fill physical memory space. */
/* SDRAM at address zero. */ /* SDRAM at address zero. */
memory_region_add_subregion(sysmem, 0, ram); memory_region_add_subregion(sysmem, 0, machine->ram);
sysctl = qdev_create(NULL, "realview_sysctl"); sysctl = qdev_create(NULL, "realview_sysctl");
qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004); qdev_prop_set_uint32(sysctl, "sys_id", 0x41007004);
@ -398,6 +395,7 @@ static void versatilepb_class_init(ObjectClass *oc, void *data)
mc->block_default_type = IF_SCSI; mc->block_default_type = IF_SCSI;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
mc->default_ram_id = "versatile.ram";
} }
static const TypeInfo versatilepb_type = { static const TypeInfo versatilepb_type = {
@ -415,6 +413,7 @@ static void versatileab_class_init(ObjectClass *oc, void *data)
mc->block_default_type = IF_SCSI; mc->block_default_type = IF_SCSI;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("arm926");
mc->default_ram_id = "versatile.ram";
} }
static const TypeInfo versatileab_type = { static const TypeInfo versatileab_type = {

View File

@ -273,7 +273,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
{ {
MachineState *machine = MACHINE(vms); MachineState *machine = MACHINE(vms);
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *lowram = g_new(MemoryRegion, 1); MemoryRegion *lowram = g_new(MemoryRegion, 1);
ram_addr_t low_ram_size; ram_addr_t low_ram_size;
@ -283,8 +282,6 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
exit(1); exit(1);
} }
memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
ram_size);
low_ram_size = ram_size; low_ram_size = ram_size;
if (low_ram_size > 0x4000000) { if (low_ram_size > 0x4000000) {
low_ram_size = 0x4000000; low_ram_size = 0x4000000;
@ -293,9 +290,10 @@ static void a9_daughterboard_init(const VexpressMachineState *vms,
* address space should in theory be remappable to various * address space should in theory be remappable to various
* things including ROM or RAM; we always map the RAM there. * things including ROM or RAM; we always map the RAM there.
*/ */
memory_region_init_alias(lowram, NULL, "vexpress.lowmem", ram, 0, low_ram_size); memory_region_init_alias(lowram, NULL, "vexpress.lowmem", machine->ram,
0, low_ram_size);
memory_region_add_subregion(sysmem, 0x0, lowram); memory_region_add_subregion(sysmem, 0x0, lowram);
memory_region_add_subregion(sysmem, 0x60000000, ram); memory_region_add_subregion(sysmem, 0x60000000, machine->ram);
/* 0x1e000000 A9MPCore (SCU) private memory region */ /* 0x1e000000 A9MPCore (SCU) private memory region */
init_cpus(machine, cpu_type, TYPE_A9MPCORE_PRIV, 0x1e000000, pic, init_cpus(machine, cpu_type, TYPE_A9MPCORE_PRIV, 0x1e000000, pic,
@ -360,7 +358,6 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
{ {
MachineState *machine = MACHINE(vms); MachineState *machine = MACHINE(vms);
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *sram = g_new(MemoryRegion, 1); MemoryRegion *sram = g_new(MemoryRegion, 1);
{ {
@ -375,10 +372,8 @@ static void a15_daughterboard_init(const VexpressMachineState *vms,
} }
} }
memory_region_allocate_system_memory(ram, NULL, "vexpress.highmem",
ram_size);
/* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */ /* RAM is from 0x80000000 upwards; there is no low-memory alias for it. */
memory_region_add_subregion(sysmem, 0x80000000, ram); memory_region_add_subregion(sysmem, 0x80000000, machine->ram);
/* 0x2c000000 A15MPCore private memory region (GIC) */ /* 0x2c000000 A15MPCore private memory region (GIC) */
init_cpus(machine, cpu_type, TYPE_A15MPCORE_PRIV, init_cpus(machine, cpu_type, TYPE_A15MPCORE_PRIV,
@ -795,6 +790,7 @@ static void vexpress_class_init(ObjectClass *oc, void *data)
mc->init = vexpress_common_init; mc->init = vexpress_common_init;
mc->max_cpus = 4; mc->max_cpus = 4;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_ram_id = "vexpress.highmem";
} }
static void vexpress_a9_class_init(ObjectClass *oc, void *data) static void vexpress_a9_class_init(ObjectClass *oc, void *data)

View File

@ -1512,7 +1512,6 @@ static void machvirt_init(MachineState *machine)
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *secure_sysmem = NULL; MemoryRegion *secure_sysmem = NULL;
int n, virt_max_cpus; int n, virt_max_cpus;
MemoryRegion *ram = g_new(MemoryRegion, 1);
bool firmware_loaded; bool firmware_loaded;
bool aarch64 = true; bool aarch64 = true;
bool has_ged = !vmc->no_ged; bool has_ged = !vmc->no_ged;
@ -1706,9 +1705,8 @@ static void machvirt_init(MachineState *machine)
} }
} }
memory_region_allocate_system_memory(ram, NULL, "mach-virt.ram", memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base,
machine->ram_size); machine->ram);
memory_region_add_subregion(sysmem, vms->memmap[VIRT_MEM].base, ram);
if (machine->device_memory) { if (machine->device_memory) {
memory_region_add_subregion(sysmem, machine->device_memory->base, memory_region_add_subregion(sysmem, machine->device_memory->base,
&machine->device_memory->mr); &machine->device_memory->mr);
@ -2058,6 +2056,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
hc->unplug_request = virt_machine_device_unplug_request_cb; hc->unplug_request = virt_machine_device_unplug_request_cb;
mc->numa_mem_supported = true; mc->numa_mem_supported = true;
mc->auto_enable_numa_with_memhp = true; mc->auto_enable_numa_with_memhp = true;
mc->default_ram_id = "mach-virt.ram";
} }
static void virt_instance_init(Object *obj) static void virt_instance_init(Object *obj)

View File

@ -158,16 +158,20 @@ static inline void zynq_init_spi_flashes(uint32_t base_addr, qemu_irq irq,
static void zynq_init(MachineState *machine) static void zynq_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size;
ARMCPU *cpu; ARMCPU *cpu;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ext_ram = g_new(MemoryRegion, 1);
MemoryRegion *ocm_ram = g_new(MemoryRegion, 1); MemoryRegion *ocm_ram = g_new(MemoryRegion, 1);
DeviceState *dev; DeviceState *dev;
SysBusDevice *busdev; SysBusDevice *busdev;
qemu_irq pic[64]; qemu_irq pic[64];
int n; int n;
/* max 2GB ram */
if (machine->ram_size > 2 * GiB) {
error_report("RAM size more than 2 GiB is not supported");
exit(EXIT_FAILURE);
}
cpu = ARM_CPU(object_new(machine->cpu_type)); cpu = ARM_CPU(object_new(machine->cpu_type));
/* By default A9 CPUs have EL3 enabled. This board does not /* By default A9 CPUs have EL3 enabled. This board does not
@ -184,15 +188,8 @@ static void zynq_init(MachineState *machine)
&error_fatal); &error_fatal);
object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal); object_property_set_bool(OBJECT(cpu), true, "realized", &error_fatal);
/* max 2GB ram */
if (ram_size > 0x80000000) {
ram_size = 0x80000000;
}
/* DDR remapped to address zero. */ /* DDR remapped to address zero. */
memory_region_allocate_system_memory(ext_ram, NULL, "zynq.ext_ram", memory_region_add_subregion(address_space_mem, 0, machine->ram);
ram_size);
memory_region_add_subregion(address_space_mem, 0, ext_ram);
/* 256K of on-chip memory */ /* 256K of on-chip memory */
memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB, memory_region_init_ram(ocm_ram, NULL, "zynq.ocm_ram", 256 * KiB,
@ -300,7 +297,7 @@ static void zynq_init(MachineState *machine)
sysbus_connect_irq(busdev, 0, pic[40 - IRQ_OFFSET]); sysbus_connect_irq(busdev, 0, pic[40 - IRQ_OFFSET]);
sysbus_mmio_map(busdev, 0, 0xF8007000); sysbus_mmio_map(busdev, 0, 0xF8007000);
zynq_binfo.ram_size = ram_size; zynq_binfo.ram_size = machine->ram_size;
zynq_binfo.nb_cpus = 1; zynq_binfo.nb_cpus = 1;
zynq_binfo.board_id = 0xd32; zynq_binfo.board_id = 0xd32;
zynq_binfo.loader_start = 0; zynq_binfo.loader_start = 0;
@ -318,6 +315,7 @@ static void zynq_machine_init(MachineClass *mc)
mc->no_sdcard = 1; mc->no_sdcard = 1;
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9"); mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
mc->default_ram_id = "zynq.ext_ram";
} }
DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init) DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init)

View File

@ -30,7 +30,6 @@ typedef struct VersalVirt {
MachineState parent_obj; MachineState parent_obj;
Versal soc; Versal soc;
MemoryRegion mr_ddr;
void *fdt; void *fdt;
int fdt_size; int fdt_size;
@ -414,12 +413,9 @@ static void versal_virt_init(MachineState *machine)
psci_conduit = QEMU_PSCI_CONDUIT_SMC; psci_conduit = QEMU_PSCI_CONDUIT_SMC;
} }
memory_region_allocate_system_memory(&s->mr_ddr, NULL, "ddr",
machine->ram_size);
sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc, sysbus_init_child_obj(OBJECT(machine), "xlnx-ve", &s->soc,
sizeof(s->soc), TYPE_XLNX_VERSAL); sizeof(s->soc), TYPE_XLNX_VERSAL);
object_property_set_link(OBJECT(&s->soc), OBJECT(&s->mr_ddr), object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
"ddr", &error_abort); "ddr", &error_abort);
object_property_set_int(OBJECT(&s->soc), psci_conduit, object_property_set_int(OBJECT(&s->soc), psci_conduit,
"psci-conduit", &error_abort); "psci-conduit", &error_abort);
@ -473,6 +469,7 @@ static void versal_virt_machine_class_init(ObjectClass *oc, void *data)
mc->max_cpus = XLNX_VERSAL_NR_ACPUS; mc->max_cpus = XLNX_VERSAL_NR_ACPUS;
mc->default_cpus = XLNX_VERSAL_NR_ACPUS; mc->default_cpus = XLNX_VERSAL_NR_ACPUS;
mc->no_cdrom = true; mc->no_cdrom = true;
mc->default_ram_id = "ddr";
} }
static const TypeInfo versal_virt_machine_init_typeinfo = { static const TypeInfo versal_virt_machine_init_typeinfo = {

View File

@ -28,7 +28,6 @@ typedef struct XlnxZCU102 {
MachineState parent_obj; MachineState parent_obj;
XlnxZynqMPState soc; XlnxZynqMPState soc;
MemoryRegion ddr_ram;
bool secure; bool secure;
bool virt; bool virt;
@ -87,13 +86,10 @@ static void xlnx_zcu102_init(MachineState *machine)
ram_size); ram_size);
} }
memory_region_allocate_system_memory(&s->ddr_ram, NULL, "ddr-ram",
ram_size);
object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc), object_initialize_child(OBJECT(machine), "soc", &s->soc, sizeof(s->soc),
TYPE_XLNX_ZYNQMP, &error_abort, NULL); TYPE_XLNX_ZYNQMP, &error_abort, NULL);
object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram), object_property_set_link(OBJECT(&s->soc), OBJECT(machine->ram),
"ddr-ram", &error_abort); "ddr-ram", &error_abort);
object_property_set_bool(OBJECT(&s->soc), s->secure, "secure", object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
&error_fatal); &error_fatal);
@ -211,6 +207,7 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
mc->ignore_memory_transaction_failures = true; mc->ignore_memory_transaction_failures = true;
mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS; mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
mc->default_ram_id = "ddr-ram";
} }
static const TypeInfo xlnx_zcu102_machine_init_typeinfo = { static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {

View File

@ -26,6 +26,7 @@
#include "sysemu/qtest.h" #include "sysemu/qtest.h"
#include "hw/pci/pci.h" #include "hw/pci/pci.h"
#include "hw/mem/nvdimm.h" #include "hw/mem/nvdimm.h"
#include "migration/vmstate.h"
GlobalProperty hw_compat_4_2[] = { GlobalProperty hw_compat_4_2[] = {
{ "virtio-blk-device", "queue-size", "128"}, { "virtio-blk-device", "queue-size", "128"},
@ -510,6 +511,22 @@ static void validate_sysbus_device(SysBusDevice *sbdev, void *opaque)
} }
} }
static char *machine_get_memdev(Object *obj, Error **errp)
{
MachineState *ms = MACHINE(obj);
return g_strdup(ms->ram_memdev_id);
}
static void machine_set_memdev(Object *obj, const char *value, Error **errp)
{
MachineState *ms = MACHINE(obj);
g_free(ms->ram_memdev_id);
ms->ram_memdev_id = g_strdup(value);
}
static void machine_init_notify(Notifier *notifier, void *data) static void machine_init_notify(Notifier *notifier, void *data)
{ {
MachineState *machine = MACHINE(qdev_get_machine()); MachineState *machine = MACHINE(qdev_get_machine());
@ -891,6 +908,14 @@ static void machine_initfn(Object *obj)
"Table (HMAT)", NULL); "Table (HMAT)", NULL);
} }
object_property_add_str(obj, "memory-backend",
machine_get_memdev, machine_set_memdev,
&error_abort);
object_property_set_description(obj, "memory-backend",
"Set RAM backend"
"Valid value is ID of hostmem based backend",
&error_abort);
/* Register notifier when init is done for sysbus sanity checks */ /* Register notifier when init is done for sysbus sanity checks */
ms->sysbus_notifier.notify = machine_init_notify; ms->sysbus_notifier.notify = machine_init_notify;
qemu_add_machine_init_done_notifier(&ms->sysbus_notifier); qemu_add_machine_init_done_notifier(&ms->sysbus_notifier);
@ -1037,10 +1062,33 @@ static void machine_numa_finish_cpu_init(MachineState *machine)
g_string_free(s, true); g_string_free(s, true);
} }
MemoryRegion *machine_consume_memdev(MachineState *machine,
HostMemoryBackend *backend)
{
MemoryRegion *ret = host_memory_backend_get_memory(backend);
if (memory_region_is_mapped(ret)) {
char *path = object_get_canonical_path_component(OBJECT(backend));
error_report("memory backend %s can't be used multiple times.", path);
g_free(path);
exit(EXIT_FAILURE);
}
host_memory_backend_set_mapped(backend, true);
vmstate_register_ram_global(ret);
return ret;
}
void machine_run_board_init(MachineState *machine) void machine_run_board_init(MachineState *machine)
{ {
MachineClass *machine_class = MACHINE_GET_CLASS(machine); MachineClass *machine_class = MACHINE_GET_CLASS(machine);
if (machine->ram_memdev_id) {
Object *o;
o = object_resolve_path_type(machine->ram_memdev_id,
TYPE_MEMORY_BACKEND, NULL);
machine->ram = machine_consume_memdev(machine, MEMORY_BACKEND(o));
}
if (machine->numa_state) { if (machine->numa_state) {
numa_complete_configuration(machine); numa_complete_configuration(machine);
if (machine->numa_state->num_nodes) { if (machine->numa_state->num_nodes) {

View File

@ -32,11 +32,8 @@ static void machine_none_init(MachineState *mch)
} }
/* RAM at address zero */ /* RAM at address zero */
if (mch->ram_size) { if (mch->ram) {
MemoryRegion *ram = g_new(MemoryRegion, 1); memory_region_add_subregion(get_system_memory(), 0, mch->ram);
memory_region_allocate_system_memory(ram, NULL, "ram", mch->ram_size);
memory_region_add_subregion(get_system_memory(), 0, ram);
} }
if (mch->kernel_filename) { if (mch->kernel_filename) {
@ -52,6 +49,7 @@ static void machine_none_machine_init(MachineClass *mc)
mc->init = machine_none_init; mc->init = machine_none_init;
mc->max_cpus = 1; mc->max_cpus = 1;
mc->default_ram_size = 0; mc->default_ram_size = 0;
mc->default_ram_id = "ram";
} }
DEFINE_MACHINE("none", machine_none_machine_init) DEFINE_MACHINE("none", machine_none_machine_init)

View File

@ -52,6 +52,11 @@ QemuOptsList qemu_numa_opts = {
}; };
static int have_memdevs; static int have_memdevs;
bool numa_uses_legacy_mem(void)
{
return !have_memdevs;
}
static int have_mem; static int have_mem;
static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one. static int max_numa_nodeid; /* Highest specified NUMA node ID, plus one.
* For all nodes, nodeid < max_numa_nodeid * For all nodes, nodeid < max_numa_nodeid
@ -652,6 +657,23 @@ void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
nodes[i].node_mem = size - usedmem; nodes[i].node_mem = size - usedmem;
} }
static void numa_init_memdev_container(MachineState *ms, MemoryRegion *ram)
{
int i;
uint64_t addr = 0;
for (i = 0; i < ms->numa_state->num_nodes; i++) {
uint64_t size = ms->numa_state->nodes[i].node_mem;
HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev;
if (!backend) {
continue;
}
MemoryRegion *seg = machine_consume_memdev(ms, backend);
memory_region_add_subregion(ram, addr, seg);
addr += size;
}
}
void numa_complete_configuration(MachineState *ms) void numa_complete_configuration(MachineState *ms)
{ {
int i; int i;
@ -734,6 +756,12 @@ void numa_complete_configuration(MachineState *ms)
exit(1); exit(1);
} }
if (!numa_uses_legacy_mem() && mc->default_ram_id) {
ms->ram = g_new(MemoryRegion, 1);
memory_region_init(ms->ram, OBJECT(ms), mc->default_ram_id,
ram_size);
numa_init_memdev_container(ms, ms->ram);
}
/* QEMU needs at least all unique node pair distances to build /* QEMU needs at least all unique node pair distances to build
* the whole NUMA distance table. QEMU treats the distance table * the whole NUMA distance table. QEMU treats the distance table
* as symmetric by default, i.e. distance A->B == distance B->A. * as symmetric by default, i.e. distance A->B == distance B->A.
@ -778,79 +806,6 @@ void numa_cpu_pre_plug(const CPUArchId *slot, DeviceState *dev, Error **errp)
} }
} }
static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
const char *name,
uint64_t ram_size)
{
if (mem_path) {
#ifdef __linux__
Error *err = NULL;
memory_region_init_ram_from_file(mr, owner, name, ram_size, 0, 0,
mem_path, &err);
if (err) {
error_report_err(err);
if (mem_prealloc) {
exit(1);
}
warn_report("falling back to regular RAM allocation");
error_printf("This is deprecated. Make sure that -mem-path "
" specified path has sufficient resources to allocate"
" -m specified RAM amount\n");
/* Legacy behavior: if allocation failed, fall back to
* regular RAM allocation.
*/
mem_path = NULL;
memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);
}
#else
fprintf(stderr, "-mem-path not supported on this host\n");
exit(1);
#endif
} else {
memory_region_init_ram_nomigrate(mr, owner, name, ram_size, &error_fatal);
}
vmstate_register_ram_global(mr);
}
void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
const char *name,
uint64_t ram_size)
{
uint64_t addr = 0;
int i;
MachineState *ms = MACHINE(qdev_get_machine());
if (ms->numa_state == NULL ||
ms->numa_state->num_nodes == 0 || !have_memdevs) {
allocate_system_memory_nonnuma(mr, owner, name, ram_size);
return;
}
memory_region_init(mr, owner, name, ram_size);
for (i = 0; i < ms->numa_state->num_nodes; i++) {
uint64_t size = ms->numa_state->nodes[i].node_mem;
HostMemoryBackend *backend = ms->numa_state->nodes[i].node_memdev;
if (!backend) {
continue;
}
MemoryRegion *seg = host_memory_backend_get_memory(backend);
if (memory_region_is_mapped(seg)) {
char *path = object_get_canonical_path_component(OBJECT(backend));
error_report("memory backend %s is used multiple times. Each "
"-numa option must use a different memdev value.",
path);
g_free(path);
exit(1);
}
host_memory_backend_set_mapped(backend, true);
memory_region_add_subregion(mr, addr, seg);
vmstate_register_ram_global(seg);
addr += size;
}
}
static void numa_stat_memory_devices(NumaNodeMem node_mem[]) static void numa_stat_memory_devices(NumaNodeMem node_mem[])
{ {
MemoryDeviceInfoList *info_list = qmp_memory_device_list(); MemoryDeviceInfoList *info_list = qmp_memory_device_list();

View File

@ -249,7 +249,6 @@ static struct cris_load_info li;
static static
void axisdev88_init(MachineState *machine) void axisdev88_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
CRISCPU *cpu; CRISCPU *cpu;
@ -261,16 +260,12 @@ void axisdev88_init(MachineState *machine)
struct etraxfs_dma_client *dma_eth; struct etraxfs_dma_client *dma_eth;
int i; int i;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
MemoryRegion *phys_intmem = g_new(MemoryRegion, 1); MemoryRegion *phys_intmem = g_new(MemoryRegion, 1);
/* init CPUs */ /* init CPUs */
cpu = CRIS_CPU(cpu_create(machine->cpu_type)); cpu = CRIS_CPU(cpu_create(machine->cpu_type));
/* allocate RAM */ memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
memory_region_allocate_system_memory(phys_ram, NULL, "axisdev88.ram",
ram_size);
memory_region_add_subregion(address_space_mem, 0x40000000, phys_ram);
/* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the /* The ETRAX-FS has 128Kb on chip ram, the docs refer to it as the
internal memory. */ internal memory. */
@ -351,6 +346,7 @@ static void axisdev88_machine_init(MachineClass *mc)
mc->init = axisdev88_init; mc->init = axisdev88_init;
mc->is_default = 1; mc->is_default = 1;
mc->default_cpu_type = CRIS_CPU_TYPE_NAME("crisv32"); mc->default_cpu_type = CRIS_CPU_TYPE_NAME("crisv32");
mc->default_ram_id = "axisdev88.ram";
} }
DEFINE_MACHINE("axis-dev88", axisdev88_machine_init) DEFINE_MACHINE("axis-dev88", axisdev88_machine_init)

View File

@ -71,14 +71,11 @@ static void machine_hppa_init(MachineState *machine)
uint64_t kernel_entry = 0, kernel_low, kernel_high; uint64_t kernel_entry = 0, kernel_low, kernel_high;
MemoryRegion *addr_space = get_system_memory(); MemoryRegion *addr_space = get_system_memory();
MemoryRegion *rom_region; MemoryRegion *rom_region;
MemoryRegion *ram_region;
MemoryRegion *cpu_region; MemoryRegion *cpu_region;
long i; long i;
unsigned int smp_cpus = machine->smp.cpus; unsigned int smp_cpus = machine->smp.cpus;
SysBusDevice *s; SysBusDevice *s;
ram_size = machine->ram_size;
/* Create CPUs. */ /* Create CPUs. */
for (i = 0; i < smp_cpus; i++) { for (i = 0; i < smp_cpus; i++) {
char *name = g_strdup_printf("cpu%ld-io-eir", i); char *name = g_strdup_printf("cpu%ld-io-eir", i);
@ -97,10 +94,8 @@ static void machine_hppa_init(MachineState *machine)
error_report("RAM size is currently restricted to 3GB"); error_report("RAM size is currently restricted to 3GB");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
ram_region = g_new(MemoryRegion, 1); memory_region_add_subregion_overlap(addr_space, 0, machine->ram, -1);
memory_region_allocate_system_memory(ram_region, OBJECT(machine),
"ram", ram_size);
memory_region_add_subregion_overlap(addr_space, 0, ram_region, -1);
/* Init Lasi chip */ /* Init Lasi chip */
lasi_init(addr_space); lasi_init(addr_space);
@ -298,6 +293,7 @@ static void machine_hppa_machine_init(MachineClass *mc)
mc->is_default = 1; mc->is_default = 1;
mc->default_ram_size = 512 * MiB; mc->default_ram_size = 512 * MiB;
mc->default_boot_order = "cd"; mc->default_boot_order = "cd";
mc->default_ram_id = "ram";
} }
DEFINE_MACHINE("hppa", machine_hppa_machine_init) DEFINE_MACHINE("hppa", machine_hppa_machine_init)

View File

@ -167,7 +167,7 @@ static void microvm_memory_init(MicrovmMachineState *mms)
{ {
MachineState *machine = MACHINE(mms); MachineState *machine = MACHINE(mms);
X86MachineState *x86ms = X86_MACHINE(mms); X86MachineState *x86ms = X86_MACHINE(mms);
MemoryRegion *ram, *ram_below_4g, *ram_above_4g; MemoryRegion *ram_below_4g, *ram_above_4g;
MemoryRegion *system_memory = get_system_memory(); MemoryRegion *system_memory = get_system_memory();
FWCfgState *fw_cfg; FWCfgState *fw_cfg;
ram_addr_t lowmem; ram_addr_t lowmem;
@ -214,12 +214,8 @@ static void microvm_memory_init(MicrovmMachineState *mms)
x86ms->below_4g_mem_size = machine->ram_size; x86ms->below_4g_mem_size = machine->ram_size;
} }
ram = g_malloc(sizeof(*ram));
memory_region_allocate_system_memory(ram, NULL, "microvm.ram",
machine->ram_size);
ram_below_4g = g_malloc(sizeof(*ram_below_4g)); ram_below_4g = g_malloc(sizeof(*ram_below_4g));
memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram, memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
0, x86ms->below_4g_mem_size); 0, x86ms->below_4g_mem_size);
memory_region_add_subregion(system_memory, 0, ram_below_4g); memory_region_add_subregion(system_memory, 0, ram_below_4g);
@ -227,7 +223,8 @@ static void microvm_memory_init(MicrovmMachineState *mms)
if (x86ms->above_4g_mem_size > 0) { if (x86ms->above_4g_mem_size > 0) {
ram_above_4g = g_malloc(sizeof(*ram_above_4g)); ram_above_4g = g_malloc(sizeof(*ram_above_4g));
memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram, memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
machine->ram,
x86ms->below_4g_mem_size, x86ms->below_4g_mem_size,
x86ms->above_4g_mem_size); x86ms->above_4g_mem_size);
memory_region_add_subregion(system_memory, 0x100000000ULL, memory_region_add_subregion(system_memory, 0x100000000ULL,
@ -502,6 +499,7 @@ static void microvm_class_init(ObjectClass *oc, void *data)
mc->auto_enable_numa_with_memhp = false; mc->auto_enable_numa_with_memhp = false;
mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE; mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
mc->nvdimm_supported = false; mc->nvdimm_supported = false;
mc->default_ram_id = "microvm.ram";
/* Avoid relying too much on kernel components */ /* Avoid relying too much on kernel components */
mc->default_kernel_irqchip_split = true; mc->default_kernel_irqchip_split = true;

View File

@ -937,7 +937,7 @@ void pc_memory_init(PCMachineState *pcms,
MemoryRegion **ram_memory) MemoryRegion **ram_memory)
{ {
int linux_boot, i; int linux_boot, i;
MemoryRegion *ram, *option_rom_mr; MemoryRegion *option_rom_mr;
MemoryRegion *ram_below_4g, *ram_above_4g; MemoryRegion *ram_below_4g, *ram_above_4g;
FWCfgState *fw_cfg; FWCfgState *fw_cfg;
MachineState *machine = MACHINE(pcms); MachineState *machine = MACHINE(pcms);
@ -950,22 +950,20 @@ void pc_memory_init(PCMachineState *pcms,
linux_boot = (machine->kernel_filename != NULL); linux_boot = (machine->kernel_filename != NULL);
/* Allocate RAM. We allocate it as a single memory region and use /*
* aliases to address portions of it, mostly for backwards compatibility * Split single memory region and use aliases to address portions of it,
* with older qemus that used qemu_ram_alloc(). * done for backwards compatibility with older qemus.
*/ */
ram = g_malloc(sizeof(*ram)); *ram_memory = machine->ram;
memory_region_allocate_system_memory(ram, NULL, "pc.ram",
machine->ram_size);
*ram_memory = ram;
ram_below_4g = g_malloc(sizeof(*ram_below_4g)); ram_below_4g = g_malloc(sizeof(*ram_below_4g));
memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", ram, memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram,
0, x86ms->below_4g_mem_size); 0, x86ms->below_4g_mem_size);
memory_region_add_subregion(system_memory, 0, ram_below_4g); memory_region_add_subregion(system_memory, 0, ram_below_4g);
e820_add_entry(0, x86ms->below_4g_mem_size, E820_RAM); e820_add_entry(0, x86ms->below_4g_mem_size, E820_RAM);
if (x86ms->above_4g_mem_size > 0) { if (x86ms->above_4g_mem_size > 0) {
ram_above_4g = g_malloc(sizeof(*ram_above_4g)); ram_above_4g = g_malloc(sizeof(*ram_above_4g));
memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g", ram, memory_region_init_alias(ram_above_4g, NULL, "ram-above-4g",
machine->ram,
x86ms->below_4g_mem_size, x86ms->below_4g_mem_size,
x86ms->above_4g_mem_size); x86ms->above_4g_mem_size);
memory_region_add_subregion(system_memory, 0x100000000ULL, memory_region_add_subregion(system_memory, 0x100000000ULL,
@ -1952,6 +1950,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE; mc->default_cpu_type = TARGET_DEFAULT_CPU_TYPE;
mc->nvdimm_supported = true; mc->nvdimm_supported = true;
mc->numa_mem_supported = true; mc->numa_mem_supported = true;
mc->default_ram_id = "pc.ram";
object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int", object_class_property_add(oc, PC_MACHINE_DEVMEM_REGION_SIZE, "int",
pc_machine_get_device_memory_region_size, NULL, pc_machine_get_device_memory_region_size, NULL,

View File

@ -19,6 +19,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/cutils.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "cpu.h" #include "cpu.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
@ -75,22 +76,28 @@ static void main_cpu_reset(void *opaque)
static void lm32_evr_init(MachineState *machine) static void lm32_evr_init(MachineState *machine)
{ {
MachineClass *mc = MACHINE_GET_CLASS(machine);
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
LM32CPU *cpu; LM32CPU *cpu;
CPULM32State *env; CPULM32State *env;
DriveInfo *dinfo; DriveInfo *dinfo;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
qemu_irq irq[32]; qemu_irq irq[32];
ResetInfo *reset_info; ResetInfo *reset_info;
int i; int i;
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
/* memory map */ /* memory map */
hwaddr flash_base = 0x04000000; hwaddr flash_base = 0x04000000;
size_t flash_sector_size = 256 * KiB; size_t flash_sector_size = 256 * KiB;
size_t flash_size = 32 * MiB; size_t flash_size = 32 * MiB;
hwaddr ram_base = 0x08000000; hwaddr ram_base = 0x08000000;
size_t ram_size = 64 * MiB;
hwaddr timer0_base = 0x80002000; hwaddr timer0_base = 0x80002000;
hwaddr uart0_base = 0x80006000; hwaddr uart0_base = 0x80006000;
hwaddr timer1_base = 0x8000a000; hwaddr timer1_base = 0x8000a000;
@ -107,9 +114,7 @@ static void lm32_evr_init(MachineState *machine)
reset_info->flash_base = flash_base; reset_info->flash_base = flash_base;
memory_region_allocate_system_memory(phys_ram, NULL, "lm32_evr.sdram", memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
ram_size);
memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
dinfo = drive_get(IF_PFLASH, 0, 0); dinfo = drive_get(IF_PFLASH, 0, 0);
/* Spansion S29NS128P */ /* Spansion S29NS128P */
@ -144,7 +149,7 @@ static void lm32_evr_init(MachineState *machine)
if (kernel_size < 0) { if (kernel_size < 0) {
kernel_size = load_image_targphys(kernel_filename, ram_base, kernel_size = load_image_targphys(kernel_filename, ram_base,
ram_size); machine->ram_size);
reset_info->bootstrap_pc = ram_base; reset_info->bootstrap_pc = ram_base;
} }
@ -159,6 +164,7 @@ static void lm32_evr_init(MachineState *machine)
static void lm32_uclinux_init(MachineState *machine) static void lm32_uclinux_init(MachineState *machine)
{ {
MachineClass *mc = MACHINE_GET_CLASS(machine);
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
@ -166,18 +172,23 @@ static void lm32_uclinux_init(MachineState *machine)
CPULM32State *env; CPULM32State *env;
DriveInfo *dinfo; DriveInfo *dinfo;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
qemu_irq irq[32]; qemu_irq irq[32];
HWSetup *hw; HWSetup *hw;
ResetInfo *reset_info; ResetInfo *reset_info;
int i; int i;
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
/* memory map */ /* memory map */
hwaddr flash_base = 0x04000000; hwaddr flash_base = 0x04000000;
size_t flash_sector_size = 256 * KiB; size_t flash_sector_size = 256 * KiB;
size_t flash_size = 32 * MiB; size_t flash_size = 32 * MiB;
hwaddr ram_base = 0x08000000; hwaddr ram_base = 0x08000000;
size_t ram_size = 64 * MiB;
hwaddr uart0_base = 0x80000000; hwaddr uart0_base = 0x80000000;
hwaddr timer0_base = 0x80002000; hwaddr timer0_base = 0x80002000;
hwaddr timer1_base = 0x80010000; hwaddr timer1_base = 0x80010000;
@ -200,9 +211,7 @@ static void lm32_uclinux_init(MachineState *machine)
reset_info->flash_base = flash_base; reset_info->flash_base = flash_base;
memory_region_allocate_system_memory(phys_ram, NULL, memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
"lm32_uclinux.sdram", ram_size);
memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
dinfo = drive_get(IF_PFLASH, 0, 0); dinfo = drive_get(IF_PFLASH, 0, 0);
/* Spansion S29NS128P */ /* Spansion S29NS128P */
@ -238,7 +247,7 @@ static void lm32_uclinux_init(MachineState *machine)
if (kernel_size < 0) { if (kernel_size < 0) {
kernel_size = load_image_targphys(kernel_filename, ram_base, kernel_size = load_image_targphys(kernel_filename, ram_base,
ram_size); machine->ram_size);
reset_info->bootstrap_pc = ram_base; reset_info->bootstrap_pc = ram_base;
} }
@ -252,7 +261,7 @@ static void lm32_uclinux_init(MachineState *machine)
hw = hwsetup_init(); hw = hwsetup_init();
hwsetup_add_cpu(hw, "LM32", 75000000); hwsetup_add_cpu(hw, "LM32", 75000000);
hwsetup_add_flash(hw, "flash", flash_base, flash_size); hwsetup_add_flash(hw, "flash", flash_base, flash_size);
hwsetup_add_ddr_sdram(hw, "ddr_sdram", ram_base, ram_size); hwsetup_add_ddr_sdram(hw, "ddr_sdram", ram_base, machine->ram_size);
hwsetup_add_timer(hw, "timer0", timer0_base, timer0_irq); hwsetup_add_timer(hw, "timer0", timer0_base, timer0_irq);
hwsetup_add_timer(hw, "timer1_dev_only", timer1_base, timer1_irq); hwsetup_add_timer(hw, "timer1_dev_only", timer1_base, timer1_irq);
hwsetup_add_timer(hw, "timer2_dev_only", timer2_base, timer2_irq); hwsetup_add_timer(hw, "timer2_dev_only", timer2_base, timer2_irq);
@ -288,6 +297,8 @@ static void lm32_evr_class_init(ObjectClass *oc, void *data)
mc->init = lm32_evr_init; mc->init = lm32_evr_init;
mc->is_default = 1; mc->is_default = 1;
mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full"); mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
mc->default_ram_size = 64 * MiB;
mc->default_ram_id = "lm32_evr.sdram";
} }
static const TypeInfo lm32_evr_type = { static const TypeInfo lm32_evr_type = {
@ -304,6 +315,8 @@ static void lm32_uclinux_class_init(ObjectClass *oc, void *data)
mc->init = lm32_uclinux_init; mc->init = lm32_uclinux_init;
mc->is_default = 0; mc->is_default = 0;
mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full"); mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
mc->default_ram_size = 64 * MiB;
mc->default_ram_id = "lm32_uclinux.sdram";
} }
static const TypeInfo lm32_uclinux_type = { static const TypeInfo lm32_uclinux_type = {

View File

@ -36,6 +36,7 @@
#include "hw/display/milkymist_tmu2.h" #include "hw/display/milkymist_tmu2.h"
#include "lm32.h" #include "lm32.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "qemu/cutils.h"
#define BIOS_FILENAME "mmone-bios.bin" #define BIOS_FILENAME "mmone-bios.bin"
#define BIOS_OFFSET 0x00860000 #define BIOS_OFFSET 0x00860000
@ -82,6 +83,7 @@ static void main_cpu_reset(void *opaque)
static void static void
milkymist_init(MachineState *machine) milkymist_init(MachineState *machine)
{ {
MachineClass *mc = MACHINE_GET_CLASS(machine);
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
@ -90,22 +92,27 @@ milkymist_init(MachineState *machine)
int kernel_size; int kernel_size;
DriveInfo *dinfo; DriveInfo *dinfo;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *phys_sdram = g_new(MemoryRegion, 1);
qemu_irq irq[32]; qemu_irq irq[32];
int i; int i;
char *bios_filename; char *bios_filename;
ResetInfo *reset_info; ResetInfo *reset_info;
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
/* memory map */ /* memory map */
hwaddr flash_base = 0x00000000; hwaddr flash_base = 0x00000000;
size_t flash_sector_size = 128 * KiB; size_t flash_sector_size = 128 * KiB;
size_t flash_size = 32 * MiB; size_t flash_size = 32 * MiB;
hwaddr sdram_base = 0x40000000; hwaddr sdram_base = 0x40000000;
size_t sdram_size = 128 * MiB;
hwaddr initrd_base = sdram_base + 0x1002000; hwaddr initrd_base = sdram_base + 0x1002000;
hwaddr cmdline_base = sdram_base + 0x1000000; hwaddr cmdline_base = sdram_base + 0x1000000;
size_t initrd_max = sdram_size - 0x1002000; size_t initrd_max = machine->ram_size - 0x1002000;
reset_info = g_malloc0(sizeof(ResetInfo)); reset_info = g_malloc0(sizeof(ResetInfo));
@ -116,9 +123,7 @@ milkymist_init(MachineState *machine)
cpu_lm32_set_phys_msb_ignore(env, 1); cpu_lm32_set_phys_msb_ignore(env, 1);
memory_region_allocate_system_memory(phys_sdram, NULL, "milkymist.sdram", memory_region_add_subregion(address_space_mem, sdram_base, machine->ram);
sdram_size);
memory_region_add_subregion(address_space_mem, sdram_base, phys_sdram);
dinfo = drive_get(IF_PFLASH, 0, 0); dinfo = drive_get(IF_PFLASH, 0, 0);
/* Numonyx JS28F256J3F105 */ /* Numonyx JS28F256J3F105 */
@ -183,7 +188,7 @@ milkymist_init(MachineState *machine)
if (kernel_size < 0) { if (kernel_size < 0) {
kernel_size = load_image_targphys(kernel_filename, sdram_base, kernel_size = load_image_targphys(kernel_filename, sdram_base,
sdram_size); machine->ram_size);
reset_info->bootstrap_pc = sdram_base; reset_info->bootstrap_pc = sdram_base;
} }
@ -216,6 +221,8 @@ static void milkymist_machine_init(MachineClass *mc)
mc->init = milkymist_init; mc->init = milkymist_init;
mc->is_default = 0; mc->is_default = 0;
mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full"); mc->default_cpu_type = LM32_CPU_TYPE_NAME("lm32-full");
mc->default_ram_size = 128 * MiB;
mc->default_ram_id = "milkymist.sdram";
} }
DEFINE_MACHINE("milkymist", milkymist_machine_init) DEFINE_MACHINE("milkymist", milkymist_machine_init)

View File

@ -33,7 +33,6 @@ static void an5206_init(MachineState *machine)
uint64_t elf_entry; uint64_t elf_entry;
hwaddr entry; hwaddr entry;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *sram = g_new(MemoryRegion, 1); MemoryRegion *sram = g_new(MemoryRegion, 1);
cpu = M68K_CPU(cpu_create(machine->cpu_type)); cpu = M68K_CPU(cpu_create(machine->cpu_type));
@ -46,8 +45,7 @@ static void an5206_init(MachineState *machine)
env->rambar0 = AN5206_RAMBAR_ADDR | 1; env->rambar0 = AN5206_RAMBAR_ADDR | 1;
/* DRAM at address zero */ /* DRAM at address zero */
memory_region_allocate_system_memory(ram, NULL, "an5206.ram", ram_size); memory_region_add_subregion(address_space_mem, 0, machine->ram);
memory_region_add_subregion(address_space_mem, 0, ram);
/* Internal SRAM. */ /* Internal SRAM. */
memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal); memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
@ -89,6 +87,7 @@ static void an5206_machine_init(MachineClass *mc)
mc->desc = "Arnewsh 5206"; mc->desc = "Arnewsh 5206";
mc->init = an5206_init; mc->init = an5206_init;
mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5206"); mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5206");
mc->default_ram_id = "an5206.ram";
} }
DEFINE_MACHINE("an5206", an5206_machine_init) DEFINE_MACHINE("an5206", an5206_machine_init)

View File

@ -234,7 +234,6 @@ static void mcf5208evb_init(MachineState *machine)
qemu_irq *pic; qemu_irq *pic;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *rom = g_new(MemoryRegion, 1); MemoryRegion *rom = g_new(MemoryRegion, 1);
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *sram = g_new(MemoryRegion, 1); MemoryRegion *sram = g_new(MemoryRegion, 1);
cpu = M68K_CPU(cpu_create(machine->cpu_type)); cpu = M68K_CPU(cpu_create(machine->cpu_type));
@ -249,8 +248,7 @@ static void mcf5208evb_init(MachineState *machine)
memory_region_add_subregion(address_space_mem, 0x00000000, rom); memory_region_add_subregion(address_space_mem, 0x00000000, rom);
/* DRAM at 0x40000000 */ /* DRAM at 0x40000000 */
memory_region_allocate_system_memory(ram, NULL, "mcf5208.ram", ram_size); memory_region_add_subregion(address_space_mem, 0x40000000, machine->ram);
memory_region_add_subregion(address_space_mem, 0x40000000, ram);
/* Internal SRAM. */ /* Internal SRAM. */
memory_region_init_ram(sram, NULL, "mcf5208.sram", 16 * KiB, &error_fatal); memory_region_init_ram(sram, NULL, "mcf5208.sram", 16 * KiB, &error_fatal);
@ -354,6 +352,7 @@ static void mcf5208evb_machine_init(MachineClass *mc)
mc->init = mcf5208evb_init; mc->init = mcf5208evb_init;
mc->is_default = 1; mc->is_default = 1;
mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5208"); mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5208");
mc->default_ram_id = "mcf5208.ram";
} }
DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_init) DEFINE_MACHINE("mcf5208evb", mcf5208evb_machine_init)

View File

@ -860,7 +860,6 @@ static void next_cube_init(MachineState *machine)
{ {
M68kCPU *cpu; M68kCPU *cpu;
CPUM68KState *env; CPUM68KState *env;
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *rom = g_new(MemoryRegion, 1); MemoryRegion *rom = g_new(MemoryRegion, 1);
MemoryRegion *mmiomem = g_new(MemoryRegion, 1); MemoryRegion *mmiomem = g_new(MemoryRegion, 1);
MemoryRegion *scrmem = g_new(MemoryRegion, 1); MemoryRegion *scrmem = g_new(MemoryRegion, 1);
@ -893,8 +892,7 @@ static void next_cube_init(MachineState *machine)
memcpy(ns->rtc.ram, rtc_ram2, 32); memcpy(ns->rtc.ram, rtc_ram2, 32);
/* 64MB RAM starting at 0x04000000 */ /* 64MB RAM starting at 0x04000000 */
memory_region_allocate_system_memory(ram, NULL, "next.ram", ram_size); memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
memory_region_add_subregion(sysmem, 0x04000000, ram);
/* Framebuffer */ /* Framebuffer */
dev = qdev_create(NULL, TYPE_NEXTFB); dev = qdev_create(NULL, TYPE_NEXTFB);
@ -967,6 +965,7 @@ static void next_machine_class_init(ObjectClass *oc, void *data)
mc->desc = "NeXT Cube"; mc->desc = "NeXT Cube";
mc->init = next_cube_init; mc->init = next_cube_init;
mc->default_ram_size = RAM_SIZE; mc->default_ram_size = RAM_SIZE;
mc->default_ram_id = "next.ram";
mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040"); mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
} }

View File

@ -160,7 +160,6 @@ static void q800_init(MachineState *machine)
ram_addr_t initrd_base; ram_addr_t initrd_base;
int32_t initrd_size; int32_t initrd_size;
MemoryRegion *rom; MemoryRegion *rom;
MemoryRegion *ram;
MemoryRegion *io; MemoryRegion *io;
const int io_slice_nb = (IO_SIZE / IO_SLICE) - 1; const int io_slice_nb = (IO_SIZE / IO_SLICE) - 1;
int i; int i;
@ -194,9 +193,7 @@ static void q800_init(MachineState *machine)
qemu_register_reset(main_cpu_reset, cpu); qemu_register_reset(main_cpu_reset, cpu);
/* RAM */ /* RAM */
ram = g_malloc(sizeof(*ram)); memory_region_add_subregion(get_system_memory(), 0, machine->ram);
memory_region_init_ram(ram, NULL, "m68k_mac.ram", ram_size, &error_abort);
memory_region_add_subregion(get_system_memory(), 0, ram);
/* /*
* Memory from IO_BASE to IO_BASE + IO_SLICE is repeated * Memory from IO_BASE to IO_BASE + IO_SLICE is repeated
@ -443,6 +440,7 @@ static void q800_machine_class_init(ObjectClass *oc, void *data)
mc->max_cpus = 1; mc->max_cpus = 1;
mc->is_default = 0; mc->is_default = 0;
mc->block_default_type = IF_SCSI; mc->block_default_type = IF_SCSI;
mc->default_ram_id = "m68k_mac.ram";
} }
static const TypeInfo q800_machine_typeinfo = { static const TypeInfo q800_machine_typeinfo = {

View File

@ -427,7 +427,7 @@ static void boston_mach_init(MachineState *machine)
DeviceState *dev; DeviceState *dev;
BostonState *s; BostonState *s;
Error *err = NULL; Error *err = NULL;
MemoryRegion *flash, *ddr, *ddr_low_alias, *lcd, *platreg; MemoryRegion *flash, *ddr_low_alias, *lcd, *platreg;
MemoryRegion *sys_mem = get_system_memory(); MemoryRegion *sys_mem = get_system_memory();
XilinxPCIEHost *pcie2; XilinxPCIEHost *pcie2;
PCIDevice *ahci; PCIDevice *ahci;
@ -473,14 +473,12 @@ static void boston_mach_init(MachineState *machine)
memory_region_init_rom(flash, NULL, "boston.flash", 128 * MiB, &err); memory_region_init_rom(flash, NULL, "boston.flash", 128 * MiB, &err);
memory_region_add_subregion_overlap(sys_mem, 0x18000000, flash, 0); memory_region_add_subregion_overlap(sys_mem, 0x18000000, flash, 0);
ddr = g_new(MemoryRegion, 1); memory_region_add_subregion_overlap(sys_mem, 0x80000000, machine->ram, 0);
memory_region_allocate_system_memory(ddr, NULL, "boston.ddr",
machine->ram_size);
memory_region_add_subregion_overlap(sys_mem, 0x80000000, ddr, 0);
ddr_low_alias = g_new(MemoryRegion, 1); ddr_low_alias = g_new(MemoryRegion, 1);
memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr", memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr",
ddr, 0, MIN(machine->ram_size, (256 * MiB))); machine->ram, 0,
MIN(machine->ram_size, (256 * MiB)));
memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0); memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0);
xilinx_pcie_init(sys_mem, 0, xilinx_pcie_init(sys_mem, 0,
@ -552,6 +550,7 @@ static void boston_mach_class_init(MachineClass *mc)
mc->init = boston_mach_init; mc->init = boston_mach_init;
mc->block_default_type = IF_IDE; mc->block_default_type = IF_IDE;
mc->default_ram_size = 1 * GiB; mc->default_ram_size = 1 * GiB;
mc->default_ram_id = "boston.ddr";
mc->max_cpus = 16; mc->max_cpus = 16;
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("I6400"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("I6400");
} }

View File

@ -294,9 +294,7 @@ static void mips_fulong2e_init(MachineState *machine)
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
char *filename; char *filename;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *bios = g_new(MemoryRegion, 1); MemoryRegion *bios = g_new(MemoryRegion, 1);
ram_addr_t ram_size = machine->ram_size;
long bios_size; long bios_size;
uint8_t *spd_data; uint8_t *spd_data;
Error *err = NULL; Error *err = NULL;
@ -315,15 +313,17 @@ static void mips_fulong2e_init(MachineState *machine)
qemu_register_reset(main_cpu_reset, cpu); qemu_register_reset(main_cpu_reset, cpu);
/* TODO: support more than 256M RAM as highmem */ /* TODO: support more than 256M RAM as highmem */
ram_size = 256 * MiB; if (machine->ram_size != 256 * MiB) {
error_report("Invalid RAM size, should be 256MB");
exit(EXIT_FAILURE);
}
/* allocate RAM */ /* allocate RAM */
memory_region_allocate_system_memory(ram, NULL, "fulong2e.ram", ram_size);
memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE, memory_region_init_ram(bios, NULL, "fulong2e.bios", BIOS_SIZE,
&error_fatal); &error_fatal);
memory_region_set_readonly(bios, true); memory_region_set_readonly(bios, true);
memory_region_add_subregion(address_space_mem, 0, ram); memory_region_add_subregion(address_space_mem, 0, machine->ram);
memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios); memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
/* /*
@ -332,7 +332,7 @@ static void mips_fulong2e_init(MachineState *machine)
*/ */
if (kernel_filename) { if (kernel_filename) {
loaderparams.ram_size = ram_size; loaderparams.ram_size = machine->ram_size;
loaderparams.kernel_filename = kernel_filename; loaderparams.kernel_filename = kernel_filename;
loaderparams.kernel_cmdline = kernel_cmdline; loaderparams.kernel_cmdline = kernel_cmdline;
loaderparams.initrd_filename = initrd_filename; loaderparams.initrd_filename = initrd_filename;
@ -378,7 +378,7 @@ static void mips_fulong2e_init(MachineState *machine)
} }
/* Populate SPD eeprom data */ /* Populate SPD eeprom data */
spd_data = spd_data_generate(DDR, ram_size, &err); spd_data = spd_data_generate(DDR, machine->ram_size, &err);
if (err) { if (err) {
warn_report_err(err); warn_report_err(err);
} }
@ -399,6 +399,7 @@ static void mips_fulong2e_machine_init(MachineClass *mc)
mc->block_default_type = IF_IDE; mc->block_default_type = IF_IDE;
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("Loongson-2E"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("Loongson-2E");
mc->default_ram_size = 256 * MiB; mc->default_ram_size = 256 * MiB;
mc->default_ram_id = "fulong2e.ram";
} }
DEFINE_MACHINE("fulong2e", mips_fulong2e_machine_init) DEFINE_MACHINE("fulong2e", mips_fulong2e_machine_init)

View File

@ -159,12 +159,16 @@ static void mips_jazz_init(MachineState *machine,
ISABus *isa_bus; ISABus *isa_bus;
ISADevice *pit; ISADevice *pit;
DriveInfo *fds[MAX_FD]; DriveInfo *fds[MAX_FD];
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *bios = g_new(MemoryRegion, 1); MemoryRegion *bios = g_new(MemoryRegion, 1);
MemoryRegion *bios2 = g_new(MemoryRegion, 1); MemoryRegion *bios2 = g_new(MemoryRegion, 1);
SysBusESPState *sysbus_esp; SysBusESPState *sysbus_esp;
ESPState *esp; ESPState *esp;
if (machine->ram_size > 256 * MiB) {
error_report("RAM size more than 256Mb is not supported");
exit(EXIT_FAILURE);
}
/* init CPUs */ /* init CPUs */
cpu = MIPS_CPU(cpu_create(machine->cpu_type)); cpu = MIPS_CPU(cpu_create(machine->cpu_type));
env = &cpu->env; env = &cpu->env;
@ -191,9 +195,7 @@ static void mips_jazz_init(MachineState *machine,
cc->do_transaction_failed = mips_jazz_do_transaction_failed; cc->do_transaction_failed = mips_jazz_do_transaction_failed;
/* allocate RAM */ /* allocate RAM */
memory_region_allocate_system_memory(ram, NULL, "mips_jazz.ram", memory_region_add_subregion(address_space, 0, machine->ram);
machine->ram_size);
memory_region_add_subregion(address_space, 0, ram);
memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE, memory_region_init_ram(bios, NULL, "mips_jazz.bios", MAGNUM_BIOS_SIZE,
&error_fatal); &error_fatal);
@ -393,6 +395,7 @@ static void mips_magnum_class_init(ObjectClass *oc, void *data)
mc->init = mips_magnum_init; mc->init = mips_magnum_init;
mc->block_default_type = IF_SCSI; mc->block_default_type = IF_SCSI;
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
mc->default_ram_id = "mips_jazz.ram";
} }
static const TypeInfo mips_magnum_type = { static const TypeInfo mips_magnum_type = {
@ -409,6 +412,7 @@ static void mips_pica61_class_init(ObjectClass *oc, void *data)
mc->init = mips_pica61_init; mc->init = mips_pica61_init;
mc->block_default_type = IF_SCSI; mc->block_default_type = IF_SCSI;
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("R4000");
mc->default_ram_id = "mips_jazz.ram";
} }
static const TypeInfo mips_pica61_type = { static const TypeInfo mips_pica61_type = {

View File

@ -1224,7 +1224,6 @@ void mips_malta_init(MachineState *machine)
char *filename; char *filename;
PFlashCFI01 *fl; PFlashCFI01 *fl;
MemoryRegion *system_memory = get_system_memory(); MemoryRegion *system_memory = get_system_memory();
MemoryRegion *ram_high = g_new(MemoryRegion, 1);
MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1); MemoryRegion *ram_low_preio = g_new(MemoryRegion, 1);
MemoryRegion *ram_low_postio; MemoryRegion *ram_low_postio;
MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1); MemoryRegion *bios, *bios_copy = g_new(MemoryRegion, 1);
@ -1262,13 +1261,11 @@ void mips_malta_init(MachineState *machine)
} }
/* register RAM at high address where it is undisturbed by IO */ /* register RAM at high address where it is undisturbed by IO */
memory_region_allocate_system_memory(ram_high, NULL, "mips_malta.ram", memory_region_add_subregion(system_memory, 0x80000000, machine->ram);
ram_size);
memory_region_add_subregion(system_memory, 0x80000000, ram_high);
/* alias for pre IO hole access */ /* alias for pre IO hole access */
memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram", memory_region_init_alias(ram_low_preio, NULL, "mips_malta_low_preio.ram",
ram_high, 0, MIN(ram_size, 256 * MiB)); machine->ram, 0, MIN(ram_size, 256 * MiB));
memory_region_add_subregion(system_memory, 0, ram_low_preio); memory_region_add_subregion(system_memory, 0, ram_low_preio);
/* alias for post IO hole access, if there is enough RAM */ /* alias for post IO hole access, if there is enough RAM */
@ -1276,7 +1273,7 @@ void mips_malta_init(MachineState *machine)
ram_low_postio = g_new(MemoryRegion, 1); ram_low_postio = g_new(MemoryRegion, 1);
memory_region_init_alias(ram_low_postio, NULL, memory_region_init_alias(ram_low_postio, NULL,
"mips_malta_low_postio.ram", "mips_malta_low_postio.ram",
ram_high, 512 * MiB, machine->ram, 512 * MiB,
ram_size - 512 * MiB); ram_size - 512 * MiB);
memory_region_add_subregion(system_memory, 512 * MiB, memory_region_add_subregion(system_memory, 512 * MiB,
ram_low_postio); ram_low_postio);
@ -1448,6 +1445,7 @@ static void mips_malta_machine_init(MachineClass *mc)
#else #else
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
#endif #endif
mc->default_ram_id = "mips_malta.ram";
} }
DEFINE_MACHINE("malta", mips_malta_machine_init) DEFINE_MACHINE("malta", mips_malta_machine_init)

View File

@ -143,14 +143,12 @@ static void mipsnet_init(int base, qemu_irq irq, NICInfo *nd)
static void static void
mips_mipssim_init(MachineState *machine) mips_mipssim_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
char *filename; char *filename;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *isa = g_new(MemoryRegion, 1); MemoryRegion *isa = g_new(MemoryRegion, 1);
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *bios = g_new(MemoryRegion, 1); MemoryRegion *bios = g_new(MemoryRegion, 1);
MIPSCPU *cpu; MIPSCPU *cpu;
CPUMIPSState *env; CPUMIPSState *env;
@ -167,13 +165,11 @@ mips_mipssim_init(MachineState *machine)
qemu_register_reset(main_cpu_reset, reset_info); qemu_register_reset(main_cpu_reset, reset_info);
/* Allocate RAM. */ /* Allocate RAM. */
memory_region_allocate_system_memory(ram, NULL, "mips_mipssim.ram",
ram_size);
memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE, memory_region_init_ram(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
&error_fatal); &error_fatal);
memory_region_set_readonly(bios, true); memory_region_set_readonly(bios, true);
memory_region_add_subregion(address_space_mem, 0, ram); memory_region_add_subregion(address_space_mem, 0, machine->ram);
/* Map the BIOS / boot exception handler. */ /* Map the BIOS / boot exception handler. */
memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios); memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
@ -200,7 +196,7 @@ mips_mipssim_init(MachineState *machine)
} }
if (kernel_filename) { if (kernel_filename) {
loaderparams.ram_size = ram_size; loaderparams.ram_size = machine->ram_size;
loaderparams.kernel_filename = kernel_filename; loaderparams.kernel_filename = kernel_filename;
loaderparams.kernel_cmdline = kernel_cmdline; loaderparams.kernel_cmdline = kernel_cmdline;
loaderparams.initrd_filename = initrd_filename; loaderparams.initrd_filename = initrd_filename;
@ -245,6 +241,7 @@ static void mips_mipssim_machine_init(MachineClass *mc)
#else #else
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
#endif #endif
mc->default_ram_id = "mips_mipssim.ram";
} }
DEFINE_MACHINE("mipssim", mips_mipssim_machine_init) DEFINE_MACHINE("mipssim", mips_mipssim_machine_init)

View File

@ -171,13 +171,11 @@ static const int sector_len = 32 * KiB;
static static
void mips_r4k_init(MachineState *machine) void mips_r4k_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
char *filename; char *filename;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *bios; MemoryRegion *bios;
MemoryRegion *iomem = g_new(MemoryRegion, 1); MemoryRegion *iomem = g_new(MemoryRegion, 1);
MemoryRegion *isa_io = g_new(MemoryRegion, 1); MemoryRegion *isa_io = g_new(MemoryRegion, 1);
@ -203,14 +201,12 @@ void mips_r4k_init(MachineState *machine)
qemu_register_reset(main_cpu_reset, reset_info); qemu_register_reset(main_cpu_reset, reset_info);
/* allocate RAM */ /* allocate RAM */
if (ram_size > 256 * MiB) { if (machine->ram_size > 256 * MiB) {
error_report("Too much memory for this machine: %" PRId64 "MB," error_report("Too much memory for this machine: %" PRId64 "MB,"
" maximum 256MB", ram_size / MiB); " maximum 256MB", ram_size / MiB);
exit(1); exit(1);
} }
memory_region_allocate_system_memory(ram, NULL, "mips_r4k.ram", ram_size); memory_region_add_subregion(address_space_mem, 0, machine->ram);
memory_region_add_subregion(address_space_mem, 0, ram);
memory_region_init_io(iomem, NULL, &mips_qemu_ops, memory_region_init_io(iomem, NULL, &mips_qemu_ops,
NULL, "mips-qemu", 0x10000); NULL, "mips-qemu", 0x10000);
@ -261,7 +257,7 @@ void mips_r4k_init(MachineState *machine)
g_free(filename); g_free(filename);
if (kernel_filename) { if (kernel_filename) {
loaderparams.ram_size = ram_size; loaderparams.ram_size = machine->ram_size;
loaderparams.kernel_filename = kernel_filename; loaderparams.kernel_filename = kernel_filename;
loaderparams.kernel_cmdline = kernel_cmdline; loaderparams.kernel_cmdline = kernel_cmdline;
loaderparams.initrd_filename = initrd_filename; loaderparams.initrd_filename = initrd_filename;
@ -316,7 +312,7 @@ static void mips_machine_init(MachineClass *mc)
#else #else
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf"); mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
#endif #endif
mc->default_ram_id = "mips_r4k.ram";
} }
DEFINE_MACHINE("mips", mips_machine_init) DEFINE_MACHINE("mips", mips_machine_init)

View File

@ -17,6 +17,9 @@
#include "migration/vmstate.h" #include "migration/vmstate.h"
#include "qapi/error.h" #include "qapi/error.h"
#include "trace.h" #include "trace.h"
#include "qemu/units.h"
#include "qemu/cutils.h"
#include "qapi/visitor.h"
/* Protection Key Register */ /* Protection Key Register */
#define R_PROT (0x00 / 4) #define R_PROT (0x00 / 4)
@ -160,14 +163,9 @@ static int ast2400_rambits(AspeedSDMCState *s)
case 512: case 512:
return ASPEED_SDMC_DRAM_512MB; return ASPEED_SDMC_DRAM_512MB;
default: default:
g_assert_not_reached();
break; break;
} }
/* use a common default */
warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 256M",
s->ram_size);
s->ram_size = 256 << 20;
return ASPEED_SDMC_DRAM_256MB;
} }
static int ast2500_rambits(AspeedSDMCState *s) static int ast2500_rambits(AspeedSDMCState *s)
@ -182,14 +180,9 @@ static int ast2500_rambits(AspeedSDMCState *s)
case 1024: case 1024:
return ASPEED_SDMC_AST2500_1024MB; return ASPEED_SDMC_AST2500_1024MB;
default: default:
g_assert_not_reached();
break; break;
} }
/* use a common default */
warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M",
s->ram_size);
s->ram_size = 512 << 20;
return ASPEED_SDMC_AST2500_512MB;
} }
static int ast2600_rambits(AspeedSDMCState *s) static int ast2600_rambits(AspeedSDMCState *s)
@ -204,14 +197,9 @@ static int ast2600_rambits(AspeedSDMCState *s)
case 2048: case 2048:
return ASPEED_SDMC_AST2600_2048MB; return ASPEED_SDMC_AST2600_2048MB;
default: default:
g_assert_not_reached();
break; break;
} }
/* use a common default */
warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 1024M",
s->ram_size);
s->ram_size = 1024 << 20;
return ASPEED_SDMC_AST2600_1024MB;
} }
static void aspeed_sdmc_reset(DeviceState *dev) static void aspeed_sdmc_reset(DeviceState *dev)
@ -225,6 +213,51 @@ static void aspeed_sdmc_reset(DeviceState *dev)
s->regs[R_CONF] = asc->compute_conf(s, 0); s->regs[R_CONF] = asc->compute_conf(s, 0);
} }
static void aspeed_sdmc_get_ram_size(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
AspeedSDMCState *s = ASPEED_SDMC(obj);
int64_t value = s->ram_size;
visit_type_int(v, name, &value, errp);
}
static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
void *opaque, Error **errp)
{
int i;
char *sz;
int64_t value;
Error *local_err = NULL;
AspeedSDMCState *s = ASPEED_SDMC(obj);
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
visit_type_int(v, name, &value, &local_err);
if (local_err) {
error_propagate(errp, local_err);
return;
}
for (i = 0; asc->valid_ram_sizes[i]; i++) {
if (value == asc->valid_ram_sizes[i]) {
s->ram_size = value;
return;
}
}
sz = size_to_str(value);
error_setg(&local_err, "Invalid RAM size %s", sz);
g_free(sz);
error_propagate(errp, local_err);
}
static void aspeed_sdmc_initfn(Object *obj)
{
object_property_add(obj, "ram-size", "int",
aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
NULL, NULL, NULL);
}
static void aspeed_sdmc_realize(DeviceState *dev, Error **errp) static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
{ {
SysBusDevice *sbd = SYS_BUS_DEVICE(dev); SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
@ -249,7 +282,6 @@ static const VMStateDescription vmstate_aspeed_sdmc = {
}; };
static Property aspeed_sdmc_properties[] = { static Property aspeed_sdmc_properties[] = {
DEFINE_PROP_UINT64("ram-size", AspeedSDMCState, ram_size, 0),
DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0), DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };
@ -268,6 +300,7 @@ static const TypeInfo aspeed_sdmc_info = {
.name = TYPE_ASPEED_SDMC, .name = TYPE_ASPEED_SDMC,
.parent = TYPE_SYS_BUS_DEVICE, .parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(AspeedSDMCState), .instance_size = sizeof(AspeedSDMCState),
.instance_init = aspeed_sdmc_initfn,
.class_init = aspeed_sdmc_class_init, .class_init = aspeed_sdmc_class_init,
.class_size = sizeof(AspeedSDMCClass), .class_size = sizeof(AspeedSDMCClass),
.abstract = true, .abstract = true,
@ -298,6 +331,9 @@ static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
s->regs[reg] = data; s->regs[reg] = data;
} }
static const uint64_t
aspeed_2400_ram_sizes[] = { 64 * MiB, 128 * MiB, 256 * MiB, 512 * MiB, 0};
static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data) static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
@ -307,6 +343,7 @@ static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
asc->max_ram_size = 512 << 20; asc->max_ram_size = 512 << 20;
asc->compute_conf = aspeed_2400_sdmc_compute_conf; asc->compute_conf = aspeed_2400_sdmc_compute_conf;
asc->write = aspeed_2400_sdmc_write; asc->write = aspeed_2400_sdmc_write;
asc->valid_ram_sizes = aspeed_2400_ram_sizes;
} }
static const TypeInfo aspeed_2400_sdmc_info = { static const TypeInfo aspeed_2400_sdmc_info = {
@ -351,6 +388,9 @@ static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg,
s->regs[reg] = data; s->regs[reg] = data;
} }
static const uint64_t
aspeed_2500_ram_sizes[] = { 128 * MiB, 256 * MiB, 512 * MiB, 1024 * MiB, 0};
static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data) static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
@ -360,6 +400,7 @@ static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
asc->max_ram_size = 1024 << 20; asc->max_ram_size = 1024 << 20;
asc->compute_conf = aspeed_2500_sdmc_compute_conf; asc->compute_conf = aspeed_2500_sdmc_compute_conf;
asc->write = aspeed_2500_sdmc_write; asc->write = aspeed_2500_sdmc_write;
asc->valid_ram_sizes = aspeed_2500_ram_sizes;
} }
static const TypeInfo aspeed_2500_sdmc_info = { static const TypeInfo aspeed_2500_sdmc_info = {
@ -404,6 +445,9 @@ static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
s->regs[reg] = data; s->regs[reg] = data;
} }
static const uint64_t
aspeed_2600_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB, 2048 * MiB, 0};
static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data) static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
@ -413,6 +457,7 @@ static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
asc->max_ram_size = 2048 << 20; asc->max_ram_size = 2048 << 20;
asc->compute_conf = aspeed_2600_sdmc_compute_conf; asc->compute_conf = aspeed_2600_sdmc_compute_conf;
asc->write = aspeed_2600_sdmc_write; asc->write = aspeed_2600_sdmc_write;
asc->valid_ram_sizes = aspeed_2600_ram_sizes;
} }
static const TypeInfo aspeed_2600_sdmc_info = { static const TypeInfo aspeed_2600_sdmc_info = {

View File

@ -832,7 +832,6 @@ static void ppce500_power_off(void *opaque, int line, int on)
void ppce500_init(MachineState *machine) void ppce500_init(MachineState *machine)
{ {
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
PPCE500MachineState *pms = PPCE500_MACHINE(machine); PPCE500MachineState *pms = PPCE500_MACHINE(machine);
const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(machine); const PPCE500MachineClass *pmc = PPCE500_MACHINE_GET_CLASS(machine);
PCIBus *pci_bus; PCIBus *pci_bus;
@ -907,13 +906,13 @@ void ppce500_init(MachineState *machine)
env = firstenv; env = firstenv;
/* Fixup Memory size on a alignment boundary */ if (!QEMU_IS_ALIGNED(machine->ram_size, RAM_SIZES_ALIGN)) {
ram_size &= ~(RAM_SIZES_ALIGN - 1); error_report("RAM size must be multiple of %" PRIu64, RAM_SIZES_ALIGN);
machine->ram_size = ram_size; exit(EXIT_FAILURE);
}
/* Register Memory */ /* Register Memory */
memory_region_allocate_system_memory(ram, NULL, "mpc8544ds.ram", ram_size); memory_region_add_subregion(address_space_mem, 0, machine->ram);
memory_region_add_subregion(address_space_mem, 0, ram);
dev = qdev_create(NULL, "e500-ccsr"); dev = qdev_create(NULL, "e500-ccsr");
object_property_add_child(qdev_get_machine(), "e500-ccsr", object_property_add_child(qdev_get_machine(), "e500-ccsr",
@ -1084,7 +1083,7 @@ void ppce500_init(MachineState *machine)
kernel_base = cur_base; kernel_base = cur_base;
kernel_size = load_image_targphys(machine->kernel_filename, kernel_size = load_image_targphys(machine->kernel_filename,
cur_base, cur_base,
ram_size - cur_base); machine->ram_size - cur_base);
if (kernel_size < 0) { if (kernel_size < 0) {
error_report("could not load kernel '%s'", error_report("could not load kernel '%s'",
machine->kernel_filename); machine->kernel_filename);
@ -1098,7 +1097,7 @@ void ppce500_init(MachineState *machine)
if (machine->initrd_filename) { if (machine->initrd_filename) {
initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK; initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK;
initrd_size = load_image_targphys(machine->initrd_filename, initrd_base, initrd_size = load_image_targphys(machine->initrd_filename, initrd_base,
ram_size - initrd_base); machine->ram_size - initrd_base);
if (initrd_size < 0) { if (initrd_size < 0) {
error_report("could not load initial ram disk '%s'", error_report("could not load initial ram disk '%s'",
@ -1116,7 +1115,7 @@ void ppce500_init(MachineState *machine)
* ensures enough space between kernel and initrd. * ensures enough space between kernel and initrd.
*/ */
dt_base = (loadaddr + payload_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK; dt_base = (loadaddr + payload_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK;
if (dt_base + DTB_MAX_SIZE > ram_size) { if (dt_base + DTB_MAX_SIZE > machine->ram_size) {
error_report("not enough memory for device tree"); error_report("not enough memory for device tree");
exit(1); exit(1);
} }

View File

@ -97,6 +97,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
mc->init = e500plat_init; mc->init = e500plat_init;
mc->max_cpus = 32; mc->max_cpus = 32;
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
mc->default_ram_id = "mpc8544ds.ram";
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_ETSEC_COMMON); machine_class_allow_dynamic_sysbus_dev(mc, TYPE_ETSEC_COMMON);
} }

View File

@ -118,7 +118,7 @@ static void ppc_core99_init(MachineState *machine)
char *filename; char *filename;
IrqLines *openpic_irqs; IrqLines *openpic_irqs;
int linux_boot, i, j, k; int linux_boot, i, j, k;
MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1); MemoryRegion *bios = g_new(MemoryRegion, 1);
hwaddr kernel_base, initrd_base, cmdline_base = 0; hwaddr kernel_base, initrd_base, cmdline_base = 0;
long kernel_size, initrd_size; long kernel_size, initrd_size;
UNINHostState *uninorth_pci; UNINHostState *uninorth_pci;
@ -152,8 +152,7 @@ static void ppc_core99_init(MachineState *machine)
} }
/* allocate RAM */ /* allocate RAM */
memory_region_allocate_system_memory(ram, NULL, "ppc_core99.ram", ram_size); memory_region_add_subregion(get_system_memory(), 0, machine->ram);
memory_region_add_subregion(get_system_memory(), 0, ram);
/* allocate and load BIOS */ /* allocate and load BIOS */
memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE, memory_region_init_ram(bios, NULL, "ppc_core99.bios", BIOS_SIZE,
@ -586,6 +585,7 @@ static void core99_machine_class_init(ObjectClass *oc, void *data)
#else #else
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
#endif #endif
mc->default_ram_id = "ppc_core99.ram";
mc->ignore_boot_device_suffixes = true; mc->ignore_boot_device_suffixes = true;
fwc->get_dev_path = core99_fw_dev_path; fwc->get_dev_path = core99_fw_dev_path;
} }

View File

@ -91,7 +91,6 @@ static void ppc_heathrow_init(MachineState *machine)
CPUPPCState *env = NULL; CPUPPCState *env = NULL;
char *filename; char *filename;
int linux_boot, i; int linux_boot, i;
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *bios = g_new(MemoryRegion, 1); MemoryRegion *bios = g_new(MemoryRegion, 1);
uint32_t kernel_base, initrd_base, cmdline_base = 0; uint32_t kernel_base, initrd_base, cmdline_base = 0;
int32_t kernel_size, initrd_size; int32_t kernel_size, initrd_size;
@ -127,9 +126,7 @@ static void ppc_heathrow_init(MachineState *machine)
exit(1); exit(1);
} }
memory_region_allocate_system_memory(ram, NULL, "ppc_heathrow.ram", memory_region_add_subregion(sysmem, 0, machine->ram);
ram_size);
memory_region_add_subregion(sysmem, 0, ram);
/* allocate and load BIOS */ /* allocate and load BIOS */
memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE, memory_region_init_ram(bios, NULL, "ppc_heathrow.bios", BIOS_SIZE,
@ -446,6 +443,7 @@ static void heathrow_class_init(ObjectClass *oc, void *data)
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("750_v3.1"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("750_v3.1");
mc->default_display = "std"; mc->default_display = "std";
mc->ignore_boot_device_suffixes = true; mc->ignore_boot_device_suffixes = true;
mc->default_ram_id = "ppc_heathrow.ram";
fwc->get_dev_path = heathrow_fw_dev_path; fwc->get_dev_path = heathrow_fw_dev_path;
} }

View File

@ -55,6 +55,7 @@ static void e500plat_machine_class_init(ObjectClass *oc, void *data)
mc->init = mpc8544ds_init; mc->init = mpc8544ds_init;
mc->max_cpus = 15; mc->max_cpus = 15;
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("e500v2_v30");
mc->default_ram_id = "mpc8544ds.ram";
} }
#define TYPE_MPC8544DS_MACHINE MACHINE_TYPE_NAME("mpc8544ds") #define TYPE_MPC8544DS_MACHINE MACHINE_TYPE_NAME("mpc8544ds")

View File

@ -692,7 +692,6 @@ static void pnv_init(MachineState *machine)
{ {
PnvMachineState *pnv = PNV_MACHINE(machine); PnvMachineState *pnv = PNV_MACHINE(machine);
MachineClass *mc = MACHINE_GET_CLASS(machine); MachineClass *mc = MACHINE_GET_CLASS(machine);
MemoryRegion *ram;
char *fw_filename; char *fw_filename;
long fw_size; long fw_size;
int i; int i;
@ -704,11 +703,7 @@ static void pnv_init(MachineState *machine)
if (machine->ram_size < (1 * GiB)) { if (machine->ram_size < (1 * GiB)) {
warn_report("skiboot may not work with < 1GB of RAM"); warn_report("skiboot may not work with < 1GB of RAM");
} }
memory_region_add_subregion(get_system_memory(), 0, machine->ram);
ram = g_new(MemoryRegion, 1);
memory_region_allocate_system_memory(ram, NULL, "pnv.ram",
machine->ram_size);
memory_region_add_subregion(get_system_memory(), 0, ram);
/* /*
* Create our simple PNOR device * Create our simple PNOR device
@ -1978,6 +1973,7 @@ static void pnv_machine_class_init(ObjectClass *oc, void *data)
* enough to fit the maximum initrd size at it's load address * enough to fit the maximum initrd size at it's load address
*/ */
mc->default_ram_size = INITRD_LOAD_ADDR + INITRD_MAX_SIZE; mc->default_ram_size = INITRD_LOAD_ADDR + INITRD_MAX_SIZE;
mc->default_ram_id = "pnv.ram";
ispc->print_info = pnv_pic_print_info; ispc->print_info = pnv_pic_print_info;
object_class_property_add_bool(oc, "hb-mode", object_class_property_add_bool(oc, "hb-mode",

View File

@ -40,6 +40,7 @@
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "hw/loader.h" #include "hw/loader.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "qemu/cutils.h"
#define BIOS_FILENAME "ppc405_rom.bin" #define BIOS_FILENAME "ppc405_rom.bin"
#define BIOS_SIZE (2 * MiB) #define BIOS_SIZE (2 * MiB)
@ -137,7 +138,7 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
static void ref405ep_init(MachineState *machine) static void ref405ep_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size; MachineClass *mc = MACHINE_GET_CLASS(machine);
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
@ -161,15 +162,21 @@ static void ref405ep_init(MachineState *machine)
DriveInfo *dinfo; DriveInfo *dinfo;
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
if (machine->ram_size != mc->default_ram_size) {
char *sz = size_to_str(mc->default_ram_size);
error_report("Invalid RAM size, should be %s", sz);
g_free(sz);
exit(EXIT_FAILURE);
}
/* XXX: fix this */ /* XXX: fix this */
memory_region_allocate_system_memory(&ram_memories[0], NULL, "ef405ep.ram", memory_region_init_alias(&ram_memories[0], NULL, "ef405ep.ram.alias",
0x08000000); machine->ram, 0, machine->ram_size);
ram_bases[0] = 0; ram_bases[0] = 0;
ram_sizes[0] = 0x08000000; ram_sizes[0] = machine->ram_size;
memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0); memory_region_init(&ram_memories[1], NULL, "ef405ep.ram1", 0);
ram_bases[1] = 0x00000000; ram_bases[1] = 0x00000000;
ram_sizes[1] = 0x00000000; ram_sizes[1] = 0x00000000;
ram_size = 128 * MiB;
env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes, env = ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
33333333, &pic, kernel_filename == NULL ? 0 : 1); 33333333, &pic, kernel_filename == NULL ? 0 : 1);
/* allocate SRAM */ /* allocate SRAM */
@ -227,7 +234,7 @@ static void ref405ep_init(MachineState *machine)
if (linux_boot) { if (linux_boot) {
memset(&bd, 0, sizeof(bd)); memset(&bd, 0, sizeof(bd));
bd.bi_memstart = 0x00000000; bd.bi_memstart = 0x00000000;
bd.bi_memsize = ram_size; bd.bi_memsize = machine->ram_size;
bd.bi_flashstart = -bios_size; bd.bi_flashstart = -bios_size;
bd.bi_flashsize = -bios_size; bd.bi_flashsize = -bios_size;
bd.bi_flashoffset = 0; bd.bi_flashoffset = 0;
@ -255,7 +262,7 @@ static void ref405ep_init(MachineState *machine)
kernel_base = KERNEL_LOAD_ADDR; kernel_base = KERNEL_LOAD_ADDR;
/* now we can load the kernel */ /* now we can load the kernel */
kernel_size = load_image_targphys(kernel_filename, kernel_base, kernel_size = load_image_targphys(kernel_filename, kernel_base,
ram_size - kernel_base); machine->ram_size - kernel_base);
if (kernel_size < 0) { if (kernel_size < 0) {
error_report("could not load kernel '%s'", kernel_filename); error_report("could not load kernel '%s'", kernel_filename);
exit(1); exit(1);
@ -266,7 +273,7 @@ static void ref405ep_init(MachineState *machine)
if (initrd_filename) { if (initrd_filename) {
initrd_base = INITRD_LOAD_ADDR; initrd_base = INITRD_LOAD_ADDR;
initrd_size = load_image_targphys(initrd_filename, initrd_base, initrd_size = load_image_targphys(initrd_filename, initrd_base,
ram_size - initrd_base); machine->ram_size - initrd_base);
if (initrd_size < 0) { if (initrd_size < 0) {
error_report("could not load initial ram disk '%s'", error_report("could not load initial ram disk '%s'",
initrd_filename); initrd_filename);
@ -304,6 +311,8 @@ static void ref405ep_class_init(ObjectClass *oc, void *data)
mc->desc = "ref405ep"; mc->desc = "ref405ep";
mc->init = ref405ep_init; mc->init = ref405ep_init;
mc->default_ram_size = 0x08000000;
mc->default_ram_id = "ef405ep.ram";
} }
static const TypeInfo ref405ep_type = { static const TypeInfo ref405ep_type = {
@ -408,7 +417,7 @@ static void taihu_cpld_init(MemoryRegion *sysmem, uint32_t base)
static void taihu_405ep_init(MachineState *machine) static void taihu_405ep_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size; MachineClass *mc = MACHINE_GET_CLASS(machine);
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
char *filename; char *filename;
@ -416,7 +425,6 @@ static void taihu_405ep_init(MachineState *machine)
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *bios; MemoryRegion *bios;
MemoryRegion *ram_memories = g_new(MemoryRegion, 2); MemoryRegion *ram_memories = g_new(MemoryRegion, 2);
MemoryRegion *ram = g_malloc0(sizeof(*ram));
hwaddr ram_bases[2], ram_sizes[2]; hwaddr ram_bases[2], ram_sizes[2];
long bios_size; long bios_size;
target_ulong kernel_base, initrd_base; target_ulong kernel_base, initrd_base;
@ -425,20 +433,22 @@ static void taihu_405ep_init(MachineState *machine)
int fl_idx; int fl_idx;
DriveInfo *dinfo; DriveInfo *dinfo;
/* RAM is soldered to the board so the size cannot be changed */ if (machine->ram_size != mc->default_ram_size) {
ram_size = 0x08000000; char *sz = size_to_str(mc->default_ram_size);
memory_region_allocate_system_memory(ram, NULL, "taihu_405ep.ram", error_report("Invalid RAM size, should be %s", sz);
ram_size); g_free(sz);
exit(EXIT_FAILURE);
}
ram_bases[0] = 0; ram_bases[0] = 0;
ram_sizes[0] = 0x04000000; ram_sizes[0] = 0x04000000;
memory_region_init_alias(&ram_memories[0], NULL, memory_region_init_alias(&ram_memories[0], NULL,
"taihu_405ep.ram-0", ram, ram_bases[0], "taihu_405ep.ram-0", machine->ram, ram_bases[0],
ram_sizes[0]); ram_sizes[0]);
ram_bases[1] = 0x04000000; ram_bases[1] = 0x04000000;
ram_sizes[1] = 0x04000000; ram_sizes[1] = 0x04000000;
memory_region_init_alias(&ram_memories[1], NULL, memory_region_init_alias(&ram_memories[1], NULL,
"taihu_405ep.ram-1", ram, ram_bases[1], "taihu_405ep.ram-1", machine->ram, ram_bases[1],
ram_sizes[1]); ram_sizes[1]);
ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes, ppc405ep_init(sysmem, ram_memories, ram_bases, ram_sizes,
33333333, &pic, kernel_filename == NULL ? 0 : 1); 33333333, &pic, kernel_filename == NULL ? 0 : 1);
@ -500,7 +510,7 @@ static void taihu_405ep_init(MachineState *machine)
kernel_base = KERNEL_LOAD_ADDR; kernel_base = KERNEL_LOAD_ADDR;
/* now we can load the kernel */ /* now we can load the kernel */
kernel_size = load_image_targphys(kernel_filename, kernel_base, kernel_size = load_image_targphys(kernel_filename, kernel_base,
ram_size - kernel_base); machine->ram_size - kernel_base);
if (kernel_size < 0) { if (kernel_size < 0) {
error_report("could not load kernel '%s'", kernel_filename); error_report("could not load kernel '%s'", kernel_filename);
exit(1); exit(1);
@ -509,7 +519,7 @@ static void taihu_405ep_init(MachineState *machine)
if (initrd_filename) { if (initrd_filename) {
initrd_base = INITRD_LOAD_ADDR; initrd_base = INITRD_LOAD_ADDR;
initrd_size = load_image_targphys(initrd_filename, initrd_base, initrd_size = load_image_targphys(initrd_filename, initrd_base,
ram_size - initrd_base); machine->ram_size - initrd_base);
if (initrd_size < 0) { if (initrd_size < 0) {
error_report("could not load initial ram disk '%s'", error_report("could not load initial ram disk '%s'",
initrd_filename); initrd_filename);
@ -533,6 +543,8 @@ static void taihu_class_init(ObjectClass *oc, void *data)
mc->desc = "taihu"; mc->desc = "taihu";
mc->init = taihu_405ep_init; mc->init = taihu_405ep_init;
mc->default_ram_size = 0x08000000;
mc->default_ram_id = "taihu_405ep.ram";
} }
static const TypeInfo taihu_type = { static const TypeInfo taihu_type = {

View File

@ -158,7 +158,6 @@ static void main_cpu_reset(void *opaque)
static void bamboo_init(MachineState *machine) static void bamboo_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
const char *initrd_filename = machine->initrd_filename; const char *initrd_filename = machine->initrd_filename;
@ -203,10 +202,8 @@ static void bamboo_init(MachineState *machine)
/* SDRAM controller */ /* SDRAM controller */
memset(ram_bases, 0, sizeof(ram_bases)); memset(ram_bases, 0, sizeof(ram_bases));
memset(ram_sizes, 0, sizeof(ram_sizes)); memset(ram_sizes, 0, sizeof(ram_sizes));
ram_size = ppc4xx_sdram_adjust(ram_size, PPC440EP_SDRAM_NR_BANKS, ppc4xx_sdram_banks(machine->ram, PPC440EP_SDRAM_NR_BANKS, ram_memories,
ram_memories, ram_bases, ram_sizes, ppc440ep_sdram_bank_sizes);
ram_bases, ram_sizes,
ppc440ep_sdram_bank_sizes);
/* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */ /* XXX 440EP's ECC interrupts are on UIC1, but we've only created UIC0. */
ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories, ppc4xx_sdram_init(env, pic[14], PPC440EP_SDRAM_NR_BANKS, ram_memories,
ram_bases, ram_sizes, 1); ram_bases, ram_sizes, 1);
@ -268,7 +265,7 @@ static void bamboo_init(MachineState *machine)
/* Load initrd. */ /* Load initrd. */
if (initrd_filename) { if (initrd_filename) {
initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR, initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
ram_size - RAMDISK_ADDR); machine->ram_size - RAMDISK_ADDR);
if (initrd_size < 0) { if (initrd_size < 0) {
error_report("could not load ram disk '%s' at %x", error_report("could not load ram disk '%s' at %x",
@ -279,7 +276,7 @@ static void bamboo_init(MachineState *machine)
/* If we're loading a kernel directly, we must load the device tree too. */ /* If we're loading a kernel directly, we must load the device tree too. */
if (kernel_filename) { if (kernel_filename) {
if (bamboo_load_device_tree(FDT_ADDR, ram_size, RAMDISK_ADDR, if (bamboo_load_device_tree(FDT_ADDR, machine->ram_size, RAMDISK_ADDR,
initrd_size, kernel_cmdline) < 0) { initrd_size, kernel_cmdline) < 0) {
error_report("couldn't load device tree"); error_report("couldn't load device tree");
exit(1); exit(1);
@ -292,6 +289,7 @@ static void bamboo_machine_init(MachineClass *mc)
mc->desc = "bamboo"; mc->desc = "bamboo";
mc->init = bamboo_init; mc->init = bamboo_init;
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440epb");
mc->default_ram_id = "ppc4xx.sdram";
} }
DEFINE_MACHINE("bamboo", bamboo_machine_init) DEFINE_MACHINE("bamboo", bamboo_machine_init)

View File

@ -666,21 +666,22 @@ void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
sdram_map_bcr(sdram); sdram_map_bcr(sdram);
} }
/* Fill in consecutive SDRAM banks with 'ram_size' bytes of memory. /*
* Split RAM between SDRAM banks.
* *
* sdram_bank_sizes[] must be 0-terminated. * sdram_bank_sizes[] must be in descending order, that is sizes[i] > sizes[i+1]
* and must be 0-terminated.
* *
* The 4xx SDRAM controller supports a small number of banks, and each bank * The 4xx SDRAM controller supports a small number of banks, and each bank
* must be one of a small set of sizes. The number of banks and the supported * must be one of a small set of sizes. The number of banks and the supported
* sizes varies by SoC. */ * sizes varies by SoC.
ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks, */
MemoryRegion ram_memories[], void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
hwaddr ram_bases[], MemoryRegion ram_memories[],
hwaddr ram_sizes[], hwaddr ram_bases[], hwaddr ram_sizes[],
const ram_addr_t sdram_bank_sizes[]) const ram_addr_t sdram_bank_sizes[])
{ {
MemoryRegion *ram = g_malloc0(sizeof(*ram)); ram_addr_t size_left = memory_region_size(ram);
ram_addr_t size_left = ram_size;
ram_addr_t base = 0; ram_addr_t base = 0;
ram_addr_t bank_size; ram_addr_t bank_size;
int i; int i;
@ -690,7 +691,16 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
for (j = 0; sdram_bank_sizes[j] != 0; j++) { for (j = 0; sdram_bank_sizes[j] != 0; j++) {
bank_size = sdram_bank_sizes[j]; bank_size = sdram_bank_sizes[j];
if (bank_size <= size_left) { if (bank_size <= size_left) {
char name[32];
ram_bases[i] = base;
ram_sizes[i] = bank_size;
base += bank_size;
size_left -= bank_size; size_left -= bank_size;
snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
memory_region_init_alias(&ram_memories[i], NULL, name, ram,
ram_bases[i], ram_sizes[i]);
break;
} }
} }
if (!size_left) { if (!size_left) {
@ -699,34 +709,23 @@ ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
} }
} }
ram_size -= size_left;
if (size_left) { if (size_left) {
error_report("Truncating memory to %" PRId64 " MiB to fit SDRAM" ram_addr_t used_size = memory_region_size(ram) - size_left;
" controller limits", ram_size / MiB); GString *s = g_string_new(NULL);
}
memory_region_allocate_system_memory(ram, NULL, "ppc4xx.sdram", ram_size); for (i = 0; sdram_bank_sizes[i]; i++) {
g_string_append_printf(s, "%" PRIi64 "%s",
size_left = ram_size; sdram_bank_sizes[i] / MiB,
for (i = 0; i < nr_banks && size_left; i++) { sdram_bank_sizes[i + 1] ? " ," : "");
for (j = 0; sdram_bank_sizes[j] != 0; j++) {
bank_size = sdram_bank_sizes[j];
if (bank_size <= size_left) {
char name[32];
snprintf(name, sizeof(name), "ppc4xx.sdram%d", i);
memory_region_init_alias(&ram_memories[i], NULL, name, ram,
base, bank_size);
ram_bases[i] = base;
ram_sizes[i] = bank_size;
base += bank_size;
size_left -= bank_size;
break;
}
} }
} error_report("Max %d banks of %s MB DIMM/bank supported",
nr_banks, s->str);
error_report("Possible valid RAM size: %" PRIi64,
used_size ? used_size / MiB : sdram_bank_sizes[i - 1] / MiB);
return ram_size; g_string_free(s, true);
exit(EXIT_FAILURE);
}
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -324,9 +324,8 @@ static void sam460ex_init(MachineState *machine)
/* SDRAM controller */ /* SDRAM controller */
/* put all RAM on first bank because board has one slot /* put all RAM on first bank because board has one slot
* and firmware only checks that */ * and firmware only checks that */
machine->ram_size = ppc4xx_sdram_adjust(machine->ram_size, 1, ppc4xx_sdram_banks(machine->ram, 1, ram_memories, ram_bases, ram_sizes,
ram_memories, ram_bases, ram_sizes, ppc460ex_sdram_bank_sizes);
ppc460ex_sdram_bank_sizes);
/* FIXME: does 460EX have ECC interrupts? */ /* FIXME: does 460EX have ECC interrupts? */
ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories, ppc440_sdram_init(env, SDRAM_NR_BANKS, ram_memories,
@ -485,6 +484,7 @@ static void sam460ex_machine_init(MachineClass *mc)
mc->init = sam460ex_init; mc->init = sam460ex_init;
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("460exb");
mc->default_ram_size = 512 * MiB; mc->default_ram_size = 512 * MiB;
mc->default_ram_id = "ppc4xx.sdram";
} }
DEFINE_MACHINE("sam460ex", sam460ex_machine_init) DEFINE_MACHINE("sam460ex", sam460ex_machine_init)

View File

@ -2652,7 +2652,6 @@ static void spapr_machine_init(MachineState *machine)
PCIHostState *phb; PCIHostState *phb;
int i; int i;
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
hwaddr node0_size = spapr_node0_size(machine); hwaddr node0_size = spapr_node0_size(machine);
long load_limit, fw_size; long load_limit, fw_size;
char *filename; char *filename;
@ -2831,10 +2830,8 @@ static void spapr_machine_init(MachineState *machine)
kvmppc_enable_h_page_init(); kvmppc_enable_h_page_init();
} }
/* allocate RAM */ /* map RAM */
memory_region_allocate_system_memory(ram, NULL, "ppc_spapr.ram", memory_region_add_subregion(sysmem, 0, machine->ram);
machine->ram_size);
memory_region_add_subregion(sysmem, 0, ram);
/* always allocate the device memory information */ /* always allocate the device memory information */
machine->device_memory = g_malloc0(sizeof(*machine->device_memory)); machine->device_memory = g_malloc0(sizeof(*machine->device_memory));
@ -4473,6 +4470,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
mc->no_parallel = 1; mc->no_parallel = 1;
mc->default_boot_order = ""; mc->default_boot_order = "";
mc->default_ram_size = 512 * MiB; mc->default_ram_size = 512 * MiB;
mc->default_ram_id = "ppc_spapr.ram";
mc->default_display = "std"; mc->default_display = "std";
mc->kvm_type = spapr_kvm_type; mc->kvm_type = spapr_kvm_type;
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_SPAPR_PCI_HOST_BRIDGE); machine_class_allow_dynamic_sysbus_dev(mc, TYPE_SPAPR_PCI_HOST_BRIDGE);

View File

@ -194,7 +194,6 @@ static int xilinx_load_device_tree(hwaddr addr,
static void virtex_init(MachineState *machine) static void virtex_init(MachineState *machine)
{ {
ram_addr_t ram_size = machine->ram_size;
const char *kernel_filename = machine->kernel_filename; const char *kernel_filename = machine->kernel_filename;
const char *kernel_cmdline = machine->kernel_cmdline; const char *kernel_cmdline = machine->kernel_cmdline;
hwaddr initrd_base = 0; hwaddr initrd_base = 0;
@ -205,7 +204,6 @@ static void virtex_init(MachineState *machine)
CPUPPCState *env; CPUPPCState *env;
hwaddr ram_base = 0; hwaddr ram_base = 0;
DriveInfo *dinfo; DriveInfo *dinfo;
MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
qemu_irq irq[32], *cpu_irq; qemu_irq irq[32], *cpu_irq;
int kernel_size; int kernel_size;
int i; int i;
@ -222,8 +220,7 @@ static void virtex_init(MachineState *machine)
qemu_register_reset(main_cpu_reset, cpu); qemu_register_reset(main_cpu_reset, cpu);
memory_region_allocate_system_memory(phys_ram, NULL, "ram", ram_size); memory_region_add_subregion(address_space_mem, ram_base, machine->ram);
memory_region_add_subregion(address_space_mem, ram_base, phys_ram);
dinfo = drive_get(IF_PFLASH, 0, 0); dinfo = drive_get(IF_PFLASH, 0, 0);
pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE, pflash_cfi01_register(PFLASH_BASEADDR, "virtex.flash", FLASH_SIZE,
@ -266,7 +263,7 @@ static void virtex_init(MachineState *machine)
/* If we failed loading ELF's try a raw image. */ /* If we failed loading ELF's try a raw image. */
kernel_size = load_image_targphys(kernel_filename, kernel_size = load_image_targphys(kernel_filename,
boot_offset, boot_offset,
ram_size); machine->ram_size);
boot_info.bootstrap_pc = boot_offset; boot_info.bootstrap_pc = boot_offset;
high = boot_info.bootstrap_pc + kernel_size + 8192; high = boot_info.bootstrap_pc + kernel_size + 8192;
} }
@ -277,7 +274,7 @@ static void virtex_init(MachineState *machine)
if (machine->initrd_filename) { if (machine->initrd_filename) {
initrd_base = high = ROUND_UP(high, 4); initrd_base = high = ROUND_UP(high, 4);
initrd_size = load_image_targphys(machine->initrd_filename, initrd_size = load_image_targphys(machine->initrd_filename,
high, ram_size - high); high, machine->ram_size - high);
if (initrd_size < 0) { if (initrd_size < 0) {
error_report("couldn't load ram disk '%s'", error_report("couldn't load ram disk '%s'",
@ -291,7 +288,7 @@ static void virtex_init(MachineState *machine)
boot_info.fdt = high + (8192 * 2); boot_info.fdt = high + (8192 * 2);
boot_info.fdt &= ~8191; boot_info.fdt &= ~8191;
xilinx_load_device_tree(boot_info.fdt, ram_size, xilinx_load_device_tree(boot_info.fdt, machine->ram_size,
initrd_base, initrd_size, initrd_base, initrd_size,
kernel_cmdline); kernel_cmdline);
} }
@ -303,6 +300,7 @@ static void virtex_machine_init(MachineClass *mc)
mc->desc = "Xilinx Virtex ML507 reference design"; mc->desc = "Xilinx Virtex ML507 reference design";
mc->init = virtex_init; mc->init = virtex_init;
mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx"); mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("440-xilinx");
mc->default_ram_id = "ram";
} }
DEFINE_MACHINE("virtex-ml507", virtex_machine_init) DEFINE_MACHINE("virtex-ml507", virtex_machine_init)

View File

@ -154,14 +154,12 @@ static void virtio_ccw_register_hcalls(void)
virtio_ccw_hcall_early_printk); virtio_ccw_hcall_early_printk);
} }
static void s390_memory_init(ram_addr_t mem_size) static void s390_memory_init(MemoryRegion *ram)
{ {
MemoryRegion *sysmem = get_system_memory(); MemoryRegion *sysmem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
Error *local_err = NULL; Error *local_err = NULL;
/* allocate RAM for core */ /* allocate RAM for core */
memory_region_allocate_system_memory(ram, NULL, "s390.ram", mem_size);
memory_region_add_subregion(sysmem, 0, ram); memory_region_add_subregion(sysmem, 0, ram);
/* /*
@ -245,7 +243,7 @@ static void ccw_init(MachineState *machine)
s390_sclp_init(); s390_sclp_init();
/* init memory + setup max page size. Required for the CPU model */ /* init memory + setup max page size. Required for the CPU model */
s390_memory_init(machine->ram_size); s390_memory_init(machine->ram);
/* init CPUs (incl. CPU model) early so s390_has_feature() works */ /* init CPUs (incl. CPU model) early so s390_has_feature() works */
s390_init_cpus(machine); s390_init_cpus(machine);
@ -471,6 +469,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
hc->plug = s390_machine_device_plug; hc->plug = s390_machine_device_plug;
hc->unplug_request = s390_machine_device_unplug_request; hc->unplug_request = s390_machine_device_unplug_request;
nc->nmi_monitor_handler = s390_nmi; nc->nmi_monitor_handler = s390_nmi;
mc->default_ram_id = "s390.ram";
} }
static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp) static inline bool machine_get_aes_key_wrap(Object *obj, Error **errp)

View File

@ -189,7 +189,6 @@ static void leon3_generic_hw_init(MachineState *machine)
SPARCCPU *cpu; SPARCCPU *cpu;
CPUSPARCState *env; CPUSPARCState *env;
MemoryRegion *address_space_mem = get_system_memory(); MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *ram = g_new(MemoryRegion, 1);
MemoryRegion *prom = g_new(MemoryRegion, 1); MemoryRegion *prom = g_new(MemoryRegion, 1);
int ret; int ret;
char *filename; char *filename;
@ -251,8 +250,8 @@ static void leon3_generic_hw_init(MachineState *machine)
exit(1); exit(1);
} }
memory_region_allocate_system_memory(ram, NULL, "leon3.ram", ram_size); memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET,
memory_region_add_subregion(address_space_mem, LEON3_RAM_OFFSET, ram); machine->ram);
/* Allocate BIOS */ /* Allocate BIOS */
prom_size = 8 * MiB; prom_size = 8 * MiB;
@ -358,6 +357,7 @@ static void leon3_generic_machine_init(MachineClass *mc)
mc->desc = "Leon-3 generic"; mc->desc = "Leon-3 generic";
mc->init = leon3_generic_hw_init; mc->init = leon3_generic_hw_init;
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("LEON3"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("LEON3");
mc->default_ram_id = "leon3.ram";
} }
DEFINE_MACHINE("leon3_generic", leon3_generic_machine_init) DEFINE_MACHINE("leon3_generic", leon3_generic_machine_init)

View File

@ -777,63 +777,42 @@ static const TypeInfo prom_info = {
typedef struct RamDevice { typedef struct RamDevice {
SysBusDevice parent_obj; SysBusDevice parent_obj;
HostMemoryBackend *memdev;
MemoryRegion ram;
uint64_t size;
} RamDevice; } RamDevice;
/* System RAM */ /* System RAM */
static void ram_realize(DeviceState *dev, Error **errp) static void ram_realize(DeviceState *dev, Error **errp)
{ {
RamDevice *d = SUN4M_RAM(dev); RamDevice *d = SUN4M_RAM(dev);
SysBusDevice *sbd = SYS_BUS_DEVICE(dev); MemoryRegion *ram = host_memory_backend_get_memory(d->memdev);
memory_region_allocate_system_memory(&d->ram, OBJECT(d), "sun4m.ram", sysbus_init_mmio(SYS_BUS_DEVICE(dev), ram);
d->size);
sysbus_init_mmio(sbd, &d->ram);
} }
static void ram_init(hwaddr addr, ram_addr_t RAM_size, static void ram_initfn(Object *obj)
uint64_t max_mem)
{ {
DeviceState *dev; RamDevice *d = SUN4M_RAM(obj);
SysBusDevice *s; object_property_add_link(obj, "memdev", TYPE_MEMORY_BACKEND,
RamDevice *d; (Object **)&d->memdev,
object_property_allow_set_link,
/* allocate RAM */ OBJ_PROP_LINK_STRONG, &error_abort);
if ((uint64_t)RAM_size > max_mem) { object_property_set_description(obj, "memdev", "Set RAM backend"
error_report("Too much memory for this machine: %" PRId64 "," "Valid value is ID of a hostmem backend",
" maximum %" PRId64, &error_abort);
RAM_size / MiB, max_mem / MiB);
exit(1);
}
dev = qdev_create(NULL, "memory");
s = SYS_BUS_DEVICE(dev);
d = SUN4M_RAM(dev);
d->size = RAM_size;
qdev_init_nofail(dev);
sysbus_mmio_map(s, 0, addr);
} }
static Property ram_properties[] = {
DEFINE_PROP_UINT64("size", RamDevice, size, 0),
DEFINE_PROP_END_OF_LIST(),
};
static void ram_class_init(ObjectClass *klass, void *data) static void ram_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass); DeviceClass *dc = DEVICE_CLASS(klass);
dc->realize = ram_realize; dc->realize = ram_realize;
device_class_set_props(dc, ram_properties);
} }
static const TypeInfo ram_info = { static const TypeInfo ram_info = {
.name = TYPE_SUN4M_MEMORY, .name = TYPE_SUN4M_MEMORY,
.parent = TYPE_SYS_BUS_DEVICE, .parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(RamDevice), .instance_size = sizeof(RamDevice),
.instance_init = ram_initfn,
.class_init = ram_class_init, .class_init = ram_class_init,
}; };
@ -879,6 +858,15 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
SysBusDevice *s; SysBusDevice *s;
unsigned int smp_cpus = machine->smp.cpus; unsigned int smp_cpus = machine->smp.cpus;
unsigned int max_cpus = machine->smp.max_cpus; unsigned int max_cpus = machine->smp.max_cpus;
Object *ram_memdev = object_resolve_path_type(machine->ram_memdev_id,
TYPE_MEMORY_BACKEND, NULL);
if (machine->ram_size > hwdef->max_mem) {
error_report("Too much memory for this machine: %" PRId64 ","
" maximum %" PRId64,
machine->ram_size / MiB, hwdef->max_mem / MiB);
exit(1);
}
/* init CPUs */ /* init CPUs */
for(i = 0; i < smp_cpus; i++) { for(i = 0; i < smp_cpus; i++) {
@ -888,9 +876,12 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
for (i = smp_cpus; i < MAX_CPUS; i++) for (i = smp_cpus; i < MAX_CPUS; i++)
cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS); cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
/* Create and map RAM frontend */
dev = qdev_create(NULL, "memory");
object_property_set_link(OBJECT(dev), ram_memdev, "memdev", &error_fatal);
qdev_init_nofail(dev);
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0);
/* set up devices */
ram_init(0, machine->ram_size, hwdef->max_mem);
/* models without ECC don't trap when missing ram is accessed */ /* models without ECC don't trap when missing ram is accessed */
if (!hwdef->ecc_base) { if (!hwdef->ecc_base) {
empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size); empty_slot_init(machine->ram_size, hwdef->max_mem - machine->ram_size);
@ -1078,7 +1069,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus); fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)machine->ram_size);
fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id); fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth); fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width); fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_WIDTH, graphic_width);
@ -1415,6 +1406,7 @@ static void ss5_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo ss5_type = { static const TypeInfo ss5_type = {
@ -1434,6 +1426,7 @@ static void ss10_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo ss10_type = { static const TypeInfo ss10_type = {
@ -1453,6 +1446,7 @@ static void ss600mp_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo ss600mp_type = { static const TypeInfo ss600mp_type = {
@ -1472,6 +1466,7 @@ static void ss20_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-SuperSparc-II");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo ss20_type = { static const TypeInfo ss20_type = {
@ -1490,6 +1485,7 @@ static void voyager_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo voyager_type = { static const TypeInfo voyager_type = {
@ -1508,6 +1504,7 @@ static void ss_lx_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo ss_lx_type = { static const TypeInfo ss_lx_type = {
@ -1526,6 +1523,7 @@ static void ss4_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Fujitsu-MB86904");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo ss4_type = { static const TypeInfo ss4_type = {
@ -1544,6 +1542,7 @@ static void scls_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo scls_type = { static const TypeInfo scls_type = {
@ -1562,6 +1561,7 @@ static void sbook_class_init(ObjectClass *oc, void *data)
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("TI-MicroSparc-I");
mc->default_display = "tcx"; mc->default_display = "tcx";
mc->default_ram_id = "sun4m.ram";
} }
static const TypeInfo sbook_type = { static const TypeInfo sbook_type = {

View File

@ -40,7 +40,6 @@
typedef struct NiagaraBoardState { typedef struct NiagaraBoardState {
MemoryRegion hv_ram; MemoryRegion hv_ram;
MemoryRegion partition_ram;
MemoryRegion nvram; MemoryRegion nvram;
MemoryRegion md_rom; MemoryRegion md_rom;
MemoryRegion hv_rom; MemoryRegion hv_rom;
@ -111,11 +110,8 @@ static void niagara_init(MachineState *machine)
NIAGARA_HV_RAM_SIZE, &error_fatal); NIAGARA_HV_RAM_SIZE, &error_fatal);
memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram); memory_region_add_subregion(sysmem, NIAGARA_HV_RAM_BASE, &s->hv_ram);
memory_region_allocate_system_memory(&s->partition_ram, NULL,
"sun4v-partition.ram",
machine->ram_size);
memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE, memory_region_add_subregion(sysmem, NIAGARA_PARTITION_RAM_BASE,
&s->partition_ram); machine->ram);
memory_region_init_ram(&s->nvram, NULL, "sun4v.nvram", NIAGARA_NVRAM_SIZE, memory_region_init_ram(&s->nvram, NULL, "sun4v.nvram", NIAGARA_NVRAM_SIZE,
&error_fatal); &error_fatal);
@ -173,6 +169,7 @@ static void niagara_class_init(ObjectClass *oc, void *data)
mc->max_cpus = 1; /* XXX for now */ mc->max_cpus = 1; /* XXX for now */
mc->default_boot_order = "c"; mc->default_boot_order = "c";
mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Sun-UltraSparc-T1"); mc->default_cpu_type = SPARC_CPU_TYPE_NAME("Sun-UltraSparc-T1");
mc->default_ram_id = "sun4v-partition.ram";
} }
static const TypeInfo niagara_type = { static const TypeInfo niagara_type = {

View File

@ -4,6 +4,7 @@
#define HW_BOARDS_H #define HW_BOARDS_H
#include "exec/memory.h" #include "exec/memory.h"
#include "sysemu/hostmem.h"
#include "sysemu/blockdev.h" #include "sysemu/blockdev.h"
#include "sysemu/accel.h" #include "sysemu/accel.h"
#include "qapi/qapi-types-machine.h" #include "qapi/qapi-types-machine.h"
@ -11,38 +12,6 @@
#include "qom/object.h" #include "qom/object.h"
#include "hw/core/cpu.h" #include "hw/core/cpu.h"
/**
* memory_region_allocate_system_memory - Allocate a board's main memory
* @mr: the #MemoryRegion to be initialized
* @owner: the object that tracks the region's reference count
* @name: name of the memory region
* @ram_size: size of the region in bytes
*
* This function allocates the main memory for a board model, and
* initializes @mr appropriately. It also arranges for the memory
* to be migrated (by calling vmstate_register_ram_global()).
*
* Memory allocated via this function will be backed with the memory
* backend the user provided using "-mem-path" or "-numa node,memdev=..."
* if appropriate; this is typically used to cause host huge pages to be
* used. This function should therefore be called by a board exactly once,
* for the primary or largest RAM area it implements.
*
* For boards where the major RAM is split into two parts in the memory
* map, you can deal with this by calling memory_region_allocate_system_memory()
* once to get a MemoryRegion with enough RAM for both parts, and then
* creating alias MemoryRegions via memory_region_init_alias() which
* alias into different parts of the RAM MemoryRegion and can be mapped
* into the memory map in the appropriate places.
*
* Smaller pieces of memory (display RAM, static RAMs, etc) don't need
* to be backed via the -mem-path memory backend and can simply
* be created via memory_region_init_ram().
*/
void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
const char *name,
uint64_t ram_size);
#define TYPE_MACHINE_SUFFIX "-machine" #define TYPE_MACHINE_SUFFIX "-machine"
/* Machine class name that needs to be used for class-name-based machine /* Machine class name that needs to be used for class-name-based machine
@ -72,7 +41,12 @@ void machine_set_cpu_numa_node(MachineState *machine,
Error **errp); Error **errp);
void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type); void machine_class_allow_dynamic_sysbus_dev(MachineClass *mc, const char *type);
/*
* Checks that backend isn't used, preps it for exclusive usage and
* returns migratable MemoryRegion provided by backend.
*/
MemoryRegion *machine_consume_memdev(MachineState *machine,
HostMemoryBackend *backend);
/** /**
* CPUArchId: * CPUArchId:
@ -169,6 +143,13 @@ typedef struct {
* false is returned, an error must be set to show the reason of * false is returned, an error must be set to show the reason of
* the rejection. If the hook is not provided, all hotplug will be * the rejection. If the hook is not provided, all hotplug will be
* allowed. * allowed.
* @default_ram_id:
* Specifies inital RAM MemoryRegion name to be used for default backend
* creation if user explicitly hasn't specified backend with "memory-backend"
* property.
* It also will be used as a way to optin into "-m" option support.
* If it's not set by board, '-m' will be ignored and generic code will
* not create default RAM MemoryRegion.
*/ */
struct MachineClass { struct MachineClass {
/*< private >*/ /*< private >*/
@ -225,6 +206,7 @@ struct MachineClass {
bool nvdimm_supported; bool nvdimm_supported;
bool numa_mem_supported; bool numa_mem_supported;
bool auto_enable_numa; bool auto_enable_numa;
const char *default_ram_id;
HotplugHandler *(*get_hotplug_handler)(MachineState *machine, HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
DeviceState *dev); DeviceState *dev);
@ -285,6 +267,12 @@ struct MachineState {
bool enforce_config_section; bool enforce_config_section;
bool enable_graphics; bool enable_graphics;
char *memory_encryption; char *memory_encryption;
char *ram_memdev_id;
/*
* convenience alias to ram_memdev_id backend memory region
* or to numa container memory region
*/
MemoryRegion *ram;
DeviceMemoryState *device_memory; DeviceMemoryState *device_memory;
ram_addr_t ram_size; ram_addr_t ram_size;

View File

@ -40,6 +40,7 @@ typedef struct AspeedSDMCClass {
SysBusDeviceClass parent_class; SysBusDeviceClass parent_class;
uint64_t max_ram_size; uint64_t max_ram_size;
const uint64_t *valid_ram_sizes;
uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data); uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data);
void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data); void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data);
} AspeedSDMCClass; } AspeedSDMCClass;

View File

@ -42,11 +42,10 @@ enum {
qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs, qemu_irq *ppcuic_init (CPUPPCState *env, qemu_irq *irqs,
uint32_t dcr_base, int has_ssr, int has_vr); uint32_t dcr_base, int has_ssr, int has_vr);
ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks, void ppc4xx_sdram_banks(MemoryRegion *ram, int nr_banks,
MemoryRegion ram_memories[], MemoryRegion ram_memories[],
hwaddr ram_bases[], hwaddr ram_bases[], hwaddr ram_sizes[],
hwaddr ram_sizes[], const ram_addr_t sdram_bank_sizes[]);
const ram_addr_t sdram_bank_sizes[]);
void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks, void ppc4xx_sdram_init (CPUPPCState *env, qemu_irq irq, int nbanks,
MemoryRegion ram_memories[], MemoryRegion ram_memories[],

View File

@ -27,6 +27,22 @@
#define MEMORY_BACKEND_CLASS(klass) \ #define MEMORY_BACKEND_CLASS(klass) \
OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND) OBJECT_CLASS_CHECK(HostMemoryBackendClass, (klass), TYPE_MEMORY_BACKEND)
/* hostmem-ram.c */
/**
* @TYPE_MEMORY_BACKEND_RAM:
* name of backend that uses mmap on the anonymous RAM
*/
#define TYPE_MEMORY_BACKEND_RAM "memory-backend-ram"
/* hostmem-file.c */
/**
* @TYPE_MEMORY_BACKEND_FILE:
* name of backend that uses mmap on a file descriptor
*/
#define TYPE_MEMORY_BACKEND_FILE "memory-backend-file"
typedef struct HostMemoryBackend HostMemoryBackend;
typedef struct HostMemoryBackendClass HostMemoryBackendClass; typedef struct HostMemoryBackendClass HostMemoryBackendClass;
/** /**
@ -45,6 +61,7 @@ struct HostMemoryBackendClass {
* @parent: opaque parent object container * @parent: opaque parent object container
* @size: amount of memory backend provides * @size: amount of memory backend provides
* @mr: MemoryRegion representing host memory belonging to backend * @mr: MemoryRegion representing host memory belonging to backend
* @prealloc_threads: number of threads to be used for preallocatining RAM
*/ */
struct HostMemoryBackend { struct HostMemoryBackend {
/* private */ /* private */
@ -53,7 +70,8 @@ struct HostMemoryBackend {
/* protected */ /* protected */
uint64_t size; uint64_t size;
bool merge, dump, use_canonical_path; bool merge, dump, use_canonical_path;
bool prealloc, force_prealloc, is_mapped, share; bool prealloc, is_mapped, share;
uint32_t prealloc_threads;
DECLARE_BITMAP(host_nodes, MAX_NODES + 1); DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
HostMemPolicy policy; HostMemPolicy policy;

View File

@ -112,5 +112,6 @@ void numa_default_auto_assign_ram(MachineClass *mc, NodeInfo *nodes,
int nb_nodes, ram_addr_t size); int nb_nodes, ram_addr_t size);
void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev, void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev,
Error **errp); Error **errp);
bool numa_uses_legacy_mem(void);
#endif #endif

View File

@ -50,8 +50,6 @@ extern uint8_t *boot_splash_filedata;
extern bool enable_mlock; extern bool enable_mlock;
extern bool enable_cpu_pm; extern bool enable_cpu_pm;
extern QEMUClockType rtc_clock; extern QEMUClockType rtc_clock;
extern const char *mem_path;
extern int mem_prealloc;
#define MAX_OPTION_ROMS 16 #define MAX_OPTION_ROMS 16
typedef struct QEMUOptionRom { typedef struct QEMUOptionRom {

View File

@ -113,15 +113,6 @@ QEMU using implicit generic or board specific splitting rule.
Use @option{memdev} with @var{memory-backend-ram} backend or @option{mem} (if Use @option{memdev} with @var{memory-backend-ram} backend or @option{mem} (if
it's supported by used machine type) to define mapping explictly instead. it's supported by used machine type) to define mapping explictly instead.
@subsection -mem-path fallback to RAM (since 4.1)
Currently if guest RAM allocation from file pointed by @option{mem-path}
fails, QEMU falls back to allocating from RAM, which might result
in unpredictable behavior since the backing file specified by the user
is ignored. In the future, users will be responsible for making sure
the backing storage specified with @option{-mem-path} can actually provide
the guest RAM configured with @option{-m} and QEMU will fail to start up if
RAM allocation is unsuccessful.
@subsection RISC-V -bios (since 4.1) @subsection RISC-V -bios (since 4.1)
QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the

View File

@ -56,6 +56,7 @@
#include "ui/input.h" #include "ui/input.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "sysemu/numa.h" #include "sysemu/numa.h"
#include "sysemu/hostmem.h"
#include "exec/gdbstub.h" #include "exec/gdbstub.h"
#include "qemu/timer.h" #include "qemu/timer.h"
#include "chardev/char.h" #include "chardev/char.h"
@ -120,8 +121,6 @@ enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB;
int display_opengl; int display_opengl;
const char* keyboard_layout = NULL; const char* keyboard_layout = NULL;
ram_addr_t ram_size; ram_addr_t ram_size;
const char *mem_path = NULL;
int mem_prealloc = 0; /* force preallocation of physical target memory */
bool enable_mlock = false; bool enable_mlock = false;
bool enable_cpu_pm = false; bool enable_cpu_pm = false;
int nb_nics; int nb_nics;
@ -2635,6 +2634,29 @@ static void set_memory_options(uint64_t *ram_slots, ram_addr_t *maxram_size,
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (current_machine->ram_memdev_id) {
Object *backend;
ram_addr_t backend_size;
backend = object_resolve_path_type(current_machine->ram_memdev_id,
TYPE_MEMORY_BACKEND, NULL);
backend_size = object_property_get_uint(backend, "size", &error_abort);
if (mem_str && backend_size != ram_size) {
error_report("Size specified by -m option must match size of "
"explicitly specified 'memory-backend' property");
exit(EXIT_FAILURE);
}
ram_size = backend_size;
}
if (!xen_enabled()) {
/* On 32-bit hosts, QEMU is limited by virtual address space */
if (ram_size > (2047 << 20) && HOST_LONG_BITS == 32) {
error_report("at most 2047 MB RAM can be simulated");
exit(1);
}
}
loc_pop(&loc); loc_pop(&loc);
} }
@ -2786,6 +2808,24 @@ static void configure_accelerators(const char *progname)
} }
} }
static void create_default_memdev(MachineState *ms, const char *path)
{
Object *obj;
MachineClass *mc = MACHINE_GET_CLASS(ms);
obj = object_new(path ? TYPE_MEMORY_BACKEND_FILE : TYPE_MEMORY_BACKEND_RAM);
if (path) {
object_property_set_str(obj, path, "mem-path", &error_fatal);
}
object_property_set_int(obj, ms->ram_size, "size", &error_fatal);
object_property_add_child(object_get_objects_root(), mc->default_ram_id,
obj, &error_fatal);
user_creatable_complete(USER_CREATABLE(obj), &error_fatal);
object_unref(obj);
object_property_set_str(OBJECT(ms), mc->default_ram_id, "memory-backend",
&error_fatal);
}
void qemu_init(int argc, char **argv, char **envp) void qemu_init(int argc, char **argv, char **envp)
{ {
int i; int i;
@ -2820,8 +2860,10 @@ void qemu_init(int argc, char **argv, char **envp)
Error *err = NULL; Error *err = NULL;
bool list_data_dirs = false; bool list_data_dirs = false;
char *dir, **dirs; char *dir, **dirs;
const char *mem_path = NULL;
BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue); BlockdevOptionsQueue bdo_queue = QSIMPLEQ_HEAD_INITIALIZER(bdo_queue);
QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list); QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
int mem_prealloc = 0; /* force preallocation of physical target memory */
os_set_line_buffering(); os_set_line_buffering();
@ -3779,8 +3821,6 @@ void qemu_init(int argc, char **argv, char **envp)
machine_class = select_machine(); machine_class = select_machine();
object_set_machine_compat_props(machine_class->compat_props); object_set_machine_compat_props(machine_class->compat_props);
set_memory_options(&ram_slots, &maxram_size, machine_class);
os_daemonize(); os_daemonize();
/* /*
@ -3929,6 +3969,15 @@ void qemu_init(int argc, char **argv, char **envp)
exit(1); exit(1);
} }
if (mem_prealloc) {
char *val;
val = g_strdup_printf("%d", current_machine->smp.cpus);
object_register_sugar_prop("memory-backend", "prealloc-threads", val);
g_free(val);
object_register_sugar_prop("memory-backend", "prealloc", "on");
}
/* /*
* Get the default machine options from the machine if it is not already * Get the default machine options from the machine if it is not already
* specified either by the configuration file or by the command line. * specified either by the configuration file or by the command line.
@ -4092,9 +4141,6 @@ void qemu_init(int argc, char **argv, char **envp)
machine_opts = qemu_get_machine_opts(); machine_opts = qemu_get_machine_opts();
qemu_opt_foreach(machine_opts, machine_set_property, current_machine, qemu_opt_foreach(machine_opts, machine_set_property, current_machine,
&error_fatal); &error_fatal);
current_machine->ram_size = ram_size;
current_machine->maxram_size = maxram_size;
current_machine->ram_slots = ram_slots;
/* /*
* Note: uses machine properties such as kernel-irqchip, must run * Note: uses machine properties such as kernel-irqchip, must run
@ -4205,14 +4251,6 @@ void qemu_init(int argc, char **argv, char **envp)
tpm_init(); tpm_init();
if (!xen_enabled()) {
/* On 32-bit hosts, QEMU is limited by virtual address space */
if (ram_size > (2047 << 20) && HOST_LONG_BITS == 32) {
error_report("at most 2047 MB RAM can be simulated");
exit(1);
}
}
blk_mig_init(); blk_mig_init();
ram_mig_init(); ram_mig_init();
dirty_bitmap_mig_init(); dirty_bitmap_mig_init();
@ -4257,8 +4295,18 @@ void qemu_init(int argc, char **argv, char **envp)
if (cpu_option) { if (cpu_option) {
current_machine->cpu_type = parse_cpu_option(cpu_option); current_machine->cpu_type = parse_cpu_option(cpu_option);
} }
set_memory_options(&ram_slots, &maxram_size, machine_class);
current_machine->ram_size = ram_size;
current_machine->maxram_size = maxram_size;
current_machine->ram_slots = ram_slots;
parse_numa_opts(current_machine); parse_numa_opts(current_machine);
if (machine_class->default_ram_id && current_machine->ram_size &&
numa_uses_legacy_mem() && !current_machine->ram_memdev_id) {
create_default_memdev(current_machine, mem_path);
}
/* do monitor/qmp handling at preconfig state if requested */ /* do monitor/qmp handling at preconfig state if requested */
qemu_main_loop(); qemu_main_loop();

View File

@ -14,67 +14,60 @@
#include "qapi/qmp/qdict.h" #include "qapi/qmp/qdict.h"
#include "qapi/qmp/qlist.h" #include "qapi/qmp/qlist.h"
static char *make_cli(const char *generic_cli, const char *test_cli) static char *make_cli(const GString *generic_cli, const char *test_cli)
{ {
return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli); return g_strdup_printf("%s %s", generic_cli->str, test_cli);
} }
static void test_mon_explicit(const void *data) static void test_mon_explicit(const void *data)
{ {
char *s;
char *cli;
QTestState *qts; QTestState *qts;
g_autofree char *s = NULL;
g_autofree char *cli = NULL;
cli = make_cli(data, "-smp 8 " cli = make_cli(data, "-smp 8 -numa node,nodeid=0,memdev=ram,cpus=0-3 "
"-numa node,nodeid=0,cpus=0-3 " "-numa node,nodeid=1,cpus=4-7");
"-numa node,nodeid=1,cpus=4-7 ");
qts = qtest_init(cli); qts = qtest_init(cli);
s = qtest_hmp(qts, "info numa"); s = qtest_hmp(qts, "info numa");
g_assert(strstr(s, "node 0 cpus: 0 1 2 3")); g_assert(strstr(s, "node 0 cpus: 0 1 2 3"));
g_assert(strstr(s, "node 1 cpus: 4 5 6 7")); g_assert(strstr(s, "node 1 cpus: 4 5 6 7"));
g_free(s);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static void test_mon_default(const void *data) static void test_def_cpu_split(const void *data)
{ {
char *s;
char *cli;
QTestState *qts; QTestState *qts;
g_autofree char *s = NULL;
g_autofree char *cli = NULL;
cli = make_cli(data, "-smp 8 -numa node -numa node"); cli = make_cli(data, "-smp 8 -numa node,memdev=ram -numa node");
qts = qtest_init(cli); qts = qtest_init(cli);
s = qtest_hmp(qts, "info numa"); s = qtest_hmp(qts, "info numa");
g_assert(strstr(s, "node 0 cpus: 0 2 4 6")); g_assert(strstr(s, "node 0 cpus: 0 2 4 6"));
g_assert(strstr(s, "node 1 cpus: 1 3 5 7")); g_assert(strstr(s, "node 1 cpus: 1 3 5 7"));
g_free(s);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static void test_mon_partial(const void *data) static void test_mon_partial(const void *data)
{ {
char *s;
char *cli;
QTestState *qts; QTestState *qts;
g_autofree char *s = NULL;
g_autofree char *cli = NULL;
cli = make_cli(data, "-smp 8 " cli = make_cli(data, "-smp 8 "
"-numa node,nodeid=0,cpus=0-1 " "-numa node,nodeid=0,memdev=ram,cpus=0-1 "
"-numa node,nodeid=1,cpus=4-5 "); "-numa node,nodeid=1,cpus=4-5 ");
qts = qtest_init(cli); qts = qtest_init(cli);
s = qtest_hmp(qts, "info numa"); s = qtest_hmp(qts, "info numa");
g_assert(strstr(s, "node 0 cpus: 0 1 2 3 6 7")); g_assert(strstr(s, "node 0 cpus: 0 1 2 3 6 7"));
g_assert(strstr(s, "node 1 cpus: 4 5")); g_assert(strstr(s, "node 1 cpus: 4 5"));
g_free(s);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static QList *get_cpus(QTestState *qts, QDict **resp) static QList *get_cpus(QTestState *qts, QDict **resp)
@ -87,13 +80,14 @@ static QList *get_cpus(QTestState *qts, QDict **resp)
static void test_query_cpus(const void *data) static void test_query_cpus(const void *data)
{ {
char *cli;
QDict *resp; QDict *resp;
QList *cpus; QList *cpus;
QObject *e; QObject *e;
QTestState *qts; QTestState *qts;
g_autofree char *cli = NULL;
cli = make_cli(data, "-smp 8 -numa node,cpus=0-3 -numa node,cpus=4-7"); cli = make_cli(data, "-smp 8 -numa node,memdev=ram,cpus=0-3 "
"-numa node,cpus=4-7");
qts = qtest_init(cli); qts = qtest_init(cli);
cpus = get_cpus(qts, &resp); cpus = get_cpus(qts, &resp);
g_assert(cpus); g_assert(cpus);
@ -120,19 +114,18 @@ static void test_query_cpus(const void *data)
qobject_unref(resp); qobject_unref(resp);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static void pc_numa_cpu(const void *data) static void pc_numa_cpu(const void *data)
{ {
char *cli;
QDict *resp; QDict *resp;
QList *cpus; QList *cpus;
QObject *e; QObject *e;
QTestState *qts; QTestState *qts;
g_autofree char *cli = NULL;
cli = make_cli(data, "-cpu pentium -smp 8,sockets=2,cores=2,threads=2 " cli = make_cli(data, "-cpu pentium -smp 8,sockets=2,cores=2,threads=2 "
"-numa node,nodeid=0 -numa node,nodeid=1 " "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
"-numa cpu,node-id=1,socket-id=0 " "-numa cpu,node-id=1,socket-id=0 "
"-numa cpu,node-id=0,socket-id=1,core-id=0 " "-numa cpu,node-id=0,socket-id=1,core-id=0 "
"-numa cpu,node-id=0,socket-id=1,core-id=1,thread-id=0 " "-numa cpu,node-id=0,socket-id=1,core-id=1,thread-id=0 "
@ -174,19 +167,18 @@ static void pc_numa_cpu(const void *data)
qobject_unref(resp); qobject_unref(resp);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static void spapr_numa_cpu(const void *data) static void spapr_numa_cpu(const void *data)
{ {
char *cli;
QDict *resp; QDict *resp;
QList *cpus; QList *cpus;
QObject *e; QObject *e;
QTestState *qts; QTestState *qts;
g_autofree char *cli = NULL;
cli = make_cli(data, "-smp 4,cores=4 " cli = make_cli(data, "-smp 4,cores=4 "
"-numa node,nodeid=0 -numa node,nodeid=1 " "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
"-numa cpu,node-id=0,core-id=0 " "-numa cpu,node-id=0,core-id=0 "
"-numa cpu,node-id=0,core-id=1 " "-numa cpu,node-id=0,core-id=1 "
"-numa cpu,node-id=0,core-id=2 " "-numa cpu,node-id=0,core-id=2 "
@ -220,19 +212,18 @@ static void spapr_numa_cpu(const void *data)
qobject_unref(resp); qobject_unref(resp);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static void aarch64_numa_cpu(const void *data) static void aarch64_numa_cpu(const void *data)
{ {
char *cli;
QDict *resp; QDict *resp;
QList *cpus; QList *cpus;
QObject *e; QObject *e;
QTestState *qts; QTestState *qts;
g_autofree char *cli = NULL;
cli = make_cli(data, "-smp 2 " cli = make_cli(data, "-smp 2 "
"-numa node,nodeid=0 -numa node,nodeid=1 " "-numa node,nodeid=0,memdev=ram -numa node,nodeid=1 "
"-numa cpu,node-id=1,thread-id=0 " "-numa cpu,node-id=1,thread-id=0 "
"-numa cpu,node-id=0,thread-id=1"); "-numa cpu,node-id=0,thread-id=1");
qts = qtest_init(cli); qts = qtest_init(cli);
@ -264,7 +255,6 @@ static void aarch64_numa_cpu(const void *data)
qobject_unref(resp); qobject_unref(resp);
qtest_quit(qts); qtest_quit(qts);
g_free(cli);
} }
static void pc_dynamic_cpu_cfg(const void *data) static void pc_dynamic_cpu_cfg(const void *data)
@ -273,13 +263,14 @@ static void pc_dynamic_cpu_cfg(const void *data)
QDict *resp; QDict *resp;
QList *cpus; QList *cpus;
QTestState *qs; QTestState *qs;
g_autofree char *cli = NULL;
qs = qtest_initf("%s -nodefaults --preconfig -smp 2", cli = make_cli(data, "-nodefaults --preconfig -smp 2");
data ? (char *)data : ""); qs = qtest_init(cli);
/* create 2 numa nodes */ /* create 2 numa nodes */
g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node'," g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
" 'arguments': { 'type': 'node', 'nodeid': 0 } }"))); " 'arguments': { 'type': 'node', 'nodeid': 0, 'memdev': 'ram' } }")));
g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node'," g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
" 'arguments': { 'type': 'node', 'nodeid': 1 } }"))); " 'arguments': { 'type': 'node', 'nodeid': 1 } }")));
@ -329,16 +320,19 @@ static void pc_dynamic_cpu_cfg(const void *data)
static void pc_hmat_build_cfg(const void *data) static void pc_hmat_build_cfg(const void *data)
{ {
QTestState *qs = qtest_initf("%s -nodefaults --preconfig -machine hmat=on " QTestState *qs;
"-smp 2,sockets=2 " g_autofree char *cli = NULL;
"-m 128M,slots=2,maxmem=1G "
"-object memory-backend-ram,size=64M,id=m0 " cli = make_cli(data, "-nodefaults --preconfig -machine hmat=on "
"-object memory-backend-ram,size=64M,id=m1 " "-smp 2,sockets=2 "
"-numa node,nodeid=0,memdev=m0 " "-m 128M,slots=2,maxmem=1G "
"-numa node,nodeid=1,memdev=m1,initiator=0 " "-object memory-backend-ram,size=64M,id=m0 "
"-numa cpu,node-id=0,socket-id=0 " "-object memory-backend-ram,size=64M,id=m1 "
"-numa cpu,node-id=0,socket-id=1", "-numa node,nodeid=0,memdev=m0 "
data ? (char *)data : ""); "-numa node,nodeid=1,memdev=m1,initiator=0 "
"-numa cpu,node-id=0,socket-id=0 "
"-numa cpu,node-id=0,socket-id=1");
qs = qtest_init(cli);
/* Fail: Initiator should be less than the number of nodes */ /* Fail: Initiator should be less than the number of nodes */
g_assert_true(qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node'," g_assert_true(qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
@ -455,13 +449,16 @@ static void pc_hmat_build_cfg(const void *data)
static void pc_hmat_off_cfg(const void *data) static void pc_hmat_off_cfg(const void *data)
{ {
QTestState *qs = qtest_initf("%s -nodefaults --preconfig " QTestState *qs;
"-smp 2,sockets=2 " g_autofree char *cli = NULL;
"-m 128M,slots=2,maxmem=1G "
"-object memory-backend-ram,size=64M,id=m0 " cli = make_cli(data, "-nodefaults --preconfig "
"-object memory-backend-ram,size=64M,id=m1 " "-smp 2,sockets=2 "
"-numa node,nodeid=0,memdev=m0", "-m 128M,slots=2,maxmem=1G "
data ? (char *)data : ""); "-object memory-backend-ram,size=64M,id=m0 "
"-object memory-backend-ram,size=64M,id=m1 "
"-numa node,nodeid=0,memdev=m0");
qs = qtest_init(cli);
/* /*
* Fail: Enable HMAT with -machine hmat=on * Fail: Enable HMAT with -machine hmat=on
@ -491,16 +488,19 @@ static void pc_hmat_off_cfg(const void *data)
static void pc_hmat_erange_cfg(const void *data) static void pc_hmat_erange_cfg(const void *data)
{ {
QTestState *qs = qtest_initf("%s -nodefaults --preconfig -machine hmat=on " QTestState *qs;
"-smp 2,sockets=2 " g_autofree char *cli = NULL;
"-m 128M,slots=2,maxmem=1G "
"-object memory-backend-ram,size=64M,id=m0 " cli = make_cli(data, "-nodefaults --preconfig -machine hmat=on "
"-object memory-backend-ram,size=64M,id=m1 " "-smp 2,sockets=2 "
"-numa node,nodeid=0,memdev=m0 " "-m 128M,slots=2,maxmem=1G "
"-numa node,nodeid=1,memdev=m1,initiator=0 " "-object memory-backend-ram,size=64M,id=m0 "
"-numa cpu,node-id=0,socket-id=0 " "-object memory-backend-ram,size=64M,id=m1 "
"-numa cpu,node-id=0,socket-id=1", "-numa node,nodeid=0,memdev=m0 "
data ? (char *)data : ""); "-numa node,nodeid=1,memdev=m1,initiator=0 "
"-numa cpu,node-id=0,socket-id=0 "
"-numa cpu,node-id=0,socket-id=1");
qs = qtest_init(cli);
/* Can't store the compressed latency */ /* Can't store the compressed latency */
g_assert_false(qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node'," g_assert_false(qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node',"
@ -539,16 +539,22 @@ static void pc_hmat_erange_cfg(const void *data)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
const char *args = NULL; g_autoptr(GString) args = g_string_new(NULL);
const char *arch = qtest_get_arch(); const char *arch = qtest_get_arch();
if (strcmp(arch, "aarch64") == 0) { if (g_str_equal(arch, "ppc64")) {
args = "-machine virt"; g_string_append(args, " -object memory-backend-ram,id=ram,size=512M");
} else {
g_string_append(args, " -object memory-backend-ram,id=ram,size=128M");
}
if (g_str_equal(arch, "aarch64")) {
g_string_append(args, " -machine virt");
} }
g_test_init(&argc, &argv, NULL); g_test_init(&argc, &argv, NULL);
qtest_add_data_func("/numa/mon/default", args, test_mon_default); qtest_add_data_func("/numa/mon/cpus/default", args, test_def_cpu_split);
qtest_add_data_func("/numa/mon/cpus/explicit", args, test_mon_explicit); qtest_add_data_func("/numa/mon/cpus/explicit", args, test_mon_explicit);
qtest_add_data_func("/numa/mon/cpus/partial", args, test_mon_partial); qtest_add_data_func("/numa/mon/cpus/partial", args, test_mon_partial);
qtest_add_data_func("/numa/qmp/cpus/query-cpus", args, test_query_cpus); qtest_add_data_func("/numa/qmp/cpus/query-cpus", args, test_query_cpus);