arch/riscv/kvm/gstage.c
Source file repositories/reference/linux-study-clean/arch/riscv/kvm/gstage.c
File Facts
- System
- Linux kernel
- Corpus path
arch/riscv/kvm/gstage.c- Extension
.c- Size
- 13781 bytes
- Lines
- 514
- 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/bitops.hlinux/errno.hlinux/kvm_host.hlinux/module.hlinux/pgtable.hasm/kvm_gstage.h
Detected Declarations
function gstage_pte_indexfunction gstage_pte_page_vaddrfunction gstage_page_size_to_levelfunction gstage_level_to_page_orderfunction gstage_level_to_page_sizefunction kvm_riscv_gstage_get_leaffunction gstage_tlb_flushfunction kvm_riscv_gstage_try_update_ptefunction kvm_riscv_gstage_set_ptefunction kvm_riscv_gstage_update_pte_protfunction kvm_riscv_gstage_map_pagefunction tablesfunction make_child_ptefunction kvm_riscv_gstage_split_hugefunction kvm_riscv_gstage_op_ptefunction kvm_riscv_gstage_unmap_rangefunction kvm_riscv_gstage_wp_rangefunction kvm_riscv_gstage_mode_detect
Annotated Snippet
if (page_size == (psz << (i * kvm_riscv_gstage_index_bits))) {
*out_level = i;
return 0;
}
}
return -EINVAL;
}
static int gstage_level_to_page_order(struct kvm_gstage *gstage, u32 level,
unsigned long *out_pgorder)
{
if (gstage->pgd_levels < level)
return -EINVAL;
*out_pgorder = 12 + (level * kvm_riscv_gstage_index_bits);
return 0;
}
static int gstage_level_to_page_size(struct kvm_gstage *gstage, u32 level,
unsigned long *out_pgsize)
{
int rc;
unsigned long page_order = PAGE_SHIFT;
rc = gstage_level_to_page_order(gstage, level, &page_order);
if (rc)
return rc;
*out_pgsize = BIT(page_order);
return 0;
}
bool kvm_riscv_gstage_get_leaf(struct kvm_gstage *gstage, gpa_t addr,
pte_t **ptepp, u32 *ptep_level)
{
pte_t *ptep;
u32 current_level = gstage->pgd_levels - 1;
*ptep_level = current_level;
ptep = (pte_t *)gstage->pgd;
ptep = &ptep[gstage_pte_index(gstage, addr, current_level)];
while (ptep && pte_val(ptep_get(ptep))) {
if (gstage_pte_leaf(ptep)) {
*ptep_level = current_level;
*ptepp = ptep;
return true;
}
if (current_level) {
current_level--;
*ptep_level = current_level;
ptep = (pte_t *)gstage_pte_page_vaddr(ptep_get(ptep));
ptep = &ptep[gstage_pte_index(gstage, addr, current_level)];
} else {
ptep = NULL;
}
}
return false;
}
static void gstage_tlb_flush(struct kvm_gstage *gstage, u32 level, gpa_t addr)
{
unsigned long order = PAGE_SHIFT;
if (gstage_level_to_page_order(gstage, level, &order))
return;
addr &= ~(BIT(order) - 1);
if (gstage->flags & KVM_GSTAGE_FLAGS_LOCAL)
kvm_riscv_local_hfence_gvma_vmid_gpa(gstage->vmid, addr, BIT(order), order);
else
kvm_riscv_hfence_gvma_vmid_gpa(gstage->kvm, -1UL, 0, addr, BIT(order), order,
gstage->vmid);
}
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)
{
if (cmpxchg(&ptep->pte, pte_val(old_pte), pte_val(new_pte)) !=
pte_val(old_pte))
return false;
if (pte_val(old_pte) != pte_val(new_pte))
gstage_tlb_flush(gstage, level, addr);
return true;
}
Annotation
- Immediate include surface: `linux/bitops.h`, `linux/errno.h`, `linux/kvm_host.h`, `linux/module.h`, `linux/pgtable.h`, `asm/kvm_gstage.h`.
- Detected declarations: `function gstage_pte_index`, `function gstage_pte_page_vaddr`, `function gstage_page_size_to_level`, `function gstage_level_to_page_order`, `function gstage_level_to_page_size`, `function kvm_riscv_gstage_get_leaf`, `function gstage_tlb_flush`, `function kvm_riscv_gstage_try_update_pte`, `function kvm_riscv_gstage_set_pte`, `function kvm_riscv_gstage_update_pte_prot`.
- 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.