ChangeSet 1.2218, 2005/03/16 09:37:39-08:00, [EMAIL PROTECTED]

        [IA64] override for pgd_addr_end to step around holes
        
        Every user region has a hole in the middle where we don't have
        enough bits in pgd+pmd+pte so pgd_addr_end needs some extra math
        to compute the virtual address base of the next pgd entry.
        
        Thanks to Dave Miller for pointing me in the right direction.
        
        Signed-off-by: Tony Luck <[EMAIL PROTECTED]>



 pgtable.h |   17 +++++++++++++++++
 1 files changed, 17 insertions(+)


diff -Nru a/include/asm-ia64/pgtable.h b/include/asm-ia64/pgtable.h
--- a/include/asm-ia64/pgtable.h        2005-03-17 11:06:29 -08:00
+++ b/include/asm-ia64/pgtable.h        2005-03-17 11:06:29 -08:00
@@ -550,6 +550,23 @@
 #define __HAVE_ARCH_PTEP_SET_WRPROTECT
 #define __HAVE_ARCH_PTE_SAME
 #define __HAVE_ARCH_PGD_OFFSET_GATE
+
+/*
+ * Override for pgd_addr_end() to deal with the virtual address space holes
+ * in each region.  Virtual address bits are used like this:
+ *      +--------+------+--------+-----+-----+--------+
+ *      | pgdhi3 | rsvd | pgdlow | pmd | pte | offset |
+ *      +--------+------+--------+-----+-----+--------+
+ *  The high bit of 'pgdlow' must be sign extended across the 'rsvd' bits.
+ */
+#define IA64_PGD_SIGNEXTEND (PGDIR_SIZE << (PAGE_SHIFT-7))
+#define pgd_addr_end(addr, end)                                                
\
+({     unsigned long __boundary = ((addr) + PGDIR_SIZE) & PGDIR_MASK;  \
+       if (__boundary & IA64_PGD_SIGNEXTEND)                           \
+               __boundary |= (RGN_SIZE - 1) & ~(IA64_PGD_SIGNEXTEND-1);\
+       (__boundary - 1 < (end) - 1)? __boundary: (end);                \
+})
+
 #include <asm-generic/pgtable-nopud.h>
 #include <asm-generic/pgtable.h>
 
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to