mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
ramblocks: Make use of DeviceState pointer and BusInfo.get_dev_path
With these two pieces in place, we can start naming ramblocks. When the device is present and it lives on a bus that provides a device path, we concatenate the path and the provided name. Otherwise we just use name. The resulting id string must be unique. For now we assume an allocation for the same name and size is a device that has been removed and reinserted and return the same block. This will go away once qemu_ram_free() is implemented. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
1724f04985
commit
cc9e98cb8f
2 changed files with 28 additions and 2 deletions
29
exec.c
29
exec.c
|
@ -36,6 +36,7 @@
|
|||
#include "qemu-common.h"
|
||||
#include "tcg.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/qdev.h"
|
||||
#include "osdep.h"
|
||||
#include "kvm.h"
|
||||
#include "qemu-timer.h"
|
||||
|
@ -2780,10 +2781,34 @@ static ram_addr_t find_ram_offset(ram_addr_t size)
|
|||
|
||||
ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
|
||||
{
|
||||
RAMBlock *new_block;
|
||||
RAMBlock *new_block, *block;
|
||||
|
||||
size = TARGET_PAGE_ALIGN(size);
|
||||
new_block = qemu_malloc(sizeof(*new_block));
|
||||
new_block = qemu_mallocz(sizeof(*new_block));
|
||||
|
||||
if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
|
||||
char *id = dev->parent_bus->info->get_dev_path(dev);
|
||||
if (id) {
|
||||
snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
|
||||
qemu_free(id);
|
||||
}
|
||||
}
|
||||
pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
|
||||
|
||||
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
||||
if (!strcmp(block->idstr, new_block->idstr)) {
|
||||
if (block->length == new_block->length) {
|
||||
fprintf(stderr, "RAMBlock \"%s\" exists, assuming lack of"
|
||||
"free.\n", new_block->idstr);
|
||||
qemu_free(new_block);
|
||||
return block->offset;
|
||||
} else {
|
||||
fprintf(stderr, "RAMBlock \"%s\" already registered with"
|
||||
"different size, abort\n", new_block->idstr);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mem_path) {
|
||||
#if defined (__linux__) && !defined(TARGET_S390X)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue