<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
Dave Anderson wrote:
<blockquote TYPE=CITE>Takao Indoh wrote:
<p>>
<br>> However, page_to_phys returns 0x100000000. I think page_to_phys does
not
<br>> support sparsemem system.
<br>>
<br>>
<p>Yeah -- the is_page_ptr() function needs to be enhanced
<br>to support SPARSEMEM kernels...
<p>I made a bunch of updates to the original SPARSEMEM patch
<br>in 4.0-3.3, but missed this one.
<p>Dave</blockquote>
<tt>In addition to the previous patch to dump_mem_map_SPARSEMEM(),</tt>
<br><tt>this update to is_page_ptr() should do the trick:</tt>
<p><tt>is_page_ptr(ulong addr, physaddr_t *phys)</tt>
<br><tt>{</tt>
<br><tt>        int n;</tt>
<br><tt>        ulong ppstart, ppend;</tt>
<br><tt>        struct node_table *nt;</tt>
<br><tt>        ulong pgnum, node_size;</tt>
<br><tt>+       ulong nr, sec_addr;</tt>
<br><tt>+       ulong nr_mem_sections;</tt>
<br><tt>+       ulong coded_mem_map, mem_map,
end_mem_map;</tt>
<br><tt>+       physaddr_t section_paddr;</tt>
<br><tt>+</tt>
<br><tt>+       if (IS_SPARSEMEM()) {</tt>
<br><tt>+              
nr_mem_sections = NR_MEM_SECTIONS();</tt>
<br><tt>+              
for (nr = 0; nr <= nr_mem_sections ; nr++) {</tt>
<br><tt>+                      
if ((sec_addr = valid_section_nr(nr))) {</tt>
<br><tt>+                              
coded_mem_map = section_mem_map_addr(sec_addr);</tt>
<br><tt>+                              
mem_map = sparse_decode_mem_map(coded_mem_map, nr);</tt>
<br><tt>+                              
end_mem_map = mem_map + (PAGES_PER_SECTION() * SIZE(page));</tt>
<br><tt>+</tt>
<br><tt>+                              
if ((addr >= mem_map) && (addr < end_mem_map)) {</tt>
<br><tt>+                                      
if ((addr - mem_map) % SIZE(page))</tt>
<br><tt>+                                              
return FALSE;</tt>
<br><tt>+                                      
if (phys) {</tt>
<br><tt>+                                              
section_paddr = PTOB(section_nr_to_pfn(nr));</tt>
<br><tt>+                                              
pgnum = (addr - mem_map) / SIZE(page);</tt>
<br><tt>+                                              
*phys = section_paddr + (pgnum * PAGESIZE());</tt>
<br><tt>+                                      
}</tt>
<br><tt>+                                      
return TRUE;</tt>
<br><tt>+                              
}</tt>
<br><tt>+                      
}</tt>
<br><tt>+              
}</tt>
<br><tt>+              
return FALSE;</tt>
<br><tt>+       }</tt><tt></tt>
<p><tt>        for (n = 0; n < vt->numnodes;
n++) {</tt>
<br><tt>               
nt = &vt->node_table[n];</tt><tt></tt>
<p><tt>Thanks,</tt>
<br><tt>  Dave</tt>
<br><tt></tt> </html>