arch/riscv/include/asm/kvm_gstage.h
Source file repositories/reference/linux-study-clean/arch/riscv/include/asm/kvm_gstage.h
File Facts
- System
- Linux kernel
- Corpus path
arch/riscv/include/asm/kvm_gstage.h- Extension
.h- Size
- 3004 bytes
- Lines
- 114
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kvm_types.h
Detected Declarations
struct kvm_gstagestruct kvm_gstage_mappingenum kvm_riscv_gstage_opfunction kvm_riscv_gstage_gpa_bitsfunction kvm_riscv_gstage_gpa_sizefunction kvm_riscv_gstage_modefunction kvm_riscv_gstage_init
Annotated Snippet
struct kvm_gstage {
struct kvm *kvm;
unsigned long flags;
#define KVM_GSTAGE_FLAGS_LOCAL BIT(0)
unsigned long vmid;
pgd_t *pgd;
unsigned long pgd_levels;
};
struct kvm_gstage_mapping {
gpa_t addr;
pte_t pte;
u32 level;
};
#ifdef CONFIG_64BIT
#define kvm_riscv_gstage_index_bits 9
#else
#define kvm_riscv_gstage_index_bits 10
#endif
extern unsigned long kvm_riscv_gstage_max_pgd_levels;
#define kvm_riscv_gstage_pgd_xbits 2
#define kvm_riscv_gstage_pgd_size (1UL << (HGATP_PAGE_SHIFT + kvm_riscv_gstage_pgd_xbits))
static inline unsigned long kvm_riscv_gstage_gpa_bits(unsigned long pgd_levels)
{
return (HGATP_PAGE_SHIFT +
pgd_levels * kvm_riscv_gstage_index_bits +
kvm_riscv_gstage_pgd_xbits);
}
static inline gpa_t kvm_riscv_gstage_gpa_size(unsigned long pgd_levels)
{
return BIT_ULL(kvm_riscv_gstage_gpa_bits(pgd_levels));
}
bool kvm_riscv_gstage_get_leaf(struct kvm_gstage *gstage, gpa_t addr,
pte_t **ptepp, u32 *ptep_level);
int kvm_riscv_gstage_set_pte(struct kvm_gstage *gstage,
struct kvm_mmu_memory_cache *pcache,
const struct kvm_gstage_mapping *map);
bool kvm_riscv_gstage_try_update_pte(struct kvm_gstage *gstage, u32 level,
gpa_t addr, pte_t *ptep,
pte_t old_pte, pte_t new_pte);
int kvm_riscv_gstage_map_page(struct kvm_gstage *gstage,
struct kvm_mmu_memory_cache *pcache,
gpa_t gpa, phys_addr_t hpa, unsigned long page_size,
bool page_rdonly, bool page_exec,
struct kvm_gstage_mapping *out_map);
int kvm_riscv_gstage_split_huge(struct kvm_gstage *gstage,
struct kvm_mmu_memory_cache *pcache,
gpa_t addr, u32 target_level, bool flush);
enum kvm_riscv_gstage_op {
GSTAGE_OP_NOP = 0, /* Nothing */
GSTAGE_OP_CLEAR, /* Clear/Unmap */
GSTAGE_OP_WP, /* Write-protect */
};
bool kvm_riscv_gstage_op_pte(struct kvm_gstage *gstage, gpa_t addr,
pte_t *ptep, u32 ptep_level, enum kvm_riscv_gstage_op op);
bool kvm_riscv_gstage_unmap_range(struct kvm_gstage *gstage,
gpa_t start, gpa_t size, bool may_block);
bool kvm_riscv_gstage_wp_range(struct kvm_gstage *gstage, gpa_t start, gpa_t end);
void kvm_riscv_gstage_mode_detect(void);
static inline unsigned long kvm_riscv_gstage_mode(unsigned long pgd_levels)
{
switch (pgd_levels) {
case 2:
return HGATP_MODE_SV32X4;
case 3:
return HGATP_MODE_SV39X4;
case 4:
return HGATP_MODE_SV48X4;
case 5:
return HGATP_MODE_SV57X4;
default:
WARN_ON_ONCE(1);
return HGATP_MODE_OFF;
}
Annotation
- Immediate include surface: `linux/kvm_types.h`.
- Detected declarations: `struct kvm_gstage`, `struct kvm_gstage_mapping`, `enum kvm_riscv_gstage_op`, `function kvm_riscv_gstage_gpa_bits`, `function kvm_riscv_gstage_gpa_size`, `function kvm_riscv_gstage_mode`, `function kvm_riscv_gstage_init`.
- Atlas domain: Architecture Layer / arch/riscv.
- Implementation status: source implementation candidate.
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.