~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/kvm/irq.c

Version: ~ [ linux-5.4-rc3 ] ~ [ linux-5.3.6 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.79 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.149 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.196 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.196 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.75 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * irq.c: API for in kernel interrupt controller
  3  * Copyright (c) 2007, Intel Corporation.
  4  * Copyright 2009 Red Hat, Inc. and/or its affiliates.
  5  *
  6  * This program is free software; you can redistribute it and/or modify it
  7  * under the terms and conditions of the GNU General Public License,
  8  * version 2, as published by the Free Software Foundation.
  9  *
 10  * This program is distributed in the hope it will be useful, but WITHOUT
 11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 13  * more details.
 14  *
 15  * You should have received a copy of the GNU General Public License along with
 16  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 17  * Place - Suite 330, Boston, MA 02111-1307 USA.
 18  * Authors:
 19  *   Yaozu (Eddie) Dong <Eddie.dong@intel.com>
 20  *
 21  */
 22 
 23 #include <linux/export.h>
 24 #include <linux/kvm_host.h>
 25 
 26 #include "irq.h"
 27 #include "i8254.h"
 28 #include "x86.h"
 29 
 30 /*
 31  * check if there are pending timer events
 32  * to be processed.
 33  */
 34 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
 35 {
 36         if (lapic_in_kernel(vcpu))
 37                 return apic_has_pending_timer(vcpu);
 38 
 39         return 0;
 40 }
 41 EXPORT_SYMBOL(kvm_cpu_has_pending_timer);
 42 
 43 /*
 44  * check if there is a pending userspace external interrupt
 45  */
 46 static int pending_userspace_extint(struct kvm_vcpu *v)
 47 {
 48         return v->arch.pending_external_vector != -1;
 49 }
 50 
 51 /*
 52  * check if there is pending interrupt from
 53  * non-APIC source without intack.
 54  */
 55 static int kvm_cpu_has_extint(struct kvm_vcpu *v)
 56 {
 57         u8 accept = kvm_apic_accept_pic_intr(v);
 58 
 59         if (accept) {
 60                 if (irqchip_split(v->kvm))
 61                         return pending_userspace_extint(v);
 62                 else
 63                         return v->kvm->arch.vpic->output;
 64         } else
 65                 return 0;
 66 }
 67 
 68 /*
 69  * check if there is injectable interrupt:
 70  * when virtual interrupt delivery enabled,
 71  * interrupt from apic will handled by hardware,
 72  * we don't need to check it here.
 73  */
 74 int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
 75 {
 76         if (!lapic_in_kernel(v))
 77                 return v->arch.interrupt.pending;
 78 
 79         if (kvm_cpu_has_extint(v))
 80                 return 1;
 81 
 82         if (kvm_vcpu_apicv_active(v))
 83                 return 0;
 84 
 85         return kvm_apic_has_interrupt(v) != -1; /* LAPIC */
 86 }
 87 
 88 /*
 89  * check if there is pending interrupt without
 90  * intack.
 91  */
 92 int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
 93 {
 94         if (!lapic_in_kernel(v))
 95                 return v->arch.interrupt.pending;
 96 
 97         if (kvm_cpu_has_extint(v))
 98                 return 1;
 99 
100         return kvm_apic_has_interrupt(v) != -1; /* LAPIC */
101 }
102 EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
103 
104 /*
105  * Read pending interrupt(from non-APIC source)
106  * vector and intack.
107  */
108 static int kvm_cpu_get_extint(struct kvm_vcpu *v)
109 {
110         if (kvm_cpu_has_extint(v)) {
111                 if (irqchip_split(v->kvm)) {
112                         int vector = v->arch.pending_external_vector;
113 
114                         v->arch.pending_external_vector = -1;
115                         return vector;
116                 } else
117                         return kvm_pic_read_irq(v->kvm); /* PIC */
118         } else
119                 return -1;
120 }
121 
122 /*
123  * Read pending interrupt vector and intack.
124  */
125 int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
126 {
127         int vector;
128 
129         if (!lapic_in_kernel(v))
130                 return v->arch.interrupt.nr;
131 
132         vector = kvm_cpu_get_extint(v);
133 
134         if (vector != -1)
135                 return vector;                  /* PIC */
136 
137         return kvm_get_apic_interrupt(v);       /* APIC */
138 }
139 EXPORT_SYMBOL_GPL(kvm_cpu_get_interrupt);
140 
141 void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu)
142 {
143         if (lapic_in_kernel(vcpu))
144                 kvm_inject_apic_timer_irqs(vcpu);
145 }
146 EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
147 
148 void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
149 {
150         __kvm_migrate_apic_timer(vcpu);
151         __kvm_migrate_pit_timer(vcpu);
152 }
153 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp