Avi Kivity wrote:
> Zhang, Xiantao wrote:
>> 
>> +#define TO_LEGACY_IO(addr)  (((addr&0x3ffffff) >> 12 << 2)|((addr)
>> & 0x3)) 
>> 
> 
> Please change to a function.  Other than that, patch looks good.
Thanks ! Attached. :)
Xiantao 

From: Zhang Xiantao <[EMAIL PROTECTED]>
Date: Thu, 31 Jan 2008 15:35:10 +0800
Subject: [PATCH] kvm: qemu: Covert the mmio address space to port io in
userspace.

IA64 also have no port io, but chipset is responsible for converting
some mmio to port io for keeping compatibility with legacy device.
Signed-off-by: Xiantao Zhang <[EMAIL PROTECTED]>
---
 qemu/hw/ipf.c |   64
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index b1c1389..8769208 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -56,6 +56,64 @@ static fdctrl_t *floppy_controller;
 static RTCState *rtc_state;
 static PCIDevice *i440fx_state;
 
+static uint32_t ipf_to_legacy_io(target_phys_addr_t addr)
+{
+       return (uint32_t)(((addr&0x3ffffff) >> 12 << 2)|((addr) & 0x3));
+}
+
+static void ipf_legacy_io_writeb(void *opaque, target_phys_addr_t addr,
+                                uint32_t val) {
+       uint32_t port = ipf_to_legacy_io(addr);
+       cpu_outb(0, port, val);
+}
+
+static void ipf_legacy_io_writew(void *opaque, target_phys_addr_t addr,
+                                uint32_t val) {
+       uint32_t port = ipf_to_legacy_io(addr);
+
+       cpu_outw(0, port, val);
+}
+
+static void ipf_legacy_io_writel(void *opaque, target_phys_addr_t addr,
+                                uint32_t val) {
+       uint32_t port = ipf_to_legacy_io(addr);
+
+       cpu_outl(0, port, val);
+}
+
+static uint32_t ipf_legacy_io_readb(void *opaque, target_phys_addr_t
addr)
+{
+       uint32_t port = ipf_to_legacy_io(addr);
+
+       return cpu_inb(0, port); 
+}
+
+static uint32_t ipf_legacy_io_readw(void *opaque, target_phys_addr_t
addr)
+{
+       uint32_t port = ipf_to_legacy_io(addr);
+
+       return cpu_inw(0, port); 
+}
+
+static uint32_t ipf_legacy_io_readl(void *opaque, target_phys_addr_t
addr)
+{
+       uint32_t port = ipf_to_legacy_io(addr);
+
+       return cpu_inl(0, port); 
+}
+
+static CPUReadMemoryFunc *ipf_legacy_io_read[3] = {
+    ipf_legacy_io_readb,
+    ipf_legacy_io_readw,
+    ipf_legacy_io_readl,
+};
+
+static CPUWriteMemoryFunc *ipf_legacy_io_write[3] = {
+    ipf_legacy_io_writeb,
+    ipf_legacy_io_writew,
+    ipf_legacy_io_writel,
+};
+
 static void pic_irq_request(void *opaque, int irq, int level)
 {
        fprintf(stderr,"pic_irq_request called!\n");
@@ -333,6 +391,7 @@ static void ipf_init1(ram_addr_t ram_size, int
vga_ram_size,
     qemu_irq *i8259;
     int page_size;
     int index;
+    unsigned long ipf_legacy_io_base, ipf_legacy_io_mem;
     BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     BlockDriverState *fd[MAX_FD];
 
@@ -447,6 +506,11 @@ static void ipf_init1(ram_addr_t ram_size, int
vga_ram_size,
                kvm_ia64_build_hob(ram_size + above_4g_mem_size,
smp_cpus, fw_start);
        }
 #endif
+    /*Register legacy io address space, size:64M*/
+    ipf_legacy_io_base = 0xE0000000;
+    ipf_legacy_io_mem = cpu_register_io_memory(0, ipf_legacy_io_read,
+                                               ipf_legacy_io_write,
NULL);
+    cpu_register_physical_memory(ipf_legacy_io_base, 64*1024*1024,
ipf_legacy_io_mem);
 
     cpu_irq = qemu_allocate_irqs(pic_irq_request, first_cpu, 1);
     i8259 = i8259_init(cpu_irq[0]);
-- 
1.5.2

Attachment: 0001-kvm-qemu-Covert-the-mmio-address-space-to-port-io.patch
Description: 0001-kvm-qemu-Covert-the-mmio-address-space-to-port-io.patch

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to