diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f7..f09ff93f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -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 diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index 78fd1800..1a34cdf3 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -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(); @@ -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::GetInstance().core_count++; } diff --git a/src/kernel/arch/aarch64/backtrace.cpp b/src/kernel/arch/aarch64/backtrace.cpp index bccd4ec3..2b440ed2 100644 --- a/src/kernel/arch/aarch64/backtrace.cpp +++ b/src/kernel/arch/aarch64/backtrace.cpp @@ -19,6 +19,7 @@ #include "arch.h" #include "kernel_elf.hpp" +#include "kernel_log.hpp" #include "sk_cstdio" #include "sk_libc.h" @@ -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]); } } diff --git a/src/kernel/arch/arch.h b/src/kernel/arch/arch.h index 8f9ffbe5..edee81ef 100644 --- a/src/kernel/arch/arch.h +++ b/src/kernel/arch/arch.h @@ -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; diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 71cd889a..44a7f71a 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -47,7 +47,7 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = reinterpret_cast(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); @@ -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::GetInstance().core_count++; - return 0; } diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index cd7077dc..327cb247 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -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" @@ -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]); } } diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index ff6df031..ff56846a 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -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(fdt_addr)) { - if (fdt_addr_ == nullptr) { + explicit KernelFdt(uint64_t header) + : fdt_header(reinterpret_cast(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; } @@ -74,21 +89,21 @@ class KernelFdt { * 获取内存信息 * @return 内存信息<地址,长度> */ - auto GetMemory() -> std::pair { + [[nodiscard]] auto GetMemory() const -> std::pair { 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; @@ -107,7 +122,7 @@ class KernelFdt { * 获取串口信息 * @return 内存信息<地址,长度> */ - auto GetSerial() -> std::pair { + [[nodiscard]] auto GetSerial() const -> std::pair { uint64_t base = 0; uint64_t size = 0; @@ -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; } @@ -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; @@ -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_ */ diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index c72b2aa4..53adaa4f 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -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; }