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

[Xen-changelog] [xen-unstable] ioemu: create a rom-protect platform flag.



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1215702937 -3600
# Node ID d5efa03793a2521dff488ab4e5a0bfe98d28bd46
# Parent  f454f2cac170a511b6727f84a8032a8132e05d84
ioemu: create a rom-protect platform flag.

Signed-off-by: Trolle Selander <trolle.selander@xxxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 tools/ioemu/hw/xen_platform.c |   98 +++++++++++++++++++++++++++++++++---------
 1 files changed, 77 insertions(+), 21 deletions(-)

diff -r f454f2cac170 -r d5efa03793a2 tools/ioemu/hw/xen_platform.c
--- a/tools/ioemu/hw/xen_platform.c     Thu Jul 10 15:45:18 2008 +0100
+++ b/tools/ioemu/hw/xen_platform.c     Thu Jul 10 16:15:37 2008 +0100
@@ -28,10 +28,52 @@
 
 extern FILE *logfile;
 
-static void platform_ioport_map(PCIDevice *pci_dev, int region_num,
-                                uint32_t addr, uint32_t size, int type)
-{
-    /* nothing yet */
+#define PFFLAG_ROM_LOCK 1 /* Sets whether ROM memory area is RW or RO */
+
+typedef struct PCIXenPlatformState
+{
+  PCIDevice  pci_dev;
+  uint8_t    platform_flags;
+} PCIXenPlatformState;
+
+static uint32_t xen_platform_ioport_readb(void *opaque, uint32_t addr)
+{
+    PCIXenPlatformState *s = opaque;
+
+    addr &= 0xff;
+
+    return (addr == 0) ? s->platform_flags : ~0u;
+}
+                              
+static void xen_platform_ioport_writeb(void *opaque, uint32_t addr, uint32_t 
val)
+{
+    PCIXenPlatformState *d = opaque;
+
+    addr &= 0xff;
+    val  &= 0xff;
+
+    switch (addr) {
+    case 0: /* Platform flags */ {
+        hvmmem_type_t mem_type = (val & PFFLAG_ROM_LOCK) ?
+            HVMMEM_ram_ro : HVMMEM_ram_rw;
+        if (xc_hvm_set_mem_type(xc_handle, domid, mem_type, 0xc0, 0x40))
+            fprintf(logfile,"xen_platform: unable to change ro/rw "
+                    "state of ROM memory area!\n");
+        else
+            d->platform_flags = val & PFFLAG_ROM_LOCK;
+        break;
+    }
+    default:
+        break;
+    }
+}
+
+
+static void platform_ioport_map(PCIDevice *pci_dev, int region_num, uint32_t 
addr, uint32_t size, int type)
+{
+    PCIXenPlatformState *d = (PCIXenPlatformState *)pci_dev;
+    register_ioport_write(addr, size, 1, xen_platform_ioport_writeb, d);
+    register_ioport_read(addr, size, 1, xen_platform_ioport_readb, d);
 }
 
 static uint32_t platform_mmio_read(void *opaque, target_phys_addr_t addr)
@@ -109,30 +151,42 @@ struct pci_config_header {
 
 void xen_pci_save(QEMUFile *f, void *opaque)
 {
-    PCIDevice *d = opaque;
-
-    pci_device_save(d, f);
+    PCIXenPlatformState *d = opaque;
+
+    pci_device_save(&d->pci_dev, f);
+    qemu_put_8s(f, &d->platform_flags);
 }
 
 int xen_pci_load(QEMUFile *f, void *opaque, int version_id)
 {
-    PCIDevice *d = opaque;
-
-    if (version_id != 1)
+    PCIXenPlatformState *d = opaque;
+    int ret;
+
+    if (version_id > 2)
         return -EINVAL;
 
-    return pci_device_load(d, f);
+    ret = pci_device_load(&d->pci_dev, f);
+    if (ret < 0)
+        return ret;
+
+    if (version_id >= 2) {
+        uint8_t flags;
+        qemu_get_8s(f, &flags);
+        xen_platform_ioport_writeb(d, 0, flags);
+    }
+
+    return 0;
 }
 
 void pci_xen_platform_init(PCIBus *bus)
 {
-    PCIDevice *d;
+    PCIXenPlatformState *d;
     struct pci_config_header *pch;
 
     printf("Register xen platform.\n");
-    d = pci_register_device(bus, "xen-platform", sizeof(PCIDevice), -1, NULL,
-                           NULL);
-    pch = (struct pci_config_header *)d->config;
+    d = (PCIXenPlatformState *)pci_register_device(
+        bus, "xen-platform", sizeof(PCIXenPlatformState), -1, NULL, NULL);
+    pch = (struct pci_config_header *)d->pci_dev.config;
     pch->vendor_id = 0x5853;
     pch->device_id = 0x0001;
     pch->command = 3; /* IO and memory access */
@@ -148,13 +202,15 @@ void pci_xen_platform_init(PCIBus *bus)
     pch->subsystem_vendor_id = pch->vendor_id; /* Duplicate vendor id.  */
     pch->subsystem_id        = 0x0001;         /* Hardcode sub-id as 1. */
 
-    pci_register_io_region(d, 0, 0x100, PCI_ADDRESS_SPACE_IO,
-                           platform_ioport_map);
+    pci_register_io_region(&d->pci_dev, 0, 0x100,
+                           PCI_ADDRESS_SPACE_IO, platform_ioport_map);
 
     /* reserve 16MB mmio address for share memory*/
-    pci_register_io_region(d, 1, 0x1000000, PCI_ADDRESS_SPACE_MEM_PREFETCH,
-                          platform_mmio_map);
-
-    register_savevm("platform", 0, 1, xen_pci_save, xen_pci_load, d);
+    pci_register_io_region(&d->pci_dev, 1, 0x1000000,
+                           PCI_ADDRESS_SPACE_MEM_PREFETCH, platform_mmio_map);
+
+    xen_platform_ioport_writeb(d, 0, 0);
+
+    register_savevm("platform", 0, 2, xen_pci_save, xen_pci_load, d);
     printf("Done register platform.\n");
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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