fdt: port of the device tree manipulation library

fixes #188
This commit is contained in:
Sebastian Sumpf
2019-08-14 15:40:18 +02:00
committed by Norman Feske
parent a35d5d7995
commit a911e81662
8 changed files with 359 additions and 0 deletions

2
lib/import/import-fdt.mk Normal file
View File

@@ -0,0 +1,2 @@
INC_DIR += $(REP_DIR)/src/lib/fdt \
$(call select_from_ports,fdt)/src/lib/fdt/libfdt

16
lib/mk/fdt.mk Normal file
View File

@@ -0,0 +1,16 @@
SHARED_LIB = yes
FDT_PORT := $(call select_from_ports,fdt)/src/lib/fdt/libfdt
INC_DIR += $(REP_DIR)/src/lib/fdt $(FDT_PORT)
CC_C_OPT += -include $(REP_DIR)/src/lib/fdt/libfdt_env.h
LD_OPT += --version-script=$(REP_DIR)/src/lib/fdt/symbol.map
SRC_C = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c \
fdt_empty_tree.c fdt_addresses.c fdt_overlay.c
SRC_CC = libfdt_env.cc
vpath %.c $(FDT_PORT)
vpath %.cc $(REP_DIR)/src/lib/fdt

66
lib/symbols/fdt Normal file
View File

@@ -0,0 +1,66 @@
fdt_next_node T
fdt_check_header T
fdt_move T
fdt_string T
fdt_num_mem_rsv T
fdt_get_mem_rsv T
fdt_subnode_offset_namelen T
fdt_subnode_offset T
fdt_path_offset_namelen T
fdt_path_offset T
fdt_get_name T
fdt_get_property_namelen T
fdt_get_property T
fdt_getprop_namelen T
fdt_getprop T
fdt_get_phandle T
fdt_get_alias_namelen T
fdt_get_alias T
fdt_get_path T
fdt_supernode_atdepth_offset T
fdt_node_depth T
fdt_parent_offset T
fdt_node_offset_by_prop_value T
fdt_node_offset_by_phandle T
fdt_node_check_compatible T
fdt_node_offset_by_compatible T
fdt_setprop_inplace T
fdt_nop_property T
fdt_nop_node T
fdt_create T
fdt_add_reservemap_entry T
fdt_finish_reservemap T
fdt_begin_node T
fdt_property T
fdt_end_node T
fdt_finish T
fdt_open_into T
fdt_pack T
fdt_add_mem_rsv T
fdt_del_mem_rsv T
fdt_set_name T
fdt_setprop T
fdt_delprop T
fdt_add_subnode_namelen T
fdt_add_subnode T
fdt_del_node T
fdt_strerror T
fdt_offset_ptr T
fdt_next_tag T
fdt_appendprop T
fdt_create_empty_tree T
fdt_first_property_offset T
fdt_get_property_by_offset T
fdt_getprop_by_offset T
fdt_next_property_offset T
fdt_first_subnode T
fdt_next_subnode T
fdt_address_cells T
fdt_size_cells T
fdt_stringlist_contains T
fdt_stringlist_count T
fdt_stringlist_search T
fdt_stringlist_get T
fdt_resize T
fdt_overlay_apply T
fdt_get_string T

1
ports/fdt.hash Normal file
View File

@@ -0,0 +1 @@
212d204b2c1702dbaf98335fa7fbd0d83ab6cbb4

7
ports/fdt.port Normal file
View File

@@ -0,0 +1,7 @@
LICENSE := GPLv2 or BSD-2-Clause
DOWNLOADS := fdt.archive
VERSION := 1.5.0
URL(fdt) := https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/dtc-$(VERSION).tar.gz
SHA(fdt) := 3416f10ca69b0b911f027a9cb96471485dd8705705fc4813283f963299eaae0a
DIR(fdt) := src/lib/fdt

126
src/lib/fdt/libfdt_env.cc Normal file
View File

