1 /* $OpenBSD: hibernate.h,v 1.39 2015/02/07 01:19:40 deraadt Exp $ */ 2 3 /* 4 * Copyright (c) 2011 Ariane van der Steldt <ariane@stack.nl> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #ifndef _SYS_HIBERNATE_H_ 20 #define _SYS_HIBERNATE_H_ 21 22 #include <sys/types.h> 23 #include <sys/tree.h> 24 #include <lib/libz/zlib.h> 25 #include <machine/vmparam.h> 26 27 #define HIBERNATE_CHUNK_USED 1 28 #define HIBERNATE_CHUNK_CONFLICT 2 29 #define HIBERNATE_CHUNK_PLACED 4 30 31 /* Magic number used to indicate hibernate signature block */ 32 #define HIBERNATE_MAGIC 0x0B5D0B5D 33 34 struct hiballoc_entry; 35 36 /* 37 * Allocator operates from an arena, that is pre-allocated by the caller. 38 */ 39 struct hiballoc_arena { 40 RB_HEAD(hiballoc_addr, hiballoc_entry) hib_addrs; 41 }; 42 43 /* 44 * Describes a zlib compression stream and its associated hiballoc area 45 */ 46 struct hibernate_zlib_state { 47 z_stream hib_stream; 48 struct hiballoc_arena hiballoc_arena; 49 }; 50 51 /* 52 * Describes a range of physical memory on the machine 53 */ 54 struct hibernate_memory_range { 55 paddr_t base; 56 paddr_t end; 57 }; 58 59 /* 60 * Describes a hibernate chunk structure, used when splitting the memory 61 * image of the machine into easy-to-manage pieces. 62 */ 63 struct hibernate_disk_chunk { 64 paddr_t base; /* Base of chunk */ 65 paddr_t end; /* End of chunk */ 66 daddr_t offset; /* Abs. disk block locating chunk */ 67 size_t compressed_size; /* Compressed size on disk */ 68 short flags; /* Flags */ 69 }; 70 71 #define HIB_INIT -1 72 #define HIB_DONE -2 73 #define HIB_R 0 74 #define HIB_W 1 75 typedef int (*hibio_fn)(dev_t, daddr_t, vaddr_t, size_t, int, void *); 76 77 /* 78 * Used to store information about the hibernation state of the machine, 79 * such as memory range count and extents, disk sector size, and various 80 * offsets where things are located on disk. 81 */ 82 union hibernate_info { 83 struct { 84 u_int32_t magic; 85 size_t nranges; 86 struct hibernate_memory_range ranges[VM_PHYSSEG_MAX]; 87 size_t image_size; 88 size_t chunk_ctr; 89 dev_t dev; 90 daddr_t sig_offset; 91 daddr_t chunktable_offset; 92 daddr_t image_offset; 93 paddr_t piglet_pa; 94 vaddr_t piglet_va; 95 char kernel_version[128]; 96 hibio_fn io_func; 97 void *io_page; 98 #ifndef NO_PROPOLICE 99 long guard; 100 #endif /* ! NO_PROPOLICE */ 101 }; 102 103 /* XXX - remove restriction to have this union fit in a single block */ 104 char pad[512]; /* Pad to 512 bytes */ 105 }; 106 107 void *hib_alloc(struct hiballoc_arena*, size_t); 108 void hib_free(struct hiballoc_arena*, void*); 109 int hiballoc_init(struct hiballoc_arena*, void*, size_t len); 110 void uvm_pmr_zero_everything(void); 111 void uvm_pmr_dirty_everything(void); 112 int uvm_pmr_alloc_pig(paddr_t*, psize_t, paddr_t); 113 int uvm_pmr_alloc_piglet(vaddr_t*, paddr_t*, vsize_t, paddr_t); 114 void uvm_pmr_free_piglet(vaddr_t, vsize_t); 115 int uvm_page_rle(paddr_t); 116 void uvmpd_hibernate(void); 117 118 hibio_fn get_hibernate_io_function(dev_t); 119 int get_hibernate_info(union hibernate_info *, int); 120 121 int hibernate_zlib_reset(union hibernate_info *, int); 122 void *hibernate_zlib_alloc(void *, int, int); 123 void hibernate_zlib_free(void *, void *); 124 void hibernate_inflate_region(union hibernate_info *, paddr_t, paddr_t, 125 size_t); 126 size_t hibernate_deflate(union hibernate_info *, paddr_t, size_t *); 127 void hibernate_process_chunk(union hibernate_info *, 128 struct hibernate_disk_chunk *, paddr_t); 129 int hibernate_inflate_page(int *); 130 131 int hibernate_block_io(union hibernate_info *, daddr_t, size_t, vaddr_t, int); 132 int hibernate_write_signature(union hibernate_info *); 133 int hibernate_write_chunktable(union hibernate_info *); 134 int hibernate_write_chunks(union hibernate_info *); 135 int hibernate_clear_signature(void); 136 int hibernate_compare_signature(union hibernate_info *, 137 union hibernate_info *); 138 void hibernate_resume(void); 139 int hibernate_suspend(void); 140 int hibernate_read_image(union hibernate_info *); 141 int hibernate_read_chunks(union hibernate_info *, paddr_t, paddr_t, size_t, 142 struct hibernate_disk_chunk *); 143 void hibernate_unpack_image(union hibernate_info *); 144 void hibernate_populate_resume_pt(union hibernate_info *, paddr_t, paddr_t); 145 int hibernate_alloc(void); 146 void hibernate_free(void); 147 void hib_getentropy(char **, size_t *); 148 149 void hibernate_sort_ranges(union hibernate_info *); 150 void hibernate_suspend_bufcache(void); 151 void hibernate_resume_bufcache(void); 152 153 #endif /* _SYS_HIBERNATE_H_ */ 154