xref: /openbsd-src/sys/sys/hibernate.h (revision a569c98a1ad05028090455ed480458172c0f9cf8)
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