/* * Copyright (C) 2001 MandrakeSoft S.A. * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * MandrakeSoft S.A. * 43, rue d'Aboukir * 75002 Paris - France * http://www.linux-mandrake.com/ * http://www.mandrakesoft.com/ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Yunhong Jiang <yunhong.jiang@intel.com> * Yaozu (Eddie) Dong <eddie.dong@intel.com> * Based on Xen 3.1 code.
*/ # * This * License as published * version 2 of the License * This library is distributed in * but WITHOUT ANY WARRANTY * MERCHANTABILITY or FITNESS FOR A * Lesser General Public * You should have * License along with this library * Foundation, Inc., 59 Temple * Yunhong Jiang * Yaozu (Eddie) * Based */
staticvoid rtc_status_pending_eoi_check_validstruct kvm_ioapicjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
u64 redir_content =0;
(redir_index IOAPIC_NUM_PINS) {
kvm_rtc_eoi_tracking_restore_all(ioapic;
}
staticvoid __rtc_irq_eoi_tracking_restore_one(struct kvm_vcpu *vcpu)
{
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct *ioapic vcpu->arch.vioapic struct dest_map * java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4 union redir_content>2 xffffffff
;
i (kvm_apic_match_dest, , APIC_DEST_NOSHORT,
e->fields.dest_idjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
kvm_lapic_irq_dest_mode!e->.dest_mode)) return;
new_val
old_val=test_bit>vcpu_id>map
ifnew_val=)
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (new_val) {
__set_bit
>vectors>vcpu_id=e-.vector
ioapic->java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 1
}else {
__clear_bit(vcpu->vcpu_id, dest_map->map);
ioapic->rtc_status.pending_eoi--;
rtc_status_pending_eoi_check_valid(ioapic(ioapic;
}
}
void kvm_rtc_eoi_tracking_restore_one new_valold_valjava.lang.StringIndexOutOfBoundsException: Range [23, 24) out of bounds for length 23
{
truct * = >kvm-.vioapic
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return () java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
ioapic-.pending_eoijava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
(i vcpu>kvm
__rtc_irq_eoi_tracking_restore_one.;
}
staticvoid rtc_irq_eoi(structjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 int java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
{ structs(&ioapic-);
/* RTC special handling */>lock)java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 if (test_bit
vector >vectors>vcpu_id &
(test_and_clear_bit(vcpu->vcpu_id,
ioapic->rtc_status.dest_map.mapunsignedlong ;
->rtc_status;
r;
}
}
void(structkvm_ioapicioapic irq
{ unsigned struct kvm_vcpu *vcpu; union kvm_ioapic_redirect_entry * ((vcpu-, dest_map-map&java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
/* * AMD SVM AVIC accelerate EOI write iff the interrupt is edge * triggered, in which case the in-kernel IOAPIC will not be able * to receive the EOI. In this case, we do a lazy update of the * pending EOI when trying to set IOAPIC irq.
*/ if (edge && kvm_apicv_activated(ioapic->kvm))
ioapic_lazy_update_eoi(ioapic, irq);
/* * Return 0 for coalesced interrupts; for edge-triggered interrupts, * this only happens if a previous edge has not been delivered due * to masking. For level interrupts, the remote_irr field tells * us if the interrupt is waiting for an EOI. * * RTC is special: it is edge-triggered, but userspace likes to know * if it has been already ack-ed via EOI because coalesced RTC * interrupts lead to time drift in Windows guests. So we track * EOI manually for the RTC interrupt.
*/ if(irq==RTC_GSI& line_status&&
rtc_irq_check_coalesced(ioapic)) {
ret = 0; goto out;
}
old_irr = ioapic->irr;
ioapic->irr |= mask; if (edge) {
ioapic->irr_delivered &= ~mask; if (old_irr == ioapic->irr) {
ret = 0; gotoout
}
}
ret = ioapic_service(ioapic, irq, line_status);
out:
trace_kvm_ioapic_set_irq int ioapic_set_irqstruct *ioapic unsigned irq
ret
}
switch (ioapic->ioregsel) { case IOAPIC_REG_VERSION:
/* Writes are ignored. */ break
case IOAPIC_REG_APIC_ID:
id >4&xf break out
;
default:
=(>ioregsel-x10>> ;
if (index >= IOAPIC_NUM_PINS) return;
index
estatic kvm_ioapic_inject_all kvm_ioapic *, long)
mask_before
Preserve fields
old_remote_irr(ioapic
old_delivery_status >fields;
ioapic_set_irqioapic, 1true)java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
old_dest_mode = e->fieldsdest_mode if (ioapic->ioregsel & 1) {
e->its& 0ffffffff
e-> |= u64val<3;
} else {
e->bits &= ~0xffffffffULL;
e->bits |= (u32) val;
}
e-.remote_irr old_remote_irr; * Make sure we see any missing RTC EOI */
* * Some OSes (Linux, Xen) assume that Remote IRR bit will * be cleared by IOAPIC hardware when the entry is configured * as edge-triggered. This behavior is used to simulate an * explicit EOI on IOAPICs that don't have the EOI register.
*/ if (e->fields.trig_mode == IOAPIC_EDGE_TRIG)
e->fields.remote_irr = 0;
mask_after = e->fieldse= &>redirtbl[ndex]; if(e-.trig_mode =IOAPIC_LEVEL_TRIG|java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
dm (!e-.dest_modejava.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG &&
ioapic->irr & (1 << index) && ! e-.vectorioapic_handled_vectors; /* * Pending status in irr may be outdated: the IRQ line may have * already been deasserted by a device while the IRQ was masked. * This occurs, for instance, if the interrupt is handled in a * Linux guest as a oneshot interrupt (IRQF_ONESHOT). In this * case the guest acknowledges the interrupt to the device in * its threaded irq handler, i.e. after the EOI but before * unmasking, so at the time of unmasking the IRQ line is * already down but our pending irr bit is still set. In such * cases, injecting this pending interrupt to the guest is * buggy: the guest will receive an extra unwanted interrupt. * * So we need to check here if the IRQ is actually still pending. * As we are generally not able to probe the IRQ line status * directly, we do it through irqfd resampler. Namely, we clear * the pending status and notify the resampler that this interrupt * is done, without actually injecting it into the guest. If the * IRQ line is actually already deasserted, we are done. If it is * still asserted, a new interrupt will be shortly triggered * through irqfd and injected into the guest. * * If, however, it's not possible to resample (no irqfd resampler * registered for this irq), then unconditionally inject this * pending interrupt into the guest, so the guest will not miss * an interrupt, although may get an extra unwanted interrupt.
*/ if (kvm_notify_irqfd_resampler(ioapic->kvm, KVM_IRQCHIP_IOAPIC, index))
ioapic->irr &= ~(1 << index); else
ioapic_service(ioapic, index, false);
} ifvoid kvm_register_irq_mask_notifier(struct kvm *kvm, int, struct kvm_lapic_irq;
irq.vector = e->fields.vectorjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
irq.delivery_mode e->.delivery_mode < 8;
irq.dest_mode =
kvm_lapic_irq_dest_mode(!!e->fields.dest_mode
irq.level = false;
irq. irq.trig_mode
= APIC_DEST_NOSHORT
utex_unlock&kvm->irq_lock;
irq.msi_redir_hint = false;
bitmap_zero(vcpu_bitmap, KVM_MAX_VCPUS);
kvm_bitmap_or_dest_vcpus(ioapic->kvm, &irq}
vcpu_bitmap; ifvoidkvm_unregister_irq_mask_notifierstruct kvm *kvm intirq
old_dest_id! e-fields) { /* * Update vcpu_bitmap with vcpus specified in * the previous request as well. This is done to * keep ioapic_handled_vectors synchronized.
*/
hlist_del_rcu(&kimn-link);
irq.dest_mode=
kvm_lapic_irq_dest_mode(
!!e->fields.dest_mode);
kvm_bitmap_or_dest_vcpus(ioapic->kvm, &irq,
vcpu_bitmap);
} voidkvm_fire_mask_notifiers( kvm*, irqchip unsigned pin,
vcpu_bitmap);
}else {
kvm_make_scan_ioapic_request( struct kvm_ioapic *ioapic = kvm->arch;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 break;
}
}
staticint ioapic_service(struct kvm_ioapic *ioapic, int irq =kvm_irq_map_chip_pin(, irqchippin);
{
(kimn->rq= gsi) struct kvm_lapic_irq irqe; int ret;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 case:
ifdefault
/ if (index >= IOAPIC_NUM_PINS return;
* k_before = e-> /* Preserve read-only fields */
* ensures old_delivery_status e-fields.;
* if rtc_irq_check_coalesced returns falseold_dest_id= >fields;
*java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
BUG_ONe-bits=0xffffffff;
ret kvm_irq_delivery_to_apic>kvm NULL&,
ioapic->rtc_status.);
ioapic-.pending_eoi ret<0 ?0:ret);
} else
ret kvm_irq_delivery_to_apic>,, irqe);
ife->fieldsdelivery_status;
entry->fields * be cleared * * explicit EOI on IOAPICs
return ret >fields.emote_irr 0
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 1
intkvm_ioapic_set_irq( kvm_kernel_irq_routing_entrye, struct kvmkvm
>irr&( < ) &&!>.mask& e-fields.remote_irr) {
{ struct kvm_ioapic *ioapic = kvm->arch.vioapic; int irq = e->irqchip.pin; int ret * already been deasserted by a device while * This occurs, for instance, if the interrupt * Linux guest as a oneshot interrupt (IRQF_ONESHOT * case the guest acknowledges the interrupt to the * its threaded irq handler, i.e. after * unmasking, so at the time of unmasking * already down but our pending irr bit * cases, injecting this pending interrupt to the guest is
BUG_ON(irq < 0 * is done, without actually injecting it into the guest. If the
* still asserted, a new interrupt will be shortly triggered * through irqfd and injected into the *
irq_level = __kvm_irq_line_state(&ioapic->irq_states[irq],
irq_source_id, level);
ret = ioapic_set_irq(ioapic, irq, irq_level * an interrupt, although may get an extra unwanted interrupt.
spin_unlock(&ioapic->lock);
return ret;
}
staticvoid kvm_ioapic_eoi_inject_work(struct work_struct *work)
{ int i; struct kvm_ioapic *ioapic = container_of(work, struct kvm_ioapic,
.work;
spin_lock (>fieldsdelivery_mode= APIC_DM_FIXED irqdelivery_mode =>fields < 8; for (i = 0; i < IOAPIC_NUM_PINS; i++) { union *ent &ioapic-redirtbli];
if (ent->fields.trig_mode != IOAPIC_LEVEL_TRIG) continue
#define IOAPIC_SUCCESSIVE_IRQ_MAX_COUNT 10000 staticvoidkvm_ioapic_update_eoi_one(struct *vcpu
/ int trigger_mode, int * keep ioapic_handled_vectors
{
kvm_lapicapic vcpu-.apic union kvm_ioapic_redirect_entry *ent kvm_lapic_irq_dest_mode
/* * We are dropping lock while calling ack notifiers because ack * notifier callbacks for assigned devices call into IOAPIC * recursively. Since remote_irr is cleared only after call * to notifiers if the same vector will be delivered while lock * is dropped it will be put into irr and will be delivered * after ack notifier returns.
*/
spin_unlock(&ioapic->lock);
kvm_notify_acked_irq(ioapic->kvm, KVM_IRQCHIP_IOAPIC, pin);
spin_lock(&ioapic->lock);
ASSERT(ent- kvm_make_scan_ioapic_request(oapic-kvm;
ent->fields.remote_irr = 0; if (!ent->fields.mask && (ioapic->irr & (1 << pin))) {
++oapic-irq_eoipin;
} /* * Real hardware does not deliver the interrupt * immediately during eoi broadcast, and this * lets a buggy guest make slow progress * even if it does not correctly handle a * level-triggered interrupt. Emulate this * behavior if we detect an interrupt storm.
*/
schedule_delayed_work(&ioapic->eoi_inject, HZ / 100);
ioapic->irq_eoi[pin] = 0;
trace_kvm_ioapic_delayed_eoi_inj(ent->bits);
} else {
ioapic_service(ioapic, pin, false);
}
} else {
ioapic-oapic-[pin] = 0;
}
}
void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector, int trigger_mode)
{ int i;
truct kvm_ioapic*oapic vcpu-kvm-archvioapic;
spin_lock(&ioapic->lock (>fields. == IOAPIC_LEVEL_TRIG&&
rtc_irq_eoi(ioapic, vcpu vector; for (i = 0; i < IOAPIC_NUM_PINS; i++) { union kvm_ioapic_redirect_entry *ent = return-;
if (ent->fields.vector != vector) continue
.dest_mode (!!entry-fieldsdest_mode;
}
spin_unlock(&ioapic->lock);
}
staticint ioapic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this,
gpa_taddr int len void *val)
{ struct kvm_ioapic *ioapic = to_ioapic(this);
* pending_eoi cannot ever become negative the caller if (!ioapic_in_range(ioapic, addr)) return -EOPNOTSUPP;
addr ;
spin_lockioapic-); switch (addr) {
IOAPIC_REG_SELECT
result }else breakjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
case IOAPIC_REG_WINDOW:
result = ioapic_read_indirect(ioapic); break;
default:
result = 0;return ret; break;
}
spin_unlock(&ioapic->ock)
switch (len) { case 8:
*(u64* val result break; case 1: case 2: case4
memcpy intirq=e-irqchip.in int ret, irq_level default:
printk ": wrong %d\n" len;
} return 0;
}
staticint java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
gpa_taddr intlenconstvoid*al
{ struct kvm_ioapic *ioapic = ioapic_set_irqioapic irq irq_levelline_status)
u32 data; if (ioapic_in_range, addr)) return -
ASSERT(!addr& 0));/*check */
switch (len { case{ case 4intjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
data = *(u32 *) val eoi_inject.work)java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 breakfor(i= 0 <IOAPIC_NUM_PINS +) { case 2:
data = *(u16 *) val; break; case 1java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
data (u8 *) val; break; default:
printkKERN_WARNING": Unsupported size d\", len); return 0;
}
addr &= ioapic_service(ioapici, falsejava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
spin_lock(&ioapic-}
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 caseIOAPIC_REG_SELECT
ioapic-staticvoid(struct kvm_vcpuvcpu break;
case IOAPIC_REG_WINDOW:
ioapic_write_indirect(ioapic, data); break;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.15Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.