source: trunk/packages/xen-3.1/xen-3.1/tools/ioemu/patches/ioemu-buffer-pio-ia64 @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

File size: 6.0 KB
Line 
1Index: ioemu/vl.c
2===================================================================
3--- ioemu.orig/vl.c     2007-05-03 15:07:15.000000000 +0100
4+++ ioemu/vl.c  2007-05-03 15:07:15.000000000 +0100
5@@ -5924,6 +5924,7 @@
6     unsigned long ioreq_pfn;
7     extern void *shared_page;
8     extern void *buffered_io_page;
9+    extern void *buffered_pio_page;
10     unsigned long nr_pages;
11 
12     char qemu_dm_logfilename[64];
13@@ -6530,6 +6531,10 @@
14                                        PROT_READ|PROT_WRITE,
15                                        BUFFER_IO_PAGE_START >> PAGE_SHIFT);
16 
17+    buffered_pio_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
18+                                       PROT_READ|PROT_WRITE,
19+                                       BUFFER_PIO_PAGE_START >> PAGE_SHIFT);
20+
21     for (i = 0; i < nr_pages; i++)
22         page_array[i] = i;
23       
24Index: ioemu/hw/ide.c
25===================================================================
26--- ioemu.orig/hw/ide.c 2007-05-03 15:07:15.000000000 +0100
27+++ ioemu/hw/ide.c      2007-05-03 15:07:15.000000000 +0100
28@@ -474,6 +474,121 @@
29 }
30 #endif /* DMA_MULTI_THREAD */
31 
32+#if defined(__ia64__)
33+#include <xen/hvm/ioreq.h>
34+
35+struct buffered_piopage *buffered_pio_page;
36+
37+static inline struct pio_buffer *
38+piobuf_by_addr(uint32_t addr)
39+{
40+    if (addr == 0x1F0)
41+        return &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];
42+    if (addr == 0x170)
43+        return &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];
44+    return NULL;
45+}
46+
47+static void
48+buffered_pio_init(void)
49+{
50+    struct pio_buffer *p1, *p2;
51+    uint32_t off1, off2;
52+
53+    if (!buffered_pio_page)
54+        return;
55+
56+    p1 = &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];
57+    p2 = &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];
58+    off1 = offsetof(struct buffered_piopage, buffer);
59+    off2 = (off1 + TARGET_PAGE_SIZE)/2;
60+
61+    p1->buf_size = off2 - off1;
62+    p1->page_offset = off1;
63+
64+    p2->buf_size = TARGET_PAGE_SIZE - off2;
65+    p2->page_offset = off2;
66+}
67+
68+static inline void
69+buffered_pio_flush(struct pio_buffer *piobuf)
70+{
71+    IDEState *s = piobuf->opaque;
72+    uint32_t pointer = piobuf->pointer;
73+
74+    if (s != NULL && pointer > 0) {
75+        uint8_t *buf = (uint8_t *)buffered_pio_page + piobuf->page_offset;
76+        memcpy(s->data_ptr, buf, pointer);
77+        s->data_ptr += pointer;
78+    }
79+}
80+
81+static inline void
82+buffered_pio_reset(IDEState *s)
83+{
84+    struct pio_buffer *piobuf;
85+
86+    if ((unsigned)s->drive_serial - 1 < 2)      /* 1,2 */
87+        piobuf = &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];
88+    else if ((unsigned)s->drive_serial - 3 < 2) /* 3,4 */
89+        piobuf = &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];
90+    else
91+        return;
92+    buffered_pio_flush(piobuf);
93+    piobuf->pointer = 0;
94+    piobuf->data_end = 0;
95+    piobuf->opaque = NULL;
96+}
97+
98+static inline void
99+buffered_pio_write(IDEState *s, uint32_t addr, int size)
100+{
101+    struct pio_buffer *piobuf = piobuf_by_addr(addr);
102+    int data_end;
103+
104+    if (!piobuf)
105+        return;
106+    buffered_pio_flush(piobuf);
107+    data_end = s->data_end - s->data_ptr - size;
108+    if (data_end <= 0)
109+        data_end = 0;
110+    else if (data_end > piobuf->buf_size)
111+        data_end = piobuf->buf_size;
112+    piobuf->pointer = 0;
113+    piobuf->data_end = data_end;
114+    piobuf->opaque = s;
115+}
116+
117+static inline void
118+buffered_pio_read(IDEState *s, uint32_t addr, int size)
119+{
120+    struct pio_buffer *piobuf = piobuf_by_addr(addr);
121+    int data_end;
122+
123+    if (!piobuf)
124+        return;
125+    s->data_ptr += piobuf->pointer;
126+    data_end = s->data_end - s->data_ptr - size;
127+    if (data_end <= 0) {
128+        data_end = 0;
129+    } else {
130+       uint8_t *buf = (uint8_t *)buffered_pio_page + piobuf->page_offset;
131+        if (data_end > piobuf->buf_size)
132+            data_end = piobuf->buf_size;
133+        memcpy(buf, s->data_ptr + size, data_end);
134+    }
135+    piobuf->pointer = 0;
136+    piobuf->data_end = data_end;
137+    piobuf->opaque = NULL;
138+}
139+
140+#else /* !__ia64__ */
141+#define buffered_pio_init()         do {} while (0)
142+#define buffered_pio_reset(I)       do {} while (0)
143+#define buffered_pio_write(I,A,S)   do {} while (0)
144+#define buffered_pio_read(I,A,S)    do {} while (0)
145+#endif
146+
147 static void ide_dma_start(IDEState *s, IDEDMAFunc *dma_cb);
148 
149 static void padstr(char *str, const char *src, int len)
150@@ -658,6 +773,7 @@
151     s->data_ptr = buf;
152     s->data_end = buf + size;
153     s->status |= DRQ_STAT;
154+    buffered_pio_reset(s);
155 }
156 
157 static void ide_transfer_stop(IDEState *s)
158@@ -666,6 +782,7 @@
159     s->data_ptr = s->io_buffer;
160     s->data_end = s->io_buffer;
161     s->status &= ~DRQ_STAT;
162+    buffered_pio_reset(s);
163 }
164 
165 static int64_t ide_get_sector(IDEState *s)
166@@ -1578,6 +1695,7 @@
167         ide_if[0].select = (val & ~0x10) | 0xa0;
168         ide_if[1].select = (val | 0x10) | 0xa0;
169         /* select drive */
170+        buffered_pio_reset(ide_if->cur_drive);
171         unit = (val >> 4) & 1;
172         s = ide_if + unit;
173         ide_if->cur_drive = s;
174@@ -1936,6 +2054,7 @@
175     IDEState *s = ((IDEState *)opaque)->cur_drive;
176     uint8_t *p;
177 
178+    buffered_pio_write(s, addr, 2);
179     p = s->data_ptr;
180     *(uint16_t *)p = le16_to_cpu(val);
181     p += 2;
182@@ -1949,6 +2068,8 @@
183     IDEState *s = ((IDEState *)opaque)->cur_drive;
184     uint8_t *p;
185     int ret;
186+   
187+    buffered_pio_read(s, addr, 2);
188     p = s->data_ptr;
189     ret = cpu_to_le16(*(uint16_t *)p);
190     p += 2;
191@@ -1963,6 +2084,7 @@
192     IDEState *s = ((IDEState *)opaque)->cur_drive;
193     uint8_t *p;
194 
195+    buffered_pio_write(s, addr, 4);
196     p = s->data_ptr;
197     *(uint32_t *)p = le32_to_cpu(val);
198     p += 4;
199@@ -1977,6 +2099,7 @@
200     uint8_t *p;
201     int ret;
202     
203+    buffered_pio_read(s, addr, 4);
204     p = s->data_ptr;
205     ret = cpu_to_le32(*(uint32_t *)p);
206     p += 4;
207@@ -2634,6 +2757,8 @@
208     ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
209     ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
210 
211+    buffered_pio_init();
212+
213     register_savevm("ide_pci", 0, 1, generic_pci_save, generic_pci_load, d);
214     register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
215 
Note: See TracBrowser for help on using the repository browser.