Index: linux-2.6.14/arch/arm/mm/init.c =================================================================== --- linux-2.6.14.orig/arch/arm/mm/init.c 2005-12-06 13:50:13.000000000 +0900 +++ linux-2.6.14/arch/arm/mm/init.c 2005-12-06 13:51:29.000000000 +0900 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -645,6 +646,15 @@ void __init mem_init(void) */ sysctl_overcommit_memory = OVERCOMMIT_ALWAYS; } +#ifdef CONFIG_SUSPEND2 + { + unsigned long addr; + for (addr = &__nosave_begin; addr < &__nosave_end; + addr += PAGE_SIZE) { + SetPageNosave(virt_to_page(addr)); + } + } +#endif } void free_initmem(void) Index: linux-2.6.14/kernel/power/atomic_copy.c =================================================================== --- linux-2.6.14.orig/kernel/power/atomic_copy.c 2005-12-06 13:50:13.000000000 +0900 +++ linux-2.6.14/kernel/power/atomic_copy.c 2005-12-06 13:51:29.000000000 +0900 @@ -55,7 +55,16 @@ static int __get_next_bit_on(dyn_pagefla do { counter++; +/* FIXME: quick hack for ARM. + * suspend2 assumes pfn starts from 0, which is not the case for ARM. + * this is a quick workaround, and correct way is to fix suspend2... + */ +#ifdef CONFIG_ARM + if (counter > (((*zone)->zone_start_pfn - PHYS_PFN_OFFSET) + + (*zone)->spanned_pages)) { +#else if (counter > ((*zone)->zone_start_pfn + (*zone)->spanned_pages)) { +#endif do { *zone = next_zone(*zone); (*zone_num)++; @@ -63,7 +72,11 @@ static int __get_next_bit_on(dyn_pagefla if (!*zone) return max_pfn; +#ifdef CONFIG_ARM + counter = ((*zone)->zone_start_pfn - PHYS_PFN_OFFSET); +#else counter = (*zone)->zone_start_pfn; +#endif reset_ul_ptr = 1; } else if (!(counter & BIT_NUM_MASK)) @@ -71,7 +84,11 @@ static int __get_next_bit_on(dyn_pagefla if (reset_ul_ptr) { reset_ul_ptr = 0; ul_ptr = PAGE_UL_PTR(bitmap, *zone_num, +#ifdef CONFIG_ARM + (counter - ((*zone)->zone_start_pfn - PHYS_PFN_OFFSET))); +#else (counter - (*zone)->zone_start_pfn)); +#endif if (!*ul_ptr) { counter += BIT_NUM_MASK; continue; Index: linux-2.6.14/kernel/power/pageflags.h =================================================================== --- linux-2.6.14.orig/kernel/power/pageflags.h 2005-12-06 13:50:13.000000000 +0900 +++ linux-2.6.14/kernel/power/pageflags.h 2005-12-06 13:51:29.000000000 +0900 @@ -15,6 +15,9 @@ * sizeof(unsigned long). Is this ever false? */ +#include +#include + /* FIXME: quick hack for ARM. * suspend2 assumes pfn starts from 0, which is not the case for ARM. * this is a quick workaround, and correct way is to fix suspend2... @@ -27,12 +30,13 @@ #undef pfn_valid #define pfn_valid(pfn) ((pfn) >= 0 && (pfn) < max_mapnr) #undef virt_to_page -#define virt_to_page(kaddr) ((mem_map + (__pa(kaddr) >> PAGE_SHIFT)) - PHYS_PFN_OFFSET) +#define virt_to_page(kaddr) ((mem_map + (__pa(kaddr) >> PAGE_SHIFT)) - \ + PHYS_PFN_OFFSET) +#undef pfn_to_kaddr +#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) + \ + PHYS_OFFSET/sizeof(unsigned long) #endif -#include -#include - extern dyn_pageflags_t in_use_map; extern dyn_pageflags_t allocd_pages_map; #ifdef CONFIG_DEBUG_PAGEALLOC Index: linux-2.6.14/lib/dyn_pageflags.c =================================================================== --- linux-2.6.14.orig/lib/dyn_pageflags.c 2005-12-06 13:50:13.000000000 +0900 +++ linux-2.6.14/lib/dyn_pageflags.c 2005-12-06 13:51:29.000000000 +0900 @@ -23,6 +23,28 @@ #define page_to_zone_offset(pg) (page_to_pfn(pg) - page_zone(pg)->zone_start_pfn) +/* FIXME: quick hack for ARM. + * suspend2 assumes pfn starts from 0, which is not the case for ARM. + * this is a quick workaround, and correct way is to fix suspend2... + */ +#ifdef CONFIG_ARM +#undef page_to_pfn +#define page_to_pfn(page) ((page) - mem_map) +#undef pfn_to_page +#define pfn_to_page(pfn) (mem_map + (pfn)) +#undef pfn_valid +#define pfn_valid(pfn) ((pfn) >= 0 && (pfn) < max_mapnr) +#undef virt_to_page +#define virt_to_page(kaddr) ((mem_map + (__pa(kaddr) >> PAGE_SHIFT)) - \ + PHYS_PFN_OFFSET) +#undef pfn_to_kaddr +#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) + \ + PHYS_OFFSET/sizeof(unsigned long) +#undef page_to_zone_offset +#define page_to_zone_offset(pg) (page_to_pfn(pg) - \ + (page_zone(pg)->zone_start_pfn - PHYS_PFN_OFFSET)) +#endif + #if BITS_PER_LONG == 32 #define UL_SHIFT 5 #else