1 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License, version 2, as 4 * published by the Free Software Foundation. 5 * 6 * This program is distributed in the hope that it will be useful, 7 * but WITHOUT ANY WARRANTY; without even the implied warranty of 8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 * GNU General Public License for more details. 10 * 11 * You should have received a copy of the GNU General Public License 12 * along with this program; if not, write to the Free Software 13 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 14 * 15 * Copyright IBM Corp. 2007 16 * 17 * Authors: Hollis Blanchard <hollisb@us.ibm.com> 18 * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com> 19 */ 20 21 #include <linux/errno.h> 22 #include <linux/err.h> 23 #include <linux/kvm_host.h> 24 #include <linux/module.h> 25 #include <linux/vmalloc.h> 26 #include <linux/hrtimer.h> 27 #include <linux/fs.h> 28 #include <linux/slab.h> 29 #include <asm/cputable.h> 30 #include <asm/uaccess.h> 31 #include <asm/kvm_ppc.h> 32 #include <asm/tlbflush.h> 33 #include "timing.h" 34 #include "../mm/mmu_decl.h" 35 36 #define CREATE_TRACE_POINTS 37 #include "trace.h" 38 39 gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn) 40 { 41 return gfn; 42 } 43 44 int kvm_arch_vcpu_runnable(struct kvm_vcpu *v) 45 { 46 return !(v->arch.msr & MSR_WE) || !!(v->arch.pending_exceptions); 47 } 48 49 50 int kvmppc_emulate_mmio(struct kvm_run *run, struct kvm_vcpu *vcpu) 51 { 52 enum emulation_result er; 53 int r; 54 55 er = kvmppc_emulate_instruction(run, vcpu); 56 switch (er) { 57 case EMULATE_DONE: 58 /* Future optimization: only reload non-volatiles if they were 59 * actually modified. */ 60 r = RESUME_GUEST_NV; 61 break; 62 case EMULATE_DO_MMIO: 63 run->exit_reason = KVM_EXIT_MMIO; 64 /* We must reload nonvolatiles because "update" load/store 65 * instructions modify register state. */ 66 /* Future optimization: only reload non-volatiles if they were 67 * actually modified. */ 68 r = RESUME_HOST_NV; 69 break; 70 case EMULATE_FAIL: 71 /* XXX Deliver Program interrupt to guest. */ 72 printk(KERN_EMERG "%s: emulation failed (%08x)\n", __func__, 73 vcpu->arch.last_inst); 74 r = RESUME_HOST; 75 break; 76 default: 77 BUG(); 78 } 79 80 return r; 81 } 82 83 int kvm_arch_hardware_enable(void *garbage) 84 { 85 return 0; 86 } 87 88 void kvm_arch_hardware_disable(void *garbage) 89 { 90 } 91 92 int kvm_arch_hardware_setup(void) 93 { 94 return 0; 95 } 96 97 void kvm_arch_hardware_unsetup(void) 98 { 99 } 100 101 void kvm_arch_check_processor_compat(void *rtn) 102 { 103 *(int *)rtn = kvmppc_core_check_processor_compat(); 104 } 105 106 struct kvm *kvm_arch_create_vm(void) 107 { 108 struct kvm *kvm; 109 110 kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL); 111 if (!kvm) 112 return ERR_PTR(-ENOMEM); 113 114 return kvm; 115 } 116 117 static void kvmppc_free_vcpus(struct kvm *kvm) 118 { 119 unsigned int i; 120 struct kvm_vcpu *vcpu; 121 122 kvm_for_each_vcpu(i, vcpu, kvm) 123 kvm_arch_vcpu_free(vcpu); 124 125 mutex_lock(&kvm->lock); 126 for (i = 0; i < atomic_read(&kvm->online_vcpus); i++) 127 kvm->vcpus[i] = NULL; 128 129 atomic_set(&kvm->online_vcpus, 0); 130 mutex_unlock(&kvm->lock); 131 } 132 133 void kvm_arch_sync_events(struct kvm *kvm) 134 { 135 } 136 137 void kvm_arch_destroy_vm(struct kvm *kvm) 138 { 139 kvmppc_free_vcpus(kvm); 140 kvm_free_physmem(kvm); 141 cleanup_srcu_struct(&kvm->srcu); 142 kfree(kvm); 143 } 144 145 int kvm_dev_ioctl_check_extension(long ext) 146 { 147 int r; 148 149 switch (ext) { 150 case KVM_CAP_PPC_SEGSTATE: 151 r = 1; 152 break; 153 case KVM_CAP_COALESCED_MMIO: 154 r = KVM_COALESCED_MMIO_PAGE_OFFSET; 155 break; 156 default: 157 r = 0; 158 break; 159 } 160 return r; 161 162 } 163 164 long kvm_arch_dev_ioctl(struct file *filp, 165 unsigned int ioctl, unsigned long arg) 166 { 167 return -EINVAL; 168 } 169 170 int kvm_arch_prepare_memory_region(struct kvm *kvm, 171 struct kvm_memory_slot *memslot, 172 struct kvm_memory_slot old, 173 struct kvm_userspace_memory_region *mem, 174 int user_alloc) 175 { 176 return 0; 177 } 178 179 void kvm_arch_commit_memory_region(struct kvm *kvm, 180 struct kvm_userspace_memory_region *mem, 181 struct kvm_memory_slot old, 182 int user_alloc) 183 { 184 return; 185 } 186 187 188 void kvm_arch_flush_shadow(struct kvm *kvm) 189 { 190 } 191 192 struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) 193 { 194 struct kvm_vcpu *vcpu; 195 vcpu = kvmppc_core_vcpu_create(kvm, id); 196 kvmppc_create_vcpu_debugfs(vcpu, id); 197 return vcpu; 198 } 199 200 void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu) 201 { 202 kvmppc_remove_vcpu_debugfs(vcpu); 203 kvmppc_core_vcpu_free(vcpu); 204 } 205 206 void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) 207 { 208 kvm_arch_vcpu_free(vcpu); 209 } 210 211 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) 212 { 213 return kvmppc_core_pending_dec(vcpu); 214 } 215 216 static void kvmppc_decrementer_func(unsigned long data) 217 { 218 struct kvm_vcpu *vcpu = (struct kvm_vcpu *)data; 219 220 kvmppc_core_queue_dec(vcpu); 221 222 if (waitqueue_active(&vcpu->wq)) { 223 wake_up_interruptible(&vcpu->wq); 224 vcpu->stat.halt_wakeup++; 225 } 226 } 227 228 /* 229 * low level hrtimer wake routine. Because this runs in hardirq context 230 * we schedule a tasklet to do the real work. 231 */ 232 enum hrtimer_restart kvmppc_decrementer_wakeup(struct hrtimer *timer) 233 { 234 struct kvm_vcpu *vcpu; 235 236 vcpu = container_of(timer, struct kvm_vcpu, arch.dec_timer); 237 tasklet_schedule(&vcpu->arch.tasklet); 238 239 return HRTIMER_NORESTART; 240 } 241 242 int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) 243 { 244 hrtimer_init(&vcpu->arch.dec_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); 245 tasklet_init(&vcpu->arch.tasklet, kvmppc_decrementer_func, (ulong)vcpu); 246 vcpu->arch.dec_timer.function = kvmppc_decrementer_wakeup; 247 248 return 0; 249 } 250 251 void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) 252 { 253 kvmppc_mmu_destroy(vcpu); 254 } 255 256 void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) 257 { 258 kvmppc_core_vcpu_load(vcpu, cpu); 259 } 260 261 void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) 262 { 263 kvmppc_core_vcpu_put(vcpu); 264 } 265 266 int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, 267 struct kvm_guest_debug *dbg) 268 { 269 return -EINVAL; 270 } 271 272 static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu, 273 struct kvm_run *run) 274 { 275 kvmppc_set_gpr(vcpu, vcpu->arch.io_gpr, run->dcr.data); 276 } 277 278 static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu, 279 struct kvm_run *run) 280 { 281 ulong gpr; 282 283 if (run->mmio.len > sizeof(gpr)) { 284 printk(KERN_ERR "bad MMIO length: %d\n", run->mmio.len); 285 return; 286 } 287 288 if (vcpu->arch.mmio_is_bigendian) { 289 switch (run->mmio.len) { 290 case 4: gpr = *(u32 *)run->mmio.data; break; 291 case 2: gpr = *(u16 *)run->mmio.data; break; 292 case 1: gpr = *(u8 *)run->mmio.data; break; 293 } 294 } else { 295 /* Convert BE data from userland back to LE. */ 296 switch (run->mmio.len) { 297 case 4: gpr = ld_le32((u32 *)run->mmio.data); break; 298 case 2: gpr = ld_le16((u16 *)run->mmio.data); break; 299 case 1: gpr = *(u8 *)run->mmio.data; break; 300 } 301 } 302 303 kvmppc_set_gpr(vcpu, vcpu->arch.io_gpr, gpr); 304 } 305 306 int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu, 307 unsigned int rt, unsigned int bytes, int is_bigendian) 308 { 309 if (bytes > sizeof(run->mmio.data)) { 310 printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__, 311 run->mmio.len); 312 } 313 314 run->mmio.phys_addr = vcpu->arch.paddr_accessed; 315 run->mmio.len = bytes; 316 run->mmio.is_write = 0; 317 318 vcpu->arch.io_gpr = rt; 319 vcpu->arch.mmio_is_bigendian = is_bigendian; 320 vcpu->mmio_needed = 1; 321 vcpu->mmio_is_write = 0; 322 323 return EMULATE_DO_MMIO; 324 } 325 326 int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu, 327 u32 val, unsigned int bytes, int is_bigendian) 328 { 329 void *data = run->mmio.data; 330 331 if (bytes > sizeof(run->mmio.data)) { 332 printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__, 333 run->mmio.len); 334 } 335 336 run->mmio.phys_addr = vcpu->arch.paddr_accessed; 337 run->mmio.len = bytes; 338 run->mmio.is_write = 1; 339 vcpu->mmio_needed = 1; 340 vcpu->mmio_is_write = 1; 341 342 /* Store the value at the lowest bytes in 'data'. */ 343 if (is_bigendian) { 344 switch (bytes) { 345 case 4: *(u32 *)data = val; break; 346 case 2: *(u16 *)data = val; break; 347 case 1: *(u8 *)data = val; break; 348 } 349 } else { 350 /* Store LE value into 'data'. */ 351 switch (bytes) { 352 case 4: st_le32(data, val); break; 353 case 2: st_le16(data, val); break; 354 case 1: *(u8 *)data = val; break; 355 } 356 } 357 358 return EMULATE_DO_MMIO; 359 } 360 361 int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) 362 { 363 int r; 364 sigset_t sigsaved; 365 366 vcpu_load(vcpu); 367 368 if (vcpu->sigset_active) 369 sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved); 370 371 if (vcpu->mmio_needed) { 372 if (!vcpu->mmio_is_write) 373 kvmppc_complete_mmio_load(vcpu, run); 374 vcpu->mmio_needed = 0; 375 } else if (vcpu->arch.dcr_needed) { 376 if (!vcpu->arch.dcr_is_write) 377 kvmppc_complete_dcr_load(vcpu, run); 378 vcpu->arch.dcr_needed = 0; 379 } 380 381 kvmppc_core_deliver_interrupts(vcpu); 382 383 local_irq_disable(); 384 kvm_guest_enter(); 385 r = __kvmppc_vcpu_run(run, vcpu); 386 kvm_guest_exit(); 387 local_irq_enable(); 388 389 if (vcpu->sigset_active) 390 sigprocmask(SIG_SETMASK, &sigsaved, NULL); 391 392 vcpu_put(vcpu); 393 394 return r; 395 } 396 397 int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, struct kvm_interrupt *irq) 398 { 399 kvmppc_core_queue_external(vcpu, irq); 400 401 if (waitqueue_active(&vcpu->wq)) { 402 wake_up_interruptible(&vcpu->wq); 403 vcpu->stat.halt_wakeup++; 404 } 405 406 return 0; 407 } 408 409 int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, 410 struct kvm_mp_state *mp_state) 411 { 412 return -EINVAL; 413 } 414 415 int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, 416 struct kvm_mp_state *mp_state) 417 { 418 return -EINVAL; 419 } 420 421 long kvm_arch_vcpu_ioctl(struct file *filp, 422 unsigned int ioctl, unsigned long arg) 423 { 424 struct kvm_vcpu *vcpu = filp->private_data; 425 void __user *argp = (void __user *)arg; 426 long r; 427 428 switch (ioctl) { 429 case KVM_INTERRUPT: { 430 struct kvm_interrupt irq; 431 r = -EFAULT; 432 if (copy_from_user(&irq, argp, sizeof(irq))) 433 goto out; 434 r = kvm_vcpu_ioctl_interrupt(vcpu, &irq); 435 break; 436 } 437 default: 438 r = -EINVAL; 439 } 440 441 out: 442 return r; 443 } 444 445 long kvm_arch_vm_ioctl(struct file *filp, 446 unsigned int ioctl, unsigned long arg) 447 { 448 long r; 449 450 switch (ioctl) { 451 default: 452 r = -ENOTTY; 453 } 454 455 return r; 456 } 457 458 int kvm_arch_init(void *opaque) 459 { 460 return 0; 461 } 462 463 void kvm_arch_exit(void) 464 { 465 } 466