SimpleKernel 1.17.0
Loading...
Searching...
No Matches
arch_main.cpp
Go to the documentation of this file.
1
5#include <cpu_io.h>
6#include <opensbi_interface.h>
7
8#include <cstring>
9
10#include "arch.h"
11#include "basic_info.hpp"
12#include "kernel.h"
13#include "kernel_elf.hpp"
14#include "kernel_fdt.hpp"
15#include "kernel_log.hpp"
16#include "kstd_cstdio"
17#include "per_cpu.hpp"
18#include "sk_stdlib.h"
19#include "virtual_memory.hpp"
20
21BasicInfo::BasicInfo(int, const char** argv) {
22 KernelFdtSingleton::instance()
23 .GetMemory()
24 .and_then([this](std::pair<uint64_t, size_t> mem) -> Expected<void> {
25 physical_memory_addr = mem.first;
26 physical_memory_size = mem.second;
27 return {};
28 })
29 .or_else([](Error err) -> Expected<void> {
30 klog::Err("Failed to get memory info: {}", err.message());
31 while (true) {
33 }
34 return {};
35 });
36
37 kernel_addr = reinterpret_cast<uint64_t>(__executable_start);
38 kernel_size = reinterpret_cast<uint64_t>(end) -
39 reinterpret_cast<uint64_t>(__executable_start);
41
42 fdt_addr = reinterpret_cast<uint64_t>(argv);
43
44 core_count = KernelFdtSingleton::instance().GetCoreCount().value_or(1);
45
46 interval = KernelFdtSingleton::instance().GetTimebaseFrequency().value_or(0);
47}
48
49auto ArchInit(int argc, const char** argv) -> void {
50 KernelFdtSingleton::create(reinterpret_cast<uint64_t>(argv));
51
52 BasicInfoSingleton::create(argc, argv);
53
54 // 解析内核 elf 信息
55 KernelElfSingleton::create(BasicInfoSingleton::instance().elf_addr);
56
57 klog::Info("Hello riscv64 ArchInit");
58}
59
60auto ArchInitSMP(int, const char**) -> void {}
61
62auto WakeUpOtherCores() -> void {
63 for (size_t i = 0; i < BasicInfoSingleton::instance().core_count; i++) {
64 auto ret = sbi_hart_start(i, reinterpret_cast<uint64_t>(_boot), 0);
65 if ((ret.error != SBI_SUCCESS) &&
66 (ret.error != SBI_ERR_ALREADY_AVAILABLE)) {
67 klog::Warn("hart {} start failed: {}", i, ret.error);
68 }
69 }
70}
71
73 void (*entry)(void*), void* arg, uint64_t stack_top)
74 -> void {
75 // 清零上下文
76 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
77
78 task_context->ReturnAddress() =
79 reinterpret_cast<uint64_t>(kernel_thread_entry);
80 task_context->EntryFunction() = reinterpret_cast<uint64_t>(entry);
81 task_context->EntryArgument() = reinterpret_cast<uint64_t>(arg);
82 task_context->StackPointer() = stack_top;
83}
84
86 cpu_io::TrapContext* trap_context_ptr, uint64_t stack_top)
87 -> void {
88 // 清零上下文
89 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
90
91 task_context->ReturnAddress() =
92 reinterpret_cast<uint64_t>(kernel_thread_entry);
93 task_context->EntryFunction() = reinterpret_cast<uint64_t>(trap_return);
94 task_context->EntryArgument() = reinterpret_cast<uint64_t>(trap_context_ptr);
95 task_context->StackPointer() = stack_top;
96}
auto WakeUpOtherCores() -> void
唤醒其余 core
Definition arch_main.cpp:68
auto InitTaskContext(cpu_io::CalleeSavedContext *task_context, void(*entry)(void *), void *arg, uint64_t stack_top) -> void
初始化内核线程的任务上下文(重载1)
Definition arch_main.cpp:77
auto ArchInit(int argc, const char **argv) -> void
体系结构相关初始化
Definition arch_main.cpp:48
auto ArchInitSMP(int argc, const char **argv) -> void
从核的体系结构相关初始化
Definition arch_main.cpp:65
auto kernel_thread_entry() -> void
Definition arch.cpp:44
auto trap_return(void *) -> void
Definition arch.cpp:45
void _boot()
内核入口,在 boot.S 中定义
void * end[]
内核结束
void * __executable_start[]
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
void Pause()
Definition cpu_io.h:20
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
auto Warn(etl::format_string< Args... > fmt, Args &&... args) -> void
以 WARN 级别记录日志
size_t core_count
cpu 核数
uint64_t fdt_addr
fdt 地址
uint64_t physical_memory_addr
physical_memory 地址
size_t interval
时钟频率
uint64_t kernel_addr
kernel 地址
size_t physical_memory_size
physical_memory 大小
BasicInfo()=default
uint64_t elf_addr
elf 地址
size_t kernel_size
kernel 大小
错误类型,用于 std::expected
Definition expected.hpp:343
constexpr auto message() const -> const char *
Definition expected.hpp:358
__always_inline uint64_t & EntryFunction()
Definition cpu_io.h:208
__always_inline uint64_t & EntryArgument()
Definition cpu_io.h:209
__always_inline uint64_t & ReturnAddress()
Definition cpu_io.h:207
__always_inline uint64_t & StackPointer()
Definition cpu_io.h:210