1 /* $OpenBSD: hibernate.h,v 1.49 2025/01/13 17:50:54 krw 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 <crypto/sha2.h> 26 27 #define HIB_PHYSSEG_MAX 22 28 29 #define HIBERNATE_CHUNK_USED 1 30 #define HIBERNATE_CHUNK_CONFLICT 2 31 #define HIBERNATE_CHUNK_PLACED 4 32 33 /* Magic number used to indicate hibernate signature block */ 34 #define HIBERNATE_MAGIC 0x0B5D0B5D 35 36 /* Page skip operations used during unpack */ 37 #define HIB_MOVE 2 38 #define HIB_SKIP 1 39 40 struct hiballoc_entry; 41 42 /* 43 * Allocator operates from an arena, that is pre-allocated by the caller. 44 */ 45 struct hiballoc_arena { 46 RBT_HEAD(hiballoc_addr, hiballoc_entry) hib_addrs; 47 }; 48 49 /* 50 * Describes a zlib compression stream and its associated hiballoc area 51 */ 52 struct hibernate_zlib_state { 53 z_stream hib_stream; 54 struct hiballoc_arena hiballoc_arena; 55 }; 56 57 /* 58 * Describes a range of physical memory on the machine 59 */ 60 struct hibernate_memory_range { 61 paddr_t base; 62 paddr_t end; 63 }; 64 65 /* 66 * Describes a hibernate chunk structure, used when splitting the memory 67 * image of the machine into easy-to-manage pieces. 68 */ 69 struct hibernate_disk_chunk { 70 paddr_t base; /* Base of chunk */ 71 paddr_t end; /* End of chunk */ 72 daddr_t offset; /* Abs. disk block locating chunk */ 73 size_t compressed_size; /* Compressed size on disk */ 74 short flags; /* Flags */ 75 }; 76 77 #define HIB_INIT -1 78 #define HIB_DONE -2 79 #define HIB_R 0 80 #define HIB_W 1 81 typedef int (*hibio_fn)(dev_t, daddr_t, vaddr_t, size_t, int, void *); 82 83 /* 84 * Used to store information about the hibernation state of the machine, 85 * such as memory range count and extents, disk sector size, and various 86 * offsets where things are located on disk. 87 */ 88 union hibernate_info { 89 struct { 90 u_int32_t magic; 91 dev_t dev; 92 size_t nranges; 93 struct hibernate_memory_range ranges[HIB_PHYSSEG_MAX]; 94 size_t image_size; 95 size_t chunk_ctr; 96 daddr_t sig_offset; 97 daddr_t chunktable_offset; 98 daddr_t image_offset; 99 paddr_t piglet_pa; 100 vaddr_t piglet_va; 101 hibio_fn io_func; 102 void *io_page; 103 u_int8_t kern_hash[SHA256_DIGEST_LENGTH]; 104 #ifndef NO_PROPOLICE 105 long guard; 106 #endif /* ! NO_PROPOLICE */ 107 u_int32_t retguard_ofs; 108 u_int32_t sec_size; 109 }; 110 111 /* XXX - remove restriction to have the struct fit in a single block */ 112 char pad[4096]; /* Pad to largest allowable disk sector size in bytes */ 113 }; 114 115 void *hib_alloc(struct hiballoc_arena*, size_t); 116 void hib_free(struct hiballoc_arena*, void*); 117 int hiballoc_init(struct hiballoc_arena*, void*, size_t len); 118 void uvm_pmr_dirty_everything(void); 119 int uvm_pmr_alloc_pig(paddr_t*, psize_t, paddr_t); 120 int uvm_pmr_alloc_piglet(vaddr_t*, paddr_t*, vsize_t, paddr_t); 121 void uvm_pmr_free_piglet(vaddr_t, vsize_t); 122 int uvm_page_rle(paddr_t); 123 void uvmpd_hibernate(void); 124 125 hibio_fn get_hibernate_io_function(dev_t); 126 int get_hibernate_info(union hibernate_info *, int); 127 128 int hibernate_zlib_reset(union hibernate_info *, int); 129 void *hibernate_zlib_alloc(void *, int, int); 130 void hibernate_zlib_free(void *, void *); 131 void hibernate_inflate_region(union hibernate_info *, paddr_t, paddr_t, 132 size_t); 133 size_t hibernate_deflate(union hibernate_info *, paddr_t, size_t *); 134 void hibernate_process_chunk(union hibernate_info *, 135 struct hibernate_disk_chunk *, paddr_t); 136 int hibernate_inflate_page(int *); 137 138 int hibernate_block_io(union hibernate_info *, daddr_t, size_t, vaddr_t, int); 139 int hibernate_write_signature(union hibernate_info *); 140 int hibernate_write_chunktable(union hibernate_info *); 141 int hibernate_write_chunks(union hibernate_info *); 142 int hibernate_clear_signature(union hibernate_info *); 143 int hibernate_compare_signature(union hibernate_info *, 144 union hibernate_info *); 145 void hibernate_resume(void); 146 int hibernate_suspend(void); 147 int hibernate_read_image(union hibernate_info *); 148 int hibernate_read_chunks(union hibernate_info *, paddr_t, paddr_t, size_t, 149 struct hibernate_disk_chunk *); 150 void hibernate_unpack_image(union hibernate_info *); 151 void hibernate_populate_resume_pt(union hibernate_info *, paddr_t, paddr_t); 152 int hibernate_alloc(void); 153 void hibernate_free(void); 154 void hib_getentropy(char **, size_t *); 155 156 int hibernate_write(union hibernate_info *, daddr_t, vaddr_t, size_t, int); 157 void hibernate_sort_ranges(union hibernate_info *); 158 void hibernate_suspend_bufcache(void); 159 void hibernate_resume_bufcache(void); 160 161 #endif /* _SYS_HIBERNATE_H_ */ 162