@@ -186,7 +186,7 @@ class PciGroup {
186186
187187// TODO move acpiParser.hexa
188188class 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] = []
0 commit comments