diff --git a/lib/import/import-fdt.mk b/lib/import/import-fdt.mk new file mode 100644 index 0000000..a48b750 --- /dev/null +++ b/lib/import/import-fdt.mk @@ -0,0 +1,2 @@ +INC_DIR += $(REP_DIR)/src/lib/fdt \ + $(call select_from_ports,fdt)/src/lib/fdt/libfdt diff --git a/lib/mk/fdt.mk b/lib/mk/fdt.mk new file mode 100644 index 0000000..d2c55ae --- /dev/null +++ b/lib/mk/fdt.mk @@ -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 diff --git a/lib/symbols/fdt b/lib/symbols/fdt new file mode 100644 index 0000000..9b5db1c --- /dev/null +++ b/lib/symbols/fdt @@ -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 diff --git a/ports/fdt.hash b/ports/fdt.hash new file mode 100644 index 0000000..ea1ae58 --- /dev/null +++ b/ports/fdt.hash @@ -0,0 +1 @@ +212d204b2c1702dbaf98335fa7fbd0d83ab6cbb4 diff --git a/ports/fdt.port b/ports/fdt.port new file mode 100644 index 0000000..0de50b1 --- /dev/null +++ b/ports/fdt.port @@ -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 diff --git a/src/lib/fdt/libfdt_env.cc b/src/lib/fdt/libfdt_env.cc new file mode 100644 index 0000000..d2af7d7 --- /dev/null +++ b/src/lib/fdt/libfdt_env.cc @@ -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 +#include + +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; +} + diff --git a/src/lib/fdt/libfdt_env.h b/src/lib/fdt/libfdt_env.h new file mode 100644 index 0000000..14550ef --- /dev/null +++ b/src/lib/fdt/libfdt_env.h @@ -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 + + +/****************** + ** 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 */ diff --git a/src/lib/fdt/symbol.map b/src/lib/fdt/symbol.map new file mode 100644 index 0000000..1433e81 --- /dev/null +++ b/src/lib/fdt/symbol.map @@ -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: + *; +};