blob: 95ab69186bac98dc5d0016dd4ad34c2d62b3df36 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "lib.h"
#include <assert.h>
size_t serialize_zbi_topology_x64_info_t(uint8_t buffer[], uint32_t apic_ids[4],
uint32_t apic_id_count) {
zbi_topology_x64_info_t node = {.apic_ids = {apic_ids[0], apic_ids[1], apic_ids[2], apic_ids[3]},
.apic_id_count = apic_id_count};
size_t size = sizeof(zbi_topology_x64_info_t);
std::memcpy(buffer, &node, size);
return size;
}
size_t serialize_zbi_topology_arm64_info_t(uint8_t buffer[], uint8_t cluster_1_id,
uint8_t cluster_2_id, uint8_t cluster_3_id,
uint8_t cpu_id, uint8_t gic_id) {
zbi_topology_arm64_info_t node = {.cluster_1_id = cluster_1_id,
.cluster_2_id = cluster_2_id,
.cluster_3_id = cluster_3_id,
.cpu_id = cpu_id,
.gic_id = gic_id};
size_t size = sizeof(zbi_topology_arm64_info_t);
std::memcpy(buffer, &node, size);
return size;
}
size_t serialize_zbi_topology_cache_t(uint8_t buffer[], uint32_t cache_id) {
zbi_topology_cache_t node = {.cache_id = cache_id};
size_t size = sizeof(zbi_topology_cache_t);
std::memcpy(buffer, &node, size);
return size;
}
size_t serialize_zbi_topology_numa_region_v2_t(uint8_t buffer[], uint64_t start_address,
uint64_t end_address) {
zbi_topology_numa_region_v2_t node = {.start_address = start_address, .end_address = end_address};
size_t size = sizeof(zbi_topology_numa_region_v2_t);
std::memcpy(buffer, &node, size);
return size;
}
size_t serialize_zbi_topology_cluster_t(uint8_t buffer[], uint8_t performance_class) {
zbi_topology_cluster_t node = {.performance_class = performance_class};
size_t size = sizeof(zbi_topology_cluster_t);
std::memcpy(buffer, &node, size);
return size;
}
size_t serialize_zbi_topology_processor_v2_t(uint8_t buffer[], uint16_t logical_ids[],
uint8_t logical_id_count, uint16_t flags,
uint8_t architecture,
architecture_info_t architecture_info) {
zbi_topology_processor_v2_t node = {
.logical_ids = {logical_ids[0], logical_ids[1], logical_ids[2], logical_ids[3]}};
node.logical_id_count = logical_id_count;
node.flags = flags;
node.architecture = architecture;
if (node.architecture == ZBI_TOPOLOGY_ARCHITECTURE_ARM64) {
node.architecture_info.arm64 = architecture_info.arm64;
} else if (node.architecture == ZBI_TOPOLOGY_ARCHITECTURE_X64) {
node.architecture_info.x64 = architecture_info.x64;
} else {
assert(node.architecture == ZBI_TOPOLOGY_ARCHITECTURE_UNDEFINED);
}
size_t size = sizeof(zbi_topology_processor_v2_t);
std::memcpy(buffer, &node, size);
return size;
}
size_t serialize_zbi_topology_node_v2_t(uint8_t buffer[], uint8_t entity_type,
uint16_t parent_index, entity_t entity) {
zbi_topology_node_v2_t node = {.entity_type = entity_type, .parent_index = parent_index};
if (node.entity_type == ZBI_TOPOLOGY_ENTITY_V2_PROCESSOR) {
node.entity.processor = entity.processor;
} else if (node.entity_type == ZBI_TOPOLOGY_ENTITY_V2_CLUSTER) {
node.entity.cluster = entity.cluster;
} else if (node.entity_type == ZBI_TOPOLOGY_ENTITY_V2_NUMA_REGION) {
node.entity.numa_region = entity.numa_region;
} else if (node.entity_type == ZBI_TOPOLOGY_ENTITY_V2_CACHE) {
node.entity.cache = entity.cache;
}
size_t size = sizeof(zbi_topology_node_v2_t);
std::memcpy(buffer, &node, size);
return size;
}