Skip to content

Commit 41ad32e

Browse files
committed
opstart: Migrated to C++ modules.
1 parent 67a0d06 commit 41ad32e

14 files changed

Lines changed: 208 additions & 159 deletions

File tree

src/kernel/opstart/arch.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module;
2+
3+
#include <hal/vmm.h>
4+
#include <vaerk-handover/spec.h>
5+
6+
export module Opstart:arch;
7+
8+
import Karm.Core;
9+
10+
using namespace Karm;
11+
12+
extern "C" void __enterKernel(usize entry, usize payload, usize stack, usize vmm);
13+
14+
namespace Opstart::Arch {
15+
16+
export void enterKernel(usize entry, Handover::Payload& payload, usize stack, Hal::Vmm& vmm) {
17+
__enterKernel(
18+
entry,
19+
reinterpret_cast<usize>(&payload) + Handover::KERNEL_BASE,
20+
stack,
21+
vmm.root()
22+
);
23+
}
24+
25+
} // namespace Opstart::Arch
Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
1-
#pragma once
1+
module;
22

33
#include <karm/macros>
44

5-
import Mdi;
6-
import Karm.Ui;
5+
export module Opstart:config;
6+
77
import Karm.Core;
8-
import Karm.Image;
9-
import Karm.Sys;
108
import Karm.Ref;
119
import Karm.Gfx;
12-
import Karm.Logger;
10+
import Karm.Image;
1311

1412
using namespace Karm;
1513

