mirror of
https://github.com/qemu/qemu.git
synced 2024-11-27 22:03:35 +08:00
hw/intc: Extract the IRQ counting functions into a separate file
These IRQ counting functions will soon be required in binaries that do not include the APIC code, too, so let's extract them into a separate file that can be linked independently of the APIC code. While we're at it, change the apic_* prefix into kvm_* since the functions are used from the i8259 PIC (i.e. not the APIC), too. Reviewed-by: Bernhard Beschow <shentey@gmail.com> Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-Id: <20230110095351.611724-2-thuth@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
2aaf0ec7ff
commit
2b85e0cda4
@ -14,7 +14,7 @@
|
||||
#include "hw/isa/i8259_internal.h"
|
||||
#include "hw/intc/i8259.h"
|
||||
#include "qemu/module.h"
|
||||
#include "hw/i386/apic_internal.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "hw/irq.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "qom/object.h"
|
||||
@ -117,7 +117,7 @@ static void kvm_pic_set_irq(void *opaque, int irq, int level)
|
||||
|
||||
pic_stat_update_irq(irq, level);
|
||||
delivered = kvm_set_irq(kvm_state, irq, level);
|
||||
apic_report_irq_delivered(delivered);
|
||||
kvm_report_irq_delivered(delivered);
|
||||
}
|
||||
|
||||
static void kvm_pic_realize(DeviceState *dev, Error **errp)
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include "hw/i386/x86.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/i386/ioapic_internal.h"
|
||||
#include "hw/i386/apic_internal.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
/* PC Utility function */
|
||||
@ -116,7 +116,7 @@ static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
|
||||
|
||||
ioapic_stat_update_irq(common, irq, level);
|
||||
delivered = kvm_set_irq(kvm_state, s->kvm_gsi_base + irq, level);
|
||||
apic_report_irq_delivered(delivered);
|
||||
kvm_report_irq_delivered(delivered);
|
||||
}
|
||||
|
||||
static void kvm_ioapic_realize(DeviceState *dev, Error **errp)
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "hw/i386/apic.h"
|
||||
#include "hw/i386/ioapic.h"
|
||||
#include "hw/intc/i8259.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "hw/pci/msi.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "sysemu/kvm.h"
|
||||
@ -399,7 +400,7 @@ void apic_poll_irq(DeviceState *dev)
|
||||
|
||||
static void apic_set_irq(APICCommonState *s, int vector_num, int trigger_mode)
|
||||
{
|
||||
apic_report_irq_delivered(!apic_get_bit(s->irr, vector_num));
|
||||
kvm_report_irq_delivered(!apic_get_bit(s->irr, vector_num));
|
||||
|
||||
apic_set_bit(s->irr, vector_num);
|
||||
if (trigger_mode)
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "qapi/visitor.h"
|
||||
#include "hw/i386/apic.h"
|
||||
#include "hw/i386/apic_internal.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "trace.h"
|
||||
#include "hw/boards.h"
|
||||
#include "sysemu/hax.h"
|
||||
@ -33,7 +34,6 @@
|
||||
#include "hw/sysbus.h"
|
||||
#include "migration/vmstate.h"
|
||||
|
||||
static int apic_irq_delivered;
|
||||
bool apic_report_tpr_access;
|
||||
|
||||
void cpu_set_apic_base(DeviceState *dev, uint64_t val)
|
||||
@ -122,32 +122,6 @@ void apic_handle_tpr_access_report(DeviceState *dev, target_ulong ip,
|
||||
vapic_report_tpr_access(s->vapic, CPU(s->cpu), ip, access);
|
||||
}
|
||||
|
||||
void apic_report_irq_delivered(int delivered)
|
||||
{
|
||||
apic_irq_delivered += delivered;
|
||||
|
||||
trace_apic_report_irq_delivered(apic_irq_delivered);
|
||||
}
|
||||
|
||||
void apic_reset_irq_delivered(void)
|
||||
{
|
||||
/* Copy this into a local variable to encourage gcc to emit a plain
|
||||
* register for a sys/sdt.h marker. For details on this workaround, see:
|
||||
* https://sourceware.org/bugzilla/show_bug.cgi?id=13296
|
||||
*/
|
||||
volatile int a_i_d = apic_irq_delivered;
|
||||
trace_apic_reset_irq_delivered(a_i_d);
|
||||
|
||||
apic_irq_delivered = 0;
|
||||
}
|
||||
|
||||
int apic_get_irq_delivered(void)
|
||||
{
|
||||
trace_apic_get_irq_delivered(apic_irq_delivered);
|
||||
|
||||
return apic_irq_delivered;
|
||||
}
|
||||
|
||||
void apic_deliver_nmi(DeviceState *dev)
|
||||
{
|
||||
APICCommonState *s = APIC_COMMON(dev);
|
||||
@ -272,7 +246,7 @@ static void apic_reset_common(DeviceState *dev)
|
||||
s->apicbase = APIC_DEFAULT_ADDRESS | bsp | MSR_IA32_APICBASE_ENABLE;
|
||||
s->id = s->initial_apic_id;
|
||||
|
||||
apic_reset_irq_delivered();
|
||||
kvm_reset_irq_delivered();
|
||||
|
||||
s->vapic_paddr = 0;
|
||||
info->vapic_base_update(s);
|
||||
|
49
hw/intc/kvm_irqcount.c
Normal file
49
hw/intc/kvm_irqcount.c
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* KVM PIC functions for counting the delivered IRQs.
|
||||
*
|
||||
* 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.1 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, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "trace.h"
|
||||
|
||||
static int kvm_irq_delivered;
|
||||
|
||||
void kvm_report_irq_delivered(int delivered)
|
||||
{
|
||||
kvm_irq_delivered += delivered;
|
||||
|
||||
trace_kvm_report_irq_delivered(kvm_irq_delivered);
|
||||
}
|
||||
|
||||
void kvm_reset_irq_delivered(void)
|
||||
{
|
||||
/*
|
||||
* Copy this into a local variable to encourage gcc to emit a plain
|
||||
* register for a sys/sdt.h marker. For details on this workaround, see:
|
||||
* https://sourceware.org/bugzilla/show_bug.cgi?id=13296
|
||||
*/
|
||||
volatile int k_i_d = kvm_irq_delivered;
|
||||
trace_kvm_reset_irq_delivered(k_i_d);
|
||||
|
||||
kvm_irq_delivered = 0;
|
||||
}
|
||||
|
||||
int kvm_get_irq_delivered(void)
|
||||
{
|
||||
trace_kvm_get_irq_delivered(kvm_irq_delivered);
|
||||
|
||||
return kvm_irq_delivered;
|
||||
}
|
@ -25,6 +25,12 @@ softmmu_ss.add(when: 'CONFIG_XILINX', if_true: files('xilinx_intc.c'))
|
||||
softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP', if_true: files('xlnx-zynqmp-ipi.c'))
|
||||
softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_PMU', if_true: files('xlnx-pmu-iomod-intc.c'))
|
||||
|
||||
if config_all_devices.has_key('CONFIG_APIC') or \
|
||||
config_all_devices.has_key('CONFIG_I8259') or \
|
||||
config_all_devices.has_key('CONFIG_MC146818RTC')
|
||||
softmmu_ss.add(files('kvm_irqcount.c'))
|
||||
endif
|
||||
|
||||
specific_ss.add(when: 'CONFIG_ALLWINNER_A10_PIC', if_true: files('allwinner-a10-pic.c'))
|
||||
specific_ss.add(when: 'CONFIG_APIC', if_true: files('apic.c', 'apic_common.c'))
|
||||
specific_ss.add(when: 'CONFIG_ARM_GIC', if_true: files('arm_gicv3_cpuif_common.c'))
|
||||
|
@ -10,10 +10,6 @@ pic_ioport_read(bool master, uint64_t addr, int val) "master %d addr 0x%"PRIx64"
|
||||
# apic_common.c
|
||||
cpu_set_apic_base(uint64_t val) "0x%016"PRIx64
|
||||
cpu_get_apic_base(uint64_t val) "0x%016"PRIx64
|
||||
# coalescing
|
||||
apic_report_irq_delivered(int apic_irq_delivered) "coalescing %d"
|
||||
apic_reset_irq_delivered(int apic_irq_delivered) "old coalescing %d"
|
||||
apic_get_irq_delivered(int apic_irq_delivered) "returning coalescing %d"
|
||||
|
||||
# apic.c
|
||||
apic_local_deliver(int vector, uint32_t lvt) "vector %d delivery mode %d"
|
||||
@ -30,6 +26,11 @@ ioapic_mem_read(uint8_t addr, uint8_t regsel, uint8_t size, uint32_t val) "ioapi
|
||||
ioapic_mem_write(uint8_t addr, uint8_t regsel, uint8_t size, uint32_t val) "ioapic mem write addr 0x%"PRIx8" regsel: 0x%"PRIx8" size 0x%"PRIx8" val 0x%"PRIx32
|
||||
ioapic_set_irq(int vector, int level) "vector: %d level: %d"
|
||||
|
||||
# kvm_irqcount.c
|
||||
kvm_report_irq_delivered(int irq_delivered) "coalescing %d"
|
||||
kvm_reset_irq_delivered(int irq_delivered) "old coalescing %d"
|
||||
kvm_get_irq_delivered(int irq_delivered) "returning coalescing %d"
|
||||
|
||||
# slavio_intctl.c
|
||||
slavio_intctl_mem_readl(uint32_t cpu, uint64_t addr, uint32_t ret) "read cpu %d reg 0x%"PRIx64" = 0x%x"
|
||||
slavio_intctl_mem_writel(uint32_t cpu, uint64_t addr, uint32_t val) "write cpu %d reg 0x%"PRIx64" = 0x%x"
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/bcd.h"
|
||||
#include "hw/acpi/acpi_aml_interface.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/qdev-properties-system.h"
|
||||
@ -46,7 +47,6 @@
|
||||
|
||||
#ifdef TARGET_I386
|
||||
#include "qapi/qapi-commands-misc-target.h"
|
||||
#include "hw/i386/apic.h"
|
||||
#endif
|
||||
|
||||
//#define DEBUG_CMOS
|
||||
@ -124,9 +124,9 @@ void qmp_rtc_reset_reinjection(Error **errp)
|
||||
|
||||
static bool rtc_policy_slew_deliver_irq(RTCState *s)
|
||||
{
|
||||
apic_reset_irq_delivered();
|
||||
kvm_reset_irq_delivered();
|
||||
qemu_irq_raise(s->irq);
|
||||
return apic_get_irq_delivered();
|
||||
return kvm_get_irq_delivered();
|
||||
}
|
||||
|
||||
static void rtc_coalesced_timer(void *opaque)
|
||||
|
@ -9,8 +9,6 @@ int apic_accept_pic_intr(DeviceState *s);
|
||||
void apic_deliver_pic_intr(DeviceState *s, int level);
|
||||
void apic_deliver_nmi(DeviceState *d);
|
||||
int apic_get_interrupt(DeviceState *s);
|
||||
void apic_reset_irq_delivered(void);
|
||||
int apic_get_irq_delivered(void);
|
||||
void cpu_set_apic_base(DeviceState *s, uint64_t val);
|
||||
uint64_t cpu_get_apic_base(DeviceState *s);
|
||||
void cpu_set_apic_tpr(DeviceState *s, uint8_t val);
|
||||
|
@ -199,7 +199,6 @@ typedef struct VAPICState {
|
||||
|
||||
extern bool apic_report_tpr_access;
|
||||
|
||||
void apic_report_irq_delivered(int delivered);
|
||||
bool apic_next_timer(APICCommonState *s, int64_t current_time);
|
||||
void apic_enable_tpr_access_reporting(DeviceState *d, bool enable);
|
||||
void apic_enable_vapic(DeviceState *d, hwaddr paddr);
|
||||
|
10
include/hw/intc/kvm_irqcount.h
Normal file
10
include/hw/intc/kvm_irqcount.h
Normal file
@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#ifndef KVM_IRQCOUNT_H
|
||||
#define KVM_IRQCOUNT_H
|
||||
|
||||
void kvm_report_irq_delivered(int delivered);
|
||||
void kvm_reset_irq_delivered(void);
|
||||
int kvm_get_irq_delivered(void);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user