@@ -60,6 +60,7 @@ struct pg_state {
6060 unsigned long start_address ;
6161 unsigned long start_pa ;
6262 unsigned long last_pa ;
63+ unsigned long page_size ;
6364 unsigned int level ;
6465 u64 current_flags ;
6566 bool check_wx ;
@@ -157,9 +158,9 @@ static void dump_addr(struct pg_state *st, unsigned long addr)
157158#endif
158159
159160 pt_dump_seq_printf (st -> seq , REG "-" REG " " , st -> start_address , addr - 1 );
160- if (st -> start_pa == st -> last_pa && st -> start_address + PAGE_SIZE != addr ) {
161+ if (st -> start_pa == st -> last_pa && st -> start_address + st -> page_size != addr ) {
161162 pt_dump_seq_printf (st -> seq , "[" REG "]" , st -> start_pa );
162- delta = PAGE_SIZE >> 10 ;
163+ delta = st -> page_size >> 10 ;
163164 } else {
164165 pt_dump_seq_printf (st -> seq , " " REG " " , st -> start_pa );
165166 delta = (addr - st -> start_address ) >> 10 ;
@@ -190,7 +191,7 @@ static void note_prot_wx(struct pg_state *st, unsigned long addr)
190191}
191192
192193static void note_page (struct pg_state * st , unsigned long addr ,
193- unsigned int level , u64 val )
194+ unsigned int level , u64 val , unsigned long page_size )
194195{
195196 u64 flag = val & pg_level [level ].mask ;
196197 u64 pa = val & PTE_RPN_MASK ;
@@ -202,6 +203,7 @@ static void note_page(struct pg_state *st, unsigned long addr,
202203 st -> start_address = addr ;
203204 st -> start_pa = pa ;
204205 st -> last_pa = pa ;
206+ st -> page_size = page_size ;
205207 pt_dump_seq_printf (st -> seq , "---[ %s ]---\n" , st -> marker -> name );
206208 /*
207209 * Dump the section of virtual memory when:
@@ -213,7 +215,7 @@ static void note_page(struct pg_state *st, unsigned long addr,
213215 */
214216 } else if (flag != st -> current_flags || level != st -> level ||
215217 addr >= st -> marker [1 ].start_address ||
216- (pa != st -> last_pa + PAGE_SIZE &&
218+ (pa != st -> last_pa + st -> page_size &&
217219 (pa != st -> start_pa || st -> start_pa != st -> last_pa ))) {
218220
219221 /* Check the PTE flags */
@@ -241,6 +243,7 @@ static void note_page(struct pg_state *st, unsigned long addr,
241243 st -> start_address = addr ;
242244 st -> start_pa = pa ;
243245 st -> last_pa = pa ;
246+ st -> page_size = page_size ;
244247 st -> current_flags = flag ;
245248 st -> level = level ;
246249 } else {
@@ -256,7 +259,7 @@ static void walk_pte(struct pg_state *st, pmd_t *pmd, unsigned long start)
256259
257260 for (i = 0 ; i < PTRS_PER_PTE ; i ++ , pte ++ ) {
258261 addr = start + i * PAGE_SIZE ;
259- note_page (st , addr , 4 , pte_val (* pte ));
262+ note_page (st , addr , 4 , pte_val (* pte ), PAGE_SIZE );
260263
261264 }
262265}
@@ -273,7 +276,7 @@ static void walk_pmd(struct pg_state *st, pud_t *pud, unsigned long start)
273276 /* pmd exists */
274277 walk_pte (st , pmd , addr );
275278 else
276- note_page (st , addr , 3 , pmd_val (* pmd ));
279+ note_page (st , addr , 3 , pmd_val (* pmd ), PMD_SIZE );
277280 }
278281}
279282
@@ -289,7 +292,7 @@ static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start)
289292 /* pud exists */
290293 walk_pmd (st , pud , addr );
291294 else
292- note_page (st , addr , 2 , pud_val (* pud ));
295+ note_page (st , addr , 2 , pud_val (* pud ), PUD_SIZE );
293296 }
294297}
295298
@@ -308,7 +311,7 @@ static void walk_pagetables(struct pg_state *st)
308311 /* pgd exists */
309312 walk_pud (st , pgd , addr );
310313 else
311- note_page (st , addr , 1 , pgd_val (* pgd ));
314+ note_page (st , addr , 1 , pgd_val (* pgd ), PGDIR_SIZE );
312315 }
313316}
314317
@@ -363,7 +366,7 @@ static int ptdump_show(struct seq_file *m, void *v)
363366
364367 /* Traverse kernel page tables */
365368 walk_pagetables (& st );
366- note_page (& st , 0 , 0 , 0 );
369+ note_page (& st , 0 , 0 , 0 , 0 );
367370 return 0 ;
368371}
369372
0 commit comments