提交 cc9e98cb 编写于 作者: A Alex Williamson 提交者: Anthony Liguori

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: NAlex Williamson <alex.williamson@redhat.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 1724f049
...@@ -865,6 +865,7 @@ typedef struct RAMBlock { ...@@ -865,6 +865,7 @@ typedef struct RAMBlock {
uint8_t *host; uint8_t *host;
ram_addr_t offset; ram_addr_t offset;
ram_addr_t length; ram_addr_t length;
char idstr[256];
QLIST_ENTRY(RAMBlock) next; QLIST_ENTRY(RAMBlock) next;
} RAMBlock; } RAMBlock;
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "qemu-common.h" #include "qemu-common.h"
#include "tcg.h" #include "tcg.h"
#include "hw/hw.h" #include "hw/hw.h"
#include "hw/qdev.h"
#include "osdep.h" #include "osdep.h"
#include "kvm.h" #include "kvm.h"
#include "qemu-timer.h" #include "qemu-timer.h"
...@@ -2780,10 +2781,34 @@ static ram_addr_t find_ram_offset(ram_addr_t size) ...@@ -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) 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); 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 (mem_path) {
#if defined (__linux__) && !defined(TARGET_S390X) #if defined (__linux__) && !defined(TARGET_S390X)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册