84 lines
2.7 KiB
ObjectPascal
84 lines
2.7 KiB
ObjectPascal
// Copyright 2026 Aaron Hance
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
unit arch.x86_64.boot;
|
|
|
|
interface
|
|
|
|
procedure kmain(info: pointer; magic: uint32); cdecl;
|
|
|
|
implementation
|
|
|
|
uses io.stdio, core.strings, driver.storage.fdtable, arch.x86_64.proc.sched, proc.mgr, arch.x86_64.context, arch.x86_64.irq, memory.heap, debug.early, arch.x86_64.debug, arch.x86_64.isr, boot.multiboot,
|
|
arch.x86_64.memory.physical, arch.x86_64.memory.virtual;
|
|
|
|
function long_mode_active: boolean; assembler; nostackframe;
|
|
asm
|
|
mov ecx, $C0000080
|
|
rdmsr
|
|
shr eax, 10
|
|
and eax, 1
|
|
end;
|
|
|
|
procedure kmain(info: pointer; magic: uint32); cdecl; [public, alias: 'kmain'];
|
|
var
|
|
wide: PtrUInt;
|
|
begin
|
|
arch.x86_64.debug.init;
|
|
arch.x86_64.isr.init;
|
|
puts('ASURO x86_64: entered Pascal'#13#10);
|
|
if (magic <> $2BADB002) or (info = nil) then begin
|
|
puts('FAIL: Multiboot handoff'#13#10);
|
|
bootstrap_halt;
|
|
end;
|
|
if (sizeof(pointer) <> 8) or (sizeof(PtrUInt) <> 8) or
|
|
(sizeof(SizeUInt) <> 8) or (sizeof(uint32) <> 4) then begin
|
|
puts('FAIL: native type widths'#13#10);
|
|
bootstrap_halt;
|
|
end;
|
|
wide := PtrUInt($100000000) + PtrUInt(magic);
|
|
if (wide shr 32 <> 1) or not long_mode_active then begin
|
|
puts('FAIL: long mode or 64-bit arithmetic'#13#10);
|
|
bootstrap_halt;
|
|
end;
|
|
puts('PASS: long mode, Multiboot handoff, 64-bit Pascal types'#13#10);
|
|
arch.x86_64.isr.UnitTest;
|
|
arch.x86_64.memory.physical.init(Pmultiboot_info_t(info));
|
|
arch.x86_64.memory.physical.UnitTest;
|
|
arch.x86_64.memory.virtual.init;
|
|
arch.x86_64.memory.virtual.UnitTest;
|
|
memory.heap.init;
|
|
memory.heap.UnitTest;
|
|
core.strings.UnitTest;
|
|
io.stdio.init;
|
|
arch.x86_64.irq.init;
|
|
arch.x86_64.irq.UnitTest;
|
|
arch.x86_64.context.UnitTest;
|
|
driver.storage.fdtable.UnitTest;
|
|
proc.mgr.init;
|
|
arch.x86_64.proc.sched.init;
|
|
arch.x86_64.proc.sched.UnitTest;
|
|
{$ifdef ASURO_TEST_UD}
|
|
arch.x86_64.isr.testFatal(6);
|
|
{$endif}
|
|
{$ifdef ASURO_TEST_PF}
|
|
arch.x86_64.isr.testFatal(14);
|
|
{$endif}
|
|
{$ifdef ASURO_TEST_DF}
|
|
arch.x86_64.isr.testFatal(8);
|
|
{$endif}
|
|
puts('ASURO x86_64: bootstrap complete; interrupts disabled'#13#10);
|
|
bootstrap_halt;
|
|
end;
|
|
|
|
end.
|