1 diff -ru usr/src/nv/nv-linux.h usr/src/nv.1189413/nv-linux.h
2 --- usr/src/nv/nv-linux.h 2004-11-03 22:53:00.000000000 +0100
3 +++ usr/src/nv.1189413/nv-linux.h 2005-01-07 15:44:01.000000000 +0100
5 #define NV_REMAP_PAGE_RANGE(x...) remap_page_range(x)
9 +#define NV_PGD_OFFSET(address, kernel, mm) \
13 + __pgd = pgd_offset(mm, address); \
15 + __pgd = pgd_offset_k(address); \
19 +#define NV_PGD_PRESENT(pgd) \
21 + if ((pgd != NULL) && \
22 + (pgd_bad(*pgd) || pgd_none(*pgd))) \
23 + /* static */ pgd = NULL; \
27 #if defined(pmd_offset_map)
28 -#define NV_PMD_OFFSET(addres, pg_dir, pg_mid_dir) \
30 - pg_mid_dir = pmd_offset_map(pg_dir, address); \
32 -#define NV_PMD_UNMAP(pg_mid_dir) \
34 - pmd_unmap(pg_mid_dir); \
36 +#define NV_PMD_OFFSET(address, pgd) \
39 + __pmd = pmd_offset_map(pgd, address); \
41 +#define NV_PMD_UNMAP(pmd) pmd_unmap(pmd);
43 -#define NV_PMD_OFFSET(addres, pg_dir, pg_mid_dir) \
45 - pg_mid_dir = pmd_offset(pg_dir, address); \
47 -#define NV_PMD_UNMAP(pg_mid_dir)
48 +#if defined(PUD_SHIFT) /* 4-level pgtable */
49 +#define NV_PMD_OFFSET(address, pgd) \
51 + pmd_t *__pmd = NULL; \
53 + __pud = pud_offset(pgd, address); \
54 + if ((__pud != NULL) && \
55 + !(pud_bad(*__pud) || pud_none(*__pud))) \
56 + __pmd = pmd_offset(__pud, address); \
59 +#else /* 3-level pgtable */
60 +#define NV_PMD_OFFSET(address, pgd) \
63 + __pmd = pmd_offset(pgd, address); \
66 +#define NV_PMD_UNMAP(pmd)
69 -#define NV_PMD_PRESENT(pg_mid_dir) \
71 - if ( (pg_mid_dir) && (pmd_none(*pg_mid_dir))) { \
72 - NV_PMD_UNMAP(pg_mid_dir); pg_mid_dir = NULL; \
73 - } pg_mid_dir != NULL; \
74 +#define NV_PMD_PRESENT(pmd) \
76 + if ((pmd != NULL) && \
77 + (pmd_bad(*pmd) || pmd_none(*pmd))) \
79 + NV_PMD_UNMAP(pmd); \
80 + pmd = NULL; /* mark invalid */ \
85 #if defined(pte_offset_atomic)
86 -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \
88 - pte = pte_offset_atomic(pg_mid_dir, address); \
89 - NV_PMD_UNMAP(pg_mid_dir); \
91 -#define NV_PTE_UNMAP(pte) \
95 +#define NV_PTE_OFFSET(address, pmd) \
98 + __pte = pte_offset_atomic(pmd, address); \
99 + NV_PMD_UNMAP(pmd); __pte; \
101 +#define NV_PTE_UNMAP(pte) pte_kunmap(pte);
102 #elif defined(pte_offset)
103 -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \
105 - pte = pte_offset(pg_mid_dir, address); \
106 - NV_PMD_UNMAP(pg_mid_dir); \
108 +#define NV_PTE_OFFSET(address, pmd) \
111 + __pte = pte_offset(pmd, address); \
112 + NV_PMD_UNMAP(pmd); __pte; \
114 #define NV_PTE_UNMAP(pte)
116 -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \
118 - pte = pte_offset_map(pg_mid_dir, address); \
119 - NV_PMD_UNMAP(pg_mid_dir); \
121 -#define NV_PTE_UNMAP(pte) \
125 +#define NV_PTE_OFFSET(address, pmd) \
128 + __pte = pte_offset_map(pmd, address); \
129 + NV_PMD_UNMAP(pmd); __pte; \
131 +#define NV_PTE_UNMAP(pte) pte_unmap(pte);
134 -#define NV_PTE_PRESENT(pte) \
137 - if (!pte_present(*pte)) { \
138 - NV_PTE_UNMAP(pte); pte = NULL; \
141 +#define NV_PTE_PRESENT(pte) \
143 + if ((pte != NULL) && !pte_present(*pte)) \
145 + NV_PTE_UNMAP(pte); \
146 + pte = NULL; /* mark invalid */ \
151 -#define NV_PTE_VALUE(pte) \
153 - unsigned long __pte_value = pte_val(*pte); \
154 - NV_PTE_UNMAP(pte); \
156 +#define NV_PTE_VALUE(pte) \
158 + unsigned long __pte_value = pte_val(*pte); \
159 + NV_PTE_UNMAP(pte); \
164 #define NV_PAGE_ALIGN(addr) ( ((addr) + PAGE_SIZE - 1) / PAGE_SIZE)
165 #define NV_MASK_OFFSET(addr) ( (addr) & (PAGE_SIZE - 1) )
167 diff -ru usr/src/nv/nv-vm.c usr/src/nv.1189413/nv-vm.c
168 --- usr/src/nv/nv-vm.c 2004-11-03 22:53:00.000000000 +0100
169 +++ usr/src/nv.1189413/nv-vm.c 2005-01-07 15:43:22.000000000 +0100
171 * conflicts. we try to rely on the kernel's provided interfaces when possible,
172 * but need additional flushing on earlier kernels.
175 +#if defined(KERNEL_2_4)
176 /* wrap CACHE_FLUSH so we can pass it to smp_call_function */
177 static void cache_flush(void *p)
184 * 2.4 kernels handle flushing in the change_page_attr() call, but kernels
185 diff -ru usr/src/nv/nv.c usr/src/nv.1189413/nv.c
186 --- usr/src/nv/nv.c 2004-11-03 22:53:00.000000000 +0100
187 +++ usr/src/nv.1189413/nv.c 2005-01-07 15:43:22.000000000 +0100
188 @@ -2492,26 +2492,23 @@
191 struct mm_struct *mm;
198 unsigned long retval;
200 mm = (kern) ? &init_mm : current->mm;
201 spin_lock(&mm->page_table_lock);
203 - if (kern) pg_dir = pgd_offset_k(address);
204 - else pg_dir = pgd_offset(mm, address);
206 - if (!pg_dir || pgd_none(*pg_dir))
207 + pgd = NV_PGD_OFFSET(address, kern, mm);
208 + if (!NV_PGD_PRESENT(pgd))
211 - NV_PMD_OFFSET(address, pg_dir, pg_mid_dir);
212 - if (!NV_PMD_PRESENT(pg_mid_dir))
213 + pmd = NV_PMD_OFFSET(address, pgd);
214 + if (!NV_PMD_PRESENT(pmd))
217 - NV_PTE_OFFSET(address, pg_mid_dir, pte);
219 + pte = NV_PTE_OFFSET(address, pmd);
220 if (!NV_PTE_PRESENT(pte))