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