2 * linux/kernel/power/swsusp.c
4 * This file is to realize architecture-independent
5 * machine suspend feature using pretty near only high-level routines
7 * Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
8 * Copyright (C) 1998,2001-2004 Pavel Machek <pavel@suse.cz>
10 * This file is released under the GPLv2.
12 * I'd like to thank the following people for their work:
14 * Pavel Machek <pavel@ucw.cz>:
15 * Modifications, defectiveness pointing, being with me at the very beginning,
16 * suspend to swap space, stop all tasks. Port to 2.4.18-ac and 2.5.17.
18 * Steve Doddi <dirk@loth.demon.co.uk>:
19 * Support the possibility of hardware state restoring.
21 * Raph <grey.havens@earthling.net>:
22 * Support for preserving states of network devices and virtual console
23 * (including X and svgatextmode)
25 * Kurt Garloff <garloff@suse.de>:
26 * Straightened the critical function in order to prevent compilers from
27 * playing tricks with local variables.
29 * Andreas Mohr <a.mohr@mailto.de>
31 * Alex Badea <vampire@go.ro>:
34 * More state savers are welcome. Especially for the scsi layer...
36 * For TODOs,FIXMEs also look in Documentation/power/swsusp.txt
39 #include <linux/module.h>
41 #include <linux/suspend.h>
42 #include <linux/smp_lock.h>
43 #include <linux/file.h>
44 #include <linux/utsname.h>
45 #include <linux/version.h>
46 #include <linux/delay.h>
47 #include <linux/reboot.h>
48 #include <linux/bitops.h>
49 #include <linux/vt_kern.h>
50 #include <linux/kbd_kern.h>
51 #include <linux/keyboard.h>
52 #include <linux/spinlock.h>
53 #include <linux/genhd.h>
54 #include <linux/kernel.h>
55 #include <linux/major.h>
56 #include <linux/swap.h>
58 #include <linux/device.h>
59 #include <linux/buffer_head.h>
60 #include <linux/swapops.h>
61 #include <linux/bootmem.h>
62 #include <linux/syscalls.h>
63 #include <linux/console.h>
64 #include <linux/highmem.h>
66 #include <asm/uaccess.h>
67 #include <asm/mmu_context.h>
68 #include <asm/pgtable.h>
73 unsigned char software_suspend_enabled = 0;
76 #define RESUME_SPECIFIED 2
78 /* References to section boundaries */
79 extern char __nosave_begin, __nosave_end;
81 extern int is_head_of_free_region(struct page *);
84 spinlock_t suspend_pagedir_lock __nosavedata = SPIN_LOCK_UNLOCKED;
86 /* Variables to be preserved over suspend */
87 static int pagedir_order_check;
88 static int nr_copy_pages_check;
90 static int resume_status;
91 static char resume_file[256] = ""; /* For resume= kernel option */
92 static dev_t resume_device;
93 /* Local variables that should not be affected by save */
94 unsigned int nr_copy_pages __nosavedata = 0;
96 /* Suspend pagedir is allocated before final copy, therefore it
97 must be freed after resume
99 Warning: this is evil. There are actually two pagedirs at time of
100 resume. One is "pagedir_save", which is empty frame allocated at
101 time of suspend, that must be freed. Second is "pagedir_nosave",
102 allocated at time of resume, that travels through memory not to
103 collide with anything.
105 Warning: this is even more evil than it seems. Pagedirs this file
106 talks about are completely different from page directories used by
109 suspend_pagedir_t *pagedir_nosave __nosavedata = NULL;
110 static suspend_pagedir_t *pagedir_save;
111 static int pagedir_order __nosavedata = 0;
114 char dummy[PAGE_SIZE - sizeof(swp_entry_t)];
119 union swap_header swh;
121 struct suspend_header sh;
125 * XXX: We try to keep some more pages free so that I/O operations succeed
126 * without paging. Might this be more?
128 #define PAGES_FOR_IO 512
130 static const char name_suspend[] = "Suspend Machine: ";
131 static const char name_resume[] = "Resume Machine: ";
136 #define DEBUG_DEFAULT
139 #define TEST_SWSUSP 0 /* Set to 1 to reboot instead of halt machine after suspension */
142 # define PRINTK(f, a...) printk(f, ## a)
144 # define PRINTK(f, a...) do { } while(0)
148 #define MDELAY(a) mdelay(a)
150 #define MDELAY(a) do { } while(0)
157 static __inline__ int fill_suspend_header(struct suspend_header *sh)
159 memset((char *)sh, 0, sizeof(*sh));
161 sh->version_code = LINUX_VERSION_CODE;
162 sh->num_physpages = num_physpages;
163 strncpy(sh->machine, system_utsname.machine, 8);
164 strncpy(sh->version, system_utsname.version, 20);
165 /* FIXME: Is this bogus? --RR */
166 sh->num_cpus = num_online_cpus();
167 sh->page_size = PAGE_SIZE;
168 sh->suspend_pagedir = pagedir_nosave;
169 BUG_ON (pagedir_save != pagedir_nosave);
170 sh->num_pbes = nr_copy_pages;
171 /* TODO: needed? mounted fs' last mounted date comparison
172 * [so they haven't been mounted since last suspend.
173 * Maybe it isn't.] [we'd need to do this for _all_ fs-es]
178 /* We memorize in swapfile_used what swap devices are used for suspension */
179 #define SWAPFILE_UNUSED 0
180 #define SWAPFILE_SUSPEND 1 /* This is the suspending device */
181 #define SWAPFILE_IGNORED 2 /* Those are other swap devices ignored for suspension */
183 static unsigned short swapfile_used[MAX_SWAPFILES];
184 static unsigned short root_swap;
185 #define MARK_SWAP_SUSPEND 0
186 #define MARK_SWAP_RESUME 2
188 static void mark_swapfiles(swp_entry_t prev, int mode)
194 if (root_swap == 0xFFFF) /* ignored */
197 page = alloc_page(GFP_ATOMIC);
199 panic("Out of memory in mark_swapfiles");
200 cur = page_address(page);
201 /* XXX: this is dirty hack to get first page of swap file */
202 entry = swp_entry(root_swap, 0);
203 rw_swap_page_sync(READ, entry, page);
205 if (mode == MARK_SWAP_RESUME) {
206 if (!memcmp("S1",cur->swh.magic.magic,2))
207 memcpy(cur->swh.magic.magic,"SWAP-SPACE",10);
208 else if (!memcmp("S2",cur->swh.magic.magic,2))
209 memcpy(cur->swh.magic.magic,"SWAPSPACE2",10);
210 else printk("%sUnable to find suspended-data signature (%.10s - misspelled?\n",
211 name_resume, cur->swh.magic.magic);
213 if ((!memcmp("SWAP-SPACE",cur->swh.magic.magic,10)))
214 memcpy(cur->swh.magic.magic,"S1SUSP....",10);
215 else if ((!memcmp("SWAPSPACE2",cur->swh.magic.magic,10)))
216 memcpy(cur->swh.magic.magic,"S2SUSP....",10);
217 else panic("\nSwapspace is not swapspace (%.10s)\n", cur->swh.magic.magic);
218 cur->link.next = prev; /* prev is the first/last swap page of the resume area */
219 /* link.next lies *no more* in last 4/8 bytes of magic */
221 rw_swap_page_sync(WRITE, entry, page);
225 static void read_swapfiles(void) /* This is called before saving image */
228 static char buff[sizeof(resume_file)], *sname;
230 len=strlen(resume_file);
234 for(i=0; i<MAX_SWAPFILES; i++) {
235 if (swap_info[i].flags == 0) {
236 swapfile_used[i]=SWAPFILE_UNUSED;
239 printk(KERN_WARNING "resume= option should be used to set suspend device" );
240 if(root_swap == 0xFFFF) {
241 swapfile_used[i] = SWAPFILE_SUSPEND;
244 swapfile_used[i] = SWAPFILE_IGNORED;
246 /* we ignore all swap devices that are not the resume_file */
247 sname = d_path(swap_info[i].swap_file->f_dentry,
248 swap_info[i].swap_file->f_vfsmnt,
251 if (!strcmp(sname, resume_file)) {
252 swapfile_used[i] = SWAPFILE_SUSPEND;
256 printk( "Resume: device %s (%x != %x) ignored\n", swap_info[i].swap_file->d_name.name, swap_info[i].swap_device, resume_device );
258 swapfile_used[i] = SWAPFILE_IGNORED;
266 static void lock_swapdevices(void) /* This is called after saving image so modification
267 will be lost after resume... and that's what we want. */
272 for(i = 0; i< MAX_SWAPFILES; i++)
273 if(swapfile_used[i] == SWAPFILE_IGNORED) {
274 swap_info[i].flags ^= 0xFF; /* we make the device unusable. A new call to
275 lock_swapdevices can unlock the devices. */
281 * write_suspend_image - Write entire image to disk.
283 * After writing suspend signature to the disk, suspend may no
284 * longer fail: we have ready-to-run image in swap, and rollback
285 * would happen on next reboot -- corrupting data.
287 * Note: The buffer we allocate to use to write the suspend header is
288 * not freed; its not needed since the system is going down anyway
289 * (plus it causes an oops and I'm lazy^H^H^H^Htoo busy).
291 static int write_suspend_image(void)
294 swp_entry_t entry, prev = { 0 };
295 int nr_pgdir_pages = SUSPEND_PD_PAGES(nr_copy_pages);
296 union diskpage *cur, *buffer = (union diskpage *)get_zeroed_page(GFP_ATOMIC);
297 unsigned long address;
303 printk( "Writing data to swap (%d pages): ", nr_copy_pages );
304 for (i=0; i<nr_copy_pages; i++) {
307 if (!(entry = get_swap_page()).val)
308 panic("\nNot enough swapspace when writing data" );
310 if (swapfile_used[swp_type(entry)] != SWAPFILE_SUSPEND)
311 panic("\nPage %d: not enough swapspace on suspend device", i );
313 address = (pagedir_nosave+i)->address;
314 page = virt_to_page(address);
315 rw_swap_page_sync(WRITE, entry, page);
316 (pagedir_nosave+i)->swap_address = entry;
319 printk( "Writing pagedir (%d pages): ", nr_pgdir_pages);
320 for (i=0; i<nr_pgdir_pages; i++) {
321 cur = (union diskpage *)((char *) pagedir_nosave)+i;
322 BUG_ON ((char *) cur != (((char *) pagedir_nosave) + i*PAGE_SIZE));
324 if (!(entry = get_swap_page()).val) {
325 printk(KERN_CRIT "Not enough swapspace when writing pgdir\n" );
326 panic("Don't know how to recover");
327 free_page((unsigned long) buffer);
331 if(swapfile_used[swp_type(entry)] != SWAPFILE_SUSPEND)
332 panic("\nNot enough swapspace for pagedir on suspend device" );
334 BUG_ON (sizeof(swp_entry_t) != sizeof(long));
335 BUG_ON (PAGE_SIZE % sizeof(struct pbe));
337 cur->link.next = prev;
338 page = virt_to_page((unsigned long)cur);
339 rw_swap_page_sync(WRITE, entry, page);
343 BUG_ON (sizeof(struct suspend_header) > PAGE_SIZE-sizeof(swp_entry_t));
344 BUG_ON (sizeof(union diskpage) != PAGE_SIZE);
345 BUG_ON (sizeof(struct link) != PAGE_SIZE);
346 if (!(entry = get_swap_page()).val)
347 panic( "\nNot enough swapspace when writing header" );
348 if (swapfile_used[swp_type(entry)] != SWAPFILE_SUSPEND)
349 panic("\nNot enough swapspace for header on suspend device" );
351 cur = (void *) buffer;
352 if (fill_suspend_header(&cur->sh))
353 BUG(); /* Not a BUG_ON(): we want fill_suspend_header to be called, always */
355 cur->link.next = prev;
357 page = virt_to_page((unsigned long)cur);
358 rw_swap_page_sync(WRITE, entry, page);
362 mark_swapfiles(prev, MARK_SWAP_SUSPEND);
369 #ifdef CONFIG_HIGHMEM
370 struct highmem_page {
373 struct highmem_page *next;
376 struct highmem_page *highmem_copy = NULL;
378 static int save_highmem_zone(struct zone *zone)
380 unsigned long zone_pfn;
381 for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
383 struct highmem_page *save;
385 unsigned long pfn = zone_pfn + zone->zone_start_pfn;
392 page = pfn_to_page(pfn);
394 * This condition results from rvmalloc() sans vmalloc_32()
395 * and architectural memory reservations. This should be
396 * corrected eventually when the cases giving rise to this
397 * are better understood.
399 if (PageReserved(page)) {
400 printk("highmem reserved page?!\n");
403 if ((chunk_size = is_head_of_free_region(page))) {
404 pfn += chunk_size - 1;
405 zone_pfn += chunk_size - 1;
408 save = kmalloc(sizeof(struct highmem_page), GFP_ATOMIC);
411 save->next = highmem_copy;
413 save->data = (void *) get_zeroed_page(GFP_ATOMIC);
418 kaddr = kmap_atomic(page, KM_USER0);
419 memcpy(save->data, kaddr, PAGE_SIZE);
420 kunmap_atomic(kaddr, KM_USER0);
426 static int save_highmem(void)
430 for_each_zone(zone) {
431 if (is_highmem(zone))
432 res = save_highmem_zone(zone);
439 static int restore_highmem(void)
441 while (highmem_copy) {
442 struct highmem_page *save = highmem_copy;
444 highmem_copy = save->next;
446 kaddr = kmap_atomic(save->page, KM_USER0);
447 memcpy(kaddr, save->data, PAGE_SIZE);
448 kunmap_atomic(kaddr, KM_USER0);
449 free_page((long) save->data);
456 static int pfn_is_nosave(unsigned long pfn)
458 unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
459 unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT;
460 return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
463 /* if *pagedir_p != NULL it also copies the counted pages */
464 static int count_and_copy_zone(struct zone *zone, struct pbe **pagedir_p)
466 unsigned long zone_pfn, chunk_size, nr_copy_pages = 0;
467 struct pbe *pbe = *pagedir_p;
468 for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
470 unsigned long pfn = zone_pfn + zone->zone_start_pfn;
476 page = pfn_to_page(pfn);
477 BUG_ON(PageReserved(page) && PageNosave(page));
478 if (PageNosave(page))
480 if (PageReserved(page) && pfn_is_nosave(pfn)) {
481 PRINTK("[nosave pfn 0x%lx]", pfn);
484 if ((chunk_size = is_head_of_free_region(page))) {
485 pfn += chunk_size - 1;
486 zone_pfn += chunk_size - 1;
492 pbe->orig_address = (long) page_address(page);
493 copy_page((void *)pbe->address, (void *)pbe->orig_address);
497 return nr_copy_pages;
500 static int count_and_copy_data_pages(struct pbe *pagedir_p)
502 int nr_copy_pages = 0;
504 for_each_zone(zone) {
505 if (!is_highmem(zone))
506 nr_copy_pages += count_and_copy_zone(zone, &pagedir_p);
508 return nr_copy_pages;
511 static void free_suspend_pagedir_zone(struct zone *zone, unsigned long pagedir)
513 unsigned long zone_pfn, pagedir_end, pagedir_pfn, pagedir_end_pfn;
514 pagedir_end = pagedir + (PAGE_SIZE << pagedir_order);
515 pagedir_pfn = __pa(pagedir) >> PAGE_SHIFT;
516 pagedir_end_pfn = __pa(pagedir_end) >> PAGE_SHIFT;
517 for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
519 unsigned long pfn = zone_pfn + zone->zone_start_pfn;
522 page = pfn_to_page(pfn);
523 if (!TestClearPageNosave(page))
525 else if (pfn >= pagedir_pfn && pfn < pagedir_end_pfn)
531 static void free_suspend_pagedir(unsigned long this_pagedir)
534 for_each_zone(zone) {
535 if (!is_highmem(zone))
536 free_suspend_pagedir_zone(zone, this_pagedir);
538 free_pages(this_pagedir, pagedir_order);
541 static suspend_pagedir_t *create_suspend_pagedir(int nr_copy_pages)
544 suspend_pagedir_t *pagedir;
548 pagedir_order = get_bitmask_order(SUSPEND_PD_PAGES(nr_copy_pages));
550 p = pagedir = (suspend_pagedir_t *)__get_free_pages(GFP_ATOMIC | __GFP_COLD, pagedir_order);
554 page = virt_to_page(pagedir);
555 for(i=0; i < 1<<pagedir_order; i++)
556 SetPageNosave(page++);
558 while(nr_copy_pages--) {
559 p->address = get_zeroed_page(GFP_ATOMIC | __GFP_COLD);
561 free_suspend_pagedir((unsigned long) pagedir);
564 SetPageNosave(virt_to_page(p->address));
571 static int prepare_suspend_processes(void)
573 sys_sync(); /* Syncing needs pdflushd, so do it before stopping processes */
574 if (freeze_processes()) {
575 printk( KERN_ERR "Suspend failed: Not all processes stopped!\n" );
583 * Try to free as much memory as possible, but do not OOM-kill anyone
585 * Notice: all userland should be stopped at this point, or livelock is possible.
587 static void free_some_memory(void)
589 printk("Freeing memory: ");
590 while (shrink_all_memory(10000))
595 static int suspend_prepare_image(void)
598 unsigned int nr_needed_pages = 0;
600 pagedir_nosave = NULL;
601 printk( "/critical section: ");
602 #ifdef CONFIG_HIGHMEM
603 printk( "handling highmem" );
604 if (save_highmem()) {
605 printk(KERN_CRIT "%sNot enough free pages for highmem\n", name_suspend);
611 printk("counting pages to copy" );
613 nr_copy_pages = count_and_copy_data_pages(NULL);
614 nr_needed_pages = nr_copy_pages + PAGES_FOR_IO;
616 printk(" (pages needed: %d+%d=%d free: %d)\n",nr_copy_pages,PAGES_FOR_IO,nr_needed_pages,nr_free_pages());
617 if(nr_free_pages() < nr_needed_pages) {
618 printk(KERN_CRIT "%sCouldn't get enough free pages, on %d pages short\n",
619 name_suspend, nr_needed_pages-nr_free_pages());
623 si_swapinfo(&i); /* FIXME: si_swapinfo(&i) returns all swap devices information.
624 We should only consider resume_device. */
625 if (i.freeswap < nr_needed_pages) {
626 printk(KERN_CRIT "%sThere's not enough swap space available, on %ld pages short\n",
627 name_suspend, nr_needed_pages-i.freeswap);
631 PRINTK( "Alloc pagedir\n" );
632 pagedir_save = pagedir_nosave = create_suspend_pagedir(nr_copy_pages);
633 if (!pagedir_nosave) {
634 /* Pagedir is big, one-chunk allocation. It is easily possible for this allocation to fail */
635 printk(KERN_CRIT "%sCouldn't allocate continuous pagedir\n", name_suspend);
638 nr_copy_pages_check = nr_copy_pages;
639 pagedir_order_check = pagedir_order;
641 drain_local_pages(); /* During allocating of suspend pagedir, new cold pages may appear. Kill them */
642 if (nr_copy_pages != count_and_copy_data_pages(pagedir_nosave)) /* copy */
646 * End of critical section. From now on, we can write to memory,
647 * but we should not touch disk. This specially means we must _not_
648 * touch swap space! Except we must write out our image of course.
651 printk( "critical section/: done (%d pages copied)\n", nr_copy_pages );
655 static void suspend_save_image(void)
660 write_suspend_image();
661 lock_swapdevices(); /* This will unlock ignored swap devices since writing is finished */
663 /* It is important _NOT_ to umount filesystems at this point. We want
664 * them synced (in case something goes wrong) but we DO not want to mark
665 * filesystem clean: it is not. (And it does not matter, if we resume
666 * correctly, we'll mark system clean, anyway.)
670 static void suspend_power_down(void)
674 printk(KERN_EMERG "%s%s Trying to power down.\n", name_suspend, TEST_SWSUSP ? "Disable TEST_SWSUSP. NOT ": "");
676 PRINTK(KERN_EMERG "shift_state: %04x\n", shift_state);
678 if (TEST_SWSUSP ^ (!!(shift_state & (1 << KG_CTRL))))
679 machine_restart(NULL);
687 printk(KERN_EMERG "%sProbably not capable for powerdown. System halted.\n", name_suspend);
697 asmlinkage void do_magic_resume_1(void)
701 spin_lock_irq(&suspend_pagedir_lock); /* Done to disable interrupts */
703 device_power_down(4);
704 PRINTK( "Waiting for DMAs to settle down...\n");
705 mdelay(1000); /* We do not want some readahead with DMA to corrupt our memory, right?
706 Do it with disabled interrupts for best effect. That way, if some
707 driver scheduled DMA, we have good chance for DMA to finish ;-). */
710 asmlinkage void do_magic_resume_2(void)
712 BUG_ON (nr_copy_pages_check != nr_copy_pages);
713 BUG_ON (pagedir_order_check != pagedir_order);
715 __flush_tlb_global(); /* Even mappings of "global" things (vmalloc) need to be fixed */
717 PRINTK( "Freeing prev allocated pagedir\n" );
718 free_suspend_pagedir((unsigned long) pagedir_save);
720 #ifdef CONFIG_HIGHMEM
721 printk( "Restoring highmem\n" );
724 printk("done, devices\n");
727 spin_unlock_irq(&suspend_pagedir_lock);
730 /* Fixme: this is too late; we should do this ASAP to avoid "infinite reboots" problem */
731 PRINTK( "Fixing swap signatures... " );
732 mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
735 #ifdef SUSPEND_CONSOLE
736 acquire_console_sem();
737 update_screen(fg_console);
738 release_console_sem();
742 /* do_magic() is implemented in arch/?/kernel/suspend_asm.S, and basically does:
745 do_magic_suspend_1();
746 save_processor_state();
748 do_magic_suspend_2();
751 GO_TO_SWAPPER_PAGE_TABLES
755 restore_processor_state();
760 asmlinkage void do_magic_suspend_1(void)
765 spin_lock_irq(&suspend_pagedir_lock);
768 asmlinkage void do_magic_suspend_2(void)
772 device_power_down(4);
773 is_problem = suspend_prepare_image();
775 spin_unlock_irq(&suspend_pagedir_lock);
777 kernel_fpu_end(); /* save_processor_state() does kernel_fpu_begin, and we need to revert it in order to pass in_atomic() checks */
779 suspend_save_image();
780 suspend_power_down(); /* FIXME: if suspend_power_down is commented out, console is lost after few suspends ?! */
783 printk(KERN_EMERG "%sSuspend failed, trying to recover...\n", name_suspend);
784 MDELAY(1000); /* So user can wait and report us messages if armageddon comes :-) */
788 spin_lock_irq(&suspend_pagedir_lock); /* Done to disable interrupts */
791 free_pages((unsigned long) pagedir_nosave, pagedir_order);
792 spin_unlock_irq(&suspend_pagedir_lock);
795 PRINTK( "Fixing swap signatures... " );
796 mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
801 * This is main interface to the outside world. It needs to be
802 * called from process context.
804 int software_suspend(void)
807 if (!software_suspend_enabled)
810 software_suspend_enabled = 0;
813 if (arch_prepare_suspend()) {
814 printk("%sArchitecture failed to prepare\n", name_suspend);
817 if (pm_prepare_console())
818 printk( "%sCan't allocate a console... proceeding\n", name_suspend);
819 if (!prepare_suspend_processes()) {
821 /* At this point, all user processes and "dangerous"
822 kernel threads are stopped. Free some memory, as we
823 need half of memory free. */
827 /* Save state of all device drivers, and stop them. */
828 if ((res = device_suspend(4))==0)
829 /* If stopping device drivers worked, we proceed basically into
830 * suspend_save_image.
832 * do_magic(0) returns after system is resumed.
834 * do_magic() copies all "used" memory to "free" memory, then
835 * unsuspends all device drivers, and writes memory to disk
836 * using normal kernel mechanism.
842 software_suspend_enabled = 1;
844 pm_restore_console();
848 /* More restore stuff */
850 /* FIXME: Why not memcpy(to, from, 1<<pagedir_order*PAGE_SIZE)? */
851 static void copy_pagedir(suspend_pagedir_t *to, suspend_pagedir_t *from)
854 char *topointer=(char *)to, *frompointer=(char *)from;
856 for(i=0; i < 1 << pagedir_order; i++) {
857 copy_page(topointer, frompointer);
858 topointer += PAGE_SIZE;
859 frompointer += PAGE_SIZE;
863 #define does_collide(addr) does_collide_order(pagedir_nosave, addr, 0)
866 * Returns true if given address/order collides with any orig_address
868 static int does_collide_order(suspend_pagedir_t *pagedir, unsigned long addr,
872 unsigned long addre = addr + (PAGE_SIZE<<order);
874 for(i=0; i < nr_copy_pages; i++)
875 if((pagedir+i)->orig_address >= addr &&
876 (pagedir+i)->orig_address < addre)
883 * We check here that pagedir & pages it points to won't collide with pages
884 * where we're going to restore from the loaded pages later
886 static int check_pagedir(void)
890 for(i=0; i < nr_copy_pages; i++) {
894 addr = get_zeroed_page(GFP_ATOMIC);
897 } while (does_collide(addr));
899 (pagedir_nosave+i)->address = addr;
904 static int relocate_pagedir(void)
907 * We have to avoid recursion (not to overflow kernel stack),
908 * and that's why code looks pretty cryptic
910 suspend_pagedir_t *new_pagedir, *old_pagedir = pagedir_nosave;
911 void **eaten_memory = NULL;
912 void **c = eaten_memory, *m, *f;
914 printk("Relocating pagedir");
916 if(!does_collide_order(old_pagedir, (unsigned long)old_pagedir, pagedir_order)) {
917 printk("not necessary\n");
921 while ((m = (void *) __get_free_pages(GFP_ATOMIC, pagedir_order))) {
922 memset(m, 0, PAGE_SIZE);
923 if (!does_collide_order(old_pagedir, (unsigned long)m, pagedir_order))
934 pagedir_nosave = new_pagedir = m;
935 copy_pagedir(new_pagedir, old_pagedir);
943 free_pages((unsigned long)f, pagedir_order);
950 * Sanity check if this image makes sense with this kernel/swap context
951 * I really don't think that it's foolproof but more than nothing..
954 static int sanity_check_failed(char *reason)
956 printk(KERN_ERR "%s%s\n", name_resume, reason);
960 static int sanity_check(struct suspend_header *sh)
962 if (sh->version_code != LINUX_VERSION_CODE)
963 return sanity_check_failed("Incorrect kernel version");
964 if (sh->num_physpages != num_physpages)
965 return sanity_check_failed("Incorrect memory size");
966 if (strncmp(sh->machine, system_utsname.machine, 8))
967 return sanity_check_failed("Incorrect machine type");
968 if (strncmp(sh->version, system_utsname.version, 20))
969 return sanity_check_failed("Incorrect version");
970 if (sh->num_cpus != num_online_cpus())
971 return sanity_check_failed("Incorrect number of cpus");
972 if (sh->page_size != PAGE_SIZE)
973 return sanity_check_failed("Incorrect PAGE_SIZE");
977 static int bdev_read_page(struct block_device *bdev, long pos, void *buf)
979 struct buffer_head *bh;
980 BUG_ON (pos%PAGE_SIZE);
981 bh = __bread(bdev, pos/PAGE_SIZE, PAGE_SIZE);
982 if (!bh || (!bh->b_data)) {
985 memcpy(buf, bh->b_data, PAGE_SIZE); /* FIXME: may need kmap() */
986 BUG_ON(!buffer_uptodate(bh));
991 static int bdev_write_page(struct block_device *bdev, long pos, void *buf)
994 struct buffer_head *bh;
995 BUG_ON (pos%PAGE_SIZE);
996 bh = __bread(bdev, pos/PAGE_SIZE, PAGE_SIZE);
997 if (!bh || (!bh->b_data)) {
1000 memcpy(bh->b_data, buf, PAGE_SIZE); /* FIXME: may need kmap() */
1001 BUG_ON(!buffer_uptodate(bh));
1002 generic_make_request(WRITE, bh);
1003 if (!buffer_uptodate(bh))
1004 printk(KERN_CRIT "%sWarning %s: Fixing swap signatures unsuccessful...\n", name_resume, resume_file);
1009 printk(KERN_CRIT "%sWarning %s: Fixing swap signatures unimplemented...\n", name_resume, resume_file);
1013 extern dev_t __init name_to_dev_t(const char *line);
1015 static int __init __read_suspend_image(struct block_device *bdev, union diskpage *cur, int noresume)
1018 int i, nr_pgdir_pages;
1020 #define PREPARENEXT \
1021 { next = cur->link.next; \
1022 next.val = swp_offset(next) * PAGE_SIZE; \
1025 if (bdev_read_page(bdev, 0, cur)) return -EIO;
1027 if ((!memcmp("SWAP-SPACE",cur->swh.magic.magic,10)) ||
1028 (!memcmp("SWAPSPACE2",cur->swh.magic.magic,10))) {
1029 printk(KERN_ERR "%sThis is normal swap space\n", name_resume );
1033 PREPARENEXT; /* We have to read next position before we overwrite it */
1035 if (!memcmp("S1",cur->swh.magic.magic,2))
1036 memcpy(cur->swh.magic.magic,"SWAP-SPACE",10);
1037 else if (!memcmp("S2",cur->swh.magic.magic,2))
1038 memcpy(cur->swh.magic.magic,"SWAPSPACE2",10);
1042 panic("%sUnable to find suspended-data signature (%.10s - misspelled?\n",
1043 name_resume, cur->swh.magic.magic);
1046 /* We don't do a sanity check here: we want to restore the swap
1047 whatever version of kernel made the suspend image;
1048 We need to write swap, but swap is *not* enabled so
1049 we must write the device directly */
1050 printk("%s: Fixing swap signatures %s...\n", name_resume, resume_file);
1051 bdev_write_page(bdev, 0, cur);
1054 printk( "%sSignature found, resuming\n", name_resume );
1057 if (bdev_read_page(bdev, next.val, cur)) return -EIO;
1058 if (sanity_check(&cur->sh)) /* Is this same machine? */
1062 pagedir_save = cur->sh.suspend_pagedir;
1063 nr_copy_pages = cur->sh.num_pbes;
1064 nr_pgdir_pages = SUSPEND_PD_PAGES(nr_copy_pages);
1065 pagedir_order = get_bitmask_order(nr_pgdir_pages);
1067 pagedir_nosave = (suspend_pagedir_t *)__get_free_pages(GFP_ATOMIC, pagedir_order);
1068 if (!pagedir_nosave)
1071 PRINTK( "%sReading pagedir, ", name_resume );
1073 /* We get pages in reverse order of saving! */
1074 for (i=nr_pgdir_pages-1; i>=0; i--) {
1076 cur = (union diskpage *)((char *) pagedir_nosave)+i;
1077 if (bdev_read_page(bdev, next.val, cur)) return -EIO;
1082 if (relocate_pagedir())
1084 if (check_pagedir())
1087 printk( "Reading image data (%d pages): ", nr_copy_pages );
1088 for(i=0; i < nr_copy_pages; i++) {
1089 swp_entry_t swap_address = (pagedir_nosave+i)->swap_address;
1092 /* You do not need to check for overlaps...
1093 ... check_pagedir already did this work */
1094 if (bdev_read_page(bdev, swp_offset(swap_address) * PAGE_SIZE, (char *)((pagedir_nosave+i)->address)))
1101 static int read_suspend_image(const char * specialfile, int noresume)
1103 union diskpage *cur;
1104 unsigned long scratch_page = 0;
1106 char b[BDEVNAME_SIZE];
1108 resume_device = name_to_dev_t(specialfile);
1109 scratch_page = get_zeroed_page(GFP_ATOMIC);
1110 cur = (void *) scratch_page;
1112 struct block_device *bdev;
1113 printk("Resuming from device %s\n",
1114 __bdevname(resume_device, b));
1115 bdev = open_by_devnum(resume_device, FMODE_READ);
1117 error = PTR_ERR(bdev);
1119 set_blocksize(bdev, PAGE_SIZE);
1120 error = __read_suspend_image(bdev, cur, noresume);
1123 } else error = -ENOMEM;
1126 free_page(scratch_page);
1129 PRINTK("Reading resume file was successful\n");
1134 printk( "%sI/O error\n", name_resume);
1137 printk( "%s%s: No such file or directory\n", name_resume, specialfile);
1140 printk( "%sNot enough memory\n", name_resume);
1143 printk( "%sError %d resuming\n", name_resume, error );
1150 * software_resume - Resume from a saved image.
1152 * Called as a late_initcall (so all devices are discovered and
1153 * initialized), we call swsusp to see if we have a saved image or not.
1154 * If so, we quiesce devices, then restore the saved image. We will
1155 * return above (in pm_suspend_disk() ) if everything goes well.
1156 * Otherwise, we fail gracefully and return to the normally
1157 * scheduled program.
1160 static int __init software_resume(void)
1162 if (num_online_cpus() > 1) {
1163 printk(KERN_WARNING "Software Suspend has malfunctioning SMP support. Disabled :(\n");
1166 /* We enable the possibility of machine suspend */
1167 software_suspend_enabled = 1;
1171 printk( "%s", name_resume );
1172 if (resume_status == NORESUME) {
1174 read_suspend_image(resume_file, 1);
1175 printk( "disabled\n" );
1180 if (pm_prepare_console())
1181 printk("swsusp: Can't allocate a console... proceeding\n");
1183 if (!resume_file[0] && resume_status == RESUME_SPECIFIED) {
1184 printk( "suspension device unspecified\n" );
1188 printk( "resuming from %s\n", resume_file);
1189 if (read_suspend_image(resume_file, 0))
1193 panic("This never returns");
1196 pm_restore_console();
1200 late_initcall(software_resume);
1202 static int __init resume_setup(char *str)
1204 if (resume_status == NORESUME)
1207 strncpy( resume_file, str, 255 );
1208 resume_status = RESUME_SPECIFIED;
1213 static int __init noresume_setup(char *str)
1215 resume_status = NORESUME;
1219 __setup("noresume", noresume_setup);
1220 __setup("resume=", resume_setup);
1222 EXPORT_SYMBOL(software_suspend);
1223 EXPORT_SYMBOL(software_suspend_enabled);