Attention is currently required from: Jakub Czapiga.
Maximilian Brune has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/81081?usp=email )
Change subject: lib/device_tree: Add some FDT helper functions ......................................................................
lib/device_tree: Add some FDT helper functions
This adds some helper functions for FDT, since more and more mainboards seem to need FDT nowadays. For example our QEMU boards need it in order to know how much RAM is available. Also all RISC-V boards in our tree need FDT.
This also adds some tests in order to test said functions.
Signed-off-by: Maximilian Brune maximilian.brune@9elements.com Change-Id: I2fb1d93c5b3e1cb2f7d9584db52bbce3767b63d8 --- M src/include/device_tree.h M src/lib/device_tree.c M tests/lib/Makefile.mk A tests/lib/device_tree-test.c M tests/stubs/console.c 5 files changed, 938 insertions(+), 14 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/81/81081/1
diff --git a/src/include/device_tree.h b/src/include/device_tree.h index e7b79e1..c8444e5e 100644 --- a/src/include/device_tree.h +++ b/src/include/device_tree.h @@ -194,4 +194,8 @@ */ struct device_tree_node *dt_init_reserved_memory_node(struct device_tree *tree);
+ +uintptr_t fdt_find_node_by_path(const void *blob, const char *path, u32 *addrcp, u32 *sizecp, uintptr_t *results, uint16_t *count_results); +uintptr_t fdt_find_node_by_alias(const void *blob, const char *alias_name, u32 *addr_cells, u32 *size_cells); + #endif /* __DEVICE_TREE_H__ */ diff --git a/src/lib/device_tree.c b/src/lib/device_tree.c index ab9c937b..3908411 100644 --- a/src/lib/device_tree.c +++ b/src/lib/device_tree.c @@ -7,6 +7,7 @@ #include <ctype.h> #include <device_tree.h> #include <endian.h> +#include <stdbool.h> #include <stdint.h> #include <string.h> #include <stddef.h> @@ -41,16 +42,211 @@ return index * sizeof(uint32_t); }
-int fdt_node_name(const void *blob, uint32_t offset, const char **name) +static int fdt_next_node_name(const void *blob, uint32_t offset, const char **name) { - uint8_t *ptr = ((uint8_t *)blob) + offset; + char *ptr = ((char *)blob) + offset; if (be32dec(ptr) != FDT_TOKEN_BEGIN_NODE) return 0;
ptr += 4; if (name) *name = (char *)ptr; - return ALIGN_UP(strlen((char *)ptr) + 1, sizeof(uint32_t)) + 4; + + return ALIGN_UP(strlen(ptr) + 1, 4) + 4; +} + +static int fdt_find_prop_in_node(const void *blob, const char *prop_name, u32 node_offset, struct fdt_property *fdt_prop) +{ + uint8_t *ptr = (uint8_t *)blob + node_offset; + u32 offset = node_offset; + + if (be32dec(ptr) != FDT_TOKEN_BEGIN_NODE) + return 0; + offset += 4; + + int ret; + while ((ret = fdt_next_property(blob, offset, fdt_prop))) { + offset += 4; + if (strcmp(fdt_prop->name, prop_name) == 0) + return offset; + } + return 0; // property not found +} + +//TODO add fdt_read_reg_property +//TODO add fdt_read_cells_property + +//static int fdt_skip_node_rec(const void *blob, u32 node_offset) +//{ +//} + +//static int fdt_skip_node(const void *blob, u32 node_offset) +//{ +// // skip the node name +// int offset = fdt_next_node_name(blob, node_offset, NULL); +// if (!offset) { +// printk(BIOS_DEBUG, "devicetree format error\n"); +// return 0; +// } +// +// // skip properties of sub nodes +// int prop_offset; +// while ((prop_offset = fdt_next_property(blob, node_offset + offset, NULL))) +// offset += prop_offset; +// +// if (be32dec((u8 *)blob + node_offset + offset) == FDT_TOKEN_BEGIN_NODE) { +// fdt_skip_node(blob, node_offset + offset); +// } +// +// if (be32dec((u8 *)blob + node_offset + offset) != FDT_TOKEN_END_NODE) { +// printk(BIOS_DEBUG, "devicetree format error\n"); +// return 0; +// } +// return node_offset + offset + 4; +//} + +//TODO change to u32 or u64 or uintptr_t +// you can specifu count_results without supplying results but not the other way around +static uintptr_t fdt_find_node_by_path_rel(const void *blob, u32 node_offset, const char *path, u32 *addrcp, u32 *sizecp, uintptr_t *results, uint16_t *count_results) +{ + // current state: + // node_offset: offset to current node (e.g. offset to cpus node or choosen...) + // path: path to current node (e.g. /cpus/cpu0@1000) + + // get the node name + const char *node_name; + int size = fdt_next_node_name(blob, node_offset, &node_name); + if(!size) { + printk(BIOS_DEBUG, "devicetree format error\n"); + return 0; + } + int offset = node_offset + size; + + // save string until next '/' or end of string to 'str' + u8 path_sub_len = 0; + const char *str = path; + u8 wildcard_index = 0; + while (*str && *str != '/') { + if (*str == '*') + wildcard_index = path_sub_len; + path_sub_len++; + str++; + } + + if (!strncmp(path, node_name, wildcard_index ? wildcard_index : path_sub_len)) { + // put '/' check before \0 check to ignore a trailing '/' character + if (path[path_sub_len] == '/') { + // skip slash character + path_sub_len++; + } + if (path[path_sub_len] == '\0') { + if (results) { + results[*count_results] = node_offset; + } + if (count_results) { + // in case we have multiple possible results, we need to add them to our results as well as skip our current node and search further + (*count_results)++; + offset = node_offset + fdt_skip_node(blob, node_offset); + return fdt_find_node_by_path_rel(blob, offset, path, addrcp, sizecp, results, count_results); + } + // we are at the end of our path so we found our node + return node_offset; + } + + // skip properties TODO check for addr-cells and size-cells properties + struct fdt_property prop; + while ((size = fdt_next_property(blob, offset, &prop))) { + offset += size; + } + + return fdt_find_node_by_path_rel(blob, offset, path + path_sub_len, addrcp, sizecp, results, count_results); + } + // node is not the correct one + // skip current node + //return node_offset + fdt_skip_node(blob, node_offset); + offset = node_offset + fdt_skip_node(blob, node_offset); + char *ptr = ((char *)blob) + offset; + if (be32dec(ptr) == FDT_TOKEN_END_NODE) { + // we have searched everything and could not find a fitting node + return 0; + } + return fdt_find_node_by_path_rel(blob, offset, path, addrcp, sizecp, results, count_results); +} + +/* + * Find a node in the tree from a string device tree path. + * + * @param blob The device tree to search. + * @param path A string representing a path in the device tree, with + * nodes separated by '/'. Example: "/firmware/coreboot" + * @param addrcp Pointer that will be updated with any #address-cells + * value found in the path. May be NULL to ignore. + * @param sizecp Pointer that will be updated with any #size-cells + * value found in the path. May be NULL to ignore. + * @param create 1: Create node(s) if not found. 0: Return NULL instead. + * @return The found/created node, or NULL. + * + * It is the caller responsibility to provide a path string that doesn't end + * with a '/' and doesn't contain any "//". If the path does not start with a + * '/', the first segment is interpreted as an alias. */ +uintptr_t fdt_find_node_by_path(const void *blob, const char *path, u32 *addrcp, u32 *sizecp, uintptr_t *results, uint16_t *count_results) +{ + // sanity check + if (path[0] != '/') { + printk(BIOS_ERR, "devicetree path must start with a /\n"); + return 0; + } + + if (addrcp) + *addrcp = 2; + if (sizecp) + *sizecp = 1; + + //TODO more sanity checks + struct fdt_header *fdt_hdr = (struct fdt_header *)blob; + + uintptr_t node_offset = fdt_find_node_by_path_rel(blob, be32toh(fdt_hdr->structure_offset), path, addrcp, sizecp, results, count_results); + //int node_offset = fdt_find_node_by_rel_path(blob, be32toh(fdt_hdr->structure_offset), &path[1], addrcp, sizecp); + //if (!node_offset) { + // printk(BIOS_ERR, "devicetree node %s not found\n", path); + // return 0; + //} TODO + + return node_offset; +} + +static uintptr_t fdt_find_alias_prop(const void *blob, const char *alias_name, struct fdt_property *alias_prop) +{ + u32 node_offset = fdt_find_node_by_path(blob, "/aliases", NULL, NULL, NULL, NULL); + if (!node_offset) { + printk(BIOS_DEBUG, "no /aliases node found\n"); + return 0; + } + u32 prop_offset = fdt_find_prop_in_node(blob, alias_name, node_offset, alias_prop); + if (!prop_offset) { + printk(BIOS_DEBUG, "property %s in /aliases node not found\n", alias_name); + return 0; + } + return node_offset + prop_offset; +} + +uintptr_t fdt_find_node_by_alias(const void *blob, const char *alias_name, u32 *addr_cells, u32 *size_cells) +{ + struct fdt_property alias_prop; + if (!fdt_find_alias_prop(blob, alias_name, &alias_prop)) { + printk(BIOS_DEBUG, "alias %s not found\n", alias_name); + return 0; + } + + u32 node_offset = fdt_find_node_by_path(blob, alias_prop.name, addr_cells, size_cells, NULL, NULL); + if (!node_offset) { + // This should not happen (invalid devicetree) + printk(BIOS_WARNING, + "Could not find node '%s', which alias was referring to '%s'\n", + alias_prop.name, alias_name); + return 0; + } + return node_offset; }
static int dt_prop_is_phandle(struct device_tree_property *prop) @@ -109,7 +305,7 @@ const char *name; int size;
- size = fdt_node_name(blob, offset, &name); + size = fdt_next_node_name(blob, offset, &name); if (!size) return 0; offset += size; @@ -152,7 +348,7 @@ int size;
const char *name; - size = fdt_node_name(blob, offset, &name); + size = fdt_next_node_name(blob, offset, &name); if (!size) return 0; offset += size; @@ -163,7 +359,7 @@ while ((size = fdt_skip_node(blob, offset))) offset += size;
- return offset - start_offset + sizeof(uint32_t); + return offset - start_offset + sizeof(uint32_t); //TODO maybe we should check for a FDT_END_NODE instead of just adding sizeof(uint32_t). On the other hand syntax should be checked at build time }
@@ -181,7 +377,7 @@ const char *name; int size;
- size = fdt_node_name(blob, offset, &name); + size = fdt_next_node_name(blob, offset, &name); if (!size) return 0; offset += size; @@ -238,11 +434,9 @@ return sizeof(uint64_t) * 2; }
-struct device_tree *fdt_unflatten(const void *blob) +static bool fdt_is_valid(const void *blob) { - struct device_tree *tree = xzalloc(sizeof(*tree)); const struct fdt_header *header = (const struct fdt_header *)blob; - tree->header = header;
uint32_t magic = be32toh(header->magic); uint32_t version = be32toh(header->version); @@ -250,18 +444,30 @@
if (magic != FDT_HEADER_MAGIC) { printk(BIOS_DEBUG, "Invalid device tree magic %#.8x!\n", magic); - free(tree); - return NULL; + return false; } + if (last_comp_version > FDT_SUPPORTED_VERSION) { printk(BIOS_DEBUG, "Unsupported device tree version %u(>=%u)\n", version, last_comp_version); - free(tree); - return NULL; + return false; } if (version > FDT_SUPPORTED_VERSION) printk(BIOS_NOTICE, "FDT version %u too new, should add support!\n", version); + return true; +} + +struct device_tree *fdt_unflatten(const void *blob) +{ + struct device_tree *tree = xzalloc(sizeof(*tree)); + const struct fdt_header *header = (const struct fdt_header *)blob; + tree->header = header; + + if (fdt_is_valid(blob)) { + printk(BIOS_ERR, "%s failed\n", __func__); + return NULL; + }
uint32_t struct_offset = be32toh(header->structure_offset); uint32_t strings_offset = be32toh(header->strings_offset); diff --git a/tests/lib/Makefile.mk b/tests/lib/Makefile.mk index 0177717..e834e46 100644 --- a/tests/lib/Makefile.mk +++ b/tests/lib/Makefile.mk @@ -39,9 +39,14 @@ tests-y += cbfs-lookup-has-mcache-test tests-y += lzma-test tests-y += ux_locales-test +tests-y += device_tree-test
lib-test-srcs += tests/lib/lib-test.c
+device_tree-test-srcs += tests/lib/device_tree-test.c +device_tree-test-srcs += tests/stubs/console.c +device_tree-test-srcs += src/lib/device_tree.c + string-test-srcs += tests/lib/string-test.c string-test-srcs += src/lib/string.c
diff --git a/tests/lib/device_tree-test.c b/tests/lib/device_tree-test.c new file mode 100644 index 0000000..4cf3290 --- /dev/null +++ b/tests/lib/device_tree-test.c @@ -0,0 +1,708 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <string.h> +#include <stdlib.h> +#include <stdint.h> +#include <stddef.h> +#include <tests/test.h> +#include <stdio.h> +#include <device_tree.h> +#include <console/console.h> + +uint8_t dtb[] = { + /* 00000000: */ 0xd0, 0x0d, 0xfe, 0xed, 0x00, 0x00, 0x14, 0x96, // ........ + /* 00000008: */ 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x12, 0xe4, // ...8.... + /* 00000010: */ 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x11, // ...(.... + /* 00000018: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000020: */ 0x00, 0x00, 0x01, 0xb2, 0x00, 0x00, 0x12, 0xac, // ........ + /* 00000028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000038: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000040: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000048: */ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000050: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000058: */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000060: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0d, // ........ + /* 00000068: */ 0x00, 0x00, 0x00, 0x06, 0x72, 0x69, 0x73, 0x63, // ....risc + /* 00000070: */ 0x76, 0x2d, 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, // v-virtio + /* 00000078: */ 0x00, 0x71, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x03, // .qem.... + /* 00000080: */ 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000088: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2d, 0x76, 0x69, // riscv-vi + /* 00000090: */ 0x72, 0x74, 0x69, 0x6f, 0x2c, 0x71, 0x65, 0x6d, // rtio,qem + /* 00000098: */ 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // u....... + /* 000000a0: */ 0x70, 0x6f, 0x77, 0x65, 0x72, 0x6f, 0x66, 0x66, // poweroff + /* 000000a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000000b0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x90, // ........ + /* 000000b8: */ 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x03, // ..UU.... + /* 000000c0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x89, // ........ + /* 000000c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000000d0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x82, // ........ + /* 000000d8: */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000000e0: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000000e8: */ 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x2d, 0x70, // syscon-p + /* 000000f0: */ 0x6f, 0x77, 0x65, 0x72, 0x6f, 0x66, 0x66, 0x00, // oweroff. + /* 000000f8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000100: */ 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x00, 0x00, // reboot.. + /* 00000108: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000110: */ 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x77, 0x77, // ......ww + /* 00000118: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000120: */ 0x00, 0x00, 0x01, 0x89, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000128: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000130: */ 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x08, // ........ + /* 00000138: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0e, // ........ + /* 00000140: */ 0x00, 0x00, 0x00, 0x06, 0x73, 0x79, 0x73, 0x63, // ....sysc + /* 00000148: */ 0x6f, 0x6e, 0x2d, 0x72, 0x65, 0x62, 0x6f, 0x6f, // on-reboo + /* 00000150: */ 0x74, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x02, // t.00.... + /* 00000158: */ 0x00, 0x00, 0x00, 0x01, 0x70, 0x6c, 0x61, 0x74, // ....plat + /* 00000160: */ 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x62, 0x75, 0x73, // form-bus + /* 00000168: */ 0x40, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, // @4000000 + /* 00000170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000178: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x2a, // .......* + /* 00000180: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000188: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2c, // ......., + /* 00000190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000198: */ 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ........ + /* 000001a0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000001a8: */ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, // ........ + /* 000001b0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000001b8: */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, // ........ + /* 000001c0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x19, // ........ + /* 000001c8: */ 0x00, 0x00, 0x00, 0x06, 0x71, 0x65, 0x6d, 0x75, // ....qemu + /* 000001d0: */ 0x2c, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, // ,platfor + /* 000001d8: */ 0x6d, 0x00, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, // m.simple + /* 000001e0: */ 0x2d, 0x62, 0x75, 0x73, 0x00, 0x65, 0x6d, 0x6f, // -bus.emo + /* 000001e8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 000001f0: */ 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x40, 0x38, // memory@8 + /* 000001f8: */ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, // 0000000. + /* 00000200: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000208: */ 0x00, 0x00, 0x00, 0xcd, 0x6d, 0x65, 0x6d, 0x6f, // ....memo + /* 00000210: */ 0x72, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ry...... + /* 00000218: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000220: */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, // ........ + /* 00000228: */ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // ........ + /* 00000230: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000238: */ 0x63, 0x70, 0x75, 0x73, 0x00, 0x00, 0x00, 0x00, // cpus.... + /* 00000240: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000248: */ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000250: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000258: */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000260: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000268: */ 0x00, 0x00, 0x00, 0x74, 0x00, 0x98, 0x96, 0x80, // ...t.... + /* 00000270: */ 0x00, 0x00, 0x00, 0x01, 0x63, 0x70, 0x75, 0x40, // ....cpu@ + /* 00000278: */ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // 0....... + /* 00000280: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd9, // ........ + /* 00000288: */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000290: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xcd, // ........ + /* 00000298: */ 0x63, 0x70, 0x75, 0x00, 0x00, 0x00, 0x00, 0x03, // cpu..... + /* 000002a0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 000002a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000002b0: */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc6, // ........ + /* 000002b8: */ 0x6f, 0x6b, 0x61, 0x79, 0x00, 0x00, 0x00, 0x03, // okay.... + /* 000002c0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000002c8: */ 0x00, 0x00, 0x00, 0x06, 0x72, 0x69, 0x73, 0x63, // ....risc + /* 000002d0: */ 0x76, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, // v....... + /* 000002d8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb0, // ........ + /* 000002e0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, // ...@.... + /* 000002e8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9a, // ........ + /* 000002f0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, // ...@.... + /* 000002f8: */ 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x90, // ...y.... + /* 00000300: */ 0x72, 0x76, 0x36, 0x34, 0x69, 0x6d, 0x61, 0x66, // rv64imaf + /* 00000308: */ 0x64, 0x63, 0x68, 0x5f, 0x7a, 0x69, 0x63, 0x62, // dch_zicb + /* 00000310: */ 0x6f, 0x6d, 0x5f, 0x7a, 0x69, 0x63, 0x62, 0x6f, // om_zicbo + /* 00000318: */ 0x7a, 0x5f, 0x7a, 0x69, 0x63, 0x6e, 0x74, 0x72, // z_zicntr + /* 00000320: */ 0x5f, 0x7a, 0x69, 0x63, 0x73, 0x72, 0x5f, 0x7a, // _zicsr_z + /* 00000328: */ 0x69, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x69, 0x5f, // ifencei_ + /* 00000330: */ 0x7a, 0x69, 0x68, 0x69, 0x6e, 0x74, 0x6e, 0x74, // zihintnt + /* 00000338: */ 0x6c, 0x5f, 0x7a, 0x69, 0x68, 0x69, 0x6e, 0x74, // l_zihint + /* 00000340: */ 0x70, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x7a, 0x69, // pause_zi + /* 00000348: */ 0x68, 0x70, 0x6d, 0x5f, 0x7a, 0x61, 0x77, 0x72, // hpm_zawr + /* 00000350: */ 0x73, 0x5f, 0x7a, 0x66, 0x61, 0x5f, 0x7a, 0x63, // s_zfa_zc + /* 00000358: */ 0x61, 0x5f, 0x7a, 0x63, 0x64, 0x5f, 0x7a, 0x62, // a_zcd_zb + /* 00000360: */ 0x61, 0x5f, 0x7a, 0x62, 0x62, 0x5f, 0x7a, 0x62, // a_zbb_zb + /* 00000368: */ 0x63, 0x5f, 0x7a, 0x62, 0x73, 0x5f, 0x73, 0x73, // c_zbs_ss + /* 00000370: */ 0x74, 0x63, 0x5f, 0x73, 0x76, 0x61, 0x64, 0x75, // tc_svadu + /* 00000378: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000380: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x87, // ........ + /* 00000388: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2c, 0x73, 0x76, // riscv,sv + /* 00000390: */ 0x35, 0x37, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, // 57...... + /* 00000398: */ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, // interrup + /* 000003a0: */ 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, // t-contro + /* 000003a8: */ 0x6c, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, // ller.... + /* 000003b0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000003b8: */ 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x01, // ........ + /* 000003c0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // ........ + /* 000003c8: */ 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000003d0: */ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000003d8: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2c, 0x63, 0x70, // riscv,cp + /* 000003e0: */ 0x75, 0x2d, 0x69, 0x6e, 0x74, 0x63, 0x00, 0x01, // u-intc.. + /* 000003e8: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000003f0: */ 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000003f8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000400: */ 0x00, 0x00, 0x00, 0x01, 0x63, 0x70, 0x75, 0x40, // ....cpu@ + /* 00000408: */ 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // 1....... + /* 00000410: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd9, // ........ + /* 00000418: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000420: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xcd, // ........ + /* 00000428: */ 0x63, 0x70, 0x75, 0x00, 0x00, 0x00, 0x00, 0x03, // cpu..... + /* 00000430: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000438: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000440: */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc6, // ........ + /* 00000448: */ 0x6f, 0x6b, 0x61, 0x79, 0x00, 0x00, 0x00, 0x03, // okay.... + /* 00000450: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00000458: */ 0x00, 0x00, 0x00, 0x06, 0x72, 0x69, 0x73, 0x63, // ....risc + /* 00000460: */ 0x76, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, // v....... + /* 00000468: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb0, // ........ + /* 00000470: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, // ...@.... + /* 00000478: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9a, // ........ + /* 00000480: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, // ...@.... + /* 00000488: */ 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x90, // ...y.... + /* 00000490: */ 0x72, 0x76, 0x36, 0x34, 0x69, 0x6d, 0x61, 0x66, // rv64imaf + /* 00000498: */ 0x64, 0x63, 0x68, 0x5f, 0x7a, 0x69, 0x63, 0x62, // dch_zicb + /* 000004a0: */ 0x6f, 0x6d, 0x5f, 0x7a, 0x69, 0x63, 0x62, 0x6f, // om_zicbo + /* 000004a8: */ 0x7a, 0x5f, 0x7a, 0x69, 0x63, 0x6e, 0x74, 0x72, // z_zicntr + /* 000004b0: */ 0x5f, 0x7a, 0x69, 0x63, 0x73, 0x72, 0x5f, 0x7a, // _zicsr_z + /* 000004b8: */ 0x69, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x69, 0x5f, // ifencei_ + /* 000004c0: */ 0x7a, 0x69, 0x68, 0x69, 0x6e, 0x74, 0x6e, 0x74, // zihintnt + /* 000004c8: */ 0x6c, 0x5f, 0x7a, 0x69, 0x68, 0x69, 0x6e, 0x74, // l_zihint + /* 000004d0: */ 0x70, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x7a, 0x69, // pause_zi + /* 000004d8: */ 0x68, 0x70, 0x6d, 0x5f, 0x7a, 0x61, 0x77, 0x72, // hpm_zawr + /* 000004e0: */ 0x73, 0x5f, 0x7a, 0x66, 0x61, 0x5f, 0x7a, 0x63, // s_zfa_zc + /* 000004e8: */ 0x61, 0x5f, 0x7a, 0x63, 0x64, 0x5f, 0x7a, 0x62, // a_zcd_zb + /* 000004f0: */ 0x61, 0x5f, 0x7a, 0x62, 0x62, 0x5f, 0x7a, 0x62, // a_zbb_zb + /* 000004f8: */ 0x63, 0x5f, 0x7a, 0x62, 0x73, 0x5f, 0x73, 0x73, // c_zbs_ss + /* 00000500: */ 0x74, 0x63, 0x5f, 0x73, 0x76, 0x61, 0x64, 0x75, // tc_svadu + /* 00000508: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000510: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x87, // ........ + /* 00000518: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2c, 0x73, 0x76, // riscv,sv + /* 00000520: */ 0x35, 0x37, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, // 57...... + /* 00000528: */ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, // interrup + /* 00000530: */ 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, // t-contro + /* 00000538: */ 0x6c, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, // ller.... + /* 00000540: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000548: */ 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000550: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000558: */ 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000560: */ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00000568: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2c, 0x63, 0x70, // riscv,cp + /* 00000570: */ 0x75, 0x2d, 0x69, 0x6e, 0x74, 0x63, 0x00, 0x01, // u-intc.. + /* 00000578: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000580: */ 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000588: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000590: */ 0x00, 0x00, 0x00, 0x01, 0x63, 0x70, 0x75, 0x40, // ....cpu@ + /* 00000598: */ 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // 2....... + /* 000005a0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd9, // ........ + /* 000005a8: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000005b0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xcd, // ........ + /* 000005b8: */ 0x63, 0x70, 0x75, 0x00, 0x00, 0x00, 0x00, 0x03, // cpu..... + /* 000005c0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 000005c8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000005d0: */ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xc6, // ........ + /* 000005d8: */ 0x6f, 0x6b, 0x61, 0x79, 0x00, 0x00, 0x00, 0x03, // okay.... + /* 000005e0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000005e8: */ 0x00, 0x00, 0x00, 0x06, 0x72, 0x69, 0x73, 0x63, // ....risc + /* 000005f0: */ 0x76, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, // v....... + /* 000005f8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xb0, // ........ + /* 00000600: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, // ...@.... + /* 00000608: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x9a, // ........ + /* 00000610: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, // ...@.... + /* 00000618: */ 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x90, // ...y.... + /* 00000620: */ 0x72, 0x76, 0x36, 0x34, 0x69, 0x6d, 0x61, 0x66, // rv64imaf + /* 00000628: */ 0x64, 0x63, 0x68, 0x5f, 0x7a, 0x69, 0x63, 0x62, // dch_zicb + /* 00000630: */ 0x6f, 0x6d, 0x5f, 0x7a, 0x69, 0x63, 0x62, 0x6f, // om_zicbo + /* 00000638: */ 0x7a, 0x5f, 0x7a, 0x69, 0x63, 0x6e, 0x74, 0x72, // z_zicntr + /* 00000640: */ 0x5f, 0x7a, 0x69, 0x63, 0x73, 0x72, 0x5f, 0x7a, // _zicsr_z + /* 00000648: */ 0x69, 0x66, 0x65, 0x6e, 0x63, 0x65, 0x69, 0x5f, // ifencei_ + /* 00000650: */ 0x7a, 0x69, 0x68, 0x69, 0x6e, 0x74, 0x6e, 0x74, // zihintnt + /* 00000658: */ 0x6c, 0x5f, 0x7a, 0x69, 0x68, 0x69, 0x6e, 0x74, // l_zihint + /* 00000660: */ 0x70, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x7a, 0x69, // pause_zi + /* 00000668: */ 0x68, 0x70, 0x6d, 0x5f, 0x7a, 0x61, 0x77, 0x72, // hpm_zawr + /* 00000670: */ 0x73, 0x5f, 0x7a, 0x66, 0x61, 0x5f, 0x7a, 0x63, // s_zfa_zc + /* 00000678: */ 0x61, 0x5f, 0x7a, 0x63, 0x64, 0x5f, 0x7a, 0x62, // a_zcd_zb + /* 00000680: */ 0x61, 0x5f, 0x7a, 0x62, 0x62, 0x5f, 0x7a, 0x62, // a_zbb_zb + /* 00000688: */ 0x63, 0x5f, 0x7a, 0x62, 0x73, 0x5f, 0x73, 0x73, // c_zbs_ss + /* 00000690: */ 0x74, 0x63, 0x5f, 0x73, 0x76, 0x61, 0x64, 0x75, // tc_svadu + /* 00000698: */ 0x00, 0x07, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000006a0: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x87, // ........ + /* 000006a8: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2c, 0x73, 0x76, // riscv,sv + /* 000006b0: */ 0x35, 0x37, 0x00, 0x73, 0x00, 0x00, 0x00, 0x01, // 57.s.... + /* 000006b8: */ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, // interrup + /* 000006c0: */ 0x74, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, // t-contro + /* 000006c8: */ 0x6c, 0x6c, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, // ller.... + /* 000006d0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000006d8: */ 0x00, 0x00, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x01, // ........ + /* 000006e0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // ........ + /* 000006e8: */ 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000006f0: */ 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000006f8: */ 0x72, 0x69, 0x73, 0x63, 0x76, 0x2c, 0x63, 0x70, // riscv,cp + /* 00000700: */ 0x75, 0x2d, 0x69, 0x6e, 0x74, 0x63, 0x00, 0x01, // u-intc.. + /* 00000708: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000710: */ 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000718: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000720: */ 0x00, 0x00, 0x00, 0x01, 0x63, 0x70, 0x75, 0x2d, // ....cpu- + /* 00000728: */ 0x6d, 0x61, 0x70, 0x00, 0x00, 0x00, 0x00, 0x01, // map..... + /* 00000730: */ 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x30, // cluster0 + /* 00000738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000740: */ 0x63, 0x6f, 0x72, 0x65, 0x30, 0x00, 0x00, 0x00, // core0... + /* 00000748: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000750: */ 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x05, // ........ + /* 00000758: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000760: */ 0x63, 0x6f, 0x72, 0x65, 0x31, 0x00, 0x00, 0x00, // core1... + /* 00000768: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000770: */ 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000778: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000780: */ 0x63, 0x6f, 0x72, 0x65, 0x32, 0x00, 0x00, 0x00, // core2... + /* 00000788: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000790: */ 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000798: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 000007a0: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 000007a8: */ 0x00, 0x00, 0x00, 0x01, 0x70, 0x6d, 0x75, 0x00, // ....pmu. + /* 000007b0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 000007b8: */ 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x01, // ...X.... + /* 000007c0: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0xff, 0xf9, // ........ + /* 000007c8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 000007d0: */ 0x00, 0x07, 0xff, 0xfc, 0x00, 0x01, 0x00, 0x19, // ........ + /* 000007d8: */ 0x00, 0x01, 0x00, 0x19, 0x00, 0x07, 0xff, 0xf8, // ........ + /* 000007e0: */ 0x00, 0x01, 0x00, 0x1b, 0x00, 0x01, 0x00, 0x1b, // ........ + /* 000007e8: */ 0x00, 0x07, 0xff, 0xf8, 0x00, 0x01, 0x00, 0x21, // .......! + /* 000007f0: */ 0x00, 0x01, 0x00, 0x21, 0x00, 0x07, 0xff, 0xf8, // ...!.... + /* 000007f8: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, // ........ + /* 00000800: */ 0x00, 0x00, 0x00, 0x06, 0x72, 0x69, 0x73, 0x63, // ....risc + /* 00000808: */ 0x76, 0x2c, 0x70, 0x6d, 0x75, 0x00, 0x30, 0x00, // v,pmu.0. + /* 00000810: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000818: */ 0x66, 0x77, 0x2d, 0x63, 0x66, 0x67, 0x40, 0x31, // fw-cfg@1 + /* 00000820: */ 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, // 0100000. + /* 00000828: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000830: */ 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x03, // ...K.... + /* 00000838: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000840: */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, // ........ + /* 00000848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, // ........ + /* 00000850: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // ........ + /* 00000858: */ 0x00, 0x00, 0x00, 0x06, 0x71, 0x65, 0x6d, 0x75, // ....qemu + /* 00000860: */ 0x2c, 0x66, 0x77, 0x2d, 0x63, 0x66, 0x67, 0x2d, // ,fw-cfg- + /* 00000868: */ 0x6d, 0x6d, 0x69, 0x6f, 0x00, 0x00, 0x00, 0x04, // mmio.... + /* 00000870: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000878: */ 0x66, 0x6c, 0x61, 0x73, 0x68, 0x40, 0x32, 0x30, // flash@20 + /* 00000880: */ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, // 000000.. + /* 00000888: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000890: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, // ...@.... + /* 00000898: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, // ....... + /* 000008a0: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 000008a8: */ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ....... + /* 000008b0: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 000008b8: */ 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // "....... + /* 000008c0: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000008c8: */ 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000008d0: */ 0x63, 0x66, 0x69, 0x2d, 0x66, 0x6c, 0x61, 0x73, // cfi-flas + /* 000008d8: */ 0x68, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, // h.. .... + /* 000008e0: */ 0x00, 0x00, 0x00, 0x01, 0x63, 0x68, 0x6f, 0x73, // ....chos + /* 000008e8: */ 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // en...... + /* 000008f0: */ 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x01, 0xa6, // ........ + /* 000008f8: */ 0x2f, 0x73, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x72, // /soc/ser + /* 00000900: */ 0x69, 0x61, 0x6c, 0x40, 0x31, 0x30, 0x30, 0x30, // ial@1000 + /* 00000908: */ 0x30, 0x30, 0x30, 0x30, 0x00, 0x5e, 0x56, 0x9d, // 0000.^V. + /* 00000910: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, // ....... + /* 00000918: */ 0x00, 0x00, 0x00, 0x33, 0x15, 0xe0, 0x97, 0x78, // ...3...x + /* 00000920: */ 0x84, 0x84, 0x74, 0x66, 0x5b, 0xab, 0xa5, 0xfd, // ..tf[... + /* 00000928: */ 0x83, 0x15, 0x05, 0x71, 0x56, 0x75, 0xc3, 0xa8, // ...qVu.. + /* 00000930: */ 0x7c, 0x5e, 0x56, 0x9d, 0xce, 0x59, 0x5a, 0x7e, // |^V..YZ~ + /* 00000938: */ 0xf7, 0x11, 0x96, 0x10, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000940: */ 0x00, 0x00, 0x00, 0x01, 0x73, 0x6f, 0x63, 0x00, // ....soc. + /* 00000948: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000950: */ 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000958: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000960: */ 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000968: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, // ........ + /* 00000970: */ 0x00, 0x00, 0x00, 0x06, 0x73, 0x69, 0x6d, 0x70, // ....simp + /* 00000978: */ 0x6c, 0x65, 0x2d, 0x62, 0x75, 0x73, 0x00, 0x09, // le-bus.. + /* 00000980: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000988: */ 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, // ...,.... + /* 00000990: */ 0x72, 0x74, 0x63, 0x40, 0x31, 0x30, 0x31, 0x30, // rtc@1010 + /* 00000998: */ 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // 00...... + /* 000009a0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x3b, // .......; + /* 000009a8: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000009b0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x2a, // .......* + /* 000009b8: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000009c0: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 000009c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, // ........ + /* 000009d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, // ........ + /* 000009d8: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x14, // ........ + /* 000009e0: */ 0x00, 0x00, 0x00, 0x06, 0x67, 0x6f, 0x6f, 0x67, // ....goog + /* 000009e8: */ 0x6c, 0x65, 0x2c, 0x67, 0x6f, 0x6c, 0x64, 0x66, // le,goldf + /* 000009f0: */ 0x69, 0x73, 0x68, 0x2d, 0x72, 0x74, 0x63, 0x00, // ish-rtc. + /* 000009f8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000a00: */ 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x40, 0x31, // serial@1 + /* 00000a08: */ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, // 0000000. + /* 00000a10: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000a18: */ 0x00, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x00, 0x0a, // ...;.... + /* 00000a20: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000a28: */ 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x07, // ...*.... + /* 00000a30: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000a38: */ 0x00, 0x00, 0x01, 0x96, 0x00, 0x38, 0x40, 0x00, // .....8@. + /* 00000a40: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00000a48: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 00000a50: */ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000a58: */ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000a60: */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00000a68: */ 0x6e, 0x73, 0x31, 0x36, 0x35, 0x35, 0x30, 0x61, // ns16550a + /* 00000a70: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000a78: */ 0x00, 0x00, 0x00, 0x01, 0x74, 0x65, 0x73, 0x74, // ....test + /* 00000a80: */ 0x40, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, // @100000. + /* 00000a88: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000a90: */ 0x00, 0x00, 0x00, 0xd9, 0x00, 0x00, 0x00, 0x08, // ........ + /* 00000a98: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00000aa0: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 00000aa8: */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000ab0: */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000ab8: */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x06, // ...!.... + /* 00000ac0: */ 0x73, 0x69, 0x66, 0x69, 0x76, 0x65, 0x2c, 0x74, // sifive,t + /* 00000ac8: */ 0x65, 0x73, 0x74, 0x31, 0x00, 0x73, 0x69, 0x66, // est1.sif + /* 00000ad0: */ 0x69, 0x76, 0x65, 0x2c, 0x74, 0x65, 0x73, 0x74, // ive,test + /* 00000ad8: */ 0x30, 0x00, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, // 0.syscon + /* 00000ae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000ae8: */ 0x00, 0x00, 0x00, 0x01, 0x70, 0x63, 0x69, 0x40, // ....pci@ + /* 00000af0: */ 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, // 30000000 + /* 00000af8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000b00: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x6f, // .......o + /* 00000b08: */ 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000b10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000b18: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, // ........ + /* 00000b20: */ 0x00, 0x00, 0x01, 0x61, 0x00, 0x00, 0x00, 0x00, // ...a.... + /* 00000b28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000b30: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000b38: */ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, // ... .... + /* 00000b40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000b48: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000b50: */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, // ...!.... + /* 00000b58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000b60: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000b68: */ 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, // ...".... + /* 00000b70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000b78: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000b80: */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x08, 0x00, // ...#.... + /* 00000b88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000b90: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000b98: */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x08, 0x00, // ...!.... + /* 00000ba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000ba8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000bb0: */ 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x08, 0x00, // ...".... + /* 00000bb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000bc0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000bc8: */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x08, 0x00, // ...#.... + /* 00000bd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000bd8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000be0: */ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, // ... .... + /* 00000be8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000bf0: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000bf8: */ 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x10, 0x00, // ...".... + /* 00000c00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c08: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000c10: */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x10, 0x00, // ...#.... + /* 00000c18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c20: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000c28: */ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, // ... .... + /* 00000c30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c38: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000c40: */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x18, 0x00, // ...!.... + /* 00000c48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c50: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000c58: */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x18, 0x00, // ...#.... + /* 00000c60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c68: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000c70: */ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, // ... .... + /* 00000c78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c80: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000c88: */ 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x18, 0x00, // ...!.... + /* 00000c90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000c98: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00000ca0: */ 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, // ...".... + /* 00000ca8: */ 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x2c, // ...T..., + /* 00000cb0: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000cb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000cc0: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000cc8: */ 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // ........ + /* 00000cd0: */ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ....@... + /* 00000cd8: */ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ....@... + /* 00000ce0: */ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ....@... + /* 00000ce8: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000cf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000cf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000d00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000d08: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000d10: */ 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, // ....0... + /* 00000d18: */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, // ........ + /* 00000d20: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00000d28: */ 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x03, // ...K.... + /* 00000d30: */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0x57, // .......W + /* 00000d38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, // ........ + /* 00000d40: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000d48: */ 0x00, 0x00, 0x01, 0x46, 0x00, 0x00, 0x00, 0x00, // ...F.... + /* 00000d50: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000d58: */ 0x00, 0x00, 0x00, 0xcd, 0x70, 0x63, 0x69, 0x00, // ....pci. + /* 00000d60: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x16, // ........ + /* 00000d68: */ 0x00, 0x00, 0x00, 0x06, 0x70, 0x63, 0x69, 0x2d, // ....pci- + /* 00000d70: */ 0x68, 0x6f, 0x73, 0x74, 0x2d, 0x65, 0x63, 0x61, // host-eca + /* 00000d78: */ 0x6d, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, // m-generi + /* 00000d80: */ 0x63, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, // c....... + /* 00000d88: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x11, // ........ + /* 00000d90: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000d98: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf6, // ........ + /* 00000da0: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000da8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1d, // ........ + /* 00000db0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00000db8: */ 0x00, 0x00, 0x00, 0x01, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00000dc0: */ 0x69, 0x6f, 0x5f, 0x6d, 0x6d, 0x69, 0x6f, 0x40, // io_mmio@ + /* 00000dc8: */ 0x31, 0x30, 0x30, 0x30, 0x38, 0x30, 0x30, 0x30, // 10008000 + /* 00000dd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000dd8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x3b, // .......; + /* 00000de0: */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000de8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x2a, // .......* + /* 00000df0: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000df8: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000e00: */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, // ........ + /* 00000e08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, // ........ + /* 00000e10: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, // ........ + /* 00000e18: */ 0x00, 0x00, 0x00, 0x06, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00000e20: */ 0x69, 0x6f, 0x2c, 0x6d, 0x6d, 0x69, 0x6f, 0x00, // io,mmio. + /* 00000e28: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000e30: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x5f, 0x6d, // virtio_m + /* 00000e38: */ 0x6d, 0x69, 0x6f, 0x40, 0x31, 0x30, 0x30, 0x30, // mio@1000 + /* 00000e40: */ 0x37, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, // 7000.... + /* 00000e48: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000e50: */ 0x00, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x00, 0x07, // ...;.... + /* 00000e58: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000e60: */ 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x07, // ...*.... + /* 00000e68: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00000e70: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 00000e78: */ 0x10, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, // ..p..... + /* 00000e80: */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000e88: */ 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00000e90: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x2c, 0x6d, // virtio,m + /* 00000e98: */ 0x6d, 0x69, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, // mio..... + /* 00000ea0: */ 0x00, 0x00, 0x00, 0x01, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00000ea8: */ 0x69, 0x6f, 0x5f, 0x6d, 0x6d, 0x69, 0x6f, 0x40, // io_mmio@ + /* 00000eb0: */ 0x31, 0x30, 0x30, 0x30, 0x36, 0x30, 0x30, 0x30, // 10006000 + /* 00000eb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000ec0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x3b, // .......; + /* 00000ec8: */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000ed0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x2a, // .......* + /* 00000ed8: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000ee0: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000ee8: */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x60, 0x00, // ......`. + /* 00000ef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, // ........ + /* 00000ef8: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, // ........ + /* 00000f00: */ 0x00, 0x00, 0x00, 0x06, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00000f08: */ 0x69, 0x6f, 0x2c, 0x6d, 0x6d, 0x69, 0x6f, 0x00, // io,mmio. + /* 00000f10: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00000f18: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x5f, 0x6d, // virtio_m + /* 00000f20: */ 0x6d, 0x69, 0x6f, 0x40, 0x31, 0x30, 0x30, 0x30, // mio@1000 + /* 00000f28: */ 0x35, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, // 5000.... + /* 00000f30: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000f38: */ 0x00, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x00, 0x05, // ...;.... + /* 00000f40: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00000f48: */ 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x07, // ...*.... + /* 00000f50: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00000f58: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 00000f60: */ 0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, // ..P..... + /* 00000f68: */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000f70: */ 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00000f78: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x2c, 0x6d, // virtio,m + /* 00000f80: */ 0x6d, 0x69, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, // mio..... + /* 00000f88: */ 0x00, 0x00, 0x00, 0x01, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00000f90: */ 0x69, 0x6f, 0x5f, 0x6d, 0x6d, 0x69, 0x6f, 0x40, // io_mmio@ + /* 00000f98: */ 0x31, 0x30, 0x30, 0x30, 0x34, 0x30, 0x30, 0x30, // 10004000 + /* 00000fa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000fa8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x3b, // .......; + /* 00000fb0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000fb8: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x2a, // .......* + /* 00000fc0: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00000fc8: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00000fd0: */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, // ......@. + /* 00000fd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, // ........ + /* 00000fe0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, // ........ + /* 00000fe8: */ 0x00, 0x00, 0x00, 0x06, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00000ff0: */ 0x69, 0x6f, 0x2c, 0x6d, 0x6d, 0x69, 0x6f, 0x00, // io,mmio. + /* 00000ff8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 00001000: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x5f, 0x6d, // virtio_m + /* 00001008: */ 0x6d, 0x69, 0x6f, 0x40, 0x31, 0x30, 0x30, 0x30, // mio@1000 + /* 00001010: */ 0x33, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, // 3000.... + /* 00001018: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00001020: */ 0x00, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x00, 0x03, // ...;.... + /* 00001028: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00001030: */ 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x07, // ...*.... + /* 00001038: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00001040: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 00001048: */ 0x10, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // ..0..... + /* 00001050: */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001058: */ 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00001060: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x2c, 0x6d, // virtio,m + /* 00001068: */ 0x6d, 0x69, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, // mio..... + /* 00001070: */ 0x00, 0x00, 0x00, 0x01, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 00001078: */ 0x69, 0x6f, 0x5f, 0x6d, 0x6d, 0x69, 0x6f, 0x40, // io_mmio@ + /* 00001080: */ 0x31, 0x30, 0x30, 0x30, 0x32, 0x30, 0x30, 0x30, // 10002000 + /* 00001088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001090: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x3b, // .......; + /* 00001098: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000010a0: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x2a, // .......* + /* 000010a8: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000010b0: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 000010b8: */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, // ...... . + /* 000010c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, // ........ + /* 000010c8: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0c, // ........ + /* 000010d0: */ 0x00, 0x00, 0x00, 0x06, 0x76, 0x69, 0x72, 0x74, // ....virt + /* 000010d8: */ 0x69, 0x6f, 0x2c, 0x6d, 0x6d, 0x69, 0x6f, 0x00, // io,mmio. + /* 000010e0: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, // ........ + /* 000010e8: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x5f, 0x6d, // virtio_m + /* 000010f0: */ 0x6d, 0x69, 0x6f, 0x40, 0x31, 0x30, 0x30, 0x30, // mio@1000 + /* 000010f8: */ 0x31, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, // 1000.... + /* 00001100: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00001108: */ 0x00, 0x00, 0x01, 0x3b, 0x00, 0x00, 0x00, 0x01, // ...;.... + /* 00001110: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, // ........ + /* 00001118: */ 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x07, // ...*.... + /* 00001120: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00001128: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 00001130: */ 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 00001138: */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001140: */ 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x06, // ........ + /* 00001148: */ 0x76, 0x69, 0x72, 0x74, 0x69, 0x6f, 0x2c, 0x6d, // virtio,m + /* 00001150: */ 0x6d, 0x69, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, // mio..... + /* 00001158: */ 0x00, 0x00, 0x00, 0x01, 0x70, 0x6c, 0x69, 0x63, // ....plic + /* 00001160: */ 0x40, 0x63, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, // @c000000 + /* 00001168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001170: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xd9, // ........ + /* 00001178: */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001180: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x1f, // ........ + /* 00001188: */ 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x03, // ..._.... + /* 00001190: */ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3c, // .......< + /* 00001198: */ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, // ........ + /* 000011a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, // .....`.. + /* 000011a8: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, // .......0 + /* 000011b0: */ 0x00, 0x00, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000011b8: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000011c0: */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000011c8: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x04, // ........ + /* 000011d0: */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, // ........ + /* 000011d8: */ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x02, // ........ + /* 000011e0: */ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000011e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, // ........ + /* 000011f0: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1e, // ........ + /* 000011f8: */ 0x00, 0x00, 0x00, 0x06, 0x73, 0x69, 0x66, 0x69, // ....sifi + /* 00001200: */ 0x76, 0x65, 0x2c, 0x70, 0x6c, 0x69, 0x63, 0x2d, // ve,plic- + /* 00001208: */ 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x00, 0x72, 0x69, // 1.0.0.ri + /* 00001210: */ 0x73, 0x63, 0x76, 0x2c, 0x70, 0x6c, 0x69, 0x63, // scv,plic + /* 00001218: */ 0x30, 0x00, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x03, // 0.in.... + /* 00001220: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1d, // ........ + /* 00001228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001230: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf6, // ........ + /* 00001238: */ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, // ........ + /* 00001240: */ 0x00, 0x00, 0x00, 0x01, 0x63, 0x6c, 0x69, 0x6e, // ....clin + /* 00001248: */ 0x74, 0x40, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, // t@200000 + /* 00001250: */ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // 0....... + /* 00001258: */ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x01, 0x0b, // ...0.... + /* 00001260: */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001268: */ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00001270: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001278: */ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00001280: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, // ........ + /* 00001288: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, // ........ + /* 00001290: */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // ........ + /* 00001298: */ 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...<.... + /* 000012a0: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ + /* 000012a8: */ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ........ + /* 000012b0: */ 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x06, // ........ + /* 000012b8: */ 0x73, 0x69, 0x66, 0x69, 0x76, 0x65, 0x2c, 0x63, // sifive,c + /* 000012c0: */ 0x6c, 0x69, 0x6e, 0x74, 0x30, 0x00, 0x72, 0x69, // lint0.ri + /* 000012c8: */ 0x73, 0x63, 0x76, 0x2c, 0x63, 0x6c, 0x69, 0x6e, // scv,clin + /* 000012d0: */ 0x74, 0x30, 0x00, 0x63, 0x00, 0x00, 0x00, 0x02, // t0.c.... + /* 000012d8: */ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, // ........ + /* 000012e0: */ 0x00, 0x00, 0x00, 0x09, 0x6d, 0x6f, 0x64, 0x65, // ....mode + /* 000012e8: */ 0x6c, 0x00, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, // l.compat + /* 000012f0: */ 0x69, 0x62, 0x6c, 0x65, 0x00, 0x23, 0x73, 0x69, // ible.#si + /* 000012f8: */ 0x7a, 0x65, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x73, // ze-cells + /* 00001300: */ 0x00, 0x23, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, // .#addres + /* 00001308: */ 0x73, 0x2d, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x00, // s-cells. + /* 00001310: */ 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x00, 0x72, // ranges.r + /* 00001318: */ 0x6e, 0x67, 0x2d, 0x73, 0x65, 0x65, 0x64, 0x00, // ng-seed. + /* 00001320: */ 0x72, 0x65, 0x67, 0x00, 0x62, 0x61, 0x6e, 0x6b, // reg.bank + /* 00001328: */ 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x00, 0x64, // -width.d + /* 00001330: */ 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x68, 0x65, 0x72, // ma-coher + /* 00001338: */ 0x65, 0x6e, 0x74, 0x00, 0x72, 0x69, 0x73, 0x63, // ent.risc + /* 00001340: */ 0x76, 0x2c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2d, // v,event- + /* 00001348: */ 0x74, 0x6f, 0x2d, 0x6d, 0x68, 0x70, 0x6d, 0x63, // to-mhpmc + /* 00001350: */ 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x00, // ounters. + /* 00001358: */ 0x74, 0x69, 0x6d, 0x65, 0x62, 0x61, 0x73, 0x65, // timebase + /* 00001360: */ 0x2d, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, // -frequen + /* 00001368: */ 0x63, 0x79, 0x00, 0x6d, 0x6d, 0x75, 0x2d, 0x74, // cy.mmu-t + /* 00001370: */ 0x79, 0x70, 0x65, 0x00, 0x72, 0x69, 0x73, 0x63, // ype.risc + /* 00001378: */ 0x76, 0x2c, 0x69, 0x73, 0x61, 0x00, 0x72, 0x69, // v,isa.ri + /* 00001380: */ 0x73, 0x63, 0x76, 0x2c, 0x63, 0x62, 0x6f, 0x6d, // scv,cbom + /* 00001388: */ 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x73, // -block-s + /* 00001390: */ 0x69, 0x7a, 0x65, 0x00, 0x72, 0x69, 0x73, 0x63, // ize.risc + /* 00001398: */ 0x76, 0x2c, 0x63, 0x62, 0x6f, 0x7a, 0x2d, 0x62, // v,cboz-b + /* 000013a0: */ 0x6c, 0x6f, 0x63, 0x6b, 0x2d, 0x73, 0x69, 0x7a, // lock-siz + /* 000013a8: */ 0x65, 0x00, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, // e.status + /* 000013b0: */ 0x00, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, // .device_ + /* 000013b8: */ 0x74, 0x79, 0x70, 0x65, 0x00, 0x70, 0x68, 0x61, // type.pha + /* 000013c0: */ 0x6e, 0x64, 0x6c, 0x65, 0x00, 0x69, 0x6e, 0x74, // ndle.int + /* 000013c8: */ 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x2d, 0x63, // errupt-c + /* 000013d0: */ 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, // ontrolle + /* 000013d8: */ 0x72, 0x00, 0x23, 0x69, 0x6e, 0x74, 0x65, 0x72, // r.#inter + /* 000013e0: */ 0x72, 0x75, 0x70, 0x74, 0x2d, 0x63, 0x65, 0x6c, // rupt-cel + /* 000013e8: */ 0x6c, 0x73, 0x00, 0x63, 0x70, 0x75, 0x00, 0x69, // ls.cpu.i + /* 000013f0: */ 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, // nterrupt + /* 000013f8: */ 0x73, 0x2d, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, // s-extend + /* 00001400: */ 0x65, 0x64, 0x00, 0x72, 0x69, 0x73, 0x63, 0x76, // ed.riscv + /* 00001408: */ 0x2c, 0x6e, 0x64, 0x65, 0x76, 0x00, 0x69, 0x6e, // ,ndev.in + /* 00001410: */ 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x2d, // terrupt- + /* 00001418: */ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x00, 0x69, // parent.i + /* 00001420: */ 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, // nterrupt + /* 00001428: */ 0x73, 0x00, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2c, // s.linux, + /* 00001430: */ 0x70, 0x63, 0x69, 0x2d, 0x64, 0x6f, 0x6d, 0x61, // pci-doma + /* 00001438: */ 0x69, 0x6e, 0x00, 0x62, 0x75, 0x73, 0x2d, 0x72, // in.bus-r + /* 00001440: */ 0x61, 0x6e, 0x67, 0x65, 0x00, 0x69, 0x6e, 0x74, // ange.int + /* 00001448: */ 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x2d, 0x6d, // errupt-m + /* 00001450: */ 0x61, 0x70, 0x00, 0x69, 0x6e, 0x74, 0x65, 0x72, // ap.inter + /* 00001458: */ 0x72, 0x75, 0x70, 0x74, 0x2d, 0x6d, 0x61, 0x70, // rupt-map + /* 00001460: */ 0x2d, 0x6d, 0x61, 0x73, 0x6b, 0x00, 0x72, 0x65, // -mask.re + /* 00001468: */ 0x67, 0x6d, 0x61, 0x70, 0x00, 0x6f, 0x66, 0x66, // gmap.off + /* 00001470: */ 0x73, 0x65, 0x74, 0x00, 0x76, 0x61, 0x6c, 0x75, // set.valu + /* 00001478: */ 0x65, 0x00, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x2d, // e.clock- + /* 00001480: */ 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, // frequenc + /* 00001488: */ 0x79, 0x00, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, // y.stdout + /* 00001490: */ 0x2d, 0x70, 0x61, 0x74, 0x68, 0x00, // -path. +}; + +static void test_fdt_find_node_by_path(void **state) +{ + uint32_t addrcp, sizecp; + assert_int_equal(0, fdt_find_node_by_path(dtb, "test", &addrcp, &sizecp, NULL, NULL)); + assert_int_equal(56, fdt_find_node_by_path(dtb, "/", &addrcp, &sizecp, NULL, NULL)); + assert_int_equal(0, fdt_find_node_by_path(dtb, "/test", &addrcp, &sizecp, NULL, NULL)); + assert_int_equal(0x8e0, fdt_find_node_by_path(dtb, "/chosen", &addrcp, &sizecp, NULL, NULL)); + assert_int_equal(0x234, fdt_find_node_by_path(dtb, "/cpus", &addrcp, &sizecp, NULL, NULL)); + assert_int_equal(0x270, fdt_find_node_by_path(dtb, "/cpus/cpu@0", &addrcp, &sizecp, NULL, NULL)); + assert_int_equal(0x270, fdt_find_node_by_path(dtb, "/cpus/cpu@0/", &addrcp, &sizecp, NULL, NULL)); + uint16_t count_results; + uintptr_t results[3] = { 0 }; + uintptr last_offset = fdt_find_node_by_path(dtb, "/cpus/cpu@*", &addrcp, &sizecp, results, &count_results); + assert_int_equal(3, count_results); + assert_int_equal(0x270, results[0]); + assert_int_equal(0x400, results[1]); + assert_int_equal(0x590, results[2]); + //assert_int_equal(0x590, last_offset); TODO + assert_int_equal(0x1eC, fdt_find_node_by_path(dtb, "/memory@*", &addrcp, &sizecp, NULL, NULL)); +} + +static void test_fdt_find_node_by_alias(void **state) +{ + //TODO +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test(test_fdt_find_node_by_path), + cmocka_unit_test(test_fdt_find_node_by_alias), + }; + + return cb_run_group_tests(tests, NULL, NULL); +} diff --git a/tests/stubs/console.c b/tests/stubs/console.c index 14b3e71..56ce869 100644 --- a/tests/stubs/console.c +++ b/tests/stubs/console.c @@ -5,6 +5,7 @@ #include <stdio.h> #include <tests/test.h>
+#define TEST_PRINT 1 #ifndef TEST_PRINT #define TEST_PRINT 0 #endif