Home | History | Annotate | Download | only in syslinux
      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 
     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