111 lines
3.7 KiB
C
111 lines
3.7 KiB
C
#ifndef _SYSLINUX_MOVEBITS_H
|
|
#define _SYSLINUX_MOVEBITS_H
|
|
|
|
#include <inttypes.h>
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
|
|
typedef uint32_t addr_t;
|
|
|
|
/*
|
|
* A syslinux_movelist is a linked list of move operations. The ordering
|
|
* is important, so no sorting requirement can be imposed.
|
|
*/
|
|
struct syslinux_movelist {
|
|
addr_t dst;
|
|
addr_t src;
|
|
addr_t len;
|
|
struct syslinux_movelist *next;
|
|
};
|
|
|
|
/*
|
|
* A syslinux_memmap is a sorted, linked list of memory regions,
|
|
* guaranteed to satisfy the constraint that no adjacent zones have
|
|
* the same type. Undefined memory ranges are represented with entries;
|
|
* they have type SMT_UNDEFINED.
|
|
*
|
|
* Note that there is no length field. The length of a region is obtained
|
|
* by looking at the start of the next entry in the chain.
|
|
*/
|
|
enum syslinux_memmap_types {
|
|
SMT_ERROR = -2, /* Internal error token */
|
|
SMT_END = -1, /* End of list */
|
|
SMT_UNDEFINED = 0, /* Unknown range */
|
|
SMT_FREE = 1, /* Available memory */
|
|
SMT_RESERVED, /* Unusable memory */
|
|
SMT_ALLOC, /* Memory allocated by user */
|
|
SMT_ZERO, /* Memory that should be zeroed */
|
|
SMT_TERMINAL, /* Memory to be used as a last resort */
|
|
};
|
|
|
|
struct syslinux_memmap {
|
|
addr_t start;
|
|
enum syslinux_memmap_types type;
|
|
struct syslinux_memmap *next;
|
|
};
|
|
|
|
static inline bool valid_terminal_type(enum syslinux_memmap_types type)
|
|
{
|
|
return (type == SMT_FREE) || (type == SMT_TERMINAL);
|
|
}
|
|
|
|
/*
|
|
* moves is computed from "fraglist" and "memmap". Areas that are
|
|
* to be zeroed should be marked as such in the memmap, not in the
|
|
* fraglist.
|
|
*/
|
|
|
|
int syslinux_compute_movelist(struct syslinux_movelist **movelist,
|
|
struct syslinux_movelist *fraglist,
|
|
struct syslinux_memmap *memmap);
|
|
|
|
struct syslinux_memmap *syslinux_memory_map(void);
|
|
void syslinux_free_movelist(struct syslinux_movelist *);
|
|
int syslinux_add_movelist(struct syslinux_movelist **,
|
|
addr_t dst, addr_t src, addr_t len);
|
|
int syslinux_allocate_from_list(struct syslinux_movelist **freelist,
|
|
addr_t dst, addr_t len);
|
|
int syslinux_do_shuffle(struct syslinux_movelist *fraglist,
|
|
struct syslinux_memmap *memmap,
|
|
addr_t entry_point, addr_t entry_type,
|
|
uint16_t bootflags);
|
|
struct syslinux_memmap *syslinux_target_memmap(struct syslinux_movelist
|
|
*fraglist,
|
|
struct syslinux_memmap *memmap);
|
|
|
|
/* Operatons on struct syslinux_memmap */
|
|
struct syslinux_memmap *syslinux_init_memmap(void);
|
|
int syslinux_add_memmap(struct syslinux_memmap **list,
|
|
addr_t start, addr_t len,
|
|
enum syslinux_memmap_types type);
|
|
enum syslinux_memmap_types syslinux_memmap_type(struct syslinux_memmap *list,
|
|
addr_t start, addr_t len);
|
|
int syslinux_memmap_largest(struct syslinux_memmap *list,
|
|
enum syslinux_memmap_types type,
|
|
addr_t * start, addr_t * len);
|
|
int syslinux_memmap_highest(const struct syslinux_memmap *list,
|
|
enum syslinux_memmap_types types,
|
|
addr_t *start, addr_t len,
|
|
addr_t ceiling, addr_t align);
|
|
void syslinux_free_memmap(struct syslinux_memmap *list);
|
|
struct syslinux_memmap *syslinux_dup_memmap(struct syslinux_memmap *list);
|
|
int syslinux_memmap_find_type(struct syslinux_memmap *list,
|
|
enum syslinux_memmap_types type,
|
|
addr_t * start, addr_t * len, addr_t align);
|
|
int syslinux_memmap_find(struct syslinux_memmap *mmap,
|
|
addr_t *base, size_t size,
|
|
bool relocate, size_t align,
|
|
addr_t start_min, addr_t start_max,
|
|
addr_t end_min, addr_t end_max);
|
|
|
|
/* Debugging functions */
|
|
#ifdef DEBUG
|
|
void syslinux_dump_movelist(struct syslinux_movelist *ml);
|
|
void syslinux_dump_memmap(struct syslinux_memmap *memmap);
|
|
#else
|
|
#define syslinux_dump_movelist(x) ((void)0)
|
|
#define syslinux_dump_memmap(x) ((void)0)
|
|
#endif
|
|
|
|
#endif /* _SYSLINUX_MOVEBITS_H */
|