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
7#include <cstring>
8
9#include "arch.h"
10#include "basic_info.hpp"
11#include "interrupt.h"
12#include "kernel.h"
13#include "kernel_elf.hpp"
14#include "kernel_fdt.hpp"
15#include "kstd_cstdio"
16#include "per_cpu.hpp"
17#include "sk_stdlib.h"
18#include "virtual_memory.hpp"
19
20BasicInfo::BasicInfo(int, const char** argv) {
21 KernelFdtSingleton::instance()
22 .GetMemory()
23 .and_then([this](std::pair<uint64_t, size_t> mem) -> Expected<void> {
24 physical_memory_addr = mem.first;
25 physical_memory_size = mem.second;
26 return {};
27 })
28 .or_else([](Error err) -> Expected<void> {
29 klog::Err("Failed to get memory info: {}", err.message());
30 while (true) {
32 }
33 return {};
34 });
35
36 kernel_addr = reinterpret_cast<uint64_t>(__executable_start);
37 kernel_size = reinterpret_cast<uint64_t>(end) -
38 reinterpret_cast<uint64_t>(__executable_start);
40
41 fdt_addr = strtoull(argv[2], nullptr, 16);
42
43 core_count = KernelFdtSingleton::instance().GetCoreCount().value_or(1);
44
45 interval = cpu_io::CNTFRQ_EL0::Read();
46}
47
48auto ArchInit(int argc, const char** argv) -> void {
49 KernelFdtSingleton::create(strtoull(argv[2], nullptr, 16));
50
51 BasicInfoSingleton::create(argc, argv);
52
53 // 解析内核 elf 信息
54 KernelElfSingleton::create(BasicInfoSingleton::instance().elf_addr);
55
56 KernelFdtSingleton::instance().CheckPSCI().or_else(
57 [](Error err) -> Expected<void> {
58 klog::Err("CheckPSCI failed: {}", err.message());
59 return {};
60 });
61
62 klog::Info("Hello aarch64 ArchInit");
63}
64
65auto ArchInitSMP([[maybe_unused]] int argc, [[maybe_unused]] const char** argv)
66 -> void {}
67
68auto WakeUpOtherCores() -> void {
69 for (size_t i = 0; i < BasicInfoSingleton::instance().core_count; i++) {
70 auto ret = cpu_io::psci::CpuOn(i, reinterpret_cast<uint64_t>(_boot), 0);
71 if ((ret != cpu_io::psci::SUCCESS) && (ret != cpu_io::psci::ALREADY_ON)) {
72 klog::Warn("hart {} start failed: {}", i, ret);
73 }
74 }
75}
76
78 void (*entry)(void*), void* arg, uint64_t stack_top)
79 -> void {
80 // 清零上下文
81 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
82
83 task_context->ReturnAddress() =
84 reinterpret_cast<uint64_t>(kernel_thread_entry);
85 task_context->EntryFunction() = reinterpret_cast<uint64_t>(entry);
86 task_context->EntryArgument() = reinterpret_cast<uint64_t>(arg);
87 task_context->StackPointer() = stack_top;
88}
89
91 cpu_io::TrapContext* trap_context_ptr, uint64_t stack_top)
92 -> void {
93 // 清零上下文
94 std::memset(task_context, 0, sizeof(cpu_io::CalleeSavedContext));
95
96 task_context->ReturnAddress() =
97 reinterpret_cast<uint64_t>(kernel_thread_entry);
98 task_context->EntryFunction() = reinterpret_cast<uint64_t>(trap_return);
99 task_context->EntryArgument() = reinterpret_cast<uint64_t>(trap_context_ptr);
100 task_context->StackPointer() = stack_top;
101}
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 级别记录日志
#define strtoull
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