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

ioapic.h (2973B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __KVM_IO_APIC_H
      3#define __KVM_IO_APIC_H
      4
      5#include <linux/kvm_host.h>
      6#include <kvm/iodev.h>
      7#include "irq.h"
      8
      9struct kvm;
     10struct kvm_vcpu;
     11
     12#define IOAPIC_NUM_PINS  KVM_IOAPIC_NUM_PINS
     13#define MAX_NR_RESERVED_IOAPIC_PINS KVM_MAX_IRQ_ROUTES
     14#define IOAPIC_VERSION_ID 0x11	/* IOAPIC version */
     15#define IOAPIC_EDGE_TRIG  0
     16#define IOAPIC_LEVEL_TRIG 1
     17
     18#define IOAPIC_DEFAULT_BASE_ADDRESS  0xfec00000
     19#define IOAPIC_MEM_LENGTH            0x100
     20
     21/* Direct registers. */
     22#define IOAPIC_REG_SELECT  0x00
     23#define IOAPIC_REG_WINDOW  0x10
     24
     25/* Indirect registers. */
     26#define IOAPIC_REG_APIC_ID 0x00	/* x86 IOAPIC only */
     27#define IOAPIC_REG_VERSION 0x01
     28#define IOAPIC_REG_ARB_ID  0x02	/* x86 IOAPIC only */
     29
     30/*ioapic delivery mode*/
     31#define	IOAPIC_FIXED			0x0
     32#define	IOAPIC_LOWEST_PRIORITY		0x1
     33#define	IOAPIC_PMI			0x2
     34#define	IOAPIC_NMI			0x4
     35#define	IOAPIC_INIT			0x5
     36#define	IOAPIC_EXTINT			0x7
     37
     38#define RTC_GSI 8
     39
     40struct dest_map {
     41	/* vcpu bitmap where IRQ has been sent */
     42	DECLARE_BITMAP(map, KVM_MAX_VCPU_IDS);
     43
     44	/*
     45	 * Vector sent to a given vcpu, only valid when
     46	 * the vcpu's bit in map is set
     47	 */
     48	u8 vectors[KVM_MAX_VCPU_IDS];
     49};
     50
     51
     52struct rtc_status {
     53	int pending_eoi;
     54	struct dest_map dest_map;
     55};
     56
     57union kvm_ioapic_redirect_entry {
     58	u64 bits;
     59	struct {
     60		u8 vector;
     61		u8 delivery_mode:3;
     62		u8 dest_mode:1;
     63		u8 delivery_status:1;
     64		u8 polarity:1;
     65		u8 remote_irr:1;
     66		u8 trig_mode:1;
     67		u8 mask:1;
     68		u8 reserve:7;
     69		u8 reserved[4];
     70		u8 dest_id;
     71	} fields;
     72};
     73
     74struct kvm_ioapic {
     75	u64 base_address;
     76	u32 ioregsel;
     77	u32 id;
     78	u32 irr;
     79	u32 pad;
     80	union kvm_ioapic_redirect_entry redirtbl[IOAPIC_NUM_PINS];
     81	unsigned long irq_states[IOAPIC_NUM_PINS];
     82	struct kvm_io_device dev;
     83	struct kvm *kvm;
     84	spinlock_t lock;
     85	struct rtc_status rtc_status;
     86	struct delayed_work eoi_inject;
     87	u32 irq_eoi[IOAPIC_NUM_PINS];
     88	u32 irr_delivered;
     89};
     90
     91#ifdef DEBUG
     92#define ASSERT(x)  							\
     93do {									\
     94	if (!(x)) {							\
     95		printk(KERN_EMERG "assertion failed %s: %d: %s\n",	\
     96		       __FILE__, __LINE__, #x);				\
     97		BUG();							\
     98	}								\
     99} while (0)
    100#else
    101#define ASSERT(x) do { } while (0)
    102#endif
    103
    104static inline int ioapic_in_kernel(struct kvm *kvm)
    105{
    106	return irqchip_kernel(kvm);
    107}
    108
    109void kvm_rtc_eoi_tracking_restore_one(struct kvm_vcpu *vcpu);
    110void kvm_ioapic_update_eoi(struct kvm_vcpu *vcpu, int vector,
    111			int trigger_mode);
    112int kvm_ioapic_init(struct kvm *kvm);
    113void kvm_ioapic_destroy(struct kvm *kvm);
    114int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int irq_source_id,
    115		       int level, bool line_status);
    116void kvm_ioapic_clear_all(struct kvm_ioapic *ioapic, int irq_source_id);
    117void kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
    118void kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
    119void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu,
    120			   ulong *ioapic_handled_vectors);
    121void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
    122			    ulong *ioapic_handled_vectors);
    123#endif