source: trunk/packages/xen-3.1/xen-3.1/tools/ioemu/patches/ioemu-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: 14.2 KB
Line 
1Index: ioemu/hw/iommu.c
2===================================================================
3--- ioemu.orig/hw/iommu.c       2007-05-03 09:56:32.000000000 +0100
4+++ ioemu/hw/iommu.c    2007-05-03 10:05:51.000000000 +0100
5@@ -82,7 +82,11 @@
6 #define IOPTE_VALID         0x00000002 /* IOPTE is valid */
7 #define IOPTE_WAZ           0x00000001 /* Write as zeros */
8 
9+#if defined(__i386__) || defined(__x86_64__)
10 #define PAGE_SHIFT      12
11+#elif defined(__ia64__)
12+#define PAGE_SHIFT      14
13+#endif
14 #define PAGE_SIZE       (1 << PAGE_SHIFT)
15 #define PAGE_MASK      (PAGE_SIZE - 1)
16 
17Index: ioemu/cpu-all.h
18===================================================================
19--- ioemu.orig/cpu-all.h        2007-05-03 09:56:32.000000000 +0100
20+++ ioemu/cpu-all.h     2007-05-03 10:05:51.000000000 +0100
21@@ -835,6 +835,31 @@
22                 :"=m" (*(volatile long *)addr)
23                 :"dIr" (nr));
24 }
25+#elif defined(__ia64__)
26+#include "ia64_intrinsic.h"
27+#define atomic_set_bit(nr, addr) ({                                    \
28+       typeof(*addr) bit, old, new;                                    \
29+       volatile typeof(*addr) *m;                                      \
30+                                                                       \
31+       m = (volatile typeof(*addr)*)(addr + nr / (8*sizeof(*addr)));   \
32+       bit = 1 << (nr % (8*sizeof(*addr)));                            \
33+       do {                                                            \
34+               old = *m;                                               \
35+               new = old | bit;                                        \
36+       } while (cmpxchg_acq(m, old, new) != old);                      \
37+})
38+
39+#define atomic_clear_bit(nr, addr) ({                                  \
40+       typeof(*addr) bit, old, new;                                    \
41+       volatile typeof(*addr) *m;                                      \
42+                                                                       \
43+       m = (volatile typeof(*addr)*)(addr + nr / (8*sizeof(*addr)));   \
44+       bit = ~(1 << (nr % (8*sizeof(*addr))));                         \
45+       do {                                                            \
46+               old = *m;                                               \
47+               new = old & bit;                                        \
48+       } while (cmpxchg_acq(m, old, new) != old);                      \
49+})
50 #endif
51 
52 /* memory API */
53Index: ioemu/vl.c
54===================================================================
55--- ioemu.orig/vl.c     2007-05-03 10:04:06.000000000 +0100
56+++ ioemu/vl.c  2007-05-03 10:25:23.000000000 +0100
57@@ -6142,6 +6142,11 @@
58             exit(1);
59     }
60 
61+#if defined (__ia64__)
62+    if (ram_size > MMIO_START)
63+        ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
64+#endif
65+
66     /* init the memory */
67     phys_ram_size = ram_size + vga_ram_size + bios_size;
68 
69@@ -6182,6 +6187,44 @@
70 
71     free(page_array);
72 
73+#elif defined(__ia64__)
74+
75+    nr_pages = ram_size/PAGE_SIZE;
76+
77+    page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
78+    if (page_array == NULL) {
79+        fprintf(logfile, "malloc returned error %d\n", errno);
80+        exit(-1);
81+    }
82+
83+    shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
84+                                       PROT_READ|PROT_WRITE,
85+                                       IO_PAGE_START >> PAGE_SHIFT);
86+
87+    buffered_io_page =xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
88+                                       PROT_READ|PROT_WRITE,
89+                                       BUFFER_IO_PAGE_START >> PAGE_SHIFT);
90+
91+    for (i = 0; i < nr_pages; i++)
92+        page_array[i] = i;
93+       
94+    /* VTI will not use memory between 3G~4G, so we just pass a legal pfn
95+       to make QEMU map continuous virtual memory space */
96+    if (ram_size > MMIO_START) {       
97+        for (i = 0 ; i < (MEM_G >> PAGE_SHIFT); i++)
98+            page_array[(MMIO_START >> PAGE_SHIFT) + i] =
99+                (STORE_PAGE_START >> PAGE_SHIFT);
100+    }
101+
102+    phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
103+                                         PROT_READ|PROT_WRITE,
104+                                         page_array, nr_pages);
105+    if (phys_ram_base == 0) {
106+        fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
107+        exit(-1);
108+    }
109+    free(page_array);
110+#endif
111 #else  /* !CONFIG_DM */
112 
113     phys_ram_base = qemu_vmalloc(phys_ram_size);
114Index: ioemu/exec-all.h
115===================================================================
116--- ioemu.orig/exec-all.h       2007-05-03 09:56:32.000000000 +0100
117+++ ioemu/exec-all.h    2007-05-03 10:05:51.000000000 +0100
118@@ -462,12 +462,13 @@
119 }
120 #endif
121 
122-#ifdef __ia64
123-#include <ia64intrin.h>
124+#ifdef __ia64__
125+#include "ia64_intrinsic.h"
126 
127 static inline int testandset (int *p)
128 {
129-    return __sync_lock_test_and_set (p, 1);
130+    uint32_t o = 0, n = 1;
131+    return (int)cmpxchg_acq(p, o, n);
132 }
133 #endif
134 
135Index: ioemu/target-i386-dm/cpu.h
136===================================================================
137--- ioemu.orig/target-i386-dm/cpu.h     2007-05-03 09:56:32.000000000 +0100
138+++ ioemu/target-i386-dm/cpu.h  2007-05-03 10:25:13.000000000 +0100
139@@ -78,7 +78,11 @@
140 /* helper2.c */
141 int main_loop(void);
142 
143+#if defined(__i386__) || defined(__x86_64__)
144 #define TARGET_PAGE_BITS 12
145+#elif defined(__ia64__)
146+#define TARGET_PAGE_BITS 14
147+#endif
148 #include "cpu-all.h"
149 
150 #endif /* CPU_I386_H */
151Index: ioemu/ia64_intrinsic.h
152===================================================================
153--- /dev/null   1970-01-01 00:00:00.000000000 +0000
154+++ ioemu/ia64_intrinsic.h      2007-05-03 10:05:51.000000000 +0100
155@@ -0,0 +1,276 @@
156+#ifndef IA64_INTRINSIC_H
157+#define IA64_INTRINSIC_H
158+
159+/*
160+ * Compiler-dependent Intrinsics
161+ *
162+ * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
163+ * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
164+ *
165+ */
166+extern long ia64_cmpxchg_called_with_bad_pointer (void);
167+extern void ia64_bad_param_for_getreg (void);
168+#define ia64_cmpxchg(sem,ptr,o,n,s) ({                                 \
169+       uint64_t _o, _r;                                                \
170+       switch(s) {                                                     \
171+               case 1: _o = (uint8_t)(long)(o); break;                 \
172+               case 2: _o = (uint16_t)(long)(o); break;                \
173+               case 4: _o = (uint32_t)(long)(o); break;                \
174+               case 8: _o = (uint64_t)(long)(o); break;                \
175+               default: break;                                         \
176+       }                                                               \
177+       switch(s) {                                                     \
178+               case 1:                                                 \
179+               _r = ia64_cmpxchg1_##sem((uint8_t*)ptr,n,_o); break;    \
180+               case 2:                                                 \
181+               _r = ia64_cmpxchg2_##sem((uint16_t*)ptr,n,_o); break;   \
182+               case 4:                                                 \
183+               _r = ia64_cmpxchg4_##sem((uint32_t*)ptr,n,_o); break;   \
184+               case 8:                                                 \
185+               _r = ia64_cmpxchg8_##sem((uint64_t*)ptr,n,_o); break;   \
186+               default:                                                \
187+               _r = ia64_cmpxchg_called_with_bad_pointer(); break;     \
188+       }                                                               \
189+       (__typeof__(o)) _r;                                             \
190+})
191+
192+#define cmpxchg_acq(ptr,o,n) ia64_cmpxchg(acq,ptr,o,n,sizeof(*ptr))
193+#define cmpxchg_rel(ptr,o,n) ia64_cmpxchg(rel,ptr,o,n,sizeof(*ptr))
194+
195+/*
196+ * Register Names for getreg() and setreg().
197+ *
198+ * The "magic" numbers happen to match the values used by the Intel compiler's
199+ * getreg()/setreg() intrinsics.
200+ */
201+
202+/* Special Registers */
203+
204+#define _IA64_REG_IP           1016    /* getreg only */
205+#define _IA64_REG_PSR          1019
206+#define _IA64_REG_PSR_L                1019
207+
208+/* General Integer Registers */
209+
210+#define _IA64_REG_GP           1025    /* R1 */
211+#define _IA64_REG_R8           1032    /* R8 */
212+#define _IA64_REG_R9           1033    /* R9 */
213+#define _IA64_REG_SP           1036    /* R12 */
214+#define _IA64_REG_TP           1037    /* R13 */
215+
216+/* Application Registers */
217+
218+#define _IA64_REG_AR_KR0       3072
219+#define _IA64_REG_AR_KR1       3073
220+#define _IA64_REG_AR_KR2       3074
221+#define _IA64_REG_AR_KR3       3075
222+#define _IA64_REG_AR_KR4       3076
223+#define _IA64_REG_AR_KR5       3077
224+#define _IA64_REG_AR_KR6       3078
225+#define _IA64_REG_AR_KR7       3079
226+#define _IA64_REG_AR_RSC       3088
227+#define _IA64_REG_AR_BSP       3089
228+#define _IA64_REG_AR_BSPSTORE  3090
229+#define _IA64_REG_AR_RNAT      3091
230+#define _IA64_REG_AR_FCR       3093
231+#define _IA64_REG_AR_EFLAG     3096
232+#define _IA64_REG_AR_CSD       3097
233+#define _IA64_REG_AR_SSD       3098
234+#define _IA64_REG_AR_CFLAG     3099
235+#define _IA64_REG_AR_FSR       3100
236+#define _IA64_REG_AR_FIR       3101
237+#define _IA64_REG_AR_FDR       3102
238+#define _IA64_REG_AR_CCV       3104
239+#define _IA64_REG_AR_UNAT      3108
240+#define _IA64_REG_AR_FPSR      3112
241+#define _IA64_REG_AR_ITC       3116
242+#define _IA64_REG_AR_PFS       3136
243+#define _IA64_REG_AR_LC                3137
244+#define _IA64_REG_AR_EC                3138
245+
246+/* Control Registers */
247+
248+#define _IA64_REG_CR_DCR       4096
249+#define _IA64_REG_CR_ITM       4097
250+#define _IA64_REG_CR_IVA       4098
251+#define _IA64_REG_CR_PTA       4104
252+#define _IA64_REG_CR_IPSR      4112
253+#define _IA64_REG_CR_ISR       4113
254+#define _IA64_REG_CR_IIP       4115
255+#define _IA64_REG_CR_IFA       4116
256+#define _IA64_REG_CR_ITIR      4117
257+#define _IA64_REG_CR_IIPA      4118
258+#define _IA64_REG_CR_IFS       4119
259+#define _IA64_REG_CR_IIM       4120
260+#define _IA64_REG_CR_IHA       4121
261+#define _IA64_REG_CR_LID       4160
262+#define _IA64_REG_CR_IVR       4161    /* getreg only */
263+#define _IA64_REG_CR_TPR       4162
264+#define _IA64_REG_CR_EOI       4163
265+#define _IA64_REG_CR_IRR0      4164    /* getreg only */
266+#define _IA64_REG_CR_IRR1      4165    /* getreg only */
267+#define _IA64_REG_CR_IRR2      4166    /* getreg only */
268+#define _IA64_REG_CR_IRR3      4167    /* getreg only */
269+#define _IA64_REG_CR_ITV       4168
270+#define _IA64_REG_CR_PMV       4169
271+#define _IA64_REG_CR_CMCV      4170
272+#define _IA64_REG_CR_LRR0      4176
273+#define _IA64_REG_CR_LRR1      4177
274+
275+/* Indirect Registers for getindreg() and setindreg() */
276+
277+#define _IA64_REG_INDR_CPUID   9000    /* getindreg only */
278+#define _IA64_REG_INDR_DBR     9001
279+#define _IA64_REG_INDR_IBR     9002
280+#define _IA64_REG_INDR_PKR     9003
281+#define _IA64_REG_INDR_PMC     9004
282+#define _IA64_REG_INDR_PMD     9005
283+#define _IA64_REG_INDR_RR      9006
284+
285+#ifdef __INTEL_COMPILER
286+void  __fc(uint64_t *addr);
287+void  __synci(void);
288+void __isrlz(void);
289+void __dsrlz(void);
290+uint64_t __getReg(const int whichReg);
291+uint64_t _InterlockedCompareExchange8_rel(volatile uint8_t *dest, uint64_t xchg, uint64_t comp);
292+uint64_t _InterlockedCompareExchange8_acq(volatile uint8_t *dest, uint64_t xchg, uint64_t comp);
293+uint64_t _InterlockedCompareExchange16_rel(volatile uint16_t *dest, uint64_t xchg, uint64_t comp);
294+uint64_t _InterlockedCompareExchange16_acq(volatile uint16_t *dest, uint64_t xchg, uint64_t comp);
295+uint64_t _InterlockedCompareExchange_rel(volatile uint32_t *dest, uint64_t xchg, uint64_t comp);
296+uint64_t _InterlockedCompareExchange_acq(volatile uint32_t *dest, uint64_t xchg, uint64_t comp);
297+uint64_t _InterlockedCompareExchange64_rel(volatile uint64_t *dest, uint64_t xchg, uint64_t comp);
298+u64_t _InterlockedCompareExchange64_acq(volatile uint64_t *dest, uint64_t xchg, uint64_t comp);
299+
300+#define ia64_cmpxchg1_rel      _InterlockedCompareExchange8_rel
301+#define ia64_cmpxchg1_acq      _InterlockedCompareExchange8_acq
302+#define ia64_cmpxchg2_rel      _InterlockedCompareExchange16_rel
303+#define ia64_cmpxchg2_acq      _InterlockedCompareExchange16_acq
304+#define ia64_cmpxchg4_rel      _InterlockedCompareExchange_rel
305+#define ia64_cmpxchg4_acq      _InterlockedCompareExchange_acq
306+#define ia64_cmpxchg8_rel      _InterlockedCompareExchange64_rel
307+#define ia64_cmpxchg8_acq      _InterlockedCompareExchange64_acq
308+
309+#define ia64_srlz_d            __dsrlz
310+#define ia64_srlz_i            __isrlz
311+#define __ia64_fc              __fc
312+#define ia64_sync_i            __synci
313+#define __ia64_getreg          __getReg
314+#else /* __INTEL_COMPILER */
315+#define ia64_cmpxchg1_acq(ptr, new, old)                                               \
316+({                                                                                     \
317+       uint64_t ia64_intri_res;                                                        \
318+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
319+       asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":                                 \
320+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
321+       ia64_intri_res;                                                                 \
322+})
323+
324+#define ia64_cmpxchg1_rel(ptr, new, old)                                               \
325+({                                                                                     \
326+       uint64_t ia64_intri_res;                                                        \
327+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
328+       asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":                                 \
329+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
330+       ia64_intri_res;                                                                 \
331+})
332+
333+#define ia64_cmpxchg2_acq(ptr, new, old)                                               \
334+({                                                                                     \
335+       uint64_t ia64_intri_res;                                                        \
336+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
337+       asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":                                 \
338+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
339+       ia64_intri_res;                                                                 \
340+})
341+
342+#define ia64_cmpxchg2_rel(ptr, new, old)                                               \
343+({                                                                                     \
344+       uint64_t ia64_intri_res;                                                        \
345+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
346+                                                                                       \
347+       asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":                                 \
348+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
349+       ia64_intri_res;                                                                 \
350+})
351+
352+#define ia64_cmpxchg4_acq(ptr, new, old)                                               \
353+({                                                                                     \
354+       uint64_t ia64_intri_res;                                                        \
355+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
356+       asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":                                 \
357+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
358+       ia64_intri_res;                                                                 \
359+})
360+
361+#define ia64_cmpxchg4_rel(ptr, new, old)                                               \
362+({                                                                                     \
363+       uint64_t ia64_intri_res;                                                        \
364+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
365+       asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":                                 \
366+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
367+       ia64_intri_res;                                                                 \
368+})
369+
370+#define ia64_cmpxchg8_acq(ptr, new, old)                                               \
371+({                                                                                     \
372+       uint64_t ia64_intri_res;                                                        \
373+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
374+       asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":                                 \
375+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
376+       ia64_intri_res;                                                                 \
377+})
378+
379+#define ia64_cmpxchg8_rel(ptr, new, old)                                               \
380+({                                                                                     \
381+       uint64_t ia64_intri_res;                                                        \
382+       asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));                                  \
383+                                                                                       \
384+       asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":                                 \
385+                             "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");    \
386+       ia64_intri_res;                                                                 \
387+})
388+
389+#define ia64_srlz_i()  asm volatile (";; srlz.i ;;" ::: "memory")
390+#define ia64_srlz_d()  asm volatile (";; srlz.d" ::: "memory");
391+#define __ia64_fc(addr)        asm volatile ("fc %0" :: "r"(addr) : "memory")
392+#define ia64_sync_i()  asm volatile (";; sync.i" ::: "memory")
393+
394+register unsigned long ia64_r13 asm ("r13") __attribute_used__;
395+#define __ia64_getreg(regnum)                                                  \
396+({                                                                             \
397+       uint64_t ia64_intri_res;                                                        \
398+                                                                               \
399+       switch (regnum) {                                                       \
400+       case _IA64_REG_GP:                                                      \
401+               asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));              \
402+               break;                                                          \
403+       case _IA64_REG_IP:                                                      \
404+               asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));              \
405+               break;                                                          \
406+       case _IA64_REG_PSR:                                                     \
407+               asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));             \
408+               break;                                                          \
409+       case _IA64_REG_TP:      /* for current() */                             \
410+               ia64_intri_res = ia64_r13;                                      \
411+               break;                                                          \
412+       case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:                              \
413+               asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)             \
414+                                     : "i"(regnum - _IA64_REG_AR_KR0));        \
415+               break;                                                          \
416+       case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:                            \
417+               asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)             \
418+                                     : "i" (regnum - _IA64_REG_CR_DCR));       \
419+               break;                                                          \
420+       case _IA64_REG_SP:                                                      \
421+               asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));             \
422+               break;                                                          \
423+       default:                                                                \
424+               ia64_bad_param_for_getreg();                                    \
425+               break;                                                          \
426+       }                                                                       \
427+       ia64_intri_res;                                                         \
428+})
429+
430+#endif /* __INTEL_COMPILER */
431+#endif /* IA64_INTRINSIC_H */
Note: See TracBrowser for help on using the repository browser.