Contents of /trunk/nvidia/1.0.6629/NVIDIA_kernel-1.0-6629-1162524.patch
Parent Directory | Revision Log
Revision 153 -
(show 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 | 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 | * |