1*a569c98aSkrw /* $OpenBSD: hibernate.h,v 1.49 2025/01/13 17:50:54 krw Exp $ */ 2088aa6daSariane 3088aa6daSariane /* 4088aa6daSariane * Copyright (c) 2011 Ariane van der Steldt <ariane@stack.nl> 5088aa6daSariane * 6088aa6daSariane * Permission to use, copy, modify, and distribute this software for any 7088aa6daSariane * purpose with or without fee is hereby granted, provided that the above 8088aa6daSariane * copyright notice and this permission notice appear in all copies. 9088aa6daSariane * 10088aa6daSariane * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11088aa6daSariane * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12088aa6daSariane * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13088aa6daSariane * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14088aa6daSariane * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15088aa6daSariane * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16088aa6daSariane * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17088aa6daSariane */ 18088aa6daSariane 19088aa6daSariane #ifndef _SYS_HIBERNATE_H_ 20088aa6daSariane #define _SYS_HIBERNATE_H_ 21088aa6daSariane 22088aa6daSariane #include <sys/types.h> 23088aa6daSariane #include <sys/tree.h> 2410aaff22Smlarkin #include <lib/libz/zlib.h> 25116c1678Smlarkin #include <crypto/sha2.h> 26116c1678Smlarkin 27116c1678Smlarkin #define HIB_PHYSSEG_MAX 22 2810aaff22Smlarkin 2910aaff22Smlarkin #define HIBERNATE_CHUNK_USED 1 3010aaff22Smlarkin #define HIBERNATE_CHUNK_CONFLICT 2 3110aaff22Smlarkin #define HIBERNATE_CHUNK_PLACED 4 32088aa6daSariane 3386840a47Smlarkin /* Magic number used to indicate hibernate signature block */ 3486840a47Smlarkin #define HIBERNATE_MAGIC 0x0B5D0B5D 3586840a47Smlarkin 3665052cacSmlarkin /* Page skip operations used during unpack */ 3765052cacSmlarkin #define HIB_MOVE 2 3865052cacSmlarkin #define HIB_SKIP 1 3965052cacSmlarkin 40088aa6daSariane struct hiballoc_entry; 41088aa6daSariane 42088aa6daSariane /* 43088aa6daSariane * Allocator operates from an arena, that is pre-allocated by the caller. 44088aa6daSariane */ 45e33b04c7Sderaadt struct hiballoc_arena { 46938d8250Sdlg RBT_HEAD(hiballoc_addr, hiballoc_entry) hib_addrs; 47088aa6daSariane }; 48088aa6daSariane 4910aaff22Smlarkin /* 5010aaff22Smlarkin * Describes a zlib compression stream and its associated hiballoc area 5110aaff22Smlarkin */ 5220703d53Smlarkin struct hibernate_zlib_state { 5310aaff22Smlarkin z_stream hib_stream; 5410aaff22Smlarkin struct hiballoc_arena hiballoc_arena; 5510aaff22Smlarkin }; 5610aaff22Smlarkin 5710aaff22Smlarkin /* 5810aaff22Smlarkin * Describes a range of physical memory on the machine 5910aaff22Smlarkin */ 6010aaff22Smlarkin struct hibernate_memory_range { 6110aaff22Smlarkin paddr_t base; 6210aaff22Smlarkin paddr_t end; 6310aaff22Smlarkin }; 6410aaff22Smlarkin 6510aaff22Smlarkin /* 6610aaff22Smlarkin * Describes a hibernate chunk structure, used when splitting the memory 6710aaff22Smlarkin * image of the machine into easy-to-manage pieces. 6810aaff22Smlarkin */ 6910aaff22Smlarkin struct hibernate_disk_chunk { 7010aaff22Smlarkin paddr_t base; /* Base of chunk */ 7110aaff22Smlarkin paddr_t end; /* End of chunk */ 7220703d53Smlarkin daddr_t offset; /* Abs. disk block locating chunk */ 7310aaff22Smlarkin size_t compressed_size; /* Compressed size on disk */ 7410aaff22Smlarkin short flags; /* Flags */ 7510aaff22Smlarkin }; 7610aaff22Smlarkin 7781e6fcfbSmlarkin #define HIB_INIT -1 7873cbb718Sderaadt #define HIB_DONE -2 7981e6fcfbSmlarkin #define HIB_R 0 8081e6fcfbSmlarkin #define HIB_W 1 81e33b04c7Sderaadt typedef int (*hibio_fn)(dev_t, daddr_t, vaddr_t, size_t, int, void *); 82e33b04c7Sderaadt 8310aaff22Smlarkin /* 8410aaff22Smlarkin * Used to store information about the hibernation state of the machine, 8510aaff22Smlarkin * such as memory range count and extents, disk sector size, and various 8610aaff22Smlarkin * offsets where things are located on disk. 8710aaff22Smlarkin */ 8810aaff22Smlarkin union hibernate_info { 8910aaff22Smlarkin struct { 9086840a47Smlarkin u_int32_t magic; 91116c1678Smlarkin dev_t dev; 9210aaff22Smlarkin size_t nranges; 93116c1678Smlarkin struct hibernate_memory_range ranges[HIB_PHYSSEG_MAX]; 9410aaff22Smlarkin size_t image_size; 9510aaff22Smlarkin size_t chunk_ctr; 9610aaff22Smlarkin daddr_t sig_offset; 97225caf62Sderaadt daddr_t chunktable_offset; 9810aaff22Smlarkin daddr_t image_offset; 9920703d53Smlarkin paddr_t piglet_pa; 10020703d53Smlarkin vaddr_t piglet_va; 101e33b04c7Sderaadt hibio_fn io_func; 10242015ed9Smlarkin void *io_page; 103116c1678Smlarkin u_int8_t kern_hash[SHA256_DIGEST_LENGTH]; 104bd831450Smlarkin #ifndef NO_PROPOLICE 105bd831450Smlarkin long guard; 106bd831450Smlarkin #endif /* ! NO_PROPOLICE */ 10765052cacSmlarkin u_int32_t retguard_ofs; 108fc6d48fdSkrw u_int32_t sec_size; 10910aaff22Smlarkin }; 11010aaff22Smlarkin 111fc6d48fdSkrw /* XXX - remove restriction to have the struct fit in a single block */ 112fc6d48fdSkrw char pad[4096]; /* Pad to largest allowable disk sector size in bytes */ 11310aaff22Smlarkin }; 11410aaff22Smlarkin 115088aa6daSariane void *hib_alloc(struct hiballoc_arena*, size_t); 116088aa6daSariane void hib_free(struct hiballoc_arena*, void*); 117088aa6daSariane int hiballoc_init(struct hiballoc_arena*, void*, size_t len); 1180547f1a4Sariane void uvm_pmr_dirty_everything(void); 119b0c80555Skettenis int uvm_pmr_alloc_pig(paddr_t*, psize_t, paddr_t); 12020703d53Smlarkin int uvm_pmr_alloc_piglet(vaddr_t*, paddr_t*, vsize_t, paddr_t); 12120703d53Smlarkin void uvm_pmr_free_piglet(vaddr_t, vsize_t); 12255d14f4eSmlarkin int uvm_page_rle(paddr_t); 123f5db0a1cSkettenis void uvmpd_hibernate(void); 124088aa6daSariane 1257b90f98fSmlarkin hibio_fn get_hibernate_io_function(dev_t); 12620703d53Smlarkin int get_hibernate_info(union hibernate_info *, int); 12710aaff22Smlarkin 12820703d53Smlarkin int hibernate_zlib_reset(union hibernate_info *, int); 12922378a8fSmlarkin void *hibernate_zlib_alloc(void *, int, int); 13022378a8fSmlarkin void hibernate_zlib_free(void *, void *); 1319783ed43Smlarkin void hibernate_inflate_region(union hibernate_info *, paddr_t, paddr_t, 1329783ed43Smlarkin size_t); 13320703d53Smlarkin size_t hibernate_deflate(union hibernate_info *, paddr_t, size_t *); 1349783ed43Smlarkin void hibernate_process_chunk(union hibernate_info *, 1359783ed43Smlarkin struct hibernate_disk_chunk *, paddr_t); 1367882bc75Smlarkin int hibernate_inflate_page(int *); 13722378a8fSmlarkin 13889fc03e5Sjmatthew int hibernate_block_io(union hibernate_info *, daddr_t, size_t, vaddr_t, int); 139627cf4e5Smlarkin int hibernate_write_signature(union hibernate_info *); 14020703d53Smlarkin int hibernate_write_chunktable(union hibernate_info *); 14120703d53Smlarkin int hibernate_write_chunks(union hibernate_info *); 1428cae4923Sguenther int hibernate_clear_signature(union hibernate_info *); 143b514ebc1Smlarkin int hibernate_compare_signature(union hibernate_info *, 144b514ebc1Smlarkin union hibernate_info *); 14520703d53Smlarkin void hibernate_resume(void); 14620703d53Smlarkin int hibernate_suspend(void); 14720703d53Smlarkin int hibernate_read_image(union hibernate_info *); 14890f353dfSmlarkin int hibernate_read_chunks(union hibernate_info *, paddr_t, paddr_t, size_t, 14990f353dfSmlarkin struct hibernate_disk_chunk *); 15020703d53Smlarkin void hibernate_unpack_image(union hibernate_info *); 15120703d53Smlarkin void hibernate_populate_resume_pt(union hibernate_info *, paddr_t, paddr_t); 152b0c80555Skettenis int hibernate_alloc(void); 15395e3d60bSmlarkin void hibernate_free(void); 15487dd1dd0Sderaadt void hib_getentropy(char **, size_t *); 155627cf4e5Smlarkin 1569783fa9dSkrw int hibernate_write(union hibernate_info *, daddr_t, vaddr_t, size_t, int); 15708170551Smlarkin void hibernate_sort_ranges(union hibernate_info *); 15822433bb6Smlarkin void hibernate_suspend_bufcache(void); 15922433bb6Smlarkin void hibernate_resume_bufcache(void); 160627cf4e5Smlarkin 161088aa6daSariane #endif /* _SYS_HIBERNATE_H_ */ 162