⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioemu-buffer-pio-ia64

📁 xen虚拟机源代码安装包
💻
字号:
Index: ioemu/vl.c===================================================================--- ioemu.orig/vl.c	2007-05-10 15:34:24.000000000 +0100+++ ioemu/vl.c	2007-05-10 15:34:24.000000000 +0100@@ -6824,6 +6824,7 @@     unsigned long ioreq_pfn;     extern void *shared_page;     extern void *buffered_io_page;+    extern void *buffered_pio_page;     unsigned long nr_pages;      char qemu_dm_logfilename[64];@@ -7521,6 +7522,10 @@                                        PROT_READ|PROT_WRITE,                                        BUFFER_IO_PAGE_START >> PAGE_SHIFT); +    buffered_pio_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,+                                       PROT_READ|PROT_WRITE,+                                       BUFFER_PIO_PAGE_START >> PAGE_SHIFT);+     for (i = 0; i < nr_pages; i++)         page_array[i] = i; 	Index: ioemu/hw/ide.c===================================================================--- ioemu.orig/hw/ide.c	2007-05-10 15:32:53.000000000 +0100+++ ioemu/hw/ide.c	2007-05-10 15:34:24.000000000 +0100@@ -393,6 +393,121 @@     int type; /* see IDE_TYPE_xxx */ } PCIIDEState; +#if defined(__ia64__)+#include <xen/hvm/ioreq.h>++struct buffered_piopage *buffered_pio_page;++static inline struct pio_buffer *+piobuf_by_addr(uint32_t addr)+{+    if (addr == 0x1F0)+        return &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];+    if (addr == 0x170)+        return &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];+    return NULL;+}++static void+buffered_pio_init(void)+{+    struct pio_buffer *p1, *p2;+    uint32_t off1, off2;++    if (!buffered_pio_page)+        return;++    p1 = &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];+    p2 = &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];+    off1 = offsetof(struct buffered_piopage, buffer);+    off2 = (off1 + TARGET_PAGE_SIZE)/2;++    p1->buf_size = off2 - off1;+    p1->page_offset = off1;++    p2->buf_size = TARGET_PAGE_SIZE - off2;+    p2->page_offset = off2;+}++static inline void+buffered_pio_flush(struct pio_buffer *piobuf)+{+    IDEState *s = piobuf->opaque;+    uint32_t pointer = piobuf->pointer;++    if (s != NULL && pointer > 0) {+        uint8_t *buf = (uint8_t *)buffered_pio_page + piobuf->page_offset;+        memcpy(s->data_ptr, buf, pointer);+        s->data_ptr += pointer;+    }+}++static inline void+buffered_pio_reset(IDEState *s)+{+    struct pio_buffer *piobuf;++    if ((unsigned)s->drive_serial - 1 < 2)      /* 1,2 */+        piobuf = &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];+    else if ((unsigned)s->drive_serial - 3 < 2) /* 3,4 */+        piobuf = &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];+    else+        return;+    buffered_pio_flush(piobuf);+    piobuf->pointer = 0;+    piobuf->data_end = 0;+    piobuf->opaque = NULL;+}++static inline void+buffered_pio_write(IDEState *s, uint32_t addr, int size)+{+    struct pio_buffer *piobuf = piobuf_by_addr(addr);+    int data_end;++    if (!piobuf)+        return;+    buffered_pio_flush(piobuf);+    data_end = s->data_end - s->data_ptr - size;+    if (data_end <= 0)+        data_end = 0;+    else if (data_end > piobuf->buf_size)+        data_end = piobuf->buf_size;+    piobuf->pointer = 0;+    piobuf->data_end = data_end;+    piobuf->opaque = s;+}++static inline void+buffered_pio_read(IDEState *s, uint32_t addr, int size)+{+    struct pio_buffer *piobuf = piobuf_by_addr(addr);+    int data_end;++    if (!piobuf)+        return;+    s->data_ptr += piobuf->pointer;+    data_end = s->data_end - s->data_ptr - size;+    if (data_end <= 0) {+        data_end = 0;+    } else {+	uint8_t *buf = (uint8_t *)buffered_pio_page + piobuf->page_offset;+        if (data_end > piobuf->buf_size)+            data_end = piobuf->buf_size;+        memcpy(buf, s->data_ptr + size, data_end);+    }+    piobuf->pointer = 0;+    piobuf->data_end = data_end;+    piobuf->opaque = NULL;+}++#else /* !__ia64__ */+#define buffered_pio_init()         do {} while (0)+#define buffered_pio_reset(I)       do {} while (0)+#define buffered_pio_write(I,A,S)   do {} while (0)+#define buffered_pio_read(I,A,S)    do {} while (0)+#endif+ static void ide_dma_start(IDEState *s, BlockDriverCompletionFunc *dma_cb); static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret); @@ -587,6 +702,7 @@     s->data_ptr = buf;     s->data_end = buf + size;     s->status |= DRQ_STAT;+    buffered_pio_reset(s); }  static void ide_transfer_stop(IDEState *s)@@ -595,6 +711,7 @@     s->data_ptr = s->io_buffer;     s->data_end = s->io_buffer;     s->status &= ~DRQ_STAT;+    buffered_pio_reset(s); }  static int64_t ide_get_sector(IDEState *s)@@ -1596,6 +1713,7 @@         ide_if[0].select = (val & ~0x10) | 0xa0;         ide_if[1].select = (val | 0x10) | 0xa0;         /* select drive */+        buffered_pio_reset(ide_if->cur_drive);         unit = (val >> 4) & 1;         s = ide_if + unit;         ide_if->cur_drive = s;@@ -1954,6 +2072,7 @@     IDEState *s = ((IDEState *)opaque)->cur_drive;     uint8_t *p; +    buffered_pio_write(s, addr, 2);     p = s->data_ptr;     *(uint16_t *)p = le16_to_cpu(val);     p += 2;@@ -1967,6 +2086,8 @@     IDEState *s = ((IDEState *)opaque)->cur_drive;     uint8_t *p;     int ret;+    +    buffered_pio_read(s, addr, 2);     p = s->data_ptr;     ret = cpu_to_le16(*(uint16_t *)p);     p += 2;@@ -1981,6 +2102,7 @@     IDEState *s = ((IDEState *)opaque)->cur_drive;     uint8_t *p; +    buffered_pio_write(s, addr, 4);     p = s->data_ptr;     *(uint32_t *)p = le32_to_cpu(val);     p += 4;@@ -1995,6 +2117,7 @@     uint8_t *p;     int ret;     +    buffered_pio_read(s, addr, 4);     p = s->data_ptr;     ret = cpu_to_le32(*(uint32_t *)p);     p += 4;@@ -2624,6 +2747,8 @@     ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);     ide_init_ioport(&d->ide_if[2], 0x170, 0x376); +    buffered_pio_init();+     register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d); } @@ -2663,6 +2788,8 @@     ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);     ide_init_ioport(&d->ide_if[2], 0x170, 0x376); +    buffered_pio_init();+     register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d); } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -