Annotation of /trunk/nvidia/1.0.6629/NVIDIA_kernel-1.0-6629-1162524.patch
Parent Directory | Revision Log
Revision 153 -
(hide annotations)
(download)
Tue May 8 20:52:56 2007 UTC (17 years ago) by niro
File size: 9417 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years ago) by niro
File size: 9417 byte(s)
-import
1 | niro | 153 | diff -ru usr/src/nv/nv-linux.h usr/src/nv.1162524/nv-linux.h |
2 | --- usr/src/nv/nv-linux.h 2004-11-03 22:53:00.000000000 +0100 | ||
3 | +++ usr/src/nv.1162524/nv-linux.h 2004-12-03 13:04:29.000000000 +0100 | ||
4 | @@ -627,75 +627,136 @@ | ||
5 | #define NV_REMAP_PAGE_RANGE(x...) remap_page_range(x) | ||
6 | #endif | ||
7 | |||
8 | + | ||
9 | +#if defined(pml4_offset) | ||
10 | +#define NV_PML4_PGD_OFFSET(address, pml4, kernel) \ | ||
11 | + ({ \ | ||
12 | + pgd_t *__pgd; \ | ||
13 | + if (!kernel) \ | ||
14 | + __pgd = pml4_pgd_offset(pml4, address); \ | ||
15 | + else \ | ||
16 | + __pgd = pml4_pgd_offset_k(pml4, address); \ | ||
17 | + __pgd; \ | ||
18 | + }) | ||
19 | + | ||
20 | +#define NV_PML4_PRESENT(pml4) \ | ||
21 | + ({ \ | ||
22 | + if (pml4 != NULL) \ | ||
23 | + { \ | ||
24 | + if (pml4_bad(*pml4)) \ | ||
25 | + { \ | ||
26 | + pml4_clear(pml4); \ | ||
27 | + pml4 = NULL; /* mark invalid */ \ | ||
28 | + } \ | ||
29 | + else if (pml4_none(*pml4)) \ | ||
30 | + pml4 = NULL; \ | ||
31 | + } pml4 != NULL; \ | ||
32 | + }) | ||
33 | + | ||
34 | +#define NV_PGD_OFFSET(address, kernel, mm) \ | ||
35 | + ({ \ | ||
36 | + pml4_t *__pml4; \ | ||
37 | + pgd_t *__pgd = NULL; \ | ||
38 | + if (!kernel) \ | ||
39 | + __pml4 = pml4_offset(mm, address); \ | ||
40 | + else \ | ||
41 | + __pml4 = pml4_offset_k(address); \ | ||
42 | + if (NV_PML4_PRESENT(__pml4)) \ | ||
43 | + __pgd = NV_PML4_PGD_OFFSET(address, \ | ||
44 | + __pml4, kernel); \ | ||
45 | + __pgd; \ | ||
46 | + }) | ||
47 | +#else | ||
48 | +#define NV_PGD_OFFSET(address, kernel, mm) \ | ||
49 | + ({ \ | ||
50 | + pgd_t *__pgd; \ | ||
51 | + if (!kernel) \ | ||
52 | + __pgd = pgd_offset(mm, address); \ | ||
53 | + else \ | ||
54 | + __pgd = pgd_offset_k(address); \ | ||
55 | + __pgd; \ | ||
56 | + }) | ||
57 | +#endif | ||
58 | + | ||
59 | +#define NV_PGD_PRESENT(pgd) \ | ||
60 | + ({ \ | ||
61 | + if ((pgd != NULL) && \ | ||
62 | + (pgd_bad(*pgd) || pgd_none(*pgd))) \ | ||
63 | + /* static */ pgd = NULL; \ | ||
64 | + pgd != NULL; \ | ||
65 | + }) | ||
66 | + | ||
67 | #if defined(pmd_offset_map) | ||
68 | -#define NV_PMD_OFFSET(addres, pg_dir, pg_mid_dir) \ | ||
69 | - { \ | ||
70 | - pg_mid_dir = pmd_offset_map(pg_dir, address); \ | ||
71 | - } | ||
72 | -#define NV_PMD_UNMAP(pg_mid_dir) \ | ||
73 | - { \ | ||
74 | - pmd_unmap(pg_mid_dir); \ | ||
75 | - } | ||
76 | +#define NV_PMD_OFFSET(address, pgd) \ | ||
77 | + ({ \ | ||
78 | + pmd_t *__pmd; \ | ||
79 | + __pmd = pmd_offset_map(pgd, address); \ | ||
80 | + }) | ||
81 | +#define NV_PMD_UNMAP(pmd) pmd_unmap(pmd); | ||
82 | #else | ||
83 | -#define NV_PMD_OFFSET(addres, pg_dir, pg_mid_dir) \ | ||
84 | - { \ | ||
85 | - pg_mid_dir = pmd_offset(pg_dir, address); \ | ||
86 | - } | ||
87 | -#define NV_PMD_UNMAP(pg_mid_dir) | ||
88 | +#define NV_PMD_OFFSET(address, pgd) \ | ||
89 | + ({ \ | ||
90 | + pmd_t *__pmd; \ | ||
91 | + __pmd = pmd_offset(pgd, address); \ | ||
92 | + }) | ||
93 | +#define NV_PMD_UNMAP(pmd) | ||
94 | #endif | ||
95 | |||
96 | -#define NV_PMD_PRESENT(pg_mid_dir) \ | ||
97 | - ({ \ | ||
98 | - if ( (pg_mid_dir) && (pmd_none(*pg_mid_dir))) { \ | ||
99 | - NV_PMD_UNMAP(pg_mid_dir); pg_mid_dir = NULL; \ | ||
100 | - } pg_mid_dir != NULL; \ | ||
101 | +#define NV_PMD_PRESENT(pmd) \ | ||
102 | + ({ \ | ||
103 | + if ((pmd != NULL) && \ | ||
104 | + (pmd_bad(*pmd) || pmd_none(*pmd))) \ | ||
105 | + { \ | ||
106 | + NV_PMD_UNMAP(pmd); \ | ||
107 | + pmd = NULL; /* mark invalid */ \ | ||
108 | + } \ | ||
109 | + pmd != NULL; \ | ||
110 | }) | ||
111 | |||
112 | #if defined(pte_offset_atomic) | ||
113 | -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \ | ||
114 | - { \ | ||
115 | - pte = pte_offset_atomic(pg_mid_dir, address); \ | ||
116 | - NV_PMD_UNMAP(pg_mid_dir); \ | ||
117 | - } | ||
118 | -#define NV_PTE_UNMAP(pte) \ | ||
119 | - { \ | ||
120 | - pte_kunmap(pte); \ | ||
121 | - } | ||
122 | +#define NV_PTE_OFFSET(address, pmd) \ | ||
123 | + ({ \ | ||
124 | + pte_t *__pte; \ | ||
125 | + __pte = pte_offset_atomic(pmd, address); \ | ||
126 | + NV_PMD_UNMAP(pmd); __pte; \ | ||
127 | + }) | ||
128 | +#define NV_PTE_UNMAP(pte) pte_kunmap(pte); | ||
129 | #elif defined(pte_offset) | ||
130 | -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \ | ||
131 | - { \ | ||
132 | - pte = pte_offset(pg_mid_dir, address); \ | ||
133 | - NV_PMD_UNMAP(pg_mid_dir); \ | ||
134 | - } | ||
135 | +#define NV_PTE_OFFSET(address, pmd) \ | ||
136 | + ({ \ | ||
137 | + pte_t *__pte; \ | ||
138 | + __pte = pte_offset(pmd, address); \ | ||
139 | + NV_PMD_UNMAP(pmd); __pte; \ | ||
140 | + }) | ||
141 | #define NV_PTE_UNMAP(pte) | ||
142 | #else | ||
143 | -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \ | ||
144 | - { \ | ||
145 | - pte = pte_offset_map(pg_mid_dir, address); \ | ||
146 | - NV_PMD_UNMAP(pg_mid_dir); \ | ||
147 | - } | ||
148 | -#define NV_PTE_UNMAP(pte) \ | ||
149 | - { \ | ||
150 | - pte_unmap(pte); \ | ||
151 | - } | ||
152 | +#define NV_PTE_OFFSET(address, pmd) \ | ||
153 | + ({ \ | ||
154 | + pte_t *__pte; \ | ||
155 | + __pte = pte_offset_map(pmd, address); \ | ||
156 | + NV_PMD_UNMAP(pmd); __pte; \ | ||
157 | + }) | ||
158 | +#define NV_PTE_UNMAP(pte) pte_unmap(pte); | ||
159 | #endif | ||
160 | |||
161 | -#define NV_PTE_PRESENT(pte) \ | ||
162 | - ({ \ | ||
163 | - if (pte) { \ | ||
164 | - if (!pte_present(*pte)) { \ | ||
165 | - NV_PTE_UNMAP(pte); pte = NULL; \ | ||
166 | - } \ | ||
167 | - } pte != NULL; \ | ||
168 | - }) | ||
169 | - | ||
170 | -#define NV_PTE_VALUE(pte) \ | ||
171 | - ({ \ | ||
172 | - unsigned long __pte_value = pte_val(*pte); \ | ||
173 | - NV_PTE_UNMAP(pte); \ | ||
174 | - __pte_value; \ | ||
175 | +#define NV_PTE_PRESENT(pte) \ | ||
176 | + ({ \ | ||
177 | + if ((pte != NULL) && !pte_present(*pte)) \ | ||
178 | + { \ | ||
179 | + NV_PTE_UNMAP(pte); \ | ||
180 | + pte = NULL; /* mark invalid */ \ | ||
181 | + } \ | ||
182 | + pte != NULL; \ | ||
183 | }) | ||
184 | |||
185 | +#define NV_PTE_VALUE(pte) \ | ||
186 | + ({ \ | ||
187 | + unsigned long __pte_value = pte_val(*pte); \ | ||
188 | + NV_PTE_UNMAP(pte); \ | ||
189 | + __pte_value; \ | ||
190 | + }) | ||
191 | + | ||
192 | + | ||
193 | #define NV_PAGE_ALIGN(addr) ( ((addr) + PAGE_SIZE - 1) / PAGE_SIZE) | ||
194 | #define NV_MASK_OFFSET(addr) ( (addr) & (PAGE_SIZE - 1) ) | ||
195 | |||
196 | diff -ru usr/src/nv/nv-vm.c usr/src/nv.1162524/nv-vm.c | ||
197 | --- usr/src/nv/nv-vm.c 2004-11-03 22:53:00.000000000 +0100 | ||
198 | +++ usr/src/nv.1162524/nv-vm.c 2004-12-03 13:04:34.000000000 +0100 | ||
199 | @@ -53,12 +53,13 @@ | ||
200 | * conflicts. we try to rely on the kernel's provided interfaces when possible, | ||
201 | * but need additional flushing on earlier kernels. | ||
202 | */ | ||
203 | - | ||
204 | +#if defined(KERNEL_2_4) | ||
205 | /* wrap CACHE_FLUSH so we can pass it to smp_call_function */ | ||
206 | static void cache_flush(void *p) | ||
207 | { | ||
208 | CACHE_FLUSH(); | ||
209 | } | ||
210 | +#endif | ||
211 | |||
212 | /* | ||
213 | * 2.4 kernels handle flushing in the change_page_attr() call, but kernels | ||
214 | diff -ru usr/src/nv/nv.c usr/src/nv.1162524/nv.c | ||
215 | --- usr/src/nv/nv.c 2004-11-03 22:53:00.000000000 +0100 | ||
216 | +++ usr/src/nv.1162524/nv.c 2004-12-03 13:04:37.000000000 +0100 | ||
217 | @@ -2492,26 +2492,23 @@ | ||
218 | ) | ||
219 | { | ||
220 | struct mm_struct *mm; | ||
221 | - pgd_t *pg_dir; | ||
222 | - pmd_t *pg_mid_dir; | ||
223 | - pte_t *pte; | ||
224 | + pgd_t *pgd = NULL; | ||
225 | + pmd_t *pmd = NULL; | ||
226 | + pte_t *pte = NULL; | ||
227 | unsigned long retval; | ||
228 | |||
229 | mm = (kern) ? &init_mm : current->mm; | ||
230 | spin_lock(&mm->page_table_lock); | ||
231 | |||
232 | - if (kern) pg_dir = pgd_offset_k(address); | ||
233 | - else pg_dir = pgd_offset(mm, address); | ||
234 | - | ||
235 | - if (!pg_dir || pgd_none(*pg_dir)) | ||
236 | + pgd = NV_PGD_OFFSET(address, kern, mm); | ||
237 | + if (!NV_PGD_PRESENT(pgd)) | ||
238 | goto failed; | ||
239 | |||
240 | - NV_PMD_OFFSET(address, pg_dir, pg_mid_dir); | ||
241 | - if (!NV_PMD_PRESENT(pg_mid_dir)) | ||
242 | + pmd = NV_PMD_OFFSET(address, pgd); | ||
243 | + if (!NV_PMD_PRESENT(pmd)) | ||
244 | goto failed; | ||
245 | |||
246 | - NV_PTE_OFFSET(address, pg_mid_dir, pte); | ||
247 | - | ||
248 | + pte = NV_PTE_OFFSET(address, pmd); | ||
249 | if (!NV_PTE_PRESENT(pte)) | ||
250 | goto failed; | ||
251 |
Properties
Name | Value |
---|---|
svn:executable | * |