Skip to content

Commit

Permalink
feat: add fdt header
Browse files Browse the repository at this point in the history
Signed-off-by: Zone.N <[email protected]>
  • Loading branch information
MRNIU committed Jan 19, 2025
1 parent 827899e commit 214fbf9
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 67 deletions.
28 changes: 14 additions & 14 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,30 +22,30 @@ repos:
- id: clang-format
args:
- --style=file
- id: clang-tidy
args:
- --checks=.clang-tidy
- -p=/root/SimpleKernel/build_riscv64/compiler_commands.json
- -extra-arg=--std=c++2b
- --fix
- --header-filter=^(/root/SimpleKernel/build_riscv64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_riscv64/src/arch/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/root/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json
# - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(/root/SimpleKernel/build_aarch64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/x86_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(?/root/SimpleKernel/build_riscv64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_riscv64/src/arch/riscv_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).*
# - --header-filter=^(?/root/SimpleKernel/build_aarch64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).*
# - id: clang-tidy
# args:
# - --checks=.clang-tidy
# - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json
# - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json
# - -extra-arg=--std=c++2b
# - --fix
# - --header-filter=^(?/root/SimpleKernel/build_riscv64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_riscv64/src/arch/riscv64|/root/SimpleKernel/build_riscv64/src/arch/x86_64).*
# - --header-filter=^(?/root/SimpleKernel/build_aarch64/src/).*
# - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).*

- repo: https://github.com/koalaman/shellcheck-precommit
rev: v0.10.0
Expand Down
9 changes: 4 additions & 5 deletions src/kernel/arch/aarch64/arch_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) {
fdt_addr = 0x40000000;
}

auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t {
void ArchInit(uint32_t argc, const uint8_t* argv) {
// 初始化 FPU
cpu_io::SetupFpu();

Expand Down Expand Up @@ -82,12 +82,11 @@ auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t {
uart.PutChar('\n');

// __asm__ volatile("sev");

return 0;
}

auto ArchInitSMP(uint32_t argc, const uint8_t* argv) -> uint32_t {
void ArchInitSMP(uint32_t argc, const uint8_t* argv) {
(void)argc;
(void)argv;
return 0;

Singleton<BasicInfo>::GetInstance().core_count++;
}
3 changes: 2 additions & 1 deletion src/kernel/arch/aarch64/backtrace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include "arch.h"
#include "kernel_elf.hpp"
#include "kernel_log.hpp"
#include "sk_cstdio"
#include "sk_libc.h"

Expand All @@ -44,6 +45,6 @@ void DumpStack() {
// 打印地址
/// @todo 打印函数名,需要 elf 支持
for (auto i = 0; i < num_frames; i++) {
printf("[0x%p]\n", buffer[i]);
klog::Err("[0x%p]\n", buffer[i]);
}
}
4 changes: 2 additions & 2 deletions src/kernel/arch/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
* @param argc 在不同体系结构有不同含义,同 _start
* @param argv 在不同体系结构有不同含义,同 _start
*/
auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t;
auto ArchInitSMP(uint32_t argc, const uint8_t *argv) -> uint32_t;
void ArchInit(uint32_t argc, const uint8_t *argv);
void ArchInitSMP(uint32_t argc, const uint8_t *argv);

/// 最多回溯 128 层调用栈
static constexpr const size_t kMaxFrameCount = 128;
Expand Down
7 changes: 2 additions & 5 deletions src/kernel/arch/riscv64/arch_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) {
fdt_addr = reinterpret_cast<uint64_t>(argv);
}

auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t {
void ArchInit(uint32_t argc, const uint8_t *argv) {
printf("boot hart id: %d\n", argc);
printf("dtb info addr: %p\n", argv);

Expand Down Expand Up @@ -89,13 +89,10 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t {
printf("hart %d start failed: %d\n", i, ret.error);
}
}

return 0;
}

auto ArchInitSMP(uint32_t argc, const uint8_t *) -> uint32_t {
void ArchInitSMP(uint32_t argc, const uint8_t *) {
cpu_io::Tp::Write(argc);
GetCurrentCore().core_id_ = argc;
Singleton<BasicInfo>::GetInstance().core_count++;
return 0;
}
3 changes: 2 additions & 1 deletion src/kernel/arch/riscv64/backtrace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "arch.h"
#include "kernel_elf.hpp"
#include "kernel_fdt.hpp"
#include "kernel_log.hpp"
#include "sk_cstdio"
#include "sk_libc.h"

Expand All @@ -46,6 +47,6 @@ void DumpStack() {
// 打印地址
/// @todo 打印函数名,需要 elf 支持
for (auto i = 0; i < num_frames; i++) {
printf("[0x%p]\n", buffer[i]);
klog::Err("[0x%p]\n", buffer[i]);
}
}
53 changes: 26 additions & 27 deletions src/kernel/include/kernel_fdt.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,23 +38,38 @@
#include "singleton.hpp"

/**
* elf 文件相关
* fdt 相关
*/
class KernelFdt {
public:
struct FdtHeader {
uint32_t magic;
uint32_t totalsize;
uint32_t off_dt_struct;
uint32_t off_dt_strings;
uint32_t off_mem_rsvmap;
uint32_t version;
uint32_t last_comp_version;
uint32_t boot_cpuid_phys;
uint32_t size_dt_strings;
uint32_t size_dt_struct;
};

FdtHeader *fdt_header;

/**
* 构造函数
* @param fdt_addr fdt 地址
*/
explicit KernelFdt(uint64_t fdt_addr)
: fdt_addr_(reinterpret_cast<FdtHeader *>(fdt_addr)) {
if (fdt_addr_ == nullptr) {
explicit KernelFdt(uint64_t header)
: fdt_header(reinterpret_cast<FdtHeader *>(header)) {
if (fdt_header == nullptr) {
klog::Err("Fatal Error: Invalid fdt_addr.\n");
throw;
}

// 检查 fdt 头数据
if (fdt_check_header(fdt_addr_) != 0) {
if (fdt_check_header(fdt_header) != 0) {
klog::Err("Invalid device tree blob\n");
throw;
}
Expand All @@ -74,21 +89,21 @@ class KernelFdt {
* 获取内存信息
* @return 内存信息<地址,长度>
*/
auto GetMemory() -> std::pair<uint64_t, size_t> {
[[nodiscard]] auto GetMemory() const -> std::pair<uint64_t, size_t> {
uint64_t base = 0;
uint64_t size = 0;

int len = 0;

// 找到 /memory 节点
auto offset = fdt_path_offset(fdt_addr_, "/memory");
auto offset = fdt_path_offset(fdt_header, "/memory");
if (offset < 0) {
klog::Err("Error finding /memory node: %s\n", fdt_strerror(offset));
throw;
}

// 获取 reg 属性
const auto *prop = fdt_get_property(fdt_addr_, offset, "reg", &len);
const auto *prop = fdt_get_property(fdt_header, offset, "reg", &len);
if (prop == nullptr) {
klog::Err("Error finding reg property: %s\n", fdt_strerror(len));
throw;
Expand All @@ -107,7 +122,7 @@ class KernelFdt {
* 获取串口信息
* @return 内存信息<地址,长度>
*/
auto GetSerial() -> std::pair<uint64_t, size_t> {
[[nodiscard]] auto GetSerial() const -> std::pair<uint64_t, size_t> {
uint64_t base = 0;
uint64_t size = 0;

Expand All @@ -118,7 +133,7 @@ class KernelFdt {
"ns16550a"};

for (const auto &compatible : compatible_str) {
offset = fdt_node_offset_by_compatible(fdt_addr_, -1, compatible);
offset = fdt_node_offset_by_compatible(fdt_header, -1, compatible);
if (offset != -FDT_ERR_NOTFOUND) {
break;
}
Expand All @@ -129,7 +144,7 @@ class KernelFdt {
}

// 获取 reg 属性
const auto *prop = fdt_get_property(fdt_addr_, offset, "reg", &len);
const auto *prop = fdt_get_property(fdt_header, offset, "reg", &len);
if (prop == nullptr) {
klog::Err("Error finding reg property: %s\n", fdt_strerror(len));
throw;
Expand All @@ -143,22 +158,6 @@ class KernelFdt {
}
return {base, size};
}

private:
struct FdtHeader {
uint32_t magic;
uint32_t totalsize;
uint32_t off_dt_struct;
uint32_t off_dt_strings;
uint32_t off_mem_rsvmap;
uint32_t version;
uint32_t last_comp_version;
uint32_t boot_cpuid_phys;
uint32_t size_dt_strings;
uint32_t size_dt_struct;
};

FdtHeader *fdt_addr_;
};

#endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_FDT_HPP_ */
19 changes: 7 additions & 12 deletions src/kernel/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,21 +54,16 @@ void _start(uint32_t argc, uint8_t *argv) {

auto main(uint32_t argc, uint8_t *argv) -> uint32_t {
// 架构相关初始化
[[maybe_unused]] auto arch_init_ret = ArchInit(argc, argv);
ArchInit(argc, argv);

// printf("Hello SimpleKernel\n");
klog::Debug("Hello SimpleKernel\n");
klog::Info("Hello SimpleKernel\n");
klog::Warn("Hello SimpleKernel\n");
klog::Err("Hello SimpleKernel\n");
// klog::debug << "Hello SimpleKernel\n";
// klog::info << "Hello SimpleKernel\n";
// klog::warn << "Hello SimpleKernel\n";
// klog::err << "Hello SimpleKernel\n";
// klog::Debug("Hello SimpleKernel\n");
// klog::Info("Hello SimpleKernel\n");
// klog::Warn("Hello SimpleKernel\n");
// klog::Err("Hello SimpleKernel\n");

// DumpStack();
DumpStack();

// sk_std::cout << "Hello ostream" << sk_std::endl;
klog::info << "Hello SimpleKernel\n";

return 0;
}

0 comments on commit 214fbf9

Please sign in to comment.