1614
namespace Opstart {
1715

18-
struct Blob {
16+
export struct Blob {
1917
Ref::Url url;
2018
Serde::Value props;
2119

@@ -43,7 +41,7 @@ struct Blob {
4341
}
4442
};
4543

46-
struct Entry {
44+
export struct Entry {
4745
Union<None, Gfx::Icon, Rc<Gfx::Surface>> icon = NONE;
4846
String name;
4947
Blob kernel;
@@ -84,7 +82,7 @@ struct Entry {
8482
}
8583
};
8684

87-
struct Configs {
85+
export struct Configs {
8886
Opt<String> title;
8987
Opt<String> subtitle;
9088
Vec<Entry> entries;
@@ -113,8 +111,4 @@ struct Configs {
113111
}
114112
};
115113

116-
Async::Task<> showMenuAsync(Sys::Env& env, Configs const& c, Async::CancellationToken ct);
117-
118-
Res<> loadEntry(Entry const&);
119-
120-
} // namespace Opstart
114+
} // namespace Opstart

src/kernel/opstart/entry.cpp

Lines changed: 0 additions & 61 deletions
This file was deleted.

src/kernel/opstart/fw.h

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 6 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,14 @@
1-
import Karm.Core;
1+
module;
22

33
#include <hal-x86_64/vmm.h>
4-
#include <opstart/fw.h>
54
#include <vaerk-efi/base.h>
5+
#include <vaerk-handover/builder.h>
66

7-
namespace Opstart::Fw {
8-
9-
struct EfiPmm : public Hal::Pmm {
10-
Res<Hal::PmmRange> allocRange(usize size, Flags<Hal::PmmFlags>) override {
11-
usize paddr = 0;
12-
try$(Efi::bs()->allocatePages(Efi::AllocateType::ANY_PAGES, Efi::MemoryType::LOADER_DATA, size / Hal::PAGE_SIZE, &paddr));
13-
return Ok(Hal::PmmRange{paddr, size});
14-
}
15-
16-
Res<> used(Hal::PmmRange range, Flags<Hal::PmmFlags>) override {
17-
usize paddr = range.start;
18-
try$(Efi::bs()->allocatePages(Efi::AllocateType::ADDRESS, Efi::MemoryType::LOADER_DATA, paddr / Hal::PAGE_SIZE, &paddr));
19-
return Ok();
20-
}
7+
export module Opstart:handover;
218

22-
Res<> free(Hal::PmmRange range) override {
23-
try$(Efi::bs()->freePages((u64)range.start, range.size / Hal::PAGE_SIZE));
24-
return Ok();
25-
}
26-
};
9+
import Karm.Core;
2710

28-
static EfiPmm pmm{};
29-
30-
Res<Arc<Hal::Vmm>> createVmm() {
31-
usize upper = try$(pmm.allocRange(Hal::PAGE_SIZE, {})).start;
32-
std::memset((void*)upper, 0, Hal::PAGE_SIZE);
33-
return Ok(makeArc<x86_64::Vmm<>>(pmm, (x86_64::Pml<4>*)upper));
34-
}
11+
namespace Opstart {
3512

3613
Res<> parseGop(Handover::Builder& builder) {
3714
auto* gop = try$(Efi::locateProtocol<Efi::GraphicsOutputProtocol>());
@@ -136,18 +113,4 @@ Res<> finalizeHandover(Handover::Builder& builder) {
136113
return Ok();
137114
}
138115

139-
Hal::PmmRange imageRange() {
140-
return {
141-
Hal::pageAlignDown((usize)Efi::li()->imageBase),
142-
Hal::pageAlignUp((usize)Efi::li()->imageSize),
143-
};
144-
}
145-
146-
// Implemented in kernel-entry.s
147-
extern "C" void __enterKernel(usize entry, usize payload, usize stack, usize vmm);
148-
149-
void enterKernel(usize entry, Handover::Payload& payload, usize stack, Hal::Vmm& vmm) {
150-
__enterKernel(entry, (usize)&payload + Handover::KERNEL_BASE, stack, vmm.root());
151-
}
152-
153-
} // namespace Opstart::Fw
116+
} // namespace Opstart

src/kernel/opstart/loader.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
1+
module;
2+
3+
#include <hal/mem.h>
4+
#include <hal/vmm.h>
5+
#include <karm/macros>
6+
#include <vaerk-handover/builder.h>
7+
8+
export module Opstart:loader;
9+
110
import Karm.Core;
211
import Karm.Sys;
312
import Karm.Logger;
413
import Karm.Dl.Elf;
514

6-
#include <hal/mem.h>
7-
#include <vaerk-handover/builder.h>
8-
9-
#include "fw.h"
10-
#include "loader.h"
15+
import :config;
16+
import :arch;
17+
import :mem;
18+
import :handover;
1119

1220
using namespace Karm::Literals;
1321

1422
namespace Opstart {
1523

1624
void enterKernel(usize entry, usize payload, usize stack, usize vmm);
1725

18-
Res<> loadEntry(Entry const& entry) {
26+
export Res<> loadEntry(Entry const& entry) {
1927
logInfo("opstart: preparing payload...");
2028
auto payloadMem = try$(Sys::mutMmap(NONE, {.size = 16_KiB}));
2129
logInfo("opstart: payload at vaddr: {p} paddr: {p}", payloadMem.vaddr(), payloadMem.paddr());
@@ -92,7 +100,7 @@ Res<> loadEntry(Entry const& entry) {
92100
logInfo(" - {}", request.name());
93101
}
94102

95-
auto vmm = try$(Fw::createVmm());
103+
auto vmm = try$(createVmm());
96104

97105
logInfo("opstart: mapping kernel...");
98106
try$(vmm->mapRange(
@@ -109,7 +117,7 @@ Res<> loadEntry(Entry const& entry) {
109117
));
110118

111119
logInfo("opstart: mapping boot-agent image...");
112-
auto loaderImage = Fw::imageRange();
120+
auto loaderImage = imageRange();
113121

114122
try$(vmm->mapRange(
115123
Hal::identityMapped(loaderImage),
@@ -123,8 +131,8 @@ Res<> loadEntry(Entry const& entry) {
123131
usize sp = Handover::KERNEL_BASE + (usize)stackMap.mutBytes().end();
124132
logInfo("opstart: ip:{x} sp:{x} payload:{}", ip, sp, (usize)&payload.finalize());
125133

126-
try$(Fw::finalizeHandover(payload));
127-
Fw::enterKernel(ip, payload.finalize(), sp, *vmm);
134+
try$(finalizeHandover(payload));
135+
Arch::enterKernel(ip, payload.finalize(), sp, *vmm);
128136

129137
unreachable();
130138
}

src/kernel/opstart/main.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <karm/entry>
2+
3+
import Karm.Logger;
4+
import Opstart;
5+
6+
using namespace Karm;
7+
using namespace Karm::Literals;
8+
using namespace Karm::Ref::Literals;
9+
10+
Async::Task<> entryPointAsync(Sys::Env& env, Async::CancellationToken ct) {
11+
logInfo("opstart " stringify$(__ck_version_value));
12+
13+
logInfo("loading configs...");
14+
auto file = co_try$(Sys::File::open("file:/loader.json"_url));
15+
16+
logInfo("parsing configs...");
17+
auto fileStr = co_try$(Io::readAllUtf8(file));
18+
auto json = co_try$(Json::parse(fileStr));
19+
20+
logInfo("validating configs...");
21+
logInfo("configs: {}", json);
22+
23+
auto configs = co_try$(Opstart::Configs::fromJson(json));
24+
25+
if (configs.entries.len() > 1 or configs.entries.len() == 0)
26+
co_return co_await Opstart::showMenuAsync(env, configs, ct);
27+
else
28+
co_try$(splashScreen(configs.entries[0]));
29+
30+
co_return Opstart::loadEntry(configs.entries[0]);
31+
}

src/kernel/opstart/manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"requires": [
1212
"karm-kira",
1313
"karm-sys",
14-
"opstart-impl",
15-
"karm-dl.elf"
14+
"karm-dl.elf",
15+
"opstart.arch"
1616
]
1717
}

src/kernel/opstart/mem.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
module;
2+
3+
#include <hal-x86_64/vmm.h>
4+
#include <vaerk-efi/base.h>
5+
6+
export module Opstart:mem;
7+
8+
namespace Opstart {
9+
10+
struct EfiPmm : Hal::Pmm {
11+
Res<Hal::PmmRange> allocRange(usize size, Flags<Hal::PmmFlags>) override {
12+
usize paddr = 0;
13+
try$(Efi::bs()->allocatePages(Efi::AllocateType::ANY_PAGES, Efi::MemoryType::LOADER_DATA, size / Hal::PAGE_SIZE, &paddr));
14+
return Ok(Hal::PmmRange{paddr, size});
15+
}
16+
17+
Res<> used(Hal::PmmRange range, Flags<Hal::PmmFlags>) override {
18+
usize paddr = range.start;
19+
try$(Efi::bs()->allocatePages(Efi::AllocateType::ADDRESS, Efi::MemoryType::LOADER_DATA, paddr / Hal::PAGE_SIZE, &paddr));
20+
return Ok();
21+
}
22+
23+
Res<> free(Hal::PmmRange range) override {
24+
try$(Efi::bs()->freePages(range.start, range.size / Hal::PAGE_SIZE));
25+
return Ok();
26+
}
27+
};
28+
29+
static EfiPmm pmm{};
30+
31+
export Res<Arc<Hal::Vmm>> createVmm() {
32+
usize upper = try$(pmm.allocRange(Hal::PAGE_SIZE, {})).start;
33+
std::memset(reinterpret_cast<void*>(upper), 0, Hal::PAGE_SIZE);
34+
return Ok(makeArc<x86_64::Vmm<>>(pmm, reinterpret_cast<x86_64::Pml<4>*>(upper)));
35+
}
36+
37+
export Hal::PmmRange imageRange() {
38+
return {
39+
Hal::pageAlignDown(reinterpret_cast<usize>(Efi::li()->imageBase)),
40+
Hal::pageAlignUp(Efi::li()->imageSize),
41+
};
42+
}
43+
44+
} // namespace Opstart

0 commit comments

Comments
 (0)