Skip to content

Commit

Permalink
WIP - ARM64 (#1122)
Browse files Browse the repository at this point in the history
* - WIP

* - Updated QEMU (8.1.0-rc3) + Add ARM64

* - Adding ARM launch codes

* - Adding ARM launch codes

* - WIP - ARM32

* - WIP - ARM32

* - WIP - ARM32

* - WIP - ARM64

* - WIP - ARM64

* - WIP - ARM64

* - WIP - ARM64
  • Loading branch information
tgiphil committed Aug 13, 2023
1 parent 4ebf0ad commit 43f1f2d
Show file tree
Hide file tree
Showing 341 changed files with 3,004 additions and 1,185 deletions.

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions Source/Data/ARM64-Instructions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"Encoding": [

],
"Instructions": [
{
"Name": "Nop",
"Commutative": "false",
"FamilyName": "ARM64",
"FlagsCleared": "",
"FlagsModified": "",
"FlagsSet": "",
"FlagsUnchanged": "CNZV",
"FlagsUndefined": "",
"FlagsUsed": "",
"OperandCount": 0,
"ResultCount": 0,
"Description": "No Operation",
"OpcodeEncoding": [
{
"Condition": "",
"Encoding": "0xBF00"
}
]
}
]
}
3 changes: 2 additions & 1 deletion Source/Docs/command-line-arguments.rst
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ Below are the command line arguments available:
-platform,Compiler.Platform,{value}
-x86,Compiler.Platform,x86
-x64,Compiler.Platform,x64
-armv8a32,Compiler.Platform,armv8a32
-arm32,Compiler.Platform,ARM32
-arm64,Compiler.Platform,ARM64

Compiler - Debug Output Information:
-output-nasm,CompilerDebug.NasmFile,%DEFAULT%
Expand Down
2 changes: 1 addition & 1 deletion Source/Docs/settings-options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Compiler Settings
:header: "Settings", "Description"
:widths: 50, 200

Compiler.Platform,"Platform x86, x64, ARMv8A32"
Compiler.Platform,"Platform x86, x64, ARM32, ARM64"
Compiler.BaseAddress,Base address of the compiled application
Compiler.TraceLevel,Trace level for debugging
Compiler.MethodScanner,"If true, enable the experimental method scanner"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

using Mosa.Kernel.BareMetal;

namespace Mosa.BareMetal.HelloWorld.ARMv8A32;
namespace Mosa.BareMetal.HelloWorld.ARM32;

