[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [RFC PATCH 06/10] Add vmport structs



From: Don Slutz <dslutz@xxxxxxxxxxx>

Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx>
---
 xen/arch/x86/hvm/hvm.c           | 59 +++++++++++++++++++++++++++++-
 xen/include/asm-x86/hvm/domain.h |  4 +++
 xen/include/asm-x86/hvm/vmport.h | 77 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 139 insertions(+), 1 deletion(-)
 create mode 100644 xen/include/asm-x86/hvm/vmport.h

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 38641c4..fa5d382 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -57,6 +57,7 @@
 #include <asm/hvm/cacheattr.h>
 #include <asm/hvm/trace.h>
 #include <asm/hvm/nestedhvm.h>
+#include <asm/hvm/vmport.h>
 #include <asm/mtrr.h>
 #include <asm/apic.h>
 #include <public/sched.h>
@@ -536,6 +537,7 @@ static int handle_pvh_io(
 int hvm_domain_initialise(struct domain *d)
 {
     int rc;
+    long vmport_mem = 0;
 
     if ( !hvm_enabled )
     {
@@ -562,6 +564,7 @@ int hvm_domain_initialise(struct domain *d)
 
     spin_lock_init(&d->arch.hvm_domain.irq_lock);
     spin_lock_init(&d->arch.hvm_domain.uc_lock);
+    spin_lock_init(&d->arch.hvm_domain.vmport_lock);
 
     INIT_LIST_HEAD(&d->arch.hvm_domain.msixtbl_list);
     spin_lock_init(&d->arch.hvm_domain.msixtbl_list_lock);
@@ -574,11 +577,47 @@ int hvm_domain_initialise(struct domain *d)
 
     d->arch.hvm_domain.params = xzalloc_array(uint64_t, HVM_NR_PARAMS);
     d->arch.hvm_domain.io_handler = xmalloc(struct hvm_io_handler);
+    d->arch.hvm_domain.vmport_data = xzalloc(struct vmport_state);
     rc = -ENOMEM;
-    if ( !d->arch.hvm_domain.params || !d->arch.hvm_domain.io_handler )
+    if ( !d->arch.hvm_domain.params || !d->arch.hvm_domain.io_handler ||
+         !d->arch.hvm_domain.vmport_data )
         goto fail1;
     d->arch.hvm_domain.io_handler->num_slot = 0;
 
+    vmport_mem += sizeof(struct vmport_state);
+    d->arch.hvm_domain.vmport_data->open_cookie = ('C' << 8) + 'S';
+    d->arch.hvm_domain.vmport_data->used_guestinfo = 10;
+
+    for (rc = 0; rc < d->arch.hvm_domain.vmport_data->used_guestinfo; rc++) {
+        d->arch.hvm_domain.vmport_data->guestinfo[rc] = 
xzalloc(vmport_guestinfo_t);
+        vmport_mem += sizeof(vmport_guestinfo_t);
+    }
+    d->arch.hvm_domain.vmport_data->guestinfo[0]->key_len = 2;
+    memcpy(d->arch.hvm_domain.vmport_data->guestinfo[0]->key_data, "ip", 2);
+
+    gdprintk(XENLOG_DEBUG, "vmport_mem=%ld bytes (%ld KiB, %ld MiB)\n",
+             vmport_mem,
+             (vmport_mem + (1 << 10) - 1) >> 10,
+             (vmport_mem + (1 << 20) - 1) >> 20);
+    vmport_mem += sizeof(uint64_t) * HVM_NR_PARAMS;
+    vmport_mem += sizeof(struct hvm_io_handler);
+    gdprintk(XENLOG_DEBUG, "hvm overhead=%ld bytes (%ld KiB, %ld MiB)\n",
+             vmport_mem,
+             (vmport_mem + (1 << 10) - 1) >> 10,
+             (vmport_mem + (1 << 20) - 1) >> 20);
+    gdprintk(XENLOG_DEBUG, "tot_pages=%d bytes (%d KiB, %d MiB)\n",
+             d->tot_pages,
+             (d->tot_pages + (1 << 10) - 1) >> 10,
+             (d->tot_pages + (1 << 20) - 1) >> 20);
+    gdprintk(XENLOG_DEBUG, "max_pages=%d bytes (%d KiB, %d MiB)\n",
+             d->max_pages,
+             (d->max_pages + (1 << 10) - 1) >> 10,
+             (d->max_pages + (1 << 20) - 1) >> 20);
+
+#if 0
+    vmport_flush(&d->arch.hvm_domain);
+#endif
+
     if ( is_pvh_domain(d) )
     {
         register_portio_handler(d, 0, 0x10003, handle_pvh_io);
@@ -617,6 +656,15 @@ int hvm_domain_initialise(struct domain *d)
     stdvga_deinit(d);
     vioapic_deinit(d);
  fail1:
+    if (d->arch.hvm_domain.vmport_data) {
+        struct vmport_state *vs = d->arch.hvm_domain.vmport_data;
+        int idx;
+
+        for (idx = 0; idx < vs->used_guestinfo; idx++) {
+            xfree(vs->guestinfo[idx]);
+        }
+    }
+    xfree(d->arch.hvm_domain.vmport_data);
     xfree(d->arch.hvm_domain.io_handler);
     xfree(d->arch.hvm_domain.params);
  fail0:
@@ -626,6 +674,15 @@ int hvm_domain_initialise(struct domain *d)
 
 void hvm_domain_relinquish_resources(struct domain *d)
 {
+    if (d->arch.hvm_domain.vmport_data) {
+        struct vmport_state *vs = d->arch.hvm_domain.vmport_data;
+        int idx;
+
+        for (idx = 0; idx < vs->used_guestinfo; idx++) {
+            xfree(vs->guestinfo[idx]);
+        }
+        xfree(d->arch.hvm_domain.vmport_data);
+    }
     xfree(d->arch.hvm_domain.io_handler);
     xfree(d->arch.hvm_domain.params);
 
diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h
index b1e3187..0ca2778 100644
--- a/xen/include/asm-x86/hvm/domain.h
+++ b/xen/include/asm-x86/hvm/domain.h
@@ -62,6 +62,10 @@ struct hvm_domain {
     /* emulated irq to pirq */
     struct radix_tree_root emuirq_pirq;
 
+    /* VMware special port */
+    spinlock_t             vmport_lock;
+    struct  vmport_state  *vmport_data;
+
     uint64_t              *params;
 
     /* Memory ranges with pinned cache attributes. */
diff --git a/xen/include/asm-x86/hvm/vmport.h b/xen/include/asm-x86/hvm/vmport.h
new file mode 100644
index 0000000..180ddac
--- /dev/null
+++ b/xen/include/asm-x86/hvm/vmport.h
@@ -0,0 +1,77 @@
+/*
+ * vmport.h: HVM VMPORT emulation
+ *
+ *
+ * Copyright (C) 2012 Verizon Corporation
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License Version 2 (GPLv2)
+ * as published by the Free Software Foundation.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details. <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __ASM_X86_HVM_VMPORT_H__
+#define __ASM_X86_HVM_VMPORT_H__
+
+/* Note: VMPORT_PORT and VMPORT_MAGIC is also defined as BDOOR_PORT
+ * and BDOOR_MAGIC in backdoor_def.h Defined here so that other
+ * parts of XEN can use it.
+ */
+
+#define VMPORT_PORT 0x5658
+#define VMPORT_MAGIC 0x564D5868
+
+#define VMPORT_MAX_KEY_LEN 30
+#define VMPORT_MAX_VAL_LEN 128
+#define VMPORT_MAX_NUM_KEY 128
+
+#define VMPORT_MAX_SEND_BUF ((22 + VMPORT_MAX_KEY_LEN + VMPORT_MAX_VAL_LEN + 
3)/4)
+#define VMPORT_MAX_RECV_BUF ((2 + VMPORT_MAX_VAL_LEN + 3)/4)
+#define VMPORT_MAX_CHANS    4
+#define VMPORT_MAX_BKTS     8
+
+
+typedef struct vmport_guestinfo_ {
+    uint8_t key_len;
+    uint8_t val_len;
+    char key_data[VMPORT_MAX_KEY_LEN];
+    char val_data[VMPORT_MAX_VAL_LEN];
+} vmport_guestinfo_t;
+
+typedef struct vmport_bucket_ {
+    uint16_t recv_len;
+    uint16_t recv_idx;
+    uint32_t recv_buf[VMPORT_MAX_RECV_BUF + 1];
+    uint8_t  recv_slot;
+} vmport_bucket_t;
+
+typedef struct vmport_channel_ {
+    unsigned long active_time;
+    uint32_t chan_id;
+    uint32_t cookie;
+    uint32_t proto_num;
+    uint16_t send_len;
+    uint16_t send_idx;
+    uint32_t send_buf[VMPORT_MAX_SEND_BUF + 1];
+    vmport_bucket_t recv_bkt[VMPORT_MAX_BKTS];
+    uint8_t recv_read;
+    uint8_t recv_write;
+} vmport_channel_t;
+
+struct vmport_state {
+    unsigned long ping_time;
+    uint32_t open_cookie;
+    uint32_t used_guestinfo;
+    vmport_channel_t chans[VMPORT_MAX_CHANS];
+    vmport_guestinfo_t *guestinfo[VMPORT_MAX_NUM_KEY];
+};
+
+int vmport_ioport(int dir, int size, unsigned long data, struct cpu_user_regs 
*regs);
+void vmport_ctrl_send(struct hvm_domain *hd, char *msg, int slot);
+void vmport_flush(struct hvm_domain *hd);
+
+#endif /* __ASM_X86_HVM_VMPORT_H__ */
-- 
1.8.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.