From 5a6f5759994f4ec650c989b8071c363f23345384 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 4 Dec 2024 09:40:41 +0000 Subject: [PATCH 001/232] add grub2 and xorriso Signed-off-by: Zone.N --- tools/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/Dockerfile b/tools/Dockerfile index f8046288a..767dd67b1 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -59,6 +59,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ git \ qemu-system \ gdb-multiarch \ + grub2 \ + xorriso \ libgtest-dev \ pkg-config \ flex \ From e4e534b1ce14fa18bb43657565dbd659b5cdc907 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 4 Dec 2024 09:52:53 +0000 Subject: [PATCH 002/232] add grub2 submodule Signed-off-by: Zone.N --- .gitmodules | 3 +++ 3rd/grub2 | 1 + cmake/3rd.cmake | 6 ++++++ 3 files changed, 10 insertions(+) create mode 160000 3rd/grub2 diff --git a/.gitmodules b/.gitmodules index 2c4a3d518..e93978d2a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -20,3 +20,6 @@ [submodule "3rd/googletest"] path = 3rd/googletest url = https://github.com/google/googletest.git +[submodule "3rd/grub2"] + path = 3rd/grub2 + url = https://git.savannah.gnu.org/git/grub.git diff --git a/3rd/grub2 b/3rd/grub2 new file mode 160000 index 000000000..6811f6f09 --- /dev/null +++ b/3rd/grub2 @@ -0,0 +1 @@ +Subproject commit 6811f6f09d61996a3acbc4fc0414e45964f0e2d9 diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 9cfcbbe79..0077f8dc5 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -58,6 +58,12 @@ if (NOT TARGET gtest) include(GoogleTest) endif () +# https://git.savannah.gnu.org/git/grub.git +set(grub2_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/grub2) +target_include_directories(grub2 INTERFACE + ${grub2_SOURCE_DIR}/include +) + # https://github.com/gdbinit/Gdbinit.git set(gdbinit_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/gdbinit) set(gdbinit_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/gdbinit) From 2c9925fe07eb86a74849efd947203597d5c7773b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 4 Dec 2024 09:53:38 +0000 Subject: [PATCH 003/232] doc: add grub2 Signed-off-by: Zone.N --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1b96d52bc..b2e1168b9 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,8 @@ boot branch ## 使用的第三方资源 +[grub2](https://git.savannah.gnu.org/git/grub.git) + [opensbi](https://github.com/riscv-software-src/opensbi) [gnu-efi](https://sourceforge.net/projects/gnu-efi/) From 15af3e7fca5fffce9fc565dcda87e2be965f200c Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 4 Dec 2024 21:43:38 +0800 Subject: [PATCH 004/232] tool: fix package typo Signed-off-by: Zone.NiuZH --- tools/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index 767dd67b1..fdd21caaf 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -59,7 +59,7 @@ RUN apt install --no-install-recommends --fix-missing -y \ git \ qemu-system \ gdb-multiarch \ - grub2 \ + grub-common \ xorriso \ libgtest-dev \ pkg-config \ From fdd6c8000512c7a4485bbc8238ca4bb964e6d837 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 4 Dec 2024 22:59:59 +0800 Subject: [PATCH 005/232] tool: fix style Signed-off-by: Zone.NiuZH --- .devcontainer/devcontainer.json | 22 ++++++++++++++++++++++ .pre-commit-config.yaml | 7 +++++++ src/kernel/main.cpp | 4 ++-- tools/Dockerfile | 3 +++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .pre-commit-config.yaml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..b332f39d7 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,22 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu +{ + "name": "Ubuntu", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "image": "mcr.microsoft.com/devcontainers/base:jammy" + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..8eb6d0e4f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +fail_fast: false +repos: + - repo: https://github.com/pocc/pre-commit-hooks + rev: master + hooks: + - id: clang-format + args: [--style=file] diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 89be68d96..a24b8499a 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -16,10 +16,10 @@ #include #include "arch.h" -#include "sk_cstdio" -#include "sk_iostream" #include "kernel.h" #include "kernel_log.hpp" +#include "sk_cstdio" +#include "sk_iostream" #include "sk_libcxx.h" void _start(uint32_t argc, uint8_t *argv) { diff --git a/tools/Dockerfile b/tools/Dockerfile index fdd21caaf..75caed01c 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -30,8 +30,11 @@ RUN apt install --no-install-recommends --fix-missing -y \ doxygen \ valgrind \ graphviz \ + pre-commit \ clang-format \ clang-tidy \ + uncrustify \ + iwyu \ cppcheck \ lcov RUN locale-gen en_US.UTF-8 && locale-gen zh_CN.UTF-8 \ From da305db8b695c11edcc6abc3f4200ad3a14c143a Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 4 Dec 2024 23:01:22 +0800 Subject: [PATCH 006/232] tool: fix style Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8eb6d0e4f..987c3d369 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ fail_fast: false repos: - repo: https://github.com/pocc/pre-commit-hooks - rev: master + rev: v1.3.5 hooks: - id: clang-format args: [--style=file] From fbd98d7cca5eea7f3fa71b937b7db0caef57cd82 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 4 Dec 2024 23:11:05 +0800 Subject: [PATCH 007/232] tool: add Super-linter Signed-off-by: Zone.NiuZH --- .github/workflows/workflow.yml | 7 +++++++ cmake/3rd.cmake | 12 ------------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 83520b6cf..f2d513547 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -19,6 +19,8 @@ jobs: runs-on: ubuntu-latest permissions: contents: write + packages: read + statuses: write steps: - uses: actions/checkout@v3 @@ -69,3 +71,8 @@ jobs: with: github_token: ${{secrets.GITHUB_TOKEN}} publish_dir: ${{github.workspace}}/doc/html + + - name: Super-Linter + uses: super-linter/super-linter@v7.2.0 + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} \ No newline at end of file diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 0077f8dc5..b20502913 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -316,18 +316,6 @@ add_custom_target(clang-tidy > ${CMAKE_BINARY_DIR}/clang_tidy_report.log 2>&1 ) -# clang-format -find_program(CLANG_FORMAT_EXE NAMES clang-format) -if (NOT CLANG_FORMAT_EXE) - message(FATAL_ERROR "clang-format not found.\n" - "Following https://clang.llvm.org/docs/ClangFormat.html to install.") -endif () -add_custom_target(clang-format - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Run clang-format on ${ALL_SOURCE_FILES} ..." - COMMAND ${CLANG_FORMAT_EXE} -i -style=file ${ALL_SOURCE_FILES} -) - if (CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) # genhtml 生成测试覆盖率报告网页 find_program(GENHTML_EXE genhtml) From 1c3a10cf937c58c3e13bfe5da3a3484f51a1fdd8 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 4 Dec 2024 23:18:54 +0800 Subject: [PATCH 008/232] cmake: fix error Signed-off-by: Zone.NiuZH --- cmake/3rd.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index b20502913..a9993d139 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -60,6 +60,7 @@ endif () # https://git.savannah.gnu.org/git/grub.git set(grub2_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/grub2) +add_library(grub2 INTERFACE) target_include_directories(grub2 INTERFACE ${grub2_SOURCE_DIR}/include ) From a0701713de3f237c03bff19fe3ff24b48258ed6e Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 5 Dec 2024 00:00:01 +0800 Subject: [PATCH 009/232] tool: update deccontainer Signed-off-by: Zone.NiuZH --- .devcontainer/devcontainer.json | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b332f39d7..a7cab7ffc 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,22 +1,15 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu { - "name": "Ubuntu", - // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile - "image": "mcr.microsoft.com/devcontainers/base:jammy" - - // Features to add to the dev container. More info: https://containers.dev/features. - // "features": {}, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], - - // Use 'postCreateCommand' to run commands after the container is created. - // "postCreateCommand": "uname -a", - - // Configure tool-specific properties. - // "customizations": {}, - - // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. - // "remoteUser": "root" + "name": "SimpleKernel DevContainer", + "dockerFile": "../tools/Dockerfile", + "postCreateCommand": "bash -i -c 'pre-commit install'", + "customizations": { + "vscode": { + "extensions": [ + "ms-vscode.cpptools", + "ms-vscode.cpptools-extension-pack", + "twxs.cmake", + "ms-vscode.cmake-tools" + ] + } + } } From 5a7e3406aea5e6e048f61cf2820a5a19e004ec35 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 5 Dec 2024 09:15:37 +0800 Subject: [PATCH 010/232] 3rd: auto install pre-commit Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 9 +++++++++ cmake/3rd.cmake | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 987c3d369..52254f9d3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,3 +5,12 @@ repos: hooks: - id: clang-format args: [--style=file] + + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 # Use the ref you want to point at + hooks: + - id: trailing-whitespace + - id: check-json + - id: check-case-conflict + - id: check-illegal-windows-names + - id: trailing-whitespace \ No newline at end of file diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index a9993d139..82625937b 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -52,6 +52,11 @@ # add_library(Freetype::Freetype ALIAS freetype) # endif() +# Pre-commit hooks +if (NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit) + EXECUTE_PROCESS(COMMAND pre-commit install) +endif () + # https://github.com/google/googletest.git if (NOT TARGET gtest) add_subdirectory(3rd/googletest) From c363535fe0b8072eda16c565d146149fbf749bf2 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 02:10:12 +0000 Subject: [PATCH 011/232] tools: update pre-commit rule Signed-off-by: Zone.N --- .pre-commit-config.yaml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 52254f9d3..4525eba01 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,10 +7,17 @@ repos: args: [--style=file] - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 # Use the ref you want to point at + rev: v5.0.0 hooks: - - id: trailing-whitespace - - id: check-json - id: check-case-conflict - id: check-illegal-windows-names - - id: trailing-whitespace \ No newline at end of file + - id: check-json + - id: check-merge-conflict + - id: check-symlinks + - id: check-xml + - id: check-yaml + - id: destroyed-symlinks + - id: detect-private-key + - id: end-of-file-fixer + - id: mixed-line-ending + - id: trailing-whitespace From d69ad45b1ae20a7deb11eb83cab0cebf74a217a4 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 02:11:57 +0000 Subject: [PATCH 012/232] tools: add cpplint Signed-off-by: Zone.N --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4525eba01..1da4364eb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,7 @@ repos: hooks: - id: clang-format args: [--style=file] + - id: cpplint - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 From 0e618743b28b8731687337a6539c4e158e511bcd Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 02:20:01 +0000 Subject: [PATCH 013/232] fix cpplint Signed-off-by: Zone.N --- .pre-commit-config.yaml | 1 + src/kernel/main.cpp | 1 - tools/Dockerfile | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1da4364eb..03f7fbe2f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,6 +6,7 @@ repos: - id: clang-format args: [--style=file] - id: cpplint + args: [--filter=-build/include_subdir] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index a24b8499a..22fa6ac69 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -29,7 +29,6 @@ void _start(uint32_t argc, uint8_t *argv) { // 进入死循环 while (1) { - ; } } diff --git a/tools/Dockerfile b/tools/Dockerfile index 75caed01c..547dbcb79 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -36,6 +36,7 @@ RUN apt install --no-install-recommends --fix-missing -y \ uncrustify \ iwyu \ cppcheck \ + cpplint \ lcov RUN locale-gen en_US.UTF-8 && locale-gen zh_CN.UTF-8 \ && mkdir -p /var/run/sshd \ From b4848eb742f51509c5555e972f753851e939e577 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 07:21:28 +0000 Subject: [PATCH 014/232] remove AnalyzeTemporaryDtors Signed-off-by: Zone.N --- .clang-tidy | 32 ++++++++++++++++++-------------- .github/workflows/workflow.yml | 10 ++++++---- .pre-commit-config.yaml | 25 +++++++++++++++++-------- src/kernel/libc/CMakeLists.txt | 3 +++ src/kernel/main.cpp | 6 ++++-- tools/Dockerfile | 1 + 6 files changed, 49 insertions(+), 28 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 72e28b0c4..3f14f0a73 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -5,18 +5,22 @@ # .clang-tidy for Simple-XX/SimpleKernel. --- -Checks: '-*,\ - bugprone-*,\ - clang-analyzer-*,\ - cppcoreguidelines-*,\ - hicpp-*,\ - llvm-*,\ - misc-* - modernize-*,\ - performance-*,\ - portability-*,\ - readability-*,\ - -cppcoreguidelines-pro-type-reinterpret-cast' -HeaderFilterRegex: '^${sourceDir}/src' -AnalyzeTemporaryDtors: true +Checks: > + -*, + bugprone-*, + google-*, + misc-*, + modernize-*, + performance-*, + portability-*, + readability-*, + -google-readability-namespace-comments, + -google-runtime-int, + -google-runtime-references, + -misc-non-private-member-variables-in-classes, + -readability-named-parameter, + -readability-braces-around-statements, + -readability-magic-numbers +HeaderFilterRegex: '^${sourceDir}/src/*' +FormatStyle: google ... diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index f2d513547..0da75a3cf 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -22,7 +22,9 @@ jobs: packages: read statuses: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Install dependencies run: | @@ -62,7 +64,7 @@ jobs: - name: Build Doc if: github.ref == 'refs/heads/main' run: | - cmake --preset=build_x86_64 + cmake --preset=build_x86_64 cmake --build build_x86_64 --target doc - name: Publish @@ -74,5 +76,5 @@ jobs: - name: Super-Linter uses: super-linter/super-linter@v7.2.0 - env: - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} \ No newline at end of file + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 03f7fbe2f..fe1eea75d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,5 @@ fail_fast: false repos: - - repo: https://github.com/pocc/pre-commit-hooks - rev: v1.3.5 - hooks: - - id: clang-format - args: [--style=file] - - id: cpplint - args: [--filter=-build/include_subdir] - - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: @@ -23,3 +15,20 @@ repos: - id: end-of-file-fixer - id: mixed-line-ending - id: trailing-whitespace + + - repo: https://github.com/cpp-linter/cpp-linter-hooks + rev: v0.5.1 + hooks: + - id: clang-format + args: + - --style=file + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=build_riscv64/compiler_commands.json + - -extra-arg=--std=c++2b + + - repo: https://github.com/koalaman/shellcheck-precommit + rev: v0.10.0 + hooks: + - id: shellcheck diff --git a/src/kernel/libc/CMakeLists.txt b/src/kernel/libc/CMakeLists.txt index f6a5cc915..57c6c98d4 100644 --- a/src/kernel/libc/CMakeLists.txt +++ b/src/kernel/libc/CMakeLists.txt @@ -14,4 +14,7 @@ target_sources(libc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/sk_libc.c ${CMAKE_CURRENT_SOURCE_DIR}/sk_string.c ${CMAKE_CURRENT_SOURCE_DIR}/sk_stdio.c + /usr/include + /usr/riscv64-linux-gnu/include + /usr/x86_64-linux-gnu/include ) diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 22fa6ac69..6ce86a422 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -24,15 +24,17 @@ void _start(uint32_t argc, uint8_t *argv) { CppInit(); + + auto eag = 0; main(argc, argv); CppDeInit(); // 进入死循环 - while (1) { + while (true) { } } -uint32_t main(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); diff --git a/tools/Dockerfile b/tools/Dockerfile index 547dbcb79..09d1321a5 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -37,6 +37,7 @@ RUN apt install --no-install-recommends --fix-missing -y \ iwyu \ cppcheck \ cpplint \ + shellcheck \ lcov RUN locale-gen en_US.UTF-8 && locale-gen zh_CN.UTF-8 \ && mkdir -p /var/run/sshd \ From bca84bf3dc4220931cf8081b948b17a0778f31d7 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 07:23:17 +0000 Subject: [PATCH 015/232] remove AnalyzeTemporaryDtors Signed-off-by: Zone.N --- src/kernel/CMakeLists.txt | 3 +++ src/kernel/libc/CMakeLists.txt | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index bbc0f4ba9..8bc3707bf 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -26,6 +26,9 @@ add_executable(${PROJECT_NAME} # 添加头文件 target_include_directories(kernel PRIVATE include + /usr/lib/gcc-cross/riscv64-linux-gnu/13/include + /usr/lib/gcc-cross/riscv64-linux-gnu/13/../../../../riscv64-linux-gnu/include + /usr/include ) # 添加要链接的库 diff --git a/src/kernel/libc/CMakeLists.txt b/src/kernel/libc/CMakeLists.txt index 57c6c98d4..f6a5cc915 100644 --- a/src/kernel/libc/CMakeLists.txt +++ b/src/kernel/libc/CMakeLists.txt @@ -14,7 +14,4 @@ target_sources(libc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/sk_libc.c ${CMAKE_CURRENT_SOURCE_DIR}/sk_string.c ${CMAKE_CURRENT_SOURCE_DIR}/sk_stdio.c - /usr/include - /usr/riscv64-linux-gnu/include - /usr/x86_64-linux-gnu/include ) From ebeb738aaaa574676abe5bfa02d27ef7ec358101 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 07:47:47 +0000 Subject: [PATCH 016/232] remove clang-tidy in 3rd Signed-off-by: Zone.N --- cmake/3rd.cmake | 29 ----------------------------- cmake/compile_config.cmake | 4 ++++ src/kernel/CMakeLists.txt | 3 --- 3 files changed, 4 insertions(+), 32 deletions(-) diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 82625937b..2a1a5c099 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -293,35 +293,6 @@ add_custom_target(cppcheck --output-file=${CMAKE_BINARY_DIR}/cppcheck_report.log ) -# 获取全部源文件 -file(GLOB_RECURSE ALL_SOURCE_FILES - ${CMAKE_SOURCE_DIR}/src/*.h - ${CMAKE_SOURCE_DIR}/src/*.hpp - ${CMAKE_SOURCE_DIR}/src/*.c - ${CMAKE_SOURCE_DIR}/src/*.cpp - ${CMAKE_SOURCE_DIR}/test/*.h - ${CMAKE_SOURCE_DIR}/test/*.hpp - ${CMAKE_SOURCE_DIR}/test/*.c - ${CMAKE_SOURCE_DIR}/test/*.cpp -) - -# clang-tidy -find_program(CLANG_TIDY_EXE NAMES clang-tidy) -if (NOT CLANG_TIDY_EXE) - message(FATAL_ERROR "clang-tidy not found.\n" - "Following https://clang.llvm.org/extra/clang-tidy to install.") -endif () -add_custom_target(clang-tidy - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Run clang-tidy on ${ALL_SOURCE_FILES} ..." - COMMAND - ${CLANG_TIDY_EXE} - --config-file=${CMAKE_SOURCE_DIR}/.clang-tidy - -p=${CMAKE_BINARY_DIR} - ${ALL_SOURCE_FILES} - > ${CMAKE_BINARY_DIR}/clang_tidy_report.log 2>&1 -) - if (CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) # genhtml 生成测试覆盖率报告网页 find_program(GENHTML_EXE genhtml) diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index b189a3275..f8fa58749 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -65,6 +65,10 @@ target_compile_options(compile_options INTERFACE # 平台相关 $<$: > + + -I/usr/lib/gcc-cross/riscv64-linux-gnu/13/include + -I/usr/lib/gcc-cross/riscv64-linux-gnu/13/../../../../riscv64-linux-gnu/include + -I/usr/include ) # 通用链接选项 diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 8bc3707bf..bbc0f4ba9 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -26,9 +26,6 @@ add_executable(${PROJECT_NAME} # 添加头文件 target_include_directories(kernel PRIVATE include - /usr/lib/gcc-cross/riscv64-linux-gnu/13/include - /usr/lib/gcc-cross/riscv64-linux-gnu/13/../../../../riscv64-linux-gnu/include - /usr/include ) # 添加要链接的库 From dbbe710a4a6b4fd867d4d563eeb88d8d586e51b3 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 5 Dec 2024 09:45:52 +0000 Subject: [PATCH 017/232] remove clang-tidy in 3rd Signed-off-by: Zone.N --- cmake/compile_config.cmake | 26 +++++++++++++++++++++++--- cmake/project_config.cmake | 7 ------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index f8fa58749..85979f3be 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -12,6 +12,28 @@ target_compile_definitions(compile_definitions INTERFACE $<$:SIMPLEKERNEL_DEBUG> ) +# 获取 gcc 的 include 路径 +execute_process( + COMMAND + sh -c "echo | ${CMAKE_CXX_COMPILER} -v -x c -E - 2>&1 | sed -n '/#include <...> search starts here:/,/End of search list./{/^ /p}'" + OUTPUT_VARIABLE GCC_OUTPUT + ERROR_VARIABLE GCC_ERROR + RESULT_VARIABLE GCC_RESULT + OUTPUT_STRIP_TRAILING_WHITESPACE +) +# 检查 gcc 是否成功执行 +if(NOT GCC_RESULT EQUAL 0) + message(FATAL_ERROR "Failed to run ${CMAKE_CXX_COMPILER} -v") +endif() +# 分割路径并生成路径列表 +string(REPLACE "\n" ";" INCLUDE_PATH_LIST "${GCC_OUTPUT}") +# 使用 `-I` 将路径添加到编译选项中 +foreach(INCLUDE_PATH ${INCLUDE_PATH_LIST}) + string(REGEX REPLACE " " "" CLEAN_PATH ${INCLUDE_PATH}) + list(APPEND CROSS_INCLUDE_PATHS "-I${CLEAN_PATH}") +endforeach() +message(STATUS "GCC Include CROSS_INCLUDE_PATHS: ${CROSS_INCLUDE_PATHS}") + # 通用编译选项 add_library(compile_options INTERFACE) target_compile_options(compile_options INTERFACE @@ -66,9 +88,7 @@ target_compile_options(compile_options INTERFACE $<$: > - -I/usr/lib/gcc-cross/riscv64-linux-gnu/13/include - -I/usr/lib/gcc-cross/riscv64-linux-gnu/13/../../../../riscv64-linux-gnu/include - -I/usr/include + ${CROSS_INCLUDE_PATHS} ) # 通用链接选项 diff --git a/cmake/project_config.cmake b/cmake/project_config.cmake index 06b845575..4a0161cff 100644 --- a/cmake/project_config.cmake +++ b/cmake/project_config.cmake @@ -5,13 +5,6 @@ # project_config.cmake for Simple-XX/SimpleKernel. # 配置信息 -# 设置 cmake 目标环境根目录 -# @todo 设置目录 -list(APPEND CMAKE_FIND_ROOT_PATH - /usr/x86_64-linux-gnu - /usr/riscv64-linux-gnu - /usr/aarch64-linux-gnu -) # 在目标环境搜索 program set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 在目标环境搜索库文件 From 722e001c662628a39426ad6cfe45e44b8b4f207e Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 07:03:27 +0000 Subject: [PATCH 018/232] test pre-commit Signed-off-by: Zone.N --- src/kernel/arch/riscv64/include/cpu/regs.hpp | 25 +++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/kernel/arch/riscv64/include/cpu/regs.hpp b/src/kernel/arch/riscv64/include/cpu/regs.hpp index 1d8a384ed..a035a269e 100644 --- a/src/kernel/arch/riscv64/include/cpu/regs.hpp +++ b/src/kernel/arch/riscv64/include/cpu/regs.hpp @@ -56,7 +56,7 @@ struct FpInfo : public RegInfoBase {}; }; // namespace register_info // 第二部分:读/写模版实现 -namespace { +namespace read_write { /** * 只读接口 * @tparam 寄存器类型 @@ -78,7 +78,7 @@ class ReadOnlyRegBase { * 读寄存器 * @return RegInfo::DataType 寄存器的值 */ - static __always_inline RegInfo::DataType Read() { + static __always_inline auto Read() -> typename RegInfo::DataType { typename RegInfo::DataType value{}; if constexpr (std::is_same::value) { __asm__ volatile("mv %0, fp" : "=r"(value) : :); @@ -92,7 +92,9 @@ class ReadOnlyRegBase { /** * () 重载 */ - static __always_inline RegInfo::DataType operator()() { return Read(); } + __always_inline auto operator()() -> typename RegInfo::DataType { + return Read(); + } }; /** @@ -116,7 +118,7 @@ class WriteOnlyRegBase { * 写寄存器 * @param value 要写的值 */ - static __always_inline void Write(RegInfo::DataType value) { + static __always_inline void Write(typename RegInfo::DataType value) { if constexpr (std::is_same::value) { __asm__ volatile("mv fp, %0" : : "r"(value) :); } else { @@ -145,11 +147,16 @@ class ReadWriteRegBase : public ReadOnlyRegBase, /// @} }; +}; // namespace read_write + // 第三部分:寄存器实例 -class Fp : public ReadWriteRegBase { +namespace regs { +class Fp : public read_write::ReadWriteRegBase { public: - friend sk_std::ostream &operator<<(sk_std::ostream &os, const Fp &fp) { - printf("val: 0x%p", (void *)fp.Read()); + friend auto operator<<(sk_std::ostream &os, const Fp &fp) + -> sk_std::ostream & { + (void)fp; + klog::Info("val: 0x%p", regs::Fp::Read()); return os; } }; @@ -159,10 +166,10 @@ struct AllXreg { Fp fp; }; -}; // namespace +}; // namespace regs // 第四部分:访问接口 -[[maybe_unused]] static AllXreg kAllXreg; +[[maybe_unused]] static regs::AllXreg kAllXreg; }; // namespace cpu From 4e2e942d26c05c14af478eafa82eff1b10cf9e7b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 07:04:11 +0000 Subject: [PATCH 019/232] test pre-commit Signed-off-by: Zone.N --- src/kernel/arch/riscv64/include/cpu/regs.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kernel/arch/riscv64/include/cpu/regs.hpp b/src/kernel/arch/riscv64/include/cpu/regs.hpp index a035a269e..b92396fb3 100644 --- a/src/kernel/arch/riscv64/include/cpu/regs.hpp +++ b/src/kernel/arch/riscv64/include/cpu/regs.hpp @@ -153,9 +153,9 @@ class ReadWriteRegBase : public ReadOnlyRegBase, namespace regs { class Fp : public read_write::ReadWriteRegBase { public: - friend auto operator<<(sk_std::ostream &os, const Fp &fp) + friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const Fp &fp) -> sk_std::ostream & { - (void)fp; + // (void)fp; klog::Info("val: 0x%p", regs::Fp::Read()); return os; } From bfcbcdda1dcd8bdebca66b48932850781f6c8794 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 07:04:17 +0000 Subject: [PATCH 020/232] test pre-commit Signed-off-by: Zone.N --- src/kernel/arch/riscv64/include/cpu/regs.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/kernel/arch/riscv64/include/cpu/regs.hpp b/src/kernel/arch/riscv64/include/cpu/regs.hpp index b92396fb3..e250f83b4 100644 --- a/src/kernel/arch/riscv64/include/cpu/regs.hpp +++ b/src/kernel/arch/riscv64/include/cpu/regs.hpp @@ -155,7 +155,6 @@ class Fp : public read_write::ReadWriteRegBase { public: friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const Fp &fp) -> sk_std::ostream & { - // (void)fp; klog::Info("val: 0x%p", regs::Fp::Read()); return os; } From 1e2c8ab1ce2f302fc1d6ea7dd62aa5ccc2b9f621 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 07:20:43 +0000 Subject: [PATCH 021/232] test pre-commit Signed-off-by: Zone.N --- .pre-commit-config.yaml | 3 ++- src/kernel/arch/x86_64/include/cpu/regs.hpp | 25 +++++++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fe1eea75d..8274ae825 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,8 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=build_riscv64/compiler_commands.json + # - -p=build_riscv64/compiler_commands.json + - -p=build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - repo: https://github.com/koalaman/shellcheck-precommit diff --git a/src/kernel/arch/x86_64/include/cpu/regs.hpp b/src/kernel/arch/x86_64/include/cpu/regs.hpp index 39bec7c37..62003e551 100644 --- a/src/kernel/arch/x86_64/include/cpu/regs.hpp +++ b/src/kernel/arch/x86_64/include/cpu/regs.hpp @@ -56,7 +56,7 @@ struct RbpInfo : public RegInfoBase {}; }; // namespace register_info // 第二部分:读/写模版实现 -namespace { +namespace read_write { /** * 只读接口 * @tparam 寄存器类型 @@ -78,7 +78,7 @@ class ReadOnlyRegBase { * 读寄存器 * @return RegInfo::DataType 寄存器的值 */ - static __always_inline RegInfo::DataType Read() { + static __always_inline auto Read() -> typename RegInfo::DataType { typename RegInfo::DataType value{}; if constexpr (std::is_same::value) { __asm__ volatile("mov %%rbp, %0" : "=r"(value) : :); @@ -92,7 +92,9 @@ class ReadOnlyRegBase { /** * () 重载 */ - static __always_inline RegInfo::DataType operator()() { return Read(); } + __always_inline auto operator()() -> typename RegInfo::DataType { + return Read(); + } }; /** @@ -116,7 +118,7 @@ class WriteOnlyRegBase { * 写寄存器 * @param value 要写的值 */ - static __always_inline void Write(RegInfo::DataType value) { + static __always_inline void Write(typename RegInfo::DataType value) { if constexpr (std::is_same::value) { __asm__ volatile("mv fp, %0" : : "r"(value) :); } else { @@ -145,11 +147,16 @@ class ReadWriteRegBase : public ReadOnlyRegBase, /// @} }; +}; // namespace read_write + +namespace regs { + // 第三部分:寄存器实例 -class Rbp : public ReadWriteRegBase { +class Rbp : public read_write::ReadWriteRegBase { public: - friend sk_std::ostream &operator<<(sk_std::ostream &os, const Rbp &rbp) { - printf("val: 0x%p", (void *)rbp.Read()); + friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const Rbp &rbp) + -> sk_std::ostream & { + printf("val: 0x%p", regs::Rbp::Read()); return os; } }; @@ -159,10 +166,10 @@ struct AllXreg { Rbp rbp; }; -}; // namespace +}; // namespace regs // 第四部分:访问接口 -[[maybe_unused]] static AllXreg kAllXreg; +[[maybe_unused]] static regs::AllXreg kAllXreg; }; // namespace cpu From 9d112510036f8f4c33295d7275315d553aa5ccde Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 08:37:34 +0000 Subject: [PATCH 022/232] test pre-commit Signed-off-by: Zone.N --- .cmake-format.json | 311 +++++++++++++++++++++++++++++ .pre-commit-config.yaml | 6 + CMakeLists.txt | 156 +++++++++------ cmake/compile_config.cmake | 399 +++++++++++++++++-------------------- cmake/functions.cmake | 254 ++++++++++++----------- tools/Dockerfile | 1 + 6 files changed, 731 insertions(+), 396 deletions(-) create mode 100644 .cmake-format.json diff --git a/.cmake-format.json b/.cmake-format.json new file mode 100644 index 000000000..d45a3b0ed --- /dev/null +++ b/.cmake-format.json @@ -0,0 +1,311 @@ +{ + "_help_parse": "Options affecting listfile parsing", + "parse": { + "_help_additional_commands": [ + "Specify structure for custom cmake functions" + ], + "additional_commands": { + "foo": { + "flags": [ + "BAR", + "BAZ" + ], + "kwargs": { + "HEADERS": "*", + "SOURCES": "*", + "DEPENDS": "*" + } + } + }, + "_help_override_spec": [ + "Override configurations per-command where available" + ], + "override_spec": {}, + "_help_vartags": [ + "Specify variable tags." + ], + "vartags": [], + "_help_proptags": [ + "Specify property tags." + ], + "proptags": [] + }, + "_help_format": "Options affecting formatting.", + "format": { + "_help_disable": [ + "Disable formatting entirely, making cmake-format a no-op" + ], + "disable": false, + "_help_line_width": [ + "How wide to allow formatted cmake files" + ], + "line_width": 80, + "_help_tab_size": [ + "How many spaces to tab for indent" + ], + "tab_size": 4, + "_help_use_tabchars": [ + "If true, lines are indented using tab characters (utf-8", + "0x09) instead of space characters (utf-8 0x20).", + "In cases where the layout would require a fractional tab", + "character, the behavior of the fractional indentation is", + "governed by " + ], + "use_tabchars": false, + "_help_fractional_tab_policy": [ + "If is True, then the value of this variable", + "indicates how fractional indentions are handled during", + "whitespace replacement. If set to 'use-space', fractional", + "indentation is left as spaces (utf-8 0x20). If set to", + "`round-up` fractional indentation is replaced with a single", + "tab character (utf-8 0x09) effectively shifting the column", + "to the next tabstop" + ], + "fractional_tab_policy": "use-space", + "_help_max_subgroups_hwrap": [ + "If an argument group contains more than this many sub-groups", + "(parg or kwarg groups) then force it to a vertical layout." + ], + "max_subgroups_hwrap": 2, + "_help_max_pargs_hwrap": [ + "If a positional argument group contains more than this many", + "arguments, then force it to a vertical layout." + ], + "max_pargs_hwrap": 6, + "_help_max_rows_cmdline": [ + "If a cmdline positional group consumes more than this many", + "lines without nesting, then invalidate the layout (and nest)" + ], + "max_rows_cmdline": 2, + "_help_separate_ctrl_name_with_space": [ + "If true, separate flow control names from their parentheses", + "with a space" + ], + "separate_ctrl_name_with_space": false, + "_help_separate_fn_name_with_space": [ + "If true, separate function names from parentheses with a", + "space" + ], + "separate_fn_name_with_space": true, + "_help_dangle_parens": [ + "If a statement is wrapped to more than one line, than dangle", + "the closing parenthesis on its own line." + ], + "dangle_parens": false, + "_help_dangle_align": [ + "If the trailing parenthesis must be 'dangled' on its on", + "line, then align it to this reference: `prefix`: the start", + "of the statement, `prefix-indent`: the start of the", + "statement, plus one indentation level, `child`: align to", + "the column of the arguments" + ], + "dangle_align": "prefix", + "_help_min_prefix_chars": [ + "If the statement spelling length (including space and", + "parenthesis) is smaller than this amount, then force reject", + "nested layouts." + ], + "min_prefix_chars": 4, + "_help_max_prefix_chars": [ + "If the statement spelling length (including space and", + "parenthesis) is larger than the tab width by more than this", + "amount, then force reject un-nested layouts." + ], + "max_prefix_chars": 10, + "_help_max_lines_hwrap": [ + "If a candidate layout is wrapped horizontally but it exceeds", + "this many lines, then reject the layout." + ], + "max_lines_hwrap": 2, + "_help_line_ending": [ + "What style line endings to use in the output." + ], + "line_ending": "unix", + "_help_command_case": [ + "Format command names consistently as 'lower' or 'upper' case" + ], + "command_case": "upper", + "_help_keyword_case": [ + "Format keywords consistently as 'lower' or 'upper' case" + ], + "keyword_case": "upper", + "_help_always_wrap": [ + "A list of command names which should always be wrapped" + ], + "always_wrap": [], + "_help_enable_sort": [ + "If true, the argument lists which are known to be sortable", + "will be sorted lexicographicall" + ], + "enable_sort": true, + "_help_autosort": [ + "If true, the parsers may infer whether or not an argument", + "list is sortable (without annotation)." + ], + "autosort": false, + "_help_require_valid_layout": [ + "By default, if cmake-format cannot successfully fit", + "everything into the desired linewidth it will apply the", + "last, most aggressive attempt that it made. If this flag is", + "True, however, cmake-format will print error, exit with non-", + "zero status code, and write-out nothing" + ], + "require_valid_layout": false, + "_help_layout_passes": [ + "A dictionary mapping layout nodes to a list of wrap", + "decisions. See the documentation for more information." + ], + "layout_passes": {} + }, + "_help_markup": "Options affecting comment reflow and formatting.", + "markup": { + "_help_bullet_char": [ + "What character to use for bulleted lists" + ], + "bullet_char": "*", + "_help_enum_char": [ + "What character to use as punctuation after numerals in an", + "enumerated list" + ], + "enum_char": ".", + "_help_first_comment_is_literal": [ + "If comment markup is enabled, don't reflow the first comment", + "block in each listfile. Use this to preserve formatting of", + "your copyright/license statements." + ], + "first_comment_is_literal": false, + "_help_literal_comment_pattern": [ + "If comment markup is enabled, don't reflow any comment block", + "which matches this (regex) pattern. Default is `None`", + "(disabled)." + ], + "literal_comment_pattern": null, + "_help_fence_pattern": [ + "Regular expression to match preformat fences in comments", + "default= ``r'^\\s*([`~]{3}[`~]*)(.*)$'``" + ], + "fence_pattern": "^\\s*([`~]{3}[`~]*)(.*)$", + "_help_ruler_pattern": [ + "Regular expression to match rulers in comments default=", + "``r'^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$'``" + ], + "ruler_pattern": "^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$", + "_help_explicit_trailing_pattern": [ + "If a comment line matches starts with this pattern then it", + "is explicitly a trailing comment for the preceding argument.", + "Default is '#<'" + ], + "explicit_trailing_pattern": "#<", + "_help_hashruler_min_length": [ + "If a comment line starts with at least this many consecutive", + "hash characters, then don't lstrip() them off. This allows", + "for lazy hash rulers where the first hash char is not", + "separated by space" + ], + "hashruler_min_length": 10, + "_help_canonicalize_hashrulers": [ + "If true, then insert a space between the first hash char and", + "remaining hash chars in a hash ruler, and normalize its", + "length to fill the column" + ], + "canonicalize_hashrulers": true, + "_help_enable_markup": [ + "enable comment markup parsing and reflow" + ], + "enable_markup": false + }, + "_help_lint": "Options affecting the linter", + "lint": { + "_help_disabled_codes": [ + "a list of lint codes to disable" + ], + "disabled_codes": [], + "_help_function_pattern": [ + "regular expression pattern describing valid function names" + ], + "function_pattern": "[0-9a-z_]+", + "_help_macro_pattern": [ + "regular expression pattern describing valid macro names" + ], + "macro_pattern": "[0-9A-Z_]+", + "_help_global_var_pattern": [ + "regular expression pattern describing valid names for", + "variables with global (cache) scope" + ], + "global_var_pattern": "[A-Z][0-9A-Z_]+", + "_help_internal_var_pattern": [ + "regular expression pattern describing valid names for", + "variables with global scope (but internal semantic)" + ], + "internal_var_pattern": "_[A-Z][0-9A-Z_]+", + "_help_local_var_pattern": [ + "regular expression pattern describing valid names for", + "variables with local scope" + ], + "local_var_pattern": "[a-z][a-z0-9_]+", + "_help_private_var_pattern": [ + "regular expression pattern describing valid names for", + "privatedirectory variables" + ], + "private_var_pattern": "_[0-9a-z_]+", + "_help_public_var_pattern": [ + "regular expression pattern describing valid names for public", + "directory variables" + ], + "public_var_pattern": "[A-Z][0-9A-Z_]+", + "_help_argument_var_pattern": [ + "regular expression pattern describing valid names for", + "function/macro arguments and loop variables." + ], + "argument_var_pattern": "[a-z][a-z0-9_]+", + "_help_keyword_pattern": [ + "regular expression pattern describing valid names for", + "keywords used in functions or macros" + ], + "keyword_pattern": "[A-Z][0-9A-Z_]+", + "_help_max_conditionals_custom_parser": [ + "In the heuristic for C0201, how many conditionals to match", + "within a loop in before considering the loop a parser." + ], + "max_conditionals_custom_parser": 2, + "_help_min_statement_spacing": [ + "Require at least this many newlines between statements" + ], + "min_statement_spacing": 1, + "_help_max_statement_spacing": [ + "Require no more than this many newlines between statements" + ], + "max_statement_spacing": 2, + "max_returns": 6, + "max_branches": 12, + "max_arguments": 5, + "max_localvars": 15, + "max_statements": 50 + }, + "_help_encode": "Options affecting file encoding", + "encode": { + "_help_emit_byteorder_mark": [ + "If true, emit the unicode byte-order mark (BOM) at the start", + "of the file" + ], + "emit_byteorder_mark": false, + "_help_input_encoding": [ + "Specify the encoding of the input file. Defaults to utf-8" + ], + "input_encoding": "utf-8", + "_help_output_encoding": [ + "Specify the encoding of the output file. Defaults to utf-8.", + "Note that cmake only claims to support utf-8 so be careful", + "when using anything else" + ], + "output_encoding": "utf-8" + }, + "_help_misc": "Miscellaneous configurations options.", + "misc": { + "_help_per_command": [ + "A dictionary containing any per-command configuration", + "overrides. Currently only `command_case` is supported." + ], + "per_command": {} + } +} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8274ae825..c3205d57b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,3 +33,9 @@ repos: rev: v0.10.0 hooks: - id: shellcheck + + - repo: https://github.com/cheshirekow/cmake-format-precommit + rev: v0.6.13 + hooks: + - id: cmake-format + - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index b6d65f1e7..3df88521b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,92 +1,118 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. # 设置最小 cmake 版本 -cmake_minimum_required(VERSION 3.27 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED (VERSION 3.27 FATAL_ERROR) # 设置项目名与版本 -project( - SimpleKernel - VERSION 0.0.1 -) +PROJECT (SimpleKernel VERSION 0.0.1) # 禁止原地编译 -if (${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR}) - # 如果你看到这句话,cmake 此时已经在根目录下生成了一些临时文件,你需要删除它们 - # CMakeFiles, CMakeCache.txt - message( - FATAL_ERROR - "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there." - ) -endif () +IF(${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR}) + # 如果你看到这句话,cmake 此时已经在根目录下生成了一些临时文件,你需要删除它们 CMakeFiles, CMakeCache.txt + MESSAGE ( + FATAL_ERROR + "In-source builds not allowed." + "Please make a new directory (called a build directory) " + "and run CMake from there.") +ENDIF() # 设置辅助 cmake 脚本路径 -list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") +LIST (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") # 导入项目配置 -include(project_config) +INCLUDE (project_config) # 导入函数 -include(functions) +INCLUDE (functions) # 导入第三方依赖 -include(3rd) +INCLUDE (3rd) # 导入编译配置 -include(compile_config) +INCLUDE (compile_config) # qemu 参数设置 -list(APPEND QEMU_FLAGS - # 不启用图形界面 - -nographic - # 使用标准输出显示 - -serial stdio - # 启动 telnet 服务,使用 2333 端口,不等待连接 - -monitor ${QEMU_MONITOR_ARG} -) +LIST ( + APPEND + QEMU_FLAGS + # 不启用图形界面 + -nographic + # 使用标准输出显示 + -serial + stdio + # 启动 telnet 服务,使用 2333 端口,不等待连接 + -monitor + ${QEMU_MONITOR_ARG}) # 目标平台参数 -if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - list(APPEND QEMU_FLAGS - -m 128M - -net none - -bios ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd - -hda fat:rw:./image/ - ) -elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") - list(APPEND QEMU_FLAGS - -machine virt - # 可选项,qemu7.0 自带了 opensbi1.0 - -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf - -kernel $ - # @todo 暂时还不支持 riscv64 的 uefi 启动 - # 预期路线: qemu->uefi->opensbi + kernel(payload) - # -bios ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd - # -hda fat:rw:./image/ - ) -elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - list(APPEND QEMU_FLAGS - -machine virt - -cpu cortex-a57 - -m 128M - -net none - -bios ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd - -hda fat:rw:./image/ +IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + LIST ( + APPEND + QEMU_FLAGS + -m + 128M + -net + none + -bios + ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd + -hda + fat:rw:./image/) +ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + LIST ( + APPEND + QEMU_FLAGS + -machine + virt + # 可选项,qemu7.0 自带了 opensbi1.0 + -bios + ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf + -kernel + $ + # @todo 暂时还不支持 riscv64 的 uefi 启动 预期路线: qemu->uefi->opensbi + + # kernel(payload) -bios + # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda + # fat:rw:./image/ ) -endif () +ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + LIST ( + APPEND + QEMU_FLAGS + -machine + virt + -cpu + cortex-a57 + -m + 128M + -net + none + -bios + ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd + -hda + fat:rw:./image/) +ENDIF() # 添加要编译的目录 -add_subdirectory(${PROJECT_SOURCE_DIR}/src) -add_subdirectory(${PROJECT_SOURCE_DIR}/test) -add_subdirectory(${PROJECT_SOURCE_DIR}/doc) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/src) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/test) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/doc) # 添加 run 和 debug target -add_run_target( - DEPENDS ovmf $<$:opensbi-fw_jump> $<$:boot> $<$:boot> $<$:boot> kernel - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - TARGET ${CMAKE_SYSTEM_PROCESSOR} - BOOT ${PROJECT_BINARY_DIR}/src/boot/boot.efi - KERNEL $ - QEMU_FLAGS ${QEMU_FLAGS} -) +ADD_RUN_TARGET ( + DEPENDS + ovmf + $<$:opensbi-fw_jump> + $<$:boot> + $<$:boot> + $<$:boot> + kernel + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR} + TARGET + ${CMAKE_SYSTEM_PROCESSOR} + BOOT + ${PROJECT_BINARY_DIR}/src/boot/boot.efi + KERNEL + $ + QEMU_FLAGS + ${QEMU_FLAGS}) diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index 85979f3be..fbe188942 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -1,232 +1,207 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # -# compile_config.cmake for Simple-XX/SimpleKernel. -# 配置信息 +# compile_config.cmake for Simple-XX/SimpleKernel. 配置信息 # 通用宏定义 -add_library(compile_definitions INTERFACE) -target_compile_definitions(compile_definitions INTERFACE - $<$:SIMPLEKERNEL_RELEASE> - $<$:SIMPLEKERNEL_DEBUG> -) +ADD_LIBRARY (compile_definitions INTERFACE) +TARGET_COMPILE_DEFINITIONS ( + compile_definitions INTERFACE $<$:SIMPLEKERNEL_RELEASE> + $<$:SIMPLEKERNEL_DEBUG>) # 获取 gcc 的 include 路径 -execute_process( +EXECUTE_PROCESS ( COMMAND - sh -c "echo | ${CMAKE_CXX_COMPILER} -v -x c -E - 2>&1 | sed -n '/#include <...> search starts here:/,/End of search list./{/^ /p}'" + sh -c "echo | ${CMAKE_CXX_COMPILER} -v -x c -E - 2>&1 | sed -n " + "'/#include <...> search starts here:/,/End of search list./{/^ /p}'" OUTPUT_VARIABLE GCC_OUTPUT ERROR_VARIABLE GCC_ERROR RESULT_VARIABLE GCC_RESULT - OUTPUT_STRIP_TRAILING_WHITESPACE -) + OUTPUT_STRIP_TRAILING_WHITESPACE) # 检查 gcc 是否成功执行 -if(NOT GCC_RESULT EQUAL 0) - message(FATAL_ERROR "Failed to run ${CMAKE_CXX_COMPILER} -v") -endif() +IF(NOT GCC_RESULT EQUAL 0) + MESSAGE (FATAL_ERROR "Failed to run ${CMAKE_CXX_COMPILER} -v") +ENDIF() # 分割路径并生成路径列表 -string(REPLACE "\n" ";" INCLUDE_PATH_LIST "${GCC_OUTPUT}") +STRING (REPLACE "\n" ";" INCLUDE_PATH_LIST "${GCC_OUTPUT}") # 使用 `-I` 将路径添加到编译选项中 -foreach(INCLUDE_PATH ${INCLUDE_PATH_LIST}) - string(REGEX REPLACE " " "" CLEAN_PATH ${INCLUDE_PATH}) - list(APPEND CROSS_INCLUDE_PATHS "-I${CLEAN_PATH}") -endforeach() -message(STATUS "GCC Include CROSS_INCLUDE_PATHS: ${CROSS_INCLUDE_PATHS}") +FOREACH(item ${INCLUDE_PATH_LIST}) + STRING (REGEX REPLACE " " "" CLEAN_PATH ${item}) + LIST (APPEND CROSS_INCLUDE_PATHS "-I${CLEAN_PATH}") +ENDFOREACH() +MESSAGE (STATUS "GCC Include CROSS_INCLUDE_PATHS: ${CROSS_INCLUDE_PATHS}") # 通用编译选项 -add_library(compile_options INTERFACE) -target_compile_options(compile_options INTERFACE - # 如果 CMAKE_BUILD_TYPE 为 Release 则使用 -O3 -Werror,否则使用 -O0 -ggdb - # -g 在 Debug 模式下由 cmake 自动添加 - $<$:-O3;-Werror> - $<$:-O0;-ggdb> - # 打开全部警告 - -Wall - # 打开额外警告 - -Wextra - # 不符合规范的代码会警告 - -pedantic - # 生成位置无关代码 - -fPIC - # 生成位置无关可执行程序 - -fPIE - # 禁用运行时类型支持 - $<$:-fno-rtti> - # 启用 free-standing 环境,该选项隐含了 -fno-builtin - -ffreestanding - # 保留帧指针,便于调试和栈回溯 - -fno-omit-frame-pointer - # 不使用 common 段 - -fno-common - - # 目标平台编译选项 - $<$: - # 禁用 red-zone - -mno-red-zone - > - - $<$: - > - - $<$: - # 生成 armv8-a 代码 - -march=armv8-a - # 针对 cortex-a72 优化代码 - -mtune=cortex-a72 - > - - # gcc 特定选项 - $<$: - > - - # clang 特定选项 - $<$: - > - - # 平台相关 - $<$: - > - - ${CROSS_INCLUDE_PATHS} -) +ADD_LIBRARY (compile_options INTERFACE) +TARGET_COMPILE_OPTIONS ( + compile_options + INTERFACE # 如果 CMAKE_BUILD_TYPE 为 Release 则使用 -O3 -Werror,否则使用 -O0 -ggdb -g + # 在 Debug 模式下由 cmake 自动添加 + $<$:-O3;-Werror> + $<$:-O0;-ggdb> + # 打开全部警告 + -Wall + # 打开额外警告 + -Wextra + # 不符合规范的代码会警告 + -pedantic + # 生成位置无关代码 + -fPIC + # 生成位置无关可执行程序 + -fPIE + # 禁用运行时类型支持 + $<$:-fno-rtti> + # 启用 free-standing 环境,该选项隐含了 -fno-builtin + -ffreestanding + # 保留帧指针,便于调试和栈回溯 + -fno-omit-frame-pointer + # 不使用 common 段 + -fno-common + # 目标平台编译选项 + $<$: + # 禁用 red-zone + -mno-red-zone + > + $<$: + > + $<$: + # 生成 armv8-a 代码 + -march=armv8-a + # 针对 cortex-a72 优化代码 + -mtune=cortex-a72 + > + # gcc 特定选项 + $<$: + > + # clang 特定选项 + $<$: + > + # 平台相关 + $<$: + > + # 将编译器的 include 路径添加到编译选项中,以便 clang-tidy 使用 + ${CROSS_INCLUDE_PATHS}) # 通用链接选项 -add_library(link_options INTERFACE) -target_link_options(link_options INTERFACE - # 不链接 ctr0 等启动代码 - -nostartfiles -) +ADD_LIBRARY (link_options INTERFACE) +TARGET_LINK_OPTIONS ( + link_options INTERFACE + # 不链接 ctr0 等启动代码 + -nostartfiles) # 通用库选项 -add_library(link_libraries INTERFACE) -target_link_libraries(link_libraries INTERFACE - compile_definitions - compile_options - link_options -) - -add_library(boot_compile_definitions INTERFACE) -target_compile_definitions(boot_compile_definitions INTERFACE - # 使用 gnu-efi - GNU_EFI_USE_MS_ABI -) - -add_library(boot_compile_options INTERFACE) -target_compile_options(boot_compile_options INTERFACE - # 使用 2 字节 wchar_t - -fshort-wchar - # 允许 wchar_t - -fpermissive - - # 目标平台编译选项 - $<$: - > - - $<$: - > -) - -add_library(boot_link_options INTERFACE) -target_link_options(boot_link_options INTERFACE - $<$: - # 编译为共享库 - -shared - # 符号级别绑定 - -Wl,-Bsymbolic - > - - $<$: - # 编译为共享库 - -shared - # 符号级别绑定 - -Wl,-Bsymbolic - > - - $<$: - -shared - -Wl,-Bsymbolic - > -) - -add_library(boot_link_libraries INTERFACE) -target_link_libraries(boot_link_libraries INTERFACE - link_libraries - boot_compile_definitions - boot_compile_options - boot_link_options - - # 目标平台编译选项 - $<$: - # 链接 gnu-efi - gnu-efi-lib - > - - $<$: - # 链接 gnu-efi - gnu-efi-lib - > - - $<$: - # 链接 gnu-efi - gnu-efi-lib - > -) - -add_library(kernel_compile_definitions INTERFACE) -target_compile_definitions(kernel_compile_definitions INTERFACE - USE_NO_RELAX=$ -) - -add_library(kernel_compile_options INTERFACE) -target_compile_options(kernel_compile_options INTERFACE - $<$: - # 使用 kernel 内存模型 - -mcmodel=large - > - - $<$: - # 使用 medany 内存模型 - # 代码和数据段可以在任意地址 - -mcmodel=medany - > -) - -add_library(kernel_link_options INTERFACE) -target_link_options(kernel_link_options INTERFACE - # 链接脚本 - -T ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/link.ld - - # 静态链接 - -static - # 不链接标准库 - -nostdlib - - $<$: - # 设置最大页大小为 0x1000(4096) 字节 - -z max-page-size=0x1000 - > - - $<$: - # 禁用 relax 优化 - $<$:-mno-relax> - > -) - -add_library(kernel_link_libraries INTERFACE) -target_link_libraries(kernel_link_libraries INTERFACE - link_libraries - kernel_compile_definitions - kernel_compile_options - kernel_link_options - - printf_bare_metal - dtc-lib - - $<$: - opensbi_interface - > - - $<$: - > -) +ADD_LIBRARY (link_libraries INTERFACE) +TARGET_LINK_LIBRARIES (link_libraries INTERFACE compile_definitions + compile_options link_options) + +ADD_LIBRARY (boot_compile_definitions INTERFACE) +TARGET_COMPILE_DEFINITIONS ( + boot_compile_definitions INTERFACE # 使用 gnu-efi + GNU_EFI_USE_MS_ABI) + +ADD_LIBRARY (boot_compile_options INTERFACE) +TARGET_COMPILE_OPTIONS ( + boot_compile_options + INTERFACE # 使用 2 字节 wchar_t + -fshort-wchar + # 允许 wchar_t + -fpermissive + # 目标平台编译选项 + $<$: + > + $<$: + >) + +ADD_LIBRARY (boot_link_options INTERFACE) +TARGET_LINK_OPTIONS ( + boot_link_options + INTERFACE + $<$: + # 编译为共享库 + -shared + # 符号级别绑定 + -Wl,-Bsymbolic + > + $<$: + # 编译为共享库 + -shared + # 符号级别绑定 + -Wl,-Bsymbolic + > + $<$: + -shared + -Wl,-Bsymbolic + >) + +ADD_LIBRARY (boot_link_libraries INTERFACE) +TARGET_LINK_LIBRARIES ( + boot_link_libraries + INTERFACE link_libraries + boot_compile_definitions + boot_compile_options + boot_link_options + # 目标平台编译选项 + $<$: + # 链接 gnu-efi + gnu-efi-lib + > + $<$: + # 链接 gnu-efi + gnu-efi-lib + > + $<$: + # 链接 gnu-efi + gnu-efi-lib + >) + +ADD_LIBRARY (kernel_compile_definitions INTERFACE) +TARGET_COMPILE_DEFINITIONS (kernel_compile_definitions + INTERFACE USE_NO_RELAX=$) + +ADD_LIBRARY (kernel_compile_options INTERFACE) +TARGET_COMPILE_OPTIONS ( + kernel_compile_options + INTERFACE $<$: + # 使用 kernel 内存模型 + -mcmodel=large + > + $<$: + # 使用 medany 内存模型 代码和数据段可以在任意地址 + -mcmodel=medany + >) + +ADD_LIBRARY (kernel_link_options INTERFACE) +TARGET_LINK_OPTIONS ( + kernel_link_options + INTERFACE + # 链接脚本 + -T + ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/link.ld + # 静态链接 + -static + # 不链接标准库 + -nostdlib + $<$: + # 设置最大页大小为 0x1000(4096) 字节 + -z + max-page-size=0x1000 + > + $<$: + # 禁用 relax 优化 + $<$:-mno-relax> + >) + +ADD_LIBRARY (kernel_link_libraries INTERFACE) +TARGET_LINK_LIBRARIES ( + kernel_link_libraries + INTERFACE link_libraries + kernel_compile_definitions + kernel_compile_options + kernel_link_options + printf_bare_metal + dtc-lib + $<$: + opensbi_interface + > + $<$: + >) diff --git a/cmake/functions.cmake b/cmake/functions.cmake index c44ed31da..bcea4f218 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -1,4 +1,3 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # @@ -6,91 +5,83 @@ # 辅助函数 # 生成 target 输出文件的 objdump -D, readelf -a, nm -a -# _target: target 名 -# 在 ${${_target}_BINARY_DIR} 目录下生成 $.asm 文件 -# 在 ${${_target}_BINARY_DIR} 目录下生成 $.readelf 文件 -# 在 ${${_target}_BINARY_DIR} 目录下生成 $.sym 文件 -function(objdump_readelf_nm _target) - add_custom_command(TARGET ${_target} - VERBATIM - POST_BUILD - DEPENDS ${_target} - WORKING_DIRECTORY ${${_target}_BINARY_DIR} - COMMAND ${CMAKE_OBJDUMP} -D $ > $/${_target}.asm || exit 0 - COMMAND ${CMAKE_READELF} -a $ > $/${_target}.readelf || exit 0 - COMMAND ${CMAKE_NM} -a $ > $/${_target}.sym - COMMENT "Generating symbol table, assembly, and readelf result for ${_target}" - ) - set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - "$/${_target}.asm;$/${_target}.readelf;$/${_target}.sym;" - ) -endfunction() +# target: target 名 +# 在 ${${target}_BINARY_DIR} 目录下生成 $.asm 文件 +# 在 ${${target}_BINARY_DIR} 目录下生成 $.readelf 文件 +# 在 ${${target}_BINARY_DIR} 目录下生成 $.sym 文件 +FUNCTION(objdump_readelf_nm target) + ADD_CUSTOM_COMMAND ( + TARGET ${target} + VERBATIM POST_BUILD DEPENDS ${target} + WORKING_DIRECTORY ${${target}_BINARY_DIR} + COMMAND ${CMAKE_OBJDUMP} -D $ > + $/${target}.asm || exit 0 + COMMAND ${CMAKE_READELF} -a $ > + $/${target}.readelf || exit 0 + COMMAND ${CMAKE_NM} -a $ > + $/${target}.sym + COMMENT "Generating symbol table, assembly, and readelf for ${target}") + SET_DIRECTORY_PROPERTIES ( + PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + "$/${target}.asm;" + "$/${target}.readelf;" + "$/${target}.sym;") +ENDFUNCTION() # 将 elf 转换为 efi -# _elf: 要转换的 target 名 -# _efi: 输出的 efi 文件名 -# 在 ${${_target}_BINARY_DIR} 目录下生成 ${_efi} 文件 -function(elf2efi _target _efi) - add_custom_command(TARGET ${_target} - COMMENT "Convert $ to efi ..." - POST_BUILD - DEPENDS ${_target} - WORKING_DIRECTORY ${${_target}_BINARY_DIR} - COMMAND ${CMAKE_OBJCOPY} $ ${_efi} - -S - -R .comment - -R .note.gnu.build-id - -R .gnu.hash - -R .dynsym - --target=efi-app-${CMAKE_SYSTEM_PROCESSOR} --subsystem=10 - ) -endfunction() +# efi: 输出的 efi 文件名 +# 在 ${${target}_BINARY_DIR} 目录下生成 ${efi} 文件 +FUNCTION(elf2efi target efi) + ADD_CUSTOM_COMMAND ( + TARGET ${target} + COMMENT "Convert $ to efi ..." + POST_BUILD DEPENDS ${target} + WORKING_DIRECTORY ${${target}_BINARY_DIR} + COMMAND + ${CMAKE_OBJCOPY} $ ${efi} -S -R .comment -R + .note.gnu.build-id -R .gnu.hash -R .dynsym + --target=efi-app-${CMAKE_SYSTEM_PROCESSOR} --subsystem=10) +ENDFUNCTION() # 添加测试覆盖率 target # DEPENDS 要生成的 targets # SOURCE_DIR 源码路径 # BINARY_DIR 二进制文件路径 # EXCLUDE_DIR 要排除的目录 -function(add_coverage_target) +FUNCTION(add_coverage_target) # 解析参数 - set(options) - set(one_value_keywords SOURCE_DIR BINARY_DIR) - set(multi_value_keywords DEPENDS EXCLUDE_DIR) - cmake_parse_arguments( - ARG "${options}" "${one_value_keywords}" "${multi_value_keywords}" ${ARGN} - ) + SET (options) + SET (one_value_keywords SOURCE_DIR BINARY_DIR) + SET (multi_value_keywords DEPENDS EXCLUDE_DIR) + CMAKE_PARSE_ARGUMENTS (ARG "${options}" "${one_value_keywords}" + "${multi_value_keywords}" ${ARGN}) # 不检查的目录 - list(APPEND EXCLUDES --exclude) - foreach (_item ${ARG_EXCLUDE_DIR}) - list(APPEND EXCLUDES '${_item}') - endforeach () + LIST (APPEND EXCLUDES --exclude) + FOREACH(item ${ARG_EXCLUDE_DIR}) + LIST (APPEND EXCLUDES '${item}') + ENDFOREACH() # 添加 target - add_custom_target(coverage DEPENDS ${ARG_DEPENDS} - COMMAND ${CMAKE_CTEST_COMMAND} - ) + ADD_CUSTOM_TARGET ( + coverage + COMMENT "" + DEPENDS ${ARG_DEPENDS} + COMMAND ${CMAKE_CTEST_COMMAND}) # 在 coverage 执行完毕后生成报告 - add_custom_command(TARGET coverage - COMMENT "Generating coverage report ..." - POST_BUILD - WORKING_DIRECTORY ${ARG_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_OUTPUT_DIR} - COMMAND ${LCOV_EXE} - -c - -o ${COVERAGE_OUTPUT_DIR}/coverage.info - -d ${ARG_BINARY_DIR} - -b ${ARG_SOURCE_DIR} - --no-external - ${EXCLUDES} - --rc branch_coverage=1 - --ignore-errors mismatch - COMMAND ${GENHTML_EXE} - ${COVERAGE_OUTPUT_DIR}/coverage.info - -o ${COVERAGE_OUTPUT_DIR} - --branch-coverage - ) -endfunction() + ADD_CUSTOM_COMMAND ( + TARGET coverage + COMMENT "Generating coverage report ..." + POST_BUILD + WORKING_DIRECTORY ${ARG_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${COVERAGE_OUTPUT_DIR} + COMMAND + ${LCOV_EXE} -c -o ${COVERAGE_OUTPUT_DIR}/coverage.info -d + ${ARG_BINARY_DIR} -b ${ARG_SOURCE_DIR} --no-external ${EXCLUDES} + --rc branch_coverage=1 --ignore-errors mismatch + COMMAND ${GENHTML_EXE} ${COVERAGE_OUTPUT_DIR}/coverage.info -o + ${COVERAGE_OUTPUT_DIR} --branch-coverage) +ENDFUNCTION() # 添加运行 qemu target # NAME 生成的 target 前缀 @@ -100,57 +91,82 @@ endfunction() # KERNEL kernel 文件路径 # DEPENDS 依赖的 target # QEMU_FLAGS qemu 参数 -function(add_run_target) +FUNCTION(add_run_target) # 解析参数 - set(options) - set(one_value_keywords NAME TARGET WORKING_DIRECTORY BOOT KERNEL) - set(multi_value_keywords DEPENDS QEMU_FLAGS) - cmake_parse_arguments( - ARG "${options}" "${one_value_keywords}" "${multi_value_keywords}" ${ARGN} - ) + SET (options) + SET (one_value_keywords NAME TARGET WORKING_DIRECTORY BOOT KERNEL) + SET (multi_value_keywords DEPENDS QEMU_FLAGS) + CMAKE_PARSE_ARGUMENTS (ARG "${options}" "${one_value_keywords}" + "${multi_value_keywords}" ${ARGN}) - list(APPEND commands - COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ - ) - if (${ARG_TARGET} STREQUAL "x86_64") - get_filename_component(BOOT_FILE_NAME ${ARG_BOOT} NAME) - configure_file(${CMAKE_SOURCE_DIR}/tools/startup.nsh.in image/startup.nsh @ONLY) - list(APPEND commands - COMMAND ${CMAKE_COMMAND} -E copy ${ARG_BOOT} image/ - ) - elseif (${ARG_TARGET} STREQUAL "riscv64") - get_filename_component(BOOT_FILE_NAME ${ARG_BOOT} NAME) - configure_file(${CMAKE_SOURCE_DIR}/tools/startup.nsh.in image/startup.nsh @ONLY) - list(APPEND commands - COMMAND ${CMAKE_COMMAND} -E copy ${ARG_BOOT} image/ - ) - elseif (${ARG_TARGET} STREQUAL "aarch64") - get_filename_component(BOOT_FILE_NAME ${ARG_BOOT} NAME) - configure_file(${CMAKE_SOURCE_DIR}/tools/startup.nsh.in image/startup.nsh @ONLY) - list(APPEND commands - COMMAND ${CMAKE_COMMAND} -E copy ${ARG_BOOT} image/ - ) - endif () - - # 添加 target - add_custom_target(${ARG_NAME}run DEPENDS ${ARG_DEPENDS} - WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND ${CMAKE_COMMAND} -E make_directory image/ - ${commands} + LIST ( + APPEND + commands + COMMAND + ${CMAKE_COMMAND} + -E + copy + ${ARG_KERNEL} + image/) + IF(${ARG_TARGET} STREQUAL "x86_64") + GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) + CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in + image/startup.nsh @ONLY) + LIST ( + APPEND + commands COMMAND - qemu-system-${ARG_TARGET} - ${ARG_QEMU_FLAGS} - ) - add_custom_target(${ARG_NAME}debug DEPENDS ${ARG_DEPENDS} - WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND ${CMAKE_COMMAND} -E make_directory image/ - ${commands} + ${CMAKE_COMMAND} + -E + copy + ${ARG_BOOT} + image/) + ELSEIF(${ARG_TARGET} STREQUAL "riscv64") + GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) + CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in + image/startup.nsh @ONLY) + LIST ( + APPEND + commands COMMAND - qemu-system-${ARG_TARGET} - ${ARG_QEMU_FLAGS} + ${CMAKE_COMMAND} + -E + copy + ${ARG_BOOT} + image/) + ELSEIF(${ARG_TARGET} STREQUAL "aarch64") + GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) + CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in + image/startup.nsh @ONLY) + LIST ( + APPEND + commands + COMMAND + ${CMAKE_COMMAND} + -E + copy + ${ARG_BOOT} + image/) + ENDIF() + + # 添加 target + ADD_CUSTOM_TARGET ( + ${ARG_NAME}run + COMMENT "Run ${ARG_NAME} ..." + DEPENDS ${ARG_DEPENDS} + WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} + COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} + COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS}) + ADD_CUSTOM_TARGET ( + ${ARG_NAME}debug + COMMENT "Run ${ARG_NAME} ..." + DEPENDS ${ARG_DEPENDS} + WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} + COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} + COMMAND + qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS} # 等待 gdb 连接 -S # 使用 1234 端口 - -gdb ${QEMU_GDB_PORT} - ) -endfunction() + -gdb ${QEMU_GDB_PORT}) +ENDFUNCTION() diff --git a/tools/Dockerfile b/tools/Dockerfile index 09d1321a5..0990922ba 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -38,6 +38,7 @@ RUN apt install --no-install-recommends --fix-missing -y \ cppcheck \ cpplint \ shellcheck \ + cmake-format \ lcov RUN locale-gen en_US.UTF-8 && locale-gen zh_CN.UTF-8 \ && mkdir -p /var/run/sshd \ From 1c3247abe46ce42755dbe2c9a0ec8cced9d6bcfb Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 08:39:08 +0000 Subject: [PATCH 023/232] test pre-commit Signed-off-by: Zone.N --- cmake/compile_config.cmake | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index fbe188942..a46f5bef4 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -11,9 +11,8 @@ TARGET_COMPILE_DEFINITIONS ( # 获取 gcc 的 include 路径 EXECUTE_PROCESS ( - COMMAND - sh -c "echo | ${CMAKE_CXX_COMPILER} -v -x c -E - 2>&1 | sed -n " - "'/#include <...> search starts here:/,/End of search list./{/^ /p}'" + COMMAND sh -c "echo | ${CMAKE_CXX_COMPILER} -v -x c -E - 2>&1 | sed -n \ + '/#include <...> search starts here:/,/End of search list./{/^ /p}'" OUTPUT_VARIABLE GCC_OUTPUT ERROR_VARIABLE GCC_ERROR RESULT_VARIABLE GCC_RESULT From c00bb9877a581c5473a0e4c32eea78d2f43c329e Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 09:00:37 +0000 Subject: [PATCH 024/232] test pre-commit Signed-off-by: Zone.N --- .pre-commit-config.yaml | 3 +- cmake/project_config.cmake | 68 ++++++++++++++++---------------- tools/.pre-commit-config.yaml.in | 40 +++++++++++++++++++ 3 files changed, 76 insertions(+), 35 deletions(-) create mode 100644 tools/.pre-commit-config.yaml.in diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c3205d57b..803d954e1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,8 +25,7 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - # - -p=build_riscv64/compiler_commands.json - - -p=build_x86_64/compiler_commands.json + - -p=/root/SimpleKernel/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - repo: https://github.com/koalaman/shellcheck-precommit diff --git a/cmake/project_config.cmake b/cmake/project_config.cmake index 4a0161cff..bf63b3a3e 100644 --- a/cmake/project_config.cmake +++ b/cmake/project_config.cmake @@ -1,4 +1,3 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # @@ -6,52 +5,55 @@ # 配置信息 # 在目标环境搜索 program -set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 在目标环境搜索库文件 -set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 在目标环境搜索头文件 -set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 要运行的平台 -list(APPEND VALID_PLATFORM qemu) -if (NOT DEFINED PLATFORM) - set(PLATFORM qemu) -endif () -message(STATUS "PLATFORM is: ${PLATFORM}") +LIST (APPEND VALID_PLATFORM qemu) +IF(NOT DEFINED PLATFORM) + SET (PLATFORM qemu) +ENDIF() +MESSAGE (STATUS "PLATFORM is: ${PLATFORM}") # 如果不合法则报错 -if (NOT PLATFORM IN_LIST VALID_PLATFORM) - message(FATAL_ERROR "PLATFORM must be one of ${VALID_PLATFORM}") -endif () +IF(NOT PLATFORM IN_LIST VALID_PLATFORM) + MESSAGE (FATAL_ERROR "PLATFORM must be one of ${VALID_PLATFORM}") +ENDIF() # 目标架构 -list(APPEND VALID_CMAKE_SYSTEM_PROCESSOR x86_64 riscv64 aarch64) +LIST (APPEND VALID_CMAKE_SYSTEM_PROCESSOR x86_64 riscv64 aarch64) # 默认构建 x86_64 -if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR) - set(CMAKE_SYSTEM_PROCESSOR x86_64) -endif () -message(STATUS "CMAKE_SYSTEM_PROCESSOR is: ${CMAKE_SYSTEM_PROCESSOR}") +IF(NOT DEFINED CMAKE_SYSTEM_PROCESSOR) + SET (CMAKE_SYSTEM_PROCESSOR x86_64) +ENDIF() +MESSAGE (STATUS "CMAKE_SYSTEM_PROCESSOR is: ${CMAKE_SYSTEM_PROCESSOR}") # 如果不合法则报错 -if (NOT CMAKE_SYSTEM_PROCESSOR IN_LIST VALID_CMAKE_SYSTEM_PROCESSOR) - message(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR must be one of ${VALID_CMAKE_SYSTEM_PROCESSOR}") -endif () +IF(NOT CMAKE_SYSTEM_PROCESSOR IN_LIST VALID_CMAKE_SYSTEM_PROCESSOR) + MESSAGE (FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR must be one of \ + ${VALID_CMAKE_SYSTEM_PROCESSOR}") +ENDIF() -message(STATUS "CMAKE_TOOLCHAIN_FILE is: ${CMAKE_TOOLCHAIN_FILE}") +MESSAGE (STATUS "CMAKE_TOOLCHAIN_FILE is: ${CMAKE_TOOLCHAIN_FILE}") # 编译器只支持 gnu-gcc 或 clang -if (NOT ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")) - message(FATAL_ERROR "Only support gnu-gcc/clang") -endif () +IF(NOT ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" + MATCHES "Clang")) + MESSAGE (FATAL_ERROR "Only support gnu-gcc/clang") +ENDIF() # qemu gdb 调试端口 -if (NOT DEFINED QEMU_GDB_PORT) - set(QEMU_GDB_PORT tcp::1234) -endif () +IF(NOT DEFINED QEMU_GDB_PORT) + SET (QEMU_GDB_PORT tcp::1234) +ENDIF() # qemu monitor 参数 -if (NOT DEFINED QEMU_MONITOR_ARG) - set(QEMU_MONITOR_ARG - telnet::2333,server,nowait - ) -endif () +IF(NOT DEFINED QEMU_MONITOR_ARG) + SET (QEMU_MONITOR_ARG telnet::2333,server,nowait) +ENDIF() # 生成项目配置头文件,传递给代码 -configure_file(${CMAKE_SOURCE_DIR}/tools/project_config.h.in ${CMAKE_SOURCE_DIR}/src/project_config.h @ONLY) +CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/project_config.h.in + ${CMAKE_SOURCE_DIR}/src/project_config.h @ONLY) +CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/.pre-commit-config.yaml.in + ${CMAKE_SOURCE_DIR}/.pre-commit-config.yaml @ONLY) diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in new file mode 100644 index 000000000..400aa5858 --- /dev/null +++ b/tools/.pre-commit-config.yaml.in @@ -0,0 +1,40 @@ +fail_fast: false +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-case-conflict + - id: check-illegal-windows-names + - id: check-json + - id: check-merge-conflict + - id: check-symlinks + - id: check-xml + - id: check-yaml + - id: destroyed-symlinks + - id: detect-private-key + - id: end-of-file-fixer + - id: mixed-line-ending + - id: trailing-whitespace + + - repo: https://github.com/cpp-linter/cpp-linter-hooks + rev: v0.5.1 + hooks: + - id: clang-format + args: + - --style=file + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=@CMAKE_BINARY_DIR@/compiler_commands.json + - -extra-arg=--std=c++2b + + - repo: https://github.com/koalaman/shellcheck-precommit + rev: v0.10.0 + hooks: + - id: shellcheck + + - repo: https://github.com/cheshirekow/cmake-format-precommit + rev: v0.6.13 + hooks: + - id: cmake-format + - id: cmake-lint From 65c0d4c5bb671cb2d32c5d1c36a5c02ddaa01a65 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 09:09:00 +0000 Subject: [PATCH 025/232] test pre-commit Signed-off-by: Zone.N --- .pre-commit-config.yaml | 10 ++++++++++ cmake/project_config.cmake | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 803d954e1..ba6ee76c7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,11 +22,21 @@ 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 - id: clang-tidy args: - --checks=.clang-tidy - -p=/root/SimpleKernel/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + - -extra-arg=--std=c++2b - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/cmake/project_config.cmake b/cmake/project_config.cmake index bf63b3a3e..58f6ceb27 100644 --- a/cmake/project_config.cmake +++ b/cmake/project_config.cmake @@ -55,5 +55,5 @@ ENDIF() # 生成项目配置头文件,传递给代码 CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/project_config.h.in ${CMAKE_SOURCE_DIR}/src/project_config.h @ONLY) -CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/.pre-commit-config.yaml.in - ${CMAKE_SOURCE_DIR}/.pre-commit-config.yaml @ONLY) +# CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/.pre-commit-config.yaml.in +# ${CMAKE_SOURCE_DIR}/.pre-commit-config.yaml @ONLY) From e40971a8297f0324e6d03dc31946dc836bcd4166 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 6 Dec 2024 10:00:49 +0000 Subject: [PATCH 026/232] test pre-commit Signed-off-by: Zone.N --- .clang-tidy | 1 - .pre-commit-config.yaml | 39 +++++++++++++--------- cmake/project_config.cmake | 4 +-- src/kernel/arch/x86_64/include/cpu/cpu.hpp | 11 +++--- tools/.pre-commit-config.yaml.in | 29 +++++++++++++--- 5 files changed, 56 insertions(+), 28 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 3f14f0a73..bbd07b12a 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -21,6 +21,5 @@ Checks: > -readability-named-parameter, -readability-braces-around-statements, -readability-magic-numbers -HeaderFilterRegex: '^${sourceDir}/src/*' FormatStyle: google ... diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ba6ee76c7..7140da9c8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,21 +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 - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json - - -extra-arg=--std=c++2b + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/root/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/cmake/project_config.cmake b/cmake/project_config.cmake index 58f6ceb27..bf63b3a3e 100644 --- a/cmake/project_config.cmake +++ b/cmake/project_config.cmake @@ -55,5 +55,5 @@ ENDIF() # 生成项目配置头文件,传递给代码 CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/project_config.h.in ${CMAKE_SOURCE_DIR}/src/project_config.h @ONLY) -# CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/.pre-commit-config.yaml.in -# ${CMAKE_SOURCE_DIR}/.pre-commit-config.yaml @ONLY) +CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/.pre-commit-config.yaml.in + ${CMAKE_SOURCE_DIR}/.pre-commit-config.yaml @ONLY) diff --git a/src/kernel/arch/x86_64/include/cpu/cpu.hpp b/src/kernel/arch/x86_64/include/cpu/cpu.hpp index 75a6fa58c..629f7ee21 100644 --- a/src/kernel/arch/x86_64/include/cpu/cpu.hpp +++ b/src/kernel/arch/x86_64/include/cpu/cpu.hpp @@ -37,8 +37,9 @@ namespace cpu { * @param port 要读的端口 * @return uint8_t 读取到的数据 */ -static __always_inline uint8_t InByte(const uint32_t port) { +static __always_inline auto InByte(const uint32_t port) -> uint8_t { uint8_t data; + __asm__ volatile("inb %1, %0" : "=a"(data) : "dN"(port)); return data; } @@ -48,7 +49,7 @@ static __always_inline uint8_t InByte(const uint32_t port) { * @param port 要读的端口 * @return uint16_t 读取到的数据 */ -static __always_inline uint16_t InWord(const uint32_t port) { +static __always_inline auto InWord(const uint32_t port) -> uint16_t { uint16_t data; __asm__ volatile("inw %1, %0" : "=a"(data) : "dN"(port)); return data; @@ -59,7 +60,7 @@ static __always_inline uint16_t InWord(const uint32_t port) { * @param port 要读的端口 * @return uint32_t 读取到的数据 */ -static __always_inline uint32_t InLong(const uint32_t port) { +static __always_inline auto InLong(const uint32_t port) -> uint32_t { uint32_t data; __asm__ volatile("inl %1, %0" : "=a"(data) : "dN"(port)); return data; @@ -170,7 +171,7 @@ class Serial { * @return false */ [[nodiscard]] auto SerialReceived() const -> bool { - return InByte(port_ + 5) & 1; + return bool(InByte(port_ + 5) & 1); } /** @@ -179,7 +180,7 @@ class Serial { * @return false */ [[nodiscard]] auto IsTransmitEmpty() const -> bool { - return InByte(port_ + 5) & 0x20; + return bool((InByte(port_ + 5) & 0x20) != 0); } }; }; // namespace cpu diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 400aa5858..1e5a221b0 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -22,11 +22,30 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=@CMAKE_BINARY_DIR@/compiler_commands.json - - -extra-arg=--std=c++2b + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* + # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/x86_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* + # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/riscv_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=@CMAKE_BINARY_DIR@/build_aarch64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* + # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/riscv64|@CMAKE_BINARY_DIR@/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 From 3d8b9db7761a75f5337446982187953141d3903d Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 01:53:54 +0000 Subject: [PATCH 027/232] test pre-commit Signed-off-by: Zone.N --- tools/.pre-commit-config.yaml.in | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 1e5a221b0..40960e59a 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/x86_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* # - id: clang-tidy # args: From 48900780b606e1f6edb440c0f4ad09e7c3965332 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 01:56:15 +0000 Subject: [PATCH 028/232] test pre-commit Signed-off-by: Zone.N --- src/kernel/include/kernel_elf.hpp | 2 +- src/kernel/include/kernel_fdt.hpp | 2 +- src/kernel/include/kernel_log.hpp | 2 +- src/kernel/libc/sk_libc.c | 5 ++++- src/kernel/libcxx/sk_libcxx.cpp | 20 ++++++++++++++++---- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/kernel/include/kernel_elf.hpp b/src/kernel/include/kernel_elf.hpp index f23cf577d..e61e27577 100644 --- a/src/kernel/include/kernel_elf.hpp +++ b/src/kernel/include/kernel_elf.hpp @@ -23,9 +23,9 @@ #include #include -#include "sk_cstring" #include "kernel_log.hpp" #include "singleton.hpp" +#include "sk_cstring" /** * elf 文件相关 diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index afd535b63..23ac27950 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -33,9 +33,9 @@ #include #include -#include "sk_cstring" #include "kernel_log.hpp" #include "singleton.hpp" +#include "sk_cstring" /** * elf 文件相关 diff --git a/src/kernel/include/kernel_log.hpp b/src/kernel/include/kernel_log.hpp index de9a0d3e2..afc00c191 100644 --- a/src/kernel/include/kernel_log.hpp +++ b/src/kernel/include/kernel_log.hpp @@ -134,6 +134,6 @@ extern "C" inline void Err(const char* format, ...) { [[maybe_unused]] static Logger debug; [[maybe_unused]] static Logger err; -} // namespace log +} // namespace klog #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_LOG_HPP_ */ diff --git a/src/kernel/libc/sk_libc.c b/src/kernel/libc/sk_libc.c index bc110a72a..bd7b92554 100644 --- a/src/kernel/libc/sk_libc.c +++ b/src/kernel/libc/sk_libc.c @@ -22,4 +22,7 @@ uint64_t __stack_chk_guard = 0x595E9FBD94FDA766; /// 栈保护检查失败后进入死循环 -__attribute__((noreturn)) void __stack_chk_fail() { while (1); } +__attribute__((noreturn)) void __stack_chk_fail() { + while (1) + ; +} diff --git a/src/kernel/libcxx/sk_libcxx.cpp b/src/kernel/libcxx/sk_libcxx.cpp index 6712de839..46cdff92b 100644 --- a/src/kernel/libcxx/sk_libcxx.cpp +++ b/src/kernel/libcxx/sk_libcxx.cpp @@ -155,15 +155,27 @@ extern "C" void __cxa_guard_abort(GuardType* guard) { /** * 纯虚函数调用处理 */ -extern "C" void __cxa_pure_virtual() { while (1); } +extern "C" void __cxa_pure_virtual() { + while (1) + ; +} /** * 异常处理 * @note 这里只能处理 throw,无法处理异常类型 */ -extern "C" void __cxa_rethrow() { while (1); } -extern "C" void _Unwind_Resume() { while (1); } -extern "C" void __gxx_personality_v0() { while (1); } +extern "C" void __cxa_rethrow() { + while (1) + ; +} +extern "C" void _Unwind_Resume() { + while (1) + ; +} +extern "C" void __gxx_personality_v0() { + while (1) + ; +} /** * c++ 全局对象构造 From 6a9afa6c8eac5e201d1ade3931a7f79d836a0f94 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 01:58:16 +0000 Subject: [PATCH 029/232] test pre-commit Signed-off-by: Zone.N --- tools/.pre-commit-config.yaml.in | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 40960e59a..81b8c1fe6 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -22,12 +22,12 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/x86_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* # - id: clang-tidy From 112288a4fc4a50decf89eacd7a11f89a146b2b28 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 02:35:19 +0000 Subject: [PATCH 030/232] test pre-commit Signed-off-by: Zone.N --- tools/.pre-commit-config.yaml.in | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 81b8c1fe6..40960e59a 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -22,12 +22,12 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/x86_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* # - id: clang-tidy From d7feea6bfdf40b353e0d8345a3f9dfd2d6cc5b1f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 02:35:52 +0000 Subject: [PATCH 031/232] test pre-commit Signed-off-by: Zone.N --- .pre-commit-config.yaml | 14 +++++++------- src/kernel/main.cpp | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7140da9c8..b2e97c4ce 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 6ce86a422..820fe776a 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -26,6 +26,7 @@ void _start(uint32_t argc, uint8_t *argv) { CppInit(); auto eag = 0; + main(argc, argv); CppDeInit(); From e4335ad780a64238b2ef03631d91047b854648a4 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 02:36:29 +0000 Subject: [PATCH 032/232] test pre-commit Signed-off-by: Zone.N --- src/kernel/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 820fe776a..a1b3d9b54 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -25,8 +25,6 @@ void _start(uint32_t argc, uint8_t *argv) { CppInit(); - auto eag = 0; - main(argc, argv); CppDeInit(); From 01d8f9360c7ffea10f21426669d2d46d18e693fe Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 06:40:06 +0000 Subject: [PATCH 033/232] perf: replace with template Signed-off-by: Zone.N --- src/kernel/arch/x86_64/include/cpu/cpu.hpp | 109 +++++++++------------ 1 file changed, 45 insertions(+), 64 deletions(-) diff --git a/src/kernel/arch/x86_64/include/cpu/cpu.hpp b/src/kernel/arch/x86_64/include/cpu/cpu.hpp index 629f7ee21..1dda54698 100644 --- a/src/kernel/arch/x86_64/include/cpu/cpu.hpp +++ b/src/kernel/arch/x86_64/include/cpu/cpu.hpp @@ -33,64 +33,45 @@ */ namespace cpu { /** - * @brief 读一个字节 + * @brief 从端口读数据 + * @tparam T 要读的数据类型 * @param port 要读的端口 - * @return uint8_t 读取到的数据 + * @return uint8_t 读取到的数据 */ -static __always_inline auto InByte(const uint32_t port) -> uint8_t { - uint8_t data; - - __asm__ volatile("inb %1, %0" : "=a"(data) : "dN"(port)); - return data; -} - -/** - * @brief 读一个字 - * @param port 要读的端口 - * @return uint16_t 读取到的数据 - */ -static __always_inline auto InWord(const uint32_t port) -> uint16_t { - uint16_t data; - __asm__ volatile("inw %1, %0" : "=a"(data) : "dN"(port)); - return data; -} - -/** - * @brief 读一个双字 - * @param port 要读的端口 - * @return uint32_t 读取到的数据 - */ -static __always_inline auto InLong(const uint32_t port) -> uint32_t { - uint32_t data; - __asm__ volatile("inl %1, %0" : "=a"(data) : "dN"(port)); +template +static __always_inline auto In(const uint32_t port) -> T { + T data; + if constexpr (std::is_same::value) { + __asm__ volatile("inb %1, %0" : "=a"(data) : "dN"(port)); + } else if constexpr (std::is_same::value) { + __asm__ volatile("inw %1, %0" : "=a"(data) : "dN"(port)); + } else if constexpr (std::is_same::value) { + __asm__ volatile("inl %1, %0" : "=a"(data) : "dN"(port)); + } else { + klog::Err("No Type\n"); + throw; + } return data; } /** - * @brief 写一个字节 + * @brief 向端口写数据 + * @tparam T 要写的数据类型 * @param port 要写的端口 * @param data 要写的数据 */ -static __always_inline void OutByte(const uint32_t port, const uint8_t data) { - __asm__ volatile("outb %1, %0" : : "dN"(port), "a"(data)); -} - -/** - * @brief 写一个字 - * @param port 要写的端口 - * @param data 要写的数据 - */ -static __always_inline void OutWord(const uint32_t port, const uint16_t data) { - __asm__ volatile("outw %1, %0" : : "dN"(port), "a"(data)); -} - -/** - * @brief 写一个双字 - * @param port 要写的端口 - * @param data 要写的数据 - */ -static __always_inline void OutLong(const uint32_t port, const uint32_t data) { - __asm__ volatile("outl %1, %0" : : "dN"(port), "a"(data)); +template +static __always_inline void Out(const uint32_t port, const T data) { + if constexpr (std::is_same::value) { + __asm__ volatile("outb %1, %0" : : "dN"(port), "a"(data)); + } else if constexpr (std::is_same::value) { + __asm__ volatile("outw %1, %0" : : "dN"(port), "a"(data)); + } else if constexpr (std::is_same::value) { + __asm__ volatile("outl %1, %0" : : "dN"(port), "a"(data)); + } else { + klog::Err("No Type\n"); + throw; + } } /// @name 端口 @@ -102,31 +83,31 @@ class Serial { public: explicit Serial(uint32_t port) : port_(port) { // Disable all interrupts - OutByte(port_ + 1, 0x00); + Out(port_ + 1, 0x00); // Enable DLAB (set baud rate divisor) - OutByte(port_ + 3, 0x80); + Out(port_ + 3, 0x80); // Set divisor to 3 (lo byte) 38400 baud - OutByte(port_ + 0, 0x03); + Out(port_ + 0, 0x03); // (hi byte) - OutByte(port_ + 1, 0x00); + Out(port_ + 1, 0x00); // 8 bits, no parity, one stop bit - OutByte(port_ + 3, 0x03); + Out(port_ + 3, 0x03); // Enable FIFO, clear them, with 14-byte threshold - OutByte(port_ + 2, 0xC7); + Out(port_ + 2, 0xC7); // IRQs enabled, RTS/DSR set - OutByte(port_ + 4, 0x0B); + Out(port_ + 4, 0x0B); // Set in loopback mode, test the serial chip - OutByte(port_ + 4, 0x1E); + Out(port_ + 4, 0x1E); // Test serial chip (send byte 0xAE and check if serial returns same byte) - OutByte(port_ + 0, 0xAE); + Out(port_ + 0, 0xAE); // Check if serial is faulty (i.e: not same byte as sent) - if (InByte(port_ + 0) != 0xAE) { + if (In(port_ + 0) != 0xAE) { asm("hlt"); } // If serial is not faulty set it in normal operation mode (not-loopback // with IRQs enabled and OUT#1 and OUT#2 bits enabled) - OutByte(port_ + 4, 0x0F); + Out(port_ + 4, 0x0F); } ~Serial() = default; @@ -148,7 +129,7 @@ class Serial { while (!SerialReceived()) { ; } - return InByte(port_); + return In(port_); } /** @@ -159,7 +140,7 @@ class Serial { while (!IsTransmitEmpty()) { ; } - OutByte(port_, c); + Out(port_, c); } private: @@ -171,7 +152,7 @@ class Serial { * @return false */ [[nodiscard]] auto SerialReceived() const -> bool { - return bool(InByte(port_ + 5) & 1); + return bool(In(port_ + 5) & 1); } /** @@ -180,7 +161,7 @@ class Serial { * @return false */ [[nodiscard]] auto IsTransmitEmpty() const -> bool { - return bool((InByte(port_ + 5) & 0x20) != 0); + return bool((In(port_ + 5) & 0x20) != 0); } }; }; // namespace cpu From 474b1fc152693bf381a49cde6d970d29b8007a1f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 06:40:55 +0000 Subject: [PATCH 034/232] perf: replace with template Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- tools/.pre-commit-config.yaml.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b2e97c4ce..451598a35 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,7 +28,7 @@ repos: - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 40960e59a..5d1309386 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -28,7 +28,7 @@ repos: - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - # - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* + - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/x86_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* # - id: clang-tidy # args: From 24978fff7b41025c842d89cefc771b9dd61ea793 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 06:41:27 +0000 Subject: [PATCH 035/232] perf: replace with template Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- tools/.pre-commit-config.yaml.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 451598a35..a0a1c1ceb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,7 +28,7 @@ repos: - -p=/root/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 5d1309386..30d7ed5c6 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -28,7 +28,7 @@ repos: - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(?@CMAKE_BINARY_DIR@/src/).* + - --header-filter=^(@CMAKE_BINARY_DIR@/src/).* # - --exclude-header-filter=^(?@CMAKE_BINARY_DIR@/src/arch/x86_64|@CMAKE_BINARY_DIR@/src/arch/aarch64).* # - id: clang-tidy # args: From 5c15edcff138a30f977376b0e4d5a7944134520e Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 07:49:59 +0000 Subject: [PATCH 036/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/arch/x86_64/arch_main.cpp | 29 +++++++++++++++------------- src/kernel/include/basic_info.hpp | 6 +++--- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index b34c13e66..1e99d22fd 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -14,31 +14,33 @@ * */ -#include +#include #include "basic_info.hpp" #include "cpu/cpu.hpp" #include "kernel_elf.hpp" #include "kernel_log.hpp" -#include "sk_cstdio" -#include "sk_cstring" +#include "singleton.hpp" +#include "sk_iostream" // printf_bare_metal 基本输出实现 /// @note 这里要注意,保证在 serial 初始化之前不能使用 printf /// 函数,否则会有全局对象依赖问题 -static cpu::Serial kSerial(cpu::kCom1); +namespace { +cpu::Serial kSerial(cpu::kCom1); extern "C" void _putchar(char character) { kSerial.Write(character); } - // 引用链接脚本中的变量 /// @see http://wiki.osdev.org/Using_Linker_Script_Values /// 内核开始 -extern "C" void *__executable_start[]; +extern "C" void *__executable_start[]; // NOLINT /// 内核结束 extern "C" void *end[]; -BasicInfo::BasicInfo(uint32_t argc, uint8_t *argv) { +} // namespace + +BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { (void)argc; - auto basic_info = *reinterpret_cast(argv); + auto basic_info = *reinterpret_cast(argv); physical_memory_addr = basic_info.physical_memory_addr; physical_memory_size = basic_info.physical_memory_size; @@ -52,18 +54,19 @@ BasicInfo::BasicInfo(uint32_t argc, uint8_t *argv) { fdt_addr = 0; } -uint32_t ArchInit(uint32_t argc, uint8_t *argv) { +auto ArchInit(uint32_t argc, uint8_t *argv) -> uint32_t { if (argc != 1) { klog::Err("argc != 1 [%d]\n", argc); throw; } - kBasicInfo.GetInstance() = BasicInfo(argc, argv); - sk_std::cout << kBasicInfo.GetInstance(); + Singleton::GetInstance() = BasicInfo(argc, argv); + sk_std::cout << Singleton::GetInstance(); // 解析内核 elf 信息 - kKernelElf.GetInstance() = KernelElf(kBasicInfo.GetInstance().elf_addr, - kBasicInfo.GetInstance().elf_size); + Singleton::GetInstance() = + KernelElf(Singleton::GetInstance().elf_addr, + Singleton::GetInstance().elf_size); klog::Info("Hello x86_64 ArchInit\n"); diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index 286f3df29..3649a4afd 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -48,7 +48,7 @@ struct BasicInfo { * @param argc 同 _start * @param argv 同 _start */ - explicit BasicInfo(uint32_t argc, uint8_t *argv); + explicit BasicInfo(uint32_t argc, const uint8_t *argv); /// @name 构造/析构函数 /// @{ @@ -60,8 +60,8 @@ struct BasicInfo { ~BasicInfo() = default; /// @} - friend sk_std::ostream &operator<<(sk_std::ostream &os, - const BasicInfo &basic_info) { + friend auto operator<<(sk_std::ostream &os, const BasicInfo &basic_info) + -> sk_std::ostream & { printf("physical_memory_addr: 0x%X, size 0x%X.\n", basic_info.physical_memory_addr, basic_info.physical_memory_size); printf("kernel_addr: 0x%X, size 0x%X.\n", basic_info.kernel_addr, From 20b6afe0c03fc2bbd06e25ae2109a097ec2985a6 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 08:16:47 +0000 Subject: [PATCH 037/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/arch/x86_64/include/cpu/regs.hpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/kernel/arch/x86_64/include/cpu/regs.hpp b/src/kernel/arch/x86_64/include/cpu/regs.hpp index 62003e551..e73187bc7 100644 --- a/src/kernel/arch/x86_64/include/cpu/regs.hpp +++ b/src/kernel/arch/x86_64/include/cpu/regs.hpp @@ -17,10 +17,11 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_REGS_HPP_ #define SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_REGS_HPP_ +#include + #include #include #include -#include #include "kernel_log.hpp" #include "sk_cstdio" @@ -80,7 +81,7 @@ class ReadOnlyRegBase { */ static __always_inline auto Read() -> typename RegInfo::DataType { typename RegInfo::DataType value{}; - if constexpr (std::is_same::value) { + if constexpr (std::is_same_v) { __asm__ volatile("mov %%rbp, %0" : "=r"(value) : :); } else { klog::Err("No Type\n"); @@ -119,7 +120,7 @@ class WriteOnlyRegBase { * @param value 要写的值 */ static __always_inline void Write(typename RegInfo::DataType value) { - if constexpr (std::is_same::value) { + if constexpr (std::is_same_v) { __asm__ volatile("mv fp, %0" : : "r"(value) :); } else { klog::Err("No Type\n"); @@ -154,10 +155,10 @@ namespace regs { // 第三部分:寄存器实例 class Rbp : public read_write::ReadWriteRegBase { public: - friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const Rbp &rbp) - -> sk_std::ostream & { - printf("val: 0x%p", regs::Rbp::Read()); - return os; + friend auto operator<<(sk_std::ostream &ostream, + [[maybe_unused]] const Rbp &rbp) -> sk_std::ostream & { + klog::Info("val: 0x%p", regs::Rbp::Read()); + return ostream; } }; From 2adf4457302ff7a8cd1d79c626ed99eab64ae40e Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 08:28:44 +0000 Subject: [PATCH 038/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/arch/x86_64/include/cpu/cpu.hpp | 23 +++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/kernel/arch/x86_64/include/cpu/cpu.hpp b/src/kernel/arch/x86_64/include/cpu/cpu.hpp index 1dda54698..6fce300b5 100644 --- a/src/kernel/arch/x86_64/include/cpu/cpu.hpp +++ b/src/kernel/arch/x86_64/include/cpu/cpu.hpp @@ -17,14 +17,13 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_CPU_HPP_ #define SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_CPU_HPP_ +#include + #include #include #include -#include #include "kernel_log.hpp" -#include "regs.hpp" -#include "sk_cstdio" #include "sk_iostream" /** @@ -41,11 +40,11 @@ namespace cpu { template static __always_inline auto In(const uint32_t port) -> T { T data; - if constexpr (std::is_same::value) { + if constexpr (std::is_same_v) { __asm__ volatile("inb %1, %0" : "=a"(data) : "dN"(port)); - } else if constexpr (std::is_same::value) { + } else if constexpr (std::is_same_v) { __asm__ volatile("inw %1, %0" : "=a"(data) : "dN"(port)); - } else if constexpr (std::is_same::value) { + } else if constexpr (std::is_same_v) { __asm__ volatile("inl %1, %0" : "=a"(data) : "dN"(port)); } else { klog::Err("No Type\n"); @@ -62,11 +61,11 @@ static __always_inline auto In(const uint32_t port) -> T { */ template static __always_inline void Out(const uint32_t port, const T data) { - if constexpr (std::is_same::value) { + if constexpr (std::is_same_v) { __asm__ volatile("outb %1, %0" : : "dN"(port), "a"(data)); - } else if constexpr (std::is_same::value) { + } else if constexpr (std::is_same_v) { __asm__ volatile("outw %1, %0" : : "dN"(port), "a"(data)); - } else if constexpr (std::is_same::value) { + } else if constexpr (std::is_same_v) { __asm__ volatile("outl %1, %0" : : "dN"(port), "a"(data)); } else { klog::Err("No Type\n"); @@ -134,13 +133,13 @@ class Serial { /** * @brief 写一个字节 - * @param c 要写的数据 + * @param byte 要写的数据 */ - void Write(uint8_t c) const { + void Write(uint8_t byte) const { while (!IsTransmitEmpty()) { ; } - Out(port_, c); + Out(port_, byte); } private: From 4293f7d513d5e4874bca6a3f8682e0bba2019747 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:25:08 +0000 Subject: [PATCH 039/232] style: fix clang-tidy Signed-off-by: Zone.N --- .clang-tidy | 3 +- src/kernel/arch/arch.h | 6 ++-- src/kernel/arch/x86_64/backtrace.cpp | 42 +++++++++++++++++----------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index bbd07b12a..7e21d1d66 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -20,6 +20,7 @@ Checks: > -misc-non-private-member-variables-in-classes, -readability-named-parameter, -readability-braces-around-statements, - -readability-magic-numbers + -readability-magic-numbers, + -performance-no-int-to-ptr FormatStyle: google ... diff --git a/src/kernel/arch/arch.h b/src/kernel/arch/arch.h index 93e0e329c..217a14d21 100644 --- a/src/kernel/arch/arch.h +++ b/src/kernel/arch/arch.h @@ -25,10 +25,10 @@ * @param argc 在不同体系结构有不同含义,同 _start * @param argv 在不同体系结构有不同含义,同 _start */ -uint32_t ArchInit(uint32_t argc, uint8_t *argv); +auto ArchInit(uint32_t argc, uint8_t *argv) -> uint32_t; /// 最多回溯 128 层调用栈 -static constexpr const size_t kMaxFramesCount = 128; +static constexpr const size_t kMaxFrameCount = 128; /** * 获取调用栈 @@ -36,7 +36,7 @@ static constexpr const size_t kMaxFramesCount = 128; * @param size 数组的大小,即调用栈中最多存储多少个返回地址 * @return int 成功时返回实际写入数组中的地址数量,失败时返回 -1 */ -__always_inline int backtrace(void **buffer, int size); +__always_inline auto backtrace(void **buffer, int size) -> int; /** * 打印调用栈 diff --git a/src/kernel/arch/x86_64/backtrace.cpp b/src/kernel/arch/x86_64/backtrace.cpp index c4223fad3..05573afcb 100644 --- a/src/kernel/arch/x86_64/backtrace.cpp +++ b/src/kernel/arch/x86_64/backtrace.cpp @@ -13,40 +13,48 @@ * */ +#include + +#include +#include +#include + #include "arch.h" -#include "cpu/cpu.hpp" +#include "cpu/regs.hpp" #include "kernel_elf.hpp" -#include "sk_cstdio" -#include "sk_libc.h" +#include "kernel_log.hpp" +#include "singleton.hpp" -int backtrace(void **buffer, int size) { - uint64_t *rbp = (uint64_t *)cpu::kAllXreg.rbp.Read(); +auto backtrace(std::array &buffer) -> int { + auto *rbp = reinterpret_cast(cpu::regs::Rbp::Read()); uint64_t *rip = nullptr; int count = 0; - while (rbp && *rbp && count < size) { + while ((rbp != nullptr) && (*rbp != 0U) && count < buffer.max_size()) { rip = rbp + 1; - rbp = (uint64_t *)*rbp; - buffer[count++] = (void *)*rip; + rbp = reinterpret_cast(*rbp); + buffer[count++] = *rip; } return count; } void DumpStack() { - void *buffer[kMaxFramesCount]; + std::array buffer{}; // 获取调用栈中的地址 - auto num_frames = backtrace(buffer, kMaxFramesCount); + auto num_frames = backtrace(buffer); - for (auto i = 0; i < num_frames; i++) { + for (auto current_frame_idx = 0; current_frame_idx < num_frames; + current_frame_idx++) { // 打印函数名 - for (auto j : kKernelElf.GetInstance().symtab_) { - if ((ELF64_ST_TYPE(j.st_info) == STT_FUNC) && - ((uint64_t)buffer[i] >= j.st_value) && - ((uint64_t)buffer[i] <= j.st_value + j.st_size)) { - printf("[%s] 0x%p\n", kKernelElf.GetInstance().strtab_ + j.st_name, - (uint64_t)buffer[i]); + for (auto symtab : Singleton::GetInstance().symtab_) { + if ((ELF64_ST_TYPE(symtab.st_info) == STT_FUNC) && + (buffer[current_frame_idx] >= symtab.st_value) && + (buffer[current_frame_idx] <= symtab.st_value + symtab.st_size)) { + klog::Err("[%s] 0x%p\n", + Singleton::GetInstance().strtab_ + symtab.st_name, + buffer[current_frame_idx]); } } } From de6ad39bdd36a6ac25c0626b888320ea1c02bfaf Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:25:58 +0000 Subject: [PATCH 040/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/arch/arch.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/kernel/arch/arch.h b/src/kernel/arch/arch.h index 217a14d21..9ed4454f9 100644 --- a/src/kernel/arch/arch.h +++ b/src/kernel/arch/arch.h @@ -17,6 +17,8 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_ARCH_H_ #define SIMPLEKERNEL_SRC_KERNEL_ARCH_ARCH_H_ +#include + #include #include From b9d0e0376d2249ef901942e4ab6d33cfe72c7869 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:26:58 +0000 Subject: [PATCH 041/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/driver/driver.cpp | 6 ++++-- src/kernel/driver/include/driver.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/kernel/driver/driver.cpp b/src/kernel/driver/driver.cpp index 60001ec7a..254d37af0 100644 --- a/src/kernel/driver/driver.cpp +++ b/src/kernel/driver/driver.cpp @@ -16,12 +16,14 @@ #include "driver.h" -uint32_t Driver(uint32_t argc, uint8_t *argv) { +#include + +auto Driver(uint32_t argc, const uint8_t *argv) -> uint32_t { (void)argc; (void)argv; // 进入死循环 - while (1) { + while (true) { ; } diff --git a/src/kernel/driver/include/driver.h b/src/kernel/driver/include/driver.h index 836feb3a3..ecd89cd7e 100644 --- a/src/kernel/driver/include/driver.h +++ b/src/kernel/driver/include/driver.h @@ -25,6 +25,6 @@ * @param argv 参数列表 * @return uint32_t 正常返回 0 */ -uint32_t Driver(uint32_t argc, uint8_t *argv); +auto Driver(uint32_t argc, const uint8_t *argv) -> uint32_t; #endif /* SIMPLEKERNEL_SRC_KERNEL_DRIVER_INCLUDE_DRIVER_H_ */ From fe9f6253d3c72ae61a013eb88edff1d145689846 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:29:38 +0000 Subject: [PATCH 042/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/include/basic_info.hpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index 3649a4afd..f80c77332 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -20,8 +20,8 @@ #include #include +#include "kernel_log.hpp" #include "singleton.hpp" -#include "sk_cstdio" #include "sk_iostream" struct BasicInfo { @@ -60,16 +60,17 @@ struct BasicInfo { ~BasicInfo() = default; /// @} - friend auto operator<<(sk_std::ostream &os, const BasicInfo &basic_info) + friend auto operator<<(sk_std::ostream &ostream, const BasicInfo &basic_info) -> sk_std::ostream & { - printf("physical_memory_addr: 0x%X, size 0x%X.\n", - basic_info.physical_memory_addr, basic_info.physical_memory_size); - printf("kernel_addr: 0x%X, size 0x%X.\n", basic_info.kernel_addr, - basic_info.kernel_size); - printf("elf_addr: 0x%X, size 0x%X\n", basic_info.elf_addr, - basic_info.elf_size); - printf("fdt_addr: 0x%X\n", basic_info.fdt_addr); - return os; + klog::Info("physical_memory_addr: 0x%X, size 0x%X.\n", + basic_info.physical_memory_addr, + basic_info.physical_memory_size); + klog::Info("kernel_addr: 0x%X, size 0x%X.\n", basic_info.kernel_addr, + basic_info.kernel_size); + klog::Info("elf_addr: 0x%X, size 0x%X\n", basic_info.elf_addr, + basic_info.elf_size); + klog::Info("fdt_addr: 0x%X\n", basic_info.fdt_addr); + return ostream; } }; From 27a0aa09405f9bcdda306e529119d268123cf210 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:31:11 +0000 Subject: [PATCH 043/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/include/kernel_elf.hpp | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/kernel/include/kernel_elf.hpp b/src/kernel/include/kernel_elf.hpp index e61e27577..69e002e61 100644 --- a/src/kernel/include/kernel_elf.hpp +++ b/src/kernel/include/kernel_elf.hpp @@ -21,11 +21,11 @@ #include #include +#include #include #include "kernel_log.hpp" #include "singleton.hpp" -#include "sk_cstring" /** * elf 文件相关 @@ -33,7 +33,7 @@ class KernelElf { public: /// 符号表 - std::span symtab_ = {}; + std::span symtab_; /// 字符串表 uint8_t *strtab_ = nullptr; @@ -43,12 +43,12 @@ class KernelElf { * @param elf_size elf 大小,默认为 64,Elf64_Ehdr 的大小 */ explicit KernelElf(uint64_t elf_addr, size_t elf_size = 64) { - if (!elf_addr || !elf_size) { + if ((elf_addr == 0U) || (elf_size == 0U)) { klog::Err("Fatal Error: Invalid elf_addr or elf_size.\n"); throw; } - elf_ = std::span((uint8_t *)elf_addr, elf_size); + elf_ = std::span(reinterpret_cast(elf_addr), elf_size); // 检查 elf 头数据 auto check_elf_identity_ret = CheckElfIdentity(); @@ -67,15 +67,15 @@ class KernelElf { reinterpret_cast(elf_.data() + ehdr_.e_shoff), ehdr_.e_shnum); - auto shstrtab = - (const char *)elf_.data() + shdr_[ehdr_.e_shstrndx].sh_offset; - for (auto i : shdr_) { - if (strcmp(shstrtab + i.sh_name, ".symtab") == 0) { + const auto *shstrtab = reinterpret_cast(elf_.data()) + + shdr_[ehdr_.e_shstrndx].sh_offset; + for (auto shdr : shdr_) { + if (strcmp(shstrtab + shdr.sh_name, ".symtab") == 0) { symtab_ = std::span( - reinterpret_cast(elf_.data() + i.sh_offset), - (i.sh_size / sizeof(Elf64_Sym))); - } else if (strcmp(shstrtab + i.sh_name, ".strtab") == 0) { - strtab_ = elf_.data() + i.sh_offset; + reinterpret_cast(elf_.data() + shdr.sh_offset), + (shdr.sh_size / sizeof(Elf64_Sym))); + } else if (strcmp(shstrtab + shdr.sh_name, ".strtab") == 0) { + strtab_ = elf_.data() + shdr.sh_offset; } } } @@ -93,17 +93,17 @@ class KernelElf { private: /// @name elf 文件相关 /// @{ - std::span elf_ = {}; + std::span elf_; Elf64_Ehdr ehdr_ = {}; - std::span phdr_ = {}; - std::span shdr_ = {}; + std::span phdr_; + std::span shdr_; /// @} /** * 检查 elf 标识 * @return 失败返回 false */ - [[nodiscard]] bool CheckElfIdentity() const { + [[nodiscard]] auto CheckElfIdentity() const -> bool { if ((elf_[EI_MAG0] != ELFMAG0) || (elf_[EI_MAG1] != ELFMAG1) || (elf_[EI_MAG2] != ELFMAG2) || (elf_[EI_MAG3] != ELFMAG3)) { klog::Err("Fatal Error: Invalid ELF header.\n"); From 848e6b47e4f9459153a0c09fe02e0687066e905c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:32:14 +0000 Subject: [PATCH 044/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/include/kernel_fdt.hpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index 23ac27950..0b350dc4e 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -18,6 +18,7 @@ #define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_FDT_HPP_ // 禁用 GCC/Clang 的警告 +#include "libfdt_env.h" #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" @@ -35,7 +36,6 @@ #include "kernel_log.hpp" #include "singleton.hpp" -#include "sk_cstring" /** * elf 文件相关 @@ -46,8 +46,9 @@ class KernelFdt { * 构造函数 * @param fdt_addr fdt 地址 */ - explicit KernelFdt(uint64_t fdt_addr) : fdt_addr_((void *)fdt_addr) { - if (!fdt_addr_) { + explicit KernelFdt(uint64_t fdt_addr) + : fdt_addr_(reinterpret_cast(fdt_addr)) { + if (fdt_addr_ == nullptr) { klog::Err("Fatal Error: Invalid fdt_addr.\n"); throw; } @@ -73,7 +74,7 @@ class KernelFdt { * 获取内存信息 * @return 内存信息<地址,长度> */ - std::pair GetMemory() { + auto GetMemory() -> std::pair { uint64_t base = 0; uint64_t size = 0; @@ -87,14 +88,14 @@ class KernelFdt { } // 获取 reg 属性 - auto prop = fdt_get_property(fdt_addr_, offset, "reg", &len); - if (!prop) { + const auto *prop = fdt_get_property(fdt_addr_, offset, "reg", &len); + if (prop == nullptr) { klog::Err("Error finding reg property: %s\n", fdt_strerror(len)); throw; } // 解析 reg 属性,通常包含基地址和大小 - auto reg = (const uint64_t *)prop->data; + const auto *reg = reinterpret_cast(prop->data); for (size_t i = 0; i < len / sizeof(uint64_t); i += 2) { base = fdt64_to_cpu(reg[i]); size = fdt64_to_cpu(reg[i + 1]); @@ -106,7 +107,7 @@ class KernelFdt { * 获取串口信息 * @return 内存信息<地址,长度> */ - std::pair GetSerial() { + auto GetSerial() -> std::pair { uint64_t base = 0; uint64_t size = 0; @@ -120,14 +121,14 @@ class KernelFdt { } // 获取 reg 属性 - auto prop = fdt_get_property(fdt_addr_, offset, "reg", &len); - if (!prop) { + const auto *prop = fdt_get_property(fdt_addr_, offset, "reg", &len); + if (prop == nullptr) { klog::Err("Error finding reg property: %s\n", fdt_strerror(len)); throw; } // 解析 reg 属性,通常包含基地址和大小 - auto reg = (const uint64_t *)prop->data; + const auto *reg = reinterpret_cast(prop->data); for (size_t i = 0; i < len / sizeof(uint64_t); i += 2) { base = fdt64_to_cpu(reg[i]); size = fdt64_to_cpu(reg[i + 1]); From 617f981ee06478fa1949e2cacd67207372f0d2f8 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 9 Dec 2024 09:57:32 +0000 Subject: [PATCH 045/232] style: fix clang-tidy Signed-off-by: Zone.N --- .clang-tidy | 3 +- src/kernel/include/kernel_log.hpp | 67 ++++++++++++++++--------------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 7e21d1d66..6e368ba65 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -21,6 +21,7 @@ Checks: > -readability-named-parameter, -readability-braces-around-statements, -readability-magic-numbers, - -performance-no-int-to-ptr + -performance-no-int-to-ptr, + -modernize-use-std-print FormatStyle: google ... diff --git a/src/kernel/include/kernel_log.hpp b/src/kernel/include/kernel_log.hpp index afc00c191..cf993c2d9 100644 --- a/src/kernel/include/kernel_log.hpp +++ b/src/kernel/include/kernel_log.hpp @@ -17,76 +17,77 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_LOG_HPP_ #define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_LOG_HPP_ -#include +#include +#include #include "../../project_config.h" #include "sk_cstdio" #include "sk_iostream" -namespace { +namespace klog { +namespace logger { /// ANSI 转义码,在支持 ANSI 转义码的终端中可以显示颜色 -static constexpr const auto kReset = "\033[0m"; -static constexpr const auto kRed = "\033[31m"; -static constexpr const auto kGreen = "\033[32m"; -static constexpr const auto kYellow = "\033[33m"; -static constexpr const auto kBlue = "\033[34m"; -static constexpr const auto kMagenta = "\033[35m"; -static constexpr const auto kCyan = "\033[36m"; -static constexpr const auto kWhite = "\033[37m"; +constexpr const auto kReset = "\033[0m"; +constexpr const auto kRed = "\033[31m"; +constexpr const auto kGreen = "\033[32m"; +constexpr const auto kYellow = "\033[33m"; +constexpr const auto kBlue = "\033[34m"; +constexpr const auto kMagenta = "\033[35m"; +constexpr const auto kCyan = "\033[36m"; +constexpr const auto kWhite = "\033[37m"; template class Logger : public sk_std::ostream { public: - Logger& operator<<(int8_t val) override { + auto operator<<(int8_t val) -> Logger& override { OutputFunction("%d", val); return *this; } - Logger& operator<<(uint8_t val) override { + auto operator<<(uint8_t val) -> Logger& override { OutputFunction("%d", val); return *this; } - Logger& operator<<(const char* val) override { + auto operator<<(const char* val) -> Logger& override { OutputFunction("%s", val); return *this; } - Logger& operator<<(int16_t val) override { + auto operator<<(int16_t val) -> Logger& override { OutputFunction("%d", val); return *this; } - Logger& operator<<(uint16_t val) override { + auto operator<<(uint16_t val) -> Logger& override { OutputFunction("%d", val); return *this; } - Logger& operator<<(int32_t val) override { + auto operator<<(int32_t val) -> Logger& override { OutputFunction("%d", val); return *this; } - Logger& operator<<(uint32_t val) override { + auto operator<<(uint32_t val) -> Logger& override { OutputFunction("%d", val); return *this; } - Logger& operator<<(int64_t val) override { + auto operator<<(int64_t val) -> Logger& override { OutputFunction("%ld", val); return *this; } - Logger& operator<<(uint64_t val) override { + auto operator<<(uint64_t val) -> Logger& override { OutputFunction("%ld", val); return *this; } }; -} // namespace +} // namespace logger -namespace klog { /** * @brief 与 printf 类似,只是颜色不同 */ @@ -95,9 +96,9 @@ extern "C" inline void Debug(const char* format, ...) { #ifdef SIMPLEKERNEL_DEBUG_LOG va_list args; va_start(args, format); - printf("%s", kMagenta); + printf("%s", logger::kMagenta); vprintf(format, args); - printf("%s", kReset); + printf("%s", logger::kReset); va_end(args); #endif } @@ -105,34 +106,34 @@ extern "C" inline void Debug(const char* format, ...) { extern "C" inline void Info(const char* format, ...) { va_list args; va_start(args, format); - printf("%s", kCyan); + printf("%s", logger::kCyan); vprintf(format, args); - printf("%s", kReset); + printf("%s", logger::kReset); va_end(args); } extern "C" inline void Warn(const char* format, ...) { va_list args; va_start(args, format); - printf("%s", kYellow); + printf("%s", logger::kYellow); vprintf(format, args); - printf("%s", kReset); + printf("%s", logger::kReset); va_end(args); } extern "C" inline void Err(const char* format, ...) { va_list args; va_start(args, format); - printf("%s", kRed); + printf("%s", logger::kRed); vprintf(format, args); - printf("%s", kReset); + printf("%s", logger::kReset); va_end(args); } -[[maybe_unused]] static Logger info; -[[maybe_unused]] static Logger warn; -[[maybe_unused]] static Logger debug; -[[maybe_unused]] static Logger err; +[[maybe_unused]] static logger::Logger info; +[[maybe_unused]] static logger::Logger warn; +[[maybe_unused]] static logger::Logger debug; +[[maybe_unused]] static logger::Logger err; } // namespace klog From 380ec94bc8916441dd5ec2c061046aeedf08f67c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 10 Dec 2024 08:12:26 +0000 Subject: [PATCH 046/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/include/kernel.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/kernel/include/kernel.h b/src/kernel/include/kernel.h index 6d7d59946..ab4d3cb95 100644 --- a/src/kernel/include/kernel.h +++ b/src/kernel/include/kernel.h @@ -17,7 +17,6 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_H_ #define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_H_ -#include #include /** @@ -39,6 +38,6 @@ extern "C" [[maybe_unused]] [[noreturn]] void _start(uint32_t argc, * @param argv 同 _start * @return uint32_t 正常返回 0 */ -uint32_t main(uint32_t argc, uint8_t* argv); +auto main(uint32_t argc, uint8_t* argv) -> uint32_t; #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_H_ */ From 53aceef3a36a38611504073ffd4b7665ba3c9bf6 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 10 Dec 2024 08:13:42 +0000 Subject: [PATCH 047/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/include/singleton.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/kernel/include/singleton.hpp b/src/kernel/include/singleton.hpp index c2477595c..634f84cec 100644 --- a/src/kernel/include/singleton.hpp +++ b/src/kernel/include/singleton.hpp @@ -21,23 +21,23 @@ template class Singleton { public: + /// @name 构造/析构函数 + /// @{ Singleton() = default; + Singleton(const Singleton&) = delete; + Singleton(Singleton&&) = delete; + auto operator=(const Singleton&) -> Singleton& = delete; + auto operator=(Singleton&&) -> Singleton& = delete; ~Singleton() = default; + /// @} // 获取单例实例的静态方法 - static T& GetInstance() { + static auto GetInstance() -> T& { static T instance; return instance; } private: - /// @name 构造/析构函数 - /// @{ - Singleton(const Singleton&) = delete; - Singleton(Singleton&&) = delete; - auto operator=(const Singleton&) -> Singleton& = delete; - auto operator=(Singleton&&) -> Singleton& = delete; - /// @} }; #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_SINGLETON_HPP_ */ From 9bd87175fc8edee613c580f22650304dbc564324 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 10 Dec 2024 08:13:53 +0000 Subject: [PATCH 048/232] style: fix clang-tidy Signed-off-by: Zone.N --- src/kernel/include/singleton.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/kernel/include/singleton.hpp b/src/kernel/include/singleton.hpp index 634f84cec..68293dbcd 100644 --- a/src/kernel/include/singleton.hpp +++ b/src/kernel/include/singleton.hpp @@ -36,8 +36,6 @@ class Singleton { static T instance; return instance; } - - private: }; #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_SINGLETON_HPP_ */ From 4248ec3b87c68181330b5359ca7490af5720236a Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 30 Dec 2024 08:53:41 +0000 Subject: [PATCH 049/232] feat: aarch64 bootup Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++++++---------- CMakeLists.txt | 13 +++++---- src/kernel/arch/CMakeLists.txt | 21 ++++++++------- src/kernel/arch/aarch64/arch_main.cpp | 10 +++---- src/kernel/arch/aarch64/backtrace.cpp | 4 +-- src/kernel/arch/aarch64/boot.S | 38 +++++++++++++++++++++++++++ src/kernel/arch/aarch64/link.ld | 7 ++--- test/unit_test/x86_64_cpu_test.cpp | 1 + 8 files changed, 83 insertions(+), 39 deletions(-) create mode 100644 src/kernel/arch/aarch64/boot.S diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a0a1c1ceb..566be97ee 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_x86_64/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/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_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_x86_64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/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_x86_64/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/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/CMakeLists.txt b/CMakeLists.txt index 3df88521b..4be7cdb4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,15 +81,18 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") -machine virt -cpu - cortex-a57 + cortex-a72 -m 128M -net none - -bios - ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd - -hda - fat:rw:./image/) + -kernel + $ + # -bios + # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd + # -hda + # fat:rw:./image/ + ) ENDIF() # 添加要编译的目录 diff --git a/src/kernel/arch/CMakeLists.txt b/src/kernel/arch/CMakeLists.txt index f1c93ebaa..342c92f61 100644 --- a/src/kernel/arch/CMakeLists.txt +++ b/src/kernel/arch/CMakeLists.txt @@ -1,21 +1,24 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. -add_library(arch INTERFACE) +ADD_LIBRARY (arch INTERFACE) -target_include_directories(arch INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/include -) +TARGET_INCLUDE_DIRECTORIES ( + arch + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/include) -target_sources(arch INTERFACE +TARGET_SOURCES ( + arch + INTERFACE $<$: ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/macro.S ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/boot.S > + $<$: + ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/boot.S + > ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/arch_main.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/backtrace.cpp -) + ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/backtrace.cpp) diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index 2e1e7f67a..e28151085 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -18,16 +18,14 @@ #include "sk_cstdio" // printf_bare_metal 基本输出实现 -extern "C" void _putchar(char character) { (void)character; } +extern "C" void _putchar(char character) { + volatile uint8_t *uart = (uint8_t *)0x09000000; + *uart = character; +} uint32_t ArchInit(uint32_t argc, uint8_t *argv) { (void)argc; (void)argv; - // 进入死循环 - while (1) { - ; - } - return 0; } diff --git a/src/kernel/arch/aarch64/backtrace.cpp b/src/kernel/arch/aarch64/backtrace.cpp index d1233305d..d061cb8d8 100644 --- a/src/kernel/arch/aarch64/backtrace.cpp +++ b/src/kernel/arch/aarch64/backtrace.cpp @@ -33,10 +33,10 @@ int backtrace(void **buffer, int size) { } void DumpStack() { - void *buffer[kMaxFramesCount]; + void *buffer[kMaxFrameCount]; // 获取调用栈中的地址 - auto num_frames = backtrace(buffer, kMaxFramesCount); + auto num_frames = backtrace(buffer, kMaxFrameCount); // 打印地址 /// @todo 打印函数名,需要 elf 支持 diff --git a/src/kernel/arch/aarch64/boot.S b/src/kernel/arch/aarch64/boot.S new file mode 100644 index 000000000..a4dd67569 --- /dev/null +++ b/src/kernel/arch/aarch64/boot.S @@ -0,0 +1,38 @@ + +/** + * @file boot.S + * @brief boot S + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2024-12-30 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2024-12-30Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +// clang-format off + +.section .text.boot +.global _boot +.type _boot, @function +.extern _start +_boot: + ldr x30, =stack_top + mov sp, x30 + bl _start + b . + +// 声明所属段 +.section .bss.boot +// 16 字节对齐 +.align 16 +.global stack_top +stack_top: + // 跳过 16KB + .space 4096 * 4 + +// clang-format on diff --git a/src/kernel/arch/aarch64/link.ld b/src/kernel/arch/aarch64/link.ld index af1dc5ffe..8bd144629 100644 --- a/src/kernel/arch/aarch64/link.ld +++ b/src/kernel/arch/aarch64/link.ld @@ -15,12 +15,13 @@ OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64", "elf64-littleaarch64") OUTPUT_ARCH(aarch64) -ENTRY(_start) +ENTRY(_boot) SECTIONS { /* Read-only sections, merged into text segment: */ - PROVIDE (__executable_start = SEGMENT_START("text-segment", 0xFFFF800000000000)); - . = SEGMENT_START("text-segment", 0xFFFF800000000000) + SIZEOF_HEADERS; + PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x40100000)); + . = SEGMENT_START("text-segment", 0x40100000) + SIZEOF_HEADERS; + .boot : ALIGN(0x1000) { *(.text.boot) *(.data.boot) *(.bss.boot) } .interp : { *(.interp) } .note.gnu.build-id : { *(.note.gnu.build-id) } .hash : { *(.hash) } diff --git a/test/unit_test/x86_64_cpu_test.cpp b/test/unit_test/x86_64_cpu_test.cpp index a79e8af43..2abfd7cfa 100644 --- a/test/unit_test/x86_64_cpu_test.cpp +++ b/test/unit_test/x86_64_cpu_test.cpp @@ -17,6 +17,7 @@ #include #include "x86_64/include/cpu/cpu.hpp" +#include "x86_64/include/cpu/regs.hpp" TEST(x8664RegInfoBaseTest, ValueTest) { EXPECT_EQ(cpu::register_info::RegInfoBase::kBitOffset, 0); From ebac8cfdde9560295efb5be12d02697e92f2e59f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 2 Jan 2025 05:07:34 +0000 Subject: [PATCH 050/232] feat: aarch64 bootup Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- src/kernel/arch/aarch64/arch_main.cpp | 12 +++++---- src/kernel/arch/aarch64/include/cpu/cpu.hpp | 18 +++++++++++++ src/kernel/arch/aarch64/include/cpu/regs.hpp | 28 ++++++++++++-------- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 566be97ee..2def3ca97 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,7 +45,7 @@ repos: # - -extra-arg=--std=c++2b # - --fix # - --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).* + # - --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 e28151085..b6ad5a0cb 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -15,17 +15,19 @@ */ #include "arch.h" +#include "cpu/cpu.hpp" #include "sk_cstdio" // printf_bare_metal 基本输出实现 -extern "C" void _putchar(char character) { - volatile uint8_t *uart = (uint8_t *)0x09000000; - *uart = character; -} +static uint8_t* kUartAddr = (uint8_t*)0x09000000; +extern "C" void _putchar(char character) { *kUartAddr = character; } -uint32_t ArchInit(uint32_t argc, uint8_t *argv) { +uint32_t ArchInit(uint32_t argc, uint8_t* argv) { (void)argc; (void)argv; + // 初始化 FPU + cpu::SetupFpu(); + return 0; } diff --git a/src/kernel/arch/aarch64/include/cpu/cpu.hpp b/src/kernel/arch/aarch64/include/cpu/cpu.hpp index 7f1cfa21b..ac997aba4 100644 --- a/src/kernel/arch/aarch64/include/cpu/cpu.hpp +++ b/src/kernel/arch/aarch64/include/cpu/cpu.hpp @@ -27,4 +27,22 @@ #include "sk_cstdio" #include "sk_iostream" +/** + * aarch64 cpu 相关定义 + * @note 寄存器读写设计见 arch/README.md + */ +namespace cpu { + +/** + * @brief 初始化 FPU + */ +static __always_inline void SetupFpu() { + asm volatile("mrs x0, CPACR_EL1"); + asm volatile("orr x0, x0, #(0b11 << 20)"); + asm volatile("msr CPACR_EL1, x0"); + asm volatile("isb"); +} + +} // namespace cpu + #endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_CPU_HPP_ diff --git a/src/kernel/arch/aarch64/include/cpu/regs.hpp b/src/kernel/arch/aarch64/include/cpu/regs.hpp index aef82c0b6..783103c8a 100644 --- a/src/kernel/arch/aarch64/include/cpu/regs.hpp +++ b/src/kernel/arch/aarch64/include/cpu/regs.hpp @@ -27,7 +27,7 @@ #include "sk_iostream" /** - * aarch64 cpu 相关定义 + * aarch64 cpu Control and Status Registers 相关定义 * @note 寄存器读写设计见 arch/README.md */ namespace cpu { @@ -56,7 +56,7 @@ struct X29Info : public RegInfoBase {}; }; // namespace register_info // 第二部分:读/写模版实现 -namespace { +namespace read_write { /** * 只读接口 * @tparam 寄存器类型 @@ -78,7 +78,7 @@ class ReadOnlyRegBase { * 读寄存器 * @return RegInfo::DataType 寄存器的值 */ - static __always_inline RegInfo::DataType Read() { + static __always_inline auto Read() -> typename RegInfo::DataType { typename RegInfo::DataType value{}; if constexpr (std::is_same::value) { __asm__ volatile("mov %0, x29" : "=r"(value) : :); @@ -92,7 +92,9 @@ class ReadOnlyRegBase { /** * () 重载 */ - static __always_inline RegInfo::DataType operator()() { return Read(); } + __always_inline auto operator()() -> typename RegInfo::DataType { + return Read(); + } }; /** @@ -116,9 +118,9 @@ class WriteOnlyRegBase { * 写寄存器 * @param value 要写的值 */ - static __always_inline void Write(RegInfo::DataType value) { + static __always_inline void Write(typename RegInfo::DataType value) { if constexpr (std::is_same::value) { - __asm__ volatile("mv fp, %0" : : "r"(value) :); + __asm__ volatile("mov x29, %0" : : "r"(value) :); } else { klog::Err("No Type\n"); throw; @@ -145,11 +147,15 @@ class ReadWriteRegBase : public ReadOnlyRegBase, /// @} }; +}; // namespace read_write + // 第三部分:寄存器实例 -class X29 : public ReadWriteRegBase { +namespace regs { +class X29 : public read_write::ReadWriteRegBase { public: - friend sk_std::ostream &operator<<(sk_std::ostream &os, const X29 &x29) { - printf("val: 0x%p", (void *)x29.Read()); + friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const X29 &x29) + -> sk_std::ostream & { + klog::Info("val: 0x%p", regs::X29::Read()); return os; } }; @@ -159,10 +165,10 @@ struct AllXreg { X29 x29; }; -}; // namespace +}; // namespace regs // 第四部分:访问接口 -[[maybe_unused]] static AllXreg kAllXreg; +[[maybe_unused]] static regs::AllXreg kAllXreg; }; // namespace cpu From be5ad9f9b88d66cd591377f70def3d43e48d52c1 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 2 Jan 2025 05:44:51 +0000 Subject: [PATCH 051/232] test: add cxx_init_test Signed-off-by: Zone.N --- .pre-commit-config.yaml | 16 +- src/kernel/arch/aarch64/arch_main.cpp | 6 +- test/system_test/cxx_init_test/CMakeLists.txt | 148 ++++++++++++------ test/system_test/cxx_init_test/main.cpp | 9 +- 4 files changed, 118 insertions(+), 61 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2def3ca97..83792fd21 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,12 +23,12 @@ repos: args: - --style=file # - 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_aarch64/src/).* + # 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_aarch64/src/).* # - --exclude-header-filter=^(?/root/SimpleKernel/build_aarch64/src/arch/x86_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: @@ -45,7 +45,7 @@ repos: # - -extra-arg=--std=c++2b # - --fix # - --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).* + # - --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 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index b6ad5a0cb..b16596284 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -19,8 +19,10 @@ #include "sk_cstdio" // printf_bare_metal 基本输出实现 -static uint8_t* kUartAddr = (uint8_t*)0x09000000; -extern "C" void _putchar(char character) { *kUartAddr = character; } +extern "C" void _putchar(char character) { + static uint8_t* kUartAddr = (uint8_t*)0x09000000; + *kUartAddr = character; +} uint32_t ArchInit(uint32_t argc, uint8_t* argv) { (void)argc; diff --git a/test/system_test/cxx_init_test/CMakeLists.txt b/test/system_test/cxx_init_test/CMakeLists.txt index 52facc372..0a86b7805 100644 --- a/test/system_test/cxx_init_test/CMakeLists.txt +++ b/test/system_test/cxx_init_test/CMakeLists.txt @@ -1,67 +1,115 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. # 设置项目名与版本 -project( - cxx-init-test - VERSION 0.0.1 -) - -enable_language(CXX) -enable_language(ASM) +PROJECT (cxx-init-test VERSION 0.0.1) -add_executable(${PROJECT_NAME} - main.cpp +ENABLE_LANGUAGE (CXX) +ENABLE_LANGUAGE (ASM) - $<$: - ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/boot.S - > -) +ADD_EXECUTABLE ( + ${PROJECT_NAME} + main.cpp + $<$: + ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/boot.S + > + $<$: + ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/boot.S + >) -target_include_directories(${PROJECT_NAME} PRIVATE +TARGET_INCLUDE_DIRECTORIES ( + ${PROJECT_NAME} + PRIVATE ${CMAKE_SOURCE_DIR}/src/kernel/include ${CMAKE_SOURCE_DIR}/src/kernel/arch - ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/include -) + ${CMAKE_SOURCE_DIR}/src/kernel/arch/${CMAKE_SYSTEM_PROCESSOR}/include) -target_link_libraries(${PROJECT_NAME} PRIVATE - kernel_link_libraries - libc - libcxx -) +TARGET_LINK_LIBRARIES (${PROJECT_NAME} PRIVATE kernel_link_libraries libc + libcxx) -set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") -set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${KERNEL_ELF_OUTPUT_NAME}) +SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES PREFIX "") +SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES OUTPUT_NAME + ${KERNEL_ELF_OUTPUT_NAME}) # 获取目标文件信息 -objdump_readelf_nm(${PROJECT_NAME}) +OBJDUMP_READELF_NM (${PROJECT_NAME}) # 添加 run 和 debug target -if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") - add_run_target(NAME ${PROJECT_NAME}_ - DEPENDS boot ${PROJECT_NAME} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - TARGET ${CMAKE_SYSTEM_PROCESSOR} - BOOT ${boot_BINARY_DIR}/${BOOT_EFI_OUTPUT_NAME} - KERNEL $ - QEMU_FLAGS ${QEMU_FLAGS} - ) -elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") - add_run_target(NAME ${PROJECT_NAME}_ - DEPENDS boot ${PROJECT_NAME} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - TARGET ${CMAKE_SYSTEM_PROCESSOR} - BOOT ${boot_BINARY_DIR}/${BOOT_EFI_OUTPUT_NAME} - KERNEL $ - QEMU_FLAGS - -serial stdio -monitor telnet::2333,server,nowait - -machine virt -nographic - -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf - -kernel $ - ) -elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") - -endif () +IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") + ADD_RUN_TARGET ( + NAME + ${PROJECT_NAME}_ + DEPENDS + boot + ${PROJECT_NAME} + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR} + TARGET + ${CMAKE_SYSTEM_PROCESSOR} + BOOT + ${boot_BINARY_DIR}/${BOOT_EFI_OUTPUT_NAME} + KERNEL + $ + QEMU_FLAGS + ${QEMU_FLAGS}) +ELSEIF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") + ADD_RUN_TARGET ( + NAME + ${PROJECT_NAME}_ + DEPENDS + boot + ${PROJECT_NAME} + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR} + TARGET + ${CMAKE_SYSTEM_PROCESSOR} + BOOT + ${boot_BINARY_DIR}/${BOOT_EFI_OUTPUT_NAME} + KERNEL + $ + QEMU_FLAGS + -serial + stdio + -monitor + telnet::2333,server,nowait + -machine + virt + -nographic + -bios + ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf + -kernel + $) +ELSEIF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + ADD_RUN_TARGET ( + NAME + ${PROJECT_NAME}_ + DEPENDS + boot + ${PROJECT_NAME} + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR} + TARGET + ${CMAKE_SYSTEM_PROCESSOR} + BOOT + ${boot_BINARY_DIR}/${BOOT_EFI_OUTPUT_NAME} + KERNEL + $ + QEMU_FLAGS + -serial + stdio + -monitor + telnet::2333,server,nowait + -machine + virt + -nographic + -cpu + cortex-a72 + -m + 128M + -net + none + -kernel + $) +ENDIF() diff --git a/test/system_test/cxx_init_test/main.cpp b/test/system_test/cxx_init_test/main.cpp index 9d1c02a28..e9c0f2eeb 100644 --- a/test/system_test/cxx_init_test/main.cpp +++ b/test/system_test/cxx_init_test/main.cpp @@ -31,7 +31,10 @@ extern "C" void _putchar(char character) { sbi_debug_console_write_byte(character); } #elif __aarch64__ -extern "C" void _putchar(char character) { (void)character; } +extern "C" void _putchar(char character) { + static uint8_t *kUartAddr = (uint8_t *)0x09000000; + *kUartAddr = character; +} #endif template @@ -82,6 +85,10 @@ class InsClass : public AbsClass { }; uint32_t main(uint32_t, uint8_t *) { +#ifdef __aarch64__ + cpu::SetupFpu(); +#endif + global_u8c_value_with_init++; global_u32_value_with_init++; global_u64_value_with_init++; From 023733804bf9979322c0c823ad93b0851830f361 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 2 Jan 2025 05:45:00 +0000 Subject: [PATCH 052/232] test: add cxx_init_test Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 83792fd21..fc391505a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint From 1e84818fe88b90cdb2f1dfbdb78ae8768b4bed57 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 21:46:38 +0800 Subject: [PATCH 053/232] add cpu_io Signed-off-by: Zone.NiuZH --- .gitmodules | 3 +++ 3rd/cpu_io | 1 + 2 files changed, 4 insertions(+) create mode 160000 3rd/cpu_io diff --git a/.gitmodules b/.gitmodules index e93978d2a..45264441a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "3rd/grub2"] path = 3rd/grub2 url = https://git.savannah.gnu.org/git/grub.git +[submodule "3rd/cpu_io"] + path = 3rd/cpu_io + url = https://github.com/MRNIU/cpu_io.git diff --git a/3rd/cpu_io b/3rd/cpu_io new file mode 160000 index 000000000..4fd38513a --- /dev/null +++ b/3rd/cpu_io @@ -0,0 +1 @@ +Subproject commit 4fd38513a5ddf34a9f0e4d2181d2001a3e90b5f0 From 9127ce86bcc5d2d7f56fd9834c86da02670c34c9 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 22:18:37 +0800 Subject: [PATCH 054/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- 3rd/cpu_io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rd/cpu_io b/3rd/cpu_io index 4fd38513a..f6feb23ed 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 4fd38513a5ddf34a9f0e4d2181d2001a3e90b5f0 +Subproject commit f6feb23ed18a2e23a3f58056bb0325063aebe426 From e36b53c8bf3d6a0813152ad7ddcb83f65f77729b Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:12:04 +0800 Subject: [PATCH 055/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 18 +- 3rd/cpu_io | 2 +- src/kernel/arch/x86_64/arch_main.cpp | 3 +- src/kernel/arch/x86_64/backtrace.cpp | 2 +- src/kernel/arch/x86_64/include/cpu/cpu.hpp | 168 ------------------- src/kernel/arch/x86_64/include/cpu/regs.hpp | 177 -------------------- test/system_test/cxx_init_test/main.cpp | 17 +- test/system_test/gnu_efi_test/main.cpp | 21 +-- test/unit_test/x86_64_cpu_test.cpp | 4 +- 9 files changed, 34 insertions(+), 378 deletions(-) delete mode 100644 src/kernel/arch/x86_64/include/cpu/cpu.hpp delete mode 100644 src/kernel/arch/x86_64/include/cpu/regs.hpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fc391505a..cb068a736 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/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).* + # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index f6feb23ed..8c831d772 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit f6feb23ed18a2e23a3f58056bb0325063aebe426 +Subproject commit 8c831d77235ba9dd19de83e91618f67473473893 diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 1e99d22fd..9137a5b57 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -14,10 +14,11 @@ * */ +#include + #include #include "basic_info.hpp" -#include "cpu/cpu.hpp" #include "kernel_elf.hpp" #include "kernel_log.hpp" #include "singleton.hpp" diff --git a/src/kernel/arch/x86_64/backtrace.cpp b/src/kernel/arch/x86_64/backtrace.cpp index 05573afcb..af01117b2 100644 --- a/src/kernel/arch/x86_64/backtrace.cpp +++ b/src/kernel/arch/x86_64/backtrace.cpp @@ -13,6 +13,7 @@ * */ +#include #include #include @@ -20,7 +21,6 @@ #include #include "arch.h" -#include "cpu/regs.hpp" #include "kernel_elf.hpp" #include "kernel_log.hpp" #include "singleton.hpp" diff --git a/src/kernel/arch/x86_64/include/cpu/cpu.hpp b/src/kernel/arch/x86_64/include/cpu/cpu.hpp deleted file mode 100644 index 6fce300b5..000000000 --- a/src/kernel/arch/x86_64/include/cpu/cpu.hpp +++ /dev/null @@ -1,168 +0,0 @@ - -/** - * @file cpu.hpp - * @brief x86_64 cpu 相关定义 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2024-03-05 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2024-03-05Zone.N (Zone.Niuzh@hotmail.com)创建文件 - *
- */ - -#ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_CPU_HPP_ -#define SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_CPU_HPP_ - -#include - -#include -#include -#include - -#include "kernel_log.hpp" -#include "sk_iostream" - -/** - * x86_64 cpu 相关定义 - * @note 寄存器读写设计见 arch/README.md - */ -namespace cpu { -/** - * @brief 从端口读数据 - * @tparam T 要读的数据类型 - * @param port 要读的端口 - * @return uint8_t 读取到的数据 - */ -template -static __always_inline auto In(const uint32_t port) -> T { - T data; - if constexpr (std::is_same_v) { - __asm__ volatile("inb %1, %0" : "=a"(data) : "dN"(port)); - } else if constexpr (std::is_same_v) { - __asm__ volatile("inw %1, %0" : "=a"(data) : "dN"(port)); - } else if constexpr (std::is_same_v) { - __asm__ volatile("inl %1, %0" : "=a"(data) : "dN"(port)); - } else { - klog::Err("No Type\n"); - throw; - } - return data; -} - -/** - * @brief 向端口写数据 - * @tparam T 要写的数据类型 - * @param port 要写的端口 - * @param data 要写的数据 - */ -template -static __always_inline void Out(const uint32_t port, const T data) { - if constexpr (std::is_same_v) { - __asm__ volatile("outb %1, %0" : : "dN"(port), "a"(data)); - } else if constexpr (std::is_same_v) { - __asm__ volatile("outw %1, %0" : : "dN"(port), "a"(data)); - } else if constexpr (std::is_same_v) { - __asm__ volatile("outl %1, %0" : : "dN"(port), "a"(data)); - } else { - klog::Err("No Type\n"); - throw; - } -} - -/// @name 端口 -static constexpr const uint32_t kCom1 = 0x3F8; -/** - * 串口定义 - */ -class Serial { - public: - explicit Serial(uint32_t port) : port_(port) { - // Disable all interrupts - Out(port_ + 1, 0x00); - // Enable DLAB (set baud rate divisor) - Out(port_ + 3, 0x80); - // Set divisor to 3 (lo byte) 38400 baud - Out(port_ + 0, 0x03); - // (hi byte) - Out(port_ + 1, 0x00); - // 8 bits, no parity, one stop bit - Out(port_ + 3, 0x03); - // Enable FIFO, clear them, with 14-byte threshold - Out(port_ + 2, 0xC7); - // IRQs enabled, RTS/DSR set - Out(port_ + 4, 0x0B); - // Set in loopback mode, test the serial chip - Out(port_ + 4, 0x1E); - // Test serial chip (send byte 0xAE and check if serial returns same byte) - Out(port_ + 0, 0xAE); - // Check if serial is faulty (i.e: not same byte as sent) - if (In(port_ + 0) != 0xAE) { - asm("hlt"); - } - - // If serial is not faulty set it in normal operation mode (not-loopback - // with IRQs enabled and OUT#1 and OUT#2 bits enabled) - Out(port_ + 4, 0x0F); - } - - ~Serial() = default; - - /// @name 不使用的构造函数 - /// @{ - Serial() = delete; - Serial(const Serial &) = delete; - Serial(Serial &&) = delete; - auto operator=(const Serial &) -> Serial & = delete; - auto operator=(Serial &&) -> Serial & = delete; - /// @} - - /** - * @brief 读一个字节 - * @return uint8_t 读取到的数据 - */ - [[nodiscard]] auto Read() const -> uint8_t { - while (!SerialReceived()) { - ; - } - return In(port_); - } - - /** - * @brief 写一个字节 - * @param byte 要写的数据 - */ - void Write(uint8_t byte) const { - while (!IsTransmitEmpty()) { - ; - } - Out(port_, byte); - } - - private: - uint32_t port_; - - /** - * @brief 串口是否接收到数据 - * @return true - * @return false - */ - [[nodiscard]] auto SerialReceived() const -> bool { - return bool(In(port_ + 5) & 1); - } - - /** - * @brief 串口是否可以发送数据 - * @return true - * @return false - */ - [[nodiscard]] auto IsTransmitEmpty() const -> bool { - return bool((In(port_ + 5) & 0x20) != 0); - } -}; -}; // namespace cpu - -#endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_CPU_HPP_ diff --git a/src/kernel/arch/x86_64/include/cpu/regs.hpp b/src/kernel/arch/x86_64/include/cpu/regs.hpp deleted file mode 100644 index e73187bc7..000000000 --- a/src/kernel/arch/x86_64/include/cpu/regs.hpp +++ /dev/null @@ -1,177 +0,0 @@ - -/** - * @file regs.hpp - * @brief x86_64 寄存器相关定义 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2024-03-05 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2024-03-05Zone.N (Zone.Niuzh@hotmail.com)创建文件 - *
- */ - -#ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_REGS_HPP_ -#define SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_REGS_HPP_ - -#include - -#include -#include -#include - -#include "kernel_log.hpp" -#include "sk_cstdio" -#include "sk_iostream" - -/** - * x86_64 cpu Control Registers 相关定义 - * @note 寄存器读写设计见 arch/README.md - */ -namespace cpu { - -// 第一部分:寄存器定义 -namespace register_info { - -struct RegInfoBase { - /// 寄存器数据类型 - using DataType = uint64_t; - /// 起始位 - static constexpr uint64_t kBitOffset = 0; - /// 位宽 - static constexpr uint64_t kBitWidth = 64; - /// 掩码,(val & kBitMask) == 对应当前位的值 - static constexpr uint64_t kBitMask = - (kBitWidth < 64) ? ((1ULL << kBitWidth) - 1) << kBitOffset : ~0ULL; - /// 对应位置位掩码 - static constexpr uint64_t kAllSetMask = - (kBitWidth < 64) ? ((1ULL << kBitWidth) - 1) : ~0ULL; -}; - -/// 通用寄存器 -struct RbpInfo : public RegInfoBase {}; - -}; // namespace register_info - -// 第二部分:读/写模版实现 -namespace read_write { -/** - * 只读接口 - * @tparam 寄存器类型 - */ -template -class ReadOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - ReadOnlyRegBase() = default; - ReadOnlyRegBase(const ReadOnlyRegBase &) = delete; - ReadOnlyRegBase(ReadOnlyRegBase &&) = delete; - auto operator=(const ReadOnlyRegBase &) -> ReadOnlyRegBase & = delete; - auto operator=(ReadOnlyRegBase &&) -> ReadOnlyRegBase & = delete; - ~ReadOnlyRegBase() = default; - /// @} - - /** - * 读寄存器 - * @return RegInfo::DataType 寄存器的值 - */ - static __always_inline auto Read() -> typename RegInfo::DataType { - typename RegInfo::DataType value{}; - if constexpr (std::is_same_v) { - __asm__ volatile("mov %%rbp, %0" : "=r"(value) : :); - } else { - klog::Err("No Type\n"); - throw; - } - return value; - } - - /** - * () 重载 - */ - __always_inline auto operator()() -> typename RegInfo::DataType { - return Read(); - } -}; - -/** - * 只写接口 - * @tparam 寄存器类型 - */ -template -class WriteOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - WriteOnlyRegBase() = default; - WriteOnlyRegBase(const WriteOnlyRegBase &) = delete; - WriteOnlyRegBase(WriteOnlyRegBase &&) = delete; - auto operator=(const WriteOnlyRegBase &) -> WriteOnlyRegBase & = delete; - auto operator=(WriteOnlyRegBase &&) -> WriteOnlyRegBase & = delete; - ~WriteOnlyRegBase() = default; - /// @} - - /** - * 写寄存器 - * @param value 要写的值 - */ - static __always_inline void Write(typename RegInfo::DataType value) { - if constexpr (std::is_same_v) { - __asm__ volatile("mv fp, %0" : : "r"(value) :); - } else { - klog::Err("No Type\n"); - throw; - } - } -}; - -/** - * 读写接口 - * @tparam 寄存器类型 - */ -template -class ReadWriteRegBase : public ReadOnlyRegBase, - public WriteOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - ReadWriteRegBase() = default; - ReadWriteRegBase(const ReadWriteRegBase &) = delete; - ReadWriteRegBase(ReadWriteRegBase &&) = delete; - auto operator=(const ReadWriteRegBase &) -> ReadWriteRegBase & = delete; - auto operator=(ReadWriteRegBase &&) -> ReadWriteRegBase & = delete; - ~ReadWriteRegBase() = default; - /// @} -}; - -}; // namespace read_write - -namespace regs { - -// 第三部分:寄存器实例 -class Rbp : public read_write::ReadWriteRegBase { - public: - friend auto operator<<(sk_std::ostream &ostream, - [[maybe_unused]] const Rbp &rbp) -> sk_std::ostream & { - klog::Info("val: 0x%p", regs::Rbp::Read()); - return ostream; - } -}; - -/// 通用寄存器 -struct AllXreg { - Rbp rbp; -}; - -}; // namespace regs - -// 第四部分:访问接口 -[[maybe_unused]] static regs::AllXreg kAllXreg; - -}; // namespace cpu - -#endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_X86_64_INCLUDE_CPU_REGS_HPP_ diff --git a/test/system_test/cxx_init_test/main.cpp b/test/system_test/cxx_init_test/main.cpp index e9c0f2eeb..8ea9a67dd 100644 --- a/test/system_test/cxx_init_test/main.cpp +++ b/test/system_test/cxx_init_test/main.cpp @@ -14,10 +14,11 @@ * */ +#include + #include #include "basic_info.hpp" -#include "cpu/cpu.hpp" #include "sk_cstdio" #include "sk_cstring" #include "sk_libcxx.h" @@ -40,7 +41,7 @@ extern "C" void _putchar(char character) { template class TestStaticConstructDestruct { public: - TestStaticConstructDestruct(unsigned int &v) : _v(v) { _v |= V; } + explicit TestStaticConstructDestruct(unsigned int &v) : _v(v) { _v |= V; } ~TestStaticConstructDestruct() { _v &= ~V; } private: @@ -48,8 +49,8 @@ class TestStaticConstructDestruct { }; static int global_value_with_init = 42; -static uint32_t global_u32_value_with_init{0xa1a2a3a4ul}; -static uint64_t global_u64_value_with_init{0xb1b2b3b4b5b6b7b8ull}; +static uint32_t global_u32_value_with_init{0xa1a2a3a4UL}; +static uint64_t global_u64_value_with_init{0xb1b2b3b4b5b6b7b8ULL}; static float global_f32_value_with_init{3.14}; static double global_f64_value_with_init{1.44}; static uint16_t global_u16_value_with_init{0x1234}; @@ -84,7 +85,7 @@ class InsClass : public AbsClass { void Func() override { val = 'C'; } }; -uint32_t main(uint32_t, uint8_t *) { +auto main(uint32_t, uint8_t *) -> uint32_t { #ifdef __aarch64__ cpu::SetupFpu(); #endif @@ -111,8 +112,8 @@ uint32_t main(uint32_t, uint8_t *) { inst_class_static.Func(); printf("%c\n", inst_class_static.val); - printf("%d\n", kBasicInfo.GetInstance().elf_addr); - printf("%d\n", kBasicInfo.GetInstance().elf_size); + printf("%d\n", Singleton::GetInstance().elf_addr); + printf("%d\n", Singleton::GetInstance().elf_size); printf("Hello Test\n"); @@ -127,7 +128,7 @@ extern "C" void _start(uint32_t argc, uint8_t *argv) { CppDeInit(); // 进入死循环 - while (1) { + while (true) { ; } } diff --git a/test/system_test/gnu_efi_test/main.cpp b/test/system_test/gnu_efi_test/main.cpp index 12008af63..c55fcd192 100644 --- a/test/system_test/gnu_efi_test/main.cpp +++ b/test/system_test/gnu_efi_test/main.cpp @@ -14,10 +14,11 @@ * */ +#include + #include #include "basic_info.hpp" -#include "cpu/cpu.hpp" #include "sk_cstdio" #include "sk_cstring" @@ -29,19 +30,19 @@ extern "C" void _putchar(char character) { // 引用链接脚本中的变量 /// @see http://wiki.osdev.org/Using_Linker_Script_Values /// 内核开始 -extern "C" void *__executable_start[]; +extern "C" void *_executable_start[]; /// 内核结束 extern "C" void *end[]; -BasicInfo::BasicInfo(uint32_t argc, uint8_t *argv) { +BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { (void)argc; - auto basic_info = *reinterpret_cast(argv); + auto basic_info = *reinterpret_cast(argv); physical_memory_addr = basic_info.physical_memory_addr; physical_memory_size = basic_info.physical_memory_size; - kernel_addr = reinterpret_cast(__executable_start); + kernel_addr = reinterpret_cast(_executable_start); kernel_size = reinterpret_cast(end) - - reinterpret_cast(__executable_start); + reinterpret_cast(_executable_start); elf_addr = basic_info.elf_addr; elf_size = basic_info.elf_size; @@ -49,14 +50,14 @@ BasicInfo::BasicInfo(uint32_t argc, uint8_t *argv) { fdt_addr = 0; } -uint32_t main(uint32_t argc, uint8_t *argv) { +auto main(uint32_t argc, uint8_t *argv) -> uint32_t { if (argc != 1) { printf("argc != 1 [%d]\n", argc); return -1; } - kBasicInfo.GetInstance() = BasicInfo(argc, argv); - sk_std::cout << kBasicInfo.GetInstance(); + Singleton::GetInstance() = BasicInfo(argc, argv); + sk_std::cout << Singleton::GetInstance(); printf("Hello Test\n"); @@ -67,7 +68,7 @@ extern "C" void _start(uint32_t argc, uint8_t *argv) { main(argc, argv); // 进入死循环 - while (1) { + while (true) { ; } } diff --git a/test/unit_test/x86_64_cpu_test.cpp b/test/unit_test/x86_64_cpu_test.cpp index 2abfd7cfa..c964c6a3f 100644 --- a/test/unit_test/x86_64_cpu_test.cpp +++ b/test/unit_test/x86_64_cpu_test.cpp @@ -14,11 +14,9 @@ * */ +#include #include -#include "x86_64/include/cpu/cpu.hpp" -#include "x86_64/include/cpu/regs.hpp" - TEST(x8664RegInfoBaseTest, ValueTest) { EXPECT_EQ(cpu::register_info::RegInfoBase::kBitOffset, 0); EXPECT_EQ(cpu::register_info::RegInfoBase::kBitWidth, 64); From 4cad11f87aea18649e58daa09bd7eff522b5da7c Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:12:24 +0800 Subject: [PATCH 056/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- cmake/compile_config.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index a46f5bef4..5f2405f32 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -199,6 +199,7 @@ TARGET_LINK_LIBRARIES ( kernel_link_options printf_bare_metal dtc-lib + cpu_io $<$: opensbi_interface > From 89b13d999a20f487c852ba1e035605ba81dcef16 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:12:30 +0800 Subject: [PATCH 057/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- test/unit_test/CMakeLists.txt | 57 +++++++++++++---------------------- 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/test/unit_test/CMakeLists.txt b/test/unit_test/CMakeLists.txt index b447ccef7..e42bbbd6c 100644 --- a/test/unit_test/CMakeLists.txt +++ b/test/unit_test/CMakeLists.txt @@ -1,42 +1,27 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. # 设置项目名与版本 -project( - unit-test - VERSION 0.0.1 -) - -enable_language(CXX) - -add_executable(${PROJECT_NAME} - riscv64_cpu_test.cpp - x86_64_cpu_test.cpp - aarch64_cpu_test.cpp - kernel_elf_test.cpp - kernel_fdt_test.cpp -) - -target_include_directories(${PROJECT_NAME} PRIVATE - ./ - ${CMAKE_SOURCE_DIR}/src/kernel/include - ${CMAKE_SOURCE_DIR}/src/kernel/arch -) - -target_compile_options(${PROJECT_NAME} PRIVATE - ${DEFAULT_TEST_COMPILE_OPTIONS} -) - -target_link_options(${PROJECT_NAME} PRIVATE - ${DEFAULT_TEST_LINK_OPTIONS} -) - -target_link_libraries(${PROJECT_NAME} PRIVATE - ${DEFAULT_TEST_LINK_LIB} - dtc-lib -) - -gtest_discover_tests(${PROJECT_NAME}) +PROJECT (unit-test VERSION 0.0.1) + +ENABLE_LANGUAGE (CXX) + +ADD_EXECUTABLE ( + ${PROJECT_NAME} + riscv64_cpu_test.cpp x86_64_cpu_test.cpp aarch64_cpu_test.cpp + kernel_elf_test.cpp kernel_fdt_test.cpp) + +TARGET_INCLUDE_DIRECTORIES ( + ${PROJECT_NAME} PRIVATE ./ ${CMAKE_SOURCE_DIR}/src/kernel/include + ${CMAKE_SOURCE_DIR}/src/kernel/arch) + +TARGET_COMPILE_OPTIONS (${PROJECT_NAME} PRIVATE ${DEFAULT_TEST_COMPILE_OPTIONS}) + +TARGET_LINK_OPTIONS (${PROJECT_NAME} PRIVATE ${DEFAULT_TEST_LINK_OPTIONS}) + +TARGET_LINK_LIBRARIES (${PROJECT_NAME} PRIVATE ${DEFAULT_TEST_LINK_LIB} dtc-lib + cpu_io) + +GTEST_DISCOVER_TESTS (${PROJECT_NAME}) From 03579dc68b352decbc0e5df869ecdd7b3ae93cd6 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:13:56 +0800 Subject: [PATCH 058/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- 3rd/cpu_io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rd/cpu_io b/3rd/cpu_io index 8c831d772..253d1fbcc 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 8c831d77235ba9dd19de83e91618f67473473893 +Subproject commit 253d1fbcc2fef25bffbd2286b716311022149921 From c3574e93925e89db0dabb7a012743c62a109ec20 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:15:23 +0800 Subject: [PATCH 059/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- cmake/3rd.cmake | 385 ++++++++++++++++++---------------------- 2 files changed, 170 insertions(+), 217 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cb068a736..8bd90ff27 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 2a1a5c099..cb0cc7a25 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -1,4 +1,3 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # @@ -53,258 +52,212 @@ # endif() # Pre-commit hooks -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit) - EXECUTE_PROCESS(COMMAND pre-commit install) -endif () +IF(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit) + EXECUTE_PROCESS (COMMAND pre-commit install) +ENDIF() # https://github.com/google/googletest.git -if (NOT TARGET gtest) - add_subdirectory(3rd/googletest) - include(GoogleTest) -endif () +IF(NOT TARGET gtest) + ADD_SUBDIRECTORY (3rd/googletest) + INCLUDE (GoogleTest) +ENDIF() # https://git.savannah.gnu.org/git/grub.git -set(grub2_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/grub2) -add_library(grub2 INTERFACE) -target_include_directories(grub2 INTERFACE - ${grub2_SOURCE_DIR}/include -) +SET (grub2_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/grub2) +ADD_LIBRARY (grub2 INTERFACE) +TARGET_INCLUDE_DIRECTORIES (grub2 INTERFACE ${grub2_SOURCE_DIR}/include) # https://github.com/gdbinit/Gdbinit.git -set(gdbinit_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/gdbinit) -set(gdbinit_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/gdbinit) -add_custom_target(gdbinit - COMMENT "Generate gdbinit ..." - WORKING_DIRECTORY ${gdbinit_SOURCE_DIR} - # 复制到根目录下并重命名 - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${gdbinit_SOURCE_DIR}/gdbinit +SET (gdbinit_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/gdbinit) +SET (gdbinit_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/gdbinit) +ADD_CUSTOM_TARGET ( + gdbinit + COMMENT "Generate gdbinit ..." + WORKING_DIRECTORY ${gdbinit_SOURCE_DIR} + # 复制到根目录下并重命名 + COMMAND ${CMAKE_COMMAND} -E copy ${gdbinit_SOURCE_DIR}/gdbinit + ${CMAKE_SOURCE_DIR}/.gdbinit + COMMAND echo "target remote ${QEMU_GDB_PORT}" >> + ${CMAKE_SOURCE_DIR}/.gdbinit + COMMAND + echo "add-symbol-file ${kernel_BINARY_DIR}/${KERNEL_ELF_OUTPUT_NAME}" >> ${CMAKE_SOURCE_DIR}/.gdbinit - COMMAND - echo "target remote ${QEMU_GDB_PORT}" >> ${CMAKE_SOURCE_DIR}/.gdbinit - COMMAND - echo "add-symbol-file ${kernel_BINARY_DIR}/${KERNEL_ELF_OUTPUT_NAME}" >> ${CMAKE_SOURCE_DIR}/.gdbinit - COMMAND - echo "add-symbol-file ${boot_BINARY_DIR}/${BOOT_ELF_OUTPUT_NAME}" >> ${CMAKE_SOURCE_DIR}/.gdbinit -) + COMMAND echo "add-symbol-file ${boot_BINARY_DIR}/${BOOT_ELF_OUTPUT_NAME}" + >> ${CMAKE_SOURCE_DIR}/.gdbinit) # 在 make clean 时删除 .gdbinit -set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - ${CMAKE_SOURCE_DIR}/.gdbinit -) +SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${CMAKE_SOURCE_DIR}/.gdbinit) # https://github.com/MRNIU/printf_bare_metal.git -add_subdirectory(3rd/printf_bare_metal) +ADD_SUBDIRECTORY (3rd/printf_bare_metal) + +# https://github.com/MRNIU/cpu_io.git +ADD_SUBDIRECTORY (3rd/cpu_io) -if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") +IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") # https://github.com/riscv-software-src/opensbi.git # 编译 opensbi - set(opensbi_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/opensbi) - set(opensbi_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/opensbi) - add_custom_target(opensbi - COMMENT "build opensbi..." - # make 时编译 - ALL - WORKING_DIRECTORY ${opensbi_SOURCE_DIR} - COMMAND - ${CMAKE_COMMAND} - -E - make_directory - ${opensbi_BINARY_DIR} - COMMAND - make - CROSS_COMPILE=${TOOLCHAIN_PREFIX} - FW_JUMP=y - FW_JUMP_ADDR=0x80210000 - PLATFORM_RISCV_XLEN=64 - PLATFORM=generic + SET (opensbi_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/opensbi) + SET (opensbi_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/opensbi) + ADD_CUSTOM_TARGET ( + opensbi + COMMENT "build opensbi..." + # make 时编译 + ALL + WORKING_DIRECTORY ${opensbi_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${opensbi_BINARY_DIR} + COMMAND + make CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_JUMP=y + FW_JUMP_ADDR=0x80210000 PLATFORM_RISCV_XLEN=64 PLATFORM=generic O=${opensbi_BINARY_DIR} - COMMAND - ${CMAKE_COMMAND} - -E - copy_directory - ${opensbi_SOURCE_DIR}/include - ${opensbi_BINARY_DIR}/include - ) - add_library(opensbi-fw_jump INTERFACE) - add_dependencies(opensbi-fw_jump opensbi) - target_include_directories(opensbi-fw_jump INTERFACE - ${dtc_BINARY_DIR}/libfdt - ) - target_link_libraries(opensbi-fw_jump INTERFACE - ${dtc_BINARY_DIR}/libfdt/libfdt.a - ) + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}/include) + ADD_LIBRARY (opensbi-fw_jump INTERFACE) + ADD_DEPENDENCIES (opensbi-fw_jump opensbi) + TARGET_INCLUDE_DIRECTORIES (opensbi-fw_jump + INTERFACE ${dtc_BINARY_DIR}/libfdt) + TARGET_LINK_LIBRARIES (opensbi-fw_jump + INTERFACE ${dtc_BINARY_DIR}/libfdt/libfdt.a) # https://github.com/MRNIU/opensbi_interface.git - add_subdirectory(3rd/opensbi_interface) -endif () + ADD_SUBDIRECTORY (3rd/opensbi_interface) +ENDIF() # https://git.kernel.org/pub/scm/utils/dtc/dtc.git -set(dtc_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/dtc) -set(dtc_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/dtc) -set(dtc_CC ${CMAKE_C_COMPILER}) -set(dtc_AR ${CMAKE_AR}) +SET (dtc_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/dtc) +SET (dtc_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/dtc) +SET (dtc_CC ${CMAKE_C_COMPILER}) +SET (dtc_AR ${CMAKE_AR}) # 编译 libfdt -add_custom_target(dtc - COMMENT "build libdtc..." - # make 时编译 - ALL - WORKING_DIRECTORY ${dtc_SOURCE_DIR} - COMMAND - ${CMAKE_COMMAND} - -E - make_directory - ${dtc_BINARY_DIR}/libfdt - COMMAND - CC=${dtc_CC} - AR=${dtc_AR} - HOME=${dtc_BINARY_DIR} - make libfdt/libfdt.a - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${dtc_SOURCE_DIR}/libfdt/*.a - ${dtc_SOURCE_DIR}/libfdt/*.h - ${dtc_BINARY_DIR}/libfdt - COMMAND - make clean -) -add_library(dtc-lib INTERFACE) -add_dependencies(dtc-lib dtc) -target_include_directories(dtc-lib INTERFACE - ${dtc_BINARY_DIR}/libfdt -) -target_link_libraries(dtc-lib INTERFACE - ${dtc_BINARY_DIR}/libfdt/libfdt.a -) +ADD_CUSTOM_TARGET ( + dtc + COMMENT "build libdtc..." + # make 时编译 + ALL + WORKING_DIRECTORY ${dtc_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dtc_BINARY_DIR}/libfdt + COMMAND CC=${dtc_CC} AR=${dtc_AR} HOME=${dtc_BINARY_DIR} make + libfdt/libfdt.a + COMMAND ${CMAKE_COMMAND} -E copy ${dtc_SOURCE_DIR}/libfdt/*.a + ${dtc_SOURCE_DIR}/libfdt/*.h ${dtc_BINARY_DIR}/libfdt + COMMAND make clean) +ADD_LIBRARY (dtc-lib INTERFACE) +ADD_DEPENDENCIES (dtc-lib dtc) +TARGET_INCLUDE_DIRECTORIES (dtc-lib INTERFACE ${dtc_BINARY_DIR}/libfdt) +TARGET_LINK_LIBRARIES (dtc-lib INTERFACE ${dtc_BINARY_DIR}/libfdt/libfdt.a) # https://github.com/ncroxon/gnu-efi.git -set(gnu-efi_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/gnu-efi) -set(gnu-efi_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/gnu-efi) -if (CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) -set(CC_ ${CMAKE_C_COMPILER}) -set(AR_ ${CMAKE_AR}) -elseif (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") -set(CROSS_COMPILE_ x86_64-linux-gnu-) -elseif (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64") -set(CROSS_COMPILE_ riscv64-linux-gnu-) -endif () +SET (gnu-efi_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/gnu-efi) +SET (gnu-efi_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/gnu-efi) +IF(CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) + SET (CC_ ${CMAKE_C_COMPILER}) + SET (AR_ ${CMAKE_AR}) +ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR + MATCHES "x86_64") + SET (CROSS_COMPILE_ x86_64-linux-gnu-) +ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR + MATCHES "riscv64") + SET (CROSS_COMPILE_ riscv64-linux-gnu-) +ENDIF() # 编译 gnu-efi -add_custom_target(gnu-efi - COMMENT "build gnu-efi..." - # make 时编译 - ALL - WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR} - COMMAND - ${CMAKE_COMMAND} - -E - make_directory - ${gnu-efi_BINARY_DIR} - COMMAND - # @note 仅支持 gcc - make lib gnuefi inc - CROSS_COMPILE=${CROSS_COMPILE_} - ARCH=${CMAKE_SYSTEM_PROCESSOR} - OBJDIR=${gnu-efi_BINARY_DIR} - V=1 - COMMAND - ${CMAKE_COMMAND} - -E - copy_directory - ${gnu-efi_SOURCE_DIR}/inc - ${gnu-efi_BINARY_DIR}/inc -) -add_library(gnu-efi-lib INTERFACE) -add_dependencies(gnu-efi-lib gnu-efi) -target_include_directories(gnu-efi-lib INTERFACE - ${gnu-efi_BINARY_DIR}/inc - ${gnu-efi_BINARY_DIR}/inc/${CMAKE_SYSTEM_PROCESSOR} - ${gnu-efi_BINARY_DIR}/inc/protocol -) -target_link_libraries(gnu-efi-lib INTERFACE - ${gnu-efi_BINARY_DIR}/gnuefi/reloc_${CMAKE_SYSTEM_PROCESSOR}.o - ${gnu-efi_BINARY_DIR}/gnuefi/crt0-efi-${CMAKE_SYSTEM_PROCESSOR}.o - ${gnu-efi_BINARY_DIR}/gnuefi/libgnuefi.a - ${gnu-efi_BINARY_DIR}/lib/libefi.a -) +ADD_CUSTOM_TARGET ( + gnu-efi + COMMENT "build gnu-efi..." + # make 时编译 + ALL + WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${gnu-efi_BINARY_DIR} + COMMAND # @note 仅支持 gcc + make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_} + ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1 + COMMAND ${CMAKE_COMMAND} -E copy_directory ${gnu-efi_SOURCE_DIR}/inc + ${gnu-efi_BINARY_DIR}/inc) +ADD_LIBRARY (gnu-efi-lib INTERFACE) +ADD_DEPENDENCIES (gnu-efi-lib gnu-efi) +TARGET_INCLUDE_DIRECTORIES ( + gnu-efi-lib + INTERFACE ${gnu-efi_BINARY_DIR}/inc + ${gnu-efi_BINARY_DIR}/inc/${CMAKE_SYSTEM_PROCESSOR} + ${gnu-efi_BINARY_DIR}/inc/protocol) +TARGET_LINK_LIBRARIES ( + gnu-efi-lib + INTERFACE ${gnu-efi_BINARY_DIR}/gnuefi/reloc_${CMAKE_SYSTEM_PROCESSOR}.o + ${gnu-efi_BINARY_DIR}/gnuefi/crt0-efi-${CMAKE_SYSTEM_PROCESSOR}.o + ${gnu-efi_BINARY_DIR}/gnuefi/libgnuefi.a + ${gnu-efi_BINARY_DIR}/lib/libefi.a) # ovmf # @todo 使用互联网连接或从 edk2 编译 # https://efi.akeo.ie/QEMU_EFI/QEMU_EFI-AA64.zip -set(ovmf_SOURCE_DIR ${CMAKE_SOURCE_DIR}/tools/ovmf) -set(ovmf_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/ovmf) -add_custom_target(ovmf - COMMENT "build ovmf ..." - # make 时编译 - ALL - WORKING_DIRECTORY ${ovmf_SOURCE_DIR} - COMMAND - ${CMAKE_COMMAND} - -E - make_directory - ${ovmf_BINARY_DIR} - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${ovmf_SOURCE_DIR}/* - ${ovmf_BINARY_DIR} -) +SET (ovmf_SOURCE_DIR ${CMAKE_SOURCE_DIR}/tools/ovmf) +SET (ovmf_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/ovmf) +ADD_CUSTOM_TARGET ( + ovmf + COMMENT "build ovmf ..." + # make 时编译 + ALL + WORKING_DIRECTORY ${ovmf_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ovmf_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${ovmf_SOURCE_DIR}/* ${ovmf_BINARY_DIR}) # gdb -find_program(GDB_EXE gdb) -if (NOT GDB_EXE) - message(FATAL_ERROR "gdb not found.\n" - "Following https://www.sourceware.org/gdb/ to install.") -endif () +FIND_PROGRAM (GDB_EXE gdb) +IF(NOT GDB_EXE) + MESSAGE ( + FATAL_ERROR "gdb not found.\n" + "Following https://www.sourceware.org/gdb/ to install.") +ENDIF() # qemu -find_program(QEMU_EXE qemu-system-${CMAKE_SYSTEM_PROCESSOR}) -if (NOT QEMU_EXE) - message(FATAL_ERROR "qemu-system-${CMAKE_SYSTEM_PROCESSOR} not found.\n" - "Following https://www.qemu.org/ to install.") -endif () +FIND_PROGRAM (QEMU_EXE qemu-system-${CMAKE_SYSTEM_PROCESSOR}) +IF(NOT QEMU_EXE) + MESSAGE (FATAL_ERROR "qemu-system-${CMAKE_SYSTEM_PROCESSOR} not found.\n" + "Following https://www.qemu.org/ to install.") +ENDIF() # doxygen -find_package(Doxygen - REQUIRED dot) -if (NOT DOXYGEN_FOUND) - message(FATAL_ERROR "Doxygen not found.\n" - "Following https://www.doxygen.nl/index.html to install.") -endif () +FIND_PACKAGE (Doxygen REQUIRED dot) +IF(NOT DOXYGEN_FOUND) + MESSAGE ( + FATAL_ERROR "Doxygen not found.\n" + "Following https://www.doxygen.nl/index.html to install.") +ENDIF() # cppcheck -find_program(CPPCHECK_EXE NAMES cppcheck) -if (NOT CPPCHECK_EXE) - message(FATAL_ERROR "cppcheck not found.\n" - "Following https://cppcheck.sourceforge.io to install.") -endif () -add_custom_target(cppcheck - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Run cppcheck on ${CMAKE_BINARY_DIR}/compile_commands.json ..." - COMMAND - ${CPPCHECK_EXE} - --enable=all +FIND_PROGRAM (CPPCHECK_EXE NAMES cppcheck) +IF(NOT CPPCHECK_EXE) + MESSAGE ( + FATAL_ERROR "cppcheck not found.\n" + "Following https://cppcheck.sourceforge.io to install.") +ENDIF() +ADD_CUSTOM_TARGET ( + cppcheck + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Run cppcheck on ${CMAKE_BINARY_DIR}/compile_commands.json ..." + COMMAND + ${CPPCHECK_EXE} --enable=all --project=${CMAKE_BINARY_DIR}/compile_commands.json --suppress-xml=${CMAKE_SOURCE_DIR}/tools/cppcheck-suppressions.xml - --output-file=${CMAKE_BINARY_DIR}/cppcheck_report.log -) + --output-file=${CMAKE_BINARY_DIR}/cppcheck_report.log) -if (CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) +IF(CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR) # genhtml 生成测试覆盖率报告网页 - find_program(GENHTML_EXE genhtml) - if (NOT GENHTML_EXE) - message(FATAL_ERROR "genhtml not found.\n" - "Following https://github.com/linux-test-project/lcov to install.") - endif () + FIND_PROGRAM (GENHTML_EXE genhtml) + IF(NOT GENHTML_EXE) + MESSAGE ( + FATAL_ERROR + "genhtml not found.\n" + "Following https://github.com/linux-test-project/lcov to install." + ) + ENDIF() # lcov 生成测试覆盖率报告 - find_program(LCOV_EXE lcov) - if (NOT LCOV_EXE) - message(FATAL_ERROR "lcov not found.\n" - "Following https://github.com/linux-test-project/lcov to install.") - endif () -endif () + FIND_PROGRAM (LCOV_EXE lcov) + IF(NOT LCOV_EXE) + MESSAGE ( + FATAL_ERROR + "lcov not found.\n" + "Following https://github.com/linux-test-project/lcov to install." + ) + ENDIF() +ENDIF() From 4118e2bf9cf2f1cbdedaac82f08c90d6de10679f Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:19:35 +0800 Subject: [PATCH 060/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- 3rd/cpu_io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rd/cpu_io b/3rd/cpu_io index 253d1fbcc..fb9989b0b 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 253d1fbcc2fef25bffbd2286b716311022149921 +Subproject commit fb9989b0be3db8fff772230f0ea271305ee5b1c5 From 0ba11598c0266b3e4217993e30320313aa4ff2fc Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:20:40 +0800 Subject: [PATCH 061/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 16 ++++++++-------- test/system_test/gnu_efi_test/main.cpp | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8bd90ff27..6f7d94302 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/test/system_test/gnu_efi_test/main.cpp b/test/system_test/gnu_efi_test/main.cpp index c55fcd192..6e1c4964b 100644 --- a/test/system_test/gnu_efi_test/main.cpp +++ b/test/system_test/gnu_efi_test/main.cpp @@ -30,7 +30,7 @@ extern "C" void _putchar(char character) { // 引用链接脚本中的变量 /// @see http://wiki.osdev.org/Using_Linker_Script_Values /// 内核开始 -extern "C" void *_executable_start[]; +extern "C" void *__executable_start[]; // NOLINT /// 内核结束 extern "C" void *end[]; BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { @@ -40,9 +40,9 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { physical_memory_addr = basic_info.physical_memory_addr; physical_memory_size = basic_info.physical_memory_size; - kernel_addr = reinterpret_cast(_executable_start); + kernel_addr = reinterpret_cast(__executable_start); kernel_size = reinterpret_cast(end) - - reinterpret_cast(_executable_start); + reinterpret_cast(__executable_start); elf_addr = basic_info.elf_addr; elf_size = basic_info.elf_size; From a511eb0888daad302132a0500e8e80d42a06de88 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:30:03 +0800 Subject: [PATCH 062/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 20 ++++++++++---------- cmake/3rd.cmake | 3 +++ src/kernel/arch/riscv64/arch_main.cpp | 21 ++++++++++++--------- src/kernel/arch/riscv64/backtrace.cpp | 14 +++++++------- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6f7d94302..ac784c1c0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index cb0cc7a25..2738d8a70 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -158,6 +158,9 @@ ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64") SET (CROSS_COMPILE_ riscv64-linux-gnu-) +ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64" AND CMAKE_SYSTEM_PROCESSOR + MATCHES "riscv64") + SET (CROSS_COMPILE_ riscv64-linux-gnu-) ENDIF() # 编译 gnu-efi ADD_CUSTOM_TARGET ( diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 57f692e02..8f15e66f2 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -31,14 +31,15 @@ extern "C" void _putchar(char character) { // 引用链接脚本中的变量 /// @see http://wiki.osdev.org/Using_Linker_Script_Values /// 内核开始 -extern "C" void *__executable_start[]; +extern "C" void *__executable_start[]; // NOLINT /// 内核结束 extern "C" void *end[]; -BasicInfo::BasicInfo(uint32_t argc, uint8_t *argv) { +BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { (void)argc; (void)argv; - auto [memory_base, memory_size] = kKernelFdt.GetInstance().GetMemory(); + auto [memory_base, memory_size] = + Singleton::GetInstance().GetMemory(); physical_memory_addr = memory_base; physical_memory_size = memory_size; @@ -51,16 +52,18 @@ BasicInfo::BasicInfo(uint32_t argc, uint8_t *argv) { fdt_addr = reinterpret_cast(argv); } -uint32_t ArchInit(uint32_t argc, uint8_t *argv) { +auto ArchInit(uint32_t argc, uint8_t *argv) -> uint32_t { printf("boot hart id: %d\n", argc); printf("dtb info addr: %p\n", argv); - kKernelFdt.GetInstance() = KernelFdt((uint64_t)argv); + Singleton::GetInstance() = + KernelFdt(reinterpret_cast(argv)); - kBasicInfo.GetInstance() = BasicInfo(argc, argv); - sk_std::cout << kBasicInfo.GetInstance(); + Singleton::GetInstance() = BasicInfo(argc, argv); + sk_std::cout << Singleton::GetInstance(); - auto [serial_base, serial_size] = kKernelFdt.GetInstance().GetSerial(); + auto [serial_base, serial_size] = + Singleton::GetInstance().GetSerial(); auto uart = Ns16550a(serial_base); uart.PutChar('H'); uart.PutChar('e'); @@ -76,7 +79,7 @@ uint32_t ArchInit(uint32_t argc, uint8_t *argv) { uart.PutChar('\n'); // 解析内核 elf 信息 - kKernelElf.GetInstance() = KernelElf(); + Singleton::GetInstance() = KernelElf(); klog::Info("Hello riscv64 ArchInit\n"); diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 9aac9952a..99263f962 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -21,24 +21,24 @@ #include "sk_cstdio" #include "sk_libc.h" -int backtrace(void **buffer, int size) { - uint64_t *fp = (uint64_t *)cpu::kAllXreg.fp.Read(); +auto backtrace(void **buffer, int size) -> int { + auto *fp = reinterpret_cast(cpu::regs::Fp::Read()); uint64_t *ra = nullptr; int count = 0; - while (fp && *fp && count < size) { + while ((fp != nullptr) && (*fp != 0U) && count < size) { ra = fp - 1; - fp = (uint64_t *)*(fp - 2); - buffer[count++] = (void *)*ra; + fp = reinterpret_cast(*(fp - 2)); + buffer[count++] = reinterpret_cast(*ra); } return count; } void DumpStack() { - void *buffer[kMaxFramesCount]; + std::array buffer; // 获取调用栈中的地址 - auto num_frames = backtrace(buffer, kMaxFramesCount); + auto num_frames = backtrace(buffer.data(), kMaxFrameCount); // 打印地址 /// @todo 打印函数名,需要 elf 支持 From c69aa21b5bc77296a6d0d86e2615946c7a13d712 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:30:40 +0800 Subject: [PATCH 063/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- src/kernel/arch/riscv64/backtrace.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ac784c1c0..1b1c959d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 99263f962..9043d056c 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -35,7 +35,7 @@ auto backtrace(void **buffer, int size) -> int { } void DumpStack() { - std::array buffer; + std::array buffer{}; // 获取调用栈中的地址 auto num_frames = backtrace(buffer.data(), kMaxFrameCount); From 78840e09dbce458816335657994877f42721e7ae Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:32:29 +0800 Subject: [PATCH 064/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 20 ++++++++++---------- cmake/3rd.cmake | 3 +++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1b1c959d4..aabcde52f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 2738d8a70..c2de08524 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -161,6 +161,9 @@ ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_SYSTEM_PROCESSOR ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64" AND CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64") SET (CROSS_COMPILE_ riscv64-linux-gnu-) +ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64" AND CMAKE_SYSTEM_PROCESSOR + MATCHES "aarch64") + SET (CROSS_COMPILE_ aarch64-linux-gnu-) ENDIF() # 编译 gnu-efi ADD_CUSTOM_TARGET ( From 0d55c77890d5be06414ff21122f2b27c15ba16f3 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:32:34 +0800 Subject: [PATCH 065/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index aabcde52f..79646ad7f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint From 2111a0e74904ade553bfb2c8db59be6b37cad767 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:37:32 +0800 Subject: [PATCH 066/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 28 +-- src/kernel/arch/aarch64/arch_main.cpp | 7 +- src/kernel/arch/aarch64/backtrace.cpp | 19 +- src/kernel/arch/aarch64/include/cpu/cpu.hpp | 48 ----- src/kernel/arch/aarch64/include/cpu/regs.hpp | 175 ------------------- src/kernel/arch/arch.h | 2 +- src/kernel/arch/riscv64/arch_main.cpp | 2 +- src/kernel/arch/riscv64/backtrace.cpp | 5 +- src/kernel/arch/riscv64/include/cpu/cpu.hpp | 30 ---- src/kernel/arch/riscv64/include/cpu/regs.hpp | 175 ------------------- 10 files changed, 35 insertions(+), 456 deletions(-) delete mode 100644 src/kernel/arch/aarch64/include/cpu/cpu.hpp delete mode 100644 src/kernel/arch/aarch64/include/cpu/regs.hpp delete mode 100644 src/kernel/arch/riscv64/include/cpu/cpu.hpp delete mode 100644 src/kernel/arch/riscv64/include/cpu/regs.hpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 79646ad7f..95e063afc 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=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/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 b16596284..12a7e0d12 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -14,17 +14,18 @@ * */ +#include + #include "arch.h" -#include "cpu/cpu.hpp" #include "sk_cstdio" // printf_bare_metal 基本输出实现 extern "C" void _putchar(char character) { - static uint8_t* kUartAddr = (uint8_t*)0x09000000; + static auto* kUartAddr = (uint8_t*)0x09000000; *kUartAddr = character; } -uint32_t ArchInit(uint32_t argc, uint8_t* argv) { +auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { (void)argc; (void)argv; diff --git a/src/kernel/arch/aarch64/backtrace.cpp b/src/kernel/arch/aarch64/backtrace.cpp index d061cb8d8..640905135 100644 --- a/src/kernel/arch/aarch64/backtrace.cpp +++ b/src/kernel/arch/aarch64/backtrace.cpp @@ -13,30 +13,33 @@ * */ +#include + +#include + #include "arch.h" -#include "cpu/cpu.hpp" #include "kernel_elf.hpp" #include "sk_cstdio" #include "sk_libc.h" -int backtrace(void **buffer, int size) { - uint64_t *x29 = (uint64_t *)cpu::kAllXreg.x29.Read(); +auto backtrace(void **buffer, int size) -> int { + auto *x29 = reinterpret_cast(cpu::regs::X29::Read()); int count = 0; - while (x29 && *x29 && count < size) { + while ((x29 != nullptr) && (*x29 != 0U) && count < size) { uint64_t lr = x29[1]; - x29 = (uint64_t *)x29[0]; - buffer[count++] = (void *)lr; + x29 = reinterpret_cast(x29[0]); + buffer[count++] = reinterpret_cast(lr); } return count; } void DumpStack() { - void *buffer[kMaxFrameCount]; + std::array buffer{}; // 获取调用栈中的地址 - auto num_frames = backtrace(buffer, kMaxFrameCount); + auto num_frames = backtrace(buffer.data(), kMaxFrameCount); // 打印地址 /// @todo 打印函数名,需要 elf 支持 diff --git a/src/kernel/arch/aarch64/include/cpu/cpu.hpp b/src/kernel/arch/aarch64/include/cpu/cpu.hpp deleted file mode 100644 index ac997aba4..000000000 --- a/src/kernel/arch/aarch64/include/cpu/cpu.hpp +++ /dev/null @@ -1,48 +0,0 @@ - -/** - * @file cpu.hpp - * @brief aarch64 cpu 相关定义 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2024-03-05 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2024-03-05Zone.N (Zone.Niuzh@hotmail.com)创建文件 - *
- */ - -#ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_CPU_HPP_ -#define SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_CPU_HPP_ - -#include -#include -#include -#include - -#include "kernel_log.hpp" -#include "regs.hpp" -#include "sk_cstdio" -#include "sk_iostream" - -/** - * aarch64 cpu 相关定义 - * @note 寄存器读写设计见 arch/README.md - */ -namespace cpu { - -/** - * @brief 初始化 FPU - */ -static __always_inline void SetupFpu() { - asm volatile("mrs x0, CPACR_EL1"); - asm volatile("orr x0, x0, #(0b11 << 20)"); - asm volatile("msr CPACR_EL1, x0"); - asm volatile("isb"); -} - -} // namespace cpu - -#endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_CPU_HPP_ diff --git a/src/kernel/arch/aarch64/include/cpu/regs.hpp b/src/kernel/arch/aarch64/include/cpu/regs.hpp deleted file mode 100644 index 783103c8a..000000000 --- a/src/kernel/arch/aarch64/include/cpu/regs.hpp +++ /dev/null @@ -1,175 +0,0 @@ - -/** - * @file regs.hpp - * @brief aarch64 寄存器相关定义 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2024-03-05 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2024-03-05Zone.N (Zone.Niuzh@hotmail.com)创建文件 - *
- */ - -#ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_REGS_HPP_ -#define SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_REGS_HPP_ - -#include -#include -#include -#include - -#include "kernel_log.hpp" -#include "sk_cstdio" -#include "sk_iostream" - -/** - * aarch64 cpu Control and Status Registers 相关定义 - * @note 寄存器读写设计见 arch/README.md - */ -namespace cpu { - -// 第一部分:寄存器定义 -namespace register_info { - -struct RegInfoBase { - /// 寄存器数据类型 - using DataType = uint64_t; - /// 起始位 - static constexpr uint64_t kBitOffset = 0; - /// 位宽 - static constexpr uint64_t kBitWidth = 64; - /// 掩码,(val & kBitMask) == 对应当前位的值 - static constexpr uint64_t kBitMask = - (kBitWidth < 64) ? ((1ULL << kBitWidth) - 1) << kBitOffset : ~0ULL; - /// 对应位置位掩码 - static constexpr uint64_t kAllSetMask = - (kBitWidth < 64) ? ((1ULL << kBitWidth) - 1) : ~0ULL; -}; - -/// 通用寄存器 -struct X29Info : public RegInfoBase {}; - -}; // namespace register_info - -// 第二部分:读/写模版实现 -namespace read_write { -/** - * 只读接口 - * @tparam 寄存器类型 - */ -template -class ReadOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - ReadOnlyRegBase() = default; - ReadOnlyRegBase(const ReadOnlyRegBase &) = delete; - ReadOnlyRegBase(ReadOnlyRegBase &&) = delete; - auto operator=(const ReadOnlyRegBase &) -> ReadOnlyRegBase & = delete; - auto operator=(ReadOnlyRegBase &&) -> ReadOnlyRegBase & = delete; - ~ReadOnlyRegBase() = default; - /// @} - - /** - * 读寄存器 - * @return RegInfo::DataType 寄存器的值 - */ - static __always_inline auto Read() -> typename RegInfo::DataType { - typename RegInfo::DataType value{}; - if constexpr (std::is_same::value) { - __asm__ volatile("mov %0, x29" : "=r"(value) : :); - } else { - klog::Err("No Type\n"); - throw; - } - return value; - } - - /** - * () 重载 - */ - __always_inline auto operator()() -> typename RegInfo::DataType { - return Read(); - } -}; - -/** - * 只写接口 - * @tparam 寄存器类型 - */ -template -class WriteOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - WriteOnlyRegBase() = default; - WriteOnlyRegBase(const WriteOnlyRegBase &) = delete; - WriteOnlyRegBase(WriteOnlyRegBase &&) = delete; - auto operator=(const WriteOnlyRegBase &) -> WriteOnlyRegBase & = delete; - auto operator=(WriteOnlyRegBase &&) -> WriteOnlyRegBase & = delete; - ~WriteOnlyRegBase() = default; - /// @} - - /** - * 写寄存器 - * @param value 要写的值 - */ - static __always_inline void Write(typename RegInfo::DataType value) { - if constexpr (std::is_same::value) { - __asm__ volatile("mov x29, %0" : : "r"(value) :); - } else { - klog::Err("No Type\n"); - throw; - } - } -}; - -/** - * 读写接口 - * @tparam 寄存器类型 - */ -template -class ReadWriteRegBase : public ReadOnlyRegBase, - public WriteOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - ReadWriteRegBase() = default; - ReadWriteRegBase(const ReadWriteRegBase &) = delete; - ReadWriteRegBase(ReadWriteRegBase &&) = delete; - auto operator=(const ReadWriteRegBase &) -> ReadWriteRegBase & = delete; - auto operator=(ReadWriteRegBase &&) -> ReadWriteRegBase & = delete; - ~ReadWriteRegBase() = default; - /// @} -}; - -}; // namespace read_write - -// 第三部分:寄存器实例 -namespace regs { -class X29 : public read_write::ReadWriteRegBase { - public: - friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const X29 &x29) - -> sk_std::ostream & { - klog::Info("val: 0x%p", regs::X29::Read()); - return os; - } -}; - -/// 通用寄存器 -struct AllXreg { - X29 x29; -}; - -}; // namespace regs - -// 第四部分:访问接口 -[[maybe_unused]] static regs::AllXreg kAllXreg; - -}; // namespace cpu - -#endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_AARCH64_INCLUDE_CPU_REGS_HPP_ diff --git a/src/kernel/arch/arch.h b/src/kernel/arch/arch.h index 9ed4454f9..714dedb40 100644 --- a/src/kernel/arch/arch.h +++ b/src/kernel/arch/arch.h @@ -27,7 +27,7 @@ * @param argc 在不同体系结构有不同含义,同 _start * @param argv 在不同体系结构有不同含义,同 _start */ -auto ArchInit(uint32_t argc, uint8_t *argv) -> uint32_t; +auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t; /// 最多回溯 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 8f15e66f2..e59a144e6 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -13,10 +13,10 @@ * */ +#include #include #include "basic_info.hpp" -#include "cpu/cpu.hpp" #include "kernel_elf.hpp" #include "kernel_fdt.hpp" #include "ns16550a.h" diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 9043d056c..7bcf81301 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -14,8 +14,11 @@ * */ +#include + +#include + #include "arch.h" -#include "cpu/cpu.hpp" #include "kernel_elf.hpp" #include "kernel_fdt.hpp" #include "sk_cstdio" diff --git a/src/kernel/arch/riscv64/include/cpu/cpu.hpp b/src/kernel/arch/riscv64/include/cpu/cpu.hpp deleted file mode 100644 index 7eebf372c..000000000 --- a/src/kernel/arch/riscv64/include/cpu/cpu.hpp +++ /dev/null @@ -1,30 +0,0 @@ - -/** - * @file cpu.hpp - * @brief riscv64 cpu 相关定义 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2024-03-05 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2024-03-05Zone.N (Zone.Niuzh@hotmail.com)创建文件 - *
- */ - -#ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_RISCV64_INCLUDE_CPU_CPU_HPP_ -#define SIMPLEKERNEL_SRC_KERNEL_ARCH_RISCV64_INCLUDE_CPU_CPU_HPP_ - -#include -#include -#include -#include - -#include "kernel_log.hpp" -#include "regs.hpp" -#include "sk_cstdio" -#include "sk_iostream" - -#endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_RISCV64_INCLUDE_CPU_CPU_HPP_ diff --git a/src/kernel/arch/riscv64/include/cpu/regs.hpp b/src/kernel/arch/riscv64/include/cpu/regs.hpp deleted file mode 100644 index e250f83b4..000000000 --- a/src/kernel/arch/riscv64/include/cpu/regs.hpp +++ /dev/null @@ -1,175 +0,0 @@ - -/** - * @file regs.hpp - * @brief riscv64 寄存器相关定义 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2024-03-05 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2024-03-05Zone.N (Zone.Niuzh@hotmail.com)创建文件 - *
- */ - -#ifndef SIMPLEKERNEL_SRC_KERNEL_ARCH_RISCV64_INCLUDE_CPU_REGS_HPP_ -#define SIMPLEKERNEL_SRC_KERNEL_ARCH_RISCV64_INCLUDE_CPU_REGS_HPP_ - -#include -#include -#include -#include - -#include "kernel_log.hpp" -#include "sk_cstdio" -#include "sk_iostream" - -/** - * riscv64 cpu Control and Status Registers 相关定义 - * @note 寄存器读写设计见 arch/README.md - */ -namespace cpu { - -// 第一部分:寄存器定义 -namespace register_info { - -struct RegInfoBase { - /// 寄存器数据类型 - using DataType = uint64_t; - /// 起始位 - static constexpr uint64_t kBitOffset = 0; - /// 位宽 - static constexpr uint64_t kBitWidth = 64; - /// 掩码,(val & kBitMask) == 对应当前位的值 - static constexpr uint64_t kBitMask = - (kBitWidth < 64) ? ((1ULL << kBitWidth) - 1) << kBitOffset : ~0ULL; - /// 对应位置位掩码 - static constexpr uint64_t kAllSetMask = - (kBitWidth < 64) ? ((1ULL << kBitWidth) - 1) : ~0ULL; -}; - -/// 通用寄存器 -struct FpInfo : public RegInfoBase {}; - -}; // namespace register_info - -// 第二部分:读/写模版实现 -namespace read_write { -/** - * 只读接口 - * @tparam 寄存器类型 - */ -template -class ReadOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - ReadOnlyRegBase() = default; - ReadOnlyRegBase(const ReadOnlyRegBase &) = delete; - ReadOnlyRegBase(ReadOnlyRegBase &&) = delete; - auto operator=(const ReadOnlyRegBase &) -> ReadOnlyRegBase & = delete; - auto operator=(ReadOnlyRegBase &&) -> ReadOnlyRegBase & = delete; - ~ReadOnlyRegBase() = default; - /// @} - - /** - * 读寄存器 - * @return RegInfo::DataType 寄存器的值 - */ - static __always_inline auto Read() -> typename RegInfo::DataType { - typename RegInfo::DataType value{}; - if constexpr (std::is_same::value) { - __asm__ volatile("mv %0, fp" : "=r"(value) : :); - } else { - klog::Err("No Type\n"); - throw; - } - return value; - } - - /** - * () 重载 - */ - __always_inline auto operator()() -> typename RegInfo::DataType { - return Read(); - } -}; - -/** - * 只写接口 - * @tparam 寄存器类型 - */ -template -class WriteOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - WriteOnlyRegBase() = default; - WriteOnlyRegBase(const WriteOnlyRegBase &) = delete; - WriteOnlyRegBase(WriteOnlyRegBase &&) = delete; - auto operator=(const WriteOnlyRegBase &) -> WriteOnlyRegBase & = delete; - auto operator=(WriteOnlyRegBase &&) -> WriteOnlyRegBase & = delete; - ~WriteOnlyRegBase() = default; - /// @} - - /** - * 写寄存器 - * @param value 要写的值 - */ - static __always_inline void Write(typename RegInfo::DataType value) { - if constexpr (std::is_same::value) { - __asm__ volatile("mv fp, %0" : : "r"(value) :); - } else { - klog::Err("No Type\n"); - throw; - } - } -}; - -/** - * 读写接口 - * @tparam 寄存器类型 - */ -template -class ReadWriteRegBase : public ReadOnlyRegBase, - public WriteOnlyRegBase { - public: - /// @name 构造/析构函数 - /// @{ - ReadWriteRegBase() = default; - ReadWriteRegBase(const ReadWriteRegBase &) = delete; - ReadWriteRegBase(ReadWriteRegBase &&) = delete; - auto operator=(const ReadWriteRegBase &) -> ReadWriteRegBase & = delete; - auto operator=(ReadWriteRegBase &&) -> ReadWriteRegBase & = delete; - ~ReadWriteRegBase() = default; - /// @} -}; - -}; // namespace read_write - -// 第三部分:寄存器实例 -namespace regs { -class Fp : public read_write::ReadWriteRegBase { - public: - friend auto operator<<(sk_std::ostream &os, [[maybe_unused]] const Fp &fp) - -> sk_std::ostream & { - klog::Info("val: 0x%p", regs::Fp::Read()); - return os; - } -}; - -/// 通用寄存器 -struct AllXreg { - Fp fp; -}; - -}; // namespace regs - -// 第四部分:访问接口 -[[maybe_unused]] static regs::AllXreg kAllXreg; - -}; // namespace cpu - -#endif // SIMPLEKERNEL_SRC_KERNEL_ARCH_RISCV64_INCLUDE_CPU_REGS_HPP_ From fe85d343b81f85ee422f291f07206ae8f9533db8 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:37:39 +0800 Subject: [PATCH 067/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 95e063afc..1b1c959d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: From da27887db9d8e9ed58fcd520c7a73b4327a6087f Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:44:29 +0800 Subject: [PATCH 068/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 14 ++++++------ src/kernel/arch/riscv64/arch_main.cpp | 2 +- src/kernel/arch/x86_64/arch_main.cpp | 2 +- test/unit_test/CMakeLists.txt | 5 +--- test/unit_test/aarch64_cpu_test.cpp | 33 --------------------------- test/unit_test/riscv64_cpu_test.cpp | 33 --------------------------- test/unit_test/x86_64_cpu_test.cpp | 32 -------------------------- 7 files changed, 10 insertions(+), 111 deletions(-) delete mode 100644 test/unit_test/aarch64_cpu_test.cpp delete mode 100644 test/unit_test/riscv64_cpu_test.cpp delete mode 100644 test/unit_test/x86_64_cpu_test.cpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1b1c959d4..95e063afc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index e59a144e6..6c3ce8cb7 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -52,7 +52,7 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = reinterpret_cast(argv); } -auto ArchInit(uint32_t argc, uint8_t *argv) -> uint32_t { +auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { printf("boot hart id: %d\n", argc); printf("dtb info addr: %p\n", argv); diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 9137a5b57..44869ae47 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -55,7 +55,7 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = 0; } -auto ArchInit(uint32_t argc, uint8_t *argv) -> uint32_t { +auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { if (argc != 1) { klog::Err("argc != 1 [%d]\n", argc); throw; diff --git a/test/unit_test/CMakeLists.txt b/test/unit_test/CMakeLists.txt index e42bbbd6c..c7b4c5f31 100644 --- a/test/unit_test/CMakeLists.txt +++ b/test/unit_test/CMakeLists.txt @@ -8,10 +8,7 @@ PROJECT (unit-test VERSION 0.0.1) ENABLE_LANGUAGE (CXX) -ADD_EXECUTABLE ( - ${PROJECT_NAME} - riscv64_cpu_test.cpp x86_64_cpu_test.cpp aarch64_cpu_test.cpp - kernel_elf_test.cpp kernel_fdt_test.cpp) +ADD_EXECUTABLE (${PROJECT_NAME} kernel_elf_test.cpp kernel_fdt_test.cpp) TARGET_INCLUDE_DIRECTORIES ( ${PROJECT_NAME} PRIVATE ./ ${CMAKE_SOURCE_DIR}/src/kernel/include diff --git a/test/unit_test/aarch64_cpu_test.cpp b/test/unit_test/aarch64_cpu_test.cpp deleted file mode 100644 index 964360f70..000000000 --- a/test/unit_test/aarch64_cpu_test.cpp +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * @file aarch64_cpu_test.cpp - * @brief aarch64 cpu 相关测试 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2023-09-02 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2023-09-02Zone.N创建文件 - *
- */ - -#include - -#include "aarch64/include/cpu/cpu.hpp" - -TEST(Aarch64RegInfoBaseTest, ValueTest) { - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitOffset, 0); - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitWidth, 64); - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitMask, 0xFFFFFFFFFFFFFFFF); - EXPECT_EQ(cpu::register_info::RegInfoBase::kAllSetMask, 0xFFFFFFFFFFFFFFFF); -} - -TEST(Aarch64X29InfoTest, ValueTest) { - EXPECT_EQ(cpu::register_info::X29Info::kBitOffset, 0); - EXPECT_EQ(cpu::register_info::X29Info::kBitWidth, 64); - EXPECT_EQ(cpu::register_info::X29Info::kBitMask, 0xFFFFFFFFFFFFFFFF); - EXPECT_EQ(cpu::register_info::X29Info::kAllSetMask, 0xFFFFFFFFFFFFFFFF); -} diff --git a/test/unit_test/riscv64_cpu_test.cpp b/test/unit_test/riscv64_cpu_test.cpp deleted file mode 100644 index f90ebf04c..000000000 --- a/test/unit_test/riscv64_cpu_test.cpp +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * @file riscv64_cpu_test.cpp - * @brief riscv64 cpu 相关测试 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2023-09-02 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2023-09-02Zone.N创建文件 - *
- */ - -#include - -#include "riscv64/include/cpu/cpu.hpp" - -TEST(Riscv64RegInfoBaseTest, ValueTest) { - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitOffset, 0); - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitWidth, 64); - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitMask, 0xFFFFFFFFFFFFFFFF); - EXPECT_EQ(cpu::register_info::RegInfoBase::kAllSetMask, 0xFFFFFFFFFFFFFFFF); -} - -TEST(Riscv64FpInfoTest, ValueTest) { - EXPECT_EQ(cpu::register_info::FpInfo::kBitOffset, 0); - EXPECT_EQ(cpu::register_info::FpInfo::kBitWidth, 64); - EXPECT_EQ(cpu::register_info::FpInfo::kBitMask, 0xFFFFFFFFFFFFFFFF); - EXPECT_EQ(cpu::register_info::FpInfo::kAllSetMask, 0xFFFFFFFFFFFFFFFF); -} diff --git a/test/unit_test/x86_64_cpu_test.cpp b/test/unit_test/x86_64_cpu_test.cpp deleted file mode 100644 index c964c6a3f..000000000 --- a/test/unit_test/x86_64_cpu_test.cpp +++ /dev/null @@ -1,32 +0,0 @@ - -/** - * @file x86_64_cpu_test.cpp - * @brief x86_64 cpu 相关测试 - * @author Zone.N (Zone.Niuzh@hotmail.com) - * @version 1.0 - * @date 2023-09-02 - * @copyright MIT LICENSE - * https://github.com/Simple-XX/SimpleKernel - * @par change log: - * - *
DateAuthorDescription - *
2023-09-02Zone.N创建文件 - *
- */ - -#include -#include - -TEST(x8664RegInfoBaseTest, ValueTest) { - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitOffset, 0); - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitWidth, 64); - EXPECT_EQ(cpu::register_info::RegInfoBase::kBitMask, 0xFFFFFFFFFFFFFFFF); - EXPECT_EQ(cpu::register_info::RegInfoBase::kAllSetMask, 0xFFFFFFFFFFFFFFFF); -} - -TEST(x8664RbpInfoTest, ValueTest) { - EXPECT_EQ(cpu::register_info::RbpInfo::kBitOffset, 0); - EXPECT_EQ(cpu::register_info::RbpInfo::kBitWidth, 64); - EXPECT_EQ(cpu::register_info::RbpInfo::kBitMask, 0xFFFFFFFFFFFFFFFF); - EXPECT_EQ(cpu::register_info::RbpInfo::kAllSetMask, 0xFFFFFFFFFFFFFFFF); -} From 82369241d5cd4056765aaf7854bba9fefdba5aa0 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Thu, 2 Jan 2025 23:44:36 +0800 Subject: [PATCH 069/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 95e063afc..1b1c959d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: From c37c14024d7df904f24930d44780bd99623102a7 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 3 Jan 2025 02:43:25 +0000 Subject: [PATCH 070/232] style: remove redundant codes Signed-off-by: Zone.N --- .pre-commit-config.yaml | 14 +++++++------- src/kernel/include/basic_info.hpp | 3 --- src/kernel/include/kernel_elf.hpp | 3 --- src/kernel/include/kernel_fdt.hpp | 3 --- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1b1c959d4..95e063afc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index f80c77332..eb3069698 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -74,7 +74,4 @@ struct BasicInfo { } }; -/// 保存基本信息 -[[maybe_unused]] static Singleton kBasicInfo; - #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_BASIC_INFO_HPP_ */ diff --git a/src/kernel/include/kernel_elf.hpp b/src/kernel/include/kernel_elf.hpp index 69e002e61..7f39cf02f 100644 --- a/src/kernel/include/kernel_elf.hpp +++ b/src/kernel/include/kernel_elf.hpp @@ -121,7 +121,4 @@ class KernelElf { } }; -/// 全局 elf 对象,需要在相应体系结构初始化时重新初始化 -[[maybe_unused]] static Singleton kKernelElf; - #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_ELF_HPP_ */ diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index 0b350dc4e..3450b960f 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -140,7 +140,4 @@ class KernelFdt { void *fdt_addr_; }; -/// 全局 elf 对象,需要在相应体系结构初始化时重新初始化 -[[maybe_unused]] static Singleton kKernelFdt; - #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_FDT_HPP_ */ From fd36316c146e814355b3e4ec70217636e1fb52a0 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 3 Jan 2025 06:36:24 +0000 Subject: [PATCH 071/232] 3rd: update cpu_io Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++++++++++-------------- 3rd/cpu_io | 2 +- src/kernel/arch/riscv64/backtrace.cpp | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 95e063afc..e3604fa81 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/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/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index fb9989b0b..2d648c23b 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit fb9989b0be3db8fff772230f0ea271305ee5b1c5 +Subproject commit 2d648c23b3d24c7f5d56f1cb1f28280e5531361d diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 7bcf81301..cd7077dcf 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -25,7 +25,7 @@ #include "sk_libc.h" auto backtrace(void **buffer, int size) -> int { - auto *fp = reinterpret_cast(cpu::regs::Fp::Read()); + auto *fp = reinterpret_cast(cpu_io::Fp::Read()); uint64_t *ra = nullptr; int count = 0; From db9ddb211988970e9e3f8c74d14df827a4d6d345 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 3 Jan 2025 06:37:23 +0000 Subject: [PATCH 072/232] 3rd: update cpu_io Signed-off-by: Zone.N --- 3rd/cpu_io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rd/cpu_io b/3rd/cpu_io index 2d648c23b..8a4f92915 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 2d648c23b3d24c7f5d56f1cb1f28280e5531361d +Subproject commit 8a4f92915e6f0c5dddf53a34299e6f631de3ab4c From e78873e2d1e2eab93800d2deec44723a61482d88 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 3 Jan 2025 08:38:32 +0000 Subject: [PATCH 073/232] 3rd: update cpu_io Signed-off-by: Zone.N --- 3rd/cpu_io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rd/cpu_io b/3rd/cpu_io index 8a4f92915..27257a3e9 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 8a4f92915e6f0c5dddf53a34299e6f631de3ab4c +Subproject commit 27257a3e9d6ff051a1d5453a8d25799a073bd5d2 From 72c6032ec98eff926c9403b3fc248179ae6d676c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 3 Jan 2025 08:41:04 +0000 Subject: [PATCH 074/232] 3rd: update cpu_io Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- src/kernel/arch/x86_64/arch_main.cpp | 2 +- src/kernel/arch/x86_64/backtrace.cpp | 2 +- test/system_test/cxx_init_test/main.cpp | 4 ++-- test/system_test/gnu_efi_test/main.cpp | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e3604fa81..a0a1c1ceb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + - -p=/root/SimpleKernel/build_x86_64/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/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/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_x86_64/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_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_x86_64/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_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 44869ae47..79dcd45e3 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -28,7 +28,7 @@ /// @note 这里要注意,保证在 serial 初始化之前不能使用 printf /// 函数,否则会有全局对象依赖问题 namespace { -cpu::Serial kSerial(cpu::kCom1); +cpu_io::Serial kSerial(cpu_io::kCom1); extern "C" void _putchar(char character) { kSerial.Write(character); } // 引用链接脚本中的变量 /// @see http://wiki.osdev.org/Using_Linker_Script_Values diff --git a/src/kernel/arch/x86_64/backtrace.cpp b/src/kernel/arch/x86_64/backtrace.cpp index af01117b2..b61dffc7a 100644 --- a/src/kernel/arch/x86_64/backtrace.cpp +++ b/src/kernel/arch/x86_64/backtrace.cpp @@ -26,7 +26,7 @@ #include "singleton.hpp" auto backtrace(std::array &buffer) -> int { - auto *rbp = reinterpret_cast(cpu::regs::Rbp::Read()); + auto *rbp = reinterpret_cast(cpu_io::Rbp::Read()); uint64_t *rip = nullptr; int count = 0; diff --git a/test/system_test/cxx_init_test/main.cpp b/test/system_test/cxx_init_test/main.cpp index 8ea9a67dd..a40d61355 100644 --- a/test/system_test/cxx_init_test/main.cpp +++ b/test/system_test/cxx_init_test/main.cpp @@ -24,7 +24,7 @@ #include "sk_libcxx.h" #ifdef __x86_64__ -static auto serial = cpu::Serial(cpu::kCom1); +static auto serial = cpu_io::Serial(cpu_io::kCom1); extern "C" void _putchar(char character) { serial.Write(character); } #elif __riscv #include @@ -87,7 +87,7 @@ class InsClass : public AbsClass { auto main(uint32_t, uint8_t *) -> uint32_t { #ifdef __aarch64__ - cpu::SetupFpu(); + cpu_io::SetupFpu(); #endif global_u8c_value_with_init++; diff --git a/test/system_test/gnu_efi_test/main.cpp b/test/system_test/gnu_efi_test/main.cpp index 6e1c4964b..fc07c40bc 100644 --- a/test/system_test/gnu_efi_test/main.cpp +++ b/test/system_test/gnu_efi_test/main.cpp @@ -23,7 +23,7 @@ #include "sk_cstring" extern "C" void _putchar(char character) { - auto serial = cpu::Serial(cpu::kCom1); + auto serial = cpu_io::Serial(cpu_io::kCom1); serial.Write(character); } From 26afde37d2757d9d7ec3d0d29acf03d67bf2a8bb Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 3 Jan 2025 08:52:47 +0000 Subject: [PATCH 075/232] refactor: update aarch64 Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++++++++++-------------- 3rd/cpu_io | 2 +- src/kernel/arch/aarch64/arch_main.cpp | 2 +- src/kernel/arch/aarch64/backtrace.cpp | 2 +- tools/.pre-commit-config.yaml.in | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a0a1c1ceb..f09ff93f5 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_x86_64/build_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_x86_64/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/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_x86_64/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/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/3rd/cpu_io b/3rd/cpu_io index 27257a3e9..6ebe3a392 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 27257a3e9d6ff051a1d5453a8d25799a073bd5d2 +Subproject commit 6ebe3a392851cb22872aaafeeb947c6d77b40c97 diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index 12a7e0d12..371775aaf 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -30,7 +30,7 @@ auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { (void)argv; // 初始化 FPU - cpu::SetupFpu(); + cpu_io::SetupFpu(); return 0; } diff --git a/src/kernel/arch/aarch64/backtrace.cpp b/src/kernel/arch/aarch64/backtrace.cpp index 640905135..bccd4ec3e 100644 --- a/src/kernel/arch/aarch64/backtrace.cpp +++ b/src/kernel/arch/aarch64/backtrace.cpp @@ -23,7 +23,7 @@ #include "sk_libc.h" auto backtrace(void **buffer, int size) -> int { - auto *x29 = reinterpret_cast(cpu::regs::X29::Read()); + auto *x29 = reinterpret_cast(cpu_io::X29::Read()); int count = 0; while ((x29 != nullptr) && (*x29 != 0U) && count < size) { diff --git a/tools/.pre-commit-config.yaml.in b/tools/.pre-commit-config.yaml.in index 30d7ed5c6..69ba87a91 100644 --- a/tools/.pre-commit-config.yaml.in +++ b/tools/.pre-commit-config.yaml.in @@ -25,7 +25,7 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=@CMAKE_BINARY_DIR@/build_x86_64/compiler_commands.json + - -p=@CMAKE_BINARY_DIR@/compiler_commands.json - -extra-arg=--std=c++2b - --fix - --header-filter=^(@CMAKE_BINARY_DIR@/src/).* From 07f4f9205f5ceb3d491b8416b3affaba685b67c1 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Fri, 3 Jan 2025 18:30:12 +0800 Subject: [PATCH 076/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- 3rd/cpu_io | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rd/cpu_io b/3rd/cpu_io index 6ebe3a392..fb9989b0b 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 6ebe3a392851cb22872aaafeeb947c6d77b40c97 +Subproject commit fb9989b0be3db8fff772230f0ea271305ee5b1c5 From f8ccd3589bd14d6963b8d22458289ea6a2d50c16 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Fri, 3 Jan 2025 23:35:17 +0800 Subject: [PATCH 077/232] 3rd: update cpu_io Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 28 ++++++++++++++-------------- 3rd/cpu_io | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..cfe4fd29e 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=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -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 + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index fb9989b0b..6833ed4a4 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit fb9989b0be3db8fff772230f0ea271305ee5b1c5 +Subproject commit 6833ed4a450975f183e24c14a167fd6326cc8c9d From cc12c0296efa2b26594e0cdb967d445897cb7d1d Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Fri, 3 Jan 2025 23:42:01 +0800 Subject: [PATCH 078/232] doc: update readme Signed-off-by: Zone.NiuZH --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b2e1168b9..edadc33ed 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ boot branch sudo apt install --fix-missing -y gcc g++ gcc-riscv64-linux-gnu g++-riscv64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu sudo apt install --fix-missing -y cmake qemu-system gdb-multiarch sudo apt install --fix-missing -y doxygen graphviz - sudo apt install --fix-missing -y doxygen graphviz + sudo apt install --fix-missing -y doxygen graphviz sudo apt install --fix-missing -y clang-format clang-tidy cppcheck libgtest-dev lcov ``` @@ -65,7 +65,7 @@ boot branch # 进入构建目录后执行 make debug ``` - + 在一个新的 shell 中进入 gdb ```shell # 进入 gdb @@ -77,7 +77,7 @@ boot branch # 开始执行 c ``` - + ## 执行流 @@ -192,10 +192,6 @@ boot branch | 对象名 | 位置 | 用途 | | :--------------------------------------: | :----------------------------------: | :---------------------: | - | `static ostream cout` | src/kernel/libcxx/include/iostream | 内核中的 std::cout 实现 | - | `static Singleton kKernelElf` | src/kernel/include/kernel_elf.hpp | 解析内核自身的 elf 信息 | - | `static Singleton kKernelFdt` | src/kernel/include/kernel_fdt.hpp | 解析 dtb 信息 | - | `static Singleton kBasicInfo` | src/kernel/include/basic_info.hpp | 内核基本信息 | | `static cpu::Serial kSerial(cpu::kCom1)` | src/kernel/arch/x86_64/arch_main.cpp | X86_64 下的串口 | - 基于 doxygen 的文档生成与自动部署 @@ -240,6 +236,8 @@ boot branch [printf_bare_metal](https://github.com/MRNIU/printf_bare_metal) +[cpu_io](https://github.com/MRNIU/cpu_io) + [dtc](https://git.kernel.org/pub/scm/utils/dtc/dtc.git) [google/googletest](https://github.com/google/googletest) From 1fed6ae42593c7af736646bf3b217889ee4edffd Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Fri, 3 Jan 2025 23:42:58 +0800 Subject: [PATCH 079/232] style: fix Signed-off-by: Zone.NiuZH --- src/kernel/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index a1b3d9b54..9068d97b1 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -24,12 +24,12 @@ void _start(uint32_t argc, uint8_t *argv) { CppInit(); - main(argc, argv); CppDeInit(); // 进入死循环 while (true) { + ; } } From 5d6541b2aa4f20b4975112d86d8ffeb770886e36 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Fri, 3 Jan 2025 23:48:38 +0800 Subject: [PATCH 080/232] style: update gitignore Signed-off-by: Zone.NiuZH --- .gitignore | 4 +-- .pre-commit-config.yaml | 2 +- .vscode/launch.json | 56 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.gitignore b/.gitignore index fdc7b6552..8d1a1a484 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # @@ -10,7 +9,8 @@ build_riscv64 build_x86_64 doc/html .gdbinit -.vscode +.vscode/* +!.vscode/launch.json .idea Doxyfile .gdbinit diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cfe4fd29e..8b78ef5d5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: hooks: - id: check-case-conflict - id: check-illegal-windows-names - - id: check-json + # - id: check-json - id: check-merge-conflict - id: check-symlinks - id: check-xml diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..0f3ded459 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,56 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "riscv64-debug", + "type": "cppdbg", + "request": "launch", + "miDebuggerServerAddress": "127.0.0.1:1234", + "miDebuggerPath": "/usr/bin/gdb-multiarch", + "program": "${workspaceFolder}/build_riscv64/bin/kernel.elf", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}/build_riscv64/bin", + "environment": [], + "externalConsole": false, + "logging": { + "engineLogging": false + }, + "MIMode": "gdb", + }, + { + "name": "x86_64-debug", + "type": "cppdbg", + "request": "launch", + "miDebuggerServerAddress": "127.0.0.1:1234", + "miDebuggerPath": "/usr/bin/gdb-multiarch", + "program": "${workspaceFolder}/build_x86_64/bin/kernel.elf", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}/build_x86_64/bin", + "environment": [], + "externalConsole": false, + "logging": { + "engineLogging": false + }, + "MIMode": "gdb", + }, + { + "name": "aarch64-debug", + "type": "cppdbg", + "request": "launch", + "miDebuggerServerAddress": "127.0.0.1:1234", + "miDebuggerPath": "/usr/bin/gdb-multiarch", + "program": "${workspaceFolder}/build_aarch64/bin/kernel.elf", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}/build_aarch64/bin", + "environment": [], + "externalConsole": false, + "logging": { + "engineLogging": false + }, + "MIMode": "gdb", + } + ] +} From 3b07ef9dbf9f1fa6a5e7914ef0c1bf70f741b0d3 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Fri, 3 Jan 2025 23:48:43 +0800 Subject: [PATCH 081/232] style: update gitignore Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8b78ef5d5..cfe4fd29e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: hooks: - id: check-case-conflict - id: check-illegal-windows-names - # - id: check-json + - id: check-json - id: check-merge-conflict - id: check-symlinks - id: check-xml From d1a7de57872c4223522d278f9b0dbc708ef988b5 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 00:19:04 +0800 Subject: [PATCH 082/232] style: update gitignore Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 18 +++++++++--------- CMakePresets.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cfe4fd29e..716595a40 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakePresets.json b/CMakePresets.json index 238257a92..ca220c260 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -169,4 +169,4 @@ } } ] -} \ No newline at end of file +} From 0f31dd6c5d8acba5aebecde5ef6bc48b1c432bd7 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 00:47:38 +0800 Subject: [PATCH 083/232] style: update gitignore Signed-off-by: Zone.NiuZH --- .gitignore | 1 + .vscode/launch.json | 5 +- .vscode/tasks.json | 209 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 .vscode/tasks.json diff --git a/.gitignore b/.gitignore index 8d1a1a484..ceb38e468 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ build_x86_64 doc/html .gdbinit .vscode/* +!.vscode/tasks.json !.vscode/launch.json .idea Doxyfile diff --git a/.vscode/launch.json b/.vscode/launch.json index 0f3ded459..0a2b15bcb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,11 +12,12 @@ "stopAtEntry": true, "cwd": "${workspaceFolder}/build_riscv64/bin", "environment": [], - "externalConsole": false, + "externalConsole": true, "logging": { "engineLogging": false }, "MIMode": "gdb", + "preLaunchTask": "debug_riscv64" }, { "name": "x86_64-debug", @@ -34,6 +35,7 @@ "engineLogging": false }, "MIMode": "gdb", + "preLaunchTask": "debug_x86_64" }, { "name": "aarch64-debug", @@ -51,6 +53,7 @@ "engineLogging": false }, "MIMode": "gdb", + "preLaunchTask": "debug_aarch64" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..632c391c5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,209 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build_riscv64", + "type": "process", + "command": "make", + "args": [], + "options": { + "cwd": "${workspaceFolder}/build_riscv64" + }, + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": ["$gcc"], + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "run_riscv64", + "type": "process", + "command": "make", + "args": ["run"], + "options": { + "cwd": "${workspaceFolder}/build_riscv64" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "debug_riscv64", + "type": "process", + "command": "make", + "args": ["debug"], + "options": { + "cwd": "${workspaceFolder}/build_riscv64" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "build_aarch64", + "type": "process", + "command": "make", + "args": [], + "options": { + "cwd": "${workspaceFolder}/build_aarch64" + }, + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": ["$gcc"], + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "run_aarch64", + "type": "process", + "command": "make", + "args": ["run"], + "options": { + "cwd": "${workspaceFolder}/build_aarch64" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "debug_aarch64", + "type": "process", + "command": "make", + "args": ["debug"], + "options": { + "cwd": "${workspaceFolder}/build_aarch64" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "build_x86_64", + "type": "process", + "command": "make", + "args": [], + "options": { + "cwd": "${workspaceFolder}/build_x86_64" + }, + "group": { + "kind": "build", + "isDefault": false + }, + "problemMatcher": ["$gcc"], + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "run_x86_64", + "type": "process", + "command": "make", + "args": ["run"], + "options": { + "cwd": "${workspaceFolder}/build_x86_64" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + }, + { + "label": "debug_x86_64", + "type": "process", + "command": "make", + "args": ["debug"], + "options": { + "cwd": "${workspaceFolder}/build_x86_64" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": true, + "panel": "dedicated", + "showReuseMessage": true, + "clear": true + } + } + ] +} From ffa68e6d37eb40df03f2493472cfb396372c1684 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 00:59:45 +0800 Subject: [PATCH 084/232] feat: vscode run and debug Signed-off-by: Zone.NiuZH --- .vscode/launch.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0a2b15bcb..dca3bbadc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,7 +14,7 @@ "environment": [], "externalConsole": true, "logging": { - "engineLogging": false + "engineLogging": "verbose" }, "MIMode": "gdb", "preLaunchTask": "debug_riscv64" @@ -30,9 +30,9 @@ "stopAtEntry": true, "cwd": "${workspaceFolder}/build_x86_64/bin", "environment": [], - "externalConsole": false, + "externalConsole": true, "logging": { - "engineLogging": false + "engineLogging": "verbose" }, "MIMode": "gdb", "preLaunchTask": "debug_x86_64" @@ -48,9 +48,9 @@ "stopAtEntry": true, "cwd": "${workspaceFolder}/build_aarch64/bin", "environment": [], - "externalConsole": false, + "externalConsole": true, "logging": { - "engineLogging": false + "engineLogging": "verbose" }, "MIMode": "gdb", "preLaunchTask": "debug_aarch64" From e2716690a9d039a464c3860d078238c616a22384 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 01:04:09 +0800 Subject: [PATCH 085/232] doc: update readme Signed-off-by: Zone.NiuZH --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index edadc33ed..7bba587ca 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,10 @@ boot branch c ``` +5. 使用 vscode + + 已经配置了 vscode 的 tasks.json 与 launch.json,你可以直接使用 vscode 运行内核或进行调试 + ## 执行流 From 7e5e5fba3eb63af284729f3df4c69f4976032b47 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 19:03:51 +0800 Subject: [PATCH 086/232] feat: working on grub2 Signed-off-by: Zone.NiuZH --- cmake/compile_config.cmake | 1 + src/kernel/arch/riscv64/boot.S | 3 +++ tools/grub.cfg | 7 +++++++ 3 files changed, 11 insertions(+) create mode 100755 tools/grub.cfg diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index 5f2405f32..ade74671a 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -200,6 +200,7 @@ TARGET_LINK_LIBRARIES ( printf_bare_metal dtc-lib cpu_io + grub2 $<$: opensbi_interface > diff --git a/src/kernel/arch/riscv64/boot.S b/src/kernel/arch/riscv64/boot.S index 4b343e7dd..d5964f3f7 100644 --- a/src/kernel/arch/riscv64/boot.S +++ b/src/kernel/arch/riscv64/boot.S @@ -16,6 +16,9 @@ #include "macro.S" +#define ASM_FILE +#include "multiboot2.h" + // clang-format off .section .text.boot diff --git a/tools/grub.cfg b/tools/grub.cfg new file mode 100755 index 000000000..b162c8305 --- /dev/null +++ b/tools/grub.cfg @@ -0,0 +1,7 @@ +set timeout=5 +set default=0 + +menuentry "SimpleKernel" { + multiboot2 /boot/kernel.elf + boot +} From 7a886efe2dd151af074c7605875aa9b0367928a4 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 22:43:35 +0800 Subject: [PATCH 087/232] feat: smp for riscv Signed-off-by: Zone.NiuZH --- 3rd/cpu_io | 2 +- CMakeLists.txt | 2 ++ src/kernel/include/per_cpu.hpp | 36 ++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/kernel/include/per_cpu.hpp diff --git a/3rd/cpu_io b/3rd/cpu_io index 6833ed4a4..257645e7a 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 6833ed4a450975f183e24c14a167fd6326cc8c9d +Subproject commit 257645e7ab22c197145ef097584b5010c4854c1b diff --git a/CMakeLists.txt b/CMakeLists.txt index 4be7cdb4e..cdae71b95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf -kernel $ + -smp + 4 # @todo 暂时还不支持 riscv64 的 uefi 启动 预期路线: qemu->uefi->opensbi + # kernel(payload) -bios # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda diff --git a/src/kernel/include/per_cpu.hpp b/src/kernel/include/per_cpu.hpp new file mode 100644 index 000000000..0226acfa9 --- /dev/null +++ b/src/kernel/include/per_cpu.hpp @@ -0,0 +1,36 @@ + +/** + * @file per_cpu.hpp + * @brief 多核数据结构 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-07-15 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-07-15Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ +#define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ + +#include +#include +#include +#include + +struct PerCpu { + /// 核心 ID + size_t core_id; +}; + +/// 最多支持 4 个核心 +constexpr size_t kMaxCoreCount = 8; + +/// per cpu 数据 +static std::array kPerCpu; + +#endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ */ From 7d4dc454b633d93775604b31f13ab27141ac95bd Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 22:47:15 +0800 Subject: [PATCH 088/232] feat: smp for riscv Signed-off-by: Zone.NiuZH --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cdae71b95..91f9def3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,13 +64,13 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") QEMU_FLAGS -machine virt + -smp + 4 # 可选项,qemu7.0 自带了 opensbi1.0 -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf -kernel $ - -smp - 4 # @todo 暂时还不支持 riscv64 的 uefi 启动 预期路线: qemu->uefi->opensbi + # kernel(payload) -bios # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda From c1dee1bfd24fae3c2ff837d43ec62135e3f828cd Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sat, 4 Jan 2025 22:48:35 +0800 Subject: [PATCH 089/232] feat: smp for riscv Signed-off-by: Zone.NiuZH --- src/kernel/include/basic_info.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index eb3069698..69b9aba86 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -43,6 +43,9 @@ struct BasicInfo { /// fdt 地址 uint64_t fdt_addr; + /// cpu 核数 + size_t core_count; + /** * 构造函数,在 arch_main.cpp 中定义 * @param argc 同 _start From 81734ce57133e678d0b25d6fa36fbb9ec55faa50 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 10:23:28 +0800 Subject: [PATCH 090/232] feat: smp for riscv Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- 3rd/cpu_io | 2 +- src/kernel/CMakeLists.txt | 44 +++++++++++++--------------------- src/kernel/arch/riscv64/boot.S | 5 +++- 4 files changed, 22 insertions(+), 31 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 716595a40..3ed93e394 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/3rd/cpu_io b/3rd/cpu_io index 257645e7a..8b4ba244a 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 257645e7ab22c197145ef097584b5010c4854c1b +Subproject commit 8b4ba244adcc954c2a2ef5c88ad28248555cce4e diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index bbc0f4ba9..63cf33de0 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -1,44 +1,32 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. # 设置项目名与版本 -project( - kernel - VERSION 0.0.1 -) +PROJECT (kernel VERSION 0.0.1) -enable_language(ASM) -enable_language(C) -enable_language(CXX) +ENABLE_LANGUAGE (ASM) +ENABLE_LANGUAGE (C) +ENABLE_LANGUAGE (CXX) -add_subdirectory(${PROJECT_SOURCE_DIR}/libc) -add_subdirectory(${PROJECT_SOURCE_DIR}/libcxx) -add_subdirectory(${PROJECT_SOURCE_DIR}/arch) -add_subdirectory(${PROJECT_SOURCE_DIR}/driver) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/libc) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/libcxx) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/arch) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/driver) -add_executable(${PROJECT_NAME} - main.cpp -) +ADD_EXECUTABLE (${PROJECT_NAME} main.cpp) # 添加头文件 -target_include_directories(kernel PRIVATE - include -) +TARGET_INCLUDE_DIRECTORIES (kernel PRIVATE include) # 添加要链接的库 -target_link_libraries(${PROJECT_NAME} PRIVATE - kernel_link_libraries - libc - libcxx - arch - driver -) +TARGET_LINK_LIBRARIES (${PROJECT_NAME} PRIVATE kernel_link_libraries libc + libcxx arch driver) -set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") -set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${KERNEL_ELF_OUTPUT_NAME}) +SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES PREFIX "") +SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES OUTPUT_NAME + ${KERNEL_ELF_OUTPUT_NAME}) # 获取目标文件信息 -objdump_readelf_nm(${PROJECT_NAME}) +OBJDUMP_READELF_NM (${PROJECT_NAME}) diff --git a/src/kernel/arch/riscv64/boot.S b/src/kernel/arch/riscv64/boot.S index d5964f3f7..4b56a09c8 100644 --- a/src/kernel/arch/riscv64/boot.S +++ b/src/kernel/arch/riscv64/boot.S @@ -42,8 +42,11 @@ _boot: .option pop #endif - // 设置栈地址 + // 按照每个 core 设置栈地址 + add t0, a0, 1 + slli t0, t0, 12 la sp, stack_top + add sp, sp, t0 // 保存 sbi 传递的参数 // 开辟栈空间 From 0430d051864f174d475db1cf3a16e67af9f66d8d Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 10:23:34 +0800 Subject: [PATCH 091/232] feat: smp for riscv Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ed93e394..716595a40 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint From 614694e27390456c7f9aafd51efb9076b7125393 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 10:28:26 +0800 Subject: [PATCH 092/232] feat: add per_cpu Signed-off-by: Zone.NiuZH --- src/kernel/arch/riscv64/arch_main.cpp | 7 +++++++ src/kernel/include/per_cpu.hpp | 28 +++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 6c3ce8cb7..cbace8023 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -20,6 +20,7 @@ #include "kernel_elf.hpp" #include "kernel_fdt.hpp" #include "ns16550a.h" +#include "per_cpu.hpp" #include "sk_cstdio" #include "sk_libc.h" @@ -52,6 +53,8 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = reinterpret_cast(argv); } +PerCpu g_per_cpu = PerCpu(0); + auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { printf("boot hart id: %d\n", argc); printf("dtb info addr: %p\n", argv); @@ -62,6 +65,10 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { Singleton::GetInstance() = BasicInfo(argc, argv); sk_std::cout << Singleton::GetInstance(); + g_per_cpu.core_id_ = argc; + + Singleton::GetInstance().core_count++; + auto [serial_base, serial_size] = Singleton::GetInstance().GetSerial(); auto uart = Ns16550a(serial_base); diff --git a/src/kernel/include/per_cpu.hpp b/src/kernel/include/per_cpu.hpp index 0226acfa9..2e5addfe0 100644 --- a/src/kernel/include/per_cpu.hpp +++ b/src/kernel/include/per_cpu.hpp @@ -17,20 +17,36 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ #define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ +#include + #include #include #include #include -struct PerCpu { +class PerCpu { + public: /// 核心 ID - size_t core_id; -}; + size_t core_id_; + /// 中断嵌套深度 + ssize_t noff_; + /// 在进入调度线程前是否允许中断 + bool intr_enable_; -/// 最多支持 4 个核心 -constexpr size_t kMaxCoreCount = 8; + explicit PerCpu(size_t core_id) : core_id_(core_id) {} + + /// @name 构造/析构函数 + /// @{ + PerCpu() = default; + PerCpu(const PerCpu &) = default; + PerCpu(PerCpu &&) = default; + auto operator=(const PerCpu &) -> PerCpu & = default; + auto operator=(PerCpu &&) -> PerCpu & = default; + ~PerCpu() = default; + /// @} +}; /// per cpu 数据 -static std::array kPerCpu; +extern PerCpu g_per_cpu; #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ */ From fce8deb37a54bd6c27e68351e24caadfb71c8b73 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 10:29:36 +0800 Subject: [PATCH 093/232] feat: add per_cpu Signed-off-by: Zone.NiuZH --- src/kernel/arch/riscv64/arch_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index cbace8023..4a8585f3c 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -24,6 +24,8 @@ #include "sk_cstdio" #include "sk_libc.h" +PerCpu g_per_cpu = PerCpu(0); + // printf_bare_metal 基本输出实现 extern "C" void _putchar(char character) { sbi_debug_console_write_byte(character); @@ -53,8 +55,6 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = reinterpret_cast(argv); } -PerCpu g_per_cpu = PerCpu(0); - auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { printf("boot hart id: %d\n", argc); printf("dtb info addr: %p\n", argv); From 84cb85f1f711992f2cc6d0e853276eb0c114e060 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 10:53:23 +0800 Subject: [PATCH 094/232] feat: add per_cpu Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 28 +++++++++++++-------------- 3rd/cpu_io | 2 +- src/kernel/arch/riscv64/arch_main.cpp | 7 +++---- src/kernel/arch/x86_64/arch_main.cpp | 6 ++++++ 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 716595a40..80558ba1a 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=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index 8b4ba244a..59ff20b5a 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 8b4ba244adcc954c2a2ef5c88ad28248555cce4e +Subproject commit 59ff20b5a854ee8dceab47c9004337384eebf229 diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 4a8585f3c..a6f9d5bda 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -59,15 +59,14 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { printf("boot hart id: %d\n", argc); printf("dtb info addr: %p\n", argv); + g_per_cpu.core_id_ = argc; + Singleton::GetInstance() = KernelFdt(reinterpret_cast(argv)); Singleton::GetInstance() = BasicInfo(argc, argv); - sk_std::cout << Singleton::GetInstance(); - - g_per_cpu.core_id_ = argc; - Singleton::GetInstance().core_count++; + sk_std::cout << Singleton::GetInstance(); auto [serial_base, serial_size] = Singleton::GetInstance().GetSerial(); diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 79dcd45e3..400e47287 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -21,9 +21,12 @@ #include "basic_info.hpp" #include "kernel_elf.hpp" #include "kernel_log.hpp" +#include "per_cpu.hpp" #include "singleton.hpp" #include "sk_iostream" +PerCpu g_per_cpu = PerCpu(0); + // printf_bare_metal 基本输出实现 /// @note 这里要注意,保证在 serial 初始化之前不能使用 printf /// 函数,否则会有全局对象依赖问题 @@ -61,7 +64,10 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { throw; } + g_per_cpu.core_id_ = cpu_io::GetCurrentCoreId(); + Singleton::GetInstance() = BasicInfo(argc, argv); + Singleton::GetInstance().core_count++; sk_std::cout << Singleton::GetInstance(); // 解析内核 elf 信息 From 852fbbe8ed9adde81e529154d8234abb77cff3ee Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 10:53:27 +0800 Subject: [PATCH 095/232] feat: add per_cpu Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 80558ba1a..21c6348ee 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: From 706ce1c26216a9753b1bfdb819e1d6877ed73d8d Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 19:14:19 +0800 Subject: [PATCH 096/232] feat: working on spinlock Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 18 +-- 3rd/cpu_io | 2 +- CMakeLists.txt | 2 +- src/kernel/arch/riscv64/arch_main.cpp | 90 +++++++++------ src/kernel/include/kernel_log.hpp | 19 +++- src/kernel/include/per_cpu.hpp | 14 ++- src/kernel/include/spinlock.hpp | 156 ++++++++++++++++++++++++++ src/kernel/main.cpp | 14 +-- 8 files changed, 258 insertions(+), 57 deletions(-) create mode 100644 src/kernel/include/spinlock.hpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 21c6348ee..716595a40 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json + - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index 59ff20b5a..c2094821d 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 59ff20b5a854ee8dceab47c9004337384eebf229 +Subproject commit c2094821d628346d595d0857e2636f0ec66a4500 diff --git a/CMakeLists.txt b/CMakeLists.txt index 91f9def3d..25d992103 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") -machine virt -smp - 4 + 2 # 可选项,qemu7.0 自带了 opensbi1.0 -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index a6f9d5bda..120f106fe 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -24,8 +24,6 @@ #include "sk_cstdio" #include "sk_libc.h" -PerCpu g_per_cpu = PerCpu(0); - // printf_bare_metal 基本输出实现 extern "C" void _putchar(char character) { sbi_debug_console_write_byte(character); @@ -55,39 +53,67 @@ 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 { - printf("boot hart id: %d\n", argc); - printf("dtb info addr: %p\n", argv); +static bool is_init = false; - g_per_cpu.core_id_ = argc; +auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { + if (!is_init) { + printf("boot hart id: %d\n", argc); + printf("dtb info addr: %p\n", argv); + + for (auto i = 0; i < 8; i++) { + g_per_cpu[i].core_id_ = SIZE_MAX; + } + + cpu_io::Tp::Write(argc); + g_per_cpu[argc].core_id_ = argc; + + Singleton::GetInstance() = + KernelFdt(reinterpret_cast(argv)); + + Singleton::GetInstance() = BasicInfo(argc, argv); + // sk_std::cout << Singleton::GetInstance(); + + auto [serial_base, serial_size] = + Singleton::GetInstance().GetSerial(); + auto uart = Ns16550a(serial_base); + uart.PutChar('H'); + uart.PutChar('e'); + uart.PutChar('l'); + uart.PutChar('l'); + uart.PutChar('o'); + uart.PutChar(' '); + uart.PutChar('u'); + uart.PutChar('a'); + uart.PutChar('r'); + uart.PutChar('t'); + uart.PutChar('!'); + uart.PutChar('\n'); + + // 解析内核 elf 信息 + Singleton::GetInstance() = KernelElf(); + + // klog::Info("Hello riscv64 ArchInit\n"); + + sbi_hart_start(0, 0x0000000080210000, 0); + sbi_hart_start(1, 0x0000000080210000, 0); + sbi_hart_start(2, 0x0000000080210000, 0); + sbi_hart_start(3, 0x0000000080210000, 0); + + is_init = true; + } + // 将 core id 保存到 tp 寄存器 + cpu_io::Tp::Write(argc); + g_per_cpu[argc].core_id_ = argc; + Singleton::GetInstance().core_count++; - Singleton::GetInstance() = - KernelFdt(reinterpret_cast(argv)); + klog::Info("Helloa\n"); + klog::Info("Hellob\n"); + klog::Info("Helloc\n"); + klog::Info("Hellod\n"); - Singleton::GetInstance() = BasicInfo(argc, argv); - Singleton::GetInstance().core_count++; - sk_std::cout << Singleton::GetInstance(); - - auto [serial_base, serial_size] = - Singleton::GetInstance().GetSerial(); - auto uart = Ns16550a(serial_base); - uart.PutChar('H'); - uart.PutChar('e'); - uart.PutChar('l'); - uart.PutChar('l'); - uart.PutChar('o'); - uart.PutChar(' '); - uart.PutChar('u'); - uart.PutChar('a'); - uart.PutChar('r'); - uart.PutChar('t'); - uart.PutChar('!'); - uart.PutChar('\n'); - - // 解析内核 elf 信息 - Singleton::GetInstance() = KernelElf(); - - klog::Info("Hello riscv64 ArchInit\n"); + while (true) { + ; + } return 0; } diff --git a/src/kernel/include/kernel_log.hpp b/src/kernel/include/kernel_log.hpp index cf993c2d9..8fd17bf01 100644 --- a/src/kernel/include/kernel_log.hpp +++ b/src/kernel/include/kernel_log.hpp @@ -23,6 +23,7 @@ #include "../../project_config.h" #include "sk_cstdio" #include "sk_iostream" +#include "spinlock.hpp" namespace klog { namespace logger { @@ -37,6 +38,8 @@ constexpr const auto kMagenta = "\033[35m"; constexpr const auto kCyan = "\033[36m"; constexpr const auto kWhite = "\033[37m"; +static SpinLock logger_lock("klog::logger"); + template class Logger : public sk_std::ostream { public: @@ -94,40 +97,48 @@ class Logger : public sk_std::ostream { extern "C" inline void Debug(const char* format, ...) { (void)format; #ifdef SIMPLEKERNEL_DEBUG_LOG + logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s", logger::kMagenta); + printf("%s[%d] ", logger::kMagenta, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); + logger::logger_lock.unlock(); #endif } extern "C" inline void Info(const char* format, ...) { + logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s", logger::kCyan); + printf("%s[%d] ", logger::kCyan, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); + logger::logger_lock.unlock(); } extern "C" inline void Warn(const char* format, ...) { + logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s", logger::kYellow); + printf("%s[%d] ", logger::kYellow, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); + logger::logger_lock.unlock(); } extern "C" inline void Err(const char* format, ...) { + logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s", logger::kRed); + printf("%s[%d] ", logger::kRed, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); + logger::logger_lock.unlock(); } [[maybe_unused]] static logger::Logger info; diff --git a/src/kernel/include/per_cpu.hpp b/src/kernel/include/per_cpu.hpp index 2e5addfe0..c45a0351c 100644 --- a/src/kernel/include/per_cpu.hpp +++ b/src/kernel/include/per_cpu.hpp @@ -20,12 +20,16 @@ #include #include +#include #include #include #include class PerCpu { public: + /// 最大 CPU 数 + static constexpr size_t kMaxCoreCount = 8; + /// 核心 ID size_t core_id_; /// 中断嵌套深度 @@ -33,11 +37,15 @@ class PerCpu { /// 在进入调度线程前是否允许中断 bool intr_enable_; - explicit PerCpu(size_t core_id) : core_id_(core_id) {} + PerCpu() { + core_id_ = SIZE_MAX; + noff_ = 0; + intr_enable_ = false; + } + // explicit PerCpu(size_t core_id) : core_id_(core_id) {} /// @name 构造/析构函数 /// @{ - PerCpu() = default; PerCpu(const PerCpu &) = default; PerCpu(PerCpu &&) = default; auto operator=(const PerCpu &) -> PerCpu & = default; @@ -47,6 +55,6 @@ class PerCpu { }; /// per cpu 数据 -extern PerCpu g_per_cpu; +static std::array g_per_cpu{}; #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ */ diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp new file mode 100644 index 000000000..d0807c064 --- /dev/null +++ b/src/kernel/include/spinlock.hpp @@ -0,0 +1,156 @@ + +/** + * @file spinlock.hpp + * @brief 自旋锁 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2022-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2022-01-01MRNIU迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_SPINLOCK_HPP_ +#define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_SPINLOCK_HPP_ + +#include + +#include +#include + +#include "per_cpu.hpp" +#include "sk_stdio.h" + +/** + * @brief 自旋锁 + */ +class SpinLock { + public: + SpinLock() : locked_(ATOMIC_FLAG_INIT), core_id_(SIZE_MAX) {} + + /** + * @brief 构造函数 + * @param _name 锁名 + * @note 需要堆初始化后可用 + */ + explicit SpinLock(const char *_name) + : locked_(ATOMIC_FLAG_INIT), name_(_name), core_id_(SIZE_MAX) {} + + /// @name 构造/析构函数 + /// @{ + SpinLock(const SpinLock &) = default; + SpinLock(SpinLock &&) = default; + auto operator=(const SpinLock &) -> SpinLock & = default; + auto operator=(SpinLock &&) -> SpinLock & = default; + ~SpinLock() = default; + /// @} + + /** + * @brief 获得锁 + */ + void lock() { + DisableInterruptsNested(); + if (IsLockedByCurrentCore()) { + // printf("spinlock %s IsLockedByCurrentCore == true.\n", name_); + printf("A"); + } + while (locked_.test_and_set(std::memory_order_acquire)) { + ; + } + + std::atomic_signal_fence(std::memory_order_acquire); + std::atomic_thread_fence(std::memory_order_acquire); + + core_id_ = cpu_io::GetCurrentCoreId(); + } + + /** + * @brief 释放锁 + */ + void unlock() { + if (!locked_._M_i) { + printf("-"); + while (true) { + ; + } + } + if (!IsLockedByCurrentCore()) { + // printf("spinlock %s IsLockedByCurrentCore == false.\n", name_); + printf("C"); + } + core_id_ = SIZE_MAX; + + std::atomic_signal_fence(std::memory_order_release); + std::atomic_thread_fence(std::memory_order_release); + + locked_.clear(std::memory_order_release); + + RestoreInterruptsNested(); + } + + // friend std::ostream &operator<<(std::ostream &_os, + // const SpinLock &_spinlock) { + // printf("spinlock(%s) hart 0x%X %s\n", _spinlock.name_, + // _spinlock.core_id_, + // (_spinlock.locked_._M_i ? "locked_" : "unlock")); + // return _os; + // } + + private: + /// 自旋锁名称 + const char *name_{"unnamed"}; + /// 是否 lock + std::atomic_flag locked_; + /// 获得此锁的 core_id_ + std::atomic core_id_; + + /** + * @brief 检查当前 core 是否获得此锁 + * @return true 是 + * @return false 否 + */ + auto IsLockedByCurrentCore() -> bool { + return locked_._M_i && (core_id_ == cpu_io::GetCurrentCoreId()); + } + + /** + * @brief 中断嵌套+1 + */ + static void DisableInterruptsNested() { + bool old = cpu_io::GetInterruptStatus(); + + cpu_io::DisableInterrupt(); + + if (g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ == 0) { + g_per_cpu[cpu_io::GetCurrentCoreId()].intr_enable_ = old; + } + g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ += 1; + } + + /** + * @brief 中断嵌套-1 + */ + static void RestoreInterruptsNested() { + if (cpu_io::GetInterruptStatus()) { + // printf("RestoreInterruptsNested - interruptible\n"); + printf("D"); + } + + if (g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ < 1) { + // printf("RestoreInterruptsNested\n"); + // printf("E"); + } + g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ -= 1; + + if ((g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ == 0) && + (g_per_cpu[cpu_io::GetCurrentCoreId()].intr_enable_)) { + cpu_io::EnableInterrupt(); + } + } +}; + +#endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_SPINLOCK_HPP_ */ diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 9068d97b1..0f15e9e72 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -37,19 +37,19 @@ auto main(uint32_t argc, uint8_t *argv) -> uint32_t { // 架构相关初始化 [[maybe_unused]] auto arch_init_ret = ArchInit(argc, argv); - printf("Hello SimpleKernel\n"); + // 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; + // sk_std::cout << "Hello ostream" << sk_std::endl; return 0; } From 64db1b0e8a7f61adf709f32cfc754f30b3885ca1 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Sun, 5 Jan 2025 23:25:18 +0800 Subject: [PATCH 097/232] feat: working on spinlock Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 14 +++++++------- CMakeLists.txt | 4 +++- src/kernel/arch/riscv64/arch_main.cpp | 8 ++++---- src/kernel/include/spinlock.hpp | 16 +++++++--------- test/unit_test/CMakeLists.txt | 3 ++- test/unit_test/spinlock_test.cpp | 23 +++++++++++++++++++++++ 6 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 test/unit_test/spinlock_test.cpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 716595a40..4fd37ecbb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: diff --git a/CMakeLists.txt b/CMakeLists.txt index 25d992103..db81f2700 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,8 @@ IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") QEMU_FLAGS -m 128M + -smp + 4 -net none -bios @@ -65,7 +67,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") -machine virt -smp - 2 + 4 # 可选项,qemu7.0 自带了 opensbi1.0 -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 120f106fe..b7f0d9882 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -106,10 +106,10 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { g_per_cpu[argc].core_id_ = argc; Singleton::GetInstance().core_count++; - klog::Info("Helloa\n"); - klog::Info("Hellob\n"); - klog::Info("Helloc\n"); - klog::Info("Hellod\n"); + // klog::Info("Helloa\n"); + // klog::Info("Hellob\n"); + // klog::Info("Helloc\n"); + // klog::Info("Hellod\n"); while (true) { ; diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp index d0807c064..624b9e557 100644 --- a/src/kernel/include/spinlock.hpp +++ b/src/kernel/include/spinlock.hpp @@ -23,25 +23,23 @@ #include #include "per_cpu.hpp" -#include "sk_stdio.h" +#include "sk_cstdio" /** * @brief 自旋锁 */ class SpinLock { public: - SpinLock() : locked_(ATOMIC_FLAG_INIT), core_id_(SIZE_MAX) {} - /** * @brief 构造函数 * @param _name 锁名 * @note 需要堆初始化后可用 */ - explicit SpinLock(const char *_name) - : locked_(ATOMIC_FLAG_INIT), name_(_name), core_id_(SIZE_MAX) {} + explicit SpinLock(const char *_name) : name_(_name) {} /// @name 构造/析构函数 /// @{ + SpinLock() = default; SpinLock(const SpinLock &) = default; SpinLock(SpinLock &&) = default; auto operator=(const SpinLock &) -> SpinLock & = default; @@ -53,7 +51,7 @@ class SpinLock { * @brief 获得锁 */ void lock() { - DisableInterruptsNested(); + // DisableInterruptsNested(); if (IsLockedByCurrentCore()) { // printf("spinlock %s IsLockedByCurrentCore == true.\n", name_); printf("A"); @@ -89,7 +87,7 @@ class SpinLock { locked_.clear(std::memory_order_release); - RestoreInterruptsNested(); + // RestoreInterruptsNested(); } // friend std::ostream &operator<<(std::ostream &_os, @@ -104,9 +102,9 @@ class SpinLock { /// 自旋锁名称 const char *name_{"unnamed"}; /// 是否 lock - std::atomic_flag locked_; + std::atomic_flag locked_{ATOMIC_FLAG_INIT}; /// 获得此锁的 core_id_ - std::atomic core_id_; + size_t core_id_{SIZE_MAX}; /** * @brief 检查当前 core 是否获得此锁 diff --git a/test/unit_test/CMakeLists.txt b/test/unit_test/CMakeLists.txt index c7b4c5f31..1f862c346 100644 --- a/test/unit_test/CMakeLists.txt +++ b/test/unit_test/CMakeLists.txt @@ -8,7 +8,8 @@ PROJECT (unit-test VERSION 0.0.1) ENABLE_LANGUAGE (CXX) -ADD_EXECUTABLE (${PROJECT_NAME} kernel_elf_test.cpp kernel_fdt_test.cpp) +ADD_EXECUTABLE (${PROJECT_NAME} kernel_elf_test.cpp kernel_fdt_test.cpp + spinlock_test.cpp) TARGET_INCLUDE_DIRECTORIES ( ${PROJECT_NAME} PRIVATE ./ ${CMAKE_SOURCE_DIR}/src/kernel/include diff --git a/test/unit_test/spinlock_test.cpp b/test/unit_test/spinlock_test.cpp new file mode 100644 index 000000000..3bcb8fe5f --- /dev/null +++ b/test/unit_test/spinlock_test.cpp @@ -0,0 +1,23 @@ + +/** + * @file spinlock_test.cpp + * @brief 自旋锁 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2022-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2022-01-01MRNIU迁移到 doxygen + *
+ */ + +#include "spinlock.hpp" + +#include +#include + +#include +#include From a04ef6ecfa12dca75adf0affa62c5b021f09cd89 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 02:27:25 +0000 Subject: [PATCH 098/232] 3rd: update cpu_io Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++++++++++-------------- 3rd/cpu_io | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4fd37ecbb..405c4f002 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_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=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/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=/home/ubuntu/github/MRNIU/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=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/home/ubuntu/github/MRNIU/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/3rd/cpu_io b/3rd/cpu_io index c2094821d..43725dcd6 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit c2094821d628346d595d0857e2636f0ec66a4500 +Subproject commit 43725dcd6808864f195d8a178c096a77e785a6ce From 178926c7e4b35d7b045675c63bb8760bd380795b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 02:29:31 +0000 Subject: [PATCH 099/232] fix: clang-tidy Signed-off-by: Zone.N --- .pre-commit-config.yaml | 14 +++++++------- src/kernel/include/kernel_log.hpp | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 405c4f002..f09ff93f5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/root/SimpleKernel/build_aarch64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -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: diff --git a/src/kernel/include/kernel_log.hpp b/src/kernel/include/kernel_log.hpp index 8fd17bf01..a5a33a9c1 100644 --- a/src/kernel/include/kernel_log.hpp +++ b/src/kernel/include/kernel_log.hpp @@ -100,7 +100,7 @@ extern "C" inline void Debug(const char* format, ...) { logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s[%d] ", logger::kMagenta, cpu_io::GetCurrentCoreId()); + printf("%s[%ld] ", logger::kMagenta, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); @@ -112,7 +112,7 @@ extern "C" inline void Info(const char* format, ...) { logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s[%d] ", logger::kCyan, cpu_io::GetCurrentCoreId()); + printf("%s[%ld] ", logger::kCyan, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); @@ -123,7 +123,7 @@ extern "C" inline void Warn(const char* format, ...) { logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s[%d] ", logger::kYellow, cpu_io::GetCurrentCoreId()); + printf("%s[%ld] ", logger::kYellow, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); @@ -134,7 +134,7 @@ extern "C" inline void Err(const char* format, ...) { logger::logger_lock.lock(); va_list args; va_start(args, format); - printf("%s[%d] ", logger::kRed, cpu_io::GetCurrentCoreId()); + printf("%s[%ld] ", logger::kRed, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); From 2ca971806e4b60d0975b62a918f4c751c992afd9 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 05:39:54 +0000 Subject: [PATCH 100/232] 3rd: update cmake Signed-off-by: Zone.N --- .pre-commit-config.yaml | 30 +++++++++--------- cmake/3rd.cmake | 67 ++++++++++++++++++++++++++--------------- 2 files changed, 57 insertions(+), 40 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..ef74b5a44 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_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 + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index c2de08524..275fb71d6 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -129,18 +129,27 @@ SET (dtc_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/dtc) SET (dtc_CC ${CMAKE_C_COMPILER}) SET (dtc_AR ${CMAKE_AR}) # 编译 libfdt -ADD_CUSTOM_TARGET ( - dtc - COMMENT "build libdtc..." - # make 时编译 - ALL - WORKING_DIRECTORY ${dtc_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${dtc_BINARY_DIR}/libfdt - COMMAND CC=${dtc_CC} AR=${dtc_AR} HOME=${dtc_BINARY_DIR} make - libfdt/libfdt.a - COMMAND ${CMAKE_COMMAND} -E copy ${dtc_SOURCE_DIR}/libfdt/*.a - ${dtc_SOURCE_DIR}/libfdt/*.h ${dtc_BINARY_DIR}/libfdt - COMMAND make clean) +IF(NOT EXISTS ${dtc_BINARY_DIR}/libfdt/libfdt.a) + ADD_CUSTOM_TARGET ( + dtc + COMMENT "build libdtc..." + # make 时编译 + ALL + WORKING_DIRECTORY ${dtc_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dtc_BINARY_DIR}/libfdt + COMMAND CC=${dtc_CC} AR=${dtc_AR} HOME=${dtc_BINARY_DIR} make + libfdt/libfdt.a + COMMAND ${CMAKE_COMMAND} -E copy ${dtc_SOURCE_DIR}/libfdt/*.a + ${dtc_SOURCE_DIR}/libfdt/*.h ${dtc_BINARY_DIR}/libfdt + COMMAND make clean) +ELSE() + ADD_CUSTOM_TARGET ( + dtc + COMMENT "libdtc already exists, skipping..." + # make 时编译 + ALL + WORKING_DIRECTORY ${dtc_SOURCE_DIR}) +ENDIF() ADD_LIBRARY (dtc-lib INTERFACE) ADD_DEPENDENCIES (dtc-lib dtc) TARGET_INCLUDE_DIRECTORIES (dtc-lib INTERFACE ${dtc_BINARY_DIR}/libfdt) @@ -165,19 +174,27 @@ ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64" AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") SET (CROSS_COMPILE_ aarch64-linux-gnu-) ENDIF() -# 编译 gnu-efi -ADD_CUSTOM_TARGET ( - gnu-efi - COMMENT "build gnu-efi..." - # make 时编译 - ALL - WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${gnu-efi_BINARY_DIR} - COMMAND # @note 仅支持 gcc - make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_} - ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1 - COMMAND ${CMAKE_COMMAND} -E copy_directory ${gnu-efi_SOURCE_DIR}/inc - ${gnu-efi_BINARY_DIR}/inc) +IF(NOT EXISTS ${gnu-efi_BINARY_DIR}/lib/libefi.a) + # 编译 gnu-efi + ADD_CUSTOM_TARGET ( + gnu-efi + COMMENT "build gnu-efi..." + # make 时编译 + ALL + WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${gnu-efi_BINARY_DIR} + COMMAND # @note 仅支持 gcc + make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_} + ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1 + COMMAND ${CMAKE_COMMAND} -E copy_directory ${gnu-efi_SOURCE_DIR}/inc + ${gnu-efi_BINARY_DIR}/inc) +ELSE() + ADD_CUSTOM_TARGET ( + gnu-efi + COMMENT "gnu-efi already exists, skipping..." + ALL + WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR}) +ENDIF() ADD_LIBRARY (gnu-efi-lib INTERFACE) ADD_DEPENDENCIES (gnu-efi-lib gnu-efi) TARGET_INCLUDE_DIRECTORIES ( From 15f3d1135f336a90db11376f513b2f1c0a5d4c94 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 05:52:34 +0000 Subject: [PATCH 101/232] fix: update aarch64 cxx flags Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- cmake/compile_config.cmake | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ef74b5a44..befc52f71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/cmake/compile_config.cmake b/cmake/compile_config.cmake index ade74671a..b2392be57 100644 --- a/cmake/compile_config.cmake +++ b/cmake/compile_config.cmake @@ -68,6 +68,7 @@ TARGET_COMPILE_OPTIONS ( -march=armv8-a # 针对 cortex-a72 优化代码 -mtune=cortex-a72 + -mno-outline-atomics > # gcc 特定选项 $<$: From a1bdd3f0c2f4ed549630cd5a2686afb13a6a6125 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 06:02:41 +0000 Subject: [PATCH 102/232] feat: enable smp for x86_64 and aarch64 Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- CMakeLists.txt | 4 +++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..405c4f002 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_riscv64/compiler_commands.json + - -p=/root/SimpleKernel/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/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --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_riscv64/build_x86_64/compiler_commands.json + # - -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/CMakeLists.txt b/CMakeLists.txt index db81f2700..ce49cae5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") -machine virt -smp - 4 + 2 # 可选项,qemu7.0 自带了 opensbi1.0 -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf @@ -88,6 +88,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") cortex-a72 -m 128M + -smp + 4 -net none -kernel From 958bbdad2eb6e51e2d831c46a9ddee8ac1e6de4e Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 06:12:02 +0000 Subject: [PATCH 103/232] feat: enable smp for x86_64 and aarch64 Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- src/kernel/arch/x86_64/arch_main.cpp | 4 +--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 405c4f002..09286cfad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/root/SimpleKernel/build_x86_64/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).* + - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_x86_64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_x86_64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 400e47287..3ca1dfd20 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -25,8 +25,6 @@ #include "singleton.hpp" #include "sk_iostream" -PerCpu g_per_cpu = PerCpu(0); - // printf_bare_metal 基本输出实现 /// @note 这里要注意,保证在 serial 初始化之前不能使用 printf /// 函数,否则会有全局对象依赖问题 @@ -64,7 +62,7 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { throw; } - g_per_cpu.core_id_ = cpu_io::GetCurrentCoreId(); + g_per_cpu[cpu_io::GetCurrentCoreId()].core_id_ = cpu_io::GetCurrentCoreId(); Singleton::GetInstance() = BasicInfo(argc, argv); Singleton::GetInstance().core_count++; From f73f3b4359b8b21072a07f8b8933221ff49ef1dd Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 06:44:34 +0000 Subject: [PATCH 104/232] feat: enable smp for riscv64 Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- CMakeLists.txt | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09286cfad..befc52f71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_x86_64/compiler_commands.json + - -p=/root/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + - --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_x86_64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index ce49cae5f..49ba246f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") -machine virt -smp - 2 + 4 # 可选项,qemu7.0 自带了 opensbi1.0 -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf From acffbe15875f03f09ea5141bf2b4ff07797db506 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 07:40:44 +0000 Subject: [PATCH 105/232] fix: spinlock Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++----- src/kernel/arch/riscv64/arch_main.cpp | 10 ---- src/kernel/include/spinlock.hpp | 61 ++++++++++----------- src/kernel/main.cpp | 7 ++- test/unit_test/spinlock_test.cpp | 76 +++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 57 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..f09ff93f5 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/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index b7f0d9882..844fd24fe 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -93,7 +93,6 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { Singleton::GetInstance() = KernelElf(); // klog::Info("Hello riscv64 ArchInit\n"); - sbi_hart_start(0, 0x0000000080210000, 0); sbi_hart_start(1, 0x0000000080210000, 0); sbi_hart_start(2, 0x0000000080210000, 0); @@ -106,14 +105,5 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { g_per_cpu[argc].core_id_ = argc; Singleton::GetInstance().core_count++; - // klog::Info("Helloa\n"); - // klog::Info("Hellob\n"); - // klog::Info("Helloc\n"); - // klog::Info("Hellod\n"); - - while (true) { - ; - } - return 0; } diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp index 624b9e557..584d53630 100644 --- a/src/kernel/include/spinlock.hpp +++ b/src/kernel/include/spinlock.hpp @@ -51,10 +51,9 @@ class SpinLock { * @brief 获得锁 */ void lock() { - // DisableInterruptsNested(); + DisableInterruptsNested(); if (IsLockedByCurrentCore()) { - // printf("spinlock %s IsLockedByCurrentCore == true.\n", name_); - printf("A"); + printf("spinlock %s IsLockedByCurrentCore == true.\n", name_); } while (locked_.test_and_set(std::memory_order_acquire)) { ; @@ -63,22 +62,15 @@ class SpinLock { std::atomic_signal_fence(std::memory_order_acquire); std::atomic_thread_fence(std::memory_order_acquire); - core_id_ = cpu_io::GetCurrentCoreId(); + core_id_ = core_id(); } /** * @brief 释放锁 */ void unlock() { - if (!locked_._M_i) { - printf("-"); - while (true) { - ; - } - } if (!IsLockedByCurrentCore()) { - // printf("spinlock %s IsLockedByCurrentCore == false.\n", name_); - printf("C"); + printf("spinlock %s IsLockedByCurrentCore == false.\n", name_); } core_id_ = SIZE_MAX; @@ -87,7 +79,7 @@ class SpinLock { locked_.clear(std::memory_order_release); - // RestoreInterruptsNested(); + RestoreInterruptsNested(); } // friend std::ostream &operator<<(std::ostream &_os, @@ -98,7 +90,7 @@ class SpinLock { // return _os; // } - private: + protected: /// 自旋锁名称 const char *name_{"unnamed"}; /// 是否 lock @@ -106,47 +98,52 @@ class SpinLock { /// 获得此锁的 core_id_ size_t core_id_{SIZE_MAX}; + virtual void intr_on() const { cpu_io::EnableInterrupt(); } + virtual void intr_off() const { cpu_io::DisableInterrupt(); } + virtual auto intr_status() const -> bool { + return cpu_io::GetInterruptStatus(); + } + virtual auto core_id() const -> size_t { return cpu_io::GetCurrentCoreId(); } + /** * @brief 检查当前 core 是否获得此锁 * @return true 是 * @return false 否 */ auto IsLockedByCurrentCore() -> bool { - return locked_._M_i && (core_id_ == cpu_io::GetCurrentCoreId()); + return locked_._M_i && (core_id_ == core_id()); } /** * @brief 中断嵌套+1 */ - static void DisableInterruptsNested() { - bool old = cpu_io::GetInterruptStatus(); + void DisableInterruptsNested() { + bool old = intr_status(); - cpu_io::DisableInterrupt(); + intr_off(); - if (g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ == 0) { - g_per_cpu[cpu_io::GetCurrentCoreId()].intr_enable_ = old; + if (g_per_cpu[core_id()].noff_ == 0) { + g_per_cpu[core_id()].intr_enable_ = old; } - g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ += 1; + g_per_cpu[core_id()].noff_ += 1; } /** * @brief 中断嵌套-1 */ - static void RestoreInterruptsNested() { - if (cpu_io::GetInterruptStatus()) { - // printf("RestoreInterruptsNested - interruptible\n"); - printf("D"); + void RestoreInterruptsNested() { + if (intr_status()) { + printf("RestoreInterruptsNested - interruptible\n"); } - if (g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ < 1) { - // printf("RestoreInterruptsNested\n"); - // printf("E"); + if (g_per_cpu[core_id()].noff_ < 1) { + printf("RestoreInterruptsNested\n"); } - g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ -= 1; + g_per_cpu[core_id()].noff_ -= 1; - if ((g_per_cpu[cpu_io::GetCurrentCoreId()].noff_ == 0) && - (g_per_cpu[cpu_io::GetCurrentCoreId()].intr_enable_)) { - cpu_io::EnableInterrupt(); + if ((g_per_cpu[core_id()].noff_ == 0) && + (g_per_cpu[core_id()].intr_enable_)) { + intr_on(); } } }; diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 0f15e9e72..247c22380 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -22,8 +22,13 @@ #include "sk_iostream" #include "sk_libcxx.h" +static bool is_init = false; + void _start(uint32_t argc, uint8_t *argv) { - CppInit(); + if (is_init == false) { + is_init = true; + CppInit(); + } main(argc, argv); CppDeInit(); diff --git a/test/unit_test/spinlock_test.cpp b/test/unit_test/spinlock_test.cpp index 3bcb8fe5f..a11f3e700 100644 --- a/test/unit_test/spinlock_test.cpp +++ b/test/unit_test/spinlock_test.cpp @@ -19,5 +19,81 @@ #include #include +#include #include #include + +class TestableSpinLock : public SpinLock { + public: + using SpinLock::SpinLock; + + // Expose protected methods for testing + using SpinLock::DisableInterruptsNested; + using SpinLock::IsLockedByCurrentCore; + using SpinLock::RestoreInterruptsNested; + + void intr_on() const override {} + void intr_off() const override {} + auto intr_status() const -> bool override { return false; } + auto core_id() const -> size_t override { + return std::hash{}(std::this_thread::get_id()); + } +}; + +class TestableSpinLockTest : public ::testing::Test { + public: + TestableSpinLock spinlock{"test_spinlock"}; +}; + +TEST_F(TestableSpinLockTest, LockUnlockTest) { + EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); + + spinlock.lock(); + EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); + + spinlock.unlock(); + EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); +} + +TEST_F(TestableSpinLockTest, MultiThreadLockUnlockTest) { + auto thread_func = [this](const std::string& name) { + spinlock.lock(); + EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + spinlock.unlock(); + EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); + + spinlock.lock(); + EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + spinlock.unlock(); + EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); + + spinlock.lock(); + EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + spinlock.unlock(); + EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); + + spinlock.lock(); + EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); + + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + spinlock.unlock(); + EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); + }; + + std::vector threads; + for (int i = 0; i < 100; ++i) { + threads.emplace_back(thread_func, "thread" + std::to_string(i + 1)); + } + + for (auto& thread : threads) { + thread.detach(); + } + + std::this_thread::sleep_for(std::chrono::seconds(8)); +} From 4ce4aa79bd7d888d054ee47ff3769b6717178bdd Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:32:08 +0000 Subject: [PATCH 106/232] style: update Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++------ src/kernel/libcxx/sk_libcxx.cpp | 86 +++++++++++++++++---------------- 2 files changed, 59 insertions(+), 55 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..befc52f71 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_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 + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/libcxx/sk_libcxx.cpp b/src/kernel/libcxx/sk_libcxx.cpp index 46cdff92b..7b4eadfef 100644 --- a/src/kernel/libcxx/sk_libcxx.cpp +++ b/src/kernel/libcxx/sk_libcxx.cpp @@ -19,18 +19,18 @@ #include /// 全局构造函数函数指针 -typedef void (*function_t)(void); +using function_t = void (*)(); // 在 link.ld 中定义 /// 全局构造函数函数指针起点地址 -extern "C" function_t __init_array_start; +extern "C" function_t _init_array_start; /// 全局构造函数函数指针终点地址 -extern "C" function_t __init_array_end; +extern "C" function_t _init_array_end; /// 全局析构函数函数指针起点地址 -extern "C" function_t __fini_array_start; +extern "C" function_t _fini_array_start; /// 全局析构函数函数指针终点地址 -extern "C" function_t __fini_array_end; +extern "C" function_t _fini_array_end; /// 动态共享对象标识,内核使用静态链接,此变量在内核中没有使用 -void* __dso_handle = nullptr; +void* dso_handle = nullptr; /// 最大析构函数数量 static constexpr const size_t kMaxAtExitFuncsCount = 128; @@ -46,9 +46,9 @@ struct atexit_func_entry_t { }; /// 析构函数数组 -static atexit_func_entry_t __atexit_funcs[kMaxAtExitFuncsCount]; +static atexit_func_entry_t atexit_funcs[kMaxAtExitFuncsCount]; // NOLINT /// 析构函数个数 -static size_t __atexit_func_count = 0; +static size_t atexit_func_count = 0; /** * 注册在程序正常终止时调用的析构函数 @@ -56,15 +56,15 @@ static size_t __atexit_func_count = 0; * @param obj_ptr 传递给析构函数的参数 * @return 成功返回 0 */ -extern "C" int __cxa_atexit(void (*destructor_func)(void*), void* obj_ptr, - void*) { - if (__atexit_func_count >= kMaxAtExitFuncsCount) { +extern "C" auto _cxa_atexit(void (*destructor_func)(void*), void* obj_ptr, + void*) -> int { + if (atexit_func_count >= kMaxAtExitFuncsCount) { return -1; } - __atexit_funcs[__atexit_func_count].destructor_func = destructor_func; - __atexit_funcs[__atexit_func_count].obj_ptr = obj_ptr; - __atexit_funcs[__atexit_func_count].dso_handle = nullptr; - __atexit_func_count++; + atexit_funcs[atexit_func_count].destructor_func = destructor_func; + atexit_funcs[atexit_func_count].obj_ptr = obj_ptr; + atexit_funcs[atexit_func_count].dso_handle = nullptr; + atexit_func_count++; return 0; } @@ -73,20 +73,20 @@ extern "C" int __cxa_atexit(void (*destructor_func)(void*), void* obj_ptr, * @param destructor_func 要调用的析构函数指针,为 nullptr * 时调用所有注册的析构函数。 */ -extern "C" void __cxa_finalize(void* destructor_func) { - if (!destructor_func) { +extern "C" void _cxa_finalize(void* destructor_func) { + if (destructor_func == nullptr) { // 如果 destructor_func 为 nullptr,调用所有析构函数 - for (auto i = __atexit_func_count - 1; i != 0; i--) { - if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + for (auto i = atexit_func_count - 1; i != 0; i--) { + if (atexit_funcs[i].destructor_func != nullptr) { + (*atexit_funcs[i].destructor_func)(atexit_funcs[i].obj_ptr); } } } else { // 不为空时只调用对应的析构函数 - for (auto i = __atexit_func_count - 1; i != 0; i--) { - if ((void*)__atexit_funcs[i].destructor_func == destructor_func) { - (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); - __atexit_funcs[i].destructor_func = nullptr; + for (auto i = atexit_func_count - 1; i != 0; i--) { + if ((void*)atexit_funcs[i].destructor_func == destructor_func) { + (*atexit_funcs[i].destructor_func)(atexit_funcs[i].obj_ptr); + atexit_funcs[i].destructor_func = nullptr; } } } @@ -124,11 +124,11 @@ struct GuardType { * @param guard 锁,一个 64 位变量 * @return 未初始化返回非零值,已初始化返回 0 */ -extern "C" int __cxa_guard_acquire(GuardType* guard) { - if (!guard->is_in_use && !guard->is_initialized) { +extern "C" auto _cxa_guard_acquire(GuardType* guard) -> int { + if ((guard->is_in_use == 0U) && (guard->is_initialized == 0U)) { guard->is_in_use = 1; } - return !guard->is_initialized; + return static_cast(static_cast(guard->is_initialized) == 0U); } /** @@ -136,7 +136,7 @@ extern "C" int __cxa_guard_acquire(GuardType* guard) { * @param guard 锁,一个 64 位变量 * @return 未初始化返回非零值并设置锁,已初始化返回 0 */ -extern "C" void __cxa_guard_release(GuardType* guard) { +extern "C" void _cxa_guard_release(GuardType* guard) { guard->is_in_use = 0; guard->is_initialized = 1; } @@ -145,7 +145,7 @@ extern "C" void __cxa_guard_release(GuardType* guard) { * 如果在初始化过程中出现异常或其他错误,调用此函数以释放锁而不标记变量为已初始化 * @param guard 锁 */ -extern "C" void __cxa_guard_abort(GuardType* guard) { +extern "C" void _cxa_guard_abort(GuardType* guard) { guard->is_in_use = 0; guard->is_initialized = 0; } @@ -155,42 +155,46 @@ extern "C" void __cxa_guard_abort(GuardType* guard) { /** * 纯虚函数调用处理 */ -extern "C" void __cxa_pure_virtual() { - while (1) +extern "C" void _cxa_pure_virtual() { + while (true) { ; + } } /** * 异常处理 * @note 这里只能处理 throw,无法处理异常类型 */ -extern "C" void __cxa_rethrow() { - while (1) +extern "C" void _cxa_rethrow() { + while (true) { ; + } } -extern "C" void _Unwind_Resume() { - while (1) +extern "C" void Unwind_Resume() { + while (true) { ; + } } -extern "C" void __gxx_personality_v0() { - while (1) +extern "C" void _gxx_personality_v0() { + while (true) { ; + } } /** * c++ 全局对象构造 */ -void CppInit(void) { +void CppInit() { // 调用构造函数 - std::for_each(&__init_array_start, &__init_array_end, + std::for_each(&_init_array_start, &_init_array_end, [](function_t func) { (func)(); }); } /** * c++ 全局对象析构 */ -void CppDeInit(void) { +void CppDeInit() { // 调用析构函数 - std::for_each(&__fini_array_start, &__fini_array_end, + std::for_each(&_fini_array_start, &_fini_array_end, [](function_t func) { (func)(); }); } From 76f5dfdbd41feaed58f93881849d99a65ecdfd1c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:39:14 +0000 Subject: [PATCH 107/232] style: update Signed-off-by: Zone.N --- src/kernel/libcxx/sk_libcxx.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/kernel/libcxx/sk_libcxx.cpp b/src/kernel/libcxx/sk_libcxx.cpp index 7b4eadfef..0bb1f7653 100644 --- a/src/kernel/libcxx/sk_libcxx.cpp +++ b/src/kernel/libcxx/sk_libcxx.cpp @@ -22,13 +22,13 @@ using function_t = void (*)(); // 在 link.ld 中定义 /// 全局构造函数函数指针起点地址 -extern "C" function_t _init_array_start; +extern "C" function_t __init_array_start; // NOLINT /// 全局构造函数函数指针终点地址 -extern "C" function_t _init_array_end; +extern "C" function_t __init_array_end; // NOLINT /// 全局析构函数函数指针起点地址 -extern "C" function_t _fini_array_start; +extern "C" function_t __fini_array_start; // NOLINT /// 全局析构函数函数指针终点地址 -extern "C" function_t _fini_array_end; +extern "C" function_t __fini_array_end; // NOLINT /// 动态共享对象标识,内核使用静态链接,此变量在内核中没有使用 void* dso_handle = nullptr; @@ -186,7 +186,7 @@ extern "C" void _gxx_personality_v0() { */ void CppInit() { // 调用构造函数 - std::for_each(&_init_array_start, &_init_array_end, + std::for_each(&__init_array_start, &__init_array_end, [](function_t func) { (func)(); }); } @@ -195,6 +195,6 @@ void CppInit() { */ void CppDeInit() { // 调用析构函数 - std::for_each(&_fini_array_start, &_fini_array_end, + std::for_each(&__fini_array_start, &__fini_array_end, [](function_t func) { (func)(); }); } From 952ac66a4a61f41144c24249cf024c7094dde7c5 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:43:41 +0000 Subject: [PATCH 108/232] style: update Signed-off-by: Zone.N --- .clang-tidy | 3 ++- src/kernel/libcxx/sk_libcxx.cpp | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 6e368ba65..720a49662 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -22,6 +22,7 @@ Checks: > -readability-braces-around-statements, -readability-magic-numbers, -performance-no-int-to-ptr, - -modernize-use-std-print + -modernize-use-std-print, + -bugprone-reserved-identifier FormatStyle: google ... diff --git a/src/kernel/libcxx/sk_libcxx.cpp b/src/kernel/libcxx/sk_libcxx.cpp index 0bb1f7653..715faeec4 100644 --- a/src/kernel/libcxx/sk_libcxx.cpp +++ b/src/kernel/libcxx/sk_libcxx.cpp @@ -22,13 +22,13 @@ using function_t = void (*)(); // 在 link.ld 中定义 /// 全局构造函数函数指针起点地址 -extern "C" function_t __init_array_start; // NOLINT +extern "C" function_t __init_array_start; /// 全局构造函数函数指针终点地址 -extern "C" function_t __init_array_end; // NOLINT +extern "C" function_t __init_array_end; /// 全局析构函数函数指针起点地址 -extern "C" function_t __fini_array_start; // NOLINT +extern "C" function_t __fini_array_start; /// 全局析构函数函数指针终点地址 -extern "C" function_t __fini_array_end; // NOLINT +extern "C" function_t __fini_array_end; /// 动态共享对象标识,内核使用静态链接,此变量在内核中没有使用 void* dso_handle = nullptr; @@ -56,8 +56,8 @@ static size_t atexit_func_count = 0; * @param obj_ptr 传递给析构函数的参数 * @return 成功返回 0 */ -extern "C" auto _cxa_atexit(void (*destructor_func)(void*), void* obj_ptr, - void*) -> int { +extern "C" auto __cxa_atexit(void (*destructor_func)(void*), void* obj_ptr, + void*) -> int { if (atexit_func_count >= kMaxAtExitFuncsCount) { return -1; } @@ -73,7 +73,7 @@ extern "C" auto _cxa_atexit(void (*destructor_func)(void*), void* obj_ptr, * @param destructor_func 要调用的析构函数指针,为 nullptr * 时调用所有注册的析构函数。 */ -extern "C" void _cxa_finalize(void* destructor_func) { +extern "C" void __cxa_finalize(void* destructor_func) { if (destructor_func == nullptr) { // 如果 destructor_func 为 nullptr,调用所有析构函数 for (auto i = atexit_func_count - 1; i != 0; i--) { @@ -124,7 +124,7 @@ struct GuardType { * @param guard 锁,一个 64 位变量 * @return 未初始化返回非零值,已初始化返回 0 */ -extern "C" auto _cxa_guard_acquire(GuardType* guard) -> int { +extern "C" auto __cxa_guard_acquire(GuardType* guard) -> int { if ((guard->is_in_use == 0U) && (guard->is_initialized == 0U)) { guard->is_in_use = 1; } @@ -136,7 +136,7 @@ extern "C" auto _cxa_guard_acquire(GuardType* guard) -> int { * @param guard 锁,一个 64 位变量 * @return 未初始化返回非零值并设置锁,已初始化返回 0 */ -extern "C" void _cxa_guard_release(GuardType* guard) { +extern "C" void __cxa_guard_release(GuardType* guard) { guard->is_in_use = 0; guard->is_initialized = 1; } @@ -145,7 +145,7 @@ extern "C" void _cxa_guard_release(GuardType* guard) { * 如果在初始化过程中出现异常或其他错误,调用此函数以释放锁而不标记变量为已初始化 * @param guard 锁 */ -extern "C" void _cxa_guard_abort(GuardType* guard) { +extern "C" void __cxa_guard_abort(GuardType* guard) { guard->is_in_use = 0; guard->is_initialized = 0; } @@ -155,7 +155,7 @@ extern "C" void _cxa_guard_abort(GuardType* guard) { /** * 纯虚函数调用处理 */ -extern "C" void _cxa_pure_virtual() { +extern "C" void __cxa_pure_virtual() { while (true) { ; } @@ -165,7 +165,7 @@ extern "C" void _cxa_pure_virtual() { * 异常处理 * @note 这里只能处理 throw,无法处理异常类型 */ -extern "C" void _cxa_rethrow() { +extern "C" void __cxa_rethrow() { while (true) { ; } From bc4dc90e021576819ed5d7fc4a0cff15177913d8 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:45:37 +0000 Subject: [PATCH 109/232] style: update Signed-off-by: Zone.N --- src/kernel/include/kernel_log.hpp | 19 +++++++------ src/kernel/include/spinlock.hpp | 44 +++++++++++++------------------ 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/kernel/include/kernel_log.hpp b/src/kernel/include/kernel_log.hpp index a5a33a9c1..037fdfda0 100644 --- a/src/kernel/include/kernel_log.hpp +++ b/src/kernel/include/kernel_log.hpp @@ -21,6 +21,7 @@ #include #include "../../project_config.h" +#include "singleton.hpp" #include "sk_cstdio" #include "sk_iostream" #include "spinlock.hpp" @@ -38,8 +39,6 @@ constexpr const auto kMagenta = "\033[35m"; constexpr const auto kCyan = "\033[36m"; constexpr const auto kWhite = "\033[37m"; -static SpinLock logger_lock("klog::logger"); - template class Logger : public sk_std::ostream { public: @@ -97,48 +96,48 @@ class Logger : public sk_std::ostream { extern "C" inline void Debug(const char* format, ...) { (void)format; #ifdef SIMPLEKERNEL_DEBUG_LOG - logger::logger_lock.lock(); + Singleton::GetInstance().lock(); va_list args; va_start(args, format); printf("%s[%ld] ", logger::kMagenta, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); - logger::logger_lock.unlock(); + Singleton::GetInstance().unlock(); #endif } extern "C" inline void Info(const char* format, ...) { - logger::logger_lock.lock(); + Singleton::GetInstance().lock(); va_list args; va_start(args, format); printf("%s[%ld] ", logger::kCyan, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); - logger::logger_lock.unlock(); + Singleton::GetInstance().unlock(); } extern "C" inline void Warn(const char* format, ...) { - logger::logger_lock.lock(); + Singleton::GetInstance().lock(); va_list args; va_start(args, format); printf("%s[%ld] ", logger::kYellow, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); - logger::logger_lock.unlock(); + Singleton::GetInstance().unlock(); } extern "C" inline void Err(const char* format, ...) { - logger::logger_lock.lock(); + Singleton::GetInstance().lock(); va_list args; va_start(args, format); printf("%s[%ld] ", logger::kRed, cpu_io::GetCurrentCoreId()); vprintf(format, args); printf("%s", logger::kReset); va_end(args); - logger::logger_lock.unlock(); + Singleton::GetInstance().unlock(); } [[maybe_unused]] static logger::Logger info; diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp index 584d53630..e7f4f46a1 100644 --- a/src/kernel/include/spinlock.hpp +++ b/src/kernel/include/spinlock.hpp @@ -62,7 +62,7 @@ class SpinLock { std::atomic_signal_fence(std::memory_order_acquire); std::atomic_thread_fence(std::memory_order_acquire); - core_id_ = core_id(); + core_id_ = GetCurrentCoreId(); } /** @@ -82,14 +82,6 @@ class SpinLock { RestoreInterruptsNested(); } - // friend std::ostream &operator<<(std::ostream &_os, - // const SpinLock &_spinlock) { - // printf("spinlock(%s) hart 0x%X %s\n", _spinlock.name_, - // _spinlock.core_id_, - // (_spinlock.locked_._M_i ? "locked_" : "unlock")); - // return _os; - // } - protected: /// 自旋锁名称 const char *name_{"unnamed"}; @@ -98,12 +90,14 @@ class SpinLock { /// 获得此锁的 core_id_ size_t core_id_{SIZE_MAX}; - virtual void intr_on() const { cpu_io::EnableInterrupt(); } - virtual void intr_off() const { cpu_io::DisableInterrupt(); } - virtual auto intr_status() const -> bool { + virtual void EnableInterrupt() const { cpu_io::EnableInterrupt(); } + virtual void DisableInterrupt() const { cpu_io::DisableInterrupt(); } + [[nodiscard]] virtual auto GetInterruptStatus() const -> bool { return cpu_io::GetInterruptStatus(); } - virtual auto core_id() const -> size_t { return cpu_io::GetCurrentCoreId(); } + [[nodiscard]] virtual auto GetCurrentCoreId() const -> size_t { + return cpu_io::GetCurrentCoreId(); + } /** * @brief 检查当前 core 是否获得此锁 @@ -111,39 +105,39 @@ class SpinLock { * @return false 否 */ auto IsLockedByCurrentCore() -> bool { - return locked_._M_i && (core_id_ == core_id()); + return locked_._M_i && (core_id_ == GetCurrentCoreId()); } /** * @brief 中断嵌套+1 */ void DisableInterruptsNested() { - bool old = intr_status(); + bool old = GetInterruptStatus(); - intr_off(); + DisableInterrupt(); - if (g_per_cpu[core_id()].noff_ == 0) { - g_per_cpu[core_id()].intr_enable_ = old; + if (g_per_cpu[GetCurrentCoreId()].noff_ == 0) { + g_per_cpu[GetCurrentCoreId()].intr_enable_ = old; } - g_per_cpu[core_id()].noff_ += 1; + g_per_cpu[GetCurrentCoreId()].noff_ += 1; } /** * @brief 中断嵌套-1 */ void RestoreInterruptsNested() { - if (intr_status()) { + if (GetInterruptStatus()) { printf("RestoreInterruptsNested - interruptible\n"); } - if (g_per_cpu[core_id()].noff_ < 1) { + if (g_per_cpu[GetCurrentCoreId()].noff_ < 1) { printf("RestoreInterruptsNested\n"); } - g_per_cpu[core_id()].noff_ -= 1; + g_per_cpu[GetCurrentCoreId()].noff_ -= 1; - if ((g_per_cpu[core_id()].noff_ == 0) && - (g_per_cpu[core_id()].intr_enable_)) { - intr_on(); + if ((g_per_cpu[GetCurrentCoreId()].noff_ == 0) && + (g_per_cpu[GetCurrentCoreId()].intr_enable_)) { + EnableInterrupt(); } } }; From 21aa9c49769f591d4da1dbc0fb6a3fef47812ed7 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:46:59 +0000 Subject: [PATCH 110/232] feat: dec to 4 Signed-off-by: Zone.N --- src/kernel/include/per_cpu.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel/include/per_cpu.hpp b/src/kernel/include/per_cpu.hpp index c45a0351c..31b30d141 100644 --- a/src/kernel/include/per_cpu.hpp +++ b/src/kernel/include/per_cpu.hpp @@ -28,7 +28,7 @@ class PerCpu { public: /// 最大 CPU 数 - static constexpr size_t kMaxCoreCount = 8; + static constexpr size_t kMaxCoreCount = 4; /// 核心 ID size_t core_id_; From 0e06a78eb2d2cd023ba1bafc229d86a2d1f7f086 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:53:50 +0000 Subject: [PATCH 111/232] feat: enable smp for riscv64 Signed-off-by: Zone.N --- src/kernel/arch/arch.h | 1 + src/kernel/main.cpp | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/kernel/arch/arch.h b/src/kernel/arch/arch.h index 714dedb40..8f9ffbe5f 100644 --- a/src/kernel/arch/arch.h +++ b/src/kernel/arch/arch.h @@ -28,6 +28,7 @@ * @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; /// 最多回溯 128 层调用栈 static constexpr const size_t kMaxFrameCount = 128; diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 247c22380..196bf9dd1 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -16,21 +16,31 @@ #include #include "arch.h" +#include "basic_info.hpp" #include "kernel.h" #include "kernel_log.hpp" #include "sk_cstdio" #include "sk_iostream" #include "sk_libcxx.h" -static bool is_init = false; +/// 用于判断是否为启动核 +static bool is_boot_core = false; +/// 非启动核入口 +static auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { + ArchInitSMP(argc, argv); + klog::Info("Hello SimpleKernel\n"); + return 0; +} void _start(uint32_t argc, uint8_t *argv) { - if (is_init == false) { - is_init = true; + if (!is_boot_core) { + is_boot_core = true; CppInit(); + main(argc, argv); + CppDeInit(); + } else { + main_smp(argc, argv); } - main(argc, argv); - CppDeInit(); // 进入死循环 while (true) { From 864d13ceb84d7b9ba083785104b885e3d478bf8f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:58:00 +0000 Subject: [PATCH 112/232] feat: move link vars to basic_info Signed-off-by: Zone.N --- src/kernel/arch/riscv64/arch_main.cpp | 97 +++++++++++++-------------- src/kernel/include/basic_info.hpp | 9 +++ 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 844fd24fe..38d5239a8 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -29,12 +29,6 @@ extern "C" void _putchar(char character) { sbi_debug_console_write_byte(character); } -// 引用链接脚本中的变量 -/// @see http://wiki.osdev.org/Using_Linker_Script_Values -/// 内核开始 -extern "C" void *__executable_start[]; // NOLINT -/// 内核结束 -extern "C" void *end[]; BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { (void)argc; (void)argv; @@ -53,56 +47,59 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = reinterpret_cast(argv); } -static bool is_init = false; - auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { - if (!is_init) { - printf("boot hart id: %d\n", argc); - printf("dtb info addr: %p\n", argv); - - for (auto i = 0; i < 8; i++) { - g_per_cpu[i].core_id_ = SIZE_MAX; - } + printf("boot hart id: %d\n", argc); + printf("dtb info addr: %p\n", argv); - cpu_io::Tp::Write(argc); - g_per_cpu[argc].core_id_ = argc; - - Singleton::GetInstance() = - KernelFdt(reinterpret_cast(argv)); - - Singleton::GetInstance() = BasicInfo(argc, argv); - // sk_std::cout << Singleton::GetInstance(); - - auto [serial_base, serial_size] = - Singleton::GetInstance().GetSerial(); - auto uart = Ns16550a(serial_base); - uart.PutChar('H'); - uart.PutChar('e'); - uart.PutChar('l'); - uart.PutChar('l'); - uart.PutChar('o'); - uart.PutChar(' '); - uart.PutChar('u'); - uart.PutChar('a'); - uart.PutChar('r'); - uart.PutChar('t'); - uart.PutChar('!'); - uart.PutChar('\n'); - - // 解析内核 elf 信息 - Singleton::GetInstance() = KernelElf(); - - // klog::Info("Hello riscv64 ArchInit\n"); - sbi_hart_start(0, 0x0000000080210000, 0); - sbi_hart_start(1, 0x0000000080210000, 0); - sbi_hart_start(2, 0x0000000080210000, 0); - sbi_hart_start(3, 0x0000000080210000, 0); - - is_init = true; + for (auto i = 0; i < 8; i++) { + g_per_cpu[i].core_id_ = SIZE_MAX; } + // 将 core id 保存到 tp 寄存器 cpu_io::Tp::Write(argc); g_per_cpu[argc].core_id_ = argc; + + Singleton::GetInstance() = + KernelFdt(reinterpret_cast(argv)); + + Singleton::GetInstance() = BasicInfo(argc, argv); + Singleton::GetInstance().core_count++; + sk_std::cout << Singleton::GetInstance(); + + auto [serial_base, serial_size] = + Singleton::GetInstance().GetSerial(); + auto uart = Ns16550a(serial_base); + uart.PutChar('H'); + uart.PutChar('e'); + uart.PutChar('l'); + uart.PutChar('l'); + uart.PutChar('o'); + uart.PutChar(' '); + uart.PutChar('u'); + uart.PutChar('a'); + uart.PutChar('r'); + uart.PutChar('t'); + uart.PutChar('!'); + uart.PutChar('\n'); + + // 解析内核 elf 信息 + Singleton::GetInstance() = KernelElf(); + + klog::Info("Hello riscv64 ArchInit\n"); + for (auto i = 0; i < PerCpu::kMaxCoreCount; i++) { + auto ret = sbi_hart_start(i, reinterpret_cast(_boot), 0); + if ((ret.error != SBI_SUCCESS) && + (ret.error != SBI_ERR_ALREADY_AVAILABLE)) { + printf("hart %d start failed: %d\n", i, ret.error); + } + } + + return 0; +} + +auto ArchInitSMP(uint32_t argc, const uint8_t *) -> uint32_t { + cpu_io::Tp::Write(argc); + g_per_cpu[argc].core_id_ = argc; Singleton::GetInstance().core_count++; return 0; diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index 69b9aba86..f745a433a 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -24,6 +24,15 @@ #include "singleton.hpp" #include "sk_iostream" +// 引用链接脚本中的变量 +/// @see http://wiki.osdev.org/Using_Linker_Script_Values +/// 内核开始 +extern "C" void *__executable_start[]; +/// 内核结束 +extern "C" void *end[]; +/// 内核入口,在 boot.S 中定义 +extern "C" void _boot(); + struct BasicInfo { /// physical_memory 地址 uint64_t physical_memory_addr; From 820f1142fc97d86b1ec0e013db434a519afbcd70 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 09:58:29 +0000 Subject: [PATCH 113/232] feat: move link vars to basic_info Signed-off-by: Zone.N --- src/kernel/arch/riscv64/arch_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 38d5239a8..c7b58acde 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -86,7 +86,7 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { Singleton::GetInstance() = KernelElf(); klog::Info("Hello riscv64 ArchInit\n"); - for (auto i = 0; i < PerCpu::kMaxCoreCount; i++) { + for (size_t i = 0; i < PerCpu::kMaxCoreCount; i++) { auto ret = sbi_hart_start(i, reinterpret_cast(_boot), 0); if ((ret.error != SBI_SUCCESS) && (ret.error != SBI_ERR_ALREADY_AVAILABLE)) { From 07e74d1d122228955ae65862b3eec04b4ac7f289 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 10:01:39 +0000 Subject: [PATCH 114/232] feat: move link vars to basic_info Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- src/kernel/arch/x86_64/arch_main.cpp | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..09286cfad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_riscv64/compiler_commands.json + - -p=/root/SimpleKernel/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/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/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_x86_64/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_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_x86_64/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_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 3ca1dfd20..5db9260fe 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -31,12 +31,6 @@ namespace { cpu_io::Serial kSerial(cpu_io::kCom1); extern "C" void _putchar(char character) { kSerial.Write(character); } -// 引用链接脚本中的变量 -/// @see http://wiki.osdev.org/Using_Linker_Script_Values -/// 内核开始 -extern "C" void *__executable_start[]; // NOLINT -/// 内核结束 -extern "C" void *end[]; } // namespace BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { @@ -77,3 +71,9 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { return 0; } + +auto ArchInitSMP(uint32_t argc, const uint8_t *argv) -> uint32_t { + (void)argc; + (void)argv; + return 0; +} From 42c1eaa1e44a8e9e654023ddfe0af0b5cd3485e6 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 10:15:22 +0000 Subject: [PATCH 115/232] feat: move link vars to basic_info Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++++++++------------ src/kernel/arch/aarch64/arch_main.cpp | 6 +++++ src/kernel/libcxx/sk_libcxx.cpp | 6 ++--- test/unit_test/spinlock_test.cpp | 33 ++++++++------------------- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09286cfad..f09ff93f5 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_x86_64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_x86_64/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/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_x86_64/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/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 371775aaf..b64e59fc9 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -34,3 +34,9 @@ auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { return 0; } + +auto ArchInitSMP(uint32_t argc, const uint8_t* argv) -> uint32_t { + (void)argc; + (void)argv; + return 0; +} diff --git a/src/kernel/libcxx/sk_libcxx.cpp b/src/kernel/libcxx/sk_libcxx.cpp index 715faeec4..c0b0772d5 100644 --- a/src/kernel/libcxx/sk_libcxx.cpp +++ b/src/kernel/libcxx/sk_libcxx.cpp @@ -30,7 +30,7 @@ extern "C" function_t __fini_array_start; /// 全局析构函数函数指针终点地址 extern "C" function_t __fini_array_end; /// 动态共享对象标识,内核使用静态链接,此变量在内核中没有使用 -void* dso_handle = nullptr; +void* __dso_handle = nullptr; /// 最大析构函数数量 static constexpr const size_t kMaxAtExitFuncsCount = 128; @@ -170,12 +170,12 @@ extern "C" void __cxa_rethrow() { ; } } -extern "C" void Unwind_Resume() { +extern "C" void _Unwind_Resume() { while (true) { ; } } -extern "C" void _gxx_personality_v0() { +extern "C" void __gxx_personality_v0() { while (true) { ; } diff --git a/test/unit_test/spinlock_test.cpp b/test/unit_test/spinlock_test.cpp index a11f3e700..ece01bd0c 100644 --- a/test/unit_test/spinlock_test.cpp +++ b/test/unit_test/spinlock_test.cpp @@ -19,10 +19,13 @@ #include #include +#include #include #include #include +// static std::array g_per_cpu{}; + class TestableSpinLock : public SpinLock { public: using SpinLock::SpinLock; @@ -32,10 +35,10 @@ class TestableSpinLock : public SpinLock { using SpinLock::IsLockedByCurrentCore; using SpinLock::RestoreInterruptsNested; - void intr_on() const override {} - void intr_off() const override {} - auto intr_status() const -> bool override { return false; } - auto core_id() const -> size_t override { + void EnableInterrupt() const override {} + void DisableInterrupt() const override {} + auto GetInterruptStatus() const -> bool override { return false; } + auto GetCurrentCoreId() const -> size_t override { return std::hash{}(std::this_thread::get_id()); } }; @@ -56,31 +59,15 @@ TEST_F(TestableSpinLockTest, LockUnlockTest) { } TEST_F(TestableSpinLockTest, MultiThreadLockUnlockTest) { - auto thread_func = [this](const std::string& name) { + auto thread_func = [this]() { spinlock.lock(); EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); - - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - spinlock.unlock(); - EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); - - spinlock.lock(); - EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); spinlock.unlock(); EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); spinlock.lock(); EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); - - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - spinlock.unlock(); - EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); - - spinlock.lock(); - EXPECT_TRUE(spinlock.IsLockedByCurrentCore()); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); spinlock.unlock(); EXPECT_FALSE(spinlock.IsLockedByCurrentCore()); @@ -88,12 +75,12 @@ TEST_F(TestableSpinLockTest, MultiThreadLockUnlockTest) { std::vector threads; for (int i = 0; i < 100; ++i) { - threads.emplace_back(thread_func, "thread" + std::to_string(i + 1)); + threads.emplace_back(thread_func); } for (auto& thread : threads) { thread.detach(); } - std::this_thread::sleep_for(std::chrono::seconds(8)); + std::this_thread::sleep_for(std::chrono::seconds(2)); } From 27a5314bbe7dfab00c110aead99bd38868d61676 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 11:58:42 +0000 Subject: [PATCH 116/232] fix: spinlock Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- src/kernel/arch/riscv64/arch_main.cpp | 9 ++------- src/kernel/arch/x86_64/arch_main.cpp | 2 +- src/kernel/include/per_cpu.hpp | 10 +++++++++- src/kernel/include/spinlock.hpp | 13 ++++++------- test/unit_test/spinlock_test.cpp | 2 -- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..079fd8a2f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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).* + # - --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_aarch64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index c7b58acde..71cd889a8 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -51,13 +51,9 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { printf("boot hart id: %d\n", argc); printf("dtb info addr: %p\n", argv); - for (auto i = 0; i < 8; i++) { - g_per_cpu[i].core_id_ = SIZE_MAX; - } - // 将 core id 保存到 tp 寄存器 cpu_io::Tp::Write(argc); - g_per_cpu[argc].core_id_ = argc; + GetCurrentCore().core_id_ = argc; Singleton::GetInstance() = KernelFdt(reinterpret_cast(argv)); @@ -99,8 +95,7 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { auto ArchInitSMP(uint32_t argc, const uint8_t *) -> uint32_t { cpu_io::Tp::Write(argc); - g_per_cpu[argc].core_id_ = argc; + GetCurrentCore().core_id_ = argc; Singleton::GetInstance().core_count++; - return 0; } diff --git a/src/kernel/arch/x86_64/arch_main.cpp b/src/kernel/arch/x86_64/arch_main.cpp index 5db9260fe..f4345cdb8 100644 --- a/src/kernel/arch/x86_64/arch_main.cpp +++ b/src/kernel/arch/x86_64/arch_main.cpp @@ -56,7 +56,7 @@ auto ArchInit(uint32_t argc, const uint8_t *argv) -> uint32_t { throw; } - g_per_cpu[cpu_io::GetCurrentCoreId()].core_id_ = cpu_io::GetCurrentCoreId(); + GetCurrentCore().core_id_ = cpu_io::GetCurrentCoreId(); Singleton::GetInstance() = BasicInfo(argc, argv); Singleton::GetInstance().core_count++; diff --git a/src/kernel/include/per_cpu.hpp b/src/kernel/include/per_cpu.hpp index 31b30d141..175acddc7 100644 --- a/src/kernel/include/per_cpu.hpp +++ b/src/kernel/include/per_cpu.hpp @@ -17,6 +17,7 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ #define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ +#include #include #include @@ -25,6 +26,8 @@ #include #include +#include "singleton.hpp" + class PerCpu { public: /// 最大 CPU 数 @@ -55,6 +58,11 @@ class PerCpu { }; /// per cpu 数据 -static std::array g_per_cpu{}; +// static std::array g_per_cpu{}; + +static __always_inline auto GetCurrentCore() -> PerCpu & { + return Singleton>::GetInstance() + [cpu_io::GetCurrentCoreId()]; +} #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_PER_CPU_HPP_ */ diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp index e7f4f46a1..d136a590b 100644 --- a/src/kernel/include/spinlock.hpp +++ b/src/kernel/include/spinlock.hpp @@ -116,10 +116,10 @@ class SpinLock { DisableInterrupt(); - if (g_per_cpu[GetCurrentCoreId()].noff_ == 0) { - g_per_cpu[GetCurrentCoreId()].intr_enable_ = old; + if (GetCurrentCore().noff_ == 0) { + GetCurrentCore().intr_enable_ = old; } - g_per_cpu[GetCurrentCoreId()].noff_ += 1; + GetCurrentCore().noff_ += 1; } /** @@ -130,13 +130,12 @@ class SpinLock { printf("RestoreInterruptsNested - interruptible\n"); } - if (g_per_cpu[GetCurrentCoreId()].noff_ < 1) { + if (GetCurrentCore().noff_ < 1) { printf("RestoreInterruptsNested\n"); } - g_per_cpu[GetCurrentCoreId()].noff_ -= 1; + GetCurrentCore().noff_ -= 1; - if ((g_per_cpu[GetCurrentCoreId()].noff_ == 0) && - (g_per_cpu[GetCurrentCoreId()].intr_enable_)) { + if ((GetCurrentCore().noff_ == 0) && (GetCurrentCore().intr_enable_)) { EnableInterrupt(); } } diff --git a/test/unit_test/spinlock_test.cpp b/test/unit_test/spinlock_test.cpp index ece01bd0c..2bb037aa4 100644 --- a/test/unit_test/spinlock_test.cpp +++ b/test/unit_test/spinlock_test.cpp @@ -24,8 +24,6 @@ #include #include -// static std::array g_per_cpu{}; - class TestableSpinLock : public SpinLock { public: using SpinLock::SpinLock; From 2c22398f98354db8a653771d47dca929d647d6eb Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 7 Jan 2025 12:03:35 +0000 Subject: [PATCH 117/232] fix: spinlock Signed-off-by: Zone.N --- src/kernel/main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 196bf9dd1..c72b2aa47 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -24,14 +24,18 @@ #include "sk_libcxx.h" /// 用于判断是否为启动核 -static bool is_boot_core = false; +namespace { + +bool is_boot_core = false; /// 非启动核入口 -static auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { +auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { ArchInitSMP(argc, argv); klog::Info("Hello SimpleKernel\n"); return 0; } +} // namespace + void _start(uint32_t argc, uint8_t *argv) { if (!is_boot_core) { is_boot_core = true; From 010bd72f8b9dbd759a2367fd43186b65c01a62ef Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 01:23:52 +0000 Subject: [PATCH 118/232] feat: multiboot2 header Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++------- src/kernel/arch/CMakeLists.txt | 3 -- src/kernel/arch/x86_64/boot.S | 75 ++++++++++++++++++++++++++++++++++ src/kernel/arch/x86_64/link.ld | 3 +- 4 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 src/kernel/arch/x86_64/boot.S diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 079fd8a2f..09286cfad 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_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - 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_x86_64/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_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_x86_64/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_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/arch/CMakeLists.txt b/src/kernel/arch/CMakeLists.txt index 342c92f61..d17b9e479 100644 --- a/src/kernel/arch/CMakeLists.txt +++ b/src/kernel/arch/CMakeLists.txt @@ -15,10 +15,7 @@ TARGET_SOURCES ( INTERFACE $<$: ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/macro.S - ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/boot.S > - $<$: ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/boot.S - > ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/arch_main.cpp ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKE_SYSTEM_PROCESSOR}/backtrace.cpp) diff --git a/src/kernel/arch/x86_64/boot.S b/src/kernel/arch/x86_64/boot.S new file mode 100644 index 000000000..9a20e752e --- /dev/null +++ b/src/kernel/arch/x86_64/boot.S @@ -0,0 +1,75 @@ + +/** + * @file boot.S + * @brief boot S + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-07-15 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-07-15Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +#define ASM_FILE +#include "multiboot2.h" + +// clang-format off + +// multiboot2 文件头 +// 计算头长度 +.SET HEADER_LENGTH, multiboot_header_end - multiboot_header +// 计算校验和 +.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + HEADER_LENGTH) +// 8 字节对齐 +.align MULTIBOOT_HEADER_ALIGN +// 声明所属段 +.section .text.boot +multiboot_header: + // 魔数 + .long MULTIBOOT2_HEADER_MAGIC + // 架构 + .long MULTIBOOT2_ARCHITECTURE_I386 + // 头长度 + .long HEADER_LENGTH + // 校验和 + .long CHECKSUM + // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf + .short MULTIBOOT_HEADER_TAG_END + // 结束标记 + .short 0 + .long 8 +multiboot_header_end: + +.global _boot +.type _boot, @function +.extern _start +// 在 multiboot2.cpp 中定义 +//.extern boot_info_addr +//.extern multiboot2_magic +_boot: + // 关中断 + cli + // multiboot2_info 结构体指针 + // mov %ebx, boot_info_addr + // 魔数 + // mov %eax, multiboot2_magic + + call _start + hlt + ret + +// 声明所属段 +.section .bss.boot +// 16 字节对齐 +.align 16 +.global stack_top +// 栈 +stack_top: + // 跳过 16KB + .space 4096 * 4 + +// clang-format on diff --git a/src/kernel/arch/x86_64/link.ld b/src/kernel/arch/x86_64/link.ld index 96d245e7f..65805dfc1 100644 --- a/src/kernel/arch/x86_64/link.ld +++ b/src/kernel/arch/x86_64/link.ld @@ -15,11 +15,12 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) -ENTRY(_start) +ENTRY(_boot) SECTIONS { PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS; + .boot : ALIGN(0x1000) { *(.text.boot) *(.data.boot) *(.bss.boot) } .interp : ALIGN(0x1000) { *(.interp) } .note.gnu.build-id : ALIGN(0x1000) { *(.note.gnu.build-id) } .hash : ALIGN(0x1000) { *(.hash) } From 2b6a911505d559259e37434784e934c47e643278 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 01:24:25 +0000 Subject: [PATCH 119/232] feat: multiboot2 header Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- src/kernel/arch/aarch64/boot.S | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09286cfad..405c4f002 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + - --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_x86_64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/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_x86_64/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_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/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/boot.S b/src/kernel/arch/aarch64/boot.S index a4dd67569..e39ea93d4 100644 --- a/src/kernel/arch/aarch64/boot.S +++ b/src/kernel/arch/aarch64/boot.S @@ -16,6 +16,34 @@ // clang-format off +#define ASM_FILE +#include "multiboot2.h" + +// multiboot2 文件头 +// 计算头长度 +.SET HEADER_LENGTH, multiboot_header_end - multiboot_header +// 计算校验和 +.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + HEADER_LENGTH) +// 8 字节对齐 +.align MULTIBOOT_HEADER_ALIGN +// 声明所属段 +.section .text.boot +multiboot_header: + // 魔数 + .long MULTIBOOT2_HEADER_MAGIC + // 架构 + .long MULTIBOOT2_ARCHITECTURE_I386 + // 头长度 + .long HEADER_LENGTH + // 校验和 + .long CHECKSUM + // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf + .short MULTIBOOT_HEADER_TAG_END + // 结束标记 + .short 0 + .long 8 +multiboot_header_end: + .section .text.boot .global _boot .type _boot, @function From 8b9dcda3167b15b344c584f0356463e5a84da8ef Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 01:33:46 +0000 Subject: [PATCH 120/232] feat: multiboot2 header Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- src/kernel/arch/riscv64/boot.S | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 405c4f002..befc52f71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/root/SimpleKernel/build_riscv64/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).* + - --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_aarch64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/arch/riscv64/boot.S b/src/kernel/arch/riscv64/boot.S index 4b56a09c8..8b5dd3fa8 100644 --- a/src/kernel/arch/riscv64/boot.S +++ b/src/kernel/arch/riscv64/boot.S @@ -21,6 +21,31 @@ // clang-format off +// multiboot2 文件头 +// 计算头长度 +.SET HEADER_LENGTH, multiboot_header_end - multiboot_header +// 计算校验和 +.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + HEADER_LENGTH) +// 8 字节对齐 +.align MULTIBOOT_HEADER_ALIGN +// 声明所属段 +//.section .text.boot +multiboot_header: + // 魔数 + .long MULTIBOOT2_HEADER_MAGIC + // 架构 + .long MULTIBOOT2_ARCHITECTURE_I386 + // 头长度 + .long HEADER_LENGTH + // 校验和 + .long CHECKSUM + // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf + .short MULTIBOOT_HEADER_TAG_END + // 结束标记 + .short 0 + .long 8 +multiboot_header_end: + .section .text.boot .global _boot .type _boot, @function From cd2e315f099181e5a16b946ef43975d73b9d65ef Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 03:07:52 +0000 Subject: [PATCH 121/232] feat: add dtc Signed-off-by: Zone.N --- tools/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index 0990922ba..e18991204 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -70,7 +70,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ libgtest-dev \ pkg-config \ flex \ - bison + bison \ + device-tree-compiler RUN apt install --no-install-recommends --fix-missing -y \ gcc \ g++ \ From 49f77b5cd251574a7b0182710efbefe37a00d161 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 03:10:39 +0000 Subject: [PATCH 122/232] feat: update dts Signed-off-by: Zone.N --- tools/aarch64_qemu_virt.dts | 73 +++++++++++++---- tools/riscv64_qemu_virt.dts | 153 ++++++++++++++++++++++++++---------- 2 files changed, 167 insertions(+), 59 deletions(-) diff --git a/tools/aarch64_qemu_virt.dts b/tools/aarch64_qemu_virt.dts index f3b6d34b5..ab724bb1a 100644 --- a/tools/aarch64_qemu_virt.dts +++ b/tools/aarch64_qemu_virt.dts @@ -1,17 +1,17 @@ /dts-v1/; / { - interrupt-parent = <0x8002>; + interrupt-parent = <0x8005>; model = "linux,dummy-virt"; #size-cells = <0x02>; #address-cells = <0x02>; compatible = "linux,dummy-virt"; psci { - migrate = <0x84000005>; - cpu_on = <0x84000003>; + migrate = <0xc4000005>; + cpu_on = <0xc4000003>; cpu_off = <0x84000002>; - cpu_suspend = <0x84000001>; + cpu_suspend = <0xc4000001>; method = "hvc"; compatible = "arm,psci-1.0\0arm,psci-0.2\0arm,psci"; }; @@ -22,7 +22,7 @@ }; platform-bus@c000000 { - interrupt-parent = <0x8002>; + interrupt-parent = <0x8005>; ranges = <0x00 0x00 0xc000000 0x2000000>; #address-cells = <0x01>; #size-cells = <0x01>; @@ -263,14 +263,14 @@ compatible = "gpio-keys"; poweroff { - gpios = <0x8004 0x03 0x00>; + gpios = <0x8007 0x03 0x00>; linux,code = <0x74>; label = "GPIO Key Poweroff"; }; }; pl061@9030000 { - phandle = <0x8004>; + phandle = <0x8007>; clock-names = "apb_pclk"; clocks = <0x8000>; interrupts = <0x00 0x07 0x04>; @@ -282,11 +282,11 @@ pcie@10000000 { interrupt-map-mask = <0x1800 0x00 0x00 0x07>; - interrupt-map = <0x00 0x00 0x00 0x01 0x8002 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8002 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8002 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8002 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8002 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8002 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8002 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8002 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8002 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8002 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8002 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8002 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8002 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8002 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8002 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8002 0x00 0x00 0x00 0x05 0x04>; + interrupt-map = <0x00 0x00 0x00 0x01 0x8005 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8005 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8005 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8005 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8005 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8005 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8005 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8005 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8005 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8005 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8005 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8005 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8005 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8005 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8005 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8005 0x00 0x00 0x00 0x05 0x04>; #interrupt-cells = <0x01>; ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; reg = <0x40 0x10000000 0x00 0x10000000>; - msi-map = <0x00 0x8003 0x00 0x10000>; + msi-map = <0x00 0x8006 0x00 0x10000>; dma-coherent; bus-range = <0x00 0xff>; linux,pci-domain = <0x00>; @@ -313,10 +313,12 @@ }; pmu { + interrupts = <0x01 0x07 0xf04>; + compatible = "arm,armv8-pmuv3"; }; intc@8000000 { - phandle = <0x8002>; + phandle = <0x8005>; reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; compatible = "arm,cortex-a15-gic"; ranges; @@ -326,7 +328,7 @@ #interrupt-cells = <0x03>; v2m@8020000 { - phandle = <0x8003>; + phandle = <0x8006>; reg = <0x00 0x8020000 0x00 0x1000>; msi-controller; compatible = "arm,gic-v2m-frame"; @@ -350,6 +352,18 @@ cluster0 { core0 { + cpu = <0x8004>; + }; + + core1 { + cpu = <0x8003>; + }; + + core2 { + cpu = <0x8002>; + }; + + core3 { cpu = <0x8001>; }; }; @@ -357,17 +371,42 @@ }; cpu@0 { - phandle = <0x8001>; + phandle = <0x8004>; reg = <0x00>; - compatible = "arm,cortex-a15"; + enable-method = "psci"; + compatible = "arm,cortex-a72"; + device_type = "cpu"; + }; + + cpu@1 { + phandle = <0x8003>; + reg = <0x01>; + enable-method = "psci"; + compatible = "arm,cortex-a72"; + device_type = "cpu"; + }; + + cpu@2 { + phandle = <0x8002>; + reg = <0x02>; + enable-method = "psci"; + compatible = "arm,cortex-a72"; + device_type = "cpu"; + }; + + cpu@3 { + phandle = <0x8001>; + reg = <0x03>; + enable-method = "psci"; + compatible = "arm,cortex-a72"; device_type = "cpu"; }; }; timer { - interrupts = <0x01 0x0d 0x104 0x01 0x0e 0x104 0x01 0x0b 0x104 0x01 0x0a 0x104>; + interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; always-on; - compatible = "arm,armv7-timer"; + compatible = "arm,armv8-timer\0arm,armv7-timer"; }; apb-pclk { @@ -380,7 +419,7 @@ chosen { stdout-path = "/pl011@9000000"; - rng-seed = <0x3c03fa26 0xbb85ccc2 0x462b60f1 0xc6132ba2 0x28b58741 0x157fcbda 0xbe2abf1 0xfbb13add>; - kaslr-seed = <0x1c431d0c 0x4f5cc30>; + rng-seed = <0x907c997a 0xbf27ad6f 0x5cc53adb 0x4802584a 0xe5091f9c 0x8ba0d409 0xfc70cffd 0xe34f8101>; + kaslr-seed = <0xa03a2344 0x476d1347>; }; }; diff --git a/tools/riscv64_qemu_virt.dts b/tools/riscv64_qemu_virt.dts index 499a25556..ac05934a3 100644 --- a/tools/riscv64_qemu_virt.dts +++ b/tools/riscv64_qemu_virt.dts @@ -6,39 +6,22 @@ compatible = "riscv-virtio"; model = "riscv-virtio,qemu"; - fw-cfg@10100000 { - dma-coherent; - reg = <0x00 0x10100000 0x00 0x18>; - compatible = "qemu,fw-cfg-mmio"; - }; - - flash@20000000 { - bank-width = <0x04>; - reg = <0x00 0x20000000 0x00 0x2000000 0x00 0x22000000 0x00 0x2000000>; - compatible = "cfi-flash"; - }; - - chosen { - rng-seed = <0x58a2967d 0x45091c2d 0xe8ba115 0x50ed8713 0xe2c23b92 0x46f9475f 0xc8fa07de 0xe0d6dba5>; - stdout-path = "/soc/serial@10000000"; - }; - poweroff { value = <0x5555>; offset = <0x00>; - regmap = <0x04>; + regmap = <0x0a>; compatible = "syscon-poweroff"; }; reboot { value = <0x7777>; offset = <0x00>; - regmap = <0x04>; + regmap = <0x0a>; compatible = "syscon-reboot"; }; platform-bus@4000000 { - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; ranges = <0x00 0x00 0x4000000 0x2000000>; #address-cells = <0x01>; #size-cells = <0x01>; @@ -56,14 +39,71 @@ timebase-frequency = <0x989680>; cpu@0 { - phandle = <0x01>; + phandle = <0x07>; device_type = "cpu"; reg = <0x00>; status = "okay"; compatible = "riscv"; riscv,cboz-block-size = <0x40>; riscv,cbom-block-size = <0x40>; - riscv,isa = "rv64imafdch_zicbom_zicboz_zicsr_zifencei_zihintpause_zawrs_zba_zbb_zbc_zbs_sstc_svadu"; + riscv,isa = "rv64imafdch_zicbom_zicboz_zicntr_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zca_zcd_zba_zbb_zbc_zbs_sstc_svadu"; + mmu-type = "riscv,sv57"; + + interrupt-controller { + #interrupt-cells = <0x01>; + interrupt-controller; + compatible = "riscv,cpu-intc"; + phandle = <0x08>; + }; + }; + + cpu@1 { + phandle = <0x05>; + device_type = "cpu"; + reg = <0x01>; + status = "okay"; + compatible = "riscv"; + riscv,cboz-block-size = <0x40>; + riscv,cbom-block-size = <0x40>; + riscv,isa = "rv64imafdch_zicbom_zicboz_zicntr_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zca_zcd_zba_zbb_zbc_zbs_sstc_svadu"; + mmu-type = "riscv,sv57"; + + interrupt-controller { + #interrupt-cells = <0x01>; + interrupt-controller; + compatible = "riscv,cpu-intc"; + phandle = <0x06>; + }; + }; + + cpu@2 { + phandle = <0x03>; + device_type = "cpu"; + reg = <0x02>; + status = "okay"; + compatible = "riscv"; + riscv,cboz-block-size = <0x40>; + riscv,cbom-block-size = <0x40>; + riscv,isa = "rv64imafdch_zicbom_zicboz_zicntr_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zca_zcd_zba_zbb_zbc_zbs_sstc_svadu"; + mmu-type = "riscv,sv57"; + + interrupt-controller { + #interrupt-cells = <0x01>; + interrupt-controller; + compatible = "riscv,cpu-intc"; + phandle = <0x04>; + }; + }; + + cpu@3 { + phandle = <0x01>; + device_type = "cpu"; + reg = <0x03>; + status = "okay"; + compatible = "riscv"; + riscv,cboz-block-size = <0x40>; + riscv,cbom-block-size = <0x40>; + riscv,isa = "rv64imafdch_zicbom_zicboz_zicntr_zicsr_zifencei_zihintntl_zihintpause_zihpm_zawrs_zfa_zca_zcd_zba_zbb_zbc_zbs_sstc_svadu"; mmu-type = "riscv,sv57"; interrupt-controller { @@ -79,47 +119,76 @@ cluster0 { core0 { + cpu = <0x07>; + }; + + core1 { + cpu = <0x05>; + }; + + core2 { + cpu = <0x03>; + }; + + core3 { cpu = <0x01>; }; }; }; }; + pmu { + riscv,event-to-mhpmcounters = <0x01 0x01 0x7fff9 0x02 0x02 0x7fffc 0x10019 0x10019 0x7fff8 0x1001b 0x1001b 0x7fff8 0x10021 0x10021 0x7fff8>; + compatible = "riscv,pmu"; + }; + + fw-cfg@10100000 { + dma-coherent; + reg = <0x00 0x10100000 0x00 0x18>; + compatible = "qemu,fw-cfg-mmio"; + }; + + flash@20000000 { + bank-width = <0x04>; + reg = <0x00 0x20000000 0x00 0x2000000 0x00 0x22000000 0x00 0x2000000>; + compatible = "cfi-flash"; + }; + + chosen { + stdout-path = "/soc/serial@10000000"; + rng-seed = <0x30ef1b88 0x37aa193f 0x6b47a374 0x3d4e5304 0x6d66f82a 0x85730d58 0x5a80a646 0xa8eeef6b>; + }; + soc { #address-cells = <0x02>; #size-cells = <0x02>; compatible = "simple-bus"; ranges; - pmu { - riscv,event-to-mhpmcounters = <0x01 0x01 0x7fff9 0x02 0x02 0x7fffc 0x10019 0x10019 0x7fff8 0x1001b 0x1001b 0x7fff8 0x10021 0x10021 0x7fff8 0x00 0x00 0x00 0x00 0x00>; - compatible = "riscv,pmu"; - }; - rtc@101000 { interrupts = <0x0b>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x101000 0x00 0x1000>; compatible = "google,goldfish-rtc"; }; serial@10000000 { interrupts = <0x0a>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; clock-frequency = "\08@"; reg = <0x00 0x10000000 0x00 0x100>; compatible = "ns16550a"; }; test@100000 { - phandle = <0x04>; + phandle = <0x0a>; reg = <0x00 0x100000 0x00 0x1000>; compatible = "sifive,test1\0sifive,test0\0syscon"; }; pci@30000000 { interrupt-map-mask = <0x1800 0x00 0x00 0x07>; - interrupt-map = <0x00 0x00 0x00 0x01 0x03 0x20 0x00 0x00 0x00 0x02 0x03 0x21 0x00 0x00 0x00 0x03 0x03 0x22 0x00 0x00 0x00 0x04 0x03 0x23 0x800 0x00 0x00 0x01 0x03 0x21 0x800 0x00 0x00 0x02 0x03 0x22 0x800 0x00 0x00 0x03 0x03 0x23 0x800 0x00 0x00 0x04 0x03 0x20 0x1000 0x00 0x00 0x01 0x03 0x22 0x1000 0x00 0x00 0x02 0x03 0x23 0x1000 0x00 0x00 0x03 0x03 0x20 0x1000 0x00 0x00 0x04 0x03 0x21 0x1800 0x00 0x00 0x01 0x03 0x23 0x1800 0x00 0x00 0x02 0x03 0x20 0x1800 0x00 0x00 0x03 0x03 0x21 0x1800 0x00 0x00 0x04 0x03 0x22>; + interrupt-map = <0x00 0x00 0x00 0x01 0x09 0x20 0x00 0x00 0x00 0x02 0x09 0x21 0x00 0x00 0x00 0x03 0x09 0x22 0x00 0x00 0x00 0x04 0x09 0x23 0x800 0x00 0x00 0x01 0x09 0x21 0x800 0x00 0x00 0x02 0x09 0x22 0x800 0x00 0x00 0x03 0x09 0x23 0x800 0x00 0x00 0x04 0x09 0x20 0x1000 0x00 0x00 0x01 0x09 0x22 0x1000 0x00 0x00 0x02 0x09 0x23 0x1000 0x00 0x00 0x03 0x09 0x20 0x1000 0x00 0x00 0x04 0x09 0x21 0x1800 0x00 0x00 0x01 0x09 0x23 0x1800 0x00 0x00 0x02 0x09 0x20 0x1800 0x00 0x00 0x03 0x09 0x21 0x1800 0x00 0x00 0x04 0x09 0x22>; ranges = <0x1000000 0x00 0x00 0x00 0x3000000 0x00 0x10000 0x2000000 0x00 0x40000000 0x00 0x40000000 0x00 0x40000000 0x3000000 0x04 0x00 0x04 0x00 0x04 0x00>; reg = <0x00 0x30000000 0x00 0x10000000>; dma-coherent; @@ -134,65 +203,65 @@ virtio_mmio@10008000 { interrupts = <0x08>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10008000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10007000 { interrupts = <0x07>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10007000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10006000 { interrupts = <0x06>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10006000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10005000 { interrupts = <0x05>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10005000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10004000 { interrupts = <0x04>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10004000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10003000 { interrupts = <0x03>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10003000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10002000 { interrupts = <0x02>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10002000 0x00 0x1000>; compatible = "virtio,mmio"; }; virtio_mmio@10001000 { interrupts = <0x01>; - interrupt-parent = <0x03>; + interrupt-parent = <0x09>; reg = <0x00 0x10001000 0x00 0x1000>; compatible = "virtio,mmio"; }; plic@c000000 { - phandle = <0x03>; + phandle = <0x09>; riscv,ndev = <0x5f>; reg = <0x00 0xc000000 0x00 0x600000>; - interrupts-extended = <0x02 0x0b 0x02 0x09>; + interrupts-extended = <0x08 0x0b 0x08 0x09 0x06 0x0b 0x06 0x09 0x04 0x0b 0x04 0x09 0x02 0x0b 0x02 0x09>; interrupt-controller; compatible = "sifive,plic-1.0.0\0riscv,plic0"; #address-cells = <0x00>; @@ -200,7 +269,7 @@ }; clint@2000000 { - interrupts-extended = <0x02 0x03 0x02 0x07>; + interrupts-extended = <0x08 0x03 0x08 0x07 0x06 0x03 0x06 0x07 0x04 0x03 0x04 0x07 0x02 0x03 0x02 0x07>; reg = <0x00 0x2000000 0x00 0x10000>; compatible = "sifive,clint0\0riscv,clint0"; }; From b2b4382e6013eda414ed03a4a01a6739b097bb21 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 12:47:01 +0000 Subject: [PATCH 123/232] feat: add pl011 driver Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++----- src/kernel/driver/CMakeLists.txt | 31 ++++------ src/kernel/driver/pl011/CMakeLists.txt | 10 ++++ src/kernel/driver/pl011/README.md | 13 +++++ src/kernel/driver/pl011/include/pl011.h | 76 +++++++++++++++++++++++++ src/kernel/driver/pl011/pl011.cpp | 46 +++++++++++++++ 6 files changed, 171 insertions(+), 33 deletions(-) create mode 100644 src/kernel/driver/pl011/CMakeLists.txt create mode 100644 src/kernel/driver/pl011/README.md create mode 100644 src/kernel/driver/pl011/include/pl011.h create mode 100644 src/kernel/driver/pl011/pl011.cpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..f09ff93f5 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/driver/CMakeLists.txt b/src/kernel/driver/CMakeLists.txt index 6b158f6b9..1640bd65e 100644 --- a/src/kernel/driver/CMakeLists.txt +++ b/src/kernel/driver/CMakeLists.txt @@ -1,28 +1,21 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. +ADD_LIBRARY (driver INTERFACE) -add_library(driver INTERFACE) - -target_include_directories(driver INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR}/include -) +TARGET_INCLUDE_DIRECTORIES (driver + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_sources(driver INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR}/driver.cpp -) +TARGET_SOURCES (driver INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/driver.cpp) -target_link_libraries(driver INTERFACE - $<$: - ns16550a - > -) +TARGET_LINK_LIBRARIES ( + driver INTERFACE $<$: ns16550a + > $<$: pl011 >) -if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") - add_subdirectory( - ns16550a - ) -endif () +IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") + ADD_SUBDIRECTORY (ns16550a) +ELSEIF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + ADD_SUBDIRECTORY (pl011) +ENDIF() diff --git a/src/kernel/driver/pl011/CMakeLists.txt b/src/kernel/driver/pl011/CMakeLists.txt new file mode 100644 index 000000000..2e6be4087 --- /dev/null +++ b/src/kernel/driver/pl011/CMakeLists.txt @@ -0,0 +1,10 @@ +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +ADD_LIBRARY (pl011 INTERFACE) + +TARGET_INCLUDE_DIRECTORIES (pl011 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) + +TARGET_SOURCES (pl011 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/pl011.cpp) diff --git a/src/kernel/driver/pl011/README.md b/src/kernel/driver/pl011/README.md new file mode 100644 index 000000000..9de48f0c2 --- /dev/null +++ b/src/kernel/driver/pl011/README.md @@ -0,0 +1,13 @@ +# pl011 + +aarch64 使用的 uart + +``` +pl011@9000000 { + clock-names = "uartclk\0apb_pclk"; + clocks = <0x8000 0x8000>; + interrupts = <0x00 0x01 0x04>; + reg = <0x00 0x9000000 0x00 0x1000>; + compatible = "arm,pl011\0arm,primecell"; + }; +``` diff --git a/src/kernel/driver/pl011/include/pl011.h b/src/kernel/driver/pl011/include/pl011.h new file mode 100644 index 000000000..24f3918c9 --- /dev/null +++ b/src/kernel/driver/pl011/include/pl011.h @@ -0,0 +1,76 @@ + +/** + * @file pl011.h + * @brief pl011 头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2024-05-24 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2024-05-24Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_SRC_KERNEL_DRIVER_PL011_INCLUDE_PL011_H_ +#define SIMPLEKERNEL_SRC_KERNEL_DRIVER_PL011_INCLUDE_PL011_H_ + +#include + +class Pl011 { + public: + /** + * 构造函数 + * @param dev_addr 设备地址 + */ + explicit Pl011(uintptr_t dev_addr); + + /// @name 默认构造/析构函数 + /// @{ + Pl011() = delete; + Pl011(const Pl011& na16550a) = delete; + Pl011(Pl011&& na16550a) = delete; + auto operator=(const Pl011& na16550a) -> Pl011& = delete; + auto operator=(Pl011&& na16550a) -> Pl011& = delete; + ~Pl011() = default; + /// @} + + void PutChar(uint8_t c); + + private: + /// read mode: Receive holding reg + static constexpr const uint8_t kRegRHR = 0; + /// write mode: Transmit Holding Reg + static constexpr const uint8_t kRegTHR = 0; + /// write mode: interrupt enable reg + static constexpr const uint8_t kRegIER = 1; + /// write mode: FIFO control Reg + static constexpr const uint8_t kRegFCR = 2; + /// read mode: Interrupt Status Reg + static constexpr const uint8_t kRegISR = 2; + /// write mode:Line Control Reg + static constexpr const uint8_t kRegLCR = 3; + /// write mode:Modem Control Reg + static constexpr const uint8_t kRegMCR = 4; + /// read mode: Line Status Reg + static constexpr const uint8_t kRegLSR = 5; + /// read mode: Modem Status Reg + static constexpr const uint8_t kRegMSR = 6; + + /// LSB of divisor Latch when enabled + static constexpr const uint8_t kUartDLL = 0; + /// MSB of divisor Latch when enabled + static constexpr const uint8_t kUartDLM = 1; + + uintptr_t base_addr_; + + inline volatile uint8_t* Reg(uint8_t reg); + + inline uint8_t Read(uint8_t reg); + + inline void Write(uint8_t reg, uint8_t c); +}; + +#endif /* SIMPLEKERNEL_SRC_KERNEL_DRIVER_PL011_INCLUDE_PL011_H_ */ diff --git a/src/kernel/driver/pl011/pl011.cpp b/src/kernel/driver/pl011/pl011.cpp new file mode 100644 index 000000000..6946f1a04 --- /dev/null +++ b/src/kernel/driver/pl011/pl011.cpp @@ -0,0 +1,46 @@ + +/** + * @file pl011.h + * @brief pl011 头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2024-05-24 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2024-05-24Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +#include "pl011.h" + +Pl011::Pl011(uintptr_t dev_addr) : base_addr_(dev_addr) { + // disable interrupt + Write(kRegIER, 0x00); + // set baud rate + Write(kRegLCR, 0x80); + Write(kUartDLL, 0x03); + Write(kUartDLM, 0x00); + // set word length to 8-bits + Write(kRegLCR, 0x03); + // enable FIFOs + Write(kRegFCR, 0x07); + // enable receiver interrupts + Write(kRegIER, 0x01); +} + +void Pl011::PutChar(uint8_t c) { + while ((Read(kRegLSR) & (1 << 5)) == 0) + ; + Write(kRegTHR, c); +} + +volatile uint8_t* Pl011::Reg(uint8_t reg) { + return (volatile uint8_t*)(base_addr_ + reg); +} + +uint8_t Pl011::Read(uint8_t reg) { return (*(Reg(reg))); } + +void Pl011::Write(uint8_t reg, uint8_t c) { (*Reg(reg)) = c; } From fb59dd96ae7b81d0aed5272dd2c425dbe1959a94 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 12:49:18 +0000 Subject: [PATCH 124/232] feat: update dts Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++++++++++-------------- src/kernel/driver/pl011/README.md | 2 ++ src/kernel/include/kernel_fdt.hpp | 12 ++++++++++-- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..befc52f71 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_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 + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/driver/pl011/README.md b/src/kernel/driver/pl011/README.md index 9de48f0c2..b061fdc4f 100644 --- a/src/kernel/driver/pl011/README.md +++ b/src/kernel/driver/pl011/README.md @@ -2,6 +2,8 @@ aarch64 使用的 uart +https://developer.arm.com/documentation/ddi0183/g/ + ``` pl011@9000000 { clock-names = "uartclk\0apb_pclk"; diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index 3450b960f..229211c57 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -112,9 +112,17 @@ class KernelFdt { uint64_t size = 0; int len = 0; + int offset = 0; - // 找到 /memory 节点 - auto offset = fdt_path_offset(fdt_addr_, "/soc/serial"); + std::array compatible_str = {"arm,pl011\0arm,primecell", + "ns16550a"}; + + for (const auto &compatible : compatible_str) { + offset = fdt_node_offset_by_compatible(fdt_addr_, -1, compatible); + if (offset != -FDT_ERR_NOTFOUND) { + break; + } + } if (offset < 0) { klog::Err("Error finding /soc/serial node: %s\n", fdt_strerror(offset)); throw; From 969895c350d2e9f19e78018223428058040b6ef6 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 12:51:38 +0000 Subject: [PATCH 125/232] feat: add pl011 driver Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++------ src/kernel/arch/aarch64/arch_main.cpp | 47 ++++++++++++++++++++ src/kernel/driver/pl011/include/pl011.h | 58 ++++++++++++++----------- 3 files changed, 93 insertions(+), 40 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..f09ff93f5 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 b64e59fc9..2aaf2a88b 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -17,6 +17,11 @@ #include #include "arch.h" +#include "basic_info.hpp" +#include "kernel_elf.hpp" +#include "kernel_fdt.hpp" +#include "per_cpu.hpp" +#include "pl011.h" #include "sk_cstdio" // printf_bare_metal 基本输出实现 @@ -25,6 +30,24 @@ extern "C" void _putchar(char character) { *kUartAddr = character; } +BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) { + (void)argc; + (void)argv; + + auto [memory_base, memory_size] = + Singleton::GetInstance().GetMemory(); + physical_memory_addr = memory_base; + physical_memory_size = memory_size; + + kernel_addr = reinterpret_cast(__executable_start); + kernel_size = reinterpret_cast(end) - + reinterpret_cast(__executable_start); + elf_addr = 0; + elf_size = 0; + + fdt_addr = 0x40000000; +} + auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { (void)argc; (void)argv; @@ -32,6 +55,30 @@ auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { // 初始化 FPU cpu_io::SetupFpu(); + Singleton::GetInstance() = KernelFdt(0x40000000); + + Singleton::GetInstance() = BasicInfo(argc, argv); + Singleton::GetInstance().core_count++; + sk_std::cout << Singleton::GetInstance(); + + auto [serial_base, serial_size] = + Singleton::GetInstance().GetSerial(); + auto uart = Pl011(serial_base); + uart.PutChar('H'); + uart.PutChar('e'); + uart.PutChar('l'); + uart.PutChar('l'); + uart.PutChar('o'); + uart.PutChar(' '); + uart.PutChar('u'); + uart.PutChar('a'); + uart.PutChar('r'); + uart.PutChar('t'); + uart.PutChar('!'); + uart.PutChar('\n'); + + __asm__ volatile("sev"); + return 0; } diff --git a/src/kernel/driver/pl011/include/pl011.h b/src/kernel/driver/pl011/include/pl011.h index 24f3918c9..30c5884b6 100644 --- a/src/kernel/driver/pl011/include/pl011.h +++ b/src/kernel/driver/pl011/include/pl011.h @@ -19,13 +19,17 @@ #include +/** + * @brief PL011 串口驱动 + * @see https://developer.arm.com/documentation/ddi0183/g/ + */ class Pl011 { public: /** * 构造函数 * @param dev_addr 设备地址 */ - explicit Pl011(uintptr_t dev_addr); + explicit Pl011(uint64_t dev_addr); /// @name 默认构造/析构函数 /// @{ @@ -40,31 +44,33 @@ class Pl011 { void PutChar(uint8_t c); private: - /// read mode: Receive holding reg - static constexpr const uint8_t kRegRHR = 0; - /// write mode: Transmit Holding Reg - static constexpr const uint8_t kRegTHR = 0; - /// write mode: interrupt enable reg - static constexpr const uint8_t kRegIER = 1; - /// write mode: FIFO control Reg - static constexpr const uint8_t kRegFCR = 2; - /// read mode: Interrupt Status Reg - static constexpr const uint8_t kRegISR = 2; - /// write mode:Line Control Reg - static constexpr const uint8_t kRegLCR = 3; - /// write mode:Modem Control Reg - static constexpr const uint8_t kRegMCR = 4; - /// read mode: Line Status Reg - static constexpr const uint8_t kRegLSR = 5; - /// read mode: Modem Status Reg - static constexpr const uint8_t kRegMSR = 6; - - /// LSB of divisor Latch when enabled - static constexpr const uint8_t kUartDLL = 0; - /// MSB of divisor Latch when enabled - static constexpr const uint8_t kUartDLM = 1; - - uintptr_t base_addr_; + static constexpr const uint32_t DR_OFFSET = 0x000; + static constexpr const uint32_t FR_OFFSET = 0x018; + static constexpr const uint32_t IBRD_OFFSET = 0x024; + static constexpr const uint32_t FBRD_OFFSET = 0x028; + static constexpr const uint32_t LCR_OFFSET = 0x02c; + static constexpr const uint32_t CR_OFFSET = 0x030; + static constexpr const uint32_t IMSC_OFFSET = 0x038; + static constexpr const uint32_t DMACR_OFFSET = 0x048; + + uint64_t base_addr_; + uint64_t base_clock; + uint32_t baudrate; + + void calculate_divisiors(uint32_t* integer, uint32_t* fractional) { + // 64 * F_UARTCLK / (16 * B) = 4 * F_UARTCLK / B + const uint32_t div = 4 * base_clock / baudrate; + + *fractional = div & 0x3f; + *integer = (div >> 6) & 0xffff; + } + + static const uint32_t FR_BUSY = (1 << 3); + + void wait_tx_complete(const struct pl011* dev) { + while ((*Read(FR_OFFSET) * FR_BUSY) != 0) { + } + } inline volatile uint8_t* Reg(uint8_t reg); From f2a30b1752cb5a1242dda4134334897caaa42b72 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 13:08:19 +0000 Subject: [PATCH 126/232] feat: direct mem io Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++++++---------- src/kernel/include/io.hpp | 54 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 src/kernel/include/io.hpp diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..befc52f71 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_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 + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/src/kernel/include/io.hpp b/src/kernel/include/io.hpp new file mode 100644 index 000000000..0f3a6a413 --- /dev/null +++ b/src/kernel/include/io.hpp @@ -0,0 +1,54 @@ + +/** + * @file io.hpp + * @brief 直接内存读写 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2022-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2022-01-01MRNIU迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_IO_HPP_ +#define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_IO_HPP_ + +#include + +#include +#include +#include + +#include "per_cpu.hpp" +#include "sk_cstdio" + +namespace io { +/** + * @brief 从指定地址读数据 + * @tparam T 要读的数据类型 + * @param addr 要读的指定地址 + * @return T 读取到的数据 + */ +template +static __always_inline auto In(const uint64_t addr) -> T { + return *reinterpret_cast(addr); +} + +/** + * @brief 向指定地址写数据 + * @tparam T 要写的数据类型 + * @param addr 要写的指定地址 + * @param data 要写的数据 + */ +template +static __always_inline void Out(const uint64_t addr, const T data) { + *reinterpret_cast(addr) = data; +} + +} // namespace io + +#endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_IO_HPP_ */ From d556202c1df2f3cb2d56e184692d2bd87881215b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 13:12:58 +0000 Subject: [PATCH 127/232] feat: direct mem io Signed-off-by: Zone.N --- src/kernel/driver/ns16550a/include/ns16550a.h | 12 ++----- src/kernel/driver/ns16550a/ns16550a.cpp | 33 ++++++++----------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/kernel/driver/ns16550a/include/ns16550a.h b/src/kernel/driver/ns16550a/include/ns16550a.h index 77406ccd7..117894d16 100644 --- a/src/kernel/driver/ns16550a/include/ns16550a.h +++ b/src/kernel/driver/ns16550a/include/ns16550a.h @@ -25,7 +25,7 @@ class Ns16550a { * 构造函数 * @param dev_addr 设备地址 */ - explicit Ns16550a(uintptr_t dev_addr); + explicit Ns16550a(uint64_t dev_addr); /// @name 默认构造/析构函数 /// @{ @@ -37,7 +37,7 @@ class Ns16550a { ~Ns16550a() = default; /// @} - void PutChar(uint8_t c); + void PutChar(uint8_t c) const; private: /// read mode: Receive holding reg @@ -64,13 +64,7 @@ class Ns16550a { /// MSB of divisor Latch when enabled static constexpr const uint8_t kUartDLM = 1; - uintptr_t base_addr_; - - inline volatile uint8_t* Reg(uint8_t reg); - - inline uint8_t Read(uint8_t reg); - - inline void Write(uint8_t reg, uint8_t c); + uint64_t base_addr_; }; #endif /* SIMPLEKERNEL_SRC_KERNEL_DRIVER_NS16550A_INCLUDE_NS16550A_H_ */ diff --git a/src/kernel/driver/ns16550a/ns16550a.cpp b/src/kernel/driver/ns16550a/ns16550a.cpp index d3b311794..4ff4be1d1 100644 --- a/src/kernel/driver/ns16550a/ns16550a.cpp +++ b/src/kernel/driver/ns16550a/ns16550a.cpp @@ -16,31 +16,26 @@ #include "ns16550a.h" -Ns16550a::Ns16550a(uintptr_t dev_addr) : base_addr_(dev_addr) { +#include "io.hpp" + +Ns16550a::Ns16550a(uint64_t dev_addr) : base_addr_(dev_addr) { // disable interrupt - Write(kRegIER, 0x00); + io::Out(base_addr_ + kRegIER, 0x00); // set baud rate - Write(kRegLCR, 0x80); - Write(kUartDLL, 0x03); - Write(kUartDLM, 0x00); + io::Out(base_addr_ + kRegLCR, 0x80); + io::Out(base_addr_ + kUartDLL, 0x03); + io::Out(base_addr_ + kUartDLM, 0x00); // set word length to 8-bits - Write(kRegLCR, 0x03); + io::Out(base_addr_ + kRegLCR, 0x03); // enable FIFOs - Write(kRegFCR, 0x07); + io::Out(base_addr_ + kRegFCR, 0x07); // enable receiver interrupts - Write(kRegIER, 0x01); + io::Out(base_addr_ + kRegIER, 0x01); } -void Ns16550a::PutChar(uint8_t c) { - while ((Read(kRegLSR) & (1 << 5)) == 0) +void Ns16550a::PutChar(uint8_t c) const { + while ((io::In(base_addr_ + kRegLSR) & (1 << 5)) == 0) { ; - Write(kRegTHR, c); -} - -volatile uint8_t* Ns16550a::Reg(uint8_t reg) { - return (volatile uint8_t*)(base_addr_ + reg); + } + io::Out(base_addr_ + kRegTHR, c); } - -uint8_t Ns16550a::Read(uint8_t reg) { return (*(Reg(reg))); } - -void Ns16550a::Write(uint8_t reg, uint8_t c) { (*Reg(reg)) = c; } From 0344d038c10ba1511af775c3b9451ed32e159a79 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 13:49:41 +0000 Subject: [PATCH 128/232] feat: add pl011 driver Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++---- src/kernel/driver/pl011/include/pl011.h | 105 +++++++++++++++++------- src/kernel/driver/pl011/pl011.cpp | 48 ++++++----- 3 files changed, 117 insertions(+), 64 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..f09ff93f5 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/driver/pl011/include/pl011.h b/src/kernel/driver/pl011/include/pl011.h index 30c5884b6..cd1ccf242 100644 --- a/src/kernel/driver/pl011/include/pl011.h +++ b/src/kernel/driver/pl011/include/pl011.h @@ -44,39 +44,86 @@ class Pl011 { void PutChar(uint8_t c); private: - static constexpr const uint32_t DR_OFFSET = 0x000; - static constexpr const uint32_t FR_OFFSET = 0x018; - static constexpr const uint32_t IBRD_OFFSET = 0x024; - static constexpr const uint32_t FBRD_OFFSET = 0x028; - static constexpr const uint32_t LCR_OFFSET = 0x02c; - static constexpr const uint32_t CR_OFFSET = 0x030; - static constexpr const uint32_t IMSC_OFFSET = 0x038; - static constexpr const uint32_t DMACR_OFFSET = 0x048; + /// data register + static constexpr const uint32_t kRegDR = 0x00; + /// receive status or error clear + static constexpr const uint32_t kRegRSRECR = 0x04; + /// DMA watermark configure + static constexpr const uint32_t kRegDmaWm = 0x08; + /// Timeout period + static constexpr const uint32_t kRegTimeOut = 0x0C; + /// flag register + static constexpr const uint32_t kRegFR = 0x18; + /// IrDA low-poer + static constexpr const uint32_t kRegILPR = 0x20; + /// integer baud register + static constexpr const uint32_t kRegIBRD = 0x24; + /// fractional baud register + static constexpr const uint32_t kRegFBRD = 0x28; + /// line control register + static constexpr const uint32_t kRegLCRH = 0x2C; + /// control register + static constexpr const uint32_t kRegCR = 0x30; + /// interrupt FIFO level select + static constexpr const uint32_t kRegIFLS = 0x34; + /// interrupt mask set/clear + static constexpr const uint32_t kRegIMSC = 0x38; + /// raw interrupt register + static constexpr const uint32_t kRegRIS = 0x3C; + /// masked interrupt register + static constexpr const uint32_t kRegMIS = 0x40; + /// interrupt clear register + static constexpr const uint32_t kRegICR = 0x44; + /// DMA control register + static constexpr const uint32_t kRegDmaCR = 0x48; + + /// flag register bits + static constexpr const uint32_t kFRRTXDIS = (1 << 13); + static constexpr const uint32_t kFRTERI = (1 << 12); + static constexpr const uint32_t kFRDDCD = (1 << 11); + static constexpr const uint32_t kFRDDSR = (1 << 10); + static constexpr const uint32_t kFRDCTS = (1 << 9); + static constexpr const uint32_t kFRRI = (1 << 8); + static constexpr const uint32_t kFRTXFE = (1 << 7); + static constexpr const uint32_t kFRRXFF = (1 << 6); + static constexpr const uint32_t kFRTxFIFO = (1 << 5); + static constexpr const uint32_t kFRRXFE = (1 << 4); + static constexpr const uint32_t kFRBUSY = (1 << 3); + static constexpr const uint32_t kFRDCD = (1 << 2); + static constexpr const uint32_t kFRDSR = (1 << 1); + static constexpr const uint32_t kFRCTS = (1 << 0); + + /// transmit/receive line register bits + static constexpr const uint32_t kLCRHSPS = (1 << 7); + static constexpr const uint32_t kLCRHWlen8 = (3 << 5); + static constexpr const uint32_t kLCRHWLEN_7 = (2 << 5); + static constexpr const uint32_t kLCRHWLEN_6 = (1 << 5); + static constexpr const uint32_t kLCRHWLEN_5 = (0 << 5); + static constexpr const uint32_t kLCRHFEN = (1 << 4); + static constexpr const uint32_t kLCRHSTP2 = (1 << 3); + static constexpr const uint32_t kLCRHEPS = (1 << 2); + static constexpr const uint32_t kLCRHPEN = (1 << 1); + static constexpr const uint32_t kLCRHBRK = (1 << 0); + + /// control register bits + static constexpr const uint32_t kCRCTSEN = (1 << 15); + static constexpr const uint32_t kCRRTSEN = (1 << 14); + static constexpr const uint32_t kCROUT2 = (1 << 13); + static constexpr const uint32_t kCROUT1 = (1 << 12); + static constexpr const uint32_t kCRRTS = (1 << 11); + static constexpr const uint32_t kCRDTR = (1 << 10); + static constexpr const uint32_t kCRRxEnable = (1 << 9); + static constexpr const uint32_t kCRTxEnable = (1 << 8); + static constexpr const uint32_t kCRLPE = (1 << 7); + static constexpr const uint32_t kCROVSFACT = (1 << 3); + static constexpr const uint32_t kCREnable = (1 << 0); + + static constexpr const uint32_t kIMSCRTIM = (1 << 6); + static constexpr const uint32_t kIMSCRxim = (1 << 4); uint64_t base_addr_; uint64_t base_clock; uint32_t baudrate; - - void calculate_divisiors(uint32_t* integer, uint32_t* fractional) { - // 64 * F_UARTCLK / (16 * B) = 4 * F_UARTCLK / B - const uint32_t div = 4 * base_clock / baudrate; - - *fractional = div & 0x3f; - *integer = (div >> 6) & 0xffff; - } - - static const uint32_t FR_BUSY = (1 << 3); - - void wait_tx_complete(const struct pl011* dev) { - while ((*Read(FR_OFFSET) * FR_BUSY) != 0) { - } - } - - inline volatile uint8_t* Reg(uint8_t reg); - - inline uint8_t Read(uint8_t reg); - - inline void Write(uint8_t reg, uint8_t c); }; #endif /* SIMPLEKERNEL_SRC_KERNEL_DRIVER_PL011_INCLUDE_PL011_H_ */ diff --git a/src/kernel/driver/pl011/pl011.cpp b/src/kernel/driver/pl011/pl011.cpp index 6946f1a04..0a4a7d054 100644 --- a/src/kernel/driver/pl011/pl011.cpp +++ b/src/kernel/driver/pl011/pl011.cpp @@ -16,31 +16,37 @@ #include "pl011.h" +#include "io.hpp" + Pl011::Pl011(uintptr_t dev_addr) : base_addr_(dev_addr) { - // disable interrupt - Write(kRegIER, 0x00); - // set baud rate - Write(kRegLCR, 0x80); - Write(kUartDLL, 0x03); - Write(kUartDLM, 0x00); - // set word length to 8-bits - Write(kRegLCR, 0x03); - // enable FIFOs - Write(kRegFCR, 0x07); - // enable receiver interrupts - Write(kRegIER, 0x01); + // Clear all errors + io::Out(base_addr_ + kRegRSRECR, 0); + // Disable everything + io::Out(base_addr_ + kRegCR, 0); + + // if (baud_rate) { + // uint32_t divisor = (uart_clk * 4) / baud_rate; + + // io::Out(base_addr_ + kRegIBRD, divisor >> 6); + // io::Out(base_addr_ + kRegFBRD, divisor & 0x3f); + // } + + // Configure TX to 8 bits, 1 stop bit, no parity, fifo disabled. + io::Out(base_addr_ + kRegLCRH, kLCRHWlen8); + + // Enable receive interrupt + io::Out(base_addr_ + kRegIMSC, kIMSCRxim); + + // Enable UART and RX/TX + io::Out(base_addr_ + kRegCR, kCREnable | kCRTxEnable | kCRRxEnable); } void Pl011::PutChar(uint8_t c) { - while ((Read(kRegLSR) & (1 << 5)) == 0) + /* Wait until there is space in the FIFO or device is disabled */ + while (io::In(base_addr_ + kRegFR) & kFRTxFIFO) { ; - Write(kRegTHR, c); -} + } -volatile uint8_t* Pl011::Reg(uint8_t reg) { - return (volatile uint8_t*)(base_addr_ + reg); + /* Send the character */ + io::Out(base_addr_ + kRegDR, c); } - -uint8_t Pl011::Read(uint8_t reg) { return (*(Reg(reg))); } - -void Pl011::Write(uint8_t reg, uint8_t c) { (*Reg(reg)) = c; } From 7e87e9487990a8ccb9df6e17baa4848169745518 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 13:56:52 +0000 Subject: [PATCH 129/232] feat: add pl011 driver Signed-off-by: Zone.N --- src/kernel/arch/aarch64/boot.S | 19 +++++++++++++++++-- src/kernel/driver/pl011/include/pl011.h | 10 ++++++---- src/kernel/driver/pl011/pl011.cpp | 16 ++++++++-------- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/kernel/arch/aarch64/boot.S b/src/kernel/arch/aarch64/boot.S index e39ea93d4..9e82e7fdf 100644 --- a/src/kernel/arch/aarch64/boot.S +++ b/src/kernel/arch/aarch64/boot.S @@ -49,8 +49,23 @@ multiboot_header_end: .type _boot, @function .extern _start _boot: - ldr x30, =stack_top - mov sp, x30 + // 获取启动核 ID + mrs x10, mpidr_el1 + and x10, x10, #0xFF + add x10, x10, #1 + + // 按照每个 core 设置栈地址 + lsl x10, x10, #12 + + // 按照每个 core 设置栈地址 + ldr x11, =stack_top + add x11, x11, x10 + mov sp, x11 + + // 保存传递的参数(假设传递的参数在 x0 和 x1 中) + // 开辟栈空间 + stp x0, x1, [sp, #-16]! // 保存 x0 和 x1 到栈中 + bl _start b . diff --git a/src/kernel/driver/pl011/include/pl011.h b/src/kernel/driver/pl011/include/pl011.h index cd1ccf242..55e93dce1 100644 --- a/src/kernel/driver/pl011/include/pl011.h +++ b/src/kernel/driver/pl011/include/pl011.h @@ -28,8 +28,10 @@ class Pl011 { /** * 构造函数 * @param dev_addr 设备地址 + * @param uart_clk 串口时钟 + * @param baud_rate 波特率 */ - explicit Pl011(uint64_t dev_addr); + explicit Pl011(uint64_t dev_addr, uint64_t clock = 0, uint64_t baud_rate = 0); /// @name 默认构造/析构函数 /// @{ @@ -121,9 +123,9 @@ class Pl011 { static constexpr const uint32_t kIMSCRTIM = (1 << 6); static constexpr const uint32_t kIMSCRxim = (1 << 4); - uint64_t base_addr_; - uint64_t base_clock; - uint32_t baudrate; + uint64_t base_addr_ = 0; + uint64_t base_clock_ = 0; + uint64_t baud_rate_ = 0; }; #endif /* SIMPLEKERNEL_SRC_KERNEL_DRIVER_PL011_INCLUDE_PL011_H_ */ diff --git a/src/kernel/driver/pl011/pl011.cpp b/src/kernel/driver/pl011/pl011.cpp index 0a4a7d054..be4fa1498 100644 --- a/src/kernel/driver/pl011/pl011.cpp +++ b/src/kernel/driver/pl011/pl011.cpp @@ -18,18 +18,19 @@ #include "io.hpp" -Pl011::Pl011(uintptr_t dev_addr) : base_addr_(dev_addr) { +Pl011::Pl011(uint64_t dev_addr, uint64_t clock, uint64_t baud_rate) + : base_addr_(dev_addr), base_clock_(clock), baud_rate_(baud_rate) { // Clear all errors io::Out(base_addr_ + kRegRSRECR, 0); // Disable everything io::Out(base_addr_ + kRegCR, 0); - // if (baud_rate) { - // uint32_t divisor = (uart_clk * 4) / baud_rate; + if (baud_rate_ != 0) { + uint32_t divisor = (base_clock_ * 4) / baud_rate_; - // io::Out(base_addr_ + kRegIBRD, divisor >> 6); - // io::Out(base_addr_ + kRegFBRD, divisor & 0x3f); - // } + io::Out(base_addr_ + kRegIBRD, divisor >> 6); + io::Out(base_addr_ + kRegFBRD, divisor & 0x3f); + } // Configure TX to 8 bits, 1 stop bit, no parity, fifo disabled. io::Out(base_addr_ + kRegLCRH, kLCRHWlen8); @@ -42,11 +43,10 @@ Pl011::Pl011(uintptr_t dev_addr) : base_addr_(dev_addr) { } void Pl011::PutChar(uint8_t c) { - /* Wait until there is space in the FIFO or device is disabled */ + // Wait until there is space in the FIFO or device is disabled while (io::In(base_addr_ + kRegFR) & kFRTxFIFO) { ; } - /* Send the character */ io::Out(base_addr_ + kRegDR, c); } From be0ca63fb69a64583141ecc921e9cd0a5bbf918b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 13:57:05 +0000 Subject: [PATCH 130/232] feat: add pl011 driver Signed-off-by: Zone.N --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..405c4f002 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/root/SimpleKernel/build_aarch64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -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: From 4aa5f9281fe4e8062d090aaa6718fc9d9feb432e Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 8 Jan 2025 14:10:50 +0000 Subject: [PATCH 131/232] feat: aarch64 _putchar Signed-off-by: Zone.N --- .pre-commit-config.yaml | 14 +++++++------- src/kernel/arch/aarch64/arch_main.cpp | 20 ++++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 405c4f002..f09ff93f5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/root/SimpleKernel/build_aarch64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -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: diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index 2aaf2a88b..78fd18002 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -25,9 +25,13 @@ #include "sk_cstdio" // printf_bare_metal 基本输出实现 +namespace { +Pl011* pl011 = nullptr; +} extern "C" void _putchar(char character) { - static auto* kUartAddr = (uint8_t*)0x09000000; - *kUartAddr = character; + if (pl011) { + pl011->PutChar(character); + } } BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) { @@ -49,9 +53,6 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) { } auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { - (void)argc; - (void)argv; - // 初始化 FPU cpu_io::SetupFpu(); @@ -59,11 +60,14 @@ auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { Singleton::GetInstance() = BasicInfo(argc, argv); Singleton::GetInstance().core_count++; - sk_std::cout << Singleton::GetInstance(); auto [serial_base, serial_size] = Singleton::GetInstance().GetSerial(); - auto uart = Pl011(serial_base); + + static auto uart = Pl011(serial_base); + pl011 = &uart; + sk_std::cout << Singleton::GetInstance(); + uart.PutChar('H'); uart.PutChar('e'); uart.PutChar('l'); @@ -77,7 +81,7 @@ auto ArchInit(uint32_t argc, const uint8_t* argv) -> uint32_t { uart.PutChar('!'); uart.PutChar('\n'); - __asm__ volatile("sev"); + // __asm__ volatile("sev"); return 0; } From aece0e9ef07c6e5be147abb2e3834c959bcce52c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 10 Jan 2025 16:43:57 +0000 Subject: [PATCH 132/232] 3rd: update cpu_io Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++++++++++-------------- 3rd/cpu_io | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..09286cfad 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_x86_64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -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 + # - -p=/root/SimpleKernel/build_x86_64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_x86_64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index 43725dcd6..95e6c8e44 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 43725dcd6808864f195d8a178c096a77e785a6ce +Subproject commit 95e6c8e4494611d1674753edc713e767bd5fcb6e From 68f625fd39f33f8604b2d4dddfcbc3d097ba9be2 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Sun, 19 Jan 2025 08:55:31 +0000 Subject: [PATCH 133/232] 3rd: update cpu_io Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- 3rd/cpu_io | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09286cfad..befc52f71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_x86_64/compiler_commands.json + - -p=/root/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/x86_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + - --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_x86_64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv_64|/root/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/root/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/root/SimpleKernel/build_x86_64/src/arch/riscv64|/root/SimpleKernel/build_x86_64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/3rd/cpu_io b/3rd/cpu_io index 95e6c8e44..cd2c13bef 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit 95e6c8e4494611d1674753edc713e767bd5fcb6e +Subproject commit cd2c13bef5693f69c001f4d7b27f2e7c1907229a From f1e9e2e8600fa68abd83b4fd2effd875f637217f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Sun, 19 Jan 2025 09:19:29 +0000 Subject: [PATCH 134/232] feat: add fdt header Signed-off-by: Zone.N --- src/kernel/include/kernel_fdt.hpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index 229211c57..ff6df031c 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -47,7 +47,7 @@ class KernelFdt { * @param fdt_addr fdt 地址 */ explicit KernelFdt(uint64_t fdt_addr) - : fdt_addr_(reinterpret_cast(fdt_addr)) { + : fdt_addr_(reinterpret_cast(fdt_addr)) { if (fdt_addr_ == nullptr) { klog::Err("Fatal Error: Invalid fdt_addr.\n"); throw; @@ -145,7 +145,20 @@ class KernelFdt { } private: - void *fdt_addr_; + 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_ */ From 827899ee50ac8357926d6cec7cefe0de74d9a1d2 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Sun, 19 Jan 2025 09:25:42 +0000 Subject: [PATCH 135/232] feat: placement new Signed-off-by: Zone.N --- src/kernel/libcxx/include/sk_new | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/kernel/libcxx/include/sk_new b/src/kernel/libcxx/include/sk_new index 489baf66e..0af9ea81c 100644 --- a/src/kernel/libcxx/include/sk_new +++ b/src/kernel/libcxx/include/sk_new @@ -19,13 +19,13 @@ #include -void* operator new(size_t) noexcept; +[[nodiscard]] void* operator new(size_t) noexcept; -void* operator new[](size_t) noexcept; +[[nodiscard]] void* operator new[](size_t) noexcept; -void* operator new(size_t, size_t) noexcept; +[[nodiscard]] void* operator new(size_t, size_t) noexcept; -void* operator new[](size_t, size_t) noexcept; +[[nodiscard]] void* operator new[](size_t, size_t) noexcept; void operator delete(void*); @@ -35,4 +35,18 @@ void operator delete[](void*); void operator delete[](void*, size_t); +// Default placement versions of operator new. +[[nodiscard]] __always_inline void* operator new(std::size_t, + void* p) noexcept { + return p; +} +[[nodiscard]] __always_inline void* operator new[](std::size_t, + void* p) noexcept { + return p; +} + +// Default placement versions of operator delete. +__always_inline void operator delete(void*, void*) noexcept {} +__always_inline void operator delete[](void*, void*) noexcept {} + #endif /* SIMPLEKERNEL_SRC_KERNEL_LIBCXX_INCLUDE_SK_NEW_ */ From 214fbf9aba7cd43b746f5f36a9ea24de1eafd19b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Sun, 19 Jan 2025 09:54:29 +0000 Subject: [PATCH 136/232] feat: add fdt header Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++++------- src/kernel/arch/aarch64/arch_main.cpp | 9 ++--- src/kernel/arch/aarch64/backtrace.cpp | 3 +- src/kernel/arch/arch.h | 4 +- src/kernel/arch/riscv64/arch_main.cpp | 7 +--- src/kernel/arch/riscv64/backtrace.cpp | 3 +- src/kernel/include/kernel_fdt.hpp | 53 +++++++++++++-------------- src/kernel/main.cpp | 19 ++++------ 8 files changed, 59 insertions(+), 67 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index befc52f71..f09ff93f5 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 78fd18002..1a34cdf38 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 bccd4ec3e..2b440ed2f 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 8f9ffbe5f..edee81efb 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 71cd889a8..44a7f71ab 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 cd7077dcf..327cb247f 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 ff6df031c..ff56846aa 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 c72b2aa47..53adaa4f9 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; } From 5118b7c134dfe710c9eb15dc1b0f8a556281d981 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 11 Feb 2025 07:19:03 +0000 Subject: [PATCH 137/232] 3rd: add atf Signed-off-by: Zone.N --- .gitmodules | 6 ++++++ 3rd/arm-trusted-firmware | 1 + 3rd/cpu_io | 2 +- 3rd/smccc | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) create mode 160000 3rd/arm-trusted-firmware create mode 160000 3rd/smccc diff --git a/.gitmodules b/.gitmodules index 45264441a..6439ae1f7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,3 +26,9 @@ [submodule "3rd/cpu_io"] path = 3rd/cpu_io url = https://github.com/MRNIU/cpu_io.git +[submodule "3rd/arm-trusted-firmware"] + path = 3rd/arm-trusted-firmware + url = https://github.com/ARM-software/arm-trusted-firmware.git +[submodule "3rd/smccc"] + path = 3rd/smccc + url = https://github.com/MRNIU/smccc.git diff --git a/3rd/arm-trusted-firmware b/3rd/arm-trusted-firmware new file mode 160000 index 000000000..03a7a43e1 --- /dev/null +++ b/3rd/arm-trusted-firmware @@ -0,0 +1 @@ +Subproject commit 03a7a43e18927c876ef5f554e54fa11d252d4f7e diff --git a/3rd/cpu_io b/3rd/cpu_io index cd2c13bef..f2477fe35 160000 --- a/3rd/cpu_io +++ b/3rd/cpu_io @@ -1 +1 @@ -Subproject commit cd2c13bef5693f69c001f4d7b27f2e7c1907229a +Subproject commit f2477fe35bf01cbcdece2188f4657dc2cdeee34a diff --git a/3rd/smccc b/3rd/smccc new file mode 160000 index 000000000..9894f8e94 --- /dev/null +++ b/3rd/smccc @@ -0,0 +1 @@ +Subproject commit 9894f8e943892e54c1efbf566832136d529ff0f2 From 079bdfa9233293d279a8ff275d4672ca43c73cd8 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 11 Feb 2025 07:20:48 +0000 Subject: [PATCH 138/232] 3rd: add atf Signed-off-by: Zone.N --- .pre-commit-config.yaml | 16 ++++++++-------- cmake/3rd.cmake | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f09ff93f5..280ecd66d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/root/SimpleKernel/build_aarch64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -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: @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 275fb71d6..ab99e9957 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -94,6 +94,40 @@ ADD_SUBDIRECTORY (3rd/printf_bare_metal) # https://github.com/MRNIU/cpu_io.git ADD_SUBDIRECTORY (3rd/cpu_io) +# https://github.com/MRNIU/smccc.git +ADD_SUBDIRECTORY (3rd/smccc) + +IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + # https://github.com/ARM-software/arm-trusted-firmware + # 编译 atf + SET (arm-trusted-firmware_SOURCE_DIR + ${CMAKE_SOURCE_DIR}/3rd/arm-trusted-firmware) + SET (arm-trusted-firmware_BINARY_DIR + ${CMAKE_BINARY_DIR}/3rd/arm-trusted-firmware) + ADD_CUSTOM_TARGET ( + arm-trusted-firmware + COMMENT "build arm-trusted-firmware..." + # make 时编译 + ALL + WORKING_DIRECTORY ${arm-trusted-firmware_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory + ${arm-trusted-firmware_BINARY_DIR} + COMMAND + make CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_JUMP=y + FW_JUMP_ADDR=0x80210000 PLATFORM_RISCV_XLEN=64 PLATFORM=generic + O=${arm-trusted-firmware_BINARY_DIR} + COMMAND + ${CMAKE_COMMAND} -E copy_directory + ${arm-trusted-firmware_SOURCE_DIR}/include + ${arm-trusted-firmware_BINARY_DIR}/include) + ADD_LIBRARY (arm-trusted-firmware-fw_jump INTERFACE) + ADD_DEPENDENCIES (arm-trusted-firmware-fw_jump arm-trusted-firmware) + TARGET_INCLUDE_DIRECTORIES (arm-trusted-firmware-fw_jump + INTERFACE ${dtc_BINARY_DIR}/libfdt) + TARGET_LINK_LIBRARIES (arm-trusted-firmware-fw_jump + INTERFACE ${dtc_BINARY_DIR}/libfdt/libfdt.a) +ENDIF() + IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") # https://github.com/riscv-software-src/opensbi.git # 编译 opensbi From 5626f6ae0fd2bfd89b5d193085076ba83932127b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 11 Feb 2025 08:27:07 +0000 Subject: [PATCH 139/232] 3rd: add atf Signed-off-by: Zone.N --- cmake/3rd.cmake | 16 ++-------------- tools/aarch64_qemu_virt.dts | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index ab99e9957..8f845dc0e 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -112,20 +112,8 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") WORKING_DIRECTORY ${arm-trusted-firmware_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${arm-trusted-firmware_BINARY_DIR} - COMMAND - make CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_JUMP=y - FW_JUMP_ADDR=0x80210000 PLATFORM_RISCV_XLEN=64 PLATFORM=generic - O=${arm-trusted-firmware_BINARY_DIR} - COMMAND - ${CMAKE_COMMAND} -E copy_directory - ${arm-trusted-firmware_SOURCE_DIR}/include - ${arm-trusted-firmware_BINARY_DIR}/include) - ADD_LIBRARY (arm-trusted-firmware-fw_jump INTERFACE) - ADD_DEPENDENCIES (arm-trusted-firmware-fw_jump arm-trusted-firmware) - TARGET_INCLUDE_DIRECTORIES (arm-trusted-firmware-fw_jump - INTERFACE ${dtc_BINARY_DIR}/libfdt) - TARGET_LINK_LIBRARIES (arm-trusted-firmware-fw_jump - INTERFACE ${dtc_BINARY_DIR}/libfdt/libfdt.a) + COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} PLAT=qemu + BUILD_BASE=${arm-trusted-firmware_BINARY_DIR} all) ENDIF() IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") diff --git a/tools/aarch64_qemu_virt.dts b/tools/aarch64_qemu_virt.dts index ab724bb1a..da2fde6af 100644 --- a/tools/aarch64_qemu_virt.dts +++ b/tools/aarch64_qemu_virt.dts @@ -313,25 +313,27 @@ }; pmu { - interrupts = <0x01 0x07 0xf04>; + interrupts = <0x01 0x07 0x04>; compatible = "arm,armv8-pmuv3"; }; intc@8000000 { phandle = <0x8005>; - reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; - compatible = "arm,cortex-a15-gic"; + reg = <0x00 0x8000000 0x00 0x10000 0x00 0x80a0000 0x00 0xf60000>; + #redistributor-regions = <0x01>; + compatible = "arm,gic-v3"; ranges; #size-cells = <0x02>; #address-cells = <0x02>; interrupt-controller; #interrupt-cells = <0x03>; - v2m@8020000 { + its@8080000 { phandle = <0x8006>; - reg = <0x00 0x8020000 0x00 0x1000>; + reg = <0x00 0x8080000 0x00 0x20000>; + #msi-cells = <0x01>; msi-controller; - compatible = "arm,gic-v2m-frame"; + compatible = "arm,gic-v3-its"; }; }; @@ -404,7 +406,7 @@ }; timer { - interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; + interrupts = <0x01 0x0d 0x04 0x01 0x0e 0x04 0x01 0x0b 0x04 0x01 0x0a 0x04>; always-on; compatible = "arm,armv8-timer\0arm,armv7-timer"; }; @@ -419,7 +421,7 @@ chosen { stdout-path = "/pl011@9000000"; - rng-seed = <0x907c997a 0xbf27ad6f 0x5cc53adb 0x4802584a 0xe5091f9c 0x8ba0d409 0xfc70cffd 0xe34f8101>; - kaslr-seed = <0xa03a2344 0x476d1347>; + rng-seed = <0xf400d5b0 0xe686763c 0xcfa6dd1c 0x7072e0a8 0xcae7bce5 0x3f5c7a7b 0x6b328c03 0x4f7c4d2d>; + kaslr-seed = <0xd9851fd9 0xe13afe1c>; }; }; From aca94c88825cb64626a50184c9c0fdc81f738242 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 11 Feb 2025 09:06:40 +0000 Subject: [PATCH 140/232] 3rd: add optee Signed-off-by: Zone.N --- .gitmodules | 9 +++++++++ 3rd/optee/build | 1 + 3rd/optee/optee_client | 1 + 3rd/optee/optee_os | 1 + 4 files changed, 12 insertions(+) create mode 160000 3rd/optee/build create mode 160000 3rd/optee/optee_client create mode 160000 3rd/optee/optee_os diff --git a/.gitmodules b/.gitmodules index 6439ae1f7..49f254ef8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -32,3 +32,12 @@ [submodule "3rd/smccc"] path = 3rd/smccc url = https://github.com/MRNIU/smccc.git +[submodule "3rd/optee/optee_os"] + path = 3rd/optee/optee_os + url = https://github.com/OP-TEE/optee_os.git +[submodule "3rd/optee/build"] + path = 3rd/optee/build + url = https://github.com/OP-TEE/build.git +[submodule "3rd/optee/optee_client"] + path = 3rd/optee/optee_client + url = https://github.com/OP-TEE/optee_client.git diff --git a/3rd/optee/build b/3rd/optee/build new file mode 160000 index 000000000..0ea181332 --- /dev/null +++ b/3rd/optee/build @@ -0,0 +1 @@ +Subproject commit 0ea1813320150b1a6f15cd08c6259dd3bf0e2152 diff --git a/3rd/optee/optee_client b/3rd/optee/optee_client new file mode 160000 index 000000000..648677358 --- /dev/null +++ b/3rd/optee/optee_client @@ -0,0 +1 @@ +Subproject commit 6486773583b5983af8250a47cf07eca938e0e422 diff --git a/3rd/optee/optee_os b/3rd/optee/optee_os new file mode 160000 index 000000000..71aed2dbc --- /dev/null +++ b/3rd/optee/optee_os @@ -0,0 +1 @@ +Subproject commit 71aed2dbcb5a3bd2ee685f268f1eb4f9c885dd92 From b96c2c05e9626041b57f01edbcf9996d108e3aa0 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 11 Feb 2025 11:35:21 +0000 Subject: [PATCH 141/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- CMakeLists.txt | 13 ++++---- cmake/3rd.cmake | 63 +++++++++++++++++++++++++++--------- cmake/aarch64-gcc.cmake | 72 ++++++++++++++++++++++------------------- tools/Dockerfile | 8 +++-- 4 files changed, 97 insertions(+), 59 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 49ba246f8..372bca3e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,7 +83,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") APPEND QEMU_FLAGS -machine - virt + virt,secure=on,gic_version=3 -cpu cortex-a72 -m @@ -92,13 +92,10 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") 4 -net none + -bios + ${arm-trusted-firmware_BINARY_DIR}/flash.bin -kernel - $ - # -bios - # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd - # -hda - # fat:rw:./image/ - ) + $) ENDIF() # 添加要编译的目录 @@ -114,6 +111,8 @@ ADD_RUN_TARGET ( $<$:boot> $<$:boot> $<$:boot> + $<$:optee_os> + $<$:arm-trusted-firmware> kernel WORKING_DIRECTORY ${PROJECT_BINARY_DIR} diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 8f845dc0e..897260063 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -88,6 +88,20 @@ ADD_CUSTOM_TARGET ( SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_SOURCE_DIR}/.gdbinit) +# ovmf +# @todo 使用互联网连接或从 edk2 编译 +# https://efi.akeo.ie/QEMU_EFI/QEMU_EFI-AA64.zip +SET (ovmf_SOURCE_DIR ${CMAKE_SOURCE_DIR}/tools/ovmf) +SET (ovmf_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/ovmf) +ADD_CUSTOM_TARGET ( + ovmf + COMMENT "build ovmf ..." + # make 时编译 + ALL + WORKING_DIRECTORY ${ovmf_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ovmf_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E copy ${ovmf_SOURCE_DIR}/* ${ovmf_BINARY_DIR}) + # https://github.com/MRNIU/printf_bare_metal.git ADD_SUBDIRECTORY (3rd/printf_bare_metal) @@ -98,6 +112,24 @@ ADD_SUBDIRECTORY (3rd/cpu_io) ADD_SUBDIRECTORY (3rd/smccc) IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + # https://github.com/OP-TEE/optee_os.git + SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) + SET (optee_os_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/optee/optee_os) + ADD_CUSTOM_TARGET ( + optee_os + COMMENT "build optee_os..." + # make 时编译 + ALL + WORKING_DIRECTORY ${optee_os_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${optee_os_BINARY_DIR} + COMMAND + make CFG_ARM64_core=y CFG_TEE_BENCHMARK=n CFG_TEE_CORE_LOG_LEVEL=3 + CROSS_COMPILE=${TOOLCHAIN_PREFIX} + CROSS_COMPILE_core=${TOOLCHAIN_PREFIX} + CROSS_COMPILE_ta_arm32=${TOOLCHAIN_PREFIX32} + CROSS_COMPILE_ta_arm64=${TOOLCHAIN_PREFIX} DEBUG=1 + O=${optee_os_BINARY_DIR} PLATFORM=vexpress-qemu_armv8a) + # https://github.com/ARM-software/arm-trusted-firmware # 编译 atf SET (arm-trusted-firmware_SOURCE_DIR @@ -112,8 +144,21 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") WORKING_DIRECTORY ${arm-trusted-firmware_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${arm-trusted-firmware_BINARY_DIR} - COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} PLAT=qemu - BUILD_BASE=${arm-trusted-firmware_BINARY_DIR} all) + COMMAND + make DEBUG=1 CROSS_COMPILE=${TOOLCHAIN_PREFIX} PLAT=qemu + BUILD_BASE=${arm-trusted-firmware_BINARY_DIR} + BL32=${optee_os_BINARY_DIR}/core/tee-header_v2.bin + BL32_EXTRA1=${optee_os_BINARY_DIR}/core/tee-pager_v2.bin + BL32_EXTRA2=${optee_os_BINARY_DIR}/core/tee-pageable_v2.bin + BL33=${ovmf_BINARY_DIR}/OVMF_aarch64.fd BL32_RAM_LOCATION=tdram + QEMU_USE_GIC_DRIVER=QEMU_GICV3 SPD=opteed all fip + COMMAND + dd if=${arm-trusted-firmware_BINARY_DIR}/qemu/debug/bl1.bin + of=${arm-trusted-firmware_BINARY_DIR}/flash.bin bs=4096 conv=notrunc + COMMAND + dd if=${arm-trusted-firmware_BINARY_DIR}/qemu/debug/fip.bin + of=${arm-trusted-firmware_BINARY_DIR}/flash.bin seek=64 bs=4096 + conv=notrunc) ENDIF() IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") @@ -231,20 +276,6 @@ TARGET_LINK_LIBRARIES ( ${gnu-efi_BINARY_DIR}/gnuefi/libgnuefi.a ${gnu-efi_BINARY_DIR}/lib/libefi.a) -# ovmf -# @todo 使用互联网连接或从 edk2 编译 -# https://efi.akeo.ie/QEMU_EFI/QEMU_EFI-AA64.zip -SET (ovmf_SOURCE_DIR ${CMAKE_SOURCE_DIR}/tools/ovmf) -SET (ovmf_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/ovmf) -ADD_CUSTOM_TARGET ( - ovmf - COMMENT "build ovmf ..." - # make 时编译 - ALL - WORKING_DIRECTORY ${ovmf_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${ovmf_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${ovmf_SOURCE_DIR}/* ${ovmf_BINARY_DIR}) - # gdb FIND_PROGRAM (GDB_EXE gdb) IF(NOT GDB_EXE) diff --git a/cmake/aarch64-gcc.cmake b/cmake/aarch64-gcc.cmake index ddf3d9b14..c9fdaefea 100644 --- a/cmake/aarch64-gcc.cmake +++ b/cmake/aarch64-gcc.cmake @@ -1,39 +1,45 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). -# +# # aarch64-gcc.cmake for Simple-XX/SimpleKernel. -if (NOT UNIX) - message(FATAL_ERROR "Only support Linux.") -endif () +IF(NOT UNIX) + MESSAGE (FATAL_ERROR "Only support Linux.") +ENDIF() + +IF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") + FIND_PROGRAM (Compiler_gcc g++) + IF(NOT Compiler_gcc) + MESSAGE ( + FATAL_ERROR "g++ not found.\n" + "Run `sudo apt-get install -y gcc g++` to install.") + ELSE() + MESSAGE (STATUS "Found g++ ${Compiler_gcc}") + ENDIF() -if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") - find_program(Compiler_gcc g++) - if (NOT Compiler_gcc) - message(FATAL_ERROR "g++ not found.\n" - "Run `sudo apt-get install -y gcc g++` to install.") - else () - message(STATUS "Found g++ ${Compiler_gcc}") - endif () -elseif (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64") - find_program(Compiler_gcc aarch64-linux-gnu-g++) - if (NOT Compiler_gcc) - message(FATAL_ERROR "aarch64-linux-gnu-g++ not found.\n" - "Run `sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu` to install.") - else () - message(STATUS "Found aarch64-linux-gnu-g++ ${Compiler_gcc}") - endif () + SET (TOOLCHAIN_PREFIX32 arm-linux-gnueabihf-) +ELSEIF(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64") + FIND_PROGRAM (Compiler_gcc aarch64-linux-gnu-g++) + IF(NOT Compiler_gcc) + MESSAGE ( + FATAL_ERROR + "aarch64-linux-gnu-g++ not found.\n" + "Run `sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu` to install." + ) + ELSE() + MESSAGE (STATUS "Found aarch64-linux-gnu-g++ ${Compiler_gcc}") + ENDIF() - set(TOOLCHAIN_PREFIX aarch64-linux-gnu-) - set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) - set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) - set(CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) - set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) - set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) - set(CMAKE_NM ${TOOLCHAIN_PREFIX}nm) - set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) - set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) -else () - message(FATAL_ERROR "NOT support ${CMAKE_HOST_SYSTEM_PROCESSOR}") -endif () + SET (TOOLCHAIN_PREFIX aarch64-linux-gnu-) + SET (CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) + SET (CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) + SET (CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) + SET (CMAKE_AR ${TOOLCHAIN_PREFIX}ar) + SET (CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) + SET (CMAKE_NM ${TOOLCHAIN_PREFIX}nm) + SET (CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) + SET (CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) + SET (TOOLCHAIN_PREFIX32 arm-linux-gnueabihf-) +ELSE() + MESSAGE (FATAL_ERROR "NOT support ${CMAKE_HOST_SYSTEM_PROCESSOR}") +ENDIF() diff --git a/tools/Dockerfile b/tools/Dockerfile index e18991204..167f0d519 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -71,7 +71,9 @@ RUN apt install --no-install-recommends --fix-missing -y \ pkg-config \ flex \ bison \ - device-tree-compiler + device-tree-compiler \ + python3-cryptography \ + python3-pyelftools RUN apt install --no-install-recommends --fix-missing -y \ gcc \ g++ \ @@ -79,8 +81,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ g++-riscv64-linux-gnu \ gcc-aarch64-linux-gnu \ g++-aarch64-linux-gnu \ - gcc-riscv64-linux-gnu \ - g++-riscv64-linux-gnu \ + gcc-arm-linux-gnueabihf \ + g++-arm-linux-gnueabihf \ gcc-x86-64-linux-gnu \ g++-x86-64-linux-gnu From 39ca177264724134be2fdd7c954d28462b53e47a Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Tue, 11 Feb 2025 22:48:27 +0800 Subject: [PATCH 142/232] feat: working on TEE Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 18 +++++++++--------- CMakeLists.txt | 2 +- cmake/3rd.cmake | 4 ++++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 280ecd66d..8c0d67ced 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/home/ubuntu/github/MRNIU/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).* + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 372bca3e0..b884bd394 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,7 +87,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") -cpu cortex-a72 -m - 128M + 1024M -smp 4 -net diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 897260063..6cb4c364c 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -129,6 +129,8 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") CROSS_COMPILE_ta_arm32=${TOOLCHAIN_PREFIX32} CROSS_COMPILE_ta_arm64=${TOOLCHAIN_PREFIX} DEBUG=1 O=${optee_os_BINARY_DIR} PLATFORM=vexpress-qemu_armv8a) + SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${optee_os_BINARY_DIR}) # https://github.com/ARM-software/arm-trusted-firmware # 编译 atf @@ -159,6 +161,8 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") dd if=${arm-trusted-firmware_BINARY_DIR}/qemu/debug/fip.bin of=${arm-trusted-firmware_BINARY_DIR}/flash.bin seek=64 bs=4096 conv=notrunc) + SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${arm-trusted-firmware_BINARY_DIR}) ENDIF() IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") From bf8c7a572d0225bc603d28d8c095548bd4087168 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 12 Feb 2025 08:14:36 +0800 Subject: [PATCH 143/232] 3rd: update optee and atf version Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 2 +- 3rd/arm-trusted-firmware | 2 +- 3rd/optee/optee_os | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8c0d67ced..cfe4fd29e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/3rd/arm-trusted-firmware b/3rd/arm-trusted-firmware index 03a7a43e1..408ba4ddf 160000 --- a/3rd/arm-trusted-firmware +++ b/3rd/arm-trusted-firmware @@ -1 +1 @@ -Subproject commit 03a7a43e18927c876ef5f554e54fa11d252d4f7e +Subproject commit 408ba4ddfe9a8d55e3e2488bea89c39adef07981 diff --git a/3rd/optee/optee_os b/3rd/optee/optee_os index 71aed2dbc..0919de0f7 160000 --- a/3rd/optee/optee_os +++ b/3rd/optee/optee_os @@ -1 +1 @@ -Subproject commit 71aed2dbcb5a3bd2ee685f268f1eb4f9c885dd92 +Subproject commit 0919de0f7c79ad35ad3c8ace5f823ad1344b4716 From 0bcea43c5f4f97df9474c52d948418ac23d4338c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 12 Feb 2025 02:44:21 +0000 Subject: [PATCH 144/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- .pre-commit-config.yaml | 20 ++++++++++---------- cmake/3rd.cmake | 15 +++++++++------ 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cfe4fd29e..280ecd66d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + - --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=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/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=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/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 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 6cb4c364c..6ec4ba533 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -127,8 +127,9 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") CROSS_COMPILE=${TOOLCHAIN_PREFIX} CROSS_COMPILE_core=${TOOLCHAIN_PREFIX} CROSS_COMPILE_ta_arm32=${TOOLCHAIN_PREFIX32} - CROSS_COMPILE_ta_arm64=${TOOLCHAIN_PREFIX} DEBUG=1 - O=${optee_os_BINARY_DIR} PLATFORM=vexpress-qemu_armv8a) + CROSS_COMPILE_ta_arm64=${TOOLCHAIN_PREFIX} DEBUG=$· + O=${optee_os_BINARY_DIR} PLATFORM=vexpress-qemu_armv8a + CFG_ARM_GICV3=y) SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${optee_os_BINARY_DIR}) @@ -147,18 +148,20 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") COMMAND ${CMAKE_COMMAND} -E make_directory ${arm-trusted-firmware_BINARY_DIR} COMMAND - make DEBUG=1 CROSS_COMPILE=${TOOLCHAIN_PREFIX} PLAT=qemu - BUILD_BASE=${arm-trusted-firmware_BINARY_DIR} + make DEBUG=$ CROSS_COMPILE=${TOOLCHAIN_PREFIX} + PLAT=qemu BUILD_BASE=${arm-trusted-firmware_BINARY_DIR} BL32=${optee_os_BINARY_DIR}/core/tee-header_v2.bin BL32_EXTRA1=${optee_os_BINARY_DIR}/core/tee-pager_v2.bin BL32_EXTRA2=${optee_os_BINARY_DIR}/core/tee-pageable_v2.bin BL33=${ovmf_BINARY_DIR}/OVMF_aarch64.fd BL32_RAM_LOCATION=tdram QEMU_USE_GIC_DRIVER=QEMU_GICV3 SPD=opteed all fip COMMAND - dd if=${arm-trusted-firmware_BINARY_DIR}/qemu/debug/bl1.bin + dd + if=${arm-trusted-firmware_BINARY_DIR}/qemu/$,debug,release>/bl1.bin of=${arm-trusted-firmware_BINARY_DIR}/flash.bin bs=4096 conv=notrunc COMMAND - dd if=${arm-trusted-firmware_BINARY_DIR}/qemu/debug/fip.bin + dd + if=${arm-trusted-firmware_BINARY_DIR}/qemu/$,debug,release>/fip.bin of=${arm-trusted-firmware_BINARY_DIR}/flash.bin seek=64 bs=4096 conv=notrunc) SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES From efa28f0164508d1951f778e878c84812d7fb2067 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 12 Feb 2025 09:41:37 +0000 Subject: [PATCH 145/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- 3rd/optee/build | 2 +- CMakeLists.txt | 10 ++++++++++ CMakePresets.json | 8 ++++++++ cmake/3rd.cmake | 18 +++++++----------- tools/Dockerfile | 5 ++++- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/3rd/optee/build b/3rd/optee/build index 0ea181332..05f265e0f 160000 --- a/3rd/optee/build +++ b/3rd/optee/build @@ -1 +1 @@ -Subproject commit 0ea1813320150b1a6f15cd08c6259dd3bf0e2152 +Subproject commit 05f265e0f8daeb67ae0944cece0c102176bde1f8 diff --git a/CMakeLists.txt b/CMakeLists.txt index b884bd394..ad18c3c67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,6 +88,10 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") cortex-a72 -m 1024M + -serial + ${QEMU_NORMAL_WORLD_DEV_PATH} + -serial + ${QEMU_SECURE_WORLD_DEV_PATH} -smp 4 -net @@ -103,6 +107,10 @@ ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/src) ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/test) ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/doc) +# 添加 soc term target +# add_soc_term_target(launch_uart_nw ${QEMU_NORMAL_WORLD_DEV_PATH}) +# add_soc_term_target(launch_uart_sw ${QEMU_SECURE_WORLD_DEV_PATH}) + # 添加 run 和 debug target ADD_RUN_TARGET ( DEPENDS @@ -113,6 +121,8 @@ ADD_RUN_TARGET ( $<$:boot> $<$:optee_os> $<$:arm-trusted-firmware> + # $<$:launch_uart_nw> + # $<$:launch_uart_sw> kernel WORKING_DIRECTORY ${PROJECT_BINARY_DIR} diff --git a/CMakePresets.json b/CMakePresets.json index ca220c260..385f63219 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -67,6 +67,14 @@ "type": "STRING", "value": "qemu" }, + "QEMU_NORMAL_WORLD_DEV_PATH": { + "type": "STRING", + "value": "tcp:127.0.0.1:54320" + }, + "QEMU_SECURE_WORLD_DEV_PATH": { + "type": "STRING", + "value": "tcp:127.0.0.1:54321" + }, "QEMU_GDB_PORT": { "type": "STRING", "value": "tcp::1234" diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 6ec4ba533..7ddcff51a 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -75,8 +75,7 @@ ADD_CUSTOM_TARGET ( COMMENT "Generate gdbinit ..." WORKING_DIRECTORY ${gdbinit_SOURCE_DIR} # 复制到根目录下并重命名 - COMMAND ${CMAKE_COMMAND} -E copy ${gdbinit_SOURCE_DIR}/gdbinit - ${CMAKE_SOURCE_DIR}/.gdbinit + COMMAND ln -s -f ${gdbinit_SOURCE_DIR}/gdbinit ${CMAKE_SOURCE_DIR}/.gdbinit COMMAND echo "target remote ${QEMU_GDB_PORT}" >> ${CMAKE_SOURCE_DIR}/.gdbinit COMMAND @@ -99,8 +98,7 @@ ADD_CUSTOM_TARGET ( # make 时编译 ALL WORKING_DIRECTORY ${ovmf_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${ovmf_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${ovmf_SOURCE_DIR}/* ${ovmf_BINARY_DIR}) + COMMAND ln -s -f ${ovmf_SOURCE_DIR} ${CMAKE_BINARY_DIR}/3rd) # https://github.com/MRNIU/printf_bare_metal.git ADD_SUBDIRECTORY (3rd/printf_bare_metal) @@ -109,9 +107,12 @@ ADD_SUBDIRECTORY (3rd/printf_bare_metal) ADD_SUBDIRECTORY (3rd/cpu_io) # https://github.com/MRNIU/smccc.git -ADD_SUBDIRECTORY (3rd/smccc) +# ADD_SUBDIRECTORY (3rd/smccc) IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + # https://github.com/OP-TEE/build.git + SET (optee_build_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/build) + # https://github.com/OP-TEE/optee_os.git SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) SET (optee_os_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/optee/optee_os) @@ -184,14 +185,9 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") make CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_JUMP=y FW_JUMP_ADDR=0x80210000 PLATFORM_RISCV_XLEN=64 PLATFORM=generic O=${opensbi_BINARY_DIR} - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}/include) + COMMAND ln -s -f ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}) ADD_LIBRARY (opensbi-fw_jump INTERFACE) ADD_DEPENDENCIES (opensbi-fw_jump opensbi) - TARGET_INCLUDE_DIRECTORIES (opensbi-fw_jump - INTERFACE ${dtc_BINARY_DIR}/libfdt) - TARGET_LINK_LIBRARIES (opensbi-fw_jump - INTERFACE ${dtc_BINARY_DIR}/libfdt/libfdt.a) # https://github.com/MRNIU/opensbi_interface.git ADD_SUBDIRECTORY (3rd/opensbi_interface) diff --git a/tools/Dockerfile b/tools/Dockerfile index 167f0d519..f05aee4c0 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -23,7 +23,10 @@ RUN apt install --no-install-recommends --fix-missing -y \ zip \ unzip \ telnet \ - tar + tar \ + tmux \ + ncat \ + socat RUN apt install --no-install-recommends --fix-missing -y \ file \ vim \ From 3267ea07200fad4355234c3228b0123759f8c6d7 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 12 Feb 2025 09:41:55 +0000 Subject: [PATCH 146/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- cmake/functions.cmake | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cmake/functions.cmake b/cmake/functions.cmake index bcea4f218..b0c2fe7b4 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -170,3 +170,10 @@ FUNCTION(add_run_target) # 使用 1234 端口 -gdb ${QEMU_GDB_PORT}) ENDFUNCTION() + +# 定义宏处理参数化配置 +FUNCTION(add_soc_term_target TARGET_NAME PORT_NUM) + ADD_CUSTOM_TARGET ( + ${TARGET_NAME} COMMAND python3 ${optee_build_SOURCE_DIR}/soc_term.py + ${PORT_NUM}) +ENDFUNCTION() From 6e09360f427e2fa183bd86b45bdb824e4ebc7425 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 13 Feb 2025 04:30:54 +0000 Subject: [PATCH 147/232] feat: aarch64 on vsc Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- .vscode/tasks.json | 49 ++++++++++++++++++++++++++++++++++++----- tools/Dockerfile | 3 ++- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 280ecd66d..405c4f002 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 632c391c5..df36d46e3 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,6 +1,30 @@ { "version": "2.0.0", "tasks": [ + { + "label": "::54320", + "type": "shell", + "command": "python3", + "args": ["${workspaceFolder}/3rd/optee/build/soc_term.py", "54320"], + "isBackground": true, + "presentation": { + "reveal": "always", + "panel": "new", + "group": "aarch64" + } + }, + { + "label": "::54321", + "type": "shell", + "command": "python3", + "args": ["${workspaceFolder}/3rd/optee/build/soc_term.py", "54321"], + "isBackground": true, + "presentation": { + "reveal": "always", + "panel": "new", + "group": "aarch64" + } + }, { "label": "build_riscv64", "type": "process", @@ -92,7 +116,7 @@ } }, { - "label": "run_aarch64", + "label": "run_aarch64_warp", "type": "process", "command": "make", "args": ["run"], @@ -109,13 +133,20 @@ "echo": true, "reveal": "always", "focus": true, - "panel": "dedicated", + "panel": "new", "showReuseMessage": true, - "clear": true - } + "clear": true, + "group": "aarch64" + }, + "hide": true }, { - "label": "debug_aarch64", + "label": "run_aarch64", + "dependsOn": ["run_aarch64_warp", "::54320", "::54321"], + "dependsOrder": "parallel" + }, + { + "label": "debug_aarch64_warp", "type": "process", "command": "make", "args": ["debug"], @@ -135,7 +166,13 @@ "panel": "dedicated", "showReuseMessage": true, "clear": true - } + }, + "hide": true + }, + { + "label": "debug_aarch64", + "dependsOn": ["debug_aarch64_warp", "::54320", "::54321"], + "dependsOrder": "parallel" }, { "label": "build_x86_64", diff --git a/tools/Dockerfile b/tools/Dockerfile index f05aee4c0..252247dc3 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -26,7 +26,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ tar \ tmux \ ncat \ - socat + socat \ + lsof RUN apt install --no-install-recommends --fix-missing -y \ file \ vim \ From 1043b037e462d9a98eaf345b2d91900e010f5992 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 13 Feb 2025 04:31:31 +0000 Subject: [PATCH 148/232] style: format json Signed-off-by: Zone.N --- .vscode/tasks.json | 58 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index df36d46e3..505a19ee7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,7 +5,10 @@ "label": "::54320", "type": "shell", "command": "python3", - "args": ["${workspaceFolder}/3rd/optee/build/soc_term.py", "54320"], + "args": [ + "${workspaceFolder}/3rd/optee/build/soc_term.py", + "54320" + ], "isBackground": true, "presentation": { "reveal": "always", @@ -17,7 +20,10 @@ "label": "::54321", "type": "shell", "command": "python3", - "args": ["${workspaceFolder}/3rd/optee/build/soc_term.py", "54321"], + "args": [ + "${workspaceFolder}/3rd/optee/build/soc_term.py", + "54321" + ], "isBackground": true, "presentation": { "reveal": "always", @@ -37,7 +43,9 @@ "kind": "build", "isDefault": false }, - "problemMatcher": ["$gcc"], + "problemMatcher": [ + "$gcc" + ], "presentation": { "echo": true, "reveal": "always", @@ -51,7 +59,9 @@ "label": "run_riscv64", "type": "process", "command": "make", - "args": ["run"], + "args": [ + "run" + ], "options": { "cwd": "${workspaceFolder}/build_riscv64" }, @@ -74,7 +84,9 @@ "label": "debug_riscv64", "type": "process", "command": "make", - "args": ["debug"], + "args": [ + "debug" + ], "options": { "cwd": "${workspaceFolder}/build_riscv64" }, @@ -105,7 +117,9 @@ "kind": "build", "isDefault": false }, - "problemMatcher": ["$gcc"], + "problemMatcher": [ + "$gcc" + ], "presentation": { "echo": true, "reveal": "always", @@ -119,7 +133,9 @@ "label": "run_aarch64_warp", "type": "process", "command": "make", - "args": ["run"], + "args": [ + "run" + ], "options": { "cwd": "${workspaceFolder}/build_aarch64" }, @@ -142,14 +158,20 @@ }, { "label": "run_aarch64", - "dependsOn": ["run_aarch64_warp", "::54320", "::54321"], + "dependsOn": [ + "run_aarch64_warp", + "::54320", + "::54321" + ], "dependsOrder": "parallel" }, { "label": "debug_aarch64_warp", "type": "process", "command": "make", - "args": ["debug"], + "args": [ + "debug" + ], "options": { "cwd": "${workspaceFolder}/build_aarch64" }, @@ -171,7 +193,11 @@ }, { "label": "debug_aarch64", - "dependsOn": ["debug_aarch64_warp", "::54320", "::54321"], + "dependsOn": [ + "debug_aarch64_warp", + "::54320", + "::54321" + ], "dependsOrder": "parallel" }, { @@ -186,7 +212,9 @@ "kind": "build", "isDefault": false }, - "problemMatcher": ["$gcc"], + "problemMatcher": [ + "$gcc" + ], "presentation": { "echo": true, "reveal": "always", @@ -200,7 +228,9 @@ "label": "run_x86_64", "type": "process", "command": "make", - "args": ["run"], + "args": [ + "run" + ], "options": { "cwd": "${workspaceFolder}/build_x86_64" }, @@ -223,7 +253,9 @@ "label": "debug_x86_64", "type": "process", "command": "make", - "args": ["debug"], + "args": [ + "debug" + ], "options": { "cwd": "${workspaceFolder}/build_x86_64" }, From 76fd423e3331f78214ed2d61e9fe121ddedd46af Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 13 Feb 2025 05:32:37 +0000 Subject: [PATCH 149/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- .pre-commit-config.yaml | 20 ++++++++++---------- CMakeLists.txt | 6 ------ cmake/3rd.cmake | 3 --- cmake/functions.cmake | 7 ------- 4 files changed, 10 insertions(+), 26 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 405c4f002..ef74b5a44 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/root/SimpleKernel/build_riscv64/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).* + - --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_aarch64/build_x86_64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --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).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/root/SimpleKernel/build_riscv64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --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).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index ad18c3c67..77e98f085 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,10 +107,6 @@ ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/src) ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/test) ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/doc) -# 添加 soc term target -# add_soc_term_target(launch_uart_nw ${QEMU_NORMAL_WORLD_DEV_PATH}) -# add_soc_term_target(launch_uart_sw ${QEMU_SECURE_WORLD_DEV_PATH}) - # 添加 run 和 debug target ADD_RUN_TARGET ( DEPENDS @@ -121,8 +117,6 @@ ADD_RUN_TARGET ( $<$:boot> $<$:optee_os> $<$:arm-trusted-firmware> - # $<$:launch_uart_nw> - # $<$:launch_uart_sw> kernel WORKING_DIRECTORY ${PROJECT_BINARY_DIR} diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 7ddcff51a..1d71707e3 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -110,9 +110,6 @@ ADD_SUBDIRECTORY (3rd/cpu_io) # ADD_SUBDIRECTORY (3rd/smccc) IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") - # https://github.com/OP-TEE/build.git - SET (optee_build_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/build) - # https://github.com/OP-TEE/optee_os.git SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) SET (optee_os_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/optee/optee_os) diff --git a/cmake/functions.cmake b/cmake/functions.cmake index b0c2fe7b4..bcea4f218 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -170,10 +170,3 @@ FUNCTION(add_run_target) # 使用 1234 端口 -gdb ${QEMU_GDB_PORT}) ENDFUNCTION() - -# 定义宏处理参数化配置 -FUNCTION(add_soc_term_target TARGET_NAME PORT_NUM) - ADD_CUSTOM_TARGET ( - ${TARGET_NAME} COMMAND python3 ${optee_build_SOURCE_DIR}/soc_term.py - ${PORT_NUM}) -ENDFUNCTION() From fb6ad72dfcbec18165a50845c0b0f0bc5acd8c49 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 13 Feb 2025 06:33:00 +0000 Subject: [PATCH 150/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- .vscode/launch.json | 3 +++ .vscode/tasks.json | 23 ++++++++++------------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index dca3bbadc..0de227a95 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -47,6 +47,9 @@ "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}/build_aarch64/bin", + "setupCommands": [ + { "text": "set architecture aarch64" } + ], "environment": [], "externalConsole": true, "logging": { diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 505a19ee7..624492574 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -10,6 +10,7 @@ "54320" ], "isBackground": true, + "problemMatcher": [], "presentation": { "reveal": "always", "panel": "new", @@ -25,6 +26,7 @@ "54321" ], "isBackground": true, + "problemMatcher": [], "presentation": { "reveal": "always", "panel": "new", @@ -103,7 +105,8 @@ "panel": "dedicated", "showReuseMessage": true, "clear": true - } + }, + "hide": true }, { "label": "build_aarch64", @@ -158,6 +161,7 @@ }, { "label": "run_aarch64", + "problemMatcher": [], "dependsOn": [ "run_aarch64_warp", "::54320", @@ -166,7 +170,7 @@ "dependsOrder": "parallel" }, { - "label": "debug_aarch64_warp", + "label": "debug_aarch64", "type": "process", "command": "make", "args": [ @@ -187,19 +191,11 @@ "focus": true, "panel": "dedicated", "showReuseMessage": true, - "clear": true + "clear": true, + "group": "aarch64" }, "hide": true }, - { - "label": "debug_aarch64", - "dependsOn": [ - "debug_aarch64_warp", - "::54320", - "::54321" - ], - "dependsOrder": "parallel" - }, { "label": "build_x86_64", "type": "process", @@ -272,7 +268,8 @@ "panel": "dedicated", "showReuseMessage": true, "clear": true - } + }, + "hide": true } ] } From 579caff32af18913f3316bd6a0d1ac701f6a63ec Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 13 Feb 2025 06:44:37 +0000 Subject: [PATCH 151/232] feat: working on aarch64 TEE Signed-off-by: Zone.N --- .vscode/launch.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 0de227a95..7d9aea7dc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -48,7 +48,10 @@ "stopAtEntry": true, "cwd": "${workspaceFolder}/build_aarch64/bin", "setupCommands": [ - { "text": "set architecture aarch64" } + { "text": "add-symbol-file ${workspaceFolder}/build_aarch64/3rd/arm-trusted-firmware/qemu/debug/bl1/bl1.elf" }, + { "text": "add-symbol-file ${workspaceFolder}/build_aarch64/3rd/arm-trusted-firmware/qemu/debug/bl2/bl2.elf" }, + { "text": "add-symbol-file ${workspaceFolder}/build_aarch64/3rd/arm-trusted-firmware/qemu/debug/bl31/bl31.elf" }, + { "text": "add-symbol-file ${workspaceFolder}/build_aarch64/3rd/optee/optee_os/core/tee.elf" } ], "environment": [], "externalConsole": true, From ce00ae4108467fa74e06bb6e29e0e567b2ff3a55 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 18 Feb 2025 06:32:38 +0000 Subject: [PATCH 152/232] 3rd: add u-boot Signed-off-by: Zone.N --- .gitmodules | 3 +++ .pre-commit-config.yaml | 20 ++++++++++---------- 3rd/u-boot | 1 + 3 files changed, 14 insertions(+), 10 deletions(-) create mode 160000 3rd/u-boot diff --git a/.gitmodules b/.gitmodules index 49f254ef8..3ab4e0b37 100644 --- a/.gitmodules +++ b/.gitmodules @@ -41,3 +41,6 @@ [submodule "3rd/optee/optee_client"] path = 3rd/optee/optee_client url = https://github.com/OP-TEE/optee_client.git +[submodule "3rd/u-boot"] + path = 3rd/u-boot + url = https://github.com/u-boot/u-boot.git diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ef74b5a44..405c4f002 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_riscv64/compiler_commands.json + - -p=/root/SimpleKernel/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/x86_64|/root/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --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_riscv64/build_x86_64/compiler_commands.json + # - -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 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/3rd/u-boot b/3rd/u-boot new file mode 160000 index 000000000..6d41f0a39 --- /dev/null +++ b/3rd/u-boot @@ -0,0 +1 @@ +Subproject commit 6d41f0a39d6423c8e57e92ebbe9f8c0333a63f72 From d5933e7181f53eac3ccfcb3c2d5de5e5ebc89269 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 18 Feb 2025 07:48:32 +0000 Subject: [PATCH 153/232] 3rd: build u-boot Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- cmake/3rd.cmake | 15 +++++++++++++++ tools/Dockerfile | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 405c4f002..280ecd66d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 1d71707e3..b6cdd977a 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -109,6 +109,21 @@ ADD_SUBDIRECTORY (3rd/cpu_io) # https://github.com/MRNIU/smccc.git # ADD_SUBDIRECTORY (3rd/smccc) +# https://github.com/u-boot/u-boot.git +SET (u-boot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/u-boot) +SET (u-boot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/u-boot) +ADD_CUSTOM_TARGET ( + u-boot + COMMENT "build u-boot..." + # make 时编译 + ALL + WORKING_DIRECTORY ${u-boot_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} + COMMAND make O=${u-boot_BINARY_DIR} qemu_arm64_defconfig + COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR}) +SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${u-boot_BINARY_DIR}) + IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") # https://github.com/OP-TEE/optee_os.git SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) diff --git a/tools/Dockerfile b/tools/Dockerfile index 252247dc3..f0101830b 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -77,7 +77,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ bison \ device-tree-compiler \ python3-cryptography \ - python3-pyelftools + python3-pyelftools \ + libgnutls28-dev RUN apt install --no-install-recommends --fix-missing -y \ gcc \ g++ \ From 9dd04f174fccba2ee0456a01028f758ff46972e3 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 18 Feb 2025 09:58:58 +0000 Subject: [PATCH 154/232] 3rd: add buildroot Signed-off-by: Zone.N --- .gitmodules | 3 +++ 3rd/buildroot | 1 + CMakeLists.txt | 10 +++++++++- cmake/3rd.cmake | 29 ++++++++++++++++++++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 160000 3rd/buildroot diff --git a/.gitmodules b/.gitmodules index 3ab4e0b37..40833423e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -44,3 +44,6 @@ [submodule "3rd/u-boot"] path = 3rd/u-boot url = https://github.com/u-boot/u-boot.git +[submodule "3rd/buildroot"] + path = 3rd/buildroot + url = https://github.com/buildroot/buildroot.git diff --git a/3rd/buildroot b/3rd/buildroot new file mode 160000 index 000000000..6a1f9b3c0 --- /dev/null +++ b/3rd/buildroot @@ -0,0 +1 @@ +Subproject commit 6a1f9b3c0c87814f9aa624c4271f1e33ec45f0af diff --git a/CMakeLists.txt b/CMakeLists.txt index 77e98f085..df2f4ce39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,8 +98,16 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") none -bios ${arm-trusted-firmware_BINARY_DIR}/flash.bin + # -kernel + # $ + -initrd + ${buildroot_BINARY_DIR}/output/images/rootfs.cpio.gz -kernel - $) + ${buildroot_BINARY_DIR}/output/images/Image + -append + 'console=ttyAMA0,38400 keep_bootcon' + # -d unimp + ) ENDIF() # 添加要编译的目录 diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index b6cdd977a..13c24e92b 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -124,6 +124,30 @@ ADD_CUSTOM_TARGET ( SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${u-boot_BINARY_DIR}) +# https://github.com/buildroot/buildroot.git +SET (buildroot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/buildroot) +SET (buildroot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/buildroot) +ADD_CUSTOM_TARGET ( + buildroot + COMMENT "build buildroot..." + # make 时编译 + ALL + WORKING_DIRECTORY ${buildroot_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${buildroot_BINARY_DIR} + COMMAND make HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} + O=${buildroot_BINARY_DIR} qemu_aarch64_virt_defconfig + COMMAND HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} + O=${buildroot_BINARY_DIR} utils/config -e BR2_TARGET_ROOTFS_CPIO + COMMAND + HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} + O=${buildroot_BINARY_DIR} utils/config -e BR2_TARGET_ROOTFS_CPIO_GZIP + COMMAND make HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} + O=${buildroot_BINARY_DIR} olddefconfig + COMMAND make HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} + O=${buildroot_BINARY_DIR}) +SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${buildroot_BINARY_DIR}) + IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") # https://github.com/OP-TEE/optee_os.git SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) @@ -157,6 +181,7 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") COMMENT "build arm-trusted-firmware..." # make 时编译 ALL + DEPENDS optee_os WORKING_DIRECTORY ${arm-trusted-firmware_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${arm-trusted-firmware_BINARY_DIR} @@ -166,7 +191,9 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") BL32=${optee_os_BINARY_DIR}/core/tee-header_v2.bin BL32_EXTRA1=${optee_os_BINARY_DIR}/core/tee-pager_v2.bin BL32_EXTRA2=${optee_os_BINARY_DIR}/core/tee-pageable_v2.bin - BL33=${ovmf_BINARY_DIR}/OVMF_aarch64.fd BL32_RAM_LOCATION=tdram + # @todo uefi 支持 + # BL33=${ovmf_BINARY_DIR}/OVMF_aarch64.fd + BL33=${u-boot_BINARY_DIR}/u-boot.bin BL32_RAM_LOCATION=tdram QEMU_USE_GIC_DRIVER=QEMU_GICV3 SPD=opteed all fip COMMAND dd From 5cefa7fb4ee926be893d7e40ec20996110faa86e Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Wed, 19 Feb 2025 00:10:18 +0800 Subject: [PATCH 155/232] feat: buildroot support Signed-off-by: Zone.NiuZH --- .pre-commit-config.yaml | 18 +++++++++--------- CMakeLists.txt | 4 ++-- CMakePresets.json | 4 ++++ cmake/3rd.cmake | 41 ++++++++++++++++++++++------------------- 4 files changed, 37 insertions(+), 30 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 280ecd66d..8c0d67ced 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/root/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/home/ubuntu/github/MRNIU/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).* + - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/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/riscv_64|/root/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/root/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/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/riscv64|/root/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index df2f4ce39..85ca3f086 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,9 +101,9 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") # -kernel # $ -initrd - ${buildroot_BINARY_DIR}/output/images/rootfs.cpio.gz + ${buildroot_BINARY_DIR}/images/rootfs.cpio.gz -kernel - ${buildroot_BINARY_DIR}/output/images/Image + ${buildroot_BINARY_DIR}/images/Image -append 'console=ttyAMA0,38400 keep_bootcon' # -d unimp diff --git a/CMakePresets.json b/CMakePresets.json index 385f63219..95ffec17e 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -59,6 +59,10 @@ "type": "STRING", "value": "Generic" }, + "CMAKE_BUILD_PARALLEL_LEVEL": { + "type": "STRING", + "value": "8" + }, "COVERAGE_OUTPUT_DIR": { "type": "STRING", "value": "coverage" diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 13c24e92b..16e32c3e3 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -120,7 +120,9 @@ ADD_CUSTOM_TARGET ( WORKING_DIRECTORY ${u-boot_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} COMMAND make O=${u-boot_BINARY_DIR} qemu_arm64_defconfig - COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR}) + -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} + -j${CMAKE_BUILD_PARALLEL_LEVEL}) SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${u-boot_BINARY_DIR}) @@ -134,17 +136,15 @@ ADD_CUSTOM_TARGET ( ALL WORKING_DIRECTORY ${buildroot_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${buildroot_BINARY_DIR} - COMMAND make HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} - O=${buildroot_BINARY_DIR} qemu_aarch64_virt_defconfig - COMMAND HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} - O=${buildroot_BINARY_DIR} utils/config -e BR2_TARGET_ROOTFS_CPIO - COMMAND - HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} - O=${buildroot_BINARY_DIR} utils/config -e BR2_TARGET_ROOTFS_CPIO_GZIP - COMMAND make HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} - O=${buildroot_BINARY_DIR} olddefconfig - COMMAND make HOSTCXX=${CMAKE_CXX_COMPILER} HOSTCC=${CMAKE_C_COMPILER} - O=${buildroot_BINARY_DIR}) + COMMAND make O=${buildroot_BINARY_DIR} qemu_aarch64_virt_defconfig + -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND cd ${buildroot_BINARY_DIR} && ${buildroot_SOURCE_DIR}/utils/config + -e BR2_TARGET_ROOTFS_CPIO + COMMAND cd ${buildroot_BINARY_DIR} && ${buildroot_SOURCE_DIR}/utils/config + -e BR2_TARGET_ROOTFS_CPIO_GZIP + COMMAND cd ${buildroot_BINARY_DIR} && make olddefconfig + -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND cd ${buildroot_BINARY_DIR} && make -j${CMAKE_BUILD_PARALLEL_LEVEL}) SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${buildroot_BINARY_DIR}) @@ -166,7 +166,7 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") CROSS_COMPILE_ta_arm32=${TOOLCHAIN_PREFIX32} CROSS_COMPILE_ta_arm64=${TOOLCHAIN_PREFIX} DEBUG=$· O=${optee_os_BINARY_DIR} PLATFORM=vexpress-qemu_armv8a - CFG_ARM_GICV3=y) + CFG_ARM_GICV3=y -j${CMAKE_BUILD_PARALLEL_LEVEL}) SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${optee_os_BINARY_DIR}) @@ -181,7 +181,7 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") COMMENT "build arm-trusted-firmware..." # make 时编译 ALL - DEPENDS optee_os + DEPENDS optee_os u-boot WORKING_DIRECTORY ${arm-trusted-firmware_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${arm-trusted-firmware_BINARY_DIR} @@ -195,6 +195,7 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") # BL33=${ovmf_BINARY_DIR}/OVMF_aarch64.fd BL33=${u-boot_BINARY_DIR}/u-boot.bin BL32_RAM_LOCATION=tdram QEMU_USE_GIC_DRIVER=QEMU_GICV3 SPD=opteed all fip + -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND dd if=${arm-trusted-firmware_BINARY_DIR}/qemu/$,debug,release>/bl1.bin @@ -223,7 +224,7 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_JUMP=y FW_JUMP_ADDR=0x80210000 PLATFORM_RISCV_XLEN=64 PLATFORM=generic - O=${opensbi_BINARY_DIR} + O=${opensbi_BINARY_DIR} -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND ln -s -f ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}) ADD_LIBRARY (opensbi-fw_jump INTERFACE) ADD_DEPENDENCIES (opensbi-fw_jump opensbi) @@ -247,7 +248,7 @@ IF(NOT EXISTS ${dtc_BINARY_DIR}/libfdt/libfdt.a) WORKING_DIRECTORY ${dtc_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${dtc_BINARY_DIR}/libfdt COMMAND CC=${dtc_CC} AR=${dtc_AR} HOME=${dtc_BINARY_DIR} make - libfdt/libfdt.a + libfdt/libfdt.a -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND ${CMAKE_COMMAND} -E copy ${dtc_SOURCE_DIR}/libfdt/*.a ${dtc_SOURCE_DIR}/libfdt/*.h ${dtc_BINARY_DIR}/libfdt COMMAND make clean) @@ -292,9 +293,11 @@ IF(NOT EXISTS ${gnu-efi_BINARY_DIR}/lib/libefi.a) ALL WORKING_DIRECTORY ${gnu-efi_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${gnu-efi_BINARY_DIR} - COMMAND # @note 仅支持 gcc - make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_} - ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1 + COMMAND + # @note 仅支持 gcc + make lib gnuefi inc CROSS_COMPILE=${CROSS_COMPILE_} + ARCH=${CMAKE_SYSTEM_PROCESSOR} OBJDIR=${gnu-efi_BINARY_DIR} V=1 + -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND ${CMAKE_COMMAND} -E copy_directory ${gnu-efi_SOURCE_DIR}/inc ${gnu-efi_BINARY_DIR}/inc) ELSE() From ab55c7fa8e78d7b8b8e5b11b6c4e718a6d52274f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 19 Feb 2025 16:17:52 +0800 Subject: [PATCH 156/232] fix: update dockerfile Signed-off-by: Zone.N --- CMakeLists.txt | 1 + tools/Dockerfile | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 85ca3f086..24fa07434 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,6 +125,7 @@ ADD_RUN_TARGET ( $<$:boot> $<$:optee_os> $<$:arm-trusted-firmware> + $<$:buildroot> kernel WORKING_DIRECTORY ${PROJECT_BINARY_DIR} diff --git a/tools/Dockerfile b/tools/Dockerfile index f0101830b..311cbcd79 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -27,7 +27,9 @@ RUN apt install --no-install-recommends --fix-missing -y \ tmux \ ncat \ socat \ - lsof + lsof \ + bc \ + cpio RUN apt install --no-install-recommends --fix-missing -y \ file \ vim \ From c09fffafaa0f9d4860823f44fcc7903fb1f4d95f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 19 Feb 2025 17:41:25 +0800 Subject: [PATCH 157/232] fix: update dockerfile Signed-off-by: Zone.N --- tools/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index 311cbcd79..a67b4889e 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -80,7 +80,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ device-tree-compiler \ python3-cryptography \ python3-pyelftools \ - libgnutls28-dev + libgnutls28-dev \ + gawk RUN apt install --no-install-recommends --fix-missing -y \ gcc \ g++ \ From a856ac380d19bec2605b96cb4dad8f6f3a3d037b Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 20 Feb 2025 17:40:38 +0800 Subject: [PATCH 158/232] feat: add its Signed-off-by: Zone.N --- cmake/functions.cmake | 11 +++++++ tools/aarch64_qemu_virt.its | 66 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 tools/aarch64_qemu_virt.its diff --git a/cmake/functions.cmake b/cmake/functions.cmake index bcea4f218..2274bfe3b 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -20,6 +20,8 @@ FUNCTION(objdump_readelf_nm target) $/${target}.readelf || exit 0 COMMAND ${CMAKE_NM} -a $ > $/${target}.sym + COMMAND ${CMAKE_OBJCOPY} -O binary $ + $/${target}.bin COMMENT "Generating symbol table, assembly, and readelf for ${target}") SET_DIRECTORY_PROPERTIES ( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES @@ -43,6 +45,9 @@ FUNCTION(elf2efi target efi) --target=efi-app-${CMAKE_SYSTEM_PROCESSOR} --subsystem=10) ENDFUNCTION() +# 生成 uboot 使用的 FIT +# @todo 需要解决依赖关系 + # 添加测试覆盖率 target # DEPENDS 要生成的 targets # SOURCE_DIR 源码路径 @@ -156,6 +161,9 @@ FUNCTION(add_run_target) DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} + COMMAND qemu-system-${ARG_TARGET} -machine dumpdtb=./bin/qemu.dtb + ${ARG_QEMU_FLAGS} + COMMAND dtc -I dtb ./bin/qemu.dtb -O dts -o ./bin/qemu.dts COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS}) ADD_CUSTOM_TARGET ( ${ARG_NAME}debug @@ -163,6 +171,9 @@ FUNCTION(add_run_target) DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} + COMMAND qemu-system-${ARG_TARGET} -machine dumpdtb=./bin/qemu.dtb + ${ARG_QEMU_FLAGS} + COMMAND dtc -I dtb ./bin/qemu.dtb -O dts -o ./bin/qemu.dts COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS} # 等待 gdb 连接 diff --git a/tools/aarch64_qemu_virt.its b/tools/aarch64_qemu_virt.its new file mode 100644 index 000000000..9c37cea3f --- /dev/null +++ b/tools/aarch64_qemu_virt.its @@ -0,0 +1,66 @@ +/dts-v1/; + +/ { + description = "U-Boot FIT Image"; + #address-cells = <1>; + + images { + kernel@1 { + description = "Linux Kernel"; + // 内核路径 + data = /incbin/("./zImage"); + type = "kernel"; + // 架构类型 + arch = "arm64"; + os = "linux"; + // 压缩方式 + compression = "none"; + // 内核加载地址 + load = <0x80008000>; + // 内核入口地址 + entry = <0x80008000>; + hash-1 { + algo = "sha1"; + }; + }; + + fdt@1 { + description = "Device Tree Blob"; + // dtb 路径 + data = /incbin/("./myboard.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + hash-1 { + algo = "sha1"; + }; + }; + + ramdisk@1 { + description = "Root Filesystem"; + // 根文件系统路径 + data = /incbin/("./rootfs.cpio.gz"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + hash-1 { + algo = "sha1"; + }; + }; + }; + + configurations { + default = "config@1"; + + config@1 { + description = "Default Boot Configuration"; + kernel = "kernel@1"; + fdt = "fdt@1"; + ramdisk = "ramdisk@1"; + hash-1 { + algo = "sha1"; + }; + }; + }; +}; From 86466d523b691901414262f43e0de3e6e2bdef79 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 27 Feb 2025 14:47:53 +0800 Subject: [PATCH 159/232] feat: update qemu flags Signed-off-by: Zone.N --- CMakeLists.txt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 24fa07434..523dbbc87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,16 +98,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") none -bios ${arm-trusted-firmware_BINARY_DIR}/flash.bin - # -kernel - # $ - -initrd - ${buildroot_BINARY_DIR}/images/rootfs.cpio.gz -kernel - ${buildroot_BINARY_DIR}/images/Image - -append - 'console=ttyAMA0,38400 keep_bootcon' - # -d unimp - ) + $) ENDIF() # 添加要编译的目录 From caaee0576d150c87f5c8722cb294d96674469908 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 28 Feb 2025 15:48:49 +0800 Subject: [PATCH 160/232] feat: riscv u-boot support Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- CMakeLists.txt | 7 +++---- cmake/3rd.cmake | 14 ++++++++++---- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8c0d67ced..56e2efc32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/home/ubuntu/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 523dbbc87..997b445d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,11 +68,10 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") virt -smp 4 - # 可选项,qemu7.0 自带了 opensbi1.0 -bios - ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_jump.elf - -kernel - $ + ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf + # -kernel + # $ # @todo 暂时还不支持 riscv64 的 uefi 启动 预期路线: qemu->uefi->opensbi + # kernel(payload) -bios # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 16e32c3e3..6eb278073 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -119,8 +119,11 @@ ADD_CUSTOM_TARGET ( ALL WORKING_DIRECTORY ${u-boot_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} - COMMAND make O=${u-boot_BINARY_DIR} qemu_arm64_defconfig - -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND + make O=${u-boot_BINARY_DIR} + $<$:qemu_arm64_defconfig> + $<$:qemu-riscv64_smode_defconfig> + -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} -j${CMAKE_BUILD_PARALLEL_LEVEL}) SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES @@ -219,13 +222,16 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") COMMENT "build opensbi..." # make 时编译 ALL + DEPENDS u-boot WORKING_DIRECTORY ${opensbi_SOURCE_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${opensbi_BINARY_DIR} COMMAND - make CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_JUMP=y - FW_JUMP_ADDR=0x80210000 PLATFORM_RISCV_XLEN=64 PLATFORM=generic + make PLATFORM_RISCV_XLEN=64 PLATFORM=generic + CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_PAYLOAD=y + FW_PAYLOAD_PATH=${u-boot_BINARY_DIR}/u-boot.bin O=${opensbi_BINARY_DIR} -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND ln -s -f ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}) + ADD_LIBRARY (opensbi-fw_jump INTERFACE) ADD_DEPENDENCIES (opensbi-fw_jump opensbi) From 0559d81e99f7c2dbf75125b1e806dd8867d63806 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 28 Feb 2025 16:10:59 +0800 Subject: [PATCH 161/232] feat: riscv u-boot support Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- CMakeLists.txt | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 56e2efc32..b49887a36 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index 997b445d9..ebc0fba43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,16 +66,16 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") QEMU_FLAGS -machine virt + -netdev + user,id=net0 + -device + e1000,netdev=net0 -smp 4 -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf # -kernel # $ - # @todo 暂时还不支持 riscv64 的 uefi 启动 预期路线: qemu->uefi->opensbi + - # kernel(payload) -bios - # ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda - # fat:rw:./image/ ) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST ( @@ -112,8 +112,6 @@ ADD_RUN_TARGET ( ovmf $<$:opensbi-fw_jump> $<$:boot> - $<$:boot> - $<$:boot> $<$:optee_os> $<$:arm-trusted-firmware> $<$:buildroot> From b22ab2e7430332e4e86f7361231d31f52882fd09 Mon Sep 17 00:00:00 2001 From: "Zone.NiuZH" Date: Mon, 3 Mar 2025 00:25:23 +0800 Subject: [PATCH 162/232] feat: update dockerfile Signed-off-by: Zone.NiuZH --- tools/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/Dockerfile b/tools/Dockerfile index a67b4889e..5de978f60 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -81,7 +81,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ python3-cryptography \ python3-pyelftools \ libgnutls28-dev \ - gawk + gawk \ + u-boot-tools RUN apt install --no-install-recommends --fix-missing -y \ gcc \ g++ \ From 847527021dcdd2f5c955b9e7d9b798df900202bc Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 3 Mar 2025 13:06:57 +0800 Subject: [PATCH 163/232] feat: update qemu flags Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 ++++----- CMakeLists.txt | 76 ++++++++++++----------------------- CMakePresets.json | 4 ++ cmake/functions.cmake | 88 +++++++++++++++-------------------------- 4 files changed, 70 insertions(+), 116 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b49887a36..30a7ead22 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index ebc0fba43..bc8e35313 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,78 +33,53 @@ INCLUDE (3rd) # 导入编译配置 INCLUDE (compile_config) +# 添加要编译的目录 +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/src) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/test) +ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/doc) + # qemu 参数设置 -LIST ( - APPEND - QEMU_FLAGS - # 不启用图形界面 - -nographic - # 使用标准输出显示 - -serial - stdio - # 启动 telnet 服务,使用 2333 端口,不等待连接 - -monitor - ${QEMU_MONITOR_ARG}) +LIST (APPEND QEMU_BOOT_FLAGS "") +LIST (APPEND QEMU_MACHINE_FLAGS "") # 目标平台参数 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - LIST ( - APPEND - QEMU_FLAGS - -m - 128M - -smp - 4 - -net - none - -bios - ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd - -hda - fat:rw:./image/) + LIST (APPEND QEMU_BOOT_FLAGS -bios + ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda + fat:rw:./image/) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + LIST (APPEND QEMU_MACHINE_FLAGS -machine virt) LIST ( APPEND - QEMU_FLAGS - -machine - virt - -netdev - user,id=net0 - -device - e1000,netdev=net0 - -smp - 4 + QEMU_BOOT_FLAGS -bios ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf # -kernel # $ ) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + LIST (APPEND QEMU_MACHINE_FLAGS -machine virt,secure=on,gic_version=3 -cpu + cortex-a72) LIST ( APPEND - QEMU_FLAGS - -machine - virt,secure=on,gic_version=3 - -cpu - cortex-a72 - -m - 1024M + QEMU_BOOT_FLAGS -serial ${QEMU_NORMAL_WORLD_DEV_PATH} -serial ${QEMU_SECURE_WORLD_DEV_PATH} - -smp - 4 - -net - none -bios ${arm-trusted-firmware_BINARY_DIR}/flash.bin -kernel $) ENDIF() -# 添加要编译的目录 -ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/src) -ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/test) -ADD_SUBDIRECTORY (${PROJECT_SOURCE_DIR}/doc) +GEN_DTB_DTS ( + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR} + TARGET + ${CMAKE_SYSTEM_PROCESSOR} + QEMU_FLAGS + ${QEMU_COMMON_FLAG} + ${QEMU_MACHINE_FLAGS}) # 添加 run 和 debug target ADD_RUN_TARGET ( @@ -114,7 +89,6 @@ ADD_RUN_TARGET ( $<$:boot> $<$:optee_os> $<$:arm-trusted-firmware> - $<$:buildroot> kernel WORKING_DIRECTORY ${PROJECT_BINARY_DIR} @@ -125,4 +99,6 @@ ADD_RUN_TARGET ( KERNEL $ QEMU_FLAGS - ${QEMU_FLAGS}) + ${QEMU_COMMON_FLAG} + ${QEMU_MACHINE_FLAGS} + ${QEMU_BOOT_FLAGS}) diff --git a/CMakePresets.json b/CMakePresets.json index 95ffec17e..fdb751dfa 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -87,6 +87,10 @@ "type": "STRING", "value": "telnet::2333,server,nowait" }, + "QEMU_COMMON_FLAG": { + "type": "STRING", + "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;4;-netdev;user,id=net0;-device;e1000,netdev=net0" + }, "BOOT_ELF_OUTPUT_NAME": { "type": "STRING", "value": "boot.elf" diff --git a/cmake/functions.cmake b/cmake/functions.cmake index 2274bfe3b..6a61e874b 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -88,6 +88,30 @@ FUNCTION(add_coverage_target) ${COVERAGE_OUTPUT_DIR} --branch-coverage) ENDFUNCTION() +# 根据 qemu flags 生成 dtb 与 dts +# NAME 生成的 target 前缀 +# WORKING_DIRECTORY 工作目录 +# QEMU_FLAGS qemu 参数 +FUNCTION(gen_dtb_dts) + # 解析参数 + SET (options) + SET (one_value_keywords NAME TARGET WORKING_DIRECTORY) + SET (multi_value_keywords QEMU_FLAGS) + CMAKE_PARSE_ARGUMENTS (ARG "${options}" "${one_value_keywords}" + "${multi_value_keywords}" ${ARGN}) + + # 添加 target + ADD_CUSTOM_TARGET ( + gen_dtb_dts + COMMENT "Generating dtb and dts..." + DEPENDS ${ARG_DEPENDS} + WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} + COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} + COMMAND qemu-system-${ARG_TARGET} -machine dumpdtb=bin/qemu.dtb + ${ARG_QEMU_FLAGS} + COMMAND dtc -I dtb bin/qemu.dtb -O dts -o bin/qemu.dts) +ENDFUNCTION() + # 添加运行 qemu target # NAME 生成的 target 前缀 # TARGET 目标架构 @@ -104,55 +128,9 @@ FUNCTION(add_run_target) CMAKE_PARSE_ARGUMENTS (ARG "${options}" "${one_value_keywords}" "${multi_value_keywords}" ${ARGN}) - LIST ( - APPEND - commands - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${ARG_KERNEL} - image/) - IF(${ARG_TARGET} STREQUAL "x86_64") - GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) - CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in - image/startup.nsh @ONLY) - LIST ( - APPEND - commands - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${ARG_BOOT} - image/) - ELSEIF(${ARG_TARGET} STREQUAL "riscv64") - GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) - CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in - image/startup.nsh @ONLY) - LIST ( - APPEND - commands - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${ARG_BOOT} - image/) - ELSEIF(${ARG_TARGET} STREQUAL "aarch64") - GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) - CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in - image/startup.nsh @ONLY) - LIST ( - APPEND - commands - COMMAND - ${CMAKE_COMMAND} - -E - copy - ${ARG_BOOT} - image/) - ENDIF() + GET_FILENAME_COMPONENT (BOOT_FILE_NAME ${ARG_BOOT} NAME) + CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/startup.nsh.in image/startup.nsh + @ONLY) # 添加 target ADD_CUSTOM_TARGET ( @@ -160,20 +138,16 @@ FUNCTION(add_run_target) COMMENT "Run ${ARG_NAME} ..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} - COMMAND qemu-system-${ARG_TARGET} -machine dumpdtb=./bin/qemu.dtb - ${ARG_QEMU_FLAGS} - COMMAND dtc -I dtb ./bin/qemu.dtb -O dts -o ./bin/qemu.dts + COMMAND ${CMAKE_COMMAND} -E make_directory image/ + COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS}) ADD_CUSTOM_TARGET ( ${ARG_NAME}debug COMMENT "Run ${ARG_NAME} ..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND ${CMAKE_COMMAND} -E make_directory image/ ${commands} - COMMAND qemu-system-${ARG_TARGET} -machine dumpdtb=./bin/qemu.dtb - ${ARG_QEMU_FLAGS} - COMMAND dtc -I dtb ./bin/qemu.dtb -O dts -o ./bin/qemu.dts + COMMAND ${CMAKE_COMMAND} -E make_directory image/ + COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS} # 等待 gdb 连接 From 1a81b8113e170c39ef22fd9c378358c5ce0d6c54 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 3 Mar 2025 13:49:08 +0800 Subject: [PATCH 164/232] feat: update qemu flags Signed-off-by: Zone.N --- .pre-commit-config.yaml | 20 ++++++++++---------- CMakeLists.txt | 16 +++++----------- cmake/3rd.cmake | 3 +-- tools/Dockerfile | 5 ++++- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 30a7ead22..56e2efc32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/compiler_commands.json + - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_x86_64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index bc8e35313..685b97d1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,19 +43,13 @@ LIST (APPEND QEMU_BOOT_FLAGS "") LIST (APPEND QEMU_MACHINE_FLAGS "") # 目标平台参数 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - LIST (APPEND QEMU_BOOT_FLAGS -bios - ${ovmf_BINARY_DIR}/OVMF_${CMAKE_SYSTEM_PROCESSOR}.fd -hda - fat:rw:./image/) + LIST (APPEND QEMU_BOOT_FLAGS -bios ${u-boot_BINARY_DIR}/u-boot.rom -kernel + $) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt) - LIST ( - APPEND - QEMU_BOOT_FLAGS - -bios - ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf - # -kernel - # $ - ) + LIST (APPEND QEMU_BOOT_FLAGS -bios + ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf + -kernel $) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt,secure=on,gic_version=3 -cpu cortex-a72) diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 6eb278073..9de723efb 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -123,6 +123,7 @@ ADD_CUSTOM_TARGET ( make O=${u-boot_BINARY_DIR} $<$:qemu_arm64_defconfig> $<$:qemu-riscv64_smode_defconfig> + $<$:qemu-x86_64_defconfig> -j${CMAKE_BUILD_PARALLEL_LEVEL} COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} -j${CMAKE_BUILD_PARALLEL_LEVEL}) @@ -194,8 +195,6 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") BL32=${optee_os_BINARY_DIR}/core/tee-header_v2.bin BL32_EXTRA1=${optee_os_BINARY_DIR}/core/tee-pager_v2.bin BL32_EXTRA2=${optee_os_BINARY_DIR}/core/tee-pageable_v2.bin - # @todo uefi 支持 - # BL33=${ovmf_BINARY_DIR}/OVMF_aarch64.fd BL33=${u-boot_BINARY_DIR}/u-boot.bin BL32_RAM_LOCATION=tdram QEMU_USE_GIC_DRIVER=QEMU_GICV3 SPD=opteed all fip -j${CMAKE_BUILD_PARALLEL_LEVEL} diff --git a/tools/Dockerfile b/tools/Dockerfile index 5de978f60..edf0c18c2 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -78,11 +78,14 @@ RUN apt install --no-install-recommends --fix-missing -y \ flex \ bison \ device-tree-compiler \ + python3-dev \ python3-cryptography \ python3-pyelftools \ + python3-setuptools \ libgnutls28-dev \ gawk \ - u-boot-tools + u-boot-tools \ + swig RUN apt install --no-install-recommends --fix-missing -y \ gcc \ g++ \ From 66ba394f17e4299f84b7522869855705b193aa41 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 3 Mar 2025 16:17:33 +0800 Subject: [PATCH 165/232] feat: load kernel via tftp at /srv/tftp/bin/kernel.elf Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- CMakeLists.txt | 17 ++++-- CMakePresets.json | 2 +- cmake/functions.cmake | 26 ++++++++-- tools/Dockerfile | 6 ++- ...qemu_virt.its => aarch64_qemu_virt.its.in} | 22 ++------ tools/riscv64_qemu_virt.its.in | 52 +++++++++++++++++++ tools/x86_64_qemu_virt.its.in | 39 ++++++++++++++ 8 files changed, 137 insertions(+), 29 deletions(-) rename tools/{aarch64_qemu_virt.its => aarch64_qemu_virt.its.in} (65%) create mode 100644 tools/riscv64_qemu_virt.its.in create mode 100644 tools/x86_64_qemu_virt.its.in diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 56e2efc32..b49887a36 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index 685b97d1e..b3c8eaa79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,13 +43,11 @@ LIST (APPEND QEMU_BOOT_FLAGS "") LIST (APPEND QEMU_MACHINE_FLAGS "") # 目标平台参数 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") - LIST (APPEND QEMU_BOOT_FLAGS -bios ${u-boot_BINARY_DIR}/u-boot.rom -kernel - $) + LIST (APPEND QEMU_BOOT_FLAGS -bios ${u-boot_BINARY_DIR}/u-boot.rom) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt) LIST (APPEND QEMU_BOOT_FLAGS -bios - ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf - -kernel $) + ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt,secure=on,gic_version=3 -cpu cortex-a72) @@ -75,10 +73,21 @@ GEN_DTB_DTS ( ${QEMU_COMMON_FLAG} ${QEMU_MACHINE_FLAGS}) +GEN_FIT ( + DEPENDS + kernel + gen_dtb_dts + WORKING_DIRECTORY + ${PROJECT_BINARY_DIR} + TARGET + ${CMAKE_SYSTEM_PROCESSOR}) + # 添加 run 和 debug target ADD_RUN_TARGET ( DEPENDS ovmf + $<$:gen_fit> + $<$:gen_fit> $<$:opensbi-fw_jump> $<$:boot> $<$:optee_os> diff --git a/CMakePresets.json b/CMakePresets.json index fdb751dfa..21a9f159b 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -89,7 +89,7 @@ }, "QEMU_COMMON_FLAG": { "type": "STRING", - "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;4;-netdev;user,id=net0;-device;e1000,netdev=net0" + "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;4;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" }, "BOOT_ELF_OUTPUT_NAME": { "type": "STRING", diff --git a/cmake/functions.cmake b/cmake/functions.cmake index 6a61e874b..ea7fc8d18 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -45,9 +45,6 @@ FUNCTION(elf2efi target efi) --target=efi-app-${CMAKE_SYSTEM_PROCESSOR} --subsystem=10) ENDFUNCTION() -# 生成 uboot 使用的 FIT -# @todo 需要解决依赖关系 - # 添加测试覆盖率 target # DEPENDS 要生成的 targets # SOURCE_DIR 源码路径 @@ -112,6 +109,27 @@ FUNCTION(gen_dtb_dts) COMMAND dtc -I dtb bin/qemu.dtb -O dts -o bin/qemu.dts) ENDFUNCTION() +# 生成 uboot 使用的 FIT +# @todo 需要解决依赖关系 +FUNCTION(gen_fit) + # 解析参数 + SET (options) + SET (one_value_keywords TARGET WORKING_DIRECTORY) + SET (multi_value_keywords DEPENDS) + CMAKE_PARSE_ARGUMENTS (ARG "${options}" "${one_value_keywords}" + "${multi_value_keywords}" ${ARGN}) + + CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_qemu_virt.its.in + ${ARG_WORKING_DIRECTORY}/bin/qemu.its @ONLY) + + ADD_CUSTOM_TARGET ( + gen_fit + COMMENT "Generating FIT file..." + DEPENDS ${ARG_DEPENDS} + WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} + COMMAND mkimage -f bin/qemu.its bin/qemu.itb) +ENDFUNCTION() + # 添加运行 qemu target # NAME 生成的 target 前缀 # TARGET 目标架构 @@ -140,6 +158,7 @@ FUNCTION(add_run_target) WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} COMMAND ${CMAKE_COMMAND} -E make_directory image/ COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin /srv/tftp COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS}) ADD_CUSTOM_TARGET ( ${ARG_NAME}debug @@ -148,6 +167,7 @@ FUNCTION(add_run_target) WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} COMMAND ${CMAKE_COMMAND} -E make_directory image/ COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin /srv/tftp COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS} # 等待 gdb 连接 diff --git a/tools/Dockerfile b/tools/Dockerfile index edf0c18c2..5213cfc74 100644 --- a/tools/Dockerfile +++ b/tools/Dockerfile @@ -29,7 +29,8 @@ RUN apt install --no-install-recommends --fix-missing -y \ socat \ lsof \ bc \ - cpio + cpio \ + tftpd-hpa RUN apt install --no-install-recommends --fix-missing -y \ file \ vim \ @@ -60,7 +61,8 @@ RUN locale-gen en_US.UTF-8 && locale-gen zh_CN.UTF-8 \ && chsh -s /bin/zsh root \ && usermod -s /bin/zsh root \ && chsh -s /bin/zsh ubuntu \ - && usermod -s /bin/zsh ubuntu + && usermod -s /bin/zsh ubuntu \ + && chmod 777 /srv/tftp FROM basic_tools AS dev_tools RUN apt install --no-install-recommends --fix-missing -y \ diff --git a/tools/aarch64_qemu_virt.its b/tools/aarch64_qemu_virt.its.in similarity index 65% rename from tools/aarch64_qemu_virt.its rename to tools/aarch64_qemu_virt.its.in index 9c37cea3f..a9625e342 100644 --- a/tools/aarch64_qemu_virt.its +++ b/tools/aarch64_qemu_virt.its.in @@ -8,7 +8,7 @@ kernel@1 { description = "Linux Kernel"; // 内核路径 - data = /incbin/("./zImage"); + data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); type = "kernel"; // 架构类型 arch = "arm64"; @@ -16,9 +16,9 @@ // 压缩方式 compression = "none"; // 内核加载地址 - load = <0x80008000>; + load = <0x40100000>; // 内核入口地址 - entry = <0x80008000>; + entry = <0x40110018>; hash-1 { algo = "sha1"; }; @@ -27,7 +27,7 @@ fdt@1 { description = "Device Tree Blob"; // dtb 路径 - data = /incbin/("./myboard.dtb"); + data = /incbin/("@CMAKE_BINARY_DIR@/bin/qemu.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; @@ -35,19 +35,6 @@ algo = "sha1"; }; }; - - ramdisk@1 { - description = "Root Filesystem"; - // 根文件系统路径 - data = /incbin/("./rootfs.cpio.gz"); - type = "ramdisk"; - arch = "arm64"; - os = "linux"; - compression = "none"; - hash-1 { - algo = "sha1"; - }; - }; }; configurations { @@ -57,7 +44,6 @@ description = "Default Boot Configuration"; kernel = "kernel@1"; fdt = "fdt@1"; - ramdisk = "ramdisk@1"; hash-1 { algo = "sha1"; }; diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in new file mode 100644 index 000000000..9c1de77ee --- /dev/null +++ b/tools/riscv64_qemu_virt.its.in @@ -0,0 +1,52 @@ +/dts-v1/; + +/ { + description = "U-Boot FIT Image"; + #address-cells = <1>; + + images { + kernel@1 { + description = "Linux Kernel"; + // 内核路径 + data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); + type = "kernel"; + // 架构类型 + arch = "riscv64"; + os = "linux"; + // 压缩方式 + compression = "none"; + // 内核加载地址 + load = <0x80200000>; + // 内核入口地址 + entry = <0x80210000>; + hash-1 { + algo = "sha1"; + }; + }; + + fdt@1 { + description = "Device Tree Blob"; + // dtb 路径 + data = /incbin/("@CMAKE_BINARY_DIR@/bin/qemu.dtb"); + type = "flat_dt"; + arch = "riscv64"; + compression = "none"; + hash-1 { + algo = "sha1"; + }; + }; + }; + + configurations { + default = "config@1"; + + config@1 { + description = "Default Boot Configuration"; + kernel = "kernel@1"; + fdt = "fdt@1"; + hash-1 { + algo = "sha1"; + }; + }; + }; +}; diff --git a/tools/x86_64_qemu_virt.its.in b/tools/x86_64_qemu_virt.its.in new file mode 100644 index 000000000..98c7a7de4 --- /dev/null +++ b/tools/x86_64_qemu_virt.its.in @@ -0,0 +1,39 @@ +/dts-v1/; + +/ { + description = "U-Boot FIT Image"; + #address-cells = <1>; + + images { + kernel@1 { + description = "Linux Kernel"; + // 内核路径 + data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); + type = "kernel"; + // 架构类型 + arch = "ia64"; + os = "linux"; + // 压缩方式 + compression = "none"; + // 内核加载地址 + load = <0x400000>; + // 内核入口地址 + entry = <0x401018>; + hash-1 { + algo = "sha1"; + }; + }; + }; + + configurations { + default = "config@1"; + + config@1 { + description = "Default Boot Configuration"; + kernel = "kernel@1"; + hash-1 { + algo = "sha1"; + }; + }; + }; +}; From 9087e202d6ac7add3eb30626a8b133b61d95d553 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 4 Mar 2025 15:54:01 +0800 Subject: [PATCH 166/232] feat: riscv64 load done Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- cmake/functions.cmake | 5 ++++- tools/aarch64_boot_scr.txt | 6 ++++++ tools/riscv64_boot_scr.txt | 2 ++ 4 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 tools/aarch64_boot_scr.txt create mode 100644 tools/riscv64_boot_scr.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b49887a36..b41f91db0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/cmake/functions.cmake b/cmake/functions.cmake index ea7fc8d18..aee67adc9 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -127,7 +127,10 @@ FUNCTION(gen_fit) COMMENT "Generating FIT file..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND mkimage -f bin/qemu.its bin/qemu.itb) + COMMAND mkimage -f bin/qemu.its bin/qemu.itb + COMMAND + mkimage -T script -d + ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt bin/boot.scr) ENDFUNCTION() # 添加运行 qemu target diff --git a/tools/aarch64_boot_scr.txt b/tools/aarch64_boot_scr.txt new file mode 100644 index 000000000..ee3546e00 --- /dev/null +++ b/tools/aarch64_boot_scr.txt @@ -0,0 +1,6 @@ +tftp 0x40400000 bin/qemu.itb +bootm 0x40400000 + + +tftp 0x40100000 bin/kernel.elf +go 0x40110018 diff --git a/tools/riscv64_boot_scr.txt b/tools/riscv64_boot_scr.txt new file mode 100644 index 000000000..f2779eca8 --- /dev/null +++ b/tools/riscv64_boot_scr.txt @@ -0,0 +1,2 @@ +tftp 0x84000000 bin/qemu.itb +bootm 0x84000000 From 10b09d8e62523f882e92f43baad557d0a40de090 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 4 Mar 2025 18:00:17 +0800 Subject: [PATCH 167/232] feat: riscv64 load done Signed-off-by: Zone.N --- tools/aarch64_boot_scr.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/aarch64_boot_scr.txt b/tools/aarch64_boot_scr.txt index ee3546e00..9959e85f8 100644 --- a/tools/aarch64_boot_scr.txt +++ b/tools/aarch64_boot_scr.txt @@ -1,5 +1,5 @@ -tftp 0x40400000 bin/qemu.itb -bootm 0x40400000 +tftp $kernel_addr_r bin/qemu.itb +bootm $kernel_addr_r tftp 0x40100000 bin/kernel.elf From 83c63914e2fd79564b56ad3f80b5bbd3d2574324 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 5 Mar 2025 16:24:32 +0800 Subject: [PATCH 168/232] feat: riscv64 load done Signed-off-by: Zone.N --- .pre-commit-config.yaml | 18 +++++++++--------- cmake/functions.cmake | 16 ++++++++-------- tools/aarch64_boot_scr.txt | 6 +----- tools/aarch64_qemu_virt.its.in | 12 ++++++------ tools/riscv64_boot_scr.txt | 4 ++-- tools/riscv64_qemu_virt.its.in | 12 ++++++------ 6 files changed, 32 insertions(+), 36 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b41f91db0..b49887a36 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,27 +25,27 @@ repos: - id: clang-tidy args: - --checks=.clang-tidy - - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json + - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - -extra-arg=--std=c++2b - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/cmake/functions.cmake b/cmake/functions.cmake index aee67adc9..a5a2dd909 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -127,10 +127,14 @@ FUNCTION(gen_fit) COMMENT "Generating FIT file..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND mkimage -f bin/qemu.its bin/qemu.itb + COMMAND mkimage -f bin/qemu.its bin/boot.itb + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.itb + ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img COMMAND mkimage -T script -d - ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt bin/boot.scr) + ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt bin/boot.scr + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.scr + ${ARG_WORKING_DIRECTORY}/bin/boot.scr.uimg) ENDFUNCTION() # 添加运行 qemu target @@ -159,18 +163,14 @@ FUNCTION(add_run_target) COMMENT "Run ${ARG_NAME} ..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND ${CMAKE_COMMAND} -E make_directory image/ - COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ - COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin /srv/tftp + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/* /srv/tftp COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS}) ADD_CUSTOM_TARGET ( ${ARG_NAME}debug COMMENT "Run ${ARG_NAME} ..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND ${CMAKE_COMMAND} -E make_directory image/ - COMMAND ${CMAKE_COMMAND} -E copy ${ARG_KERNEL} image/ - COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin /srv/tftp + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/* /srv/tftp COMMAND qemu-system-${ARG_TARGET} ${ARG_QEMU_FLAGS} # 等待 gdb 连接 diff --git a/tools/aarch64_boot_scr.txt b/tools/aarch64_boot_scr.txt index 9959e85f8..42e87296f 100644 --- a/tools/aarch64_boot_scr.txt +++ b/tools/aarch64_boot_scr.txt @@ -1,6 +1,2 @@ -tftp $kernel_addr_r bin/qemu.itb +tftp $kernel_addr_r boot.itb bootm $kernel_addr_r - - -tftp 0x40100000 bin/kernel.elf -go 0x40110018 diff --git a/tools/aarch64_qemu_virt.its.in b/tools/aarch64_qemu_virt.its.in index a9625e342..d344a5725 100644 --- a/tools/aarch64_qemu_virt.its.in +++ b/tools/aarch64_qemu_virt.its.in @@ -5,7 +5,7 @@ #address-cells = <1>; images { - kernel@1 { + kernel { description = "Linux Kernel"; // 内核路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); @@ -24,7 +24,7 @@ }; }; - fdt@1 { + fdt { description = "Device Tree Blob"; // dtb 路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/qemu.dtb"); @@ -38,12 +38,12 @@ }; configurations { - default = "config@1"; + default = "config"; - config@1 { + config { description = "Default Boot Configuration"; - kernel = "kernel@1"; - fdt = "fdt@1"; + kernel = "kernel"; + fdt = "fdt"; hash-1 { algo = "sha1"; }; diff --git a/tools/riscv64_boot_scr.txt b/tools/riscv64_boot_scr.txt index f2779eca8..42e87296f 100644 --- a/tools/riscv64_boot_scr.txt +++ b/tools/riscv64_boot_scr.txt @@ -1,2 +1,2 @@ -tftp 0x84000000 bin/qemu.itb -bootm 0x84000000 +tftp $kernel_addr_r boot.itb +bootm $kernel_addr_r diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index 9c1de77ee..cc6d065a6 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -5,7 +5,7 @@ #address-cells = <1>; images { - kernel@1 { + kernel { description = "Linux Kernel"; // 内核路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); @@ -24,7 +24,7 @@ }; }; - fdt@1 { + fdt { description = "Device Tree Blob"; // dtb 路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/qemu.dtb"); @@ -38,12 +38,12 @@ }; configurations { - default = "config@1"; + default = "config"; - config@1 { + config { description = "Default Boot Configuration"; - kernel = "kernel@1"; - fdt = "fdt@1"; + kernel = "kernel"; + fdt = "fdt"; hash-1 { algo = "sha1"; }; From fc7ec51a68f6b0bfb9f6e3da53767833c8a68d05 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Wed, 5 Mar 2025 18:04:26 +0800 Subject: [PATCH 169/232] feat: riscv64 load done Signed-off-by: Zone.N --- CMakeLists.txt | 1 + cmake/functions.cmake | 11 ++++++++--- src/kernel/main.cpp | 4 ++++ tools/aarch64_boot_scr.txt | 2 +- tools/riscv64_boot_scr.txt | 2 +- tools/riscv64_qemu_virt.its.in | 4 ++-- tools/x86_64_qemu_virt.its.in | 2 +- 7 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b3c8eaa79..b39123498 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,7 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST ( APPEND QEMU_BOOT_FLAGS + # -drive file=fat:rw:bin,format=raw,media=disk -serial ${QEMU_NORMAL_WORLD_DEV_PATH} -serial diff --git a/cmake/functions.cmake b/cmake/functions.cmake index a5a2dd909..69de87b2b 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -127,14 +127,19 @@ FUNCTION(gen_fit) COMMENT "Generating FIT file..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND mkimage -f bin/qemu.its bin/boot.itb - COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.itb + COMMAND mkimage -f bin/qemu.its bin/boot.fit + # COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.fit + # ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img + COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/kernel.elf ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img COMMAND mkimage -T script -d ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt bin/boot.scr COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.scr - ${ARG_WORKING_DIRECTORY}/bin/boot.scr.uimg) + ${ARG_WORKING_DIRECTORY}/bin/boot.scr.uimg + # COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.scr + # ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img + ) ENDFUNCTION() # 添加运行 qemu target diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 53adaa4f9..479e17661 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -37,6 +37,10 @@ auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { } // namespace void _start(uint32_t argc, uint8_t *argv) { + while (true) { + ; + } + if (!is_boot_core) { is_boot_core = true; CppInit(); diff --git a/tools/aarch64_boot_scr.txt b/tools/aarch64_boot_scr.txt index 42e87296f..aff9f1851 100644 --- a/tools/aarch64_boot_scr.txt +++ b/tools/aarch64_boot_scr.txt @@ -1,2 +1,2 @@ -tftp $kernel_addr_r boot.itb +tftp $kernel_addr_r boot.fit bootm $kernel_addr_r diff --git a/tools/riscv64_boot_scr.txt b/tools/riscv64_boot_scr.txt index 42e87296f..aff9f1851 100644 --- a/tools/riscv64_boot_scr.txt +++ b/tools/riscv64_boot_scr.txt @@ -1,2 +1,2 @@ -tftp $kernel_addr_r boot.itb +tftp $kernel_addr_r boot.fit bootm $kernel_addr_r diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index cc6d065a6..c059b8f73 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -11,7 +11,7 @@ data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); type = "kernel"; // 架构类型 - arch = "riscv64"; + arch = "riscv"; os = "linux"; // 压缩方式 compression = "none"; @@ -29,7 +29,7 @@ // dtb 路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/qemu.dtb"); type = "flat_dt"; - arch = "riscv64"; + arch = "riscv"; compression = "none"; hash-1 { algo = "sha1"; diff --git a/tools/x86_64_qemu_virt.its.in b/tools/x86_64_qemu_virt.its.in index 98c7a7de4..d7f717c9f 100644 --- a/tools/x86_64_qemu_virt.its.in +++ b/tools/x86_64_qemu_virt.its.in @@ -11,7 +11,7 @@ data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); type = "kernel"; // 架构类型 - arch = "ia64"; + arch = "x86_64"; os = "linux"; // 压缩方式 compression = "none"; From 776be70b6c37347cf128d64281ef0dad559cd061 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 6 Mar 2025 14:55:02 +0800 Subject: [PATCH 170/232] feat: aarch64 load Signed-off-by: Zone.N --- CMakeLists.txt | 3 ++- cmake/functions.cmake | 12 ++---------- tools/aarch64_boot_scr.txt | 1 + 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b39123498..18606fe5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST ( APPEND QEMU_BOOT_FLAGS - # -drive file=fat:rw:bin,format=raw,media=disk + -drive + file=fat:rw:bin,format=raw,media=disk -serial ${QEMU_NORMAL_WORLD_DEV_PATH} -serial diff --git a/cmake/functions.cmake b/cmake/functions.cmake index 69de87b2b..1f31cbe21 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -128,18 +128,10 @@ FUNCTION(gen_fit) DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} COMMAND mkimage -f bin/qemu.its bin/boot.fit - # COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.fit - # ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img - COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/kernel.elf - ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img COMMAND mkimage -T script -d - ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt bin/boot.scr - COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.scr - ${ARG_WORKING_DIRECTORY}/bin/boot.scr.uimg - # COMMAND ln -s -f ${ARG_WORKING_DIRECTORY}/bin/boot.scr - # ${ARG_WORKING_DIRECTORY}/bin/0A00020F.img - ) + ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt + bin/boot.scr.uimg) ENDFUNCTION() # 添加运行 qemu target diff --git a/tools/aarch64_boot_scr.txt b/tools/aarch64_boot_scr.txt index aff9f1851..65150d163 100644 --- a/tools/aarch64_boot_scr.txt +++ b/tools/aarch64_boot_scr.txt @@ -1,2 +1,3 @@ +bootp tftp $kernel_addr_r boot.fit bootm $kernel_addr_r From 57eb94f77db32b5a7c8af3c6c89a9cb9b64bd168 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 6 Mar 2025 14:58:05 +0800 Subject: [PATCH 171/232] feat: aarch64 load Signed-off-by: Zone.N --- cmake/functions.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/functions.cmake b/cmake/functions.cmake index 1f31cbe21..c3ebd19e3 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -120,14 +120,14 @@ FUNCTION(gen_fit) "${multi_value_keywords}" ${ARGN}) CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_qemu_virt.its.in - ${ARG_WORKING_DIRECTORY}/bin/qemu.its @ONLY) + ${ARG_WORKING_DIRECTORY}/bin/boot.its @ONLY) ADD_CUSTOM_TARGET ( gen_fit COMMENT "Generating FIT file..." DEPENDS ${ARG_DEPENDS} WORKING_DIRECTORY ${ARG_WORKING_DIRECTORY} - COMMAND mkimage -f bin/qemu.its bin/boot.fit + COMMAND mkimage -f bin/boot.its bin/boot.fit COMMAND mkimage -T script -d ${CMAKE_SOURCE_DIR}/tools/${ARG_TARGET}_boot_scr.txt From bb93b263ce2121868511933063762b40e93d98b2 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 6 Mar 2025 17:45:59 +0800 Subject: [PATCH 172/232] feat: boot done Signed-off-by: Zone.N --- src/kernel/main.cpp | 4 ---- tools/aarch64_qemu_virt.its.in | 4 ++-- tools/riscv64_qemu_virt.its.in | 4 ++-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 479e17661..53adaa4f9 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -37,10 +37,6 @@ auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { } // namespace void _start(uint32_t argc, uint8_t *argv) { - while (true) { - ; - } - if (!is_boot_core) { is_boot_core = true; CppInit(); diff --git a/tools/aarch64_qemu_virt.its.in b/tools/aarch64_qemu_virt.its.in index d344a5725..66f531068 100644 --- a/tools/aarch64_qemu_virt.its.in +++ b/tools/aarch64_qemu_virt.its.in @@ -12,13 +12,13 @@ type = "kernel"; // 架构类型 arch = "arm64"; - os = "linux"; + os = "elf"; // 压缩方式 compression = "none"; // 内核加载地址 load = <0x40100000>; // 内核入口地址 - entry = <0x40110018>; + entry = <0x40100000>; hash-1 { algo = "sha1"; }; diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index c059b8f73..847efafa3 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -12,13 +12,13 @@ type = "kernel"; // 架构类型 arch = "riscv"; - os = "linux"; + os = "elf"; // 压缩方式 compression = "none"; // 内核加载地址 load = <0x80200000>; // 内核入口地址 - entry = <0x80210000>; + entry = <0x80200000>; hash-1 { algo = "sha1"; }; From c29d60eda79929482db6bd00890277cf22f46c1a Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 14 Mar 2025 18:00:28 +0800 Subject: [PATCH 173/232] working on uboot bug Signed-off-by: Zone.N --- .pre-commit-config.yaml | 16 ++--- CMakeLists.txt | 18 +++++- cmake/3rd.cmake | 92 +++++++++++++-------------- src/kernel/arch/aarch64/arch_main.cpp | 17 +++-- src/kernel/arch/riscv64/arch_main.cpp | 14 ++++ tools/riscv64_qemu_virt.its.in | 1 + 6 files changed, 91 insertions(+), 67 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b49887a36..5c6624f13 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index 18606fe5f..4516fc981 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,8 +46,19 @@ IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") LIST (APPEND QEMU_BOOT_FLAGS -bios ${u-boot_BINARY_DIR}/u-boot.rom) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt) - LIST (APPEND QEMU_BOOT_FLAGS -bios - ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf) + LIST ( + APPEND + QEMU_BOOT_FLAGS + -bios + # ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf + ${u-boot_BINARY_DIR}/spl/u-boot-spl.bin + -device + loader,file=${u-boot_BINARY_DIR}/u-boot.itb,addr=0x80200000 + # -kernel $ + # ${u-boot_BINARY_DIR}/spl/u-boot-spl-dtb.bin + # ${u-boot_BINARY_DIR}/u-boot + # -device loader,file=${u-boot_BINARY_DIR}/u-boot.itb,addr=0x80200000 + ) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt,secure=on,gic_version=3 -cpu cortex-a72) @@ -90,7 +101,8 @@ ADD_RUN_TARGET ( ovmf $<$:gen_fit> $<$:gen_fit> - $<$:opensbi-fw_jump> + $<$:opensbi> + $<$:u-boot> $<$:boot> $<$:optee_os> $<$:arm-trusted-firmware> diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index 9de723efb..e8fdd86c7 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -109,27 +109,6 @@ ADD_SUBDIRECTORY (3rd/cpu_io) # https://github.com/MRNIU/smccc.git # ADD_SUBDIRECTORY (3rd/smccc) -# https://github.com/u-boot/u-boot.git -SET (u-boot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/u-boot) -SET (u-boot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/u-boot) -ADD_CUSTOM_TARGET ( - u-boot - COMMENT "build u-boot..." - # make 时编译 - ALL - WORKING_DIRECTORY ${u-boot_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} - COMMAND - make O=${u-boot_BINARY_DIR} - $<$:qemu_arm64_defconfig> - $<$:qemu-riscv64_smode_defconfig> - $<$:qemu-x86_64_defconfig> - -j${CMAKE_BUILD_PARALLEL_LEVEL} - COMMAND make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} - -j${CMAKE_BUILD_PARALLEL_LEVEL}) -SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - ${u-boot_BINARY_DIR}) - # https://github.com/buildroot/buildroot.git SET (buildroot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/buildroot) SET (buildroot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/buildroot) @@ -152,6 +131,28 @@ ADD_CUSTOM_TARGET ( SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${buildroot_BINARY_DIR}) +IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") + # https://github.com/riscv-software-src/opensbi.git + # 编译 opensbi + SET (opensbi_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/opensbi) + SET (opensbi_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/opensbi) + ADD_CUSTOM_TARGET ( + opensbi + COMMENT "build opensbi..." + # make 时编译 + ALL + WORKING_DIRECTORY ${opensbi_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${opensbi_BINARY_DIR} + COMMAND + make PLATFORM_RISCV_XLEN=64 PLATFORM=generic + CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${opensbi_BINARY_DIR} + -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND ln -s -f ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}) + + # https://github.com/MRNIU/opensbi_interface.git + ADD_SUBDIRECTORY (3rd/opensbi_interface) +ENDIF() + IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") # https://github.com/OP-TEE/optee_os.git SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) @@ -211,32 +212,29 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") ${arm-trusted-firmware_BINARY_DIR}) ENDIF() -IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") - # https://github.com/riscv-software-src/opensbi.git - # 编译 opensbi - SET (opensbi_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/opensbi) - SET (opensbi_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/opensbi) - ADD_CUSTOM_TARGET ( - opensbi - COMMENT "build opensbi..." - # make 时编译 - ALL - DEPENDS u-boot - WORKING_DIRECTORY ${opensbi_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${opensbi_BINARY_DIR} - COMMAND - make PLATFORM_RISCV_XLEN=64 PLATFORM=generic - CROSS_COMPILE=${TOOLCHAIN_PREFIX} FW_PAYLOAD=y - FW_PAYLOAD_PATH=${u-boot_BINARY_DIR}/u-boot.bin - O=${opensbi_BINARY_DIR} -j${CMAKE_BUILD_PARALLEL_LEVEL} - COMMAND ln -s -f ${opensbi_SOURCE_DIR}/include ${opensbi_BINARY_DIR}) - - ADD_LIBRARY (opensbi-fw_jump INTERFACE) - ADD_DEPENDENCIES (opensbi-fw_jump opensbi) - - # https://github.com/MRNIU/opensbi_interface.git - ADD_SUBDIRECTORY (3rd/opensbi_interface) -ENDIF() +# https://github.com/u-boot/u-boot.git +SET (u-boot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/u-boot) +SET (u-boot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/u-boot) +ADD_CUSTOM_TARGET ( + u-boot + COMMENT "build u-boot..." + # make 时编译 + ALL + DEPENDS $<$:opensbi> + WORKING_DIRECTORY ${u-boot_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} + COMMAND + make O=${u-boot_BINARY_DIR} + $<$:qemu_arm64_defconfig> + $<$:qemu-riscv64_spl_defconfig> + $<$:qemu-x86_64_defconfig> + -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND + make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} + $<$:OPENSBI=${opensbi_BINARY_DIR}/platform/generic/firmware/fw_dynamic.bin> + -j${CMAKE_BUILD_PARALLEL_LEVEL}) +SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${u-boot_BINARY_DIR}) # https://git.kernel.org/pub/scm/utils/dtc/dtc.git SET (dtc_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/dtc) diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index 1a34cdf38..d29736306 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -56,17 +56,18 @@ void ArchInit(uint32_t argc, const uint8_t* argv) { // 初始化 FPU cpu_io::SetupFpu(); - Singleton::GetInstance() = KernelFdt(0x40000000); + // Singleton::GetInstance() = KernelFdt(0x40000000); - Singleton::GetInstance() = BasicInfo(argc, argv); - Singleton::GetInstance().core_count++; + // Singleton::GetInstance() = BasicInfo(argc, argv); + // Singleton::GetInstance().core_count++; - auto [serial_base, serial_size] = - Singleton::GetInstance().GetSerial(); + // auto [serial_base, serial_size] = + // Singleton::GetInstance().GetSerial(); - static auto uart = Pl011(serial_base); + static auto uart = Pl011(0x9000000); pl011 = &uart; - sk_std::cout << Singleton::GetInstance(); + klog::Info("argv 0x%p\n", argv); + // sk_std::cout << Singleton::GetInstance(); uart.PutChar('H'); uart.PutChar('e'); @@ -80,8 +81,6 @@ void ArchInit(uint32_t argc, const uint8_t* argv) { uart.PutChar('t'); uart.PutChar('!'); uart.PutChar('\n'); - - // __asm__ volatile("sev"); } void ArchInitSMP(uint32_t argc, const uint8_t* argv) { diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 44a7f71ab..ca2bf4cae 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -49,7 +49,21 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { void ArchInit(uint32_t argc, const uint8_t *argv) { printf("boot hart id: %d\n", argc); + + auto aaa = 0xbeefc760; + printf("dtb info addr: %p\n", argv); + for (auto i = 0; i < 160; i++) { + if (i % 4 == 0) { + printf(" 0x"); + } + printf("%X", argv[i]); + } + printf("\n"); + // BEEFB420 + // BEEFC100 + // beefc760 + // fdt_addr_r // 将 core id 保存到 tp 寄存器 cpu_io::Tp::Write(argc); diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index 847efafa3..3eac7c6bc 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -31,6 +31,7 @@ type = "flat_dt"; arch = "riscv"; compression = "none"; + load = <0x80400000>; hash-1 { algo = "sha1"; }; From a14e44afffe9fdbf6ed48651ae379bad82f538a6 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 21 Mar 2025 14:29:19 +0800 Subject: [PATCH 174/232] fix: running riscv64 on uboot-spl Signed-off-by: Zone.N --- .pre-commit-config.yaml | 16 ++++++++-------- src/kernel/arch/riscv64/arch_main.cpp | 18 +----------------- src/kernel/include/spinlock.hpp | 18 +++++++++--------- tools/riscv64_qemu_virt.its.in | 4 ++-- 4 files changed, 20 insertions(+), 36 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5c6624f13..b49887a36 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + - id: clang-tidy + args: + - --checks=.clang-tidy + - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index ca2bf4cae..b67ebb20b 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -19,6 +19,7 @@ #include "basic_info.hpp" #include "kernel_elf.hpp" #include "kernel_fdt.hpp" +#include "kernel_log.hpp" #include "ns16550a.h" #include "per_cpu.hpp" #include "sk_cstdio" @@ -48,23 +49,6 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { } void ArchInit(uint32_t argc, const uint8_t *argv) { - printf("boot hart id: %d\n", argc); - - auto aaa = 0xbeefc760; - - printf("dtb info addr: %p\n", argv); - for (auto i = 0; i < 160; i++) { - if (i % 4 == 0) { - printf(" 0x"); - } - printf("%X", argv[i]); - } - printf("\n"); - // BEEFB420 - // BEEFC100 - // beefc760 - // fdt_addr_r - // 将 core id 保存到 tp 寄存器 cpu_io::Tp::Write(argc); GetCurrentCore().core_id_ = argc; diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp index d136a590b..6d37bac0e 100644 --- a/src/kernel/include/spinlock.hpp +++ b/src/kernel/include/spinlock.hpp @@ -50,7 +50,7 @@ class SpinLock { /** * @brief 获得锁 */ - void lock() { + __always_inline void lock() { DisableInterruptsNested(); if (IsLockedByCurrentCore()) { printf("spinlock %s IsLockedByCurrentCore == true.\n", name_); @@ -68,7 +68,7 @@ class SpinLock { /** * @brief 释放锁 */ - void unlock() { + __always_inline void unlock() { if (!IsLockedByCurrentCore()) { printf("spinlock %s IsLockedByCurrentCore == false.\n", name_); } @@ -90,12 +90,12 @@ class SpinLock { /// 获得此锁的 core_id_ size_t core_id_{SIZE_MAX}; - virtual void EnableInterrupt() const { cpu_io::EnableInterrupt(); } - virtual void DisableInterrupt() const { cpu_io::DisableInterrupt(); } - [[nodiscard]] virtual auto GetInterruptStatus() const -> bool { + static __always_inline void EnableInterrupt() { cpu_io::EnableInterrupt(); } + static __always_inline void DisableInterrupt() { cpu_io::DisableInterrupt(); } + [[nodiscard]] static __always_inline auto GetInterruptStatus() -> bool { return cpu_io::GetInterruptStatus(); } - [[nodiscard]] virtual auto GetCurrentCoreId() const -> size_t { + [[nodiscard]] static __always_inline auto GetCurrentCoreId() -> size_t { return cpu_io::GetCurrentCoreId(); } @@ -104,14 +104,14 @@ class SpinLock { * @return true 是 * @return false 否 */ - auto IsLockedByCurrentCore() -> bool { + __always_inline auto IsLockedByCurrentCore() -> bool { return locked_._M_i && (core_id_ == GetCurrentCoreId()); } /** * @brief 中断嵌套+1 */ - void DisableInterruptsNested() { + static __always_inline void DisableInterruptsNested() { bool old = GetInterruptStatus(); DisableInterrupt(); @@ -125,7 +125,7 @@ class SpinLock { /** * @brief 中断嵌套-1 */ - void RestoreInterruptsNested() { + static __always_inline void RestoreInterruptsNested() { if (GetInterruptStatus()) { printf("RestoreInterruptsNested - interruptible\n"); } diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index 3eac7c6bc..fe2198cff 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -8,11 +8,11 @@ kernel { description = "Linux Kernel"; // 内核路径 - data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); + data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.bin"); type = "kernel"; // 架构类型 arch = "riscv"; - os = "elf"; + os = "linux"; // 压缩方式 compression = "none"; // 内核加载地址 From e43bc2974ee30150cb5af4b91ac86d1b5fe6811f Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 21 Mar 2025 14:56:16 +0800 Subject: [PATCH 175/232] feat: change main param Signed-off-by: Zone.N --- src/kernel/arch/arch.h | 4 ++-- src/kernel/arch/riscv64/arch_main.cpp | 6 +++--- src/kernel/include/basic_info.hpp | 2 +- src/kernel/include/kernel.h | 8 ++++---- src/kernel/main.cpp | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/kernel/arch/arch.h b/src/kernel/arch/arch.h index edee81efb..2b7053a0f 100644 --- a/src/kernel/arch/arch.h +++ b/src/kernel/arch/arch.h @@ -27,8 +27,8 @@ * @param argc 在不同体系结构有不同含义,同 _start * @param argv 在不同体系结构有不同含义,同 _start */ -void ArchInit(uint32_t argc, const uint8_t *argv); -void ArchInitSMP(uint32_t argc, const uint8_t *argv); +void ArchInit(int argc, const char **argv); +void ArchInitSMP(int argc, const char **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 b67ebb20b..344765564 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -30,7 +30,7 @@ extern "C" void _putchar(char character) { sbi_debug_console_write_byte(character); } -BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { +BasicInfo::BasicInfo(int argc, const char **argv) { (void)argc; (void)argv; @@ -48,7 +48,7 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t *argv) { fdt_addr = reinterpret_cast(argv); } -void ArchInit(uint32_t argc, const uint8_t *argv) { +void ArchInit(int argc, const char **argv) { // 将 core id 保存到 tp 寄存器 cpu_io::Tp::Write(argc); GetCurrentCore().core_id_ = argc; @@ -89,7 +89,7 @@ void ArchInit(uint32_t argc, const uint8_t *argv) { } } -void ArchInitSMP(uint32_t argc, const uint8_t *) { +void ArchInitSMP(int argc, const char **) { cpu_io::Tp::Write(argc); GetCurrentCore().core_id_ = argc; Singleton::GetInstance().core_count++; diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index f745a433a..80cfaf66b 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -60,7 +60,7 @@ struct BasicInfo { * @param argc 同 _start * @param argv 同 _start */ - explicit BasicInfo(uint32_t argc, const uint8_t *argv); + explicit BasicInfo(int argc, const char **argv); /// @name 构造/析构函数 /// @{ diff --git a/src/kernel/include/kernel.h b/src/kernel/include/kernel.h index ab4d3cb95..04ed5ee65 100644 --- a/src/kernel/include/kernel.h +++ b/src/kernel/include/kernel.h @@ -29,15 +29,15 @@ * x86_64: BasicInfo 地址 * @return uint32_t 正常返回 0 */ -extern "C" [[maybe_unused]] [[noreturn]] void _start(uint32_t argc, - uint8_t* argv); +extern "C" [[maybe_unused]] [[noreturn]] void _start(int argc, + const char** argv); /** * @brief 内核入口 * @param argc 同 _start * @param argv 同 _start - * @return uint32_t 正常返回 0 + * @return int 正常返回 0 */ -auto main(uint32_t argc, uint8_t* argv) -> uint32_t; +auto main(int argc, const char** argv) -> int; #endif /* SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_H_ */ diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 53adaa4f9..ec73e2405 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -28,7 +28,7 @@ namespace { bool is_boot_core = false; /// 非启动核入口 -auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { +auto main_smp(int argc, const char **argv) -> int { ArchInitSMP(argc, argv); klog::Info("Hello SimpleKernel\n"); return 0; @@ -36,7 +36,7 @@ auto main_smp(uint32_t argc, uint8_t *argv) -> uint32_t { } // namespace -void _start(uint32_t argc, uint8_t *argv) { +void _start(int argc, const char **argv) { if (!is_boot_core) { is_boot_core = true; CppInit(); @@ -52,7 +52,7 @@ void _start(uint32_t argc, uint8_t *argv) { } } -auto main(uint32_t argc, uint8_t *argv) -> uint32_t { +auto main(int argc, const char **argv) -> int { // 架构相关初始化 ArchInit(argc, argv); From 58a285f163bdd5bc8f520f0f2944ad973d14e6f5 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 21 Mar 2025 17:45:29 +0800 Subject: [PATCH 176/232] feat: support elf file Signed-off-by: Zone.N --- CMakePresets.json | 6 +++++- src/project_config.h | 2 ++ tools/project_config.h.in | 2 ++ tools/riscv64_qemu_virt.its.in | 17 +++++++++++++++-- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 21a9f159b..4dd9d57b0 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -89,7 +89,11 @@ }, "QEMU_COMMON_FLAG": { "type": "STRING", - "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;4;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" + "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;1;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" + }, + "KERNEL_ELF_ADDR": { + "type": "STRING", + "value": "0x80600000" }, "BOOT_ELF_OUTPUT_NAME": { "type": "STRING", diff --git a/src/project_config.h b/src/project_config.h index 210ff0e91..207ccb373 100644 --- a/src/project_config.h +++ b/src/project_config.h @@ -21,6 +21,8 @@ #define KERNEL_NAME (wchar_t *)L"kernel.elf" +#define KERNEL_ELF_ADDR (0x80600000) + #ifdef SIMPLEKERNEL_DEBUG #define SIMPLEKERNEL_DEBUG_LOG #endif diff --git a/tools/project_config.h.in b/tools/project_config.h.in index 2dc0831d5..2dfe12001 100644 --- a/tools/project_config.h.in +++ b/tools/project_config.h.in @@ -21,6 +21,8 @@ #define KERNEL_NAME (wchar_t *)L"@KERNEL_ELF_OUTPUT_NAME@" +#define KERNEL_ELF_ADDR (@KERNEL_ELF_ADDR@) + #ifdef SIMPLEKERNEL_DEBUG #define SIMPLEKERNEL_DEBUG_LOG #endif diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index fe2198cff..ca17b8d32 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -1,12 +1,12 @@ /dts-v1/; / { - description = "U-Boot FIT Image"; + description = "SimpleKernel U-Boot FIT Image"; #address-cells = <1>; images { kernel { - description = "Linux Kernel"; + description = "SimpleKernel"; // 内核路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.bin"); type = "kernel"; @@ -36,6 +36,18 @@ algo = "sha1"; }; }; + + kernel_elf { + description = "SimpleKernel elf"; + data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); + type = "firmware"; + arch = "riscv"; + compression = "none"; + load = <@KERNEL_ELF_ADDR@>; + hash-1 { + algo = "sha1"; + }; + }; }; configurations { @@ -45,6 +57,7 @@ description = "Default Boot Configuration"; kernel = "kernel"; fdt = "fdt"; + loadables = "kernel_elf"; hash-1 { algo = "sha1"; }; From 6df5153218135443ffb59fb5d096bdebe579175d Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 21 Mar 2025 17:57:39 +0800 Subject: [PATCH 177/232] feat: support elf file Signed-off-by: Zone.N --- src/kernel/arch/riscv64/arch_main.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 344765564..e53a51c41 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -16,6 +16,7 @@ #include #include +#include "../../project_config.h" #include "basic_info.hpp" #include "kernel_elf.hpp" #include "kernel_fdt.hpp" @@ -42,7 +43,7 @@ BasicInfo::BasicInfo(int argc, const char **argv) { kernel_addr = reinterpret_cast(__executable_start); kernel_size = reinterpret_cast(end) - reinterpret_cast(__executable_start); - elf_addr = 0; + elf_addr = KERNEL_ELF_ADDR; elf_size = 0; fdt_addr = reinterpret_cast(argv); @@ -60,6 +61,10 @@ void ArchInit(int argc, const char **argv) { Singleton::GetInstance().core_count++; sk_std::cout << Singleton::GetInstance(); + // 解析内核 elf 信息 + Singleton::GetInstance() = + KernelElf(Singleton::GetInstance().elf_addr); + auto [serial_base, serial_size] = Singleton::GetInstance().GetSerial(); auto uart = Ns16550a(serial_base); From 6408fb5226efc62672ff8a871a97337145064eff Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 21 Mar 2025 18:03:24 +0800 Subject: [PATCH 178/232] feat: working on riscv64 backtrace Signed-off-by: Zone.N --- src/kernel/arch/riscv64/backtrace.cpp | 35 +++++++++++++++++++-------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 327cb247f..958e132df 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -15,38 +15,53 @@ */ #include +#include #include +#include +#include #include "arch.h" #include "kernel_elf.hpp" -#include "kernel_fdt.hpp" #include "kernel_log.hpp" -#include "sk_cstdio" -#include "sk_libc.h" +#include "singleton.hpp" -auto backtrace(void **buffer, int size) -> int { +auto backtrace(std::array &buffer) -> int { auto *fp = reinterpret_cast(cpu_io::Fp::Read()); - uint64_t *ra = nullptr; + uint64_t ra = 0; int count = 0; - while ((fp != nullptr) && (*fp != 0U) && count < size) { - ra = fp - 1; + while ((fp != nullptr) && (*fp != 0U) && count < buffer.max_size()) { + ra = *(fp - 1); fp = reinterpret_cast(*(fp - 2)); - buffer[count++] = reinterpret_cast(*ra); + buffer[count++] = ra; } return count; } void DumpStack() { - std::array buffer{}; + std::array buffer{}; // 获取调用栈中的地址 - auto num_frames = backtrace(buffer.data(), kMaxFrameCount); + auto num_frames = backtrace(buffer); // 打印地址 /// @todo 打印函数名,需要 elf 支持 for (auto i = 0; i < num_frames; i++) { klog::Err("[0x%p]\n", buffer[i]); } + for (auto current_frame_idx = 0; current_frame_idx < num_frames; + current_frame_idx++) { + // 打印函数名 + klog::Err("current_frame_idx[%d]\n", current_frame_idx); + for (auto symtab : Singleton::GetInstance().symtab_) { + if ((ELF64_ST_TYPE(symtab.st_info) == STT_FUNC) && + (buffer[current_frame_idx] >= symtab.st_value) && + (buffer[current_frame_idx] <= symtab.st_value + symtab.st_size)) { + klog::Err("[%s] 0x%p\n", + Singleton::GetInstance().strtab_ + symtab.st_name, + buffer[current_frame_idx]); + } + } + } } From e7ac1d1b58d794e6042e5978ee228d671ec356d9 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 25 Mar 2025 17:38:12 +0800 Subject: [PATCH 179/232] fix: riscv64 backtrace Signed-off-by: Zone.N --- src/kernel/arch/riscv64/arch_main.cpp | 3 --- src/kernel/arch/riscv64/backtrace.cpp | 11 +++-------- tools/riscv64_qemu_virt.its.in | 4 ++-- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index e53a51c41..5c47c5476 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -81,9 +81,6 @@ void ArchInit(int argc, const char **argv) { uart.PutChar('!'); uart.PutChar('\n'); - // 解析内核 elf 信息 - Singleton::GetInstance() = KernelElf(); - klog::Info("Hello riscv64 ArchInit\n"); for (size_t i = 0; i < PerCpu::kMaxCoreCount; i++) { auto ret = sbi_hart_start(i, reinterpret_cast(_boot), 0); diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 958e132df..98d60e5f7 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -26,7 +26,8 @@ #include "kernel_log.hpp" #include "singleton.hpp" -auto backtrace(std::array &buffer) -> int { +__always_inline auto backtrace(std::array &buffer) + -> int { auto *fp = reinterpret_cast(cpu_io::Fp::Read()); uint64_t ra = 0; @@ -45,15 +46,9 @@ void DumpStack() { // 获取调用栈中的地址 auto num_frames = backtrace(buffer); - // 打印地址 - /// @todo 打印函数名,需要 elf 支持 - for (auto i = 0; i < num_frames; i++) { - klog::Err("[0x%p]\n", buffer[i]); - } + // 打印函数名 for (auto current_frame_idx = 0; current_frame_idx < num_frames; current_frame_idx++) { - // 打印函数名 - klog::Err("current_frame_idx[%d]\n", current_frame_idx); for (auto symtab : Singleton::GetInstance().symtab_) { if ((ELF64_ST_TYPE(symtab.st_info) == STT_FUNC) && (buffer[current_frame_idx] >= symtab.st_value) && diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index ca17b8d32..1763a5ca0 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -8,7 +8,7 @@ kernel { description = "SimpleKernel"; // 内核路径 - data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.bin"); + data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); type = "kernel"; // 架构类型 arch = "riscv"; @@ -18,7 +18,7 @@ // 内核加载地址 load = <0x80200000>; // 内核入口地址 - entry = <0x80200000>; + entry = <0x80210000>; hash-1 { algo = "sha1"; }; From 6be34e353bb18bb88f2d72efed3a44fd83074f9c Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 25 Mar 2025 18:00:37 +0800 Subject: [PATCH 180/232] feat: riscv64 elf Signed-off-by: Zone.N --- CMakePresets.json | 4 ---- src/kernel/arch/riscv64/arch_main.cpp | 2 +- tools/riscv64_qemu_virt.its.in | 13 ------------- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/CMakePresets.json b/CMakePresets.json index 4dd9d57b0..5912766bb 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -91,10 +91,6 @@ "type": "STRING", "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;1;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" }, - "KERNEL_ELF_ADDR": { - "type": "STRING", - "value": "0x80600000" - }, "BOOT_ELF_OUTPUT_NAME": { "type": "STRING", "value": "boot.elf" diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 5c47c5476..43b51caee 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -43,7 +43,7 @@ BasicInfo::BasicInfo(int argc, const char **argv) { kernel_addr = reinterpret_cast(__executable_start); kernel_size = reinterpret_cast(end) - reinterpret_cast(__executable_start); - elf_addr = KERNEL_ELF_ADDR; + elf_addr = kernel_addr; elf_size = 0; fdt_addr = reinterpret_cast(argv); diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index 1763a5ca0..502fa5140 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -36,18 +36,6 @@ algo = "sha1"; }; }; - - kernel_elf { - description = "SimpleKernel elf"; - data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); - type = "firmware"; - arch = "riscv"; - compression = "none"; - load = <@KERNEL_ELF_ADDR@>; - hash-1 { - algo = "sha1"; - }; - }; }; configurations { @@ -57,7 +45,6 @@ description = "Default Boot Configuration"; kernel = "kernel"; fdt = "fdt"; - loadables = "kernel_elf"; hash-1 { algo = "sha1"; }; From 6f58c3ce562d9c9356d0f20239459a256cbd2a26 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Tue, 25 Mar 2025 18:04:20 +0800 Subject: [PATCH 181/232] feat: riscv64 elf Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 ++++++++++++++-------------- CMakePresets.json | 4 ---- cmake/project_config.cmake | 5 ----- src/project_config.h | 2 +- 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b49887a36..2a40b75d7 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=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakePresets.json b/CMakePresets.json index 5912766bb..df9b43eab 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -83,10 +83,6 @@ "type": "STRING", "value": "tcp::1234" }, - "QEMU_MONITOR_ARG": { - "type": "STRING", - "value": "telnet::2333,server,nowait" - }, "QEMU_COMMON_FLAG": { "type": "STRING", "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;1;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" diff --git a/cmake/project_config.cmake b/cmake/project_config.cmake index bf63b3a3e..743738483 100644 --- a/cmake/project_config.cmake +++ b/cmake/project_config.cmake @@ -47,11 +47,6 @@ IF(NOT DEFINED QEMU_GDB_PORT) SET (QEMU_GDB_PORT tcp::1234) ENDIF() -# qemu monitor 参数 -IF(NOT DEFINED QEMU_MONITOR_ARG) - SET (QEMU_MONITOR_ARG telnet::2333,server,nowait) -ENDIF() - # 生成项目配置头文件,传递给代码 CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/tools/project_config.h.in ${CMAKE_SOURCE_DIR}/src/project_config.h @ONLY) diff --git a/src/project_config.h b/src/project_config.h index 207ccb373..90ce53c85 100644 --- a/src/project_config.h +++ b/src/project_config.h @@ -21,7 +21,7 @@ #define KERNEL_NAME (wchar_t *)L"kernel.elf" -#define KERNEL_ELF_ADDR (0x80600000) +#define KERNEL_ELF_ADDR () #ifdef SIMPLEKERNEL_DEBUG #define SIMPLEKERNEL_DEBUG_LOG From 9f1f59c680953eb3b8c0e9ae3b070dde30c58c15 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 28 Mar 2025 11:35:14 +0800 Subject: [PATCH 182/232] feat: riscv64 elf on smp Signed-off-by: Zone.N --- .pre-commit-config.yaml | 28 +++++++++++------------ CMakePresets.json | 2 +- src/kernel/arch/riscv64/arch_main.cpp | 17 ++++---------- src/kernel/arch/riscv64/backtrace.cpp | 14 ++++++++++-- src/kernel/arch/riscv64/boot.S | 7 ++++-- src/kernel/include/basic_info.hpp | 2 ++ src/kernel/include/kernel_fdt.hpp | 33 ++++++++++++++++++++------- src/kernel/include/per_cpu.hpp | 13 ++++------- src/kernel/include/spinlock.hpp | 4 +--- src/kernel/main.cpp | 6 ++--- 10 files changed, 71 insertions(+), 55 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2a40b75d7..b49887a36 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=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + - -extra-arg=--std=c++2b + - --fix + - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/compiler_commands.json - # - -extra-arg=--std=c++2b - # - --fix - # - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* - # - id: clang-tidy - # args: - # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_x86_64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_x86_64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/aarch64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: # - --checks=.clang-tidy - # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/build_aarch64/compiler_commands.json + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/build_aarch64/compiler_commands.json # - -extra-arg=--std=c++2b # - --fix - # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/).* - # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_aarch64/src/arch/x86_64).* + # - --header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/riscv64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64).* - repo: https://github.com/koalaman/shellcheck-precommit rev: v0.10.0 diff --git a/CMakePresets.json b/CMakePresets.json index df9b43eab..4040ab296 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -85,7 +85,7 @@ }, "QEMU_COMMON_FLAG": { "type": "STRING", - "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;1;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" + "value": "-nographic;-serial;stdio;-monitor;telnet::2333,server,nowait;-m;1024M;-smp;4;-netdev;user,id=net0,tftp=/srv/tftp;-device;e1000,netdev=net0" }, "BOOT_ELF_OUTPUT_NAME": { "type": "STRING", diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 43b51caee..845cfeead 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -44,21 +44,18 @@ BasicInfo::BasicInfo(int argc, const char **argv) { kernel_size = reinterpret_cast(end) - reinterpret_cast(__executable_start); elf_addr = kernel_addr; - elf_size = 0; + elf_size = kernel_size; fdt_addr = reinterpret_cast(argv); + + core_count = Singleton::GetInstance().GetCoreCount(); } void ArchInit(int argc, const char **argv) { - // 将 core id 保存到 tp 寄存器 - cpu_io::Tp::Write(argc); - GetCurrentCore().core_id_ = argc; - Singleton::GetInstance() = KernelFdt(reinterpret_cast(argv)); Singleton::GetInstance() = BasicInfo(argc, argv); - Singleton::GetInstance().core_count++; sk_std::cout << Singleton::GetInstance(); // 解析内核 elf 信息 @@ -86,13 +83,9 @@ void ArchInit(int argc, const char **argv) { auto ret = sbi_hart_start(i, reinterpret_cast(_boot), 0); if ((ret.error != SBI_SUCCESS) && (ret.error != SBI_ERR_ALREADY_AVAILABLE)) { - printf("hart %d start failed: %d\n", i, ret.error); + klog::Warn("hart %d start failed: %d\n", i, ret.error); } } } -void ArchInitSMP(int argc, const char **) { - cpu_io::Tp::Write(argc); - GetCurrentCore().core_id_ = argc; - Singleton::GetInstance().core_count++; -} +void ArchInitSMP(int, const char **) {} diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index 98d60e5f7..d34cb1d38 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -22,6 +22,7 @@ #include #include "arch.h" +#include "basic_info.hpp" #include "kernel_elf.hpp" #include "kernel_log.hpp" #include "singleton.hpp" @@ -31,11 +32,20 @@ __always_inline auto backtrace(std::array &buffer) auto *fp = reinterpret_cast(cpu_io::Fp::Read()); uint64_t ra = 0; - int count = 0; - while ((fp != nullptr) && (*fp != 0U) && count < buffer.max_size()) { + auto count = 0; + klog::Debug("__executable_start: 0x%lx, __etext: 0x%lx\n", __executable_start, + __etext); + klog::Debug("fp: 0x%lx, *fp: 0x%lx, *(fp-1): 0x%lx, *(fp-2): 0x%lx\n", fp, + *fp, *(fp - 1), *(fp - 2)); + while ((fp != nullptr) && (*fp != 0U) && + *(fp - 2) >= reinterpret_cast(__executable_start) && + *(fp - 2) <= reinterpret_cast(__etext) && + count < buffer.max_size()) { ra = *(fp - 1); fp = reinterpret_cast(*(fp - 2)); buffer[count++] = ra; + klog::Debug("fp: 0x%lx, *fp: 0x%lx, *(fp-1): 0x%lx, *(fp-2): 0x%lx\n", fp, + *fp, *(fp - 1), *(fp - 2)); } return count; } diff --git a/src/kernel/arch/riscv64/boot.S b/src/kernel/arch/riscv64/boot.S index 8b5dd3fa8..7d81488bf 100644 --- a/src/kernel/arch/riscv64/boot.S +++ b/src/kernel/arch/riscv64/boot.S @@ -54,7 +54,8 @@ multiboot_header_end: .extern __global_pointer$ #endif _boot: - + // Check if dtb address (a1) is zero + beqz a1, 2f #if USE_NO_RELAX == 0 /// @see riscv-abi.pdf#9.1.4 /// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/releases/tag/v1.0 @@ -67,12 +68,14 @@ _boot: .option pop #endif - // 按照每个 core 设置栈地址 +2: // 按照每个 core 设置栈地址 add t0, a0, 1 slli t0, t0, 12 la sp, stack_top add sp, sp, t0 + // 将 a0 的值写入 tp + mv tp, a0 // 保存 sbi 传递的参数 // 开辟栈空间 addi sp, sp, -8*2 diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index 80cfaf66b..cfe01dc52 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -28,6 +28,8 @@ /// @see http://wiki.osdev.org/Using_Linker_Script_Values /// 内核开始 extern "C" void *__executable_start[]; +/// 代码段结束 +extern "C" void *__etext[]; /// 内核结束 extern "C" void *end[]; /// 内核入口,在 boot.S 中定义 diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index ff56846aa..6772f71fd 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -55,21 +55,21 @@ class KernelFdt { uint32_t size_dt_struct; }; - FdtHeader *fdt_header; + FdtHeader *fdt_header_; /** * 构造函数 * @param fdt_addr fdt 地址 */ explicit KernelFdt(uint64_t header) - : fdt_header(reinterpret_cast(header)) { - if (fdt_header == nullptr) { + : fdt_header_(reinterpret_cast(header)) { + if (fdt_header_ == nullptr) { klog::Err("Fatal Error: Invalid fdt_addr.\n"); throw; } // 检查 fdt 头数据 - if (fdt_check_header(fdt_header) != 0) { + if (fdt_check_header(fdt_header_) != 0) { klog::Err("Invalid device tree blob\n"); throw; } @@ -85,6 +85,23 @@ class KernelFdt { ~KernelFdt() = default; /// @} + /** + * 获取 core 数量 + * @return core 数量 + */ + [[nodiscard]] auto GetCoreCount() const -> size_t { + size_t core_count = 0; + int offset = 0; + while (true) { + offset = fdt_node_offset_by_compatible(fdt_header_, offset, "riscv"); + if (offset < 0) { + break; + } + ++core_count; + } + return core_count; + } + /** * 获取内存信息 * @return 内存信息<地址,长度> @@ -96,14 +113,14 @@ class KernelFdt { int len = 0; // 找到 /memory 节点 - auto offset = fdt_path_offset(fdt_header, "/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_header, 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; @@ -133,7 +150,7 @@ class KernelFdt { "ns16550a"}; for (const auto &compatible : compatible_str) { - offset = fdt_node_offset_by_compatible(fdt_header, -1, compatible); + offset = fdt_node_offset_by_compatible(fdt_header_, -1, compatible); if (offset != -FDT_ERR_NOTFOUND) { break; } @@ -144,7 +161,7 @@ class KernelFdt { } // 获取 reg 属性 - const auto *prop = fdt_get_property(fdt_header, 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; diff --git a/src/kernel/include/per_cpu.hpp b/src/kernel/include/per_cpu.hpp index 175acddc7..dbe870aaf 100644 --- a/src/kernel/include/per_cpu.hpp +++ b/src/kernel/include/per_cpu.hpp @@ -34,18 +34,13 @@ class PerCpu { static constexpr size_t kMaxCoreCount = 4; /// 核心 ID - size_t core_id_; + const size_t core_id_; /// 中断嵌套深度 - ssize_t noff_; + ssize_t noff_{0}; /// 在进入调度线程前是否允许中断 - bool intr_enable_; + bool intr_enable_{false}; - PerCpu() { - core_id_ = SIZE_MAX; - noff_ = 0; - intr_enable_ = false; - } - // explicit PerCpu(size_t core_id) : core_id_(core_id) {} + PerCpu() : core_id_(cpu_io::GetCurrentCoreId()) {} /// @name 构造/析构函数 /// @{ diff --git a/src/kernel/include/spinlock.hpp b/src/kernel/include/spinlock.hpp index 6d37bac0e..9c0f429d8 100644 --- a/src/kernel/include/spinlock.hpp +++ b/src/kernel/include/spinlock.hpp @@ -59,7 +59,6 @@ class SpinLock { ; } - std::atomic_signal_fence(std::memory_order_acquire); std::atomic_thread_fence(std::memory_order_acquire); core_id_ = GetCurrentCoreId(); @@ -74,7 +73,6 @@ class SpinLock { } core_id_ = SIZE_MAX; - std::atomic_signal_fence(std::memory_order_release); std::atomic_thread_fence(std::memory_order_release); locked_.clear(std::memory_order_release); @@ -82,7 +80,7 @@ class SpinLock { RestoreInterruptsNested(); } - protected: + private: /// 自旋锁名称 const char *name_{"unnamed"}; /// 是否 lock diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index ec73e2405..3e0b9e278 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -26,19 +26,17 @@ /// 用于判断是否为启动核 namespace { -bool is_boot_core = false; /// 非启动核入口 auto main_smp(int argc, const char **argv) -> int { ArchInitSMP(argc, argv); - klog::Info("Hello SimpleKernel\n"); + klog::Info("Hello SimpleKernel SMP\n"); return 0; } } // namespace void _start(int argc, const char **argv) { - if (!is_boot_core) { - is_boot_core = true; + if (argv != nullptr) { CppInit(); main(argc, argv); CppDeInit(); From a19845a3623ab9fdac5677d4d0a76a40feed27f5 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Fri, 28 Mar 2025 13:24:08 +0800 Subject: [PATCH 183/232] feat: riscv64 elf on smp Signed-off-by: Zone.N --- .pre-commit-config.yaml | 2 +- CMakeLists.txt | 15 ++----------- cmake/3rd.cmake | 48 ++++++++++++++++++++--------------------- 3 files changed, 27 insertions(+), 38 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b49887a36..56e2efc32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - - id: cmake-lint + # - id: cmake-lint diff --git a/CMakeLists.txt b/CMakeLists.txt index 4516fc981..8888537f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,19 +46,8 @@ IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") LIST (APPEND QEMU_BOOT_FLAGS -bios ${u-boot_BINARY_DIR}/u-boot.rom) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt) - LIST ( - APPEND - QEMU_BOOT_FLAGS - -bios - # ${opensbi_BINARY_DIR}/platform/generic/firmware/fw_payload.elf - ${u-boot_BINARY_DIR}/spl/u-boot-spl.bin - -device - loader,file=${u-boot_BINARY_DIR}/u-boot.itb,addr=0x80200000 - # -kernel $ - # ${u-boot_BINARY_DIR}/spl/u-boot-spl-dtb.bin - # ${u-boot_BINARY_DIR}/u-boot - # -device loader,file=${u-boot_BINARY_DIR}/u-boot.itb,addr=0x80200000 - ) + LIST (APPEND QEMU_BOOT_FLAGS -bios ${u-boot_BINARY_DIR}/spl/u-boot-spl.bin + -device loader,file=${u-boot_BINARY_DIR}/u-boot.itb,addr=0x80200000) ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") LIST (APPEND QEMU_MACHINE_FLAGS -machine virt,secure=on,gic_version=3 -cpu cortex-a72) diff --git a/cmake/3rd.cmake b/cmake/3rd.cmake index e8fdd86c7..a8fe54865 100644 --- a/cmake/3rd.cmake +++ b/cmake/3rd.cmake @@ -153,6 +153,30 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "riscv64") ADD_SUBDIRECTORY (3rd/opensbi_interface) ENDIF() +# https://github.com/u-boot/u-boot.git +SET (u-boot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/u-boot) +SET (u-boot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/u-boot) +ADD_CUSTOM_TARGET ( + u-boot + COMMENT "build u-boot..." + # make 时编译 + ALL + DEPENDS $<$:opensbi> + WORKING_DIRECTORY ${u-boot_SOURCE_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} + COMMAND + make O=${u-boot_BINARY_DIR} + $<$:qemu_arm64_defconfig> + $<$:qemu-riscv64_spl_defconfig> + $<$:qemu-x86_64_defconfig> + -j${CMAKE_BUILD_PARALLEL_LEVEL} + COMMAND + make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} + $<$:OPENSBI=${opensbi_BINARY_DIR}/platform/generic/firmware/fw_dynamic.bin> + -j${CMAKE_BUILD_PARALLEL_LEVEL}) +SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES + ${u-boot_BINARY_DIR}) + IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") # https://github.com/OP-TEE/optee_os.git SET (optee_os_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/optee/optee_os) @@ -212,30 +236,6 @@ IF(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") ${arm-trusted-firmware_BINARY_DIR}) ENDIF() -# https://github.com/u-boot/u-boot.git -SET (u-boot_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/u-boot) -SET (u-boot_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/u-boot) -ADD_CUSTOM_TARGET ( - u-boot - COMMENT "build u-boot..." - # make 时编译 - ALL - DEPENDS $<$:opensbi> - WORKING_DIRECTORY ${u-boot_SOURCE_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${u-boot_BINARY_DIR} - COMMAND - make O=${u-boot_BINARY_DIR} - $<$:qemu_arm64_defconfig> - $<$:qemu-riscv64_spl_defconfig> - $<$:qemu-x86_64_defconfig> - -j${CMAKE_BUILD_PARALLEL_LEVEL} - COMMAND - make CROSS_COMPILE=${TOOLCHAIN_PREFIX} O=${u-boot_BINARY_DIR} - $<$:OPENSBI=${opensbi_BINARY_DIR}/platform/generic/firmware/fw_dynamic.bin> - -j${CMAKE_BUILD_PARALLEL_LEVEL}) -SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - ${u-boot_BINARY_DIR}) - # https://git.kernel.org/pub/scm/utils/dtc/dtc.git SET (dtc_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rd/dtc) SET (dtc_BINARY_DIR ${CMAKE_BINARY_DIR}/3rd/dtc) From 7673a13a843d63efb96689b89eaf3175e9411a27 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Mon, 31 Mar 2025 18:50:00 +0800 Subject: [PATCH 184/232] feat: working on aarch64 elf uboot Signed-off-by: Zone.N --- .pre-commit-config.yaml | 16 +- src/kernel/arch/aarch64/arch_main.cpp | 47 +++-- src/kernel/arch/aarch64/boot.S | 28 --- src/kernel/arch/riscv64/arch_main.cpp | 1 + src/kernel/arch/riscv64/boot.S | 28 --- src/kernel/include/basic_info.hpp | 1 + src/kernel/include/kernel_fdt.hpp | 16 +- src/kernel/libc/CMakeLists.txt | 18 +- src/kernel/libc/include/sk_ctype.h | 56 +++++ src/kernel/libc/include/sk_libc.h | 96 +++++++++ src/kernel/libc/sk_ctype.c | 68 ++++++ src/kernel/libc/sk_libc.c | 289 +++++++++++++++++++++++++- tools/aarch64_qemu_virt.its.in | 4 +- tools/riscv64_qemu_virt.its.in | 3 +- 14 files changed, 571 insertions(+), 100 deletions(-) create mode 100644 src/kernel/libc/include/sk_ctype.h create mode 100644 src/kernel/libc/sk_ctype.c diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 56e2efc32..c51f80b24 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,13 +22,13 @@ repos: - id: clang-format args: - --style=file - - id: clang-tidy - args: - - --checks=.clang-tidy - - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json - - -extra-arg=--std=c++2b - - --fix - - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* + # - id: clang-tidy + # args: + # - --checks=.clang-tidy + # - -p=/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/compiler_commands.json + # - -extra-arg=--std=c++2b + # - --fix + # - --header-filter=^(/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/).* # - --exclude-header-filter=^(?/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/x86_64|/Users/zhihongniu/Documents/github/MRNIU/SimpleKernel/build_riscv64/src/arch/aarch64).* # - id: clang-tidy # args: @@ -56,4 +56,4 @@ repos: rev: v0.6.13 hooks: - id: cmake-format - # - id: cmake-lint + - id: cmake-lint diff --git a/src/kernel/arch/aarch64/arch_main.cpp b/src/kernel/arch/aarch64/arch_main.cpp index d29736306..e0d39809c 100644 --- a/src/kernel/arch/aarch64/arch_main.cpp +++ b/src/kernel/arch/aarch64/arch_main.cpp @@ -23,10 +23,11 @@ #include "per_cpu.hpp" #include "pl011.h" #include "sk_cstdio" +#include "sk_libc.h" // printf_bare_metal 基本输出实现 namespace { -Pl011* pl011 = nullptr; +Pl011 *pl011 = nullptr; } extern "C" void _putchar(char character) { if (pl011) { @@ -34,7 +35,7 @@ extern "C" void _putchar(char character) { } } -BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) { +BasicInfo::BasicInfo(int argc, const char **argv) { (void)argc; (void)argv; @@ -46,28 +47,40 @@ BasicInfo::BasicInfo(uint32_t argc, const uint8_t* argv) { kernel_addr = reinterpret_cast(__executable_start); kernel_size = reinterpret_cast(end) - reinterpret_cast(__executable_start); - elf_addr = 0; - elf_size = 0; + elf_addr = kernel_addr; + elf_size = kernel_size; - fdt_addr = 0x40000000; + fdt_addr = strtoull(argv[2], nullptr, 16); + + core_count = Singleton::GetInstance().GetCoreCount(); } -void ArchInit(uint32_t argc, const uint8_t* argv) { +void ArchInit(int argc, const char **argv) { // 初始化 FPU cpu_io::SetupFpu(); - // Singleton::GetInstance() = KernelFdt(0x40000000); + static auto uart = Pl011(0x9000000); + pl011 = &uart; - // Singleton::GetInstance() = BasicInfo(argc, argv); - // Singleton::GetInstance().core_count++; + klog::Info("argc = %d\n", argc); + for (int i = 0; i < argc; i++) { + klog::Info("argv[%d] = [%s]\n", i, argv[i]); + } - // auto [serial_base, serial_size] = - // Singleton::GetInstance().GetSerial(); + Singleton::GetInstance() = + KernelFdt(strtoull(argv[2], nullptr, 16)); - static auto uart = Pl011(0x9000000); - pl011 = &uart; - klog::Info("argv 0x%p\n", argv); - // sk_std::cout << Singleton::GetInstance(); + klog::Info("Singleton::GetInstance().GetCoreCount(): %d\n", + Singleton::GetInstance().GetCoreCount()); + + Singleton::GetInstance() = BasicInfo(argc, argv); + + auto [serial_base, serial_size] = + Singleton::GetInstance().GetSerial(); + + sk_std::cout << Singleton::GetInstance(); + + klog::Info("serial_base: 0x%lx\n", serial_base); uart.PutChar('H'); uart.PutChar('e'); @@ -83,9 +96,7 @@ void ArchInit(uint32_t argc, const uint8_t* argv) { uart.PutChar('\n'); } -void ArchInitSMP(uint32_t argc, const uint8_t* argv) { +void ArchInitSMP(int argc, const char **argv) { (void)argc; (void)argv; - - Singleton::GetInstance().core_count++; } diff --git a/src/kernel/arch/aarch64/boot.S b/src/kernel/arch/aarch64/boot.S index 9e82e7fdf..d4bc79b6e 100644 --- a/src/kernel/arch/aarch64/boot.S +++ b/src/kernel/arch/aarch64/boot.S @@ -16,34 +16,6 @@ // clang-format off -#define ASM_FILE -#include "multiboot2.h" - -// multiboot2 文件头 -// 计算头长度 -.SET HEADER_LENGTH, multiboot_header_end - multiboot_header -// 计算校验和 -.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + HEADER_LENGTH) -// 8 字节对齐 -.align MULTIBOOT_HEADER_ALIGN -// 声明所属段 -.section .text.boot -multiboot_header: - // 魔数 - .long MULTIBOOT2_HEADER_MAGIC - // 架构 - .long MULTIBOOT2_ARCHITECTURE_I386 - // 头长度 - .long HEADER_LENGTH - // 校验和 - .long CHECKSUM - // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf - .short MULTIBOOT_HEADER_TAG_END - // 结束标记 - .short 0 - .long 8 -multiboot_header_end: - .section .text.boot .global _boot .type _boot, @function diff --git a/src/kernel/arch/riscv64/arch_main.cpp b/src/kernel/arch/riscv64/arch_main.cpp index 845cfeead..73e1622a8 100644 --- a/src/kernel/arch/riscv64/arch_main.cpp +++ b/src/kernel/arch/riscv64/arch_main.cpp @@ -44,6 +44,7 @@ BasicInfo::BasicInfo(int argc, const char **argv) { kernel_size = reinterpret_cast(end) - reinterpret_cast(__executable_start); elf_addr = kernel_addr; + /// @todo 这个大小会不会丢掉 elf 信息? elf_size = kernel_size; fdt_addr = reinterpret_cast(argv); diff --git a/src/kernel/arch/riscv64/boot.S b/src/kernel/arch/riscv64/boot.S index 7d81488bf..f4ba8f5a1 100644 --- a/src/kernel/arch/riscv64/boot.S +++ b/src/kernel/arch/riscv64/boot.S @@ -16,36 +16,8 @@ #include "macro.S" -#define ASM_FILE -#include "multiboot2.h" - // clang-format off -// multiboot2 文件头 -// 计算头长度 -.SET HEADER_LENGTH, multiboot_header_end - multiboot_header -// 计算校验和 -.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_ARCHITECTURE_I386 + HEADER_LENGTH) -// 8 字节对齐 -.align MULTIBOOT_HEADER_ALIGN -// 声明所属段 -//.section .text.boot -multiboot_header: - // 魔数 - .long MULTIBOOT2_HEADER_MAGIC - // 架构 - .long MULTIBOOT2_ARCHITECTURE_I386 - // 头长度 - .long HEADER_LENGTH - // 校验和 - .long CHECKSUM - // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf - .short MULTIBOOT_HEADER_TAG_END - // 结束标记 - .short 0 - .long 8 -multiboot_header_end: - .section .text.boot .global _boot .type _boot, @function diff --git a/src/kernel/include/basic_info.hpp b/src/kernel/include/basic_info.hpp index cfe01dc52..48308ea73 100644 --- a/src/kernel/include/basic_info.hpp +++ b/src/kernel/include/basic_info.hpp @@ -84,6 +84,7 @@ struct BasicInfo { klog::Info("elf_addr: 0x%X, size 0x%X\n", basic_info.elf_addr, basic_info.elf_size); klog::Info("fdt_addr: 0x%X\n", basic_info.fdt_addr); + klog::Info("core_count: %d\n", basic_info.core_count); return ostream; } }; diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index 6772f71fd..d8c6ba2e6 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -91,14 +91,24 @@ class KernelFdt { */ [[nodiscard]] auto GetCoreCount() const -> size_t { size_t core_count = 0; - int offset = 0; + auto offset = -1; + while (true) { - offset = fdt_node_offset_by_compatible(fdt_header_, offset, "riscv"); + offset = fdt_next_node(fdt_header_, offset, nullptr); if (offset < 0) { break; } - ++core_count; + + const auto *prop = + fdt_get_property(fdt_header_, offset, "device_type", nullptr); + if (prop != nullptr) { + const char *device_type = reinterpret_cast(prop->data); + if (strcmp(device_type, "cpu") == 0) { + ++core_count; + } + } } + return core_count; } diff --git a/src/kernel/libc/CMakeLists.txt b/src/kernel/libc/CMakeLists.txt index f6a5cc915..08321bb7c 100644 --- a/src/kernel/libc/CMakeLists.txt +++ b/src/kernel/libc/CMakeLists.txt @@ -1,17 +1,15 @@ - # This file is a part of Simple-XX/SimpleKernel # (https://github.com/Simple-XX/SimpleKernel). # # CMakeLists.txt for Simple-XX/SimpleKernel. -add_library(libc INTERFACE) +ADD_LIBRARY (libc INTERFACE) -target_include_directories(libc INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR}/include -) +TARGET_INCLUDE_DIRECTORIES (libc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_sources(libc INTERFACE - ${CMAKE_CURRENT_SOURCE_DIR}/sk_libc.c - ${CMAKE_CURRENT_SOURCE_DIR}/sk_string.c - ${CMAKE_CURRENT_SOURCE_DIR}/sk_stdio.c -) +TARGET_SOURCES ( + libc + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/sk_libc.c + ${CMAKE_CURRENT_SOURCE_DIR}/sk_string.c + ${CMAKE_CURRENT_SOURCE_DIR}/sk_stdio.c + ${CMAKE_CURRENT_SOURCE_DIR}/sk_ctype.c) diff --git a/src/kernel/libc/include/sk_ctype.h b/src/kernel/libc/include/sk_ctype.h new file mode 100644 index 000000000..0ffffd941 --- /dev/null +++ b/src/kernel/libc/include/sk_ctype.h @@ -0,0 +1,56 @@ +/** + * @file sk_ctype.h + * @brief sk_ctype 头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-07-15 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-07-15Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_SRC_KERNEL_LIBC_INCLUDE_SK_CTYPE_H_ +#define SIMPLEKERNEL_SRC_KERNEL_LIBC_INCLUDE_SK_CTYPE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// 检查字符是否为字母或数字 +int isalnum(int c); +// 检查字符是否为字母 +int isalpha(int c); +// 检查字符是否为空白字符(空格或制表符) +int isblank(int c); +// 检查字符是否为控制字符 +int iscntrl(int c); +// 检查字符是否为十进制数字(0-9) +int isdigit(int c); +// 检查字符是否为可打印字符(不包括空格) +int isgraph(int c); +// 检查字符是否为小写字母 +int islower(int c); +// 检查字符是否为可打印字符(包括空格) +int isprint(int c); +// 检查字符是否为标点符号 +int ispunct(int c); +// 检查字符是否为空白字符(空格、制表符、换行符等) +int isspace(int c); +// 检查字符是否为大写字母 +int isupper(int c); +// 检查字符是否为十六进制数字(0-9、a-f、A-F) +int isxdigit(int c); +// 将字符转换为小写 +int tolower(int c); +// 将字符转换为大写 +int toupper(int c); + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_SRC_KERNEL_LIBC_INCLUDE_SK_CTYPE_H_ */ diff --git a/src/kernel/libc/include/sk_libc.h b/src/kernel/libc/include/sk_libc.h index 12c22a19f..e51849e6e 100644 --- a/src/kernel/libc/include/sk_libc.h +++ b/src/kernel/libc/include/sk_libc.h @@ -17,4 +17,100 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_LIBC_INCLUDE_SK_LIBC_H_ #define SIMPLEKERNEL_SRC_KERNEL_LIBC_INCLUDE_SK_LIBC_H_ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief 将字符串转换为双精度浮点数 + * @param nptr 指向要转换的字符串的指针 + * @return 转换后的双精度浮点数 + */ +double atof(const char* nptr); + +/** + * @brief 将字符串转换为整数 + * @param nptr 指向要转换的字符串的指针 + * @return 转换后的整数值 + */ +int atoi(const char* nptr); + +/** + * @brief 将字符串转换为长整数 + * @param nptr 指向要转换的字符串的指针 + * @return 转换后的长整数值 + */ +long int atol(const char* nptr); + +/** + * @brief 将字符串转换为长长整数 + * @param nptr 指向要转换的字符串的指针 + * @return 转换后的长长整数值 + */ +long long int atoll(const char* nptr); + +/** + * @brief 将字符串转换为双精度浮点数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @return 转换后的双精度浮点数 + */ +double strtod(const char* nptr, char** endptr); + +/** + * @brief 将字符串转换为单精度浮点数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @return 转换后的单精度浮点数 + */ +float strtof(const char* nptr, char** endptr); + +/** + * @brief 将字符串转换为长双精度浮点数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @return 转换后的长双精度浮点数 + */ +long double strtold(const char* nptr, char** endptr); + +/** + * @brief 将字符串按指定进制转换为长整数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @param base 转换的进制(2-36,0表示自动检测) + * @return 转换后的长整数值 + */ +long int strtol(const char* nptr, char** endptr, int base); + +/** + * @brief 将字符串按指定进制转换为长长整数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @param base 转换的进制(2-36,0表示自动检测) + * @return 转换后的长长整数值 + */ +long long int strtoll(const char* nptr, char** endptr, int base); + +/** + * @brief 将字符串按指定进制转换为无符号长整数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @param base 转换的进制(2-36,0表示自动检测) + * @return 转换后的无符号长整数值 + */ +unsigned long int strtoul(const char* nptr, char** endptr, int base); + +/** + * @brief 将字符串按指定进制转换为无符号长长整数,并可以获取转换结束位置 + * @param nptr 指向要转换的字符串的指针 + * @param endptr 指向指针的指针,用于存储转换结束位置 + * @param base 转换的进制(2-36,0表示自动检测) + * @return 转换后的无符号长长整数值 + */ +unsigned long long int strtoull(const char* nptr, char** endptr, int base); + +#ifdef __cplusplus +} +#endif + #endif /* SIMPLEKERNEL_SRC_KERNEL_LIBC_INCLUDE_SK_LIBC_H_ */ diff --git a/src/kernel/libc/sk_ctype.c b/src/kernel/libc/sk_ctype.c new file mode 100644 index 000000000..36825bda8 --- /dev/null +++ b/src/kernel/libc/sk_ctype.c @@ -0,0 +1,68 @@ + +/** + * @file sk_ctype.c + * @brief sk_ctype 实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-07-15 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-07-15Zone.N (Zone.Niuzh@hotmail.com)创建文件 + *
+ */ + +#include "sk_ctype.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int isalnum(int c) { return (isalpha(c) || isdigit(c)); } + +int isalpha(int c) { return (islower(c) || isupper(c)); } + +int isblank(int c) { return (c == ' ' || c == '\t'); } + +int iscntrl(int c) { return ((c >= 0 && c <= 31) || c == 127); } + +int isdigit(int c) { return (c >= '0' && c <= '9'); } + +int isgraph(int c) { return (c >= 33 && c <= 126); } + +int islower(int c) { return (c >= 'a' && c <= 'z'); } + +int isprint(int c) { return (c >= 32 && c <= 126); } + +int ispunct(int c) { return (isgraph(c) && !isalnum(c)); } + +int isspace(int c) { + return (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || + c == '\v'); +} + +int isupper(int c) { return (c >= 'A' && c <= 'Z'); } + +int isxdigit(int c) { + return (isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); +} + +int tolower(int c) { + if (isupper(c)) { + return c + ('a' - 'A'); + } + return c; +} + +int toupper(int c) { + if (islower(c)) { + return c - ('a' - 'A'); + } + return c; +} + +#ifdef __cplusplus +} +#endif diff --git a/src/kernel/libc/sk_libc.c b/src/kernel/libc/sk_libc.c index bd7b92554..0ae5ef35c 100644 --- a/src/kernel/libc/sk_libc.c +++ b/src/kernel/libc/sk_libc.c @@ -16,13 +16,300 @@ #include "sk_libc.h" +#include +#include #include +#include "sk_ctype.h" + +#ifdef __cplusplus +extern "C" { +#endif + /// 栈保护 uint64_t __stack_chk_guard = 0x595E9FBD94FDA766; /// 栈保护检查失败后进入死循环 __attribute__((noreturn)) void __stack_chk_fail() { - while (1) + while (true) ; } + +int atoi(const char* nptr) { return (int)strtol(nptr, NULL, 10); } + +long int atol(const char* nptr) { return strtol(nptr, NULL, 10); } + +long long int atoll(const char* nptr) { return strtoll(nptr, NULL, 10); } + +long int strtol(const char* nptr, char** endptr, int base) { + unsigned long long int result = strtoull(nptr, endptr, base); + + // Check if result will fit in a long int + if (result > LONG_MAX) { + return LONG_MAX; + } + + return (long int)result; +} + +long long int strtoll(const char* nptr, char** endptr, int base) { + unsigned long long int result = strtoull(nptr, endptr, base); + + // Check if result will fit in a long long int + if (result > LLONG_MAX) { + return LLONG_MAX; + } + + return (long long int)result; +} + +unsigned long int strtoul(const char* nptr, char** endptr, int base) { + unsigned long long int result = strtoull(nptr, endptr, base); + + // Check if result will fit in an unsigned long + if (result > ULONG_MAX) { + return ULONG_MAX; + } + + return (unsigned long int)result; +} + +/** + * @brief Tables for efficient string-to-number conversions + * + * These tables store precomputed values to avoid expensive division operations + * during string-to-number conversions. + * + * - __strtol_ul_max_tab[base] = ULONG_MAX / base + * The largest value that can be multiplied by base without overflow + * + * - __strtol_ul_rem_tab[base] = ULONG_MAX % base + * The maximum digit value that can be added after multiplication + */ +static const unsigned long __strtol_ul_max_tab[37] = {[0] = 0, // Invalid base + [1] = 0, // Invalid base + [2] = ULONG_MAX / 2, + [3] = ULONG_MAX / 3, + [4] = ULONG_MAX / 4, + [5] = ULONG_MAX / 5, + [6] = ULONG_MAX / 6, + [7] = ULONG_MAX / 7, + [8] = ULONG_MAX / 8, + [9] = ULONG_MAX / 9, + [10] = ULONG_MAX / 10, + [11] = ULONG_MAX / 11, + [12] = ULONG_MAX / 12, + [13] = ULONG_MAX / 13, + [14] = ULONG_MAX / 14, + [15] = ULONG_MAX / 15, + [16] = ULONG_MAX / 16, + [17] = ULONG_MAX / 17, + [18] = ULONG_MAX / 18, + [19] = ULONG_MAX / 19, + [20] = ULONG_MAX / 20, + [21] = ULONG_MAX / 21, + [22] = ULONG_MAX / 22, + [23] = ULONG_MAX / 23, + [24] = ULONG_MAX / 24, + [25] = ULONG_MAX / 25, + [26] = ULONG_MAX / 26, + [27] = ULONG_MAX / 27, + [28] = ULONG_MAX / 28, + [29] = ULONG_MAX / 29, + [30] = ULONG_MAX / 30, + [31] = ULONG_MAX / 31, + [32] = ULONG_MAX / 32, + [33] = ULONG_MAX / 33, + [34] = ULONG_MAX / 34, + [35] = ULONG_MAX / 35, + [36] = ULONG_MAX / 36}; + +static const unsigned long __strtol_ul_rem_tab[37] = {[0] = 0, // Invalid base + [1] = 0, // Invalid base + [2] = ULONG_MAX % 2, + [3] = ULONG_MAX % 3, + [4] = ULONG_MAX % 4, + [5] = ULONG_MAX % 5, + [6] = ULONG_MAX % 6, + [7] = ULONG_MAX % 7, + [8] = ULONG_MAX % 8, + [9] = ULONG_MAX % 9, + [10] = ULONG_MAX % 10, + [11] = ULONG_MAX % 11, + [12] = ULONG_MAX % 12, + [13] = ULONG_MAX % 13, + [14] = ULONG_MAX % 14, + [15] = ULONG_MAX % 15, + [16] = ULONG_MAX % 16, + [17] = ULONG_MAX % 17, + [18] = ULONG_MAX % 18, + [19] = ULONG_MAX % 19, + [20] = ULONG_MAX % 20, + [21] = ULONG_MAX % 21, + [22] = ULONG_MAX % 22, + [23] = ULONG_MAX % 23, + [24] = ULONG_MAX % 24, + [25] = ULONG_MAX % 25, + [26] = ULONG_MAX % 26, + [27] = ULONG_MAX % 27, + [28] = ULONG_MAX % 28, + [29] = ULONG_MAX % 29, + [30] = ULONG_MAX % 30, + [31] = ULONG_MAX % 31, + [32] = ULONG_MAX % 32, + [33] = ULONG_MAX % 33, + [34] = ULONG_MAX % 34, + [35] = ULONG_MAX % 35, + [36] = ULONG_MAX % 36}; + +unsigned long long int strtoull(const char* nptr, char** endptr, int base) { + int negative; + unsigned long long int cutoff; + unsigned int cutlim; + unsigned long long int i; + const char* s; + unsigned char c; + const char* save; + const char* end; + int overflow; + + if (base < 0 || base == 1 || base > 36) { + return 0; + } + + save = s = nptr; + + /* Skip white space. */ + while (isspace(*s) != 0) { + ++s; + } + if ((*s == ('\0'))) { + goto noconv; + } + + /* Check for a sign. */ + negative = 0; + if (*s == ('-')) { + negative = 1; + ++s; + } else if (*s == ('+')) { + ++s; + } + + /* Recognize number prefix and if BASE is zero, figure it out ourselves. */ + if (*s == ('0')) { + if ((base == 0 || base == 16) && toupper(s[1]) == ('X')) { + s += 2; + base = 16; + } else if (base == 0) { + base = 8; + } + } else if (base == 0) { + base = 10; + } + + /* Save the pointer so we can check later if anything happened. */ + save = s; + end = NULL; + + /* Avoid runtime division; lookup cutoff and limit. */ + cutoff = __strtol_ul_max_tab[base - 2]; + cutlim = __strtol_ul_rem_tab[base - 2]; + + overflow = 0; + i = 0; + c = *s; + if (sizeof(long int) != sizeof(long long int)) { + unsigned long int j = 0; + unsigned long int jmax = __strtol_ul_max_tab[base - 2]; + + for (; c != ('\0'); c = *++s) { + if (s == end) { + break; + } + if (c >= ('0') && c <= ('9')) { + c -= ('0'); + } else if (isalpha(c) != 0) { + c = toupper(c) - ('A') + 10; + } else { + break; + } + if ((int)c >= base) { + break; + } + /* Note that we never can have an overflow. */ + else if (j >= jmax) { + /* We have an overflow. Now use the long representation. */ + i = (unsigned long long int)j; + goto use_long; + } else { + j = j * (unsigned long int)base + c; + } + } + + i = (unsigned long long int)j; + } else + for (; c != ('\0'); c = *++s) { + if (s == end) { + break; + } + if (c >= ('0') && c <= ('9')) { + c -= ('0'); + } else if (isalpha(c) != 0) { + c = toupper(c) - ('A') + 10; + } else { + break; + } + if ((int)c >= base) { + break; + } + /* Check for overflow. */ + if (i > cutoff || (i == cutoff && c > cutlim)) { + overflow = 1; + } else { + use_long: + i *= (unsigned long long int)base; + i += c; + } + } + + /* Check if anything actually happened. */ + if (s == save) { + goto noconv; + } + + /* Store in ENDPTR the address of one character + past the last character we converted. */ + if (endptr != NULL) { + *endptr = (char*)s; + } + + if (overflow != 0) { + return ULLONG_MAX; + } + + /* Return the result of the appropriate sign. */ + return negative ? -i : i; + +noconv: + /* We must handle a special case here: the base is 0 or 16 and the + first two characters are '0' and 'x', but the rest are no + hexadecimal digits. Likewise when the base is 0 or 2 and the + first two characters are '0' and 'b', but the rest are no binary + digits. This is no error case. We return 0 and ENDPTR points to + the 'x' or 'b'. */ + if (endptr != NULL) { + if (save - nptr >= 2 && (toupper(save[-1]) == ('X')) && save[-2] == ('0')) { + *endptr = (char*)&save[-1]; + } else { + /* There was no number to convert. */ + *endptr = (char*)nptr; + } + } + + return 0L; +} + +#ifdef __cplusplus +} +#endif diff --git a/tools/aarch64_qemu_virt.its.in b/tools/aarch64_qemu_virt.its.in index 66f531068..c69031aec 100644 --- a/tools/aarch64_qemu_virt.its.in +++ b/tools/aarch64_qemu_virt.its.in @@ -1,12 +1,12 @@ /dts-v1/; / { - description = "U-Boot FIT Image"; + description = "SimpleKernel AARCH64 U-Boot FIT Image"; #address-cells = <1>; images { kernel { - description = "Linux Kernel"; + description = "SimpleKernel"; // 内核路径 data = /incbin/("@CMAKE_BINARY_DIR@/bin/kernel.elf"); type = "kernel"; diff --git a/tools/riscv64_qemu_virt.its.in b/tools/riscv64_qemu_virt.its.in index 502fa5140..ae1394e17 100644 --- a/tools/riscv64_qemu_virt.its.in +++ b/tools/riscv64_qemu_virt.its.in @@ -1,7 +1,7 @@ /dts-v1/; / { - description = "SimpleKernel U-Boot FIT Image"; + description = "SimpleKernel RISCV64 U-Boot FIT Image"; #address-cells = <1>; images { @@ -31,7 +31,6 @@ type = "flat_dt"; arch = "riscv"; compression = "none"; - load = <0x80400000>; hash-1 { algo = "sha1"; }; From 16477d7aefac76f4f548fb9f88f07686e538fa30 Mon Sep 17 00:00:00 2001 From: "Zone.N" Date: Thu, 3 Apr 2025 10:54:38 +0800 Subject: [PATCH 185/232] perf: upload log Signed-off-by: Zone.N --- src/kernel/arch/riscv64/backtrace.cpp | 4 +- src/kernel/include/kernel_fdt.hpp | 9 +- src/kernel/include/kernel_log.hpp | 162 ++++++++++++++++---------- src/project_config.h | 2 +- tools/project_config.h.in | 2 +- 5 files changed, 114 insertions(+), 65 deletions(-) diff --git a/src/kernel/arch/riscv64/backtrace.cpp b/src/kernel/arch/riscv64/backtrace.cpp index d34cb1d38..a015ba1f6 100644 --- a/src/kernel/arch/riscv64/backtrace.cpp +++ b/src/kernel/arch/riscv64/backtrace.cpp @@ -32,7 +32,7 @@ __always_inline auto backtrace(std::array &buffer) auto *fp = reinterpret_cast(cpu_io::Fp::Read()); uint64_t ra = 0; - auto count = 0; + size_t count = 0; klog::Debug("__executable_start: 0x%lx, __etext: 0x%lx\n", __executable_start, __etext); klog::Debug("fp: 0x%lx, *fp: 0x%lx, *(fp-1): 0x%lx, *(fp-2): 0x%lx\n", fp, @@ -47,7 +47,7 @@ __always_inline auto backtrace(std::array &buffer) klog::Debug("fp: 0x%lx, *fp: 0x%lx, *(fp-1): 0x%lx, *(fp-2): 0x%lx\n", fp, *fp, *(fp - 1), *(fp - 2)); } - return count; + return int(count); } void DumpStack() { diff --git a/src/kernel/include/kernel_fdt.hpp b/src/kernel/include/kernel_fdt.hpp index d8c6ba2e6..b9bfbdd0b 100644 --- a/src/kernel/include/kernel_fdt.hpp +++ b/src/kernel/include/kernel_fdt.hpp @@ -70,9 +70,14 @@ class KernelFdt { // 检查 fdt 头数据 if (fdt_check_header(fdt_header_) != 0) { - klog::Err("Invalid device tree blob\n"); + klog::Err("Invalid device tree blob [0x%p]\n", fdt_header_); + klog::Debug("fdt_header_->magic 0x%X\n", fdt_header_->magic); + klog::DebugBlob(fdt_header_, 32); throw; } + + klog::Debug("Load dtb at [0x%X], size [0x%X]\n", fdt_header_, + fdt_header_->totalsize); } /// @name 构造/析构函数 @@ -156,7 +161,7 @@ class KernelFdt { int len = 0; int offset = 0; - std::array compatible_str = {"arm,pl011\0arm,primecell", + std::array compatible_str = {"arm,pl011", "arm,primecell", "ns16550a"}; for (const auto &compatible : compatible_str) { diff --git a/src/kernel/include/kernel_log.hpp b/src/kernel/include/kernel_log.hpp index 037fdfda0..bf50572ef 100644 --- a/src/kernel/include/kernel_log.hpp +++ b/src/kernel/include/kernel_log.hpp @@ -17,8 +17,10 @@ #ifndef SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_LOG_HPP_ #define SIMPLEKERNEL_SRC_KERNEL_INCLUDE_KERNEL_LOG_HPP_ +#include #include #include +#include #include "../../project_config.h" #include "singleton.hpp" @@ -27,19 +29,19 @@ #include "spinlock.hpp" namespace klog { -namespace logger { +namespace detail { /// ANSI 转义码,在支持 ANSI 转义码的终端中可以显示颜色 -constexpr const auto kReset = "\033[0m"; -constexpr const auto kRed = "\033[31m"; -constexpr const auto kGreen = "\033[32m"; -constexpr const auto kYellow = "\033[33m"; -constexpr const auto kBlue = "\033[34m"; -constexpr const auto kMagenta = "\033[35m"; -constexpr const auto kCyan = "\033[36m"; -constexpr const auto kWhite = "\033[37m"; - -template +static constexpr const auto kReset = "\033[0m"; +static constexpr const auto kRed = "\033[31m"; +static constexpr const auto kGreen = "\033[32m"; +static constexpr const auto kYellow = "\033[33m"; +static constexpr const auto kBlue = "\033[34m"; +static constexpr const auto kMagenta = "\033[35m"; +static constexpr const auto kCyan = "\033[36m"; +static constexpr const auto kWhite = "\033[37m"; + +template