mirror of https://github.com/xemu-project/xemu.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))
|
||||
|
||||
# xen backend driver support
|
||||
common-obj-$(CONFIG_XEN) += 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_backend.o xen_devconfig.o
|
||||
common-obj-$(CONFIG_XEN_BACKEND) += xen_console.o xenfb.o xen_disk.o xen_nic.o
|
||||
|
||||
######################################################################
|
||||
# libuser
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
GENERATED_HEADERS = config-target.h
|
||||
CONFIG_NO_PCI = $(if $(subst n,,$(CONFIG_PCI)),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-devices.mak
|
||||
|
@ -204,20 +205,9 @@ QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
|
|||
QEMU_CFLAGS += $(VNC_JPEG_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
|
||||
CONFIG_NO_XEN_MAPCACHE = $(if $(subst n,,$(CONFIG_XEN_MAPCACHE)),n,y)
|
||||
obj-i386-$(CONFIG_XEN) += xen-all.o
|
||||
obj-$(CONFIG_XEN) += xen-all.o xen_machine_pv.o xen_domainbuild.o xen-mapcache.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
|
||||
|
||||
|
|
|
@ -2850,7 +2850,7 @@ if test "$bluez" = "yes" ; then
|
|||
echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
|
||||
fi
|
||||
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
|
||||
fi
|
||||
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);
|
||||
/* This should only be used for ram local to a device. */
|
||||
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
|
||||
* RAMBlocks must not change. */
|
||||
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();
|
||||
}
|
||||
#else
|
||||
if (xen_mapcache_enabled()) {
|
||||
if (xen_enabled()) {
|
||||
xen_ram_alloc(new_block->offset, size);
|
||||
} else {
|
||||
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)
|
||||
munmap(block->host, block->length);
|
||||
#else
|
||||
if (xen_mapcache_enabled()) {
|
||||
qemu_invalidate_entry(block->host);
|
||||
if (xen_enabled()) {
|
||||
xen_invalidate_map_cache_entry(block->host);
|
||||
} else {
|
||||
qemu_vfree(block->host);
|
||||
}
|
||||
|
@ -3112,15 +3112,16 @@ void *qemu_get_ram_ptr(ram_addr_t addr)
|
|||
QLIST_REMOVE(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
|
||||
* because we don't want to map the entire memory in QEMU.
|
||||
* In that case just map until the end of the page.
|
||||
*/
|
||||
if (block->offset == 0) {
|
||||
return qemu_map_cache(addr, 0, 0);
|
||||
return xen_map_cache(addr, 0, 0);
|
||||
} 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);
|
||||
|
@ -3142,15 +3143,16 @@ void *qemu_safe_ram_ptr(ram_addr_t addr)
|
|||
|
||||
QLIST_FOREACH(block, &ram_list.blocks, next) {
|
||||
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
|
||||
* because we don't want to map the entire memory in QEMU.
|
||||
* In that case just map until the end of the page.
|
||||
*/
|
||||
if (block->offset == 0) {
|
||||
return qemu_map_cache(addr, 0, 0);
|
||||
return xen_map_cache(addr, 0, 0);
|
||||
} 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);
|
||||
|
@ -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
|
||||
* 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())
|
||||
return qemu_map_cache(addr, *size, 1);
|
||||
else {
|
||||
if (*size == 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (xen_enabled()) {
|
||||
return xen_map_cache(addr, *size, 1);
|
||||
} else {
|
||||
RAMBlock *block;
|
||||
|
||||
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);
|
||||
abort();
|
||||
|
||||
*size = 0;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3198,8 +3200,8 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
|
|||
RAMBlock *block;
|
||||
uint8_t *host = ptr;
|
||||
|
||||
if (xen_mapcache_enabled()) {
|
||||
*ram_addr = qemu_ram_addr_from_mapcache(ptr);
|
||||
if (xen_enabled()) {
|
||||
*ram_addr = xen_ram_addr_from_mapcache(ptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -4050,7 +4052,9 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
|
|||
target_phys_addr_t page;
|
||||
unsigned long pd;
|
||||
PhysPageDesc *p;
|
||||
target_phys_addr_t addr1 = addr;
|
||||
ram_addr_t raddr = ULONG_MAX;
|
||||
ram_addr_t rlen;
|
||||
void *ret;
|
||||
|
||||
while (len > 0) {
|
||||
page = addr & TARGET_PAGE_MASK;
|
||||
|
@ -4078,13 +4082,18 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
|
|||
*plen = l;
|
||||
return bounce.buffer;
|
||||
}
|
||||
if (!todo) {
|
||||
raddr = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
|
||||
}
|
||||
|
||||
len -= l;
|
||||
addr += l;
|
||||
todo += l;
|
||||
}
|
||||
*plen = todo;
|
||||
return qemu_ram_ptr_length(addr1, plen);
|
||||
rlen = todo;
|
||||
ret = qemu_ram_ptr_length(raddr, &rlen);
|
||||
*plen = rlen;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
if (xen_mapcache_enabled()) {
|
||||
qemu_invalidate_entry(buffer);
|
||||
if (xen_enabled()) {
|
||||
xen_invalidate_map_cache_entry(buffer);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
10
hw/xen.h
10
hw/xen.h
|
@ -31,15 +31,6 @@ static inline int xen_enabled(void)
|
|||
#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);
|
||||
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);
|
||||
|
@ -50,6 +41,7 @@ qemu_irq *xen_interrupt_controller_init(void);
|
|||
int xen_init(void);
|
||||
int xen_hvm_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)
|
||||
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);
|
||||
}
|
||||
|
||||
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 */
|
||||
#else
|
||||
|
|
|
@ -179,7 +179,9 @@ static void xencons_send(struct XenConsole *con)
|
|||
static int con_init(struct XenDevice *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 */
|
||||
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");
|
||||
if (!type || strcmp(type, "ioemu") != 0) {
|
||||
xen_be_printf(xendev, 1, "not for me (type=%s)\n", type);
|
||||
return -1;
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!serial_hds[con->xendev.dev])
|
||||
xen_be_printf(xendev, 1, "WARNING: serial line %d not configured\n",
|
||||
con->xendev.dev);
|
||||
else
|
||||
con->chr = serial_hds[con->xendev.dev];
|
||||
output = xenstore_read_str(con->console, "output");
|
||||
|
||||
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)
|
||||
|
|
|
@ -616,12 +616,14 @@ static int blk_init(struct XenDevice *xendev)
|
|||
{
|
||||
struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
|
||||
int index, qflags, have_barriers, info = 0;
|
||||
char *h;
|
||||
|
||||
/* read xenstore entries */
|
||||
if (blkdev->params == NULL) {
|
||||
char *h = NULL;
|
||||
blkdev->params = xenstore_read_be_str(&blkdev->xendev, "params");
|
||||
h = strchr(blkdev->params, ':');
|
||||
if (blkdev->params != NULL) {
|
||||
h = strchr(blkdev->params, ':');
|
||||
}
|
||||
if (h != NULL) {
|
||||
blkdev->fileproto = blkdev->params;
|
||||
blkdev->filename = h+1;
|
||||
|
@ -631,6 +633,9 @@ static int blk_init(struct XenDevice *xendev)
|
|||
blkdev->filename = blkdev->params;
|
||||
}
|
||||
}
|
||||
if (!strcmp("aio", blkdev->fileproto)) {
|
||||
blkdev->fileproto = "raw";
|
||||
}
|
||||
if (blkdev->mode == NULL) {
|
||||
blkdev->mode = xenstore_read_be_str(&blkdev->xendev, "mode");
|
||||
}
|
||||
|
@ -649,7 +654,7 @@ static int blk_init(struct XenDevice *xendev)
|
|||
blkdev->mode == NULL ||
|
||||
blkdev->type == NULL ||
|
||||
blkdev->dev == NULL) {
|
||||
return -1;
|
||||
goto out_error;
|
||||
}
|
||||
|
||||
/* read-only ? */
|
||||
|
@ -672,10 +677,15 @@ static int blk_init(struct XenDevice *xendev)
|
|||
/* setup via xenbus -> create new block driver instance */
|
||||
xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
|
||||
blkdev->bs = bdrv_new(blkdev->dev);
|
||||
if (bdrv_open(blkdev->bs, blkdev->filename, qflags,
|
||||
bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) {
|
||||
bdrv_delete(blkdev->bs);
|
||||
return -1;
|
||||
if (blkdev->bs) {
|
||||
if (bdrv_open(blkdev->bs, blkdev->filename, qflags,
|
||||
bdrv_find_whitelisted_format(blkdev->fileproto)) != 0) {
|
||||
bdrv_delete(blkdev->bs);
|
||||
blkdev->bs = NULL;
|
||||
}
|
||||
}
|
||||
if (!blkdev->bs) {
|
||||
goto out_error;
|
||||
}
|
||||
} else {
|
||||
/* 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",
|
||||
blkdev->file_size / blkdev->file_blk);
|
||||
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)
|
||||
|
|
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)
|
||||
{
|
||||
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);
|
||||
return 0;
|
||||
}
|
||||
|
@ -367,6 +360,18 @@ static int input_connect(struct XenDevice *xendev)
|
|||
&in->abs_pointer_wanted) == -1)
|
||||
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);
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
|
|
@ -2068,8 +2068,10 @@ sub process {
|
|||
}
|
||||
|
||||
# , must have a space on the right.
|
||||
# not required when having a single },{ on one line
|
||||
} 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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
||||
# xen-mapcache.c
|
||||
disable qemu_map_cache(uint64_t phys_addr) "want %#"PRIx64""
|
||||
disable qemu_remap_bucket(uint64_t index) "index %#"PRIx64""
|
||||
disable qemu_map_cache_return(void* ptr) "%p"
|
||||
disable xen_map_cache(uint64_t phys_addr) "want %#"PRIx64""
|
||||
disable xen_remap_bucket(uint64_t index) "index %#"PRIx64""
|
||||
disable xen_map_cache_return(void* ptr) "%p"
|
||||
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"
|
||||
|
||||
|
|
73
xen-all.c
73
xen-all.c
|
@ -644,7 +644,7 @@ static void handle_ioreq(ioreq_t *req)
|
|||
case IOREQ_TYPE_TIMEOFFSET:
|
||||
break;
|
||||
case IOREQ_TYPE_INVALIDATE:
|
||||
qemu_invalidate_map_cache();
|
||||
xen_invalidate_map_cache();
|
||||
break;
|
||||
default:
|
||||
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)
|
||||
{
|
||||
char path[50];
|
||||
|
@ -852,7 +912,7 @@ int xen_hvm_init(void)
|
|||
}
|
||||
|
||||
/* Init RAM management */
|
||||
qemu_map_cache_init();
|
||||
xen_map_cache_init();
|
||||
xen_ram_init(ram_size);
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
|
||||
|
||||
#define mapcache_lock() ((void)0)
|
||||
#define mapcache_unlock() ((void)0)
|
||||
|
||||
typedef struct MapCacheEntry {
|
||||
target_phys_addr_t paddr_index;
|
||||
uint8_t *vaddr_base;
|
||||
|
@ -79,7 +82,7 @@ static inline int test_bits(int nr, int size, const unsigned long *addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void qemu_map_cache_init(void)
|
||||
void xen_map_cache_init(void)
|
||||
{
|
||||
unsigned long size;
|
||||
struct rlimit rlimit_as;
|
||||
|
@ -106,13 +109,14 @@ void qemu_map_cache_init(void)
|
|||
|
||||
size = mapcache->nr_buckets * sizeof (MapCacheEntry);
|
||||
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);
|
||||
}
|
||||
|
||||
static void qemu_remap_bucket(MapCacheEntry *entry,
|
||||
target_phys_addr_t size,
|
||||
target_phys_addr_t address_index)
|
||||
static void xen_remap_bucket(MapCacheEntry *entry,
|
||||
target_phys_addr_t size,
|
||||
target_phys_addr_t address_index)
|
||||
{
|
||||
uint8_t *vaddr_base;
|
||||
xen_pfn_t *pfns;
|
||||
|
@ -120,7 +124,7 @@ static void qemu_remap_bucket(MapCacheEntry *entry,
|
|||
unsigned int i;
|
||||
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));
|
||||
err = qemu_mallocz(nb_pfn * sizeof (int));
|
||||
|
@ -164,17 +168,18 @@ static void qemu_remap_bucket(MapCacheEntry *entry,
|
|||
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;
|
||||
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 __size = size;
|
||||
|
||||
trace_qemu_map_cache(phys_addr);
|
||||
trace_xen_map_cache(phys_addr);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -198,20 +203,20 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u
|
|||
if (!entry) {
|
||||
entry = qemu_mallocz(sizeof (MapCacheEntry));
|
||||
pentry->next = entry;
|
||||
qemu_remap_bucket(entry, __size, address_index);
|
||||
xen_remap_bucket(entry, __size, address_index);
|
||||
} else if (!entry->lock) {
|
||||
if (!entry->vaddr_base || entry->paddr_index != address_index ||
|
||||
entry->size != __size ||
|
||||
!test_bits(address_offset >> XC_PAGE_SHIFT, size >> XC_PAGE_SHIFT,
|
||||
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,
|
||||
entry->valid_mapping)) {
|
||||
mapcache->last_address_index = -1;
|
||||
trace_qemu_map_cache_return(NULL);
|
||||
trace_xen_map_cache_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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
MapCacheRev *reventry;
|
||||
|
@ -247,7 +252,7 @@ ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
|
|||
}
|
||||
}
|
||||
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) {
|
||||
DPRINTF(" "TARGET_FMT_plx" -> %p is present\n", reventry->paddr_index,
|
||||
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);
|
||||
}
|
||||
|
||||
void qemu_invalidate_entry(uint8_t *buffer)
|
||||
void xen_invalidate_map_cache_entry(uint8_t *buffer)
|
||||
{
|
||||
MapCacheEntry *entry = NULL, *pentry = NULL;
|
||||
MapCacheRev *reventry;
|
||||
|
@ -290,7 +295,7 @@ void qemu_invalidate_entry(uint8_t *buffer)
|
|||
}
|
||||
}
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
|
||||
void qemu_invalidate_map_cache(void)
|
||||
void xen_invalidate_map_cache(void)
|
||||
{
|
||||
unsigned long i;
|
||||
MapCacheRev *reventry;
|
||||
|
|
|
@ -9,13 +9,11 @@
|
|||
#ifndef XEN_MAPCACHE_H
|
||||
#define 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);
|
||||
ram_addr_t qemu_ram_addr_from_mapcache(void *ptr);
|
||||
void qemu_invalidate_entry(uint8_t *buffer);
|
||||
void qemu_invalidate_map_cache(void);
|
||||
|
||||
#define mapcache_lock() ((void)0)
|
||||
#define mapcache_unlock() ((void)0)
|
||||
void xen_map_cache_init(void);
|
||||
uint8_t *xen_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size,
|
||||
uint8_t lock);
|
||||
ram_addr_t xen_ram_addr_from_mapcache(void *ptr);
|
||||
void xen_invalidate_map_cache_entry(uint8_t *buffer);
|
||||
void xen_invalidate_map_cache(void);
|
||||
|
||||
#endif /* !XEN_MAPCACHE_H */
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
#include "qemu-common.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)
|
||||
{
|
||||
return -1;
|
||||
|
|
Loading…
Reference in New Issue