arch/riscv/kvm/aia_imsic.c
Source file repositories/reference/linux-study-clean/arch/riscv/kvm/aia_imsic.c
File Facts
- System
- Linux kernel
- Corpus path
arch/riscv/kvm/aia_imsic.c- Extension
.c- Size
- 31974 bytes
- Lines
- 1176
- Domain
- Architecture Layer
- Bucket
- arch/riscv
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/atomic.hlinux/bitmap.hlinux/irqchip/riscv-imsic.hlinux/kvm_host.hlinux/math.hlinux/spinlock.hlinux/swab.hkvm/iodev.hasm/csr.hasm/kvm_mmu.h
Detected Declarations
struct imsic_mrif_eixstruct imsic_mrifstruct imsicstruct imsic_vsfile_read_datastruct imsic_vsfile_rw_datafunction imsic_eix_readfunction imsic_eix_swapfunction imsic_eix_writefunction imsic_eix_setfunction imsic_mrif_atomic_orfunction imsic_mrif_atomic_rmwfunction imsic_mrif_isel_checkfunction imsic_mrif_rmwfunction imsic_vsfile_local_readfunction imsic_vsfile_readfunction imsic_vsfile_readfunction imsic_vsfile_local_rwfunction imsic_vsfile_rwfunction imsic_vsfile_local_clearfunction imsic_vsfile_local_updatefunction imsic_vsfile_cleanupfunction imsic_swfile_extirq_updatefunction imsic_swfile_readfunction imsic_swfile_updatefunction kvm_riscv_vcpu_aia_imsic_has_interruptfunction kvm_riscv_vcpu_aia_imsic_loadfunction kvm_riscv_vcpu_aia_imsic_releasefunction kvm_riscv_vcpu_aia_imsic_updatefunction kvm_riscv_vcpu_aia_imsic_rmwfunction kvm_riscv_aia_imsic_rw_attrfunction kvm_riscv_aia_imsic_has_attrfunction kvm_riscv_vcpu_aia_imsic_resetfunction kvm_riscv_vcpu_aia_imsic_injectfunction imsic_mmio_readfunction imsic_mmio_writefunction kvm_riscv_vcpu_aia_imsic_initfunction kvm_riscv_vcpu_aia_imsic_cleanup
Annotated Snippet
struct imsic_mrif_eix {
unsigned long eip[BITS_PER_TYPE(u64) / BITS_PER_LONG];
unsigned long eie[BITS_PER_TYPE(u64) / BITS_PER_LONG];
};
struct imsic_mrif {
struct imsic_mrif_eix eix[IMSIC_MAX_EIX];
unsigned long eithreshold;
unsigned long eidelivery;
};
struct imsic {
struct kvm_io_device iodev;
u32 nr_msis;
u32 nr_eix;
u32 nr_hw_eix;
/*
* At any point in time, the register state is in
* one of the following places:
*
* 1) Hardware: IMSIC VS-file (vsfile_cpu >= 0)
* 2) Software: IMSIC SW-file (vsfile_cpu < 0)
*/
/* IMSIC VS-file */
rwlock_t vsfile_lock;
int vsfile_cpu;
int vsfile_hgei;
void __iomem *vsfile_va;
phys_addr_t vsfile_pa;
/* IMSIC SW-file */
struct imsic_mrif *swfile;
phys_addr_t swfile_pa;
raw_spinlock_t swfile_extirq_lock;
};
#define imsic_vs_csr_read(__c) \
({ \
unsigned long __r; \
csr_write(CSR_VSISELECT, __c); \
__r = csr_read(CSR_VSIREG); \
__r; \
})
#define imsic_read_switchcase(__ireg) \
case __ireg: \
return imsic_vs_csr_read(__ireg);
#define imsic_read_switchcase_2(__ireg) \
imsic_read_switchcase(__ireg + 0) \
imsic_read_switchcase(__ireg + 1)
#define imsic_read_switchcase_4(__ireg) \
imsic_read_switchcase_2(__ireg + 0) \
imsic_read_switchcase_2(__ireg + 2)
#define imsic_read_switchcase_8(__ireg) \
imsic_read_switchcase_4(__ireg + 0) \
imsic_read_switchcase_4(__ireg + 4)
#define imsic_read_switchcase_16(__ireg) \
imsic_read_switchcase_8(__ireg + 0) \
imsic_read_switchcase_8(__ireg + 8)
#define imsic_read_switchcase_32(__ireg) \
imsic_read_switchcase_16(__ireg + 0) \
imsic_read_switchcase_16(__ireg + 16)
#define imsic_read_switchcase_64(__ireg) \
imsic_read_switchcase_32(__ireg + 0) \
imsic_read_switchcase_32(__ireg + 32)
static unsigned long imsic_eix_read(int ireg)
{
switch (ireg) {
imsic_read_switchcase_64(IMSIC_EIP0)
imsic_read_switchcase_64(IMSIC_EIE0)
}
return 0;
}
#define imsic_vs_csr_swap(__c, __v) \
({ \
unsigned long __r; \
csr_write(CSR_VSISELECT, __c); \
__r = csr_swap(CSR_VSIREG, __v); \
__r; \
})
#define imsic_swap_switchcase(__ireg, __v) \
case __ireg: \
return imsic_vs_csr_swap(__ireg, __v);
Annotation
- Immediate include surface: `linux/atomic.h`, `linux/bitmap.h`, `linux/irqchip/riscv-imsic.h`, `linux/kvm_host.h`, `linux/math.h`, `linux/spinlock.h`, `linux/swab.h`, `kvm/iodev.h`.
- Detected declarations: `struct imsic_mrif_eix`, `struct imsic_mrif`, `struct imsic`, `struct imsic_vsfile_read_data`, `struct imsic_vsfile_rw_data`, `function imsic_eix_read`, `function imsic_eix_swap`, `function imsic_eix_write`, `function imsic_eix_set`, `function imsic_mrif_atomic_or`.
- Atlas domain: Architecture Layer / arch/riscv.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.