@@ -0,0 +1,126 @@
/**
* \brief Stand alone environment for FDI
* \author Sebastian Sumpf
* \date 2019-07-19
*/
/*
* Copyright (C) 2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#include <util/endian.h>
#include <util/string.h>
extern "C" {
#include "libfdt_env.h"
}
/******************
** libfdt_env.h **
******************/
uint16_t fdt16_to_cpu(fdt16_t x) { return host_to_big_endian(x); }
uint32_t fdt32_to_cpu(fdt32_t x) { return host_to_big_endian(x); }
uint64_t fdt64_to_cpu(fdt64_t x) { return host_to_big_endian(x); }
fdt16_t cpu_to_fdt16(uint16_t x) { return host_to_big_endian(x); }
fdt32_t cpu_to_fdt32(uint32_t x) { return host_to_big_endian(x); }
fdt64_t cpu_to_fdt64(uint64_t x) { return host_to_big_endian(x); }
/**************
** string.h **
**************/
void *memchr(const void *s, int c, size_t n)
{
const unsigned char *p = (unsigned char *)s;
while (n-- != 0) {
if ((unsigned char)c == *p++) {
return (void *)(p - 1);
}
}
return nullptr;
}
int memcmp(const void *s1, const void *s2, size_t n) {
return Genode::memcmp(s1, s2, n); }
void *memcpy(void *dest, const void *src, size_t n) {
return Genode::memcpy(dest, src, n); }
void *memmove(void *dest, const void *src, size_t n) {
return Genode::memmove(dest, src, n); }
void *memset(void *s, int c, size_t n) {
return Genode::memset(s, c, n); }
char *strchr(const char *s, int c)
{
char ch = c;
for (;; ++s) {
if (*s == ch)
return ((char *)s);
if (*s == '\0')
break;
}
return nullptr;
}
char *strrchr(const char *s, int c)
{
char *save;
char ch = c;
for (save = nullptr;; ++s) {
if (*s == ch)
save = (char *)s;
if (*s == '\0')
return (save);
}
/* NOTREACHED */
}
size_t strlen(const char *s) {
return Genode::strlen(s); }
size_t strnlen(const char *s, size_t maxlen)
{
for (size_t c = 0; c < maxlen; c++)
if (!s[c])
return c;
return maxlen;
}
/**************
** stdlib.h **
**************/
unsigned long int strtoul(const char *nptr, char **endptr, int base)
{
unsigned long r = 0;
size_t read = Genode::ascii_to_unsigned(nptr, r, base);
if (endptr)
*endptr = (char *)(nptr + read);
return r;
}

70
src/lib/fdt/libfdt_env.h Normal file
View File

@@ -0,0 +1,70 @@
/**
* \brief Stand alone definitions for FDI
* \author Sebastian Sumpf
* \date 2019-07-19
*/
/*
* Copyright (C) 2019 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef LIBFDT_ENV_H
#define LIBFDT_ENV_H
#include <base/fixed_stdint.h>
/******************
** libfdt_env.h **
******************/
#define NULL ((void *)0)
#define INT_MAX 0x7fffffff
typedef genode_uint16_t fdt16_t;
typedef genode_uint32_t fdt32_t;
typedef genode_uint64_t fdt64_t;
typedef genode_uint8_t uint8_t;
typedef genode_uint16_t uint16_t;
typedef genode_uint32_t uint32_t;
typedef genode_uint64_t uint64_t;
typedef unsigned long size_t;
typedef unsigned long uintptr_t;
uint16_t fdt16_to_cpu(fdt16_t x);
uint32_t fdt32_to_cpu(fdt32_t x);
uint64_t fdt64_to_cpu(fdt64_t x);
fdt16_t cpu_to_fdt16(uint16_t x);
fdt32_t cpu_to_fdt32(uint32_t x);
fdt64_t cpu_to_fdt64(uint64_t x);
/**************
** string.h **
**************/
void *memchr(const void *s, int c, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
size_t strlen(const char *s);
size_t strnlen(const char *s, size_t maxlen);
/**************
** stdlib.h **
**************/
unsigned long int strtoul(const char *nptr, char **endptr, int base);
#endif /* LIBFDT_ENV_H */

71
src/lib/fdt/symbol.map Normal file
View File

@@ -0,0 +1,71 @@
{
global:
fdt_next_node;
fdt_check_header;
fdt_move;
fdt_string;
fdt_num_mem_rsv;
fdt_get_mem_rsv;
fdt_subnode_offset_namelen;
fdt_subnode_offset;
fdt_path_offset_namelen;
fdt_path_offset;
fdt_get_name;
fdt_get_property_namelen;
fdt_get_property;
fdt_getprop_namelen;
fdt_getprop;
fdt_get_phandle;
fdt_get_alias_namelen;
fdt_get_alias;
fdt_get_path;
fdt_supernode_atdepth_offset;
fdt_node_depth;
fdt_parent_offset;
fdt_node_offset_by_prop_value;
fdt_node_offset_by_phandle;
fdt_node_check_compatible;
fdt_node_offset_by_compatible;
fdt_setprop_inplace;
fdt_nop_property;
fdt_nop_node;
fdt_create;
fdt_add_reservemap_entry;
fdt_finish_reservemap;
fdt_begin_node;
fdt_property;
fdt_end_node;
fdt_finish;
fdt_open_into;
fdt_pack;
fdt_add_mem_rsv;
fdt_del_mem_rsv;
fdt_set_name;
fdt_setprop;
fdt_delprop;
fdt_add_subnode_namelen;
fdt_add_subnode;
fdt_del_node;
fdt_strerror;
fdt_offset_ptr;
fdt_next_tag;
fdt_appendprop;
fdt_create_empty_tree;
fdt_first_property_offset;
fdt_get_property_by_offset;
fdt_getprop_by_offset;
fdt_next_property_offset;
fdt_first_subnode;
fdt_next_subnode;
fdt_address_cells;
fdt_size_cells;
fdt_stringlist_contains;
fdt_stringlist_count;
fdt_stringlist_search;
fdt_stringlist_get;
fdt_resize;
fdt_overlay_apply;
fdt_get_string;
local:
*;
};