1*4882a593Smuzhiyun===================================================== 2*4882a593SmuzhiyunDocumentation for userland software suspend interface 3*4882a593Smuzhiyun===================================================== 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun (C) 2006 Rafael J. Wysocki <rjw@sisk.pl> 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunFirst, the warnings at the beginning of swsusp.txt still apply. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSecond, you should read the FAQ in swsusp.txt _now_ if you have not 10*4882a593Smuzhiyundone it already. 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunNow, to use the userland interface for software suspend you need special 13*4882a593Smuzhiyunutilities that will read/write the system memory snapshot from/to the 14*4882a593Smuzhiyunkernel. Such utilities are available, for example, from 15*4882a593Smuzhiyun<http://suspend.sourceforge.net>. You may want to have a look at them if you 16*4882a593Smuzhiyunare going to develop your own suspend/resume utilities. 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunThe interface consists of a character device providing the open(), 19*4882a593Smuzhiyunrelease(), read(), and write() operations as well as several ioctl() 20*4882a593Smuzhiyuncommands defined in include/linux/suspend_ioctls.h . The major and minor 21*4882a593Smuzhiyunnumbers of the device are, respectively, 10 and 231, and they can 22*4882a593Smuzhiyunbe read from /sys/class/misc/snapshot/dev. 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunThe device can be open either for reading or for writing. If open for 25*4882a593Smuzhiyunreading, it is considered to be in the suspend mode. Otherwise it is 26*4882a593Smuzhiyunassumed to be in the resume mode. The device cannot be open for simultaneous 27*4882a593Smuzhiyunreading and writing. It is also impossible to have the device open more than 28*4882a593Smuzhiyunonce at a time. 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunEven opening the device has side effects. Data structures are 31*4882a593Smuzhiyunallocated, and PM_HIBERNATION_PREPARE / PM_RESTORE_PREPARE chains are 32*4882a593Smuzhiyuncalled. 33*4882a593Smuzhiyun 34*4882a593SmuzhiyunThe ioctl() commands recognized by the device are: 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunSNAPSHOT_FREEZE 37*4882a593Smuzhiyun freeze user space processes (the current process is 38*4882a593Smuzhiyun not frozen); this is required for SNAPSHOT_CREATE_IMAGE 39*4882a593Smuzhiyun and SNAPSHOT_ATOMIC_RESTORE to succeed 40*4882a593Smuzhiyun 41*4882a593SmuzhiyunSNAPSHOT_UNFREEZE 42*4882a593Smuzhiyun thaw user space processes frozen by SNAPSHOT_FREEZE 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunSNAPSHOT_CREATE_IMAGE 45*4882a593Smuzhiyun create a snapshot of the system memory; the 46*4882a593Smuzhiyun last argument of ioctl() should be a pointer to an int variable, 47*4882a593Smuzhiyun the value of which will indicate whether the call returned after 48*4882a593Smuzhiyun creating the snapshot (1) or after restoring the system memory state 49*4882a593Smuzhiyun from it (0) (after resume the system finds itself finishing the 50*4882a593Smuzhiyun SNAPSHOT_CREATE_IMAGE ioctl() again); after the snapshot 51*4882a593Smuzhiyun has been created the read() operation can be used to transfer 52*4882a593Smuzhiyun it out of the kernel 53*4882a593Smuzhiyun 54*4882a593SmuzhiyunSNAPSHOT_ATOMIC_RESTORE 55*4882a593Smuzhiyun restore the system memory state from the 56*4882a593Smuzhiyun uploaded snapshot image; before calling it you should transfer 57*4882a593Smuzhiyun the system memory snapshot back to the kernel using the write() 58*4882a593Smuzhiyun operation; this call will not succeed if the snapshot 59*4882a593Smuzhiyun image is not available to the kernel 60*4882a593Smuzhiyun 61*4882a593SmuzhiyunSNAPSHOT_FREE 62*4882a593Smuzhiyun free memory allocated for the snapshot image 63*4882a593Smuzhiyun 64*4882a593SmuzhiyunSNAPSHOT_PREF_IMAGE_SIZE 65*4882a593Smuzhiyun set the preferred maximum size of the image 66*4882a593Smuzhiyun (the kernel will do its best to ensure the image size will not exceed 67*4882a593Smuzhiyun this number, but if it turns out to be impossible, the kernel will 68*4882a593Smuzhiyun create the smallest image possible) 69*4882a593Smuzhiyun 70*4882a593SmuzhiyunSNAPSHOT_GET_IMAGE_SIZE 71*4882a593Smuzhiyun return the actual size of the hibernation image 72*4882a593Smuzhiyun (the last argument should be a pointer to a loff_t variable that 73*4882a593Smuzhiyun will contain the result if the call is successful) 74*4882a593Smuzhiyun 75*4882a593SmuzhiyunSNAPSHOT_AVAIL_SWAP_SIZE 76*4882a593Smuzhiyun return the amount of available swap in bytes 77*4882a593Smuzhiyun (the last argument should be a pointer to a loff_t variable that 78*4882a593Smuzhiyun will contain the result if the call is successful) 79*4882a593Smuzhiyun 80*4882a593SmuzhiyunSNAPSHOT_ALLOC_SWAP_PAGE 81*4882a593Smuzhiyun allocate a swap page from the resume partition 82*4882a593Smuzhiyun (the last argument should be a pointer to a loff_t variable that 83*4882a593Smuzhiyun will contain the swap page offset if the call is successful) 84*4882a593Smuzhiyun 85*4882a593SmuzhiyunSNAPSHOT_FREE_SWAP_PAGES 86*4882a593Smuzhiyun free all swap pages allocated by 87*4882a593Smuzhiyun SNAPSHOT_ALLOC_SWAP_PAGE 88*4882a593Smuzhiyun 89*4882a593SmuzhiyunSNAPSHOT_SET_SWAP_AREA 90*4882a593Smuzhiyun set the resume partition and the offset (in <PAGE_SIZE> 91*4882a593Smuzhiyun units) from the beginning of the partition at which the swap header is 92*4882a593Smuzhiyun located (the last ioctl() argument should point to a struct 93*4882a593Smuzhiyun resume_swap_area, as defined in kernel/power/suspend_ioctls.h, 94*4882a593Smuzhiyun containing the resume device specification and the offset); for swap 95*4882a593Smuzhiyun partitions the offset is always 0, but it is different from zero for 96*4882a593Smuzhiyun swap files (see Documentation/power/swsusp-and-swap-files.rst for 97*4882a593Smuzhiyun details). 98*4882a593Smuzhiyun 99*4882a593SmuzhiyunSNAPSHOT_PLATFORM_SUPPORT 100*4882a593Smuzhiyun enable/disable the hibernation platform support, 101*4882a593Smuzhiyun depending on the argument value (enable, if the argument is nonzero) 102*4882a593Smuzhiyun 103*4882a593SmuzhiyunSNAPSHOT_POWER_OFF 104*4882a593Smuzhiyun make the kernel transition the system to the hibernation 105*4882a593Smuzhiyun state (eg. ACPI S4) using the platform (eg. ACPI) driver 106*4882a593Smuzhiyun 107*4882a593SmuzhiyunSNAPSHOT_S2RAM 108*4882a593Smuzhiyun suspend to RAM; using this call causes the kernel to 109*4882a593Smuzhiyun immediately enter the suspend-to-RAM state, so this call must always 110*4882a593Smuzhiyun be preceded by the SNAPSHOT_FREEZE call and it is also necessary 111*4882a593Smuzhiyun to use the SNAPSHOT_UNFREEZE call after the system wakes up. This call 112*4882a593Smuzhiyun is needed to implement the suspend-to-both mechanism in which the 113*4882a593Smuzhiyun suspend image is first created, as though the system had been suspended 114*4882a593Smuzhiyun to disk, and then the system is suspended to RAM (this makes it possible 115*4882a593Smuzhiyun to resume the system from RAM if there's enough battery power or restore 116*4882a593Smuzhiyun its state on the basis of the saved suspend image otherwise) 117*4882a593Smuzhiyun 118*4882a593SmuzhiyunThe device's read() operation can be used to transfer the snapshot image from 119*4882a593Smuzhiyunthe kernel. It has the following limitations: 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun- you cannot read() more than one virtual memory page at a time 122*4882a593Smuzhiyun- read()s across page boundaries are impossible (ie. if you read() 1/2 of 123*4882a593Smuzhiyun a page in the previous call, you will only be able to read() 124*4882a593Smuzhiyun **at most** 1/2 of the page in the next call) 125*4882a593Smuzhiyun 126*4882a593SmuzhiyunThe device's write() operation is used for uploading the system memory snapshot 127*4882a593Smuzhiyuninto the kernel. It has the same limitations as the read() operation. 128*4882a593Smuzhiyun 129*4882a593SmuzhiyunThe release() operation frees all memory allocated for the snapshot image 130*4882a593Smuzhiyunand all swap pages allocated with SNAPSHOT_ALLOC_SWAP_PAGE (if any). 131*4882a593SmuzhiyunThus it is not necessary to use either SNAPSHOT_FREE or 132*4882a593SmuzhiyunSNAPSHOT_FREE_SWAP_PAGES before closing the device (in fact it will also 133*4882a593Smuzhiyununfreeze user space processes frozen by SNAPSHOT_UNFREEZE if they are 134*4882a593Smuzhiyunstill frozen when the device is being closed). 135*4882a593Smuzhiyun 136*4882a593SmuzhiyunCurrently it is assumed that the userland utilities reading/writing the 137*4882a593Smuzhiyunsnapshot image from/to the kernel will use a swap partition, called the resume 138*4882a593Smuzhiyunpartition, or a swap file as storage space (if a swap file is used, the resume 139*4882a593Smuzhiyunpartition is the partition that holds this file). However, this is not really 140*4882a593Smuzhiyunrequired, as they can use, for example, a special (blank) suspend partition or 141*4882a593Smuzhiyuna file on a partition that is unmounted before SNAPSHOT_CREATE_IMAGE and 142*4882a593Smuzhiyunmounted afterwards. 143*4882a593Smuzhiyun 144*4882a593SmuzhiyunThese utilities MUST NOT make any assumptions regarding the ordering of 145*4882a593Smuzhiyundata within the snapshot image. The contents of the image are entirely owned 146*4882a593Smuzhiyunby the kernel and its structure may be changed in future kernel releases. 147*4882a593Smuzhiyun 148*4882a593SmuzhiyunThe snapshot image MUST be written to the kernel unaltered (ie. all of the image 149*4882a593Smuzhiyundata, metadata and header MUST be written in _exactly_ the same amount, form 150*4882a593Smuzhiyunand order in which they have been read). Otherwise, the behavior of the 151*4882a593Smuzhiyunresumed system may be totally unpredictable. 152*4882a593Smuzhiyun 153*4882a593SmuzhiyunWhile executing SNAPSHOT_ATOMIC_RESTORE the kernel checks if the 154*4882a593Smuzhiyunstructure of the snapshot image is consistent with the information stored 155*4882a593Smuzhiyunin the image header. If any inconsistencies are detected, 156*4882a593SmuzhiyunSNAPSHOT_ATOMIC_RESTORE will not succeed. Still, this is not a fool-proof 157*4882a593Smuzhiyunmechanism and the userland utilities using the interface SHOULD use additional 158*4882a593Smuzhiyunmeans, such as checksums, to ensure the integrity of the snapshot image. 159*4882a593Smuzhiyun 160*4882a593SmuzhiyunThe suspending and resuming utilities MUST lock themselves in memory, 161*4882a593Smuzhiyunpreferably using mlockall(), before calling SNAPSHOT_FREEZE. 162*4882a593Smuzhiyun 163*4882a593SmuzhiyunThe suspending utility MUST check the value stored by SNAPSHOT_CREATE_IMAGE 164*4882a593Smuzhiyunin the memory location pointed to by the last argument of ioctl() and proceed 165*4882a593Smuzhiyunin accordance with it: 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun1. If the value is 1 (ie. the system memory snapshot has just been 168*4882a593Smuzhiyun created and the system is ready for saving it): 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun (a) The suspending utility MUST NOT close the snapshot device 171*4882a593Smuzhiyun _unless_ the whole suspend procedure is to be cancelled, in 172*4882a593Smuzhiyun which case, if the snapshot image has already been saved, the 173*4882a593Smuzhiyun suspending utility SHOULD destroy it, preferably by zapping 174*4882a593Smuzhiyun its header. If the suspend is not to be cancelled, the 175*4882a593Smuzhiyun system MUST be powered off or rebooted after the snapshot 176*4882a593Smuzhiyun image has been saved. 177*4882a593Smuzhiyun (b) The suspending utility SHOULD NOT attempt to perform any 178*4882a593Smuzhiyun file system operations (including reads) on the file systems 179*4882a593Smuzhiyun that were mounted before SNAPSHOT_CREATE_IMAGE has been 180*4882a593Smuzhiyun called. However, it MAY mount a file system that was not 181*4882a593Smuzhiyun mounted at that time and perform some operations on it (eg. 182*4882a593Smuzhiyun use it for saving the image). 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun2. If the value is 0 (ie. the system state has just been restored from 185*4882a593Smuzhiyun the snapshot image), the suspending utility MUST close the snapshot 186*4882a593Smuzhiyun device. Afterwards it will be treated as a regular userland process, 187*4882a593Smuzhiyun so it need not exit. 188*4882a593Smuzhiyun 189*4882a593SmuzhiyunThe resuming utility SHOULD NOT attempt to mount any file systems that could 190*4882a593Smuzhiyunbe mounted before suspend and SHOULD NOT attempt to perform any operations 191*4882a593Smuzhiyuninvolving such file systems. 192*4882a593Smuzhiyun 193*4882a593SmuzhiyunFor details, please refer to the source code. 194