7#include <gtest/gtest.h>
33 ASSERT_TRUE(result.has_value()) << result.error().message();
35 auto [memory_base, memory_size] = *result;
44 ASSERT_TRUE(result.has_value()) << result.error().message();
46 auto [serial_base, serial_size, serial_irq] = *result;
56 ASSERT_TRUE(result.has_value()) << result.error().message();
65 ASSERT_TRUE(result.has_value()) << result.error().message();
77 ASSERT_TRUE(result1.has_value());
78 ASSERT_TRUE(result2.has_value());
80 auto [memory_base1, memory_size1] = *result1;
81 auto [memory_base2, memory_size2] = *result2;
91 kerlen_fdt2 = kerlen_fdt;
96 ASSERT_TRUE(result1.has_value());
97 ASSERT_TRUE(result2.has_value());
99 auto [memory_base1, memory_size1] = *result1;
100 auto [memory_base2, memory_size2] = *result2;
109 ASSERT_TRUE(result.has_value());
110 auto [expected_base, expected_size] = *result;
112 KernelFdt kerlen_fdt2(std::move(kerlen_fdt));
115 ASSERT_TRUE(result2.has_value());
116 auto [memory_base, memory_size] = *result2;
125 ASSERT_TRUE(result.has_value());
126 auto [expected_base, expected_size] = *result;
129 kerlen_fdt2 = std::move(kerlen_fdt);
132 ASSERT_TRUE(result2.has_value());
133 auto [memory_base, memory_size] = *result2;
145 [&count](
int offset,
const char* node_name, uint64_t mmio_base,
146 size_t mmio_size, uint32_t irq) ->
bool {
155 ASSERT_TRUE(result.has_value()) << result.error().message();
162 bool found_plic =
false;
164 [&found_plic](
const char* node_name,
const char* compatible_data,
165 size_t compatible_len, uint64_t mmio_base,
size_t mmio_size,
166 uint32_t irq) ->
bool {
170 if (compatible_data ==
nullptr || compatible_len == 0) {
175 if (
strcmp(node_name,
"plic@c000000") == 0) {
180 EXPECT_STREQ(compatible_data,
"sifive,plic-1.0.0");
183 compatible_data +
strlen(
"sifive,plic-1.0.0") + 1;
184 EXPECT_STREQ(second,
"riscv,plic0");
188 ASSERT_TRUE(result.has_value()) << result.error().message();
189 EXPECT_TRUE(found_plic) <<
"PLIC node not found in ForEachNode traversal";
197 "nonexistent,device",
198 [&count](
int offset,
const char* node_name, uint64_t mmio_base,
199 size_t mmio_size, uint32_t irq) ->
bool {
208 ASSERT_TRUE(result.has_value()) << result.error().message();
218 [&count](
int offset,
const char* node_name, uint64_t mmio_base,
219 size_t mmio_size, uint32_t irq) ->
bool {
228 ASSERT_TRUE(result.has_value()) << result.error().message();
241 [&count](
int offset,
const char* node_name, uint64_t mmio_base,
242 size_t mmio_size, uint32_t irq) ->
bool {
251 ASSERT_TRUE(result.has_value()) << result.error().message();
test_env::TestEnvironmentState env_state_
FDT(Flattened Device Tree)解析器
auto GetTimebaseFrequency() const -> Expected< uint32_t >
获取 CPU 时钟频率
auto GetCoreCount() const -> Expected< size_t >
获取 CPU 核心数量
auto GetSerial() const -> Expected< std::tuple< uint64_t, size_t, uint32_t > >
获取串口信息
auto ForEachCompatibleNode(const char *compatible, Callback &&callback) const -> Expected< void >
遍历所有匹配指定 compatible 的 FDT 节点
auto ForEachNode(Callback &&callback) const -> Expected< void >
遍历 FDT 中所有设备节点
auto GetMemory() const -> Expected< std::pair< uint64_t, size_t > >
获取内存信息
void ClearCurrentThreadEnvironment()
清除当前线程的环境实例指针
void BindThreadToCore(std::thread::id tid, size_t core_id)
将指定线程绑定到核心
void InitializeCores(size_t num_cores)
初始化指定数量的核心
void SetCurrentThreadEnvironment()
设置当前线程的环境实例指针
TEST_F(KernelFdtTest, ConstructorTest)
static constexpr uint8_t riscv64_virt_dtb_data[]
#define EXPECT_TRUE(cond, msg)
#define EXPECT_GT(val1, val2, msg)
#define EXPECT_EQ(val1, val2, msg)