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 ---