arch/loongarch/include/asm/kvm_mmu.h

Source file repositories/reference/linux-study-clean/arch/loongarch/include/asm/kvm_mmu.h

File Facts

System
Linux kernel
Corpus path
arch/loongarch/include/asm/kvm_mmu.h
Extension
.h
Size
3754 bytes
Lines
152
Domain
Architecture Layer
Bucket
arch/loongarch
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct kvm_ptw_ctx {
	kvm_pte_ops     ops;
	unsigned long   flag;

	/* for kvm_arch_mmu_enable_log_dirty_pt_masked use */
	unsigned long   mask;
	unsigned long   gfn;

	/* page walk mmu info */
	unsigned int    level;
	unsigned long   pgtable_shift;
	unsigned long   invalid_entry;
	unsigned long   *invalid_ptes;
	unsigned int    *pte_shifts;
	void		*opaque;

	/* free pte table page list */
	struct list_head list;
};

kvm_pte_t *kvm_pgd_alloc(void);

static inline void kvm_set_pte(kvm_pte_t *ptep, kvm_pte_t val)
{
	WRITE_ONCE(*ptep, val);
}

static inline int kvm_pte_young(kvm_pte_t pte) { return pte & _PAGE_ACCESSED; }
static inline int kvm_pte_huge(kvm_pte_t pte) { return pte & _PAGE_HUGE; }
static inline int kvm_pte_dirty(kvm_pte_t pte) { return pte & __WRITEABLE; }
static inline int kvm_pte_writeable(kvm_pte_t pte) { return pte & KVM_PAGE_WRITEABLE; }

static inline kvm_pte_t kvm_pte_mkyoung(kvm_pte_t pte)
{
	return pte | _PAGE_ACCESSED;
}

static inline kvm_pte_t kvm_pte_mkold(kvm_pte_t pte)
{
	return pte & ~_PAGE_ACCESSED;
}

static inline kvm_pte_t kvm_pte_mkdirty(kvm_pte_t pte)
{
	return pte | __WRITEABLE;
}

static inline kvm_pte_t kvm_pte_mkclean(kvm_pte_t pte)
{
	return pte & ~__WRITEABLE;
}

static inline kvm_pte_t kvm_pte_mkhuge(kvm_pte_t pte)
{
	return pte | _PAGE_HUGE;
}

static inline kvm_pte_t kvm_pte_mksmall(kvm_pte_t pte)
{
	return pte & ~_PAGE_HUGE;
}

static inline kvm_pte_t kvm_pte_mkwriteable(kvm_pte_t pte)
{
	return pte | KVM_PAGE_WRITEABLE;
}

static inline int kvm_need_flush(kvm_ptw_ctx *ctx)
{
	return ctx->flag & _KVM_FLUSH_PGTABLE;
}

static inline kvm_pte_t *kvm_pgtable_offset(kvm_ptw_ctx *ctx, kvm_pte_t *table,
					phys_addr_t addr)
{

	return table + ((addr >> ctx->pgtable_shift) & (PTRS_PER_PTE - 1));
}

static inline phys_addr_t kvm_pgtable_addr_end(kvm_ptw_ctx *ctx,
				phys_addr_t addr, phys_addr_t end)
{
	phys_addr_t boundary, size;

	size = 0x1UL << ctx->pgtable_shift;
	boundary = (addr + size) & ~(size - 1);
	return (boundary - 1 < end - 1) ? boundary : end;
}

static inline int kvm_pte_present(kvm_ptw_ctx *ctx, kvm_pte_t *entry)

Annotation

Implementation Notes