cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

irq.h (2894B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * irq.h: in kernel interrupt controller related definitions
      4 * Copyright (c) 2007, Intel Corporation.
      5 *
      6 * Authors:
      7 *   Yaozu (Eddie) Dong <Eddie.dong@intel.com>
      8 */
      9
     10#ifndef __IRQ_H
     11#define __IRQ_H
     12
     13#include <linux/mm_types.h>
     14#include <linux/hrtimer.h>
     15#include <linux/kvm_host.h>
     16#include <linux/spinlock.h>
     17
     18#include <kvm/iodev.h>
     19#include "lapic.h"
     20
     21#define PIC_NUM_PINS 16
     22#define SELECT_PIC(irq) \
     23	((irq) < 8 ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE)
     24
     25struct kvm;
     26struct kvm_vcpu;
     27
     28struct kvm_kpic_state {
     29	u8 last_irr;	/* edge detection */
     30	u8 irr;		/* interrupt request register */
     31	u8 imr;		/* interrupt mask register */
     32	u8 isr;		/* interrupt service register */
     33	u8 priority_add;	/* highest irq priority */
     34	u8 irq_base;
     35	u8 read_reg_select;
     36	u8 poll;
     37	u8 special_mask;
     38	u8 init_state;
     39	u8 auto_eoi;
     40	u8 rotate_on_auto_eoi;
     41	u8 special_fully_nested_mode;
     42	u8 init4;		/* true if 4 byte init */
     43	u8 elcr;		/* PIIX edge/trigger selection */
     44	u8 elcr_mask;
     45	u8 isr_ack;	/* interrupt ack detection */
     46	struct kvm_pic *pics_state;
     47};
     48
     49struct kvm_pic {
     50	spinlock_t lock;
     51	bool wakeup_needed;
     52	unsigned pending_acks;
     53	struct kvm *kvm;
     54	struct kvm_kpic_state pics[2]; /* 0 is master pic, 1 is slave pic */
     55	int output;		/* intr from master PIC */
     56	struct kvm_io_device dev_master;
     57	struct kvm_io_device dev_slave;
     58	struct kvm_io_device dev_elcr;
     59	unsigned long irq_states[PIC_NUM_PINS];
     60};
     61
     62int kvm_pic_init(struct kvm *kvm);
     63void kvm_pic_destroy(struct kvm *kvm);
     64int kvm_pic_read_irq(struct kvm *kvm);
     65void kvm_pic_update_irq(struct kvm_pic *s);
     66
     67static inline int irqchip_split(struct kvm *kvm)
     68{
     69	int mode = kvm->arch.irqchip_mode;
     70
     71	/* Matches smp_wmb() when setting irqchip_mode */
     72	smp_rmb();
     73	return mode == KVM_IRQCHIP_SPLIT;
     74}
     75
     76static inline int irqchip_kernel(struct kvm *kvm)
     77{
     78	int mode = kvm->arch.irqchip_mode;
     79
     80	/* Matches smp_wmb() when setting irqchip_mode */
     81	smp_rmb();
     82	return mode == KVM_IRQCHIP_KERNEL;
     83}
     84
     85static inline int pic_in_kernel(struct kvm *kvm)
     86{
     87	return irqchip_kernel(kvm);
     88}
     89
     90static inline int irqchip_in_kernel(struct kvm *kvm)
     91{
     92	int mode = kvm->arch.irqchip_mode;
     93
     94	/* Matches smp_wmb() when setting irqchip_mode */
     95	smp_rmb();
     96	return mode != KVM_IRQCHIP_NONE;
     97}
     98
     99void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu);
    100void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu);
    101void kvm_apic_nmi_wd_deliver(struct kvm_vcpu *vcpu);
    102void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu);
    103void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu);
    104void __kvm_migrate_timers(struct kvm_vcpu *vcpu);
    105
    106int apic_has_pending_timer(struct kvm_vcpu *vcpu);
    107
    108int kvm_setup_default_irq_routing(struct kvm *kvm);
    109int kvm_setup_empty_irq_routing(struct kvm *kvm);
    110int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
    111			     struct kvm_lapic_irq *irq,
    112			     struct dest_map *dest_map);
    113
    114#endif