Annotation of /trunk/nvidia/1.0.6629/NVIDIA_kernel-1.0-6629-1189413.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: 8072 byte(s)
Tue May 8 20:52:56 2007 UTC (17 years ago) by niro
File size: 8072 byte(s)
-import
1 | niro | 153 | 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 | ||
4 | @@ -627,75 +627,109 @@ | ||
5 | #define NV_REMAP_PAGE_RANGE(x...) remap_page_range(x) | ||
6 | #endif | ||
7 | |||
8 | + | ||
9 | +#define NV_PGD_OFFSET(address, kernel, mm) \ | ||
10 | + ({ \ | ||
11 | + pgd_t *__pgd; \ | ||
12 | + if (!kernel) \ | ||
13 | + __pgd = pgd_offset(mm, address); \ | ||
14 | + else \ | ||
15 | + __pgd = pgd_offset_k(address); \ | ||
16 | + __pgd; \ | ||
17 | + }) | ||
18 | + | ||
19 | +#define NV_PGD_PRESENT(pgd) \ | ||
20 | + ({ \ | ||
21 | + if ((pgd != NULL) && \ | ||
22 | + (pgd_bad(*pgd) || pgd_none(*pgd))) \ | ||
23 | + /* static */ pgd = NULL; \ | ||
24 | + pgd != NULL; \ | ||
25 | + }) | ||
26 | + | ||
27 | #if defined(pmd_offset_map) | ||
28 | -#define NV_PMD_OFFSET(addres, pg_dir, pg_mid_dir) \ | ||
29 | - { \ | ||
30 | - pg_mid_dir = pmd_offset_map(pg_dir, address); \ | ||
31 | - } | ||
32 | -#define NV_PMD_UNMAP(pg_mid_dir) \ | ||
33 | - { \ | ||
34 | - pmd_unmap(pg_mid_dir); \ | ||
35 | - } | ||
36 | +#define NV_PMD_OFFSET(address, pgd) \ | ||
37 | + ({ \ | ||
38 | + pmd_t *__pmd; \ | ||
39 | + __pmd = pmd_offset_map(pgd, address); \ | ||
40 | + }) | ||
41 | +#define NV_PMD_UNMAP(pmd) pmd_unmap(pmd); | ||
42 | #else | ||
43 | -#define NV_PMD_OFFSET(addres, pg_dir, pg_mid_dir) \ | ||
44 | - { \ | ||
45 | - pg_mid_dir = pmd_offset(pg_dir, address); \ | ||
46 | - } | ||
47 | -#define NV_PMD_UNMAP(pg_mid_dir) | ||
48 | +#if defined(PUD_SHIFT) /* 4-level pgtable */ | ||
49 | +#define NV_PMD_OFFSET(address, pgd) \ | ||
50 | + ({ \ | ||
51 | + pmd_t *__pmd = NULL; \ | ||
52 | + pud_t *__pud; \ | ||
53 | + __pud = pud_offset(pgd, address); \ | ||
54 | + if ((__pud != NULL) && \ | ||
55 | + !(pud_bad(*__pud) || pud_none(*__pud))) \ | ||
56 | + __pmd = pmd_offset(__pud, address); \ | ||
57 | + __pmd; \ | ||
58 | + }) | ||
59 | +#else /* 3-level pgtable */ | ||
60 | +#define NV_PMD_OFFSET(address, pgd) \ | ||
61 | + ({ \ | ||
62 | + pmd_t *__pmd; \ | ||
63 | + __pmd = pmd_offset(pgd, address); \ | ||
64 | + }) | ||
65 | +#endif | ||
66 | +#define NV_PMD_UNMAP(pmd) | ||
67 | #endif | ||
68 | |||
69 | -#define NV_PMD_PRESENT(pg_mid_dir) \ | ||
70 | - ({ \ | ||
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) \ | ||
75 | + ({ \ | ||
76 | + if ((pmd != NULL) && \ | ||
77 | + (pmd_bad(*pmd) || pmd_none(*pmd))) \ | ||
78 | + { \ | ||
79 | + NV_PMD_UNMAP(pmd); \ | ||
80 | + pmd = NULL; /* mark invalid */ \ | ||
81 | + } \ | ||
82 | + pmd != NULL; \ | ||
83 | }) | ||
84 | |||
85 | #if defined(pte_offset_atomic) | ||
86 | -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \ | ||
87 | - { \ | ||
88 | - pte = pte_offset_atomic(pg_mid_dir, address); \ | ||
89 | - NV_PMD_UNMAP(pg_mid_dir); \ | ||
90 | - } | ||
91 | -#define NV_PTE_UNMAP(pte) \ | ||
92 | - { \ | ||
93 | - pte_kunmap(pte); \ | ||
94 | - } | ||
95 | +#define NV_PTE_OFFSET(address, pmd) \ | ||
96 | + ({ \ | ||
97 | + pte_t *__pte; \ | ||
98 | + __pte = pte_offset_atomic(pmd, address); \ | ||
99 | + NV_PMD_UNMAP(pmd); __pte; \ | ||
100 | + }) | ||
101 | +#define NV_PTE_UNMAP(pte) pte_kunmap(pte); | ||
102 | #elif defined(pte_offset) | ||
103 | -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \ | ||
104 | - { \ | ||
105 | - pte = pte_offset(pg_mid_dir, address); \ | ||
106 | - NV_PMD_UNMAP(pg_mid_dir); \ | ||
107 | - } | ||
108 | +#define NV_PTE_OFFSET(address, pmd) \ | ||
109 | + ({ \ | ||
110 | + pte_t *__pte; \ | ||
111 | + __pte = pte_offset(pmd, address); \ | ||
112 | + NV_PMD_UNMAP(pmd); __pte; \ | ||
113 | + }) | ||
114 | #define NV_PTE_UNMAP(pte) | ||
115 | #else | ||
116 | -#define NV_PTE_OFFSET(addres, pg_mid_dir, pte) \ | ||
117 | - { \ | ||
118 | - pte = pte_offset_map(pg_mid_dir, address); \ | ||
119 | - NV_PMD_UNMAP(pg_mid_dir); \ | ||
120 | - } | ||
121 | -#define NV_PTE_UNMAP(pte) \ | ||
122 | - { \ | ||
123 | - pte_unmap(pte); \ | ||
124 | - } | ||
125 | +#define NV_PTE_OFFSET(address, pmd) \ | ||
126 | + ({ \ | ||
127 | + pte_t *__pte; \ | ||
128 | + __pte = pte_offset_map(pmd, address); \ | ||
129 | + NV_PMD_UNMAP(pmd); __pte; \ | ||
130 | + }) | ||
131 | +#define NV_PTE_UNMAP(pte) pte_unmap(pte); | ||
132 | #endif | ||
133 | |||
134 | -#define NV_PTE_PRESENT(pte) \ | ||
135 | - ({ \ | ||
136 | - if (pte) { \ | ||
137 | - if (!pte_present(*pte)) { \ | ||
138 | - NV_PTE_UNMAP(pte); pte = NULL; \ | ||
139 | - } \ | ||
140 | - } pte != NULL; \ | ||
141 | +#define NV_PTE_PRESENT(pte) \ | ||
142 | + ({ \ | ||
143 | + if ((pte != NULL) && !pte_present(*pte)) \ | ||
144 | + { \ | ||
145 | + NV_PTE_UNMAP(pte); \ | ||
146 | + pte = NULL; /* mark invalid */ \ | ||
147 | + } \ | ||
148 | + pte != NULL; \ | ||
149 | }) | ||
150 | |||
151 | -#define NV_PTE_VALUE(pte) \ | ||
152 | - ({ \ | ||
153 | - unsigned long __pte_value = pte_val(*pte); \ | ||
154 | - NV_PTE_UNMAP(pte); \ | ||
155 | - __pte_value; \ | ||
156 | +#define NV_PTE_VALUE(pte) \ | ||
157 | + ({ \ | ||
158 | + unsigned long __pte_value = pte_val(*pte); \ | ||
159 | + NV_PTE_UNMAP(pte); \ | ||
160 | + __pte_value; \ | ||
161 | }) | ||
162 | |||
163 | + | ||
164 | #define NV_PAGE_ALIGN(addr) ( ((addr) + PAGE_SIZE - 1) / PAGE_SIZE) | ||
165 | #define NV_MASK_OFFSET(addr) ( (addr) & (PAGE_SIZE - 1) ) | ||
166 | |||
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 | ||
170 | @@ -53,12 +53,13 @@ | ||
171 | * conflicts. we try to rely on the kernel's provided interfaces when possible, | ||
172 | * but need additional flushing on earlier kernels. | ||
173 | */ | ||
174 | - | ||
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) | ||
178 | { | ||
179 | CACHE_FLUSH(); | ||
180 | } | ||
181 | +#endif | ||
182 | |||
183 | /* | ||
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 @@ | ||
189 | ) | ||
190 | { | ||
191 | struct mm_struct *mm; | ||
192 | - pgd_t *pg_dir; | ||
193 | - pmd_t *pg_mid_dir; | ||
194 | - pte_t *pte; | ||
195 | + pgd_t *pgd = NULL; | ||
196 | + pmd_t *pmd = NULL; | ||
197 | + pte_t *pte = NULL; | ||
198 | unsigned long retval; | ||
199 | |||
200 | mm = (kern) ? &init_mm : current->mm; | ||
201 | spin_lock(&mm->page_table_lock); | ||
202 | |||
203 | - if (kern) pg_dir = pgd_offset_k(address); | ||
204 | - else pg_dir = pgd_offset(mm, address); | ||
205 | - | ||
206 | - if (!pg_dir || pgd_none(*pg_dir)) | ||
207 | + pgd = NV_PGD_OFFSET(address, kern, mm); | ||
208 | + if (!NV_PGD_PRESENT(pgd)) | ||
209 | goto failed; | ||
210 | |||
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)) | ||
215 | goto failed; | ||
216 | |||
217 | - NV_PTE_OFFSET(address, pg_mid_dir, pte); | ||
218 | - | ||
219 | + pte = NV_PTE_OFFSET(address, pmd); | ||
220 | if (!NV_PTE_PRESENT(pte)) | ||
221 | goto failed; | ||
222 |
Properties
Name | Value |
---|---|
svn:executable | * |