cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dtc.h (9819B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2#ifndef DTC_H
      3#define DTC_H
      4
      5/*
      6 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
      7 */
      8
      9#include <stdio.h>
     10#include <string.h>
     11#include <stdlib.h>
     12#include <stdint.h>
     13#include <stdbool.h>
     14#include <stdarg.h>
     15#include <assert.h>
     16#include <ctype.h>
     17#include <errno.h>
     18#include <unistd.h>
     19#include <inttypes.h>
     20
     21#include <libfdt_env.h>
     22#include <fdt.h>
     23
     24#include "util.h"
     25
     26#ifdef DEBUG
     27#define debug(...)	printf(__VA_ARGS__)
     28#else
     29#define debug(...)
     30#endif
     31
     32#define DEFAULT_FDT_VERSION	17
     33
     34/*
     35 * Command line options
     36 */
     37extern int quiet;		/* Level of quietness */
     38extern unsigned int reservenum;	/* Number of memory reservation slots */
     39extern int minsize;		/* Minimum blob size */
     40extern int padsize;		/* Additional padding to blob */
     41extern int alignsize;		/* Additional padding to blob accroding to the alignsize */
     42extern int phandle_format;	/* Use linux,phandle or phandle properties */
     43extern int generate_symbols;	/* generate symbols for nodes with labels */
     44extern int generate_fixups;	/* generate fixups */
     45extern int auto_label_aliases;	/* auto generate labels -> aliases */
     46extern int annotate;		/* annotate .dts with input source location */
     47
     48#define PHANDLE_LEGACY	0x1
     49#define PHANDLE_EPAPR	0x2
     50#define PHANDLE_BOTH	0x3
     51
     52typedef uint32_t cell_t;
     53
     54static inline bool phandle_is_valid(cell_t phandle)
     55{
     56	return phandle != 0 && phandle != ~0U;
     57}
     58
     59static inline uint16_t dtb_ld16(const void *p)
     60{
     61	const uint8_t *bp = (const uint8_t *)p;
     62
     63	return ((uint16_t)bp[0] << 8)
     64		| bp[1];
     65}
     66
     67static inline uint32_t dtb_ld32(const void *p)
     68{
     69	const uint8_t *bp = (const uint8_t *)p;
     70
     71	return ((uint32_t)bp[0] << 24)
     72		| ((uint32_t)bp[1] << 16)
     73		| ((uint32_t)bp[2] << 8)
     74		| bp[3];
     75}
     76
     77static inline uint64_t dtb_ld64(const void *p)
     78{
     79	const uint8_t *bp = (const uint8_t *)p;
     80
     81	return ((uint64_t)bp[0] << 56)
     82		| ((uint64_t)bp[1] << 48)
     83		| ((uint64_t)bp[2] << 40)
     84		| ((uint64_t)bp[3] << 32)
     85		| ((uint64_t)bp[4] << 24)
     86		| ((uint64_t)bp[5] << 16)
     87		| ((uint64_t)bp[6] << 8)
     88		| bp[7];
     89}
     90
     91#define streq(a, b)	(strcmp((a), (b)) == 0)
     92#define strstarts(s, prefix)	(strncmp((s), (prefix), strlen(prefix)) == 0)
     93#define strprefixeq(a, n, b)	(strlen(b) == (n) && (memcmp(a, b, n) == 0))
     94static inline bool strends(const char *str, const char *suffix)
     95{
     96	unsigned int len, suffix_len;
     97
     98	len = strlen(str);
     99	suffix_len = strlen(suffix);
    100	if (len < suffix_len)
    101		return false;
    102	return streq(str + len - suffix_len, suffix);
    103}
    104
    105#define ALIGN(x, a)	(((x) + (a) - 1) & ~((a) - 1))
    106
    107/* Data blobs */
    108enum markertype {
    109	TYPE_NONE,
    110	REF_PHANDLE,
    111	REF_PATH,
    112	LABEL,
    113	TYPE_UINT8,
    114	TYPE_UINT16,
    115	TYPE_UINT32,
    116	TYPE_UINT64,
    117	TYPE_STRING,
    118};
    119
    120static inline bool is_type_marker(enum markertype type)
    121{
    122	return type >= TYPE_UINT8;
    123}
    124
    125extern const char *markername(enum markertype markertype);
    126
    127struct  marker {
    128	enum markertype type;
    129	unsigned int offset;
    130	char *ref;
    131	struct marker *next;
    132};
    133
    134struct data {
    135	unsigned int len;
    136	char *val;
    137	struct marker *markers;
    138};
    139
    140
    141#define empty_data ((struct data){ 0 /* all .members = 0 or NULL */ })
    142
    143#define for_each_marker(m) \
    144	for (; (m); (m) = (m)->next)
    145#define for_each_marker_of_type(m, t) \
    146	for_each_marker(m) \
    147		if ((m)->type == (t))
    148
    149static inline struct marker *next_type_marker(struct marker *m)
    150{
    151	for_each_marker(m)
    152		if (is_type_marker(m->type))
    153			break;
    154	return m;
    155}
    156
    157static inline size_t type_marker_length(struct marker *m)
    158{
    159	struct marker *next = next_type_marker(m->next);
    160
    161	if (next)
    162		return next->offset - m->offset;
    163	return 0;
    164}
    165
    166void data_free(struct data d);
    167
    168struct data data_grow_for(struct data d, unsigned int xlen);
    169
    170struct data data_copy_mem(const char *mem, int len);
    171struct data data_copy_escape_string(const char *s, int len);
    172struct data data_copy_file(FILE *f, size_t len);
    173
    174struct data data_append_data(struct data d, const void *p, int len);
    175struct data data_insert_at_marker(struct data d, struct marker *m,
    176				  const void *p, int len);
    177struct data data_merge(struct data d1, struct data d2);
    178struct data data_append_cell(struct data d, cell_t word);
    179struct data data_append_integer(struct data d, uint64_t word, int bits);
    180struct data data_append_re(struct data d, uint64_t address, uint64_t size);
    181struct data data_append_addr(struct data d, uint64_t addr);
    182struct data data_append_byte(struct data d, uint8_t byte);
    183struct data data_append_zeroes(struct data d, int len);
    184struct data data_append_align(struct data d, int align);
    185
    186struct data data_add_marker(struct data d, enum markertype type, char *ref);
    187
    188bool data_is_one_string(struct data d);
    189
    190/* DT constraints */
    191
    192#define MAX_PROPNAME_LEN	31
    193#define MAX_NODENAME_LEN	31
    194
    195/* Live trees */
    196struct label {
    197	bool deleted;
    198	char *label;
    199	struct label *next;
    200};
    201
    202struct bus_type {
    203	const char *name;
    204};
    205
    206struct property {
    207	bool deleted;
    208	char *name;
    209	struct data val;
    210
    211	struct property *next;
    212
    213	struct label *labels;
    214	struct srcpos *srcpos;
    215};
    216
    217struct node {
    218	bool deleted;
    219	char *name;
    220	struct property *proplist;
    221	struct node *children;
    222
    223	struct node *parent;
    224	struct node *next_sibling;
    225
    226	char *fullpath;
    227	int basenamelen;
    228
    229	cell_t phandle;
    230	int addr_cells, size_cells;
    231
    232	struct label *labels;
    233	const struct bus_type *bus;
    234	struct srcpos *srcpos;
    235
    236	bool omit_if_unused, is_referenced;
    237};
    238
    239#define for_each_label_withdel(l0, l) \
    240	for ((l) = (l0); (l); (l) = (l)->next)
    241
    242#define for_each_label(l0, l) \
    243	for_each_label_withdel(l0, l) \
    244		if (!(l)->deleted)
    245
    246#define for_each_property_withdel(n, p) \
    247	for ((p) = (n)->proplist; (p); (p) = (p)->next)
    248
    249#define for_each_property(n, p) \
    250	for_each_property_withdel(n, p) \
    251		if (!(p)->deleted)
    252
    253#define for_each_child_withdel(n, c) \
    254	for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
    255
    256#define for_each_child(n, c) \
    257	for_each_child_withdel(n, c) \
    258		if (!(c)->deleted)
    259
    260void add_label(struct label **labels, char *label);
    261void delete_labels(struct label **labels);
    262
    263struct property *build_property(char *name, struct data val,
    264				struct srcpos *srcpos);
    265struct property *build_property_delete(char *name);
    266struct property *chain_property(struct property *first, struct property *list);
    267struct property *reverse_properties(struct property *first);
    268
    269struct node *build_node(struct property *proplist, struct node *children,
    270			struct srcpos *srcpos);
    271struct node *build_node_delete(struct srcpos *srcpos);
    272struct node *name_node(struct node *node, char *name);
    273struct node *omit_node_if_unused(struct node *node);
    274struct node *reference_node(struct node *node);
    275struct node *chain_node(struct node *first, struct node *list);
    276struct node *merge_nodes(struct node *old_node, struct node *new_node);
    277struct node *add_orphan_node(struct node *old_node, struct node *new_node, char *ref);
    278
    279void add_property(struct node *node, struct property *prop);
    280void delete_property_by_name(struct node *node, char *name);
    281void delete_property(struct property *prop);
    282void add_child(struct node *parent, struct node *child);
    283void delete_node_by_name(struct node *parent, char *name);
    284void delete_node(struct node *node);
    285void append_to_property(struct node *node,
    286			char *name, const void *data, int len,
    287			enum markertype type);
    288
    289const char *get_unitname(struct node *node);
    290struct property *get_property(struct node *node, const char *propname);
    291cell_t propval_cell(struct property *prop);
    292cell_t propval_cell_n(struct property *prop, unsigned int n);
    293struct property *get_property_by_label(struct node *tree, const char *label,
    294				       struct node **node);
    295struct marker *get_marker_label(struct node *tree, const char *label,
    296				struct node **node, struct property **prop);
    297struct node *get_subnode(struct node *node, const char *nodename);
    298struct node *get_node_by_path(struct node *tree, const char *path);
    299struct node *get_node_by_label(struct node *tree, const char *label);
    300struct node *get_node_by_phandle(struct node *tree, cell_t phandle);
    301struct node *get_node_by_ref(struct node *tree, const char *ref);
    302cell_t get_node_phandle(struct node *root, struct node *node);
    303
    304uint32_t guess_boot_cpuid(struct node *tree);
    305
    306/* Boot info (tree plus memreserve information */
    307
    308struct reserve_info {
    309	uint64_t address, size;
    310
    311	struct reserve_info *next;
    312
    313	struct label *labels;
    314};
    315
    316struct reserve_info *build_reserve_entry(uint64_t start, uint64_t len);
    317struct reserve_info *chain_reserve_entry(struct reserve_info *first,
    318					 struct reserve_info *list);
    319struct reserve_info *add_reserve_entry(struct reserve_info *list,
    320				       struct reserve_info *new);
    321
    322
    323struct dt_info {
    324	unsigned int dtsflags;
    325	struct reserve_info *reservelist;
    326	uint32_t boot_cpuid_phys;
    327	struct node *dt;		/* the device tree */
    328	const char *outname;		/* filename being written to, "-" for stdout */
    329};
    330
    331/* DTS version flags definitions */
    332#define DTSF_V1		0x0001	/* /dts-v1/ */
    333#define DTSF_PLUGIN	0x0002	/* /plugin/ */
    334
    335struct dt_info *build_dt_info(unsigned int dtsflags,
    336			      struct reserve_info *reservelist,
    337			      struct node *tree, uint32_t boot_cpuid_phys);
    338void sort_tree(struct dt_info *dti);
    339void generate_label_tree(struct dt_info *dti, char *name, bool allocph);
    340void generate_fixups_tree(struct dt_info *dti, char *name);
    341void generate_local_fixups_tree(struct dt_info *dti, char *name);
    342
    343/* Checks */
    344
    345void parse_checks_option(bool warn, bool error, const char *arg);
    346void process_checks(bool force, struct dt_info *dti);
    347
    348/* Flattened trees */
    349
    350void dt_to_blob(FILE *f, struct dt_info *dti, int version);
    351void dt_to_asm(FILE *f, struct dt_info *dti, int version);
    352
    353struct dt_info *dt_from_blob(const char *fname);
    354
    355/* Tree source */
    356
    357void dt_to_source(FILE *f, struct dt_info *dti);
    358struct dt_info *dt_from_source(const char *f);
    359
    360/* YAML source */
    361
    362void dt_to_yaml(FILE *f, struct dt_info *dti);
    363
    364/* FS trees */
    365
    366struct dt_info *dt_from_fs(const char *dirname);
    367
    368#endif /* DTC_H */