diff options
Diffstat (limited to 'drivers/lguest/lg.h')
-rw-r--r-- | drivers/lguest/lg.h | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/lguest/lg.h b/drivers/lguest/lg.h index 3b9dc123a7d..269116eee85 100644 --- a/drivers/lguest/lg.h +++ b/drivers/lguest/lg.h | |||
@@ -58,9 +58,18 @@ struct lguest_dma_info | |||
58 | u8 interrupt; /* 0 when not registered */ | 58 | u8 interrupt; /* 0 when not registered */ |
59 | }; | 59 | }; |
60 | 60 | ||
61 | /* We have separate types for the guest's ptes & pgds and the shadow ptes & | 61 | /*H:310 The page-table code owes a great debt of gratitude to Andi Kleen. He |
62 | * pgds. Since this host might use three-level pagetables and the guest and | 62 | * reviewed the original code which used "u32" for all page table entries, and |
63 | * shadow pagetables don't, we can't use the normal pte_t/pgd_t. */ | 63 | * insisted that it would be far clearer with explicit typing. I thought it |
64 | * was overkill, but he was right: it is much clearer than it was before. | ||
65 | * | ||
66 | * We have separate types for the Guest's ptes & pgds and the shadow ptes & | ||
67 | * pgds. There's already a Linux type for these (pte_t and pgd_t) but they | ||
68 | * change depending on kernel config options (PAE). */ | ||
69 | |||
70 | /* Each entry is identical: lower 12 bits of flags and upper 20 bits for the | ||
71 | * "page frame number" (0 == first physical page, etc). They are different | ||
72 | * types so the compiler will warn us if we mix them improperly. */ | ||
64 | typedef union { | 73 | typedef union { |
65 | struct { unsigned flags:12, pfn:20; }; | 74 | struct { unsigned flags:12, pfn:20; }; |
66 | struct { unsigned long val; } raw; | 75 | struct { unsigned long val; } raw; |
@@ -77,8 +86,12 @@ typedef union { | |||
77 | struct { unsigned flags:12, pfn:20; }; | 86 | struct { unsigned flags:12, pfn:20; }; |
78 | struct { unsigned long val; } raw; | 87 | struct { unsigned long val; } raw; |
79 | } gpte_t; | 88 | } gpte_t; |
89 | |||
90 | /* We have two convenient macros to convert a "raw" value as handed to us by | ||
91 | * the Guest into the correct Guest PGD or PTE type. */ | ||
80 | #define mkgpte(_val) ((gpte_t){.raw.val = _val}) | 92 | #define mkgpte(_val) ((gpte_t){.raw.val = _val}) |
81 | #define mkgpgd(_val) ((gpgd_t){.raw.val = _val}) | 93 | #define mkgpgd(_val) ((gpgd_t){.raw.val = _val}) |
94 | /*:*/ | ||
82 | 95 | ||
83 | struct pgdir | 96 | struct pgdir |
84 | { | 97 | { |