Skip to content

Commit 9c21388

Browse files
committed
Add visual logs for SMP
Primary OS startup logic now have visuals too
1 parent c8ad779 commit 9c21388

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

devices/acpi/acpi.hexa

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ class PciGroup {
186186

187187
// TODO move acpiParser.hexa
188188
class ACPIParser {
189-
static fun parse(acpiVendorTable UInt64, cpuid CPUID) Bool {
189+
static fun parse(acpiVendorTable UInt64, cpuid CPUID, framebuffer FrameBuffer) Bool {
190190
serialPrint("[ACPI] parsing started at physical ")
191191
serialPrintHex(acpiVendorTable as! UInt64)
192192
serialPrint("\n")
@@ -256,7 +256,7 @@ class ACPIParser {
256256
// TODO `Physical.toVirtual()` helper
257257
var xsdt = (acpiTable.acpi20.ref.xsdtAddress as! UInt64 + wholePhysicalStart) as! XSDT
258258

259-
loadXsdt(xsdt, cpuid)
259+
loadXsdt(xsdt, cpuid, framebuffer)
260260

261261
serialPrintln("[ACPI] loaded")
262262
return true
@@ -282,7 +282,9 @@ class ACPIParser {
282282
serialPrint("\n")
283283
}
284284

285-
static fun loadXsdt(xsdt XSDT, cpuid CPUID) {
285+
static fun loadXsdt(xsdt XSDT, cpuid CPUID, framebuffer FrameBuffer) {
286+
drawLoadingVerbose("Loading XSDT...", framebuffer)
287+
286288
if xsdt == null {
287289
serialPrintln("[ACPI] XSDT is null")
288290
return
@@ -322,12 +324,12 @@ class ACPIParser {
322324
switch header.type {
323325
case APIC:
324326
serialPrintf("[ACPI] header.type == APIC\n")
325-
loadApic(header as! AcpiApic, cpuid)
327+
loadApic(header as! AcpiApic, cpuid, framebuffer)
326328
// break // TODO breaks `for` not `switch`
327329

328330
case MCFG:
329331
serialPrintf("[ACPI] header.type == MCFG\n")
330-
// TODO crashes loadMcfg(header as! AcpiMcfg)
332+
// TODO crashes loadMcfg(header as! AcpiMcfg, framebuffer)
331333
// break
332334

333335
case FADT:
@@ -469,7 +471,9 @@ class ACPIParser {
469471
delayMicroseconds(ms * 1000)
470472
}
471473

472-
static fun loadApic(apic AcpiApic, cpuid CPUID) {
474+
static fun loadApic(apic AcpiApic, cpuid CPUID, framebuffer FrameBuffer) {
475+
drawLoadingVerbose("Loading APIC...", framebuffer)
476+
473477
serialPrintf("[ACPI] loadApic begin SMP\n")
474478
// TODO Delay between IPI-SIPI + disable PIC
475479
// TODO Hexa: ensure `if not boolean` generates `!= true_` instead of `c-style != 0` cause null-bool is `2`
@@ -493,9 +497,11 @@ class ACPIParser {
493497
// Turns the Local APIC on
494498
if x2 {
495499
// Enable x2APIC mode (bit 10 and 11)
500+
drawLoadingVerbose("Enable x2APIC...", framebuffer)
496501
wrmsr(ia32_apic_base, (apic.localAddress & apic_base_flag) | apic_enable_flag | apic_x2apic_enable_flag)
497502
} else {
498503
// Enable xAPIC mode
504+
drawLoadingVerbose("Enable xAPIC...", framebuffer)
499505
wrmsr(ia32_apic_base, (apic.localAddress & apic_base_flag) | apic_enable_flag)
500506
}
501507

@@ -526,6 +532,8 @@ class ACPIParser {
526532
let lapic_ldr = 0x00d0u64 // Logical Destination
527533
let lapic_svr = 0x00f0u64 // Spurious Interrupt Vector
528534

535+
drawLoadingVerbose("Enable LAPIC...", framebuffer)
536+
529537
// TODO is 1 page enough?
530538
mapMemory(pml4entries, virtualLocalApic, physicalLocalApic, 1)
531539

@@ -563,6 +571,8 @@ class ACPIParser {
563571
data = data.offsetItems(length)
564572
}
565573

574+
drawLoadingVerbose("Enable IO APIC...", framebuffer)
575+
566576
// Map memory, 1 page
567577
// TODO supposedly may be not enoungh for some HW?
568578
mapMemory(pml4entries, virtualIoApic, physicalIoApic, 1)
@@ -646,6 +656,8 @@ class ACPIParser {
646656

647657

648658
// SMP goes here //
659+
drawLoadingVerbose("Enable SMP...", framebuffer)
660+
649661
// TODO extract to separate function
650662
// We will fill trapeze arguments dynamically by updating it's binary directly
651663
let trapezeIdenityAddress = 0x8000u64
@@ -744,6 +756,8 @@ class ACPIParser {
744756
// TODO disableAllInterrupts()?
745757

746758
// Send INIT IPI
759+
drawLoadingVerbose("Send INIT SMP...", framebuffer)
760+
747761
let icr = 0x4500
748762
if x2 {
749763
// TODO
@@ -777,6 +791,8 @@ class ACPIParser {
777791
var icr = 0x4600u64 | ap_segment
778792

779793
// Send START IPI (SIPI)
794+
drawLoadingVerbose("Send SIPI SMP...", framebuffer)
795+
780796
if x2 {
781797
// TODO
782798
} else {
@@ -823,6 +839,7 @@ class ACPIParser {
823839
}
824840
}
825841

842+
drawLoadingVerbose("Waiting for SMP AP...", framebuffer)
826843
// TODO `[ERROR] SMP hardware failure [ERROR]`
827844
while currentCoresAp == coresAp {
828845
__sync_synchronize()
@@ -840,7 +857,8 @@ class ACPIParser {
840857
serialPrintf("[ACPI] loadApic done\n")
841858
}
842859

843-
static fun loadMcfg(mcfg AcpiMcfg) {
860+
static fun loadMcfg(mcfg AcpiMcfg, framebuffer FrameBuffer) {
861+
drawLoadingVerbose("Loading MCFG...", framebuffer)
844862
serialPrintf("[ACPI] loadMcfg\n")
845863
var count UInt64 = acpiTableEntriesAcpiMcfg(mcfg, sizeOf<AcpiMcfgEntry>()) // TODO sizeOf must error
846864
var mPci [PciGroup] = []

engine/tofita.hexa

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ fun engineInit(params UefiPayload) {
7171
let cpuid CPUID = getCPUID()
7272

7373
{
74+
drawLoadingVerbose("Initializing CPU features...", params.framebuffer.ref)
7475
// Page Attribute Table (PAT)
7576
// TODO SMP enable PAT for each AP
7677
// TODO would make sense to put it into `AMD64.initializePAT(cpuid)` namespace ig
@@ -142,11 +143,13 @@ fun engineInit(params UefiPayload) {
142143
// TODO QSOD
143144
}
144145

146+
drawLoadingVerbose("Initializing interrupts...", params.framebuffer.ref)
145147
// disablePic() TODO should be disabled after APIC
146148
setupInterruptsAndExceptions()
147149
// TODO rename to initializeInterrupts()
148150
enablePS2Mouse()
149151

152+
drawLoadingVerbose("Initializing GUI...", params.framebuffer.ref)
150153
initText()
151154
versionText = "Development copy. Build " + versionMajor + "." + versionMinor + "." + versionTag
152155
initializeCompositor()
@@ -184,8 +187,9 @@ fun engineInit(params UefiPayload) {
184187
tmemcpy(trapeze as! ArrayPointer<UInt8>, asset.data as! ConstArrayPointer<UInt8>, asset.size)
185188
}
186189

190+
drawLoadingVerbose("Initializing ACPI...", params.framebuffer.ref)
187191
// disablePic() TODO may be required before activation
188-
if not ACPIParser.parse(params.acpiTablePhysical, cpuid) {
192+
if not ACPIParser.parse(params.acpiTablePhysical, cpuid, params.framebuffer.ref) {
189193
quakePrintf("ACPI is *not* loaded, probably incompatible motherboard or outdated BIOS\n".utf16())
190194
} else {
191195
quakePrintf("ACPI 2.0 is loaded and ready\n".utf16())
@@ -204,8 +208,10 @@ fun engineInit(params UefiPayload) {
204208
}
205209

206210
// TODO var sandbox = sandbox.createSandbox()
211+
drawLoadingVerbose("Initializing DWM...", params.framebuffer.ref)
207212
initDwm()
208213

214+
drawLoadingVerbose("Initializing scheduler...", params.framebuffer.ref)
209215
// Setup scheduling
210216
currentThread = ThreadKind.THREAD_INIT
211217
// FSBase is MSR 0xC0000100, GSBase is 0xC0000101, and EngineGSBase is 0xC0000102
@@ -321,6 +327,7 @@ fun engineInit(params UefiPayload) {
321327
}
322328

323329
// Auto run
330+
drawLoadingVerbose("Starting apps...", params.framebuffer.ref)
324331
autoRun()
325332

326333
startupMilliseconds =

0 commit comments

Comments
 (0)