1 #ifndef _SYSLINUX_MOVEBITS_H
2 #define _SYSLINUX_MOVEBITS_H
3
4 #include <inttypes.h>
5 #include <stdio.h>
6 #include <stdbool.h>
7
8 typedef uint32_t addr_t;
9
10 /*
11 * A syslinux_movelist is a linked list of move operations. The ordering
12 * is important, so no sorting requirement can be imposed.
13 */
14 struct syslinux_movelist {
15 addr_t dst;
16 addr_t src;
17 addr_t len;
18 struct syslinux_movelist *next;
19 };
20
21 /*
22 * A syslinux_memmap is a sorted, linked list of memory regions,
23 * guaranteed to satisfy the constraint that no adjacent zones have
24 * the same type. Undefined memory ranges are represented with entries;
25 * they have type SMT_UNDEFINED.
26 *
27 * Note that there is no length field. The length of a region is obtained
28 * by looking at the start of the next entry in the chain.
29 */
30 enum syslinux_memmap_types {
31 SMT_ERROR = -2, /* Internal error token */
32 SMT_END = -1, /* End of list */
33 SMT_UNDEFINED = 0, /* Unknown range */
34 SMT_FREE = 1, /* Available memory */
35 SMT_RESERVED, /* Unusable memory */
36 SMT_ALLOC, /* Memory allocated by user */
37 SMT_ZERO, /* Memory that should be zeroed */
38 SMT_TERMINAL, /* Memory to be used as a last resort */
39 };
40
41 struct syslinux_memmap {
42 addr_t start;
43 enum syslinux_memmap_types type;
44 struct syslinux_memmap *next;
45 };
46
valid_terminal_type(enum syslinux_memmap_types type)47 static inline bool valid_terminal_type(enum syslinux_memmap_types type)
48 {
49 return (type == SMT_FREE) || (type == SMT_TERMINAL);
50 }
51
52 /*
53 * moves is computed from "fraglist" and "memmap". Areas that are
54 * to be zeroed should be marked as such in the memmap, not in the
55 * fraglist.
56 */
57
58 int syslinux_compute_movelist(struct syslinux_movelist **movelist,
59 struct syslinux_movelist *fraglist,
60 struct syslinux_memmap *memmap);
61
62 struct syslinux_memmap *syslinux_memory_map(void);
63 void syslinux_free_movelist(struct syslinux_movelist *);
64 int syslinux_add_movelist(struct syslinux_movelist **,
65 addr_t dst, addr_t src, addr_t len);
66 int syslinux_allocate_from_list(struct syslinux_movelist **freelist,
67 addr_t dst, addr_t len);
68 int syslinux_do_shuffle(struct syslinux_movelist *fraglist,
69 struct syslinux_memmap *memmap,
70 addr_t entry_point, addr_t entry_type,
71 uint16_t bootflags);
72 struct syslinux_memmap *syslinux_target_memmap(struct syslinux_movelist
73 *fraglist,
74 struct syslinux_memmap *memmap);
75
76 /* Operatons on struct syslinux_memmap */
77 struct syslinux_memmap *syslinux_init_memmap(void);
78 int syslinux_add_memmap(struct syslinux_memmap **list,
79 addr_t start, addr_t len,
80 enum syslinux_memmap_types type);
81 enum syslinux_memmap_types syslinux_memmap_type(struct syslinux_memmap *list,
82 addr_t start, addr_t len);
83 int syslinux_memmap_largest(struct syslinux_memmap *list,
84 enum syslinux_memmap_types type,
85 addr_t * start, addr_t * len);
86 int syslinux_memmap_highest(const struct syslinux_memmap *list,
87 enum syslinux_memmap_types types,
88 addr_t *start, addr_t len,
89 addr_t ceiling, addr_t align);
90 void syslinux_free_memmap(struct syslinux_memmap *list);
91 struct syslinux_memmap *syslinux_dup_memmap(struct syslinux_memmap *list);
92 int syslinux_memmap_find_type(struct syslinux_memmap *list,
93 enum syslinux_memmap_types type,
94 addr_t * start, addr_t * len, addr_t align);
95 int syslinux_memmap_find(struct syslinux_memmap *mmap,
96 addr_t *base, size_t size,
97 bool relocate, size_t align,
98 addr_t start_min, addr_t start_max,
99 addr_t end_min, addr_t end_max);
100
101 /* Debugging functions */
102 #ifdef DEBUG
103 void syslinux_dump_movelist(struct syslinux_movelist *ml);
104 void syslinux_dump_memmap(struct syslinux_memmap *memmap);
105 #else
106 #define syslinux_dump_movelist(x) ((void)0)
107 #define syslinux_dump_memmap(x) ((void)0)
108 #endif
109
110 #endif /* _SYSLINUX_MOVEBITS_H */
111