Skip to content

Commit 26bc56c

Browse files
committed
feat: WakeUpOtherCores
Signed-off-by: Niu Zhihong <zhihong@nzhnb.com>
1 parent e1bcfc8 commit 26bc56c

File tree

8 files changed

+50
-39
lines changed

8 files changed

+50
-39
lines changed

3rd/u-boot

Submodule u-boot updated 2230 files

src/arch/aarch64/arch_main.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@
1616

1717
// 基本输出实现
1818
namespace {
19-
Pl011 *pl011 = nullptr;
19+
Pl011* pl011 = nullptr;
2020
}
21-
extern "C" void sk_putchar(int c, [[maybe_unused]] void *ctx) {
21+
extern "C" void sk_putchar(int c, [[maybe_unused]] void* ctx) {
2222
if (pl011) {
2323
pl011->PutChar(c);
2424
}
2525
}
2626

27-
BasicInfo::BasicInfo(int argc, const char **argv) {
27+
BasicInfo::BasicInfo(int argc, const char** argv) {
2828
(void)argc;
2929
(void)argv;
3030

@@ -44,7 +44,7 @@ BasicInfo::BasicInfo(int argc, const char **argv) {
4444
core_count = Singleton<KernelFdt>::GetInstance().GetCoreCount();
4545
}
4646

47-
void ArchInit(int argc, const char **argv) {
47+
void ArchInit(int argc, const char** argv) {
4848
Singleton<KernelFdt>::GetInstance() =
4949
KernelFdt(strtoull(argv[2], nullptr, 16));
5050

@@ -65,14 +65,15 @@ void ArchInit(int argc, const char **argv) {
6565
Singleton<KernelFdt>::GetInstance().CheckPSCI();
6666

6767
klog::Info("Hello aarch64 ArchInit\n");
68+
}
69+
70+
void ArchInitSMP(int, const char**) {}
6871

69-
// 唤醒其余 core
72+
void WakeUpOtherCores() {
7073
for (size_t i = 0; i < Singleton<BasicInfo>::GetInstance().core_count; i++) {
7174
auto ret = cpu_io::psci::CpuOn(i, reinterpret_cast<uint64_t>(_boot), 0);
7275
if ((ret != cpu_io::psci::SUCCESS) && (ret != cpu_io::psci::ALREADY_ON)) {
7376
klog::Warn("hart %d start failed: %d\n", i, ret);
7477
}
7578
}
7679
}
77-
78-
void ArchInitSMP(int, const char **) {}

src/arch/arch.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
void ArchInit(int argc, const char **argv);
2020
void ArchInitSMP(int argc, const char **argv);
2121

22+
/**
23+
* 唤醒其余 core
24+
*/
25+
void WakeUpOtherCores();
26+
2227
/// 最多回溯 128 层调用栈
2328
static constexpr const size_t kMaxFrameCount = 128;
2429

src/arch/riscv64/arch_main.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
namespace {
2222

2323
struct BmallocLogger {
24-
int operator()(const char *format, ...) const {
24+
int operator()(const char* format, ...) const {
2525
va_list args;
2626
va_start(args, format);
2727
char buffer[1024];
@@ -35,11 +35,11 @@ struct BmallocLogger {
3535
} // namespace
3636

3737
// 基本输出实现
38-
extern "C" void sk_putchar(int c, [[maybe_unused]] void *ctx) {
38+
extern "C" void sk_putchar(int c, [[maybe_unused]] void* ctx) {
3939
sbi_debug_console_write_byte(c);
4040
}
4141

42-
BasicInfo::BasicInfo(int, const char **argv) {
42+
BasicInfo::BasicInfo(int, const char** argv) {
4343
auto [memory_base, memory_size] =
4444
Singleton<KernelFdt>::GetInstance().GetMemory();
4545
physical_memory_addr = memory_base;
@@ -56,7 +56,7 @@ BasicInfo::BasicInfo(int, const char **argv) {
5656
core_count = Singleton<KernelFdt>::GetInstance().GetCoreCount();
5757
}
5858

59-
void ArchInit(int argc, const char **argv) {
59+
void ArchInit(int argc, const char** argv) {
6060
Singleton<KernelFdt>::GetInstance() =
6161
KernelFdt(reinterpret_cast<uint64_t>(argv));
6262

@@ -67,7 +67,7 @@ void ArchInit(int argc, const char **argv) {
6767
Singleton<KernelElf>::GetInstance() =
6868
KernelElf(Singleton<BasicInfo>::GetInstance().elf_addr);
6969

70-
void *allocator_addr = reinterpret_cast<void *>(
70+
void* allocator_addr = reinterpret_cast<void*>(
7171
(reinterpret_cast<uintptr_t>(end) + 4095) & ~4095);
7272
size_t allocator_size =
7373
Singleton<BasicInfo>::GetInstance().physical_memory_size -
@@ -83,10 +83,10 @@ void ArchInit(int argc, const char **argv) {
8383
128, 256, 512, 1024, 2048, 4096};
8484

8585
for (size_t size : sizes) {
86-
void *ptr = allocator.malloc(size);
86+
void* ptr = allocator.malloc(size);
8787
if (ptr != nullptr) {
8888
// 写入边界位置
89-
char *bytes = static_cast<char *>(ptr);
89+
char* bytes = static_cast<char*>(ptr);
9090
bytes[0] = 0xAA;
9191
bytes[size - 1] = 0xBB;
9292

@@ -103,8 +103,11 @@ void ArchInit(int argc, const char **argv) {
103103
}
104104

105105
klog::Info("Hello riscv64 ArchInit\n");
106+
}
107+
108+
void ArchInitSMP(int, const char**) {}
106109

107-
// 唤醒其余 core
110+
void WakeUpOtherCores() {
108111
for (size_t i = 0; i < Singleton<BasicInfo>::GetInstance().core_count; i++) {
109112
auto ret = sbi_hart_start(i, reinterpret_cast<uint64_t>(_boot), 0);
110113
if ((ret.error != SBI_SUCCESS) &&
@@ -113,5 +116,3 @@ void ArchInit(int argc, const char **argv) {
113116
}
114117
}
115118
}
116-
117-
void ArchInitSMP(int, const char **) {}

src/arch/x86_64/arch_main.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
// 基本输出实现
2020
namespace {
21-
cpu_io::Serial *serial = nullptr;
21+
cpu_io::Serial* serial = nullptr;
2222

2323
/// gdt 描述符表,顺序与 cpu_io::detail::register_info::GdtrInfo 中的定义一致
2424
std::array<cpu_io::detail::register_info::GdtrInfo::SegmentDescriptor,
@@ -121,13 +121,13 @@ void SetupGdtAndSegmentRegisters() {
121121

122122
} // namespace
123123

124-
extern "C" void sk_putchar(int c, [[maybe_unused]] void *ctx) {
124+
extern "C" void sk_putchar(int c, [[maybe_unused]] void* ctx) {
125125
if (serial) {
126126
serial->Write(c);
127127
}
128128
}
129129

130-
BasicInfo::BasicInfo(int, const char **) {
130+
BasicInfo::BasicInfo(int, const char**) {
131131
physical_memory_addr = 0;
132132
physical_memory_size = 0;
133133

@@ -143,7 +143,7 @@ BasicInfo::BasicInfo(int, const char **) {
143143
core_count = cpu_io::cpuid::GetLogicalProcessorCount();
144144
}
145145

146-
auto ArchInit(int, const char **) -> int {
146+
auto ArchInit(int, const char**) -> int {
147147
Singleton<cpu_io::Serial>::GetInstance() = cpu_io::Serial(cpu_io::kCom1);
148148
serial = &Singleton<cpu_io::Serial>::GetInstance();
149149

@@ -165,24 +165,25 @@ auto ArchInit(int, const char **) -> int {
165165

166166
klog::Info("Hello x86_64 ArchInit\n");
167167

168-
// 填充 sipi_params 结构体
169-
auto target_sipi_params = reinterpret_cast<sipi_params_t *>(sipi_params);
170-
target_sipi_params->cr3 = cpu_io::Cr3::Read();
171-
172-
// 唤醒其它 core
173-
Singleton<Apic>::GetInstance().StartupAllAps(
174-
reinterpret_cast<uint64_t>(ap_start16),
175-
reinterpret_cast<size_t>(ap_start64_end) -
176-
reinterpret_cast<size_t>(ap_start16),
177-
kDefaultAPBase);
178-
179168
return 0;
180169
}
181170

182-
auto ArchInitSMP(int, const char **) -> int {
171+
auto ArchInitSMP(int, const char**) -> int {
183172
// 设置 GDT 和段寄存器
184173
SetupGdtAndSegmentRegisters();
185174

186175
Singleton<Apic>::GetInstance().InitCurrentCpuLocalApic();
187176
return 0;
188177
}
178+
179+
void WakeUpOtherCores() {
180+
// 填充 sipi_params 结构体
181+
auto target_sipi_params = reinterpret_cast<sipi_params_t*>(sipi_params);
182+
target_sipi_params->cr3 = cpu_io::Cr3::Read();
183+
184+
Singleton<Apic>::GetInstance().StartupAllAps(
185+
reinterpret_cast<uint64_t>(ap_start16),
186+
reinterpret_cast<size_t>(ap_start64_end) -
187+
reinterpret_cast<size_t>(ap_start16),
188+
kDefaultAPBase);
189+
}

src/main.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@
1616
namespace {
1717

1818
/// 非启动核入口
19-
auto main_smp(int argc, const char **argv) -> int {
19+
auto main_smp(int argc, const char** argv) -> int {
2020
ArchInitSMP(argc, argv);
2121
klog::Info("Hello SimpleKernel SMP\n");
2222
return 0;
2323
}
2424

2525
} // namespace
2626

27-
void _start(int argc, const char **argv) {
27+
void _start(int argc, const char** argv) {
2828
if (argv != nullptr) {
2929
CppInit();
3030
main(argc, argv);
@@ -39,10 +39,13 @@ void _start(int argc, const char **argv) {
3939
}
4040
}
4141

42-
auto main(int argc, const char **argv) -> int {
42+
auto main(int argc, const char** argv) -> int {
4343
// 架构相关初始化
4444
ArchInit(argc, argv);
4545

46+
// 唤醒其余 core
47+
WakeUpOtherCores();
48+
4649
// klog::Debug("Hello SimpleKernel\n");
4750
// klog::Info("Hello SimpleKernel\n");
4851
// klog::Warn("Hello SimpleKernel\n");

0 commit comments

Comments
 (0)