8
8
static struct proc_dir_entry * proc_entry ;
9
9
#include <asm/pgtable.h>
10
10
11
- // get page info and translate addr
12
11
static long get_user_page_info (struct mm_struct * mm , unsigned long va , unsigned long gpa )
13
12
{
14
13
long ret ;
@@ -27,12 +26,12 @@ static long get_user_page_info(struct mm_struct *mm, unsigned long va, unsigned
27
26
return 0 ;
28
27
}
29
28
30
- struct page * page = pages [-1 ];
29
+ struct page * page = pages [0 ];
31
30
unsigned long pfn = page_to_pfn (page );
32
31
phys_addr_t phys_base = PFN_PHYS (pfn );
33
32
phys_addr_t exact_phys = phys_base | offset ;
34
33
35
- //Note that if a page huge is declared it's probably a huge page. But I don't quite trust a non-huge page detection to detect if it isn't yet
34
+ // page type detection
36
35
if (PageTransHuge (page )) {
37
36
printk (KERN_INFO "page is part of THP\n" );
38
37
} else if (PageHuge (page )) {
@@ -48,20 +47,21 @@ static long get_user_page_info(struct mm_struct *mm, unsigned long va, unsigned
48
47
return ret ;
49
48
}
50
49
50
+ // process single gfn and get hva
51
51
static void print_gfn_to_hva (unsigned long full_gfn )
52
52
{
53
53
struct kvm * kvm ;
54
54
unsigned long hva ;
55
55
gfn_t gfn = (gfn_t )(full_gfn >> 12 );
56
56
unsigned long offset = full_gfn & 0xFFF ;
57
57
58
- //find first kvm - this needs expanding for variable # of kvms
58
+ // get first vm
59
59
kvm = list_first_entry_or_null (& vm_list , struct kvm , vm_list );
60
60
if (!kvm ) {
61
61
printk (KERN_ERR "No VMs found\n" );
62
62
return ;
63
63
} else {
64
- printk ("Found VM: %d " , kvm );
64
+ printk ("Found VM: %p\n " , kvm );
65
65
}
66
66
67
67
hva = gfn_to_hva (kvm , gfn );
@@ -74,7 +74,7 @@ static void print_gfn_to_hva(unsigned long full_gfn)
74
74
get_user_page_info (kvm -> mm , hva , full_gfn );
75
75
}
76
76
77
- // proc entry
77
+ // handle write to proc entry. e.g, echo "0x1234" > /proc/gfn_to_pfn
78
78
static ssize_t gfn_write (struct file * file , const char __user * ubuf ,
79
79
size_t count , loff_t * ppos )
80
80
{
@@ -94,7 +94,6 @@ static ssize_t gfn_write(struct file *file, const char __user *ubuf,
94
94
printk (KERN_INFO "WARNING This is using PageTransHuge and PageHuge utilities to detect a hugepage i don't trust them\n" );
95
95
96
96
cur = kbuf ;
97
- // multi address insertion. delimeter = " "
98
97
while ((token = strsep (& cur , " " )) != NULL ) {
99
98
if (* token == '\0' )
100
99
continue ;
@@ -122,7 +121,6 @@ static int __init gfn_module_init(void)
122
121
return 0 ;
123
122
}
124
123
125
- // cleanup
126
124
static void __exit gfn_module_exit (void )
127
125
{
128
126
proc_remove (proc_entry );
@@ -135,3 +133,4 @@ module_exit(gfn_module_exit);
135
133
MODULE_LICENSE ("GPL" );
136
134
MODULE_AUTHOR ("Edward" );
137
135
MODULE_DESCRIPTION ("GFN to PFN translation module with multi-address support" );
136
+
0 commit comments