public static class Boot
{
public static void Main()
{
Debug.WriteLine("Boot::Main()");
Debug.WriteLine("MOSA ARMv8A32 Kernel");
Debug.WriteLine("MOSA ARM32 Kernel");

Program.EntryPoint();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<OutputType>Exe</OutputType>
<StartupObject>Mosa.BareMetal.HelloWorld.ARMv8A32.Boot</StartupObject>
<StartupObject>Mosa.BareMetal.HelloWorld.ARM32.Boot</StartupObject>
<DebugType>full</DebugType>
<LangVersion>11.0</LangVersion>
<OutputPath>..\..\bin\</OutputPath>
Expand All @@ -14,6 +14,6 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Mosa.BareMetal.HelloWorld\Mosa.BareMetal.HelloWorld.csproj" />
<ProjectReference Include="..\Mosa.Kernel.BareMetal.ARMv8A32\Mosa.Kernel.BareMetal.ARMv8A32.csproj" />
<ProjectReference Include="..\Mosa.Kernel.BareMetal.ARM32\Mosa.Kernel.BareMetal.ARM32.csproj" />
</ItemGroup>
</Project>
16 changes: 16 additions & 0 deletions Source/Mosa.BareMetal.HelloWorld.ARM64/Boot.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright (c) MOSA Project. Licensed under the New BSD License.

using Mosa.Kernel.BareMetal;

namespace Mosa.BareMetal.HelloWorld.ARM64;

public static class Boot
{
public static void Main()
{
Debug.WriteLine("Boot::Main()");
Debug.WriteLine("MOSA ARM64 Kernel");

Program.EntryPoint();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<OutputType>Exe</OutputType>
<StartupObject>Mosa.BareMetal.HelloWorld.ARM64.Boot</StartupObject>
<DebugType>full</DebugType>
<LangVersion>11.0</LangVersion>
<OutputPath>..\..\bin\</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<DisableStandardFrameworkResolution>true</DisableStandardFrameworkResolution>
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<UseAppHost>false</UseAppHost>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Mosa.BareMetal.HelloWorld\Mosa.BareMetal.HelloWorld.csproj" />
<ProjectReference Include="..\Mosa.Kernel.BareMetal.ARM64\Mosa.Kernel.BareMetal.ARM64.csproj" />
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion Source/Mosa.DeviceDriver/Setup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ public static List<DeviceDriverRegistryEntry> GetDeviceDriverRegistryEntries()
new PCIDeviceDriverRegistryEntry
{
Name = "VirtIOGPU",
Platform = PlatformArchitecture.X86AndX64 | PlatformArchitecture.ARMv8A32,
Platform = PlatformArchitecture.X86AndX64 | PlatformArchitecture.ARM32,
BusType = DeviceBusType.PCI,
VendorID = 0x1AF4,
DeviceID = 0x1050,
Expand Down
2 changes: 1 addition & 1 deletion Source/Mosa.DeviceSystem/PlatformArchitecture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public enum PlatformArchitecture
/// <summary>
/// The ARMv8 32bit
/// </summary>
ARMv8A32 = 3,
ARM32 = 3,

/// <summary>
/// The X86 and X64
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Mosa.Kernel.BareMetal\Mosa.Kernel.BareMetal.csproj" />
<ProjectReference Include="..\Mosa.Runtime.ARMv8A32\Mosa.Runtime.ARMv8A32.csproj" />
<ProjectReference Include="..\Mosa.Runtime.ARM32\Mosa.Runtime.ARM32.csproj" />
<ProjectReference Include="..\Mosa.Runtime\Mosa.Runtime.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using Mosa.Runtime;
using Mosa.Runtime.Plug;

namespace Mosa.Kernel.BareMetal.ARMv8A32;
namespace Mosa.Kernel.BareMetal.ARM32;

public static class PlatformPlug
{
Expand All @@ -31,33 +31,33 @@ public static void EntryPoint()
[Plug("Mosa.Kernel.BareMetal.Platform::GetInitialGCMemoryPool")]
public static AddressRange GetInitialGCMemoryPool() => new AddressRange(InitialGCMemoryPoolAddress, InitialGCMemoryPoolSize);

public static PlatformArchitecture GetPlatformArchitecture() => PlatformArchitecture.X64;
public static PlatformArchitecture GetPlatformArchitecture() => PlatformArchitecture.ARM32;

//[Plug("Mosa.Kernel.BareMetal.Platform::ConsoleWrite")]
//public static void ConsoleWrite(byte c) => ARMv8A32.VGAConsole.Write(c);
//public static void ConsoleWrite(byte c) => ARM32.VGAConsole.Write(c);

//[Plug("Mosa.Kernel.BareMetal.Platform::DebugWrite")]
//public static void DebugWrite(byte c) => ARMv8A32.SerialDebug.Write(c);
//public static void DebugWrite(byte c) => ARM32.SerialDebug.Write(c);

public static class PageTablePlug
{
//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::Setup")]
//public static void Setup() => ARMv8A32.PageTable.Setup();
//public static void Setup() => ARM32.PageTable.Setup();

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::GetPageShift")]
//public static uint GetPageShift() => 12;

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::Initialize")]
//public static void Initialize() => ARMv8A32.PageTable.Initialize();
//public static void Initialize() => ARM32.PageTable.Initialize();

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::Enable")]
//public static void Enable() => ARMv8A32.PageTable.Enable();
//public static void Enable() => ARM32.PageTable.Enable();

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::MapVirtualAddressToPhysical")]
//public static void MapVirtualAddressToPhysical(Pointer virtualAddress, Pointer physicalAddress, bool present = true) => ARMv8A32.PageTable.MapVirtualAddressToPhysical(virtualAddress, physicalAddress, present);
//public static void MapVirtualAddressToPhysical(Pointer virtualAddress, Pointer physicalAddress, bool present = true) => ARM32.PageTable.MapVirtualAddressToPhysical(virtualAddress, physicalAddress, present);

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::GetPhysicalAddressFromVirtual")]
//public static Pointer GetPhysicalAddressFromVirtual(Pointer virtualAddress) => ARMv8A32.PageTable.GetPhysicalAddressFromVirtual(virtualAddress);
//public static Pointer GetPhysicalAddressFromVirtual(Pointer virtualAddress) => ARM32.PageTable.GetPhysicalAddressFromVirtual(virtualAddress);
}

public static class InterruptPlug
Expand Down Expand Up @@ -99,29 +99,29 @@ public static class IOPlugPlug
public static class SchedulerPlug
{
//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::Start")]
//public static void Start() => ARMv8A32.Scheduler.Start();
//public static void Start() => ARM32.Scheduler.Start();

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::Yield")]
//public static void Yield() => ARMv8A32.Scheduler.Yield();
//public static void Yield() => ARM32.Scheduler.Yield();

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SignalTermination")]
//public static void SignalTermination() => ARMv8A32.Scheduler.SignalTermination();
//public static void SignalTermination() => ARM32.Scheduler.SignalTermination();

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SwitchToThread")]
//public static void SwitchToThread(Thread thread) => ARMv8A32.Scheduler.SwitchToThread(thread);
//public static void SwitchToThread(Thread thread) => ARM32.Scheduler.SwitchToThread(thread);

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SetupThreadStack")]
//public static Pointer SetupThreadStack(Pointer stackTop, Pointer methodAddress, Pointer termAddress) => ARMv8A32.Scheduler.SetupThreadStack(stackTop, methodAddress, termAddress);
//public static Pointer SetupThreadStack(Pointer stackTop, Pointer methodAddress, Pointer termAddress) => ARM32.Scheduler.SetupThreadStack(stackTop, methodAddress, termAddress);
}

public static class SerialPlug
{
//public static void Setup(int serial) => ARMv8A32.Serial.Setup((ushort)serial);
//public static void Setup(int serial) => ARM32.Serial.Setup((ushort)serial);

//public static void Write(int serial, byte data) => ARMv8A32.Serial.Write((ushort)serial, data);
//public static void Write(int serial, byte data) => ARM32.Serial.Write((ushort)serial, data);

//public static byte Read(int serial) => ARMv8A32.Serial.Read((ushort)serial);
//public static byte Read(int serial) => ARM32.Serial.Read((ushort)serial);

//public static bool IsDataReady(int serial) => ARMv8A32.Serial.IsDataReady((ushort)serial);
//public static bool IsDataReady(int serial) => ARM32.Serial.IsDataReady((ushort)serial);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<DebugType>full</DebugType>
<LangVersion>11.0</LangVersion>
<OutputPath>..\..\bin\</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<DisableStandardFrameworkResolution>true</DisableStandardFrameworkResolution>
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<NoWarn>0219,0414</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>
<WarningLevel>2</WarningLevel>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Mosa.Kernel.BareMetal\Mosa.Kernel.BareMetal.csproj" />
<ProjectReference Include="..\Mosa.Runtime.ARM64\Mosa.Runtime.ARM64.csproj" />
<ProjectReference Include="..\Mosa.Runtime\Mosa.Runtime.csproj" />
</ItemGroup>
</Project>
127 changes: 127 additions & 0 deletions Source/Mosa.Kernel.BareMetal.ARM64/PlatformPlug.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
// Copyright (c) MOSA Project. Licensed under the New BSD License.

using Mosa.DeviceSystem;
using Mosa.Runtime;
using Mosa.Runtime.Plug;

namespace Mosa.Kernel.BareMetal.ARM64;

public static class PlatformPlug
{
private const uint BootReservedAddress = 0x00007E00; // Size=Undefined
private const uint InitialGCMemoryPoolAddress = 0x03000000; // @ 48MB
private const uint InitialGCMemoryPoolSize = 16 * 1024 * 1024; // [Size=16MB]

[Plug("Mosa.Kernel.BareMetal.Platform::EntryPoint")]
public static void EntryPoint()
{
//var eax = Native.GetMultibootEAX();
//var ebx = Native.GetMultibootEBX();

//Multiboot.Setup(new Pointer(ebx), eax);

//SSE.Setup();
//SerialDebug.Setup();
//PIC.Setup();
}

[Plug("Mosa.Kernel.BareMetal.Platform::GetBootReservedRegion")]
public static AddressRange GetBootReservedRegion() => new AddressRange(BootReservedAddress, Page.Size);

[Plug("Mosa.Kernel.BareMetal.Platform::GetInitialGCMemoryPool")]
public static AddressRange GetInitialGCMemoryPool() => new AddressRange(InitialGCMemoryPoolAddress, InitialGCMemoryPoolSize);

public static PlatformArchitecture GetPlatformArchitecture() => PlatformArchitecture.ARM32;

//[Plug("Mosa.Kernel.BareMetal.Platform::ConsoleWrite")]
//public static void ConsoleWrite(byte c) => ARM32.VGAConsole.Write(c);

//[Plug("Mosa.Kernel.BareMetal.Platform::DebugWrite")]
//public static void DebugWrite(byte c) => ARM32.SerialDebug.Write(c);

public static class PageTablePlug
{
//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::Setup")]
//public static void Setup() => ARM32.PageTable.Setup();

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::GetPageShift")]
//public static uint GetPageShift() => 12;

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::Initialize")]
//public static void Initialize() => ARM32.PageTable.Initialize();

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::Enable")]
//public static void Enable() => ARM32.PageTable.Enable();

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::MapVirtualAddressToPhysical")]
//public static void MapVirtualAddressToPhysical(Pointer virtualAddress, Pointer physicalAddress, bool present = true) => ARM32.PageTable.MapVirtualAddressToPhysical(virtualAddress, physicalAddress, present);

//[Plug("Mosa.Kernel.BareMetal.Platform+PageTable::GetPhysicalAddressFromVirtual")]
//public static Pointer GetPhysicalAddressFromVirtual(Pointer virtualAddress) => ARM32.PageTable.GetPhysicalAddressFromVirtual(virtualAddress);
}

public static class InterruptPlug
{
//[Plug("Mosa.Kernel.BareMetal.Platform+Interrupt::Setup")]
//public static void Setup() => IDT.Setup();

//[Plug("Mosa.Kernel.BareMetal.Platform+Interrupt::SetHandler")]
//public static void SetHandler(InterruptHandler handler) => IDT.SetInterruptHandler(handler);

//[Plug("Mosa.Kernel.BareMetal.Platform+Interrupt::Enable")]
//public static void Enable() => Native.Sti();

//[Plug("Mosa.Kernel.BareMetal.Platform+Interrupt::Disable")]
//public static void Disable() => Native.Cli();
}

public static class IOPlugPlug
{
//[Plug("Mosa.Kernel.BareMetal.Platform+IO::In8")]
//public static byte In8(ushort address) => Native.In8(address);

//[Plug("Mosa.Kernel.BareMetal.Platform+IO::In16")]
//public static ushort In16(ushort address) => Native.In16(address);

//[Plug("Mosa.Kernel.BareMetal.Platform+IO::In32")]
//public static uint In32(ushort address) => Native.In32(address);

//[Plug("Mosa.Kernel.BareMetal.Platform+IO::Out8")]
//public static void Out8(ushort address, byte data) => Native.Out8(address, data);

//[Plug("Mosa.Kernel.BareMetal.Platform+IO::Out16")]
//public static void Out16(ushort address, ushort data) => Native.Out16(address, data);

//[Plug("Mosa.Kernel.BareMetal.Platform+IO::Out32")]
//public static void Out32(ushort address, uint data) => Native.Out32(address, data);
}

public static class SchedulerPlug
{
//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::Start")]
//public static void Start() => ARM32.Scheduler.Start();

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::Yield")]
//public static void Yield() => ARM32.Scheduler.Yield();

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SignalTermination")]
//public static void SignalTermination() => ARM32.Scheduler.SignalTermination();

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SwitchToThread")]
//public static void SwitchToThread(Thread thread) => ARM32.Scheduler.SwitchToThread(thread);

//[Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SetupThreadStack")]
//public static Pointer SetupThreadStack(Pointer stackTop, Pointer methodAddress, Pointer termAddress) => ARM32.Scheduler.SetupThreadStack(stackTop, methodAddress, termAddress);
}

public static class SerialPlug
{
//public static void Setup(int serial) => ARM32.Serial.Setup((ushort)serial);

//public static void Write(int serial, byte data) => ARM32.Serial.Write((ushort)serial, data);

//public static byte Read(int serial) => ARM32.Serial.Read((ushort)serial);

//public static bool IsDataReady(int serial) => ARM32.Serial.IsDataReady((ushort)serial);
}
}

0 comments on commit 43f1f2d

Please sign in to comment.