mirror of https://github.com/xqemu/xqemu.git
Merge remote-tracking branch 'agraf/xen-next' into staging
This commit is contained in:
commit
03ff09580e
|
@ -155,8 +155,8 @@ slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
|
||||||
common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
|
common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
|
||||||
|
|
||||||
# xen backend driver support
|
# xen backend driver support
|
||||||
common-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
|
common-obj-$(CONFIG_XEN_BACKEND) += xen_backend.o xen_devconfig.o
|
||||||
common-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
|
common-obj-$(CONFIG_XEN_BACKEND) += xen_console.o xenfb.o xen_disk.o xen_nic.o
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# libuser
|
# libuser
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
GENERATED_HEADERS = config-target.h
|
GENERATED_HEADERS = config-target.h
|
||||||
CONFIG_NO_PCI = $(if $(subst n,,$(CONFIG_PCI)),n,y)
|
CONFIG_NO_PCI = $(if $(subst n,,$(CONFIG_PCI)),n,y)
|
||||||
CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)
|
CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)
|
||||||
|
CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y)
|
||||||
|
|
||||||
include ../config-host.mak
|
include ../config-host.mak
|
||||||
include config-devices.mak
|
include config-devices.mak
|
||||||
|
@ -204,20 +205,9 @@ QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
|
||||||
QEMU_CFLAGS += $(VNC_JPEG_CFLAGS)
|
QEMU_CFLAGS += $(VNC_JPEG_CFLAGS)
|
||||||
QEMU_CFLAGS += $(VNC_PNG_CFLAGS)
|
QEMU_CFLAGS += $(VNC_PNG_CFLAGS)
|
||||||
|
|
||||||
# xen backend driver support
|
|
||||||
obj-i386-$(CONFIG_XEN) += xen_machine_pv.o xen_domainbuild.o
|
|
||||||
|
|
||||||
ifeq ($(TARGET_BASE_ARCH), i386)
|
|
||||||
CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y)
|
|
||||||
else
|
|
||||||
CONFIG_NO_XEN = y
|
|
||||||
endif
|
|
||||||
# xen support
|
# xen support
|
||||||
CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y)
|
obj-$(CONFIG_XEN) += xen-all.o xen_machine_pv.o xen_domainbuild.o xen-mapcache.o
|
||||||
obj-i386-$(CONFIG_XEN) += xen-all.o
|
|
||||||
obj-$(CONFIG_NO_XEN) += xen-stub.o
|
obj-$(CONFIG_NO_XEN) += xen-stub.o
|
||||||
obj-i386-$(CONFIG_XEN_MAPCACHE) += xen-mapcache.o
|
|
||||||
obj-$(CONFIG_NO_XEN_MAPCACHE) += xen-mapcache-stub.o
|
|
||||||
|
|
||||||
obj-i386-$(CONFIG_XEN) += xen_platform.o
|
obj-i386-$(CONFIG_XEN) += xen_platform.o
|
||||||
|
|
||||||
|
|
|
@ -2850,7 +2850,7 @@ if test "$bluez" = "yes" ; then
|
||||||
echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
|
echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
if test "$xen" = "yes" ; then
|
if test "$xen" = "yes" ; then
|
||||||
echo "CONFIG_XEN=y" >> $config_host_mak
|
echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
|
||||||
echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
|
echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
if test "$io_thread" = "yes" ; then
|
if test "$io_thread" = "yes" ; then
|
||||||
|
|
|
@ -65,7 +65,7 @@ void qemu_ram_free_from_ptr(ram_addr_t addr);
|
||||||
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length);
|
void qemu_ram_remap(ram_addr_t addr, ram_addr_t length);
|
||||||
/* This should only be used for ram local to a device. */
|
/* This should only be used for ram local to a device. */
|
||||||
void *qemu_get_ram_ptr(ram_addr_t addr);
|
void *qemu_get_ram_ptr(ram_addr_t addr);
|
||||||
void *qemu_ram_ptr_length(target_phys_addr_t addr, target_phys_addr_t *size);
|
void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size);
|
||||||
/* Same but slower, to use for migration, where the order of
|
/* Same but slower, to use for migration, where the order of
|
||||||
* RAMBlocks must not change. */
|
* RAMBlocks must not change. */
|
||||||
void *qemu_safe_ram_ptr(ram_addr_t addr);
|
void *qemu_safe_ram_ptr(ram_addr_t addr);
|
||||||
|
|
55
exec.c
55
exec.c
|
@ -2953,7 +2953,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (xen_mapcache_enabled()) {
|
if (xen_enabled()) {
|
||||||
xen_ram_alloc(new_block->offset, size);
|
xen_ram_alloc(new_block->offset, size);
|
||||||
} else {
|
} else {
|
||||||
new_block->host = qemu_vmalloc(size);
|
new_block->host = qemu_vmalloc(size);
|
||||||
|
@ -3019,8 +3019,8 @@ void qemu_ram_free(ram_addr_t addr)
|
||||||
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
|
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
|
||||||
munmap(block->host, block->length);
|
munmap(block->host, block->length);
|
||||||
#else
|
#else
|
||||||
if (xen_mapcache_enabled()) {
|
if (xen_enabled()) {
|
||||||
qemu_invalidate_entry(block->host);
|
xen_invalidate_map_cache_entry(block->host);
|
||||||
} else {
|
} else {
|
||||||
qemu_vfree(block->host);
|
qemu_vfree(block->host);
|
||||||
}
|
}
|
||||||
|
@ -3112,15 +3112,16 @@ void *qemu_get_ram_ptr(ram_addr_t addr)
|
||||||
QLIST_REMOVE(block, next);
|
QLIST_REMOVE(block, next);
|
||||||
QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
|
QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
|
||||||
}
|
}
|
||||||
if (xen_mapcache_enabled()) {
|
if (xen_enabled()) {
|
||||||
/* We need to check if the requested address is in the RAM
|
/* We need to check if the requested address is in the RAM
|
||||||
* because we don't want to map the entire memory in QEMU.
|
* because we don't want to map the entire memory in QEMU.
|
||||||
* In that case just map until the end of the page.
|
* In that case just map until the end of the page.
|
||||||
*/
|
*/
|
||||||
if (block->offset == 0) {
|
if (block->offset == 0) {
|
||||||
return qemu_map_cache(addr, 0, 0);
|
return xen_map_cache(addr, 0, 0);
|
||||||
} else if (block->host == NULL) {
|
} else if (block->host == NULL) {
|
||||||
block->host = qemu_map_cache(block->offset, block->length, 1);
|
block->host =
|
||||||
|
xen_map_cache(block->offset, block->length, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return block->host + (addr - block->offset);
|
return block->host + (addr - block->offset);
|
||||||
|
@ -3142,15 +3143,16 @@ void *qemu_safe_ram_ptr(ram_addr_t addr)
|
||||||
|
|
||||||
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
||||||
if (addr - block->offset < block->length) {
|
if (addr - block->offset < block->length) {
|
||||||
if (xen_mapcache_enabled()) {
|
if (xen_enabled()) {
|
||||||
/* We need to check if the requested address is in the RAM
|
/* We need to check if the requested address is in the RAM
|
||||||
* because we don't want to map the entire memory in QEMU.
|
* because we don't want to map the entire memory in QEMU.
|
||||||
* In that case just map until the end of the page.
|
* In that case just map until the end of the page.
|
||||||
*/
|
*/
|
||||||
if (block->offset == 0) {
|
if (block->offset == 0) {
|
||||||
return qemu_map_cache(addr, 0, 0);
|
return xen_map_cache(addr, 0, 0);
|
||||||
} else if (block->host == NULL) {
|
} else if (block->host == NULL) {
|
||||||
block->host = qemu_map_cache(block->offset, block->length, 1);
|
block->host =
|
||||||
|
xen_map_cache(block->offset, block->length, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return block->host + (addr - block->offset);
|
return block->host + (addr - block->offset);
|
||||||
|
@ -3165,11 +3167,14 @@ void *qemu_safe_ram_ptr(ram_addr_t addr)
|
||||||
|
|
||||||
/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
|
/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
|
||||||
* but takes a size argument */
|
* but takes a size argument */
|
||||||
void *qemu_ram_ptr_length(target_phys_addr_t addr, target_phys_addr_t *size)
|
void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
|
||||||
{
|
{
|
||||||
if (xen_mapcache_enabled())
|
if (*size == 0) {
|
||||||
return qemu_map_cache(addr, *size, 1);
|
return NULL;
|
||||||
else {
|
}
|
||||||
|
if (xen_enabled()) {
|
||||||
|
return xen_map_cache(addr, *size, 1);
|
||||||
|
} else {
|
||||||
RAMBlock *block;
|
RAMBlock *block;
|
||||||
|
|
||||||
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
||||||
|
@ -3182,9 +3187,6 @@ void *qemu_ram_ptr_length(target_phys_addr_t addr, target_phys_addr_t *size)
|
||||||
|
|
||||||
fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
|
fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
*size = 0;
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3198,8 +3200,8 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
|
||||||
RAMBlock *block;
|
RAMBlock *block;
|
||||||
uint8_t *host = ptr;
|
uint8_t *host = ptr;
|
||||||
|
|
||||||
if (xen_mapcache_enabled()) {
|
if (xen_enabled()) {
|
||||||
*ram_addr = qemu_ram_addr_from_mapcache(ptr);
|
*ram_addr = xen_ram_addr_from_mapcache(ptr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4050,7 +4052,9 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
|
||||||
target_phys_addr_t page;
|
target_phys_addr_t page;
|
||||||
unsigned long pd;
|
unsigned long pd;
|
||||||
PhysPageDesc *p;
|
PhysPageDesc *p;
|
||||||
target_phys_addr_t addr1 = addr;
|
ram_addr_t raddr = ULONG_MAX;
|
||||||
|
ram_addr_t rlen;
|
||||||
|
void *ret;
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
page = addr & TARGET_PAGE_MASK;
|
page = addr & TARGET_PAGE_MASK;
|
||||||
|
@ -4078,13 +4082,18 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
|
||||||
*plen = l;
|
*plen = l;
|
||||||
return bounce.buffer;
|
return bounce.buffer;
|
||||||
}
|
}
|
||||||
|
if (!todo) {
|
||||||
|
raddr = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
|
||||||
|
}
|
||||||
|
|
||||||
len -= l;
|
len -= l;
|
||||||
addr += l;
|
addr += l;
|
||||||
todo += l;
|
todo += l;
|
||||||
}
|
}
|
||||||
*plen = todo;
|
rlen = todo;
|
||||||
return qemu_ram_ptr_length(addr1, plen);
|
ret = qemu_ram_ptr_length(raddr, &rlen);
|
||||||
|
*plen = rlen;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
|
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
|
||||||
|
@ -4113,8 +4122,8 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
|
||||||
access_len -= l;
|
access_len -= l;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (xen_mapcache_enabled()) {
|
if (xen_enabled()) {
|
||||||
qemu_invalidate_entry(buffer);
|
xen_invalidate_map_cache_entry(buffer);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
10
hw/xen.h
10
hw/xen.h
|
@ -31,15 +31,6 @@ static inline int xen_enabled(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int xen_mapcache_enabled(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_XEN_MAPCACHE
|
|
||||||
return xen_enabled();
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
|
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
|
||||||
void xen_piix3_set_irq(void *opaque, int irq_num, int level);
|
void xen_piix3_set_irq(void *opaque, int irq_num, int level);
|
||||||
void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len);
|
void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len);
|
||||||
|
@ -50,6 +41,7 @@ qemu_irq *xen_interrupt_controller_init(void);
|
||||||
int xen_init(void);
|
int xen_init(void);
|
||||||
int xen_hvm_init(void);
|
int xen_hvm_init(void);
|
||||||
void xen_vcpu_init(void);
|
void xen_vcpu_init(void);
|
||||||
|
void xenstore_store_pv_console_info(int i, struct CharDriverState *chr);
|
||||||
|
|
||||||
#if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
|
#if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
|
||||||
void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size);
|
void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size);
|
||||||
|
|
|
@ -85,6 +85,18 @@ static inline int xc_domain_add_to_physmap(int xc_handle, uint32_t domid,
|
||||||
return xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
|
return xc_memory_op(xc_handle, XENMEM_add_to_physmap, &xatp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline struct xs_handle *xs_open(unsigned long flags)
|
||||||
|
{
|
||||||
|
return xs_daemon_open();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xs_close(struct xs_handle *xsh)
|
||||||
|
{
|
||||||
|
if (xsh != NULL) {
|
||||||
|
xs_daemon_close(xsh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Xen 4.1 */
|
/* Xen 4.1 */
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -179,7 +179,9 @@ static void xencons_send(struct XenConsole *con)
|
||||||
static int con_init(struct XenDevice *xendev)
|
static int con_init(struct XenDevice *xendev)
|
||||||
{
|
{
|
||||||
struct XenConsole *con = container_of(xendev, struct XenConsole, xendev);
|
struct XenConsole *con = container_of(xendev, struct XenConsole, xendev);
|
||||||
char *type, *dom;
|
char *type, *dom, label[32];
|
||||||
|
int ret = 0;
|
||||||
|
const char *output;
|
||||||
|
|
||||||
/* setup */
|
/* setup */
|
||||||
dom = xs_get_domain_path(xenstore, con->xendev.dom);
|
dom = xs_get_domain_path(xenstore, con->xendev.dom);
|
||||||
|
@ -189,16 +191,25 @@ static int con_init(struct XenDevice *xendev)
|
||||||
type = xenstore_read_str(con->console, "type");
|
type = xenstore_read_str(con->console, "type");
|
||||||
if (!type || strcmp(type, "ioemu") != 0) {
|
if (!type || strcmp(type, "ioemu") != 0) {
|
||||||
xen_be_printf(xendev, 1, "not for me (type=%s)\n", type);
|
xen_be_printf(xendev, 1, "not for me (type=%s)\n", type);
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!serial_hds[con->xendev.dev])
|
output = xenstore_read_str(con->console, "output");
|
||||||
xen_be_printf(xendev, 1, "WARNING: serial line %d not configured\n",
|
|
||||||
con->xendev.dev);
|
|
||||||
else
|
|
||||||
con->chr = serial_hds[con->xendev.dev];
|
|
||||||
|
|
||||||
return 0;
|
/* no Xen override, use qemu output device */
|
||||||
|
if (output == NULL) {
|
||||||
|
con->chr = serial_hds[con->xendev.dev];
|
||||||
|
} else {
|
||||||
|
snprintf(label, sizeof(label), "xencons%d", con->xendev.dev);
|
||||||
|
con->chr = qemu_chr_open(label, output, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
xenstore_store_pv_console_info(con->xendev.dev, con->chr);
|
||||||
|
|
||||||
|
out:
|
||||||
|
qemu_free(type);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int con_connect(struct XenDevice *xendev)
|
static int con_connect(struct XenDevice *xendev)
|
||||||
|
|
|
@ -616,12 +616,14 @@ static int blk_init(struct XenDevice *xendev)
|
||||||
{
|
{
|
||||||
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
||||||
int index, qflags, have_barriers, info = 0;
|
int index, qflags, have_barriers, info = 0;
|
||||||
char *h;
|
|
||||||
|
|
||||||
/* read xenstore entries */
|
/* read xenstore entries */
|
||||||
if (blkdev->params == NULL) {
|
if (blkdev->params == NULL) {
|
||||||
|
char *h = NULL;
|
||||||
blkdev->params = xenstore_read_be_str(&blkdev->xendev, "params");
|
blkdev->params = xenstore_read_be_str(&blkdev->xendev, "params");
|
||||||
h = strchr(blkdev->params, ':');
|
if (blkdev->params != NULL) {
|
||||||
|
h = strchr(blkdev->params, ':');
|
||||||
|
}
|
||||||
if (h != NULL) {
|
if (h != NULL) {
|
||||||
blkdev->fileproto = blkdev->params;
|
blkdev->fileproto = blkdev->params;
|
||||||
blkdev->filename = h+1;
|
blkdev->filename = h+1;
|
||||||
|
@ -631,6 +633,9 @@ static int blk_init(struct XenDevice *xendev)
|
||||||
blkdev->filename = blkdev->params;
|
blkdev->filename = blkdev->params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!strcmp("aio", blkdev->fileproto)) {
|
||||||
|
blkdev->fileproto = "raw";
|
||||||
|
}
|
||||||
if (blkdev->mode == NULL) {
|
if (blkdev->mode == NULL) {
|
||||||
blkdev->mode = xenstore_read_be_str(&blkdev->xendev, "mode");
|
blkdev->mode = xenstore_read_be_str(&blkdev->xendev, "mode");
|
||||||
}
|
}
|
||||||
|
@ -649,7 +654,7 @@ static int blk_init(struct XenDevice *xendev)
|
||||||
blkdev->mode == NULL ||
|
blkdev->mode == NULL ||
|
||||||
blkdev->type == NULL ||
|
blkdev->type == NULL ||
|
||||||
blkdev->dev == NULL) {
|
blkdev->dev == NULL) {
|
||||||
return -1;
|
goto out_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read-only ? */
|
/* read-only ? */
|
||||||
|
@ -672,10 +677,15 @@ static int blk_init(struct XenDevice *xendev)
|
||||||
/* setup via xenbus -> create new block driver instance */
|
/* setup via xenbus -> create new block driver instance */
|
||||||
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
|
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
|
||||||
blkdev->bs = bdrv_new(blkdev->dev);
|
blkdev->bs = bdrv_new(blkdev->dev);
|
||||||
if (bdrv_open(blkdev->bs, blkdev->filename, qflags,
|
if (blkdev->bs) {
|
||||||
bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) {
|
if (bdrv_open(blkdev->bs, blkdev->filename, qflags,
|
||||||
bdrv_delete(blkdev->bs);
|
bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) {
|
||||||
return -1;
|
bdrv_delete(blkdev->bs);
|
||||||
|
blkdev->bs = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!blkdev->bs) {
|
||||||
|
goto out_error;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* setup via qemu cmdline -> already setup for us */
|
/* setup via qemu cmdline -> already setup for us */
|
||||||
|
@ -704,6 +714,19 @@ static int blk_init(struct XenDevice *xendev)
|
||||||
xenstore_write_be_int(&blkdev->xendev, "sectors",
|
xenstore_write_be_int(&blkdev->xendev, "sectors",
|
||||||
blkdev->file_size / blkdev->file_blk);
|
blkdev->file_size / blkdev->file_blk);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_error:
|
||||||
|
qemu_free(blkdev->params);
|
||||||
|
blkdev->params = NULL;
|
||||||
|
qemu_free(blkdev->mode);
|
||||||
|
blkdev->mode = NULL;
|
||||||
|
qemu_free(blkdev->type);
|
||||||
|
blkdev->type = NULL;
|
||||||
|
qemu_free(blkdev->dev);
|
||||||
|
blkdev->dev = NULL;
|
||||||
|
qemu_free(blkdev->devtype);
|
||||||
|
blkdev->devtype = NULL;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int blk_connect(struct XenDevice *xendev)
|
static int blk_connect(struct XenDevice *xendev)
|
||||||
|
|
19
hw/xenfb.c
19
hw/xenfb.c
|
@ -347,13 +347,6 @@ static void xenfb_mouse_event(void *opaque,
|
||||||
|
|
||||||
static int input_init(struct XenDevice *xendev)
|
static int input_init(struct XenDevice *xendev)
|
||||||
{
|
{
|
||||||
struct XenInput *in = container_of(xendev, struct XenInput, c.xendev);
|
|
||||||
|
|
||||||
if (!in->c.ds) {
|
|
||||||
xen_be_printf(xendev, 1, "ds not set (yet)\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
|
xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -367,6 +360,18 @@ static int input_connect(struct XenDevice *xendev)
|
||||||
&in->abs_pointer_wanted) == -1)
|
&in->abs_pointer_wanted) == -1)
|
||||||
in->abs_pointer_wanted = 0;
|
in->abs_pointer_wanted = 0;
|
||||||
|
|
||||||
|
if (!in->c.ds) {
|
||||||
|
char *vfb = xenstore_read_str(NULL, "device/vfb");
|
||||||
|
if (vfb == NULL) {
|
||||||
|
/* there is no vfb, run vkbd on its own */
|
||||||
|
in->c.ds = get_displaystate();
|
||||||
|
} else {
|
||||||
|
qemu_free(vfb);
|
||||||
|
xen_be_printf(xendev, 1, "ds not set (yet)\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
rc = common_bind(&in->c);
|
rc = common_bind(&in->c);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -2068,8 +2068,10 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# , must have a space on the right.
|
# , must have a space on the right.
|
||||||
|
# not required when having a single },{ on one line
|
||||||
} elsif ($op eq ',') {
|
} elsif ($op eq ',') {
|
||||||
if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
|
if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/ &&
|
||||||
|
($elements[$n] . $elements[$n + 2]) !~ " *}{") {
|
||||||
ERROR("space required after that '$op' $at\n" . $hereptr);
|
ERROR("space required after that '$op' $at\n" . $hereptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -410,9 +410,9 @@ disable xen_ram_alloc(unsigned long ram_addr, unsigned long size) "requested: %#
|
||||||
disable xen_client_set_memory(uint64_t start_addr, unsigned long size, unsigned long phys_offset, bool log_dirty) "%#"PRIx64" size %#lx, offset %#lx, log_dirty %i"
|
disable xen_client_set_memory(uint64_t start_addr, unsigned long size, unsigned long phys_offset, bool log_dirty) "%#"PRIx64" size %#lx, offset %#lx, log_dirty %i"
|
||||||
|
|
||||||
# xen-mapcache.c
|
# xen-mapcache.c
|
||||||
disable qemu_map_cache(uint64_t phys_addr) "want %#"PRIx64""
|
disable xen_map_cache(uint64_t phys_addr) "want %#"PRIx64""
|
||||||
disable qemu_remap_bucket(uint64_t index) "index %#"PRIx64""
|
disable xen_remap_bucket(uint64_t index) "index %#"PRIx64""
|
||||||
disable qemu_map_cache_return(void* ptr) "%p"
|
disable xen_map_cache_return(void* ptr) "%p"
|
||||||
disable xen_map_block(uint64_t phys_addr, uint64_t size) "%#"PRIx64", size %#"PRIx64""
|
disable xen_map_block(uint64_t phys_addr, uint64_t size) "%#"PRIx64", size %#"PRIx64""
|
||||||
disable xen_unmap_block(void* addr, unsigned long size) "%p, size %#lx"
|
disable xen_unmap_block(void* addr, unsigned long size) "%p, size %#lx"
|
||||||
|
|
||||||
|
|
73
xen-all.c
73
xen-all.c
|
@ -644,7 +644,7 @@ static void handle_ioreq(ioreq_t *req)
|
||||||
case IOREQ_TYPE_TIMEOFFSET:
|
case IOREQ_TYPE_TIMEOFFSET:
|
||||||
break;
|
break;
|
||||||
case IOREQ_TYPE_INVALIDATE:
|
case IOREQ_TYPE_INVALIDATE:
|
||||||
qemu_invalidate_map_cache();
|
xen_invalidate_map_cache();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
hw_error("Invalid ioreq type 0x%x\n", req->type);
|
hw_error("Invalid ioreq type 0x%x\n", req->type);
|
||||||
|
@ -737,6 +737,66 @@ static void cpu_handle_ioreq(void *opaque)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int store_dev_info(int domid, CharDriverState *cs, const char *string)
|
||||||
|
{
|
||||||
|
struct xs_handle *xs = NULL;
|
||||||
|
char *path = NULL;
|
||||||
|
char *newpath = NULL;
|
||||||
|
char *pts = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
/* Only continue if we're talking to a pty. */
|
||||||
|
if (strncmp(cs->filename, "pty:", 4)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pts = cs->filename + 4;
|
||||||
|
|
||||||
|
/* We now have everything we need to set the xenstore entry. */
|
||||||
|
xs = xs_open(0);
|
||||||
|
if (xs == NULL) {
|
||||||
|
fprintf(stderr, "Could not contact XenStore\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
path = xs_get_domain_path(xs, domid);
|
||||||
|
if (path == NULL) {
|
||||||
|
fprintf(stderr, "xs_get_domain_path() error\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
newpath = realloc(path, (strlen(path) + strlen(string) +
|
||||||
|
strlen("/tty") + 1));
|
||||||
|
if (newpath == NULL) {
|
||||||
|
fprintf(stderr, "realloc error\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
path = newpath;
|
||||||
|
|
||||||
|
strcat(path, string);
|
||||||
|
strcat(path, "/tty");
|
||||||
|
if (!xs_write(xs, XBT_NULL, path, pts, strlen(pts))) {
|
||||||
|
fprintf(stderr, "xs_write for '%s' fail", string);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
free(path);
|
||||||
|
xs_close(xs);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void xenstore_store_pv_console_info(int i, CharDriverState *chr)
|
||||||
|
{
|
||||||
|
if (i == 0) {
|
||||||
|
store_dev_info(xen_domid, chr, "/console");
|
||||||
|
} else {
|
||||||
|
char buf[32];
|
||||||
|
snprintf(buf, sizeof(buf), "/device/console/%d", i);
|
||||||
|
store_dev_info(xen_domid, chr, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void xenstore_record_dm_state(XenIOState *s, const char *state)
|
static void xenstore_record_dm_state(XenIOState *s, const char *state)
|
||||||
{
|
{
|
||||||
char path[50];
|
char path[50];
|
||||||
|
@ -852,7 +912,7 @@ int xen_hvm_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Init RAM management */
|
/* Init RAM management */
|
||||||
qemu_map_cache_init();
|
xen_map_cache_init();
|
||||||
xen_ram_init(ram_size);
|
xen_ram_init(ram_size);
|
||||||
|
|
||||||
qemu_add_vm_change_state_handler(xen_vm_change_state_handler, state);
|
qemu_add_vm_change_state_handler(xen_vm_change_state_handler, state);
|
||||||
|
@ -862,6 +922,15 @@ int xen_hvm_init(void)
|
||||||
cpu_register_phys_memory_client(&state->client);
|
cpu_register_phys_memory_client(&state->client);
|
||||||
state->log_for_dirtybit = NULL;
|
state->log_for_dirtybit = NULL;
|
||||||
|
|
||||||
|
/* Initialize backend core & drivers */
|
||||||
|
if (xen_be_init() != 0) {
|
||||||
|
fprintf(stderr, "%s: xen backend core setup failed\n", __FUNCTION__);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
xen_be_register("console", &xen_console_ops);
|
||||||
|
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||||
|
xen_be_register("qdisk", &xen_blkdev_ops);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2011 Citrix Ltd.
|
|
||||||
*
|
|
||||||
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
||||||
* the COPYING file in the top-level directory.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "cpu.h"
|
|
||||||
#include "qemu-common.h"
|
|
||||||
#include "cpu-common.h"
|
|
||||||
#include "xen-mapcache.h"
|
|
||||||
|
|
||||||
void qemu_map_cache_init(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock)
|
|
||||||
{
|
|
||||||
return qemu_get_ram_ptr(phys_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_invalidate_map_cache(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_invalidate_entry(uint8_t *buffer)
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -40,6 +40,9 @@
|
||||||
#endif
|
#endif
|
||||||
#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
|
#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
|
||||||
|
|
||||||
|
#define mapcache_lock() ((void)0)
|
||||||
|
#define mapcache_unlock() ((void)0)
|
||||||
|
|
||||||
typedef struct MapCacheEntry {
|
typedef struct MapCacheEntry {
|
||||||
target_phys_addr_t paddr_index;
|
target_phys_addr_t paddr_index;
|
||||||
uint8_t *vaddr_base;
|
uint8_t *vaddr_base;
|
||||||
|
@ -79,7 +82,7 @@ static inline int test_bits(int nr, int size, const unsigned long *addr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_map_cache_init(void)
|
void xen_map_cache_init(void)
|
||||||
{
|
{
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
struct rlimit rlimit_as;
|
struct rlimit rlimit_as;
|
||||||
|
@ -106,13 +109,14 @@ void qemu_map_cache_init(void)
|
||||||
|
|
||||||
size = mapcache->nr_buckets * sizeof (MapCacheEntry);
|
size = mapcache->nr_buckets * sizeof (MapCacheEntry);
|
||||||
size = (size + XC_PAGE_SIZE - 1) & ~(XC_PAGE_SIZE - 1);
|
size = (size + XC_PAGE_SIZE - 1) & ~(XC_PAGE_SIZE - 1);
|
||||||
DPRINTF("qemu_map_cache_init, nr_buckets = %lx size %lu\n", mapcache->nr_buckets, size);
|
DPRINTF("%s, nr_buckets = %lx size %lu\n", __func__,
|
||||||
|
mapcache->nr_buckets, size);
|
||||||
mapcache->entry = qemu_mallocz(size);
|
mapcache->entry = qemu_mallocz(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qemu_remap_bucket(MapCacheEntry *entry,
|
static void xen_remap_bucket(MapCacheEntry *entry,
|
||||||
target_phys_addr_t size,
|
target_phys_addr_t size,
|
||||||
target_phys_addr_t address_index)
|
target_phys_addr_t address_index)
|
||||||
{
|
{
|
||||||
uint8_t *vaddr_base;
|
uint8_t *vaddr_base;
|
||||||
xen_pfn_t *pfns;
|
xen_pfn_t *pfns;
|
||||||
|
@ -120,7 +124,7 @@ static void qemu_remap_bucket(MapCacheEntry *entry,
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
target_phys_addr_t nb_pfn = size >> XC_PAGE_SHIFT;
|
target_phys_addr_t nb_pfn = size >> XC_PAGE_SHIFT;
|
||||||
|
|
||||||
trace_qemu_remap_bucket(address_index);
|
trace_xen_remap_bucket(address_index);
|
||||||
|
|
||||||
pfns = qemu_mallocz(nb_pfn * sizeof (xen_pfn_t));
|
pfns = qemu_mallocz(nb_pfn * sizeof (xen_pfn_t));
|
||||||
err = qemu_mallocz(nb_pfn * sizeof (int));
|
err = qemu_mallocz(nb_pfn * sizeof (int));
|
||||||
|
@ -164,17 +168,18 @@ static void qemu_remap_bucket(MapCacheEntry *entry,
|
||||||
qemu_free(err);
|
qemu_free(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock)
|
uint8_t *xen_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size,
|
||||||
|
uint8_t lock)
|
||||||
{
|
{
|
||||||
MapCacheEntry *entry, *pentry = NULL;
|
MapCacheEntry *entry, *pentry = NULL;
|
||||||
target_phys_addr_t address_index = phys_addr >> MCACHE_BUCKET_SHIFT;
|
target_phys_addr_t address_index = phys_addr >> MCACHE_BUCKET_SHIFT;
|
||||||
target_phys_addr_t address_offset = phys_addr & (MCACHE_BUCKET_SIZE - 1);
|
target_phys_addr_t address_offset = phys_addr & (MCACHE_BUCKET_SIZE - 1);
|
||||||
target_phys_addr_t __size = size;
|
target_phys_addr_t __size = size;
|
||||||
|
|
||||||
trace_qemu_map_cache(phys_addr);
|
trace_xen_map_cache(phys_addr);
|
||||||
|
|
||||||
if (address_index == mapcache->last_address_index && !lock && !__size) {
|
if (address_index == mapcache->last_address_index && !lock && !__size) {
|
||||||
trace_qemu_map_cache_return(mapcache->last_address_vaddr + address_offset);
|
trace_xen_map_cache_return(mapcache->last_address_vaddr + address_offset);
|
||||||
return mapcache->last_address_vaddr + address_offset;
|
return mapcache->last_address_vaddr + address_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,20 +203,20 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
entry = qemu_mallocz(sizeof (MapCacheEntry));
|
entry = qemu_mallocz(sizeof (MapCacheEntry));
|
||||||
pentry->next = entry;
|
pentry->next = entry;
|
||||||
qemu_remap_bucket(entry, __size, address_index);
|
xen_remap_bucket(entry, __size, address_index);
|
||||||
} else if (!entry->lock) {
|
} else if (!entry->lock) {
|
||||||
if (!entry->vaddr_base || entry->paddr_index != address_index ||
|
if (!entry->vaddr_base || entry->paddr_index != address_index ||
|
||||||
entry->size != __size ||
|
entry->size != __size ||
|
||||||
!test_bits(address_offset >> XC_PAGE_SHIFT, size >> XC_PAGE_SHIFT,
|
!test_bits(address_offset >> XC_PAGE_SHIFT, size >> XC_PAGE_SHIFT,
|
||||||
entry->valid_mapping)) {
|
entry->valid_mapping)) {
|
||||||
qemu_remap_bucket(entry, __size, address_index);
|
xen_remap_bucket(entry, __size, address_index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!test_bits(address_offset >> XC_PAGE_SHIFT, size >> XC_PAGE_SHIFT,
|
if(!test_bits(address_offset >> XC_PAGE_SHIFT, size >> XC_PAGE_SHIFT,
|
||||||
entry->valid_mapping)) {
|
entry->valid_mapping)) {
|
||||||
mapcache->last_address_index = -1;
|
mapcache->last_address_index = -1;
|
||||||
trace_qemu_map_cache_return(NULL);
|
trace_xen_map_cache_return(NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,11 +231,11 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u
|
||||||
QTAILQ_INSERT_HEAD(&mapcache->locked_entries, reventry, next);
|
QTAILQ_INSERT_HEAD(&mapcache->locked_entries, reventry, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_qemu_map_cache_return(mapcache->last_address_vaddr + address_offset);
|
trace_xen_map_cache_return(mapcache->last_address_vaddr + address_offset);
|
||||||
return mapcache->last_address_vaddr + address_offset;
|
return mapcache->last_address_vaddr + address_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
|
ram_addr_t xen_ram_addr_from_mapcache(void *ptr)
|
||||||
{
|
{
|
||||||
MapCacheEntry *entry = NULL, *pentry = NULL;
|
MapCacheEntry *entry = NULL, *pentry = NULL;
|
||||||
MapCacheRev *reventry;
|
MapCacheRev *reventry;
|
||||||
|
@ -247,7 +252,7 @@ ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
fprintf(stderr, "qemu_ram_addr_from_mapcache, could not find %p\n", ptr);
|
fprintf(stderr, "%s, could not find %p\n", __func__, ptr);
|
||||||
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) {
|
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) {
|
||||||
DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index,
|
DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index,
|
||||||
reventry->vaddr_req);
|
reventry->vaddr_req);
|
||||||
|
@ -269,7 +274,7 @@ ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
|
||||||
((unsigned long) ptr - (unsigned long) entry->vaddr_base);
|
((unsigned long) ptr - (unsigned long) entry->vaddr_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_invalidate_entry(uint8_t *buffer)
|
void xen_invalidate_map_cache_entry(uint8_t *buffer)
|
||||||
{
|
{
|
||||||
MapCacheEntry *entry = NULL, *pentry = NULL;
|
MapCacheEntry *entry = NULL, *pentry = NULL;
|
||||||
MapCacheRev *reventry;
|
MapCacheRev *reventry;
|
||||||
|
@ -290,7 +295,7 @@ void qemu_invalidate_entry(uint8_t *buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
DPRINTF("qemu_invalidate_entry, could not find %p\n", buffer);
|
DPRINTF("%s, could not find %p\n", __func__, buffer);
|
||||||
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) {
|
QTAILQ_FOREACH(reventry, &mapcache->locked_entries, next) {
|
||||||
DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index, reventry->vaddr_req);
|
DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index, reventry->vaddr_req);
|
||||||
}
|
}
|
||||||
|
@ -322,7 +327,7 @@ void qemu_invalidate_entry(uint8_t *buffer)
|
||||||
qemu_free(entry);
|
qemu_free(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_invalidate_map_cache(void)
|
void xen_invalidate_map_cache(void)
|
||||||
{
|
{
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
MapCacheRev *reventry;
|
MapCacheRev *reventry;
|
||||||
|
|
|
@ -9,13 +9,11 @@
|
||||||
#ifndef XEN_MAPCACHE_H
|
#ifndef XEN_MAPCACHE_H
|
||||||
#define XEN_MAPCACHE_H
|
#define XEN_MAPCACHE_H
|
||||||
|
|
||||||
void qemu_map_cache_init(void);
|
void xen_map_cache_init(void);
|
||||||
uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, uint8_t lock);
|
uint8_t *xen_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size,
|
||||||
ram_addr_t qemu_ram_addr_from_mapcache(void *ptr);
|
uint8_t lock);
|
||||||
void qemu_invalidate_entry(uint8_t *buffer);
|
ram_addr_t xen_ram_addr_from_mapcache(void *ptr);
|
||||||
void qemu_invalidate_map_cache(void);
|
void xen_invalidate_map_cache_entry(uint8_t *buffer);
|
||||||
|
void xen_invalidate_map_cache(void);
|
||||||
#define mapcache_lock() ((void)0)
|
|
||||||
#define mapcache_unlock() ((void)0)
|
|
||||||
|
|
||||||
#endif /* !XEN_MAPCACHE_H */
|
#endif /* !XEN_MAPCACHE_H */
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "hw/xen.h"
|
#include "hw/xen.h"
|
||||||
|
|
||||||
|
void xenstore_store_pv_console_info(int i, CharDriverState *chr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Reference in New Issue