Magellan Linux

Annotation of /trunk/nvidia/1.0.6629/NVIDIA_kernel-1.0-6629-1189413.patch

Parent Directory Parent Directory | Revision Log 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)
-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 *