x86.c (a584539b24b87dc8be83a713006396cabec47833) | x86.c (f077825a8758d79838a757dafb79adcdd047ef3a) |
---|---|
1/* 2 * Kernel-based Virtual Machine driver for Linux 3 * 4 * derived from drivers/kvm/kvm_main.c 5 * 6 * Copyright (C) 2006 Qumranet, Inc. 7 * Copyright (C) 2008 Qumranet, Inc. 8 * Copyright IBM Corporation, 2008 --- 3087 unchanged lines hidden (view full) --- 3096 3097static int kvm_vcpu_ioctl_nmi(struct kvm_vcpu *vcpu) 3098{ 3099 kvm_inject_nmi(vcpu); 3100 3101 return 0; 3102} 3103 | 1/* 2 * Kernel-based Virtual Machine driver for Linux 3 * 4 * derived from drivers/kvm/kvm_main.c 5 * 6 * Copyright (C) 2006 Qumranet, Inc. 7 * Copyright (C) 2008 Qumranet, Inc. 8 * Copyright IBM Corporation, 2008 --- 3087 unchanged lines hidden (view full) --- 3096 3097static int kvm_vcpu_ioctl_nmi(struct kvm_vcpu *vcpu) 3098{ 3099 kvm_inject_nmi(vcpu); 3100 3101 return 0; 3102} 3103 |
3104static int kvm_vcpu_ioctl_smi(struct kvm_vcpu *vcpu) 3105{ 3106 return 0; 3107} 3108 |
|
3104static int vcpu_ioctl_tpr_access_reporting(struct kvm_vcpu *vcpu, 3105 struct kvm_tpr_access_ctl *tac) 3106{ 3107 if (tac->flags) 3108 return -EINVAL; 3109 vcpu->arch.tpr_access_reporting = !!tac->enabled; 3110 return 0; 3111} --- 89 unchanged lines hidden (view full) --- 3201 3202 events->nmi.injected = vcpu->arch.nmi_injected; 3203 events->nmi.pending = vcpu->arch.nmi_pending != 0; 3204 events->nmi.masked = kvm_x86_ops->get_nmi_mask(vcpu); 3205 events->nmi.pad = 0; 3206 3207 events->sipi_vector = 0; /* never valid when reporting to user space */ 3208 | 3109static int vcpu_ioctl_tpr_access_reporting(struct kvm_vcpu *vcpu, 3110 struct kvm_tpr_access_ctl *tac) 3111{ 3112 if (tac->flags) 3113 return -EINVAL; 3114 vcpu->arch.tpr_access_reporting = !!tac->enabled; 3115 return 0; 3116} --- 89 unchanged lines hidden (view full) --- 3206 3207 events->nmi.injected = vcpu->arch.nmi_injected; 3208 events->nmi.pending = vcpu->arch.nmi_pending != 0; 3209 events->nmi.masked = kvm_x86_ops->get_nmi_mask(vcpu); 3210 events->nmi.pad = 0; 3211 3212 events->sipi_vector = 0; /* never valid when reporting to user space */ 3213 |
3214 events->smi.smm = is_smm(vcpu); 3215 events->smi.pending = vcpu->arch.smi_pending; 3216 events->smi.smm_inside_nmi = 3217 !!(vcpu->arch.hflags & HF_SMM_INSIDE_NMI_MASK); 3218 events->smi.latched_init = kvm_lapic_latched_init(vcpu); 3219 |
|
3209 events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING | 3220 events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING |
3210 | KVM_VCPUEVENT_VALID_SHADOW); | 3221 | KVM_VCPUEVENT_VALID_SHADOW 3222 | KVM_VCPUEVENT_VALID_SMM); |
3211 memset(&events->reserved, 0, sizeof(events->reserved)); 3212} 3213 3214static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, 3215 struct kvm_vcpu_events *events) 3216{ 3217 if (events->flags & ~(KVM_VCPUEVENT_VALID_NMI_PENDING 3218 | KVM_VCPUEVENT_VALID_SIPI_VECTOR | 3223 memset(&events->reserved, 0, sizeof(events->reserved)); 3224} 3225 3226static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, 3227 struct kvm_vcpu_events *events) 3228{ 3229 if (events->flags & ~(KVM_VCPUEVENT_VALID_NMI_PENDING 3230 | KVM_VCPUEVENT_VALID_SIPI_VECTOR |
3219 | KVM_VCPUEVENT_VALID_SHADOW)) | 3231 | KVM_VCPUEVENT_VALID_SHADOW 3232 | KVM_VCPUEVENT_VALID_SMM)) |
3220 return -EINVAL; 3221 3222 process_nmi(vcpu); 3223 vcpu->arch.exception.pending = events->exception.injected; 3224 vcpu->arch.exception.nr = events->exception.nr; 3225 vcpu->arch.exception.has_error_code = events->exception.has_error_code; 3226 vcpu->arch.exception.error_code = events->exception.error_code; 3227 --- 8 unchanged lines hidden (view full) --- 3236 if (events->flags & KVM_VCPUEVENT_VALID_NMI_PENDING) 3237 vcpu->arch.nmi_pending = events->nmi.pending; 3238 kvm_x86_ops->set_nmi_mask(vcpu, events->nmi.masked); 3239 3240 if (events->flags & KVM_VCPUEVENT_VALID_SIPI_VECTOR && 3241 kvm_vcpu_has_lapic(vcpu)) 3242 vcpu->arch.apic->sipi_vector = events->sipi_vector; 3243 | 3233 return -EINVAL; 3234 3235 process_nmi(vcpu); 3236 vcpu->arch.exception.pending = events->exception.injected; 3237 vcpu->arch.exception.nr = events->exception.nr; 3238 vcpu->arch.exception.has_error_code = events->exception.has_error_code; 3239 vcpu->arch.exception.error_code = events->exception.error_code; 3240 --- 8 unchanged lines hidden (view full) --- 3249 if (events->flags & KVM_VCPUEVENT_VALID_NMI_PENDING) 3250 vcpu->arch.nmi_pending = events->nmi.pending; 3251 kvm_x86_ops->set_nmi_mask(vcpu, events->nmi.masked); 3252 3253 if (events->flags & KVM_VCPUEVENT_VALID_SIPI_VECTOR && 3254 kvm_vcpu_has_lapic(vcpu)) 3255 vcpu->arch.apic->sipi_vector = events->sipi_vector; 3256 |
3257 if (events->flags & KVM_VCPUEVENT_VALID_SMM) { 3258 if (events->smi.smm) 3259 vcpu->arch.hflags |= HF_SMM_MASK; 3260 else 3261 vcpu->arch.hflags &= ~HF_SMM_MASK; 3262 vcpu->arch.smi_pending = events->smi.pending; 3263 if (events->smi.smm_inside_nmi) 3264 vcpu->arch.hflags |= HF_SMM_INSIDE_NMI_MASK; 3265 else 3266 vcpu->arch.hflags &= ~HF_SMM_INSIDE_NMI_MASK; 3267 if (kvm_vcpu_has_lapic(vcpu)) { 3268 if (events->smi.latched_init) 3269 set_bit(KVM_APIC_INIT, &vcpu->arch.apic->pending_events); 3270 else 3271 clear_bit(KVM_APIC_INIT, &vcpu->arch.apic->pending_events); 3272 } 3273 } 3274 |
|
3244 kvm_make_request(KVM_REQ_EVENT, vcpu); 3245 3246 return 0; 3247} 3248 3249static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu, 3250 struct kvm_debugregs *dbgregs) 3251{ --- 243 unchanged lines hidden (view full) --- 3495 goto out; 3496 r = kvm_vcpu_ioctl_interrupt(vcpu, &irq); 3497 break; 3498 } 3499 case KVM_NMI: { 3500 r = kvm_vcpu_ioctl_nmi(vcpu); 3501 break; 3502 } | 3275 kvm_make_request(KVM_REQ_EVENT, vcpu); 3276 3277 return 0; 3278} 3279 3280static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu, 3281 struct kvm_debugregs *dbgregs) 3282{ --- 243 unchanged lines hidden (view full) --- 3526 goto out; 3527 r = kvm_vcpu_ioctl_interrupt(vcpu, &irq); 3528 break; 3529 } 3530 case KVM_NMI: { 3531 r = kvm_vcpu_ioctl_nmi(vcpu); 3532 break; 3533 } |
3534 case KVM_SMI: { 3535 r = kvm_vcpu_ioctl_smi(vcpu); 3536 break; 3537 } |
|
3503 case KVM_SET_CPUID: { 3504 struct kvm_cpuid __user *cpuid_arg = argp; 3505 struct kvm_cpuid cpuid; 3506 3507 r = -EFAULT; 3508 if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) 3509 goto out; 3510 r = kvm_vcpu_ioctl_set_cpuid(vcpu, &cpuid, cpuid_arg->entries); --- 2666 unchanged lines hidden (view full) --- 6177 kvm_arch_interrupt_allowed(vcpu)); 6178} 6179 6180static void post_kvm_run_save(struct kvm_vcpu *vcpu) 6181{ 6182 struct kvm_run *kvm_run = vcpu->run; 6183 6184 kvm_run->if_flag = (kvm_get_rflags(vcpu) & X86_EFLAGS_IF) != 0; | 3538 case KVM_SET_CPUID: { 3539 struct kvm_cpuid __user *cpuid_arg = argp; 3540 struct kvm_cpuid cpuid; 3541 3542 r = -EFAULT; 3543 if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) 3544 goto out; 3545 r = kvm_vcpu_ioctl_set_cpuid(vcpu, &cpuid, cpuid_arg->entries); --- 2666 unchanged lines hidden (view full) --- 6212 kvm_arch_interrupt_allowed(vcpu)); 6213} 6214 6215static void post_kvm_run_save(struct kvm_vcpu *vcpu) 6216{ 6217 struct kvm_run *kvm_run = vcpu->run; 6218 6219 kvm_run->if_flag = (kvm_get_rflags(vcpu) & X86_EFLAGS_IF) != 0; |
6220 kvm_run->flags = is_smm(vcpu) ? KVM_RUN_X86_SMM : 0; |
|
6185 kvm_run->cr8 = kvm_get_cr8(vcpu); 6186 kvm_run->apic_base = kvm_get_apic_base(vcpu); 6187 if (irqchip_in_kernel(vcpu->kvm)) 6188 kvm_run->ready_for_interrupt_injection = 1; 6189 else 6190 kvm_run->ready_for_interrupt_injection = 6191 kvm_arch_interrupt_allowed(vcpu) && 6192 !kvm_cpu_has_interrupt(vcpu) && --- 1956 unchanged lines hidden --- | 6221 kvm_run->cr8 = kvm_get_cr8(vcpu); 6222 kvm_run->apic_base = kvm_get_apic_base(vcpu); 6223 if (irqchip_in_kernel(vcpu->kvm)) 6224 kvm_run->ready_for_interrupt_injection = 1; 6225 else 6226 kvm_run->ready_for_interrupt_injection = 6227 kvm_arch_interrupt_allowed(vcpu) && 6228 !kvm_cpu_has_interrupt(vcpu) && --- 1956 unchanged lines hidden --- |