*/
static inline void cpu_set_reserved_ttbr0(void)
{
- unsigned long ttbr = page_to_phys(empty_zero_page);
+ unsigned long ttbr = page_to_phys(virt_to_page(empty_zero_page));
asm(
" msr ttbr0_el1, %0 // set TTBR0\n"
* ZERO_PAGE is a global shared page that is always zero: used
* for zero-mapped memory areas etc..
*/
-extern struct page *empty_zero_page;
-#define ZERO_PAGE(vaddr) (empty_zero_page)
+extern unsigned long empty_zero_page;
+extern unsigned long zero_page_mask;
+
+#define ZERO_PAGE(vaddr) \
+ (virt_to_page((void *)(empty_zero_page + (((unsigned long)(vaddr)) & zero_page_mask))))
+#define __HAVE_COLOR_ZERO_PAGE
#define pte_pfn(pte) ((pte_val(pte) & PHYS_MASK) >> PAGE_SHIFT)
* Empty_zero_page is a special page that is used for zero-initialized data
* and COW.
*/
-struct page *empty_zero_page;
+unsigned long empty_zero_page;
EXPORT_SYMBOL(empty_zero_page);
+unsigned long zero_page_mask;
+static zero_page_order = 3;
pgprot_t pgprot_default;
EXPORT_SYMBOL(pgprot_default);
*/
void __init paging_init(void)
{
- void *zero_page;
-
/*
* Maximum PGDIR_SIZE addressable via the initial direct kernel
* mapping in swapper_pg_dir.
flush_tlb_all();
/* allocate the zero page. */
- zero_page = early_alloc(PAGE_SIZE);
+ empty_zero_page = (ulong)early_alloc(PAGE_SIZE << zero_page_order);
+ zero_page_mask = ((PAGE_SIZE << zero_page_order) - 1) & PAGE_MASK;
bootmem_init();
- empty_zero_page = virt_to_page(zero_page);
dma_contiguous_remap();
/*