• Paul Mundt's avatar
    sh: Correct pte_page() breakage. · afca0357
    Paul Mundt authored
    As noted by David:
    
    pte_page() is a macro defined as follows;
    
        include/asm-sh/pgtable.h
        #define pte_page(x)    phys_to_page(pte_val(x)&PTE_PHYS_MASK)
    
        include/asm-sh/page.h
        #define phys_to_page(phys)    (pfn_to_page(phys >> PAGE_SHIFT))
    
    So as you can see the phys_to_page() macro doesn't wrap the 'phys'
    parameter in parentheses so we end up with;
    
        pte_val(x)&PTE_PHYS_MASK >> PAGE_SHIFT
    
    Which is not what we wanted as '>>' has a higher precedence than bitwise
    AND. I dug into the git repository and I believe this bug was added with
    this commit (104b8dea);
    
    2006-03-27 KAMEZAWA Hiroyuki [PATCH] unify pfn_to_page: sh pfn_to_page
    
    -#define phys_to_page(phys)     (mem_map + (((phys)-__MEMORY_START) >>
    PAGE_SHIFT))
    -#define page_to_phys(page)     (((page - mem_map) << PAGE_SHIFT) +
    __MEMORY_START)
    +#define phys_to_page(phys)     (pfn_to_page(phys >> PAGE_SHIFT))
    +#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
    Reported-by: default avatarDavid ADDISON <david.addison@st.com>
    Reported-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
    afca0357
pgtable.h 19.6 KB