diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2008-10-17 12:20:26 -0400 |
---|---|---|
committer | Arjan van de Ven <arjan@linux.intel.com> | 2008-10-17 12:20:26 -0400 |
commit | 651dab4264e4ba0e563f5ff56f748127246e9065 (patch) | |
tree | 016630974bdcb00fe529b673f96d389e0fd6dc94 /arch/ia64 | |
parent | 40b8606253552109815786e5d4b0de98782d31f5 (diff) | |
parent | 2e532d68a2b3e2aa6b19731501222069735c741c (diff) |
Merge commit 'linus/master' into merge-linus
Conflicts:
arch/x86/kvm/i8254.c
Diffstat (limited to 'arch/ia64')
33 files changed, 380 insertions, 326 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 48e496fe1e75..3b7aa38254a8 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -60,14 +60,6 @@ config RWSEM_XCHGADD_ALGORITHM | |||
60 | bool | 60 | bool |
61 | default y | 61 | default y |
62 | 62 | ||
63 | config ARCH_HAS_ILOG2_U32 | ||
64 | bool | ||
65 | default n | ||
66 | |||
67 | config ARCH_HAS_ILOG2_U64 | ||
68 | bool | ||
69 | default n | ||
70 | |||
71 | config HUGETLB_PAGE_SIZE_VARIABLE | 63 | config HUGETLB_PAGE_SIZE_VARIABLE |
72 | bool | 64 | bool |
73 | depends on HUGETLB_PAGE | 65 | depends on HUGETLB_PAGE |
diff --git a/arch/ia64/ia32/binfmt_elf32.c b/arch/ia64/ia32/binfmt_elf32.c index 4f0c30c38e99..f92bdaac8976 100644 --- a/arch/ia64/ia32/binfmt_elf32.c +++ b/arch/ia64/ia32/binfmt_elf32.c | |||
@@ -41,7 +41,7 @@ randomize_stack_top(unsigned long stack_top); | |||
41 | #define elf_map elf32_map | 41 | #define elf_map elf32_map |
42 | 42 | ||
43 | #undef SET_PERSONALITY | 43 | #undef SET_PERSONALITY |
44 | #define SET_PERSONALITY(ex, ibcs2) elf32_set_personality() | 44 | #define SET_PERSONALITY(ex) elf32_set_personality() |
45 | 45 | ||
46 | #define elf_read_implies_exec(ex, have_pt_gnu_stack) (!(have_pt_gnu_stack)) | 46 | #define elf_read_implies_exec(ex, have_pt_gnu_stack) (!(have_pt_gnu_stack)) |
47 | 47 | ||
diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S index ff88c48c5d19..53505bb04771 100644 --- a/arch/ia64/ia32/ia32_entry.S +++ b/arch/ia64/ia32/ia32_entry.S | |||
@@ -251,8 +251,8 @@ ia32_syscall_table: | |||
251 | data8 compat_sys_setrlimit /* 75 */ | 251 | data8 compat_sys_setrlimit /* 75 */ |
252 | data8 compat_sys_old_getrlimit | 252 | data8 compat_sys_old_getrlimit |
253 | data8 compat_sys_getrusage | 253 | data8 compat_sys_getrusage |
254 | data8 sys32_gettimeofday | 254 | data8 compat_sys_gettimeofday |
255 | data8 sys32_settimeofday | 255 | data8 compat_sys_settimeofday |
256 | data8 sys32_getgroups16 /* 80 */ | 256 | data8 sys32_getgroups16 /* 80 */ |
257 | data8 sys32_setgroups16 | 257 | data8 sys32_setgroups16 |
258 | data8 sys32_old_select | 258 | data8 sys32_old_select |
diff --git a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h index dd0c53687a96..0f15349c3c6b 100644 --- a/arch/ia64/ia32/ia32priv.h +++ b/arch/ia64/ia32/ia32priv.h | |||
@@ -332,8 +332,8 @@ void ia64_elf32_init(struct pt_regs *regs); | |||
332 | #define ELF_PLATFORM NULL | 332 | #define ELF_PLATFORM NULL |
333 | 333 | ||
334 | #ifdef __KERNEL__ | 334 | #ifdef __KERNEL__ |
335 | # define SET_PERSONALITY(EX,IBCS2) \ | 335 | # define SET_PERSONALITY(EX) \ |
336 | (current->personality = (IBCS2) ? PER_SVR4 : PER_LINUX) | 336 | (current->personality = PER_LINUX) |
337 | #endif | 337 | #endif |
338 | 338 | ||
339 | #define IA32_EFLAG 0x200 | 339 | #define IA32_EFLAG 0x200 |
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index bf196cbb3796..f4430bb4bbdc 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c | |||
@@ -118,41 +118,6 @@ sys32_execve (char __user *name, compat_uptr_t __user *argv, compat_uptr_t __use | |||
118 | return error; | 118 | return error; |
119 | } | 119 | } |
120 | 120 | ||
121 | int cp_compat_stat(struct kstat *stat, struct compat_stat __user *ubuf) | ||
122 | { | ||
123 | compat_ino_t ino; | ||
124 | int err; | ||
125 | |||
126 | if ((u64) stat->size > MAX_NON_LFS || | ||
127 | !old_valid_dev(stat->dev) || | ||
128 | !old_valid_dev(stat->rdev)) | ||
129 | return -EOVERFLOW; | ||
130 | |||
131 | ino = stat->ino; | ||
132 | if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino) | ||
133 | return -EOVERFLOW; | ||
134 | |||
135 | if (clear_user(ubuf, sizeof(*ubuf))) | ||
136 | return -EFAULT; | ||
137 | |||
138 | err = __put_user(old_encode_dev(stat->dev), &ubuf->st_dev); | ||
139 | err |= __put_user(ino, &ubuf->st_ino); | ||
140 | err |= __put_user(stat->mode, &ubuf->st_mode); | ||
141 | err |= __put_user(stat->nlink, &ubuf->st_nlink); | ||
142 | err |= __put_user(high2lowuid(stat->uid), &ubuf->st_uid); | ||
143 | err |= __put_user(high2lowgid(stat->gid), &ubuf->st_gid); | ||
144 | err |= __put_user(old_encode_dev(stat->rdev), &ubuf->st_rdev); | ||
145 | err |= __put_user(stat->size, &ubuf->st_size); | ||
146 | err |= __put_user(stat->atime.tv_sec, &ubuf->st_atime); | ||
147 | err |= __put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec); | ||
148 | err |= __put_user(stat->mtime.tv_sec, &ubuf->st_mtime); | ||
149 | err |= __put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec); | ||
150 | err |= __put_user(stat->ctime.tv_sec, &ubuf->st_ctime); | ||
151 | err |= __put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec); | ||
152 | err |= __put_user(stat->blksize, &ubuf->st_blksize); | ||
153 | err |= __put_user(stat->blocks, &ubuf->st_blocks); | ||
154 | return err; | ||
155 | } | ||
156 | 121 | ||
157 | #if PAGE_SHIFT > IA32_PAGE_SHIFT | 122 | #if PAGE_SHIFT > IA32_PAGE_SHIFT |
158 | 123 | ||
@@ -1148,68 +1113,12 @@ sys32_pipe (int __user *fd) | |||
1148 | return retval; | 1113 | return retval; |
1149 | } | 1114 | } |
1150 | 1115 | ||
1151 | static inline long | ||
1152 | get_tv32 (struct timeval *o, struct compat_timeval __user *i) | ||
1153 | { | ||
1154 | return (!access_ok(VERIFY_READ, i, sizeof(*i)) || | ||
1155 | (__get_user(o->tv_sec, &i->tv_sec) | __get_user(o->tv_usec, &i->tv_usec))); | ||
1156 | } | ||
1157 | |||
1158 | static inline long | ||
1159 | put_tv32 (struct compat_timeval __user *o, struct timeval *i) | ||
1160 | { | ||
1161 | return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || | ||
1162 | (__put_user(i->tv_sec, &o->tv_sec) | __put_user(i->tv_usec, &o->tv_usec))); | ||
1163 | } | ||
1164 | |||
1165 | asmlinkage unsigned long | 1116 | asmlinkage unsigned long |
1166 | sys32_alarm (unsigned int seconds) | 1117 | sys32_alarm (unsigned int seconds) |
1167 | { | 1118 | { |
1168 | return alarm_setitimer(seconds); | 1119 | return alarm_setitimer(seconds); |
1169 | } | 1120 | } |
1170 | 1121 | ||
1171 | /* Translations due to time_t size differences. Which affects all | ||
1172 | sorts of things, like timeval and itimerval. */ | ||
1173 | |||
1174 | extern struct timezone sys_tz; | ||
1175 | |||
1176 | asmlinkage long | ||
1177 | sys32_gettimeofday (struct compat_timeval __user *tv, struct timezone __user *tz) | ||
1178 | { | ||
1179 | if (tv) { | ||
1180 | struct timeval ktv; | ||
1181 | do_gettimeofday(&ktv); | ||
1182 | if (put_tv32(tv, &ktv)) | ||
1183 | return -EFAULT; | ||
1184 | } | ||
1185 | if (tz) { | ||
1186 | if (copy_to_user(tz, &sys_tz, sizeof(sys_tz))) | ||
1187 | return -EFAULT; | ||
1188 | } | ||
1189 | return 0; | ||
1190 | } | ||
1191 | |||
1192 | asmlinkage long | ||
1193 | sys32_settimeofday (struct compat_timeval __user *tv, struct timezone __user *tz) | ||
1194 | { | ||
1195 | struct timeval ktv; | ||
1196 | struct timespec kts; | ||
1197 | struct timezone ktz; | ||
1198 | |||
1199 | if (tv) { | ||
1200 | if (get_tv32(&ktv, tv)) | ||
1201 | return -EFAULT; | ||
1202 | kts.tv_sec = ktv.tv_sec; | ||
1203 | kts.tv_nsec = ktv.tv_usec * 1000; | ||
1204 | } | ||
1205 | if (tz) { | ||
1206 | if (copy_from_user(&ktz, tz, sizeof(ktz))) | ||
1207 | return -EFAULT; | ||
1208 | } | ||
1209 | |||
1210 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); | ||
1211 | } | ||
1212 | |||
1213 | struct sel_arg_struct { | 1122 | struct sel_arg_struct { |
1214 | unsigned int n; | 1123 | unsigned int n; |
1215 | unsigned int inp; | 1124 | unsigned int inp; |
diff --git a/arch/ia64/include/asm/a.out.h b/arch/ia64/include/asm/a.out.h deleted file mode 100644 index 193dcfb67596..000000000000 --- a/arch/ia64/include/asm/a.out.h +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | #ifndef _ASM_IA64_A_OUT_H | ||
2 | #define _ASM_IA64_A_OUT_H | ||
3 | |||
4 | /* | ||
5 | * No a.out format has been (or should be) defined so this file is | ||
6 | * just a dummy that allows us to get binfmt_elf compiled. It | ||
7 | * probably would be better to clean up binfmt_elf.c so it does not | ||
8 | * necessarily depend on there being a.out support. | ||
9 | * | ||
10 | * Modified 1998-2002 | ||
11 | * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co. | ||
12 | */ | ||
13 | |||
14 | #include <linux/types.h> | ||
15 | |||
16 | struct exec { | ||
17 | unsigned long a_info; | ||
18 | unsigned long a_text; | ||
19 | unsigned long a_data; | ||
20 | unsigned long a_bss; | ||
21 | unsigned long a_entry; | ||
22 | }; | ||
23 | |||
24 | #define N_TXTADDR(x) 0 | ||
25 | #define N_DATADDR(x) 0 | ||
26 | #define N_BSSADDR(x) 0 | ||
27 | #define N_DRSIZE(x) 0 | ||
28 | #define N_TRSIZE(x) 0 | ||
29 | #define N_SYMSIZE(x) 0 | ||
30 | #define N_TXTOFF(x) 0 | ||
31 | |||
32 | #endif /* _ASM_IA64_A_OUT_H */ | ||
diff --git a/arch/ia64/include/asm/dma-mapping.h b/arch/ia64/include/asm/dma-mapping.h index 9f0df9bd46b7..06ff1ba21465 100644 --- a/arch/ia64/include/asm/dma-mapping.h +++ b/arch/ia64/include/asm/dma-mapping.h | |||
@@ -8,7 +8,9 @@ | |||
8 | #include <asm/machvec.h> | 8 | #include <asm/machvec.h> |
9 | #include <linux/scatterlist.h> | 9 | #include <linux/scatterlist.h> |
10 | 10 | ||
11 | #define dma_alloc_coherent platform_dma_alloc_coherent | 11 | #define dma_alloc_coherent(dev, size, handle, gfp) \ |
12 | platform_dma_alloc_coherent(dev, size, handle, (gfp) | GFP_DMA) | ||
13 | |||
12 | /* coherent mem. is cheap */ | 14 | /* coherent mem. is cheap */ |
13 | static inline void * | 15 | static inline void * |
14 | dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | 16 | dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle, |
diff --git a/arch/ia64/include/asm/elf.h b/arch/ia64/include/asm/elf.h index 5e0c1a6bce8d..86eddee029cb 100644 --- a/arch/ia64/include/asm/elf.h +++ b/arch/ia64/include/asm/elf.h | |||
@@ -202,7 +202,7 @@ extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst); | |||
202 | relevant until we have real hardware to play with... */ | 202 | relevant until we have real hardware to play with... */ |
203 | #define ELF_PLATFORM NULL | 203 | #define ELF_PLATFORM NULL |
204 | 204 | ||
205 | #define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX) | 205 | #define SET_PERSONALITY(ex) set_personality(PER_LINUX) |
206 | #define elf_read_implies_exec(ex, executable_stack) \ | 206 | #define elf_read_implies_exec(ex, executable_stack) \ |
207 | ((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0) | 207 | ((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0) |
208 | 208 | ||
@@ -266,4 +266,19 @@ do { \ | |||
266 | } \ | 266 | } \ |
267 | } while (0) | 267 | } while (0) |
268 | 268 | ||
269 | /* | ||
270 | * format for entries in the Global Offset Table | ||
271 | */ | ||
272 | struct got_entry { | ||
273 | uint64_t val; | ||
274 | }; | ||
275 | |||
276 | /* | ||
277 | * Layout of the Function Descriptor | ||
278 | */ | ||
279 | struct fdesc { | ||
280 | uint64_t ip; | ||
281 | uint64_t gp; | ||
282 | }; | ||
283 | |||
269 | #endif /* _ASM_IA64_ELF_H */ | 284 | #endif /* _ASM_IA64_ELF_H */ |
diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h index 1efe513a9941..85db124d37f6 100644 --- a/arch/ia64/include/asm/kvm_host.h +++ b/arch/ia64/include/asm/kvm_host.h | |||
@@ -132,7 +132,7 @@ | |||
132 | #define GPFN_IOSAPIC (4UL << 60) /* IOSAPIC base */ | 132 | #define GPFN_IOSAPIC (4UL << 60) /* IOSAPIC base */ |
133 | #define GPFN_LEGACY_IO (5UL << 60) /* Legacy I/O base */ | 133 | #define GPFN_LEGACY_IO (5UL << 60) /* Legacy I/O base */ |
134 | #define GPFN_GFW (6UL << 60) /* Guest Firmware */ | 134 | #define GPFN_GFW (6UL << 60) /* Guest Firmware */ |
135 | #define GPFN_HIGH_MMIO (7UL << 60) /* High MMIO range */ | 135 | #define GPFN_PHYS_MMIO (7UL << 60) /* Directed MMIO Range */ |
136 | 136 | ||
137 | #define GPFN_IO_MASK (7UL << 60) /* Guest pfn is I/O type */ | 137 | #define GPFN_IO_MASK (7UL << 60) /* Guest pfn is I/O type */ |
138 | #define GPFN_INV_MASK (1UL << 63) /* Guest pfn is invalid */ | 138 | #define GPFN_INV_MASK (1UL << 63) /* Guest pfn is invalid */ |
@@ -413,6 +413,10 @@ struct kvm_arch { | |||
413 | struct kvm_ioapic *vioapic; | 413 | struct kvm_ioapic *vioapic; |
414 | struct kvm_vm_stat stat; | 414 | struct kvm_vm_stat stat; |
415 | struct kvm_sal_data rdv_sal_data; | 415 | struct kvm_sal_data rdv_sal_data; |
416 | |||
417 | struct list_head assigned_dev_head; | ||
418 | struct dmar_domain *intel_iommu_domain; | ||
419 | struct hlist_head irq_ack_notifier_list; | ||
416 | }; | 420 | }; |
417 | 421 | ||
418 | union cpuid3_t { | 422 | union cpuid3_t { |
diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h index 7286e4a9fe84..1a873b36a4a1 100644 --- a/arch/ia64/include/asm/sections.h +++ b/arch/ia64/include/asm/sections.h | |||
@@ -6,9 +6,14 @@ | |||
6 | * David Mosberger-Tang <davidm@hpl.hp.com> | 6 | * David Mosberger-Tang <davidm@hpl.hp.com> |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/elf.h> | ||
10 | #include <linux/uaccess.h> | ||
9 | #include <asm-generic/sections.h> | 11 | #include <asm-generic/sections.h> |
10 | 12 | ||
11 | extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[]; | 13 | extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[]; |
14 | #ifdef CONFIG_SMP | ||
15 | extern char __cpu0_per_cpu[]; | ||
16 | #endif | ||
12 | extern char __start___vtop_patchlist[], __end___vtop_patchlist[]; | 17 | extern char __start___vtop_patchlist[], __end___vtop_patchlist[]; |
13 | extern char __start___rse_patchlist[], __end___rse_patchlist[]; | 18 | extern char __start___rse_patchlist[], __end___rse_patchlist[]; |
14 | extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[]; | 19 | extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[]; |
@@ -21,5 +26,17 @@ extern char __start_gate_brl_fsys_bubble_down_patchlist[], __end_gate_brl_fsys_b | |||
21 | extern char __start_unwind[], __end_unwind[]; | 26 | extern char __start_unwind[], __end_unwind[]; |
22 | extern char __start_ivt_text[], __end_ivt_text[]; | 27 | extern char __start_ivt_text[], __end_ivt_text[]; |
23 | 28 | ||
29 | #undef dereference_function_descriptor | ||
30 | static inline void *dereference_function_descriptor(void *ptr) | ||
31 | { | ||
32 | struct fdesc *desc = ptr; | ||
33 | void *p; | ||
34 | |||
35 | if (!probe_kernel_address(&desc->ip, p)) | ||
36 | ptr = p; | ||
37 | return ptr; | ||
38 | } | ||
39 | |||
40 | |||
24 | #endif /* _ASM_IA64_SECTIONS_H */ | 41 | #endif /* _ASM_IA64_SECTIONS_H */ |
25 | 42 | ||
diff --git a/arch/ia64/include/asm/siginfo.h b/arch/ia64/include/asm/siginfo.h index 9294e4b0c8bc..118d42979003 100644 --- a/arch/ia64/include/asm/siginfo.h +++ b/arch/ia64/include/asm/siginfo.h | |||
@@ -113,11 +113,6 @@ typedef struct siginfo { | |||
113 | #undef NSIGSEGV | 113 | #undef NSIGSEGV |
114 | #define NSIGSEGV 3 | 114 | #define NSIGSEGV 3 |
115 | 115 | ||
116 | /* | ||
117 | * SIGTRAP si_codes | ||
118 | */ | ||
119 | #define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */ | ||
120 | #define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint or watchpoint */ | ||
121 | #undef NSIGTRAP | 116 | #undef NSIGTRAP |
122 | #define NSIGTRAP 4 | 117 | #define NSIGTRAP 4 |
123 | 118 | ||
diff --git a/arch/ia64/include/asm/sn/bte.h b/arch/ia64/include/asm/sn/bte.h index a0d214f43115..5efecf06c9a4 100644 --- a/arch/ia64/include/asm/sn/bte.h +++ b/arch/ia64/include/asm/sn/bte.h | |||
@@ -223,10 +223,11 @@ extern void bte_error_handler(unsigned long); | |||
223 | * until the transfer is complete. In order to get the asynch | 223 | * until the transfer is complete. In order to get the asynch |
224 | * version of bte_copy, you must perform this check yourself. | 224 | * version of bte_copy, you must perform this check yourself. |
225 | */ | 225 | */ |
226 | #define BTE_UNALIGNED_COPY(src, dest, len, mode) \ | 226 | #define BTE_UNALIGNED_COPY(src, dest, len, mode) \ |
227 | (((len & L1_CACHE_MASK) || (src & L1_CACHE_MASK) || \ | 227 | (((len & (L1_CACHE_BYTES - 1)) || \ |
228 | (dest & L1_CACHE_MASK)) ? \ | 228 | (src & (L1_CACHE_BYTES - 1)) || \ |
229 | bte_unaligned_copy(src, dest, len, mode) : \ | 229 | (dest & (L1_CACHE_BYTES - 1))) ? \ |
230 | bte_unaligned_copy(src, dest, len, mode) : \ | ||
230 | bte_copy(src, dest, len, mode, NULL)) | 231 | bte_copy(src, dest, len, mode, NULL)) |
231 | 232 | ||
232 | 233 | ||
diff --git a/arch/ia64/include/asm/statfs.h b/arch/ia64/include/asm/statfs.h index 811097974f31..1e589669de56 100644 --- a/arch/ia64/include/asm/statfs.h +++ b/arch/ia64/include/asm/statfs.h | |||
@@ -8,55 +8,13 @@ | |||
8 | * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co | 8 | * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef __KERNEL_STRICT_NAMES | ||
12 | # include <linux/types.h> | ||
13 | typedef __kernel_fsid_t fsid_t; | ||
14 | #endif | ||
15 | |||
16 | /* | 11 | /* |
17 | * This is ugly --- we're already 64-bit, so just duplicate the definitions | 12 | * We need compat_statfs64 to be packed, because the i386 ABI won't |
13 | * add padding at the end to bring it to a multiple of 8 bytes, but | ||
14 | * the IA64 ABI will. | ||
18 | */ | 15 | */ |
19 | struct statfs { | 16 | #define ARCH_PACK_COMPAT_STATFS64 __attribute__((packed,aligned(4))) |
20 | long f_type; | ||
21 | long f_bsize; | ||
22 | long f_blocks; | ||
23 | long f_bfree; | ||
24 | long f_bavail; | ||
25 | long f_files; | ||
26 | long f_ffree; | ||
27 | __kernel_fsid_t f_fsid; | ||
28 | long f_namelen; | ||
29 | long f_frsize; | ||
30 | long f_spare[5]; | ||
31 | }; | ||
32 | |||
33 | |||
34 | struct statfs64 { | ||
35 | long f_type; | ||
36 | long f_bsize; | ||
37 | long f_blocks; | ||
38 | long f_bfree; | ||
39 | long f_bavail; | ||
40 | long f_files; | ||
41 | long f_ffree; | ||
42 | __kernel_fsid_t f_fsid; | ||
43 | long f_namelen; | ||
44 | long f_frsize; | ||
45 | long f_spare[5]; | ||
46 | }; | ||
47 | 17 | ||
48 | struct compat_statfs64 { | 18 | #include <asm-generic/statfs.h> |
49 | __u32 f_type; | ||
50 | __u32 f_bsize; | ||
51 | __u64 f_blocks; | ||
52 | __u64 f_bfree; | ||
53 | __u64 f_bavail; | ||
54 | __u64 f_files; | ||
55 | __u64 f_ffree; | ||
56 | __kernel_fsid_t f_fsid; | ||
57 | __u32 f_namelen; | ||
58 | __u32 f_frsize; | ||
59 | __u32 f_spare[5]; | ||
60 | } __attribute__((packed)); | ||
61 | 19 | ||
62 | #endif /* _ASM_IA64_STATFS_H */ | 20 | #endif /* _ASM_IA64_STATFS_H */ |
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index d45f215bc8fc..51b75cea7018 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -1232,9 +1232,10 @@ efi_initialize_iomem_resources(struct resource *code_resource, | |||
1232 | if (md->attribute & EFI_MEMORY_WP) { | 1232 | if (md->attribute & EFI_MEMORY_WP) { |
1233 | name = "System ROM"; | 1233 | name = "System ROM"; |
1234 | flags |= IORESOURCE_READONLY; | 1234 | flags |= IORESOURCE_READONLY; |
1235 | } else { | 1235 | } else if (md->attribute == EFI_MEMORY_UC) |
1236 | name = "Uncached RAM"; | ||
1237 | else | ||
1236 | name = "System RAM"; | 1238 | name = "System RAM"; |
1237 | } | ||
1238 | break; | 1239 | break; |
1239 | 1240 | ||
1240 | case EFI_ACPI_MEMORY_NVS: | 1241 | case EFI_ACPI_MEMORY_NVS: |
diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 8bdea8eb62e3..66e491d8baac 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
@@ -367,16 +367,17 @@ start_ap: | |||
367 | ;; | 367 | ;; |
368 | #else | 368 | #else |
369 | (isAP) br.few 2f | 369 | (isAP) br.few 2f |
370 | mov r20=r19 | 370 | movl r20=__cpu0_per_cpu |
371 | sub r19=r19,r18 | ||
372 | ;; | 371 | ;; |
373 | shr.u r18=r18,3 | 372 | shr.u r18=r18,3 |
374 | 1: | 373 | 1: |
375 | ld8 r21=[r20],8;; | 374 | ld8 r21=[r19],8;; |
376 | st8[r19]=r21,8 | 375 | st8[r20]=r21,8 |
377 | adds r18=-1,r18;; | 376 | adds r18=-1,r18;; |
378 | cmp4.lt p7,p6=0,r18 | 377 | cmp4.lt p7,p6=0,r18 |
379 | (p7) br.cond.dptk.few 1b | 378 | (p7) br.cond.dptk.few 1b |
379 | mov r19=r20 | ||
380 | ;; | ||
380 | 2: | 381 | 2: |
381 | #endif | 382 | #endif |
382 | tpa r19=r19 | 383 | tpa r19=r19 |
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index 29aad349e0c4..aaa7d901521f 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -135,15 +135,6 @@ static const char *reloc_name[256] = { | |||
135 | 135 | ||
136 | #undef N | 136 | #undef N |
137 | 137 | ||
138 | struct got_entry { | ||
139 | uint64_t val; | ||
140 | }; | ||
141 | |||
142 | struct fdesc { | ||
143 | uint64_t ip; | ||
144 | uint64_t gp; | ||
145 | }; | ||
146 | |||
147 | /* Opaque struct for insns, to protect against derefs. */ | 138 | /* Opaque struct for insns, to protect against derefs. */ |
148 | struct insn; | 139 | struct insn; |
149 | 140 | ||
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index c27d5b2c182b..de636b215677 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -616,7 +616,9 @@ setup_arch (char **cmdline_p) | |||
616 | ia64_mca_init(); | 616 | ia64_mca_init(); |
617 | 617 | ||
618 | platform_setup(cmdline_p); | 618 | platform_setup(cmdline_p); |
619 | #ifndef CONFIG_IA64_HP_SIM | ||
619 | check_sal_cache_flush(); | 620 | check_sal_cache_flush(); |
621 | #endif | ||
620 | paging_init(); | 622 | paging_init(); |
621 | } | 623 | } |
622 | 624 | ||
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index bcea81e432fd..1dcbb85fc4ee 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c | |||
@@ -401,6 +401,7 @@ smp_callin (void) | |||
401 | spin_lock(&vector_lock); | 401 | spin_lock(&vector_lock); |
402 | /* Setup the per cpu irq handling data structures */ | 402 | /* Setup the per cpu irq handling data structures */ |
403 | __setup_vector_irq(cpuid); | 403 | __setup_vector_irq(cpuid); |
404 | notify_cpu_starting(cpuid); | ||
404 | cpu_set(cpuid, cpu_online_map); | 405 | cpu_set(cpuid, cpu_online_map); |
405 | per_cpu(cpu_state, cpuid) = CPU_ONLINE; | 406 | per_cpu(cpu_state, cpuid) = CPU_ONLINE; |
406 | spin_unlock(&vector_lock); | 407 | spin_unlock(&vector_lock); |
@@ -741,16 +742,14 @@ int __cpu_disable(void) | |||
741 | return -EBUSY; | 742 | return -EBUSY; |
742 | } | 743 | } |
743 | 744 | ||
744 | cpu_clear(cpu, cpu_online_map); | ||
745 | |||
746 | if (migrate_platform_irqs(cpu)) { | 745 | if (migrate_platform_irqs(cpu)) { |
747 | cpu_set(cpu, cpu_online_map); | 746 | cpu_set(cpu, cpu_online_map); |
748 | return (-EBUSY); | 747 | return (-EBUSY); |
749 | } | 748 | } |
750 | 749 | ||
751 | remove_siblinginfo(cpu); | 750 | remove_siblinginfo(cpu); |
752 | cpu_clear(cpu, cpu_online_map); | ||
753 | fixup_irqs(); | 751 | fixup_irqs(); |
752 | cpu_clear(cpu, cpu_online_map); | ||
754 | local_flush_tlb_all(); | 753 | local_flush_tlb_all(); |
755 | cpu_clear(cpu, cpu_callin_map); | 754 | cpu_clear(cpu, cpu_callin_map); |
756 | return 0; | 755 | return 0; |
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index de71da811cd6..10a7d47e8510 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
@@ -215,9 +215,6 @@ SECTIONS | |||
215 | /* Per-cpu data: */ | 215 | /* Per-cpu data: */ |
216 | percpu : { } :percpu | 216 | percpu : { } :percpu |
217 | . = ALIGN(PERCPU_PAGE_SIZE); | 217 | . = ALIGN(PERCPU_PAGE_SIZE); |
218 | #ifdef CONFIG_SMP | ||
219 | . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */ | ||
220 | #endif | ||
221 | __phys_per_cpu_start = .; | 218 | __phys_per_cpu_start = .; |
222 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) | 219 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) |
223 | { | 220 | { |
@@ -233,6 +230,11 @@ SECTIONS | |||
233 | data : { } :data | 230 | data : { } :data |
234 | .data : AT(ADDR(.data) - LOAD_OFFSET) | 231 | .data : AT(ADDR(.data) - LOAD_OFFSET) |
235 | { | 232 | { |
233 | #ifdef CONFIG_SMP | ||
234 | . = ALIGN(PERCPU_PAGE_SIZE); | ||
235 | __cpu0_per_cpu = .; | ||
236 | . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */ | ||
237 | #endif | ||
236 | DATA_DATA | 238 | DATA_DATA |
237 | *(.data1) | 239 | *(.data1) |
238 | *(.gnu.linkonce.d*) | 240 | *(.gnu.linkonce.d*) |
diff --git a/arch/ia64/kvm/Kconfig b/arch/ia64/kvm/Kconfig index 7914e4828504..8e99fed6b3fd 100644 --- a/arch/ia64/kvm/Kconfig +++ b/arch/ia64/kvm/Kconfig | |||
@@ -46,4 +46,6 @@ config KVM_INTEL | |||
46 | config KVM_TRACE | 46 | config KVM_TRACE |
47 | bool | 47 | bool |
48 | 48 | ||
49 | source drivers/virtio/Kconfig | ||
50 | |||
49 | endif # VIRTUALIZATION | 51 | endif # VIRTUALIZATION |
diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile index bf22fb9e6dcf..cf37f8f490c0 100644 --- a/arch/ia64/kvm/Makefile +++ b/arch/ia64/kvm/Makefile | |||
@@ -44,7 +44,11 @@ EXTRA_CFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/ | |||
44 | EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/ | 44 | EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/ |
45 | 45 | ||
46 | common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \ | 46 | common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \ |
47 | coalesced_mmio.o) | 47 | coalesced_mmio.o irq_comm.o) |
48 | |||
49 | ifeq ($(CONFIG_DMAR),y) | ||
50 | common-objs += $(addprefix ../../../virt/kvm/, vtd.o) | ||
51 | endif | ||
48 | 52 | ||
49 | kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o | 53 | kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o |
50 | obj-$(CONFIG_KVM) += kvm.o | 54 | obj-$(CONFIG_KVM) += kvm.o |
diff --git a/arch/ia64/kvm/irq.h b/arch/ia64/kvm/irq.h new file mode 100644 index 000000000000..c6786e8b1bf4 --- /dev/null +++ b/arch/ia64/kvm/irq.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * irq.h: In-kernel interrupt controller related definitions | ||
3 | * Copyright (c) 2008, Intel Corporation. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms and conditions of the GNU General Public License, | ||
7 | * version 2, as published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | ||
16 | * Place - Suite 330, Boston, MA 02111-1307 USA. | ||
17 | * | ||
18 | * Authors: | ||
19 | * Xiantao Zhang <xiantao.zhang@intel.com> | ||
20 | * | ||
21 | */ | ||
22 | |||
23 | #ifndef __IRQ_H | ||
24 | #define __IRQ_H | ||
25 | |||
26 | static inline int irqchip_in_kernel(struct kvm *kvm) | ||
27 | { | ||
28 | return 1; | ||
29 | } | ||
30 | |||
31 | #endif | ||
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index cf8eae1855e6..a312c9e9b9ef 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/bitops.h> | 31 | #include <linux/bitops.h> |
32 | #include <linux/hrtimer.h> | 32 | #include <linux/hrtimer.h> |
33 | #include <linux/uaccess.h> | 33 | #include <linux/uaccess.h> |
34 | #include <linux/intel-iommu.h> | ||
34 | 35 | ||
35 | #include <asm/pgtable.h> | 36 | #include <asm/pgtable.h> |
36 | #include <asm/gcc_intrin.h> | 37 | #include <asm/gcc_intrin.h> |
@@ -38,12 +39,14 @@ | |||
38 | #include <asm/cacheflush.h> | 39 | #include <asm/cacheflush.h> |
39 | #include <asm/div64.h> | 40 | #include <asm/div64.h> |
40 | #include <asm/tlb.h> | 41 | #include <asm/tlb.h> |
42 | #include <asm/elf.h> | ||
41 | 43 | ||
42 | #include "misc.h" | 44 | #include "misc.h" |
43 | #include "vti.h" | 45 | #include "vti.h" |
44 | #include "iodev.h" | 46 | #include "iodev.h" |
45 | #include "ioapic.h" | 47 | #include "ioapic.h" |
46 | #include "lapic.h" | 48 | #include "lapic.h" |
49 | #include "irq.h" | ||
47 | 50 | ||
48 | static unsigned long kvm_vmm_base; | 51 | static unsigned long kvm_vmm_base; |
49 | static unsigned long kvm_vsa_base; | 52 | static unsigned long kvm_vsa_base; |
@@ -61,12 +64,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
61 | { NULL } | 64 | { NULL } |
62 | }; | 65 | }; |
63 | 66 | ||
64 | |||
65 | struct fdesc{ | ||
66 | unsigned long ip; | ||
67 | unsigned long gp; | ||
68 | }; | ||
69 | |||
70 | static void kvm_flush_icache(unsigned long start, unsigned long len) | 67 | static void kvm_flush_icache(unsigned long start, unsigned long len) |
71 | { | 68 | { |
72 | int l; | 69 | int l; |
@@ -184,12 +181,16 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
184 | switch (ext) { | 181 | switch (ext) { |
185 | case KVM_CAP_IRQCHIP: | 182 | case KVM_CAP_IRQCHIP: |
186 | case KVM_CAP_USER_MEMORY: | 183 | case KVM_CAP_USER_MEMORY: |
184 | case KVM_CAP_MP_STATE: | ||
187 | 185 | ||
188 | r = 1; | 186 | r = 1; |
189 | break; | 187 | break; |
190 | case KVM_CAP_COALESCED_MMIO: | 188 | case KVM_CAP_COALESCED_MMIO: |
191 | r = KVM_COALESCED_MMIO_PAGE_OFFSET; | 189 | r = KVM_COALESCED_MMIO_PAGE_OFFSET; |
192 | break; | 190 | break; |
191 | case KVM_CAP_IOMMU: | ||
192 | r = intel_iommu_found(); | ||
193 | break; | ||
193 | default: | 194 | default: |
194 | r = 0; | 195 | r = 0; |
195 | } | 196 | } |
@@ -776,6 +777,7 @@ static void kvm_init_vm(struct kvm *kvm) | |||
776 | */ | 777 | */ |
777 | kvm_build_io_pmt(kvm); | 778 | kvm_build_io_pmt(kvm); |
778 | 779 | ||
780 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); | ||
779 | } | 781 | } |
780 | 782 | ||
781 | struct kvm *kvm_arch_create_vm(void) | 783 | struct kvm *kvm_arch_create_vm(void) |
@@ -1339,6 +1341,10 @@ static void kvm_release_vm_pages(struct kvm *kvm) | |||
1339 | 1341 | ||
1340 | void kvm_arch_destroy_vm(struct kvm *kvm) | 1342 | void kvm_arch_destroy_vm(struct kvm *kvm) |
1341 | { | 1343 | { |
1344 | kvm_iommu_unmap_guest(kvm); | ||
1345 | #ifdef KVM_CAP_DEVICE_ASSIGNMENT | ||
1346 | kvm_free_all_assigned_devices(kvm); | ||
1347 | #endif | ||
1342 | kfree(kvm->arch.vioapic); | 1348 | kfree(kvm->arch.vioapic); |
1343 | kvm_release_vm_pages(kvm); | 1349 | kvm_release_vm_pages(kvm); |
1344 | kvm_free_physmem(kvm); | 1350 | kvm_free_physmem(kvm); |
@@ -1440,17 +1446,24 @@ int kvm_arch_set_memory_region(struct kvm *kvm, | |||
1440 | int user_alloc) | 1446 | int user_alloc) |
1441 | { | 1447 | { |
1442 | unsigned long i; | 1448 | unsigned long i; |
1443 | struct page *page; | 1449 | unsigned long pfn; |
1444 | int npages = mem->memory_size >> PAGE_SHIFT; | 1450 | int npages = mem->memory_size >> PAGE_SHIFT; |
1445 | struct kvm_memory_slot *memslot = &kvm->memslots[mem->slot]; | 1451 | struct kvm_memory_slot *memslot = &kvm->memslots[mem->slot]; |
1446 | unsigned long base_gfn = memslot->base_gfn; | 1452 | unsigned long base_gfn = memslot->base_gfn; |
1447 | 1453 | ||
1448 | for (i = 0; i < npages; i++) { | 1454 | for (i = 0; i < npages; i++) { |
1449 | page = gfn_to_page(kvm, base_gfn + i); | 1455 | pfn = gfn_to_pfn(kvm, base_gfn + i); |
1450 | kvm_set_pmt_entry(kvm, base_gfn + i, | 1456 | if (!kvm_is_mmio_pfn(pfn)) { |
1451 | page_to_pfn(page) << PAGE_SHIFT, | 1457 | kvm_set_pmt_entry(kvm, base_gfn + i, |
1452 | _PAGE_AR_RWX|_PAGE_MA_WB); | 1458 | pfn << PAGE_SHIFT, |
1453 | memslot->rmap[i] = (unsigned long)page; | 1459 | _PAGE_AR_RWX | _PAGE_MA_WB); |
1460 | memslot->rmap[i] = (unsigned long)pfn_to_page(pfn); | ||
1461 | } else { | ||
1462 | kvm_set_pmt_entry(kvm, base_gfn + i, | ||
1463 | GPFN_PHYS_MMIO | (pfn << PAGE_SHIFT), | ||
1464 | _PAGE_MA_UC); | ||
1465 | memslot->rmap[i] = 0; | ||
1466 | } | ||
1454 | } | 1467 | } |
1455 | 1468 | ||
1456 | return 0; | 1469 | return 0; |
@@ -1794,11 +1807,43 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | |||
1794 | int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, | 1807 | int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, |
1795 | struct kvm_mp_state *mp_state) | 1808 | struct kvm_mp_state *mp_state) |
1796 | { | 1809 | { |
1797 | return -EINVAL; | 1810 | vcpu_load(vcpu); |
1811 | mp_state->mp_state = vcpu->arch.mp_state; | ||
1812 | vcpu_put(vcpu); | ||
1813 | return 0; | ||
1814 | } | ||
1815 | |||
1816 | static int vcpu_reset(struct kvm_vcpu *vcpu) | ||
1817 | { | ||
1818 | int r; | ||
1819 | long psr; | ||
1820 | local_irq_save(psr); | ||
1821 | r = kvm_insert_vmm_mapping(vcpu); | ||
1822 | if (r) | ||
1823 | goto fail; | ||
1824 | |||
1825 | vcpu->arch.launched = 0; | ||
1826 | kvm_arch_vcpu_uninit(vcpu); | ||
1827 | r = kvm_arch_vcpu_init(vcpu); | ||
1828 | if (r) | ||
1829 | goto fail; | ||
1830 | |||
1831 | kvm_purge_vmm_mapping(vcpu); | ||
1832 | r = 0; | ||
1833 | fail: | ||
1834 | local_irq_restore(psr); | ||
1835 | return r; | ||
1798 | } | 1836 | } |
1799 | 1837 | ||
1800 | int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | 1838 | int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, |
1801 | struct kvm_mp_state *mp_state) | 1839 | struct kvm_mp_state *mp_state) |
1802 | { | 1840 | { |
1803 | return -EINVAL; | 1841 | int r = 0; |
1842 | |||
1843 | vcpu_load(vcpu); | ||
1844 | vcpu->arch.mp_state = mp_state->mp_state; | ||
1845 | if (vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED) | ||
1846 | r = vcpu_reset(vcpu); | ||
1847 | vcpu_put(vcpu); | ||
1848 | return r; | ||
1804 | } | 1849 | } |
diff --git a/arch/ia64/kvm/kvm_minstate.h b/arch/ia64/kvm/kvm_minstate.h index 13980d9b8bcf..2cc41d17cf99 100644 --- a/arch/ia64/kvm/kvm_minstate.h +++ b/arch/ia64/kvm/kvm_minstate.h | |||
@@ -50,27 +50,18 @@ | |||
50 | 50 | ||
51 | #define PAL_VSA_SYNC_READ \ | 51 | #define PAL_VSA_SYNC_READ \ |
52 | /* begin to call pal vps sync_read */ \ | 52 | /* begin to call pal vps sync_read */ \ |
53 | {.mii; \ | ||
53 | add r25 = VMM_VPD_BASE_OFFSET, r21; \ | 54 | add r25 = VMM_VPD_BASE_OFFSET, r21; \ |
54 | adds r20 = VMM_VCPU_VSA_BASE_OFFSET, r21; /* entry point */ \ | 55 | nop 0x0; \ |
56 | mov r24=ip; \ | ||
55 | ;; \ | 57 | ;; \ |
58 | } \ | ||
59 | {.mmb \ | ||
60 | add r24=0x20, r24; \ | ||
56 | ld8 r25 = [r25]; /* read vpd base */ \ | 61 | ld8 r25 = [r25]; /* read vpd base */ \ |
57 | ld8 r20 = [r20]; \ | 62 | br.cond.sptk kvm_vps_sync_read; /*call the service*/ \ |
58 | ;; \ | ||
59 | add r20 = PAL_VPS_SYNC_READ,r20; \ | ||
60 | ;; \ | ||
61 | { .mii; \ | ||
62 | nop 0x0; \ | ||
63 | mov r24 = ip; \ | ||
64 | mov b0 = r20; \ | ||
65 | ;; \ | 63 | ;; \ |
66 | }; \ | 64 | }; \ |
67 | { .mmb; \ | ||
68 | add r24 = 0x20, r24; \ | ||
69 | nop 0x0; \ | ||
70 | br.cond.sptk b0; /* call the service */ \ | ||
71 | ;; \ | ||
72 | }; | ||
73 | |||
74 | 65 | ||
75 | 66 | ||
76 | #define KVM_MINSTATE_GET_CURRENT(reg) mov reg=r21 | 67 | #define KVM_MINSTATE_GET_CURRENT(reg) mov reg=r21 |
diff --git a/arch/ia64/kvm/optvfault.S b/arch/ia64/kvm/optvfault.S index e4f15d641b22..634abad979b5 100644 --- a/arch/ia64/kvm/optvfault.S +++ b/arch/ia64/kvm/optvfault.S | |||
@@ -1,9 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * arch/ia64/vmx/optvfault.S | 2 | * arch/ia64/kvm/optvfault.S |
3 | * optimize virtualization fault handler | 3 | * optimize virtualization fault handler |
4 | * | 4 | * |
5 | * Copyright (C) 2006 Intel Co | 5 | * Copyright (C) 2006 Intel Co |
6 | * Xuefei Xu (Anthony Xu) <anthony.xu@intel.com> | 6 | * Xuefei Xu (Anthony Xu) <anthony.xu@intel.com> |
7 | * Copyright (C) 2008 Intel Co | ||
8 | * Add the support for Tukwila processors. | ||
9 | * Xiantao Zhang <xiantao.zhang@intel.com> | ||
7 | */ | 10 | */ |
8 | 11 | ||
9 | #include <asm/asmmacro.h> | 12 | #include <asm/asmmacro.h> |
@@ -20,6 +23,98 @@ | |||
20 | #define ACCE_MOV_TO_PSR | 23 | #define ACCE_MOV_TO_PSR |
21 | #define ACCE_THASH | 24 | #define ACCE_THASH |
22 | 25 | ||
26 | #define VMX_VPS_SYNC_READ \ | ||
27 | add r16=VMM_VPD_BASE_OFFSET,r21; \ | ||
28 | mov r17 = b0; \ | ||
29 | mov r18 = r24; \ | ||
30 | mov r19 = r25; \ | ||
31 | mov r20 = r31; \ | ||
32 | ;; \ | ||
33 | {.mii; \ | ||
34 | ld8 r16 = [r16]; \ | ||
35 | nop 0x0; \ | ||
36 | mov r24 = ip; \ | ||
37 | ;; \ | ||
38 | }; \ | ||
39 | {.mmb; \ | ||
40 | add r24=0x20, r24; \ | ||
41 | mov r25 =r16; \ | ||
42 | br.sptk.many kvm_vps_sync_read; \ | ||
43 | }; \ | ||
44 | mov b0 = r17; \ | ||
45 | mov r24 = r18; \ | ||
46 | mov r25 = r19; \ | ||
47 | mov r31 = r20 | ||
48 | |||
49 | ENTRY(kvm_vps_entry) | ||
50 | adds r29 = VMM_VCPU_VSA_BASE_OFFSET,r21 | ||
51 | ;; | ||
52 | ld8 r29 = [r29] | ||
53 | ;; | ||
54 | add r29 = r29, r30 | ||
55 | ;; | ||
56 | mov b0 = r29 | ||
57 | br.sptk.many b0 | ||
58 | END(kvm_vps_entry) | ||
59 | |||
60 | /* | ||
61 | * Inputs: | ||
62 | * r24 : return address | ||
63 | * r25 : vpd | ||
64 | * r29 : scratch | ||
65 | * | ||
66 | */ | ||
67 | GLOBAL_ENTRY(kvm_vps_sync_read) | ||
68 | movl r30 = PAL_VPS_SYNC_READ | ||
69 | ;; | ||
70 | br.sptk.many kvm_vps_entry | ||
71 | END(kvm_vps_sync_read) | ||
72 | |||
73 | /* | ||
74 | * Inputs: | ||
75 | * r24 : return address | ||
76 | * r25 : vpd | ||
77 | * r29 : scratch | ||
78 | * | ||
79 | */ | ||
80 | GLOBAL_ENTRY(kvm_vps_sync_write) | ||
81 | movl r30 = PAL_VPS_SYNC_WRITE | ||
82 | ;; | ||
83 | br.sptk.many kvm_vps_entry | ||
84 | END(kvm_vps_sync_write) | ||
85 | |||
86 | /* | ||
87 | * Inputs: | ||
88 | * r23 : pr | ||
89 | * r24 : guest b0 | ||
90 | * r25 : vpd | ||
91 | * | ||
92 | */ | ||
93 | GLOBAL_ENTRY(kvm_vps_resume_normal) | ||
94 | movl r30 = PAL_VPS_RESUME_NORMAL | ||
95 | ;; | ||
96 | mov pr=r23,-2 | ||
97 | br.sptk.many kvm_vps_entry | ||
98 | END(kvm_vps_resume_normal) | ||
99 | |||
100 | /* | ||
101 | * Inputs: | ||
102 | * r23 : pr | ||
103 | * r24 : guest b0 | ||
104 | * r25 : vpd | ||
105 | * r17 : isr | ||
106 | */ | ||
107 | GLOBAL_ENTRY(kvm_vps_resume_handler) | ||
108 | movl r30 = PAL_VPS_RESUME_HANDLER | ||
109 | ;; | ||
110 | ld8 r27=[r25] | ||
111 | shr r17=r17,IA64_ISR_IR_BIT | ||
112 | ;; | ||
113 | dep r27=r17,r27,63,1 // bit 63 of r27 indicate whether enable CFLE | ||
114 | mov pr=r23,-2 | ||
115 | br.sptk.many kvm_vps_entry | ||
116 | END(kvm_vps_resume_handler) | ||
117 | |||
23 | //mov r1=ar3 | 118 | //mov r1=ar3 |
24 | GLOBAL_ENTRY(kvm_asm_mov_from_ar) | 119 | GLOBAL_ENTRY(kvm_asm_mov_from_ar) |
25 | #ifndef ACCE_MOV_FROM_AR | 120 | #ifndef ACCE_MOV_FROM_AR |
@@ -157,11 +252,11 @@ GLOBAL_ENTRY(kvm_asm_rsm) | |||
157 | #ifndef ACCE_RSM | 252 | #ifndef ACCE_RSM |
158 | br.many kvm_virtualization_fault_back | 253 | br.many kvm_virtualization_fault_back |
159 | #endif | 254 | #endif |
160 | add r16=VMM_VPD_BASE_OFFSET,r21 | 255 | VMX_VPS_SYNC_READ |
256 | ;; | ||
161 | extr.u r26=r25,6,21 | 257 | extr.u r26=r25,6,21 |
162 | extr.u r27=r25,31,2 | 258 | extr.u r27=r25,31,2 |
163 | ;; | 259 | ;; |
164 | ld8 r16=[r16] | ||
165 | extr.u r28=r25,36,1 | 260 | extr.u r28=r25,36,1 |
166 | dep r26=r27,r26,21,2 | 261 | dep r26=r27,r26,21,2 |
167 | ;; | 262 | ;; |
@@ -196,7 +291,7 @@ GLOBAL_ENTRY(kvm_asm_rsm) | |||
196 | tbit.nz p6,p0=r23,0 | 291 | tbit.nz p6,p0=r23,0 |
197 | ;; | 292 | ;; |
198 | tbit.z.or p6,p0=r26,IA64_PSR_DT_BIT | 293 | tbit.z.or p6,p0=r26,IA64_PSR_DT_BIT |
199 | (p6) br.dptk kvm_resume_to_guest | 294 | (p6) br.dptk kvm_resume_to_guest_with_sync |
200 | ;; | 295 | ;; |
201 | add r26=VMM_VCPU_META_RR0_OFFSET,r21 | 296 | add r26=VMM_VCPU_META_RR0_OFFSET,r21 |
202 | add r27=VMM_VCPU_META_RR0_OFFSET+8,r21 | 297 | add r27=VMM_VCPU_META_RR0_OFFSET+8,r21 |
@@ -212,7 +307,7 @@ GLOBAL_ENTRY(kvm_asm_rsm) | |||
212 | mov rr[r28]=r27 | 307 | mov rr[r28]=r27 |
213 | ;; | 308 | ;; |
214 | srlz.d | 309 | srlz.d |
215 | br.many kvm_resume_to_guest | 310 | br.many kvm_resume_to_guest_with_sync |
216 | END(kvm_asm_rsm) | 311 | END(kvm_asm_rsm) |
217 | 312 | ||
218 | 313 | ||
@@ -221,11 +316,11 @@ GLOBAL_ENTRY(kvm_asm_ssm) | |||
221 | #ifndef ACCE_SSM | 316 | #ifndef ACCE_SSM |
222 | br.many kvm_virtualization_fault_back | 317 | br.many kvm_virtualization_fault_back |
223 | #endif | 318 | #endif |
224 | add r16=VMM_VPD_BASE_OFFSET,r21 | 319 | VMX_VPS_SYNC_READ |
320 | ;; | ||
225 | extr.u r26=r25,6,21 | 321 | extr.u r26=r25,6,21 |
226 | extr.u r27=r25,31,2 | 322 | extr.u r27=r25,31,2 |
227 | ;; | 323 | ;; |
228 | ld8 r16=[r16] | ||
229 | extr.u r28=r25,36,1 | 324 | extr.u r28=r25,36,1 |
230 | dep r26=r27,r26,21,2 | 325 | dep r26=r27,r26,21,2 |
231 | ;; //r26 is imm24 | 326 | ;; //r26 is imm24 |
@@ -271,7 +366,7 @@ kvm_asm_ssm_1: | |||
271 | tbit.nz p6,p0=r29,IA64_PSR_I_BIT | 366 | tbit.nz p6,p0=r29,IA64_PSR_I_BIT |
272 | ;; | 367 | ;; |
273 | tbit.z.or p6,p0=r19,IA64_PSR_I_BIT | 368 | tbit.z.or p6,p0=r19,IA64_PSR_I_BIT |
274 | (p6) br.dptk kvm_resume_to_guest | 369 | (p6) br.dptk kvm_resume_to_guest_with_sync |
275 | ;; | 370 | ;; |
276 | add r29=VPD_VTPR_START_OFFSET,r16 | 371 | add r29=VPD_VTPR_START_OFFSET,r16 |
277 | add r30=VPD_VHPI_START_OFFSET,r16 | 372 | add r30=VPD_VHPI_START_OFFSET,r16 |
@@ -286,7 +381,7 @@ kvm_asm_ssm_1: | |||
286 | ;; | 381 | ;; |
287 | cmp.gt p6,p0=r30,r17 | 382 | cmp.gt p6,p0=r30,r17 |
288 | (p6) br.dpnt.few kvm_asm_dispatch_vexirq | 383 | (p6) br.dpnt.few kvm_asm_dispatch_vexirq |
289 | br.many kvm_resume_to_guest | 384 | br.many kvm_resume_to_guest_with_sync |
290 | END(kvm_asm_ssm) | 385 | END(kvm_asm_ssm) |
291 | 386 | ||
292 | 387 | ||
@@ -295,10 +390,9 @@ GLOBAL_ENTRY(kvm_asm_mov_to_psr) | |||
295 | #ifndef ACCE_MOV_TO_PSR | 390 | #ifndef ACCE_MOV_TO_PSR |
296 | br.many kvm_virtualization_fault_back | 391 | br.many kvm_virtualization_fault_back |
297 | #endif | 392 | #endif |
298 | add r16=VMM_VPD_BASE_OFFSET,r21 | 393 | VMX_VPS_SYNC_READ |
299 | extr.u r26=r25,13,7 //r2 | ||
300 | ;; | 394 | ;; |
301 | ld8 r16=[r16] | 395 | extr.u r26=r25,13,7 //r2 |
302 | addl r20=@gprel(asm_mov_from_reg),gp | 396 | addl r20=@gprel(asm_mov_from_reg),gp |
303 | ;; | 397 | ;; |
304 | adds r30=kvm_asm_mov_to_psr_back-asm_mov_from_reg,r20 | 398 | adds r30=kvm_asm_mov_to_psr_back-asm_mov_from_reg,r20 |
@@ -374,7 +468,7 @@ kvm_asm_mov_to_psr_1: | |||
374 | ;; | 468 | ;; |
375 | tbit.nz.or p6,p0=r17,IA64_PSR_I_BIT | 469 | tbit.nz.or p6,p0=r17,IA64_PSR_I_BIT |
376 | tbit.z.or p6,p0=r30,IA64_PSR_I_BIT | 470 | tbit.z.or p6,p0=r30,IA64_PSR_I_BIT |
377 | (p6) br.dpnt.few kvm_resume_to_guest | 471 | (p6) br.dpnt.few kvm_resume_to_guest_with_sync |
378 | ;; | 472 | ;; |
379 | add r29=VPD_VTPR_START_OFFSET,r16 | 473 | add r29=VPD_VTPR_START_OFFSET,r16 |
380 | add r30=VPD_VHPI_START_OFFSET,r16 | 474 | add r30=VPD_VHPI_START_OFFSET,r16 |
@@ -389,13 +483,29 @@ kvm_asm_mov_to_psr_1: | |||
389 | ;; | 483 | ;; |
390 | cmp.gt p6,p0=r30,r17 | 484 | cmp.gt p6,p0=r30,r17 |
391 | (p6) br.dpnt.few kvm_asm_dispatch_vexirq | 485 | (p6) br.dpnt.few kvm_asm_dispatch_vexirq |
392 | br.many kvm_resume_to_guest | 486 | br.many kvm_resume_to_guest_with_sync |
393 | END(kvm_asm_mov_to_psr) | 487 | END(kvm_asm_mov_to_psr) |
394 | 488 | ||
395 | 489 | ||
396 | ENTRY(kvm_asm_dispatch_vexirq) | 490 | ENTRY(kvm_asm_dispatch_vexirq) |
397 | //increment iip | 491 | //increment iip |
492 | mov r17 = b0 | ||
493 | mov r18 = r31 | ||
494 | {.mii | ||
495 | add r25=VMM_VPD_BASE_OFFSET,r21 | ||
496 | nop 0x0 | ||
497 | mov r24 = ip | ||
498 | ;; | ||
499 | } | ||
500 | {.mmb | ||
501 | add r24 = 0x20, r24 | ||
502 | ld8 r25 = [r25] | ||
503 | br.sptk.many kvm_vps_sync_write | ||
504 | } | ||
505 | mov b0 =r17 | ||
398 | mov r16=cr.ipsr | 506 | mov r16=cr.ipsr |
507 | mov r31 = r18 | ||
508 | mov r19 = 37 | ||
399 | ;; | 509 | ;; |
400 | extr.u r17=r16,IA64_PSR_RI_BIT,2 | 510 | extr.u r17=r16,IA64_PSR_RI_BIT,2 |
401 | tbit.nz p6,p7=r16,IA64_PSR_RI_BIT+1 | 511 | tbit.nz p6,p7=r16,IA64_PSR_RI_BIT+1 |
@@ -435,25 +545,31 @@ GLOBAL_ENTRY(kvm_asm_thash) | |||
435 | ;; | 545 | ;; |
436 | kvm_asm_thash_back1: | 546 | kvm_asm_thash_back1: |
437 | shr.u r23=r19,61 // get RR number | 547 | shr.u r23=r19,61 // get RR number |
438 | adds r25=VMM_VCPU_VRR0_OFFSET,r21 // get vcpu->arch.vrr[0]'s addr | 548 | adds r28=VMM_VCPU_VRR0_OFFSET,r21 // get vcpu->arch.vrr[0]'s addr |
439 | adds r16=VMM_VPD_VPTA_OFFSET,r16 // get vpta | 549 | adds r16=VMM_VPD_VPTA_OFFSET,r16 // get vpta |
440 | ;; | 550 | ;; |
441 | shladd r27=r23,3,r25 // get vcpu->arch.vrr[r23]'s addr | 551 | shladd r27=r23,3,r28 // get vcpu->arch.vrr[r23]'s addr |
442 | ld8 r17=[r16] // get PTA | 552 | ld8 r17=[r16] // get PTA |
443 | mov r26=1 | 553 | mov r26=1 |
444 | ;; | 554 | ;; |
445 | extr.u r29=r17,2,6 // get pta.size | 555 | extr.u r29=r17,2,6 // get pta.size |
446 | ld8 r25=[r27] // get vcpu->arch.vrr[r23]'s value | 556 | ld8 r28=[r27] // get vcpu->arch.vrr[r23]'s value |
447 | ;; | 557 | ;; |
448 | extr.u r25=r25,2,6 // get rr.ps | 558 | mov b0=r24 |
559 | //Fallback to C if pta.vf is set | ||
560 | tbit.nz p6,p0=r17, 8 | ||
561 | ;; | ||
562 | (p6) mov r24=EVENT_THASH | ||
563 | (p6) br.cond.dpnt.many kvm_virtualization_fault_back | ||
564 | extr.u r28=r28,2,6 // get rr.ps | ||
449 | shl r22=r26,r29 // 1UL << pta.size | 565 | shl r22=r26,r29 // 1UL << pta.size |
450 | ;; | 566 | ;; |
451 | shr.u r23=r19,r25 // vaddr >> rr.ps | 567 | shr.u r23=r19,r28 // vaddr >> rr.ps |
452 | adds r26=3,r29 // pta.size + 3 | 568 | adds r26=3,r29 // pta.size + 3 |
453 | shl r27=r17,3 // pta << 3 | 569 | shl r27=r17,3 // pta << 3 |
454 | ;; | 570 | ;; |
455 | shl r23=r23,3 // (vaddr >> rr.ps) << 3 | 571 | shl r23=r23,3 // (vaddr >> rr.ps) << 3 |
456 | shr.u r27=r27,r26 // (pta << 3) >> (pta.size+3) | 572 | shr.u r27=r27,r26 // (pta << 3) >> (pta.size+3) |
457 | movl r16=7<<61 | 573 | movl r16=7<<61 |
458 | ;; | 574 | ;; |
459 | adds r22=-1,r22 // (1UL << pta.size) - 1 | 575 | adds r22=-1,r22 // (1UL << pta.size) - 1 |
@@ -724,6 +840,29 @@ END(asm_mov_from_reg) | |||
724 | * r31: pr | 840 | * r31: pr |
725 | * r24: b0 | 841 | * r24: b0 |
726 | */ | 842 | */ |
843 | ENTRY(kvm_resume_to_guest_with_sync) | ||
844 | adds r19=VMM_VPD_BASE_OFFSET,r21 | ||
845 | mov r16 = r31 | ||
846 | mov r17 = r24 | ||
847 | ;; | ||
848 | {.mii | ||
849 | ld8 r25 =[r19] | ||
850 | nop 0x0 | ||
851 | mov r24 = ip | ||
852 | ;; | ||
853 | } | ||
854 | {.mmb | ||
855 | add r24 =0x20, r24 | ||
856 | nop 0x0 | ||
857 | br.sptk.many kvm_vps_sync_write | ||
858 | } | ||
859 | |||
860 | mov r31 = r16 | ||
861 | mov r24 =r17 | ||
862 | ;; | ||
863 | br.sptk.many kvm_resume_to_guest | ||
864 | END(kvm_resume_to_guest_with_sync) | ||
865 | |||
727 | ENTRY(kvm_resume_to_guest) | 866 | ENTRY(kvm_resume_to_guest) |
728 | adds r16 = VMM_VCPU_SAVED_GP_OFFSET,r21 | 867 | adds r16 = VMM_VCPU_SAVED_GP_OFFSET,r21 |
729 | ;; | 868 | ;; |
diff --git a/arch/ia64/kvm/process.c b/arch/ia64/kvm/process.c index 5a33f7ed29a0..3417783ae164 100644 --- a/arch/ia64/kvm/process.c +++ b/arch/ia64/kvm/process.c | |||
@@ -962,9 +962,9 @@ static void kvm_do_resume_op(struct kvm_vcpu *vcpu) | |||
962 | void vmm_transition(struct kvm_vcpu *vcpu) | 962 | void vmm_transition(struct kvm_vcpu *vcpu) |
963 | { | 963 | { |
964 | ia64_call_vsa(PAL_VPS_SAVE, (unsigned long)vcpu->arch.vpd, | 964 | ia64_call_vsa(PAL_VPS_SAVE, (unsigned long)vcpu->arch.vpd, |
965 | 0, 0, 0, 0, 0, 0); | 965 | 1, 0, 0, 0, 0, 0); |
966 | vmm_trampoline(&vcpu->arch.guest, &vcpu->arch.host); | 966 | vmm_trampoline(&vcpu->arch.guest, &vcpu->arch.host); |
967 | ia64_call_vsa(PAL_VPS_RESTORE, (unsigned long)vcpu->arch.vpd, | 967 | ia64_call_vsa(PAL_VPS_RESTORE, (unsigned long)vcpu->arch.vpd, |
968 | 0, 0, 0, 0, 0, 0); | 968 | 1, 0, 0, 0, 0, 0); |
969 | kvm_do_resume_op(vcpu); | 969 | kvm_do_resume_op(vcpu); |
970 | } | 970 | } |
diff --git a/arch/ia64/kvm/vcpu.h b/arch/ia64/kvm/vcpu.h index b0fcfb62c49e..341e3fee280c 100644 --- a/arch/ia64/kvm/vcpu.h +++ b/arch/ia64/kvm/vcpu.h | |||
@@ -313,21 +313,21 @@ static inline void vcpu_set_tr(struct thash_data *trp, u64 pte, u64 itir, | |||
313 | trp->rid = rid; | 313 | trp->rid = rid; |
314 | } | 314 | } |
315 | 315 | ||
316 | extern u64 kvm_lookup_mpa(u64 gpfn); | 316 | extern u64 kvm_get_mpt_entry(u64 gpfn); |
317 | extern u64 kvm_gpa_to_mpa(u64 gpa); | ||
318 | |||
319 | /* Return I/O type if trye */ | ||
320 | #define __gpfn_is_io(gpfn) \ | ||
321 | ({ \ | ||
322 | u64 pte, ret = 0; \ | ||
323 | pte = kvm_lookup_mpa(gpfn); \ | ||
324 | if (!(pte & GPFN_INV_MASK)) \ | ||
325 | ret = pte & GPFN_IO_MASK; \ | ||
326 | ret; \ | ||
327 | }) | ||
328 | 317 | ||
318 | /* Return I/ */ | ||
319 | static inline u64 __gpfn_is_io(u64 gpfn) | ||
320 | { | ||
321 | u64 pte; | ||
322 | pte = kvm_get_mpt_entry(gpfn); | ||
323 | if (!(pte & GPFN_INV_MASK)) { | ||
324 | pte = pte & GPFN_IO_MASK; | ||
325 | if (pte != GPFN_PHYS_MMIO) | ||
326 | return pte; | ||
327 | } | ||
328 | return 0; | ||
329 | } | ||
329 | #endif | 330 | #endif |
330 | |||
331 | #define IA64_NO_FAULT 0 | 331 | #define IA64_NO_FAULT 0 |
332 | #define IA64_FAULT 1 | 332 | #define IA64_FAULT 1 |
333 | 333 | ||
diff --git a/arch/ia64/kvm/vmm_ivt.S b/arch/ia64/kvm/vmm_ivt.S index 3ee5f481c06d..c1d7251a1480 100644 --- a/arch/ia64/kvm/vmm_ivt.S +++ b/arch/ia64/kvm/vmm_ivt.S | |||
@@ -1261,11 +1261,6 @@ kvm_rse_clear_invalid: | |||
1261 | adds r19=VMM_VPD_VPSR_OFFSET,r18 | 1261 | adds r19=VMM_VPD_VPSR_OFFSET,r18 |
1262 | ;; | 1262 | ;; |
1263 | ld8 r19=[r19] //vpsr | 1263 | ld8 r19=[r19] //vpsr |
1264 | adds r20=VMM_VCPU_VSA_BASE_OFFSET,r21 | ||
1265 | ;; | ||
1266 | ld8 r20=[r20] | ||
1267 | ;; | ||
1268 | //vsa_sync_write_start | ||
1269 | mov r25=r18 | 1264 | mov r25=r18 |
1270 | adds r16= VMM_VCPU_GP_OFFSET,r21 | 1265 | adds r16= VMM_VCPU_GP_OFFSET,r21 |
1271 | ;; | 1266 | ;; |
@@ -1274,10 +1269,7 @@ kvm_rse_clear_invalid: | |||
1274 | ;; | 1269 | ;; |
1275 | add r24=r24,r16 | 1270 | add r24=r24,r16 |
1276 | ;; | 1271 | ;; |
1277 | add r16=PAL_VPS_SYNC_WRITE,r20 | 1272 | br.sptk.many kvm_vps_sync_write // call the service |
1278 | ;; | ||
1279 | mov b0=r16 | ||
1280 | br.cond.sptk b0 // call the service | ||
1281 | ;; | 1273 | ;; |
1282 | END(ia64_leave_hypervisor) | 1274 | END(ia64_leave_hypervisor) |
1283 | // fall through | 1275 | // fall through |
@@ -1288,28 +1280,15 @@ GLOBAL_ENTRY(ia64_vmm_entry) | |||
1288 | * r17:cr.isr | 1280 | * r17:cr.isr |
1289 | * r18:vpd | 1281 | * r18:vpd |
1290 | * r19:vpsr | 1282 | * r19:vpsr |
1291 | * r20:__vsa_base | ||
1292 | * r22:b0 | 1283 | * r22:b0 |
1293 | * r23:predicate | 1284 | * r23:predicate |
1294 | */ | 1285 | */ |
1295 | mov r24=r22 | 1286 | mov r24=r22 |
1296 | mov r25=r18 | 1287 | mov r25=r18 |
1297 | tbit.nz p1,p2 = r19,IA64_PSR_IC_BIT // p1=vpsr.ic | 1288 | tbit.nz p1,p2 = r19,IA64_PSR_IC_BIT // p1=vpsr.ic |
1289 | (p1) br.cond.sptk.few kvm_vps_resume_normal | ||
1290 | (p2) br.cond.sptk.many kvm_vps_resume_handler | ||
1298 | ;; | 1291 | ;; |
1299 | (p1) add r29=PAL_VPS_RESUME_NORMAL,r20 | ||
1300 | (p1) br.sptk.many ia64_vmm_entry_out | ||
1301 | ;; | ||
1302 | tbit.nz p1,p2 = r17,IA64_ISR_IR_BIT //p1=cr.isr.ir | ||
1303 | ;; | ||
1304 | (p1) add r29=PAL_VPS_RESUME_NORMAL,r20 | ||
1305 | (p2) add r29=PAL_VPS_RESUME_HANDLER,r20 | ||
1306 | (p2) ld8 r26=[r25] | ||
1307 | ;; | ||
1308 | ia64_vmm_entry_out: | ||
1309 | mov pr=r23,-2 | ||
1310 | mov b0=r29 | ||
1311 | ;; | ||
1312 | br.cond.sptk b0 // call pal service | ||
1313 | END(ia64_vmm_entry) | 1292 | END(ia64_vmm_entry) |
1314 | 1293 | ||
1315 | 1294 | ||
@@ -1376,6 +1355,9 @@ GLOBAL_ENTRY(vmm_reset_entry) | |||
1376 | //set up ipsr, iip, vpd.vpsr, dcr | 1355 | //set up ipsr, iip, vpd.vpsr, dcr |
1377 | // For IPSR: it/dt/rt=1, i/ic=1, si=1, vm/bn=1 | 1356 | // For IPSR: it/dt/rt=1, i/ic=1, si=1, vm/bn=1 |
1378 | // For DCR: all bits 0 | 1357 | // For DCR: all bits 0 |
1358 | bsw.0 | ||
1359 | ;; | ||
1360 | mov r21 =r13 | ||
1379 | adds r14=-VMM_PT_REGS_SIZE, r12 | 1361 | adds r14=-VMM_PT_REGS_SIZE, r12 |
1380 | ;; | 1362 | ;; |
1381 | movl r6=0x501008826000 // IPSR dt/rt/it:1;i/ic:1, si:1, vm/bn:1 | 1363 | movl r6=0x501008826000 // IPSR dt/rt/it:1;i/ic:1, si:1, vm/bn:1 |
@@ -1387,12 +1369,6 @@ GLOBAL_ENTRY(vmm_reset_entry) | |||
1387 | ;; | 1369 | ;; |
1388 | srlz.i | 1370 | srlz.i |
1389 | ;; | 1371 | ;; |
1390 | bsw.0 | ||
1391 | ;; | ||
1392 | mov r21 =r13 | ||
1393 | ;; | ||
1394 | bsw.1 | ||
1395 | ;; | ||
1396 | mov ar.rsc = 0 | 1372 | mov ar.rsc = 0 |
1397 | ;; | 1373 | ;; |
1398 | flushrs | 1374 | flushrs |
@@ -1406,12 +1382,9 @@ GLOBAL_ENTRY(vmm_reset_entry) | |||
1406 | ld8 r1 = [r20] | 1382 | ld8 r1 = [r20] |
1407 | ;; | 1383 | ;; |
1408 | mov cr.iip=r4 | 1384 | mov cr.iip=r4 |
1409 | ;; | ||
1410 | adds r16=VMM_VPD_BASE_OFFSET,r13 | 1385 | adds r16=VMM_VPD_BASE_OFFSET,r13 |
1411 | adds r20=VMM_VCPU_VSA_BASE_OFFSET,r13 | ||
1412 | ;; | 1386 | ;; |
1413 | ld8 r18=[r16] | 1387 | ld8 r18=[r16] |
1414 | ld8 r20=[r20] | ||
1415 | ;; | 1388 | ;; |
1416 | adds r19=VMM_VPD_VPSR_OFFSET,r18 | 1389 | adds r19=VMM_VPD_VPSR_OFFSET,r18 |
1417 | ;; | 1390 | ;; |
diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index def4576d22b1..e22b93361e08 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c | |||
@@ -390,7 +390,7 @@ void thash_purge_entries_remote(struct kvm_vcpu *v, u64 va, u64 ps) | |||
390 | 390 | ||
391 | u64 translate_phy_pte(u64 *pte, u64 itir, u64 va) | 391 | u64 translate_phy_pte(u64 *pte, u64 itir, u64 va) |
392 | { | 392 | { |
393 | u64 ps, ps_mask, paddr, maddr; | 393 | u64 ps, ps_mask, paddr, maddr, io_mask; |
394 | union pte_flags phy_pte; | 394 | union pte_flags phy_pte; |
395 | 395 | ||
396 | ps = itir_ps(itir); | 396 | ps = itir_ps(itir); |
@@ -398,8 +398,9 @@ u64 translate_phy_pte(u64 *pte, u64 itir, u64 va) | |||
398 | phy_pte.val = *pte; | 398 | phy_pte.val = *pte; |
399 | paddr = *pte; | 399 | paddr = *pte; |
400 | paddr = ((paddr & _PAGE_PPN_MASK) & ps_mask) | (va & ~ps_mask); | 400 | paddr = ((paddr & _PAGE_PPN_MASK) & ps_mask) | (va & ~ps_mask); |
401 | maddr = kvm_lookup_mpa(paddr >> PAGE_SHIFT); | 401 | maddr = kvm_get_mpt_entry(paddr >> PAGE_SHIFT); |
402 | if (maddr & GPFN_IO_MASK) { | 402 | io_mask = maddr & GPFN_IO_MASK; |
403 | if (io_mask && (io_mask != GPFN_PHYS_MMIO)) { | ||
403 | *pte |= VTLB_PTE_IO; | 404 | *pte |= VTLB_PTE_IO; |
404 | return -1; | 405 | return -1; |
405 | } | 406 | } |
@@ -418,7 +419,7 @@ int thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, u64 itir, | |||
418 | u64 ifa, int type) | 419 | u64 ifa, int type) |
419 | { | 420 | { |
420 | u64 ps; | 421 | u64 ps; |
421 | u64 phy_pte; | 422 | u64 phy_pte, io_mask, index; |
422 | union ia64_rr vrr, mrr; | 423 | union ia64_rr vrr, mrr; |
423 | int ret = 0; | 424 | int ret = 0; |
424 | 425 | ||
@@ -426,13 +427,16 @@ int thash_purge_and_insert(struct kvm_vcpu *v, u64 pte, u64 itir, | |||
426 | vrr.val = vcpu_get_rr(v, ifa); | 427 | vrr.val = vcpu_get_rr(v, ifa); |
427 | mrr.val = ia64_get_rr(ifa); | 428 | mrr.val = ia64_get_rr(ifa); |
428 | 429 | ||
430 | index = (pte & _PAGE_PPN_MASK) >> PAGE_SHIFT; | ||
431 | io_mask = kvm_get_mpt_entry(index) & GPFN_IO_MASK; | ||
429 | phy_pte = translate_phy_pte(&pte, itir, ifa); | 432 | phy_pte = translate_phy_pte(&pte, itir, ifa); |
430 | 433 | ||
431 | /* Ensure WB attribute if pte is related to a normal mem page, | 434 | /* Ensure WB attribute if pte is related to a normal mem page, |
432 | * which is required by vga acceleration since qemu maps shared | 435 | * which is required by vga acceleration since qemu maps shared |
433 | * vram buffer with WB. | 436 | * vram buffer with WB. |
434 | */ | 437 | */ |
435 | if (!(pte & VTLB_PTE_IO) && ((pte & _PAGE_MA_MASK) != _PAGE_MA_NAT)) { | 438 | if (!(pte & VTLB_PTE_IO) && ((pte & _PAGE_MA_MASK) != _PAGE_MA_NAT) && |
439 | io_mask != GPFN_PHYS_MMIO) { | ||
436 | pte &= ~_PAGE_MA_MASK; | 440 | pte &= ~_PAGE_MA_MASK; |
437 | phy_pte &= ~_PAGE_MA_MASK; | 441 | phy_pte &= ~_PAGE_MA_MASK; |
438 | } | 442 | } |
@@ -566,12 +570,19 @@ void thash_init(struct thash_cb *hcb, u64 sz) | |||
566 | } | 570 | } |
567 | } | 571 | } |
568 | 572 | ||
569 | u64 kvm_lookup_mpa(u64 gpfn) | 573 | u64 kvm_get_mpt_entry(u64 gpfn) |
570 | { | 574 | { |
571 | u64 *base = (u64 *) KVM_P2M_BASE; | 575 | u64 *base = (u64 *) KVM_P2M_BASE; |
572 | return *(base + gpfn); | 576 | return *(base + gpfn); |
573 | } | 577 | } |
574 | 578 | ||
579 | u64 kvm_lookup_mpa(u64 gpfn) | ||
580 | { | ||
581 | u64 maddr; | ||
582 | maddr = kvm_get_mpt_entry(gpfn); | ||
583 | return maddr&_PAGE_PPN_MASK; | ||
584 | } | ||
585 | |||
575 | u64 kvm_gpa_to_mpa(u64 gpa) | 586 | u64 kvm_gpa_to_mpa(u64 gpa) |
576 | { | 587 | { |
577 | u64 pte = kvm_lookup_mpa(gpa >> PAGE_SHIFT); | 588 | u64 pte = kvm_lookup_mpa(gpa >> PAGE_SHIFT); |
diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index e566ff43884a..0ee085efbe29 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
@@ -163,7 +163,7 @@ per_cpu_init (void) | |||
163 | * get_zeroed_page(). | 163 | * get_zeroed_page(). |
164 | */ | 164 | */ |
165 | if (first_time) { | 165 | if (first_time) { |
166 | void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE; | 166 | void *cpu0_data = __cpu0_per_cpu; |
167 | 167 | ||
168 | first_time=0; | 168 | first_time=0; |
169 | 169 | ||
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 78026aabaa7f..d8c5fcd89e5b 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
@@ -144,7 +144,7 @@ static void *per_cpu_node_setup(void *cpu_data, int node) | |||
144 | 144 | ||
145 | for_each_possible_early_cpu(cpu) { | 145 | for_each_possible_early_cpu(cpu) { |
146 | if (cpu == 0) { | 146 | if (cpu == 0) { |
147 | void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE; | 147 | void *cpu0_data = __cpu0_per_cpu; |
148 | __per_cpu_offset[cpu] = (char*)cpu0_data - | 148 | __per_cpu_offset[cpu] = (char*)cpu0_data - |
149 | __per_cpu_start; | 149 | __per_cpu_start; |
150 | } else if (node == node_cpuid[cpu].nid) { | 150 | } else if (node == node_cpuid[cpu].nid) { |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 200100ea7610..f482a9098e32 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/bitops.h> | 21 | #include <linux/bitops.h> |
22 | #include <linux/kexec.h> | 22 | #include <linux/kexec.h> |
23 | 23 | ||
24 | #include <asm/a.out.h> | ||
25 | #include <asm/dma.h> | 24 | #include <asm/dma.h> |
26 | #include <asm/ia32.h> | 25 | #include <asm/ia32.h> |
27 | #include <asm/io.h> | 26 | #include <asm/io.h> |
diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c index 529462c01570..79165122501c 100644 --- a/arch/ia64/sn/pci/tioca_provider.c +++ b/arch/ia64/sn/pci/tioca_provider.c | |||
@@ -420,8 +420,10 @@ tioca_dma_mapped(struct pci_dev *pdev, u64 paddr, size_t req_size) | |||
420 | entry = find_next_zero_bit(map, mapsize, last_entry); | 420 | entry = find_next_zero_bit(map, mapsize, last_entry); |
421 | } | 421 | } |
422 | 422 | ||
423 | if (entry > mapsize) | 423 | if (entry > mapsize) { |
424 | kfree(ca_dmamap); | ||
424 | goto map_return; | 425 | goto map_return; |
426 | } | ||
425 | 427 | ||
426 | for (i = 0; i < entries; i++) | 428 | for (i = 0; i < entries; i++) |
427 | set_bit(entry + i, map); | 429 | set_bit(entry + i, map); |