arch/arm64/kvm/ptdump.c

Source file repositories/reference/linux-study-clean/arch/arm64/kvm/ptdump.c

File Facts

System
Linux kernel
Corpus path
arch/arm64/kvm/ptdump.c
Extension
.c
Size
7470 bytes
Lines
309
Domain
Architecture Layer
Bucket
arch/arm64
Inferred role
Architecture Layer: operation-table or driver-model contract
Status
pattern 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

static const struct file_operations kvm_ptdump_guest_fops = {
	.open		= kvm_ptdump_guest_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= kvm_ptdump_guest_close,
};

static int kvm_pgtable_range_show(struct seq_file *m, void *unused)
{
	struct kvm_pgtable *pgtable = m->private;

	seq_printf(m, "%2u\n", pgtable->ia_bits);
	return 0;
}

static int kvm_pgtable_levels_show(struct seq_file *m, void *unused)
{
	struct kvm_pgtable *pgtable = m->private;

	seq_printf(m, "%1d\n", KVM_PGTABLE_MAX_LEVELS - pgtable->start_level);
	return 0;
}

static int kvm_pgtable_debugfs_open(struct inode *m, struct file *file,
				    int (*show)(struct seq_file *, void *))
{
	struct kvm_s2_mmu *mmu = m->i_private;
	struct kvm *kvm = kvm_s2_mmu_to_kvm(mmu);
	struct kvm_pgtable *pgtable;
	int ret;

	if (!kvm_get_kvm_safe(kvm))
		return -ENOENT;

	pgtable = mmu->pgt;

	ret = single_open(file, show, pgtable);
	if (ret < 0)
		kvm_put_kvm(kvm);
	return ret;
}

static int kvm_pgtable_range_open(struct inode *m, struct file *file)
{
	return kvm_pgtable_debugfs_open(m, file, kvm_pgtable_range_show);
}

static int kvm_pgtable_levels_open(struct inode *m, struct file *file)
{
	return kvm_pgtable_debugfs_open(m, file, kvm_pgtable_levels_show);
}

static int kvm_pgtable_debugfs_close(struct inode *m, struct file *file)
{
	struct kvm *kvm = kvm_s2_mmu_to_kvm(m->i_private);

	kvm_put_kvm(kvm);
	return single_release(m, file);
}

static const struct file_operations kvm_pgtable_range_fops = {
	.open		= kvm_pgtable_range_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= kvm_pgtable_debugfs_close,
};

static const struct file_operations kvm_pgtable_levels_fops = {
	.open		= kvm_pgtable_levels_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= kvm_pgtable_debugfs_close,
};

void kvm_nested_s2_ptdump_create_debugfs(struct kvm_s2_mmu *mmu)
{
	struct dentry *dent;
	char file_name[S2FNAMESZ];

	snprintf(file_name, sizeof(file_name), "0x%016llx-0x%016llx-s2-%sabled",
		 mmu->tlb_vttbr,
		 mmu->tlb_vtcr,
		 mmu->nested_stage2_enabled ? "en" : "dis");

	dent = debugfs_create_file(file_name, 0400,
				   mmu->arch->debugfs_nv_dentry, mmu,
				   &kvm_ptdump_guest_fops);

	mmu->shadow_pt_debugfs_dentry = dent;
}

Annotation

Implementation Notes