diff --git a/Demos/Console/Run-BareMetal.CoolWorld.x86.bat b/Demos/Console/Run-BareMetal.CoolWorld.x86.bat new file mode 100755 index 0000000000..a588ce3899 --- /dev/null +++ b/Demos/Console/Run-BareMetal.CoolWorld.x86.bat @@ -0,0 +1,3 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -vmware-svga -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.CoolWorld.x86.sh b/Demos/Console/Run-BareMetal.CoolWorld.x86.sh new file mode 100755 index 0000000000..e14f1cb4e3 --- /dev/null +++ b/Demos/Console/Run-BareMetal.CoolWorld.x86.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -vmware-svga -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.HelloWorld.x86.bat b/Demos/Console/Run-BareMetal.HelloWorld.x86.bat new file mode 100644 index 0000000000..9696bef80a --- /dev/null +++ b/Demos/Console/Run-BareMetal.HelloWorld.x86.bat @@ -0,0 +1,3 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.HelloWorld.x86.sh b/Demos/Console/Run-BareMetal.HelloWorld.x86.sh new file mode 100755 index 0000000000..a9174c2cff --- /dev/null +++ b/Demos/Console/Run-BareMetal.HelloWorld.x86.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.Starter.x86.bat b/Demos/Console/Run-BareMetal.Starter.x86.bat new file mode 100644 index 0000000000..f95d123789 --- /dev/null +++ b/Demos/Console/Run-BareMetal.Starter.x86.bat @@ -0,0 +1,3 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.Starter.x86.dll diff --git a/Demos/Console/Run-BareMetal.Starter.x86.sh b/Demos/Console/Run-BareMetal.Starter.x86.sh new file mode 100755 index 0000000000..061e5ff348 --- /dev/null +++ b/Demos/Console/Run-BareMetal.Starter.x86.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.Starter.x86.dll + diff --git a/Demos/Console/Run-BareMetal.TestWorld.x86.bat b/Demos/Console/Run-BareMetal.TestWorld.x86.bat new file mode 100644 index 0000000000..499fc7339e --- /dev/null +++ b/Demos/Console/Run-BareMetal.TestWorld.x86.bat @@ -0,0 +1,3 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.TestWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.TestWorld.x86.sh b/Demos/Console/Run-BareMetal.TestWorld.x86.sh new file mode 100755 index 0000000000..197c3c3dd2 --- /dev/null +++ b/Demos/Console/Run-BareMetal.TestWorld.x86.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.TestWorld.x86.dll + diff --git a/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.bat b/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.bat new file mode 100644 index 0000000000..eecc071f3b --- /dev/null +++ b/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.bat @@ -0,0 +1,4 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -include Include -vmware -vmdk Mosa.BareMetal.CoolWorld.x86.dll + diff --git a/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.sh b/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.sh new file mode 100755 index 0000000000..49fb726450 --- /dev/null +++ b/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -vmware -vmdk -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.bat b/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.bat new file mode 100644 index 0000000000..aaecc14534 --- /dev/null +++ b/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.bat @@ -0,0 +1,3 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -include Include -virtualbox -vdi Mosa.BareMetal.CoolWorld.x86.dll \ No newline at end of file diff --git a/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.sh b/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.sh new file mode 100755 index 0000000000..d37ef44722 --- /dev/null +++ b/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -virtualbox -vdi -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Run-BareMetal.CoolWorld.x86.sh b/Demos/Run-BareMetal.CoolWorld.x86.sh index e14f1cb4e3..140f5979ad 100755 --- a/Demos/Run-BareMetal.CoolWorld.x86.sh +++ b/Demos/Run-BareMetal.CoolWorld.x86.sh @@ -1,3 +1,3 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -vmware-svga -include Include Mosa.BareMetal.CoolWorld.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash -vmware-svga -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Run-BareMetal.HelloWorld.x86.sh b/Demos/Run-BareMetal.HelloWorld.x86.sh index a9174c2cff..7512922111 100755 --- a/Demos/Run-BareMetal.HelloWorld.x86.sh +++ b/Demos/Run-BareMetal.HelloWorld.x86.sh @@ -1,3 +1,3 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll diff --git a/Demos/Run-BareMetal.Starter.x86.sh b/Demos/Run-BareMetal.Starter.x86.sh index 061e5ff348..7c84870802 100755 --- a/Demos/Run-BareMetal.Starter.x86.sh +++ b/Demos/Run-BareMetal.Starter.x86.sh @@ -1,4 +1,4 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.Starter.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.Starter.x86.dll diff --git a/Demos/Run-BareMetal.TestWorld.x86.sh b/Demos/Run-BareMetal.TestWorld.x86.sh index 197c3c3dd2..312a2012ce 100755 --- a/Demos/Run-BareMetal.TestWorld.x86.sh +++ b/Demos/Run-BareMetal.TestWorld.x86.sh @@ -1,4 +1,4 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.TestWorld.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.TestWorld.x86.dll diff --git a/Demos/Run-VMware-BareMetal.CoolWorld.x86.sh b/Demos/Run-VMware-BareMetal.CoolWorld.x86.sh index 49fb726450..c1e1730d99 100755 --- a/Demos/Run-VMware-BareMetal.CoolWorld.x86.sh +++ b/Demos/Run-VMware-BareMetal.CoolWorld.x86.sh @@ -1,3 +1,3 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -vmware -vmdk -include Include Mosa.BareMetal.CoolWorld.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash -vmware -vmdk -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.sh b/Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.sh index d37ef44722..5d035e41d0 100755 --- a/Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.sh +++ b/Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.sh @@ -1,3 +1,3 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -virtualbox -vdi -include Include Mosa.BareMetal.CoolWorld.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash -virtualbox -vdi -include Include Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Source/Docs/command-line-arguments.rst b/Source/Docs/command-line-arguments.rst index 31a40ee427..a4806fa1dc 100644 --- a/Source/Docs/command-line-arguments.rst +++ b/Source/Docs/command-line-arguments.rst @@ -113,10 +113,11 @@ Below are the command line arguments available: -timeout,Emulator.MaxRuntime,{value} -debug,Launcher.Serial,true -debug,OS.BootOptions,bootoptions=serialdebug - + -acceleration,Emulator.Acceleration,true + Launcher - Emulator - Qemu & VMWare: - -vmware-svga,Emulator.SVGA,vmware - -virtio-vga,Emulator.SVGA,virtio + -vmware-svga,Emulator.Graphics,vmware + -virtio-vga,Emulator.Graphics,virtio Launcher - Image: -image,Image.ImageFile,{value} diff --git a/Source/Docs/settings-options.rst b/Source/Docs/settings-options.rst index b50cc76e76..e265c8455e 100644 --- a/Source/Docs/settings-options.rst +++ b/Source/Docs/settings-options.rst @@ -154,13 +154,14 @@ Emulator Settings Emulator,"Type of Emulator QEMU, VMware, Bochs" Emulator.Memory,Amount of memory for the virtual machine in MB Emulator.Display,"If true, show the video display" - Emulator.SVGA,"SVGA mode: std, cirrus, vbe, virtio or vmware" + Emulator.Graphics,"Graphics device: std, cirrus, vbe, virtio or vmware" Emulator.MaxRuntime,Maximum runtime of the virtual machine in seconds (future) Emulator.GDB,"If true, enables GDB within emulator" Emulator.Serial,"Serial Emulation type None, Pipe, TCPServer, TCPClient" Emulator.Serial.Host,Serial Host Name or IP address Emulator.Serial.Port,Serial Port Emulator.Serial.Pipe,Serial Pipename + Emulator.Acceleration,Enables CPU hardware acceleration on the emulator, if available GDB Settings ------------ @@ -202,6 +203,8 @@ Application Location Settings :widths: 50, 200 AppLocation.Bochs,Location of the BOCHS application + AppLocation.Bochs.BIOS,Location of the BOCHS BIOS + AppLocation.Bochs.VGABIOS,Location of the BOCHS VGA BIOS AppLocation.QemuX86,Location of the QEMU application for x86 (i386) AppLocation.QemuX64,Location of the QEMU application for x64 AppLocation.QemuARM32,Location of the QEMU application for ARM32 diff --git a/Source/Mosa.Tool.Launcher/MainWindow.axaml b/Source/Mosa.Tool.Launcher/MainWindow.axaml index 55b25ad47f..24520ab131 100644 --- a/Source/Mosa.Tool.Launcher/MainWindow.axaml +++ b/Source/Mosa.Tool.Launcher/MainWindow.axaml @@ -176,6 +176,10 @@ + + + + diff --git a/Source/Mosa.Tool.Launcher/MainWindow.axaml.cs b/Source/Mosa.Tool.Launcher/MainWindow.axaml.cs index 6c94da5c3f..5e471e8c0b 100644 --- a/Source/Mosa.Tool.Launcher/MainWindow.axaml.cs +++ b/Source/Mosa.Tool.Launcher/MainWindow.axaml.cs @@ -153,6 +153,8 @@ private void UpdateInterfaceAppLocations() qemuEdk2ARMPathLbl.Content = MosaSettings.QemuEdk2ARM32; qemuImgPathLbl.Content = MosaSettings.QemuImgApp; bochsPathLbl.Content = MosaSettings.BochsApp; + bochsBiosPathLbl.Content = MosaSettings.BochsBIOS; + bochsVgaBiosPathLbl.Content = MosaSettings.BochsVGABIOS; vmwarePathLbl.Content = string.IsNullOrEmpty(MosaSettings.VmwarePlayerApp) ? MosaSettings.VmwareWorkstationApp : MosaSettings.VmwarePlayerApp; vboxPathLbl.Content = MosaSettings.VirtualBoxApp; mkisofsPathLbl.Content = MosaSettings.MkisofsApp; diff --git a/Source/Mosa.Utility.Configuration/AppLocationsSettings.cs b/Source/Mosa.Utility.Configuration/AppLocationsSettings.cs index 488ca98918..032457eb99 100644 --- a/Source/Mosa.Utility.Configuration/AppLocationsSettings.cs +++ b/Source/Mosa.Utility.Configuration/AppLocationsSettings.cs @@ -31,6 +31,8 @@ public static void GetAppLocations(MosaSettings mosaSettings) mosaSettings.QemuEdk2ARM64 = FindQemuEDK2ARM64(); mosaSettings.QemuImgApp = FindQemuImg(); mosaSettings.BochsApp = FindBochs(); + mosaSettings.BochsBIOS = FindBochsBIOS(); + mosaSettings.BochsVGABIOS = FindBochsVGABIOS(); mosaSettings.VmwarePlayerApp = FindVmwarePlayer(); mosaSettings.VmwareWorkstationApp = FindVmwareWorkstation(); mosaSettings.VirtualBoxApp = FindVirtualBox(); @@ -227,6 +229,64 @@ private static string FindBochs() : TryFind("bochs", LinuxDirectories); } + private static string FindBochsBIOS() + { + return + IsWindows ? TryFind("BIOS-bochs-latest", + new string[] { + @"%ProgramFiles%\Bochs-2.6.9", + @"%ProgramFiles(x86)%\Bochs-2.6.9", + @"%ProgramFiles%\Bochs-2.6.8", + @"%ProgramFiles(x86)%\Bochs-2.6.8", + @"%ProgramFiles%\Bochs-2.6.5", + @"%ProgramFiles(x86)%\Bochs-2.6.5", + @"%ProgramFiles%\Bochs-2.6.2", + @"%ProgramFiles(x86)%\Bochs-2.6.2", + @"%ProgramFiles%\Bochs-2.7", + @"%ProgramFiles(x86)%\Bochs-2.7", + + @"%CURRENT%\..\Tools\Bochs", + @"%CURRENT%\Tools\Bochs", + + @"%APPDIR%\Tools\Bochs", + @"%APPDIR%\..\Tools\Bochs" + }) + : TryFind("BIOS-bochs-latest", + new string[] { + "/usr/share/bochs", + "/opt/homebrew/share/bochs/" + }); + } + + private static string FindBochsVGABIOS() + { + return + IsWindows ? TryFind("VGABIOS-lgpl-latest", + new string[] { + @"%ProgramFiles%\Bochs-2.6.9", + @"%ProgramFiles(x86)%\Bochs-2.6.9", + @"%ProgramFiles%\Bochs-2.6.8", + @"%ProgramFiles(x86)%\Bochs-2.6.8", + @"%ProgramFiles%\Bochs-2.6.5", + @"%ProgramFiles(x86)%\Bochs-2.6.5", + @"%ProgramFiles%\Bochs-2.6.2", + @"%ProgramFiles(x86)%\Bochs-2.6.2", + @"%ProgramFiles%\Bochs-2.7", + @"%ProgramFiles(x86)%\Bochs-2.7", + + @"%CURRENT%\..\Tools\Bochs", + @"%CURRENT%\Tools\Bochs", + + @"%APPDIR%\Tools\Bochs", + @"%APPDIR%\..\Tools\Bochs" + }) + : TryFind("VGABIOS-lgpl-latest", + new string[] { + "/usr/share/bochs", + "/opt/homebrew/share/bochs/" + }); + } + private static string FindQemuImg() { return diff --git a/Source/Mosa.Utility.Configuration/CommandLineArguments.cs b/Source/Mosa.Utility.Configuration/CommandLineArguments.cs index 651b0e3b89..2062023d4a 100644 --- a/Source/Mosa.Utility.Configuration/CommandLineArguments.cs +++ b/Source/Mosa.Utility.Configuration/CommandLineArguments.cs @@ -158,8 +158,10 @@ private static List GetMap() new Argument { Name = "-video-width", Setting = Name.Multiboot_Video_Width}, new Argument { Name = "-video-height", Setting = Name.Multiboot_Video_Height}, - new Argument { Name = "-vmware-svga", Setting = Name.Emulator_SVGA, Value = "vmware"}, - new Argument { Name = "-virtio-vga", Setting = Name.Emulator_SVGA, Value = "virtio"}, + new Argument { Name = "-vmware-svga", Setting = Name.Emulator_Graphics, Value = "vmware"}, + new Argument { Name = "-virtio-vga", Setting = Name.Emulator_Graphics, Value = "virtio"}, + + new Argument { Name = "-acceleration", Setting = Name.Emulator_Acceleration, Value = "true"}, new Argument { Name = "-gdb-port", Setting = Name.GDB_Port}, new Argument { Name = "-gdb-host", Setting = Name.GDB_Host}, diff --git a/Source/Mosa.Utility.Configuration/MOSASettings.cs b/Source/Mosa.Utility.Configuration/MOSASettings.cs index 49ddd59601..0bbf460fc6 100644 --- a/Source/Mosa.Utility.Configuration/MOSASettings.cs +++ b/Source/Mosa.Utility.Configuration/MOSASettings.cs @@ -55,6 +55,18 @@ public string BochsApp set => Settings.SetValue(Name.AppLocation_Bochs, value); } + public string BochsBIOS + { + get => Settings.GetValue(Name.AppLocation_Bochs_BIOS, null); + set => Settings.SetValue(Name.AppLocation_Bochs_BIOS, value); + } + + public string BochsVGABIOS + { + get => Settings.GetValue(Name.AppLocation_Bochs_VGABIOS, null); + set => Settings.SetValue(Name.AppLocation_Bochs_VGABIOS, value); + } + public string CompileTimeFile { get => Settings.GetValue(Name.CompilerDebug_CompileTimeFile, null); @@ -121,10 +133,10 @@ public string EmulatorSerial set => Settings.SetValue(Name.Emulator_Serial, value); } - public string EmulatorSVGA + public string EmulatorGraphics { - get => Settings.GetValue(Name.Emulator_SVGA, "std"); - set => Settings.SetValue(Name.Emulator_SVGA, value); + get => Settings.GetValue(Name.Emulator_Graphics, "std"); + set => Settings.SetValue(Name.Emulator_Graphics, value); } public string EmulatorSerialHost @@ -145,6 +157,12 @@ public ushort EmulatorSerialPort set => Settings.SetValue(Name.Emulator_Serial_Port, value); } + public bool EmulatorAcceleration + { + get => Settings.GetValue(Name.Emulator_Acceleration, false); + set => Settings.SetValue(Name.Emulator_Acceleration, value); + } + public string FileSystem { get => Settings.GetValue(Name.Image_FileSystem, null); diff --git a/Source/Mosa.Utility.Configuration/Name.cs b/Source/Mosa.Utility.Configuration/Name.cs index 03ef8bae07..61588fcc2b 100644 --- a/Source/Mosa.Utility.Configuration/Name.cs +++ b/Source/Mosa.Utility.Configuration/Name.cs @@ -5,6 +5,8 @@ namespace Mosa.Utility.Configuration; public static class Name { public const string AppLocation_Bochs = "AppLocation.Bochs"; + public const string AppLocation_Bochs_BIOS = "AppLocation.Bochs.BIOS"; + public const string AppLocation_Bochs_VGABIOS = "AppLocation.Bochs.VGABIOS"; public const string AppLocation_GDB = "AppLocation.GDB"; public const string AppLocation_Mkisofs = "AppLocation.Mkisofs"; public const string AppLocation_Ndisasm = "AppLocation.Ndisasm"; @@ -60,8 +62,9 @@ public static class Name public const string Emulator_Serial_Host = "Emulator.Serial.Host"; public const string Emulator_Serial_Pipe = "Emulator.Serial.Pipe"; public const string Emulator_Serial_Port = "Emulator.Serial.Port"; + public const string Emulator_Graphics = "Emulator.Graphics"; + public const string Emulator_Acceleration = "Emulator.Acceleration"; - public const string Emulator_SVGA = "Emulator.SVGA"; public const string Explorer_DebugDiagnostic = "Explorer.DebugDiagnostic"; public const string Explorer_Filter = "Explorer.Filter"; public const string Explorer_Start = "Explorer.Start"; diff --git a/Source/Mosa.Utility.Launcher/BaseLauncher.cs b/Source/Mosa.Utility.Launcher/BaseLauncher.cs index 9ca0ab3d20..0037128b8c 100644 --- a/Source/Mosa.Utility.Launcher/BaseLauncher.cs +++ b/Source/Mosa.Utility.Launcher/BaseLauncher.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Reflection; +using System.Resources; using Mosa.Compiler.Framework; using Mosa.Utility.Configuration; @@ -41,21 +42,11 @@ protected virtual void OutputEvent(string status) protected static byte[] GetResource(string path, string name) { - var newname = path.Replace(".", "._").Replace(@"\", "._").Replace("/", "._").Replace("-", "_") + "." + name; - return GetResource(newname); - } - - protected static byte[] GetResource(string name) - { - var assembly = Assembly.GetExecutingAssembly(); - var stream = assembly.GetManifestResourceStream("Mosa.Utility.Launcher.Resources." + name); - var binary = new BinaryReader(stream); - return binary.ReadBytes((int)stream.Length); - } - - protected static string Quote(string location) - { - return '"' + location + '"'; + return GetResource($"{path + .Replace(".", "._") + .Replace(@"\", "._") + .Replace("/", "._") + .Replace("-", "_")}.{name}"); } protected Process CreateApplicationProcess(string app, string args) @@ -63,16 +54,17 @@ protected Process CreateApplicationProcess(string app, string args) OutputStatus($"Starting Application: {app}"); OutputStatus($"Arguments: {args}"); - var process = new Process(); - - process.StartInfo.FileName = app; - process.StartInfo.Arguments = args; - process.StartInfo.UseShellExecute = false; - process.StartInfo.RedirectStandardOutput = false; - process.StartInfo.RedirectStandardError = false; - process.StartInfo.CreateNoWindow = true; + var startInfo = new ProcessStartInfo + { + FileName = app, + Arguments = args, + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = false, + RedirectStandardError = false + }; - return process; + return new Process { StartInfo = startInfo }; } protected Process LaunchApplication(string app, string args) @@ -80,7 +72,7 @@ protected Process LaunchApplication(string app, string args) OutputStatus($"Launching Application: {app}"); OutputStatus($"Arguments: {args}"); - var start = new ProcessStartInfo + var startInfo = new ProcessStartInfo { FileName = app, Arguments = args, @@ -90,7 +82,7 @@ protected Process LaunchApplication(string app, string args) RedirectStandardError = true }; - return Process.Start(start); + return Process.Start(startInfo); } protected Process LaunchConsoleApplication(string app, string args) @@ -98,7 +90,7 @@ protected Process LaunchConsoleApplication(string app, string args) OutputStatus($"Launching Console Application: {app}"); OutputStatus($"Arguments: {args}"); - var start = new ProcessStartInfo + var startInfo = new ProcessStartInfo { FileName = app, Arguments = args, @@ -108,18 +100,17 @@ protected Process LaunchConsoleApplication(string app, string args) RedirectStandardError = false }; - return Process.Start(start); + return Process.Start(startInfo); } - protected string GetOutput(Process process) + protected static string GetOutput(Process process) { - var output = process.StandardOutput.ReadToEnd(); - process.WaitForExit(); + var output = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); - return output + error; + return $"{output}{error}"; } protected Process LaunchApplicationWithOutput(string app, string arg) @@ -132,11 +123,14 @@ protected Process LaunchApplicationWithOutput(string app, string arg) return process; } - protected string NullToEmpty(string value) + private static byte[] GetResource(string name) { - if (string.IsNullOrWhiteSpace(value)) - return string.Empty; + var assembly = Assembly.GetExecutingAssembly(); + var stream = assembly.GetManifestResourceStream($"Mosa.Utility.Launcher.Resources.{name}"); + if (stream == null) + throw new MissingManifestResourceException($"Cannot find resource: {name}"); - return value; + var binary = new BinaryReader(stream); + return binary.ReadBytes((int)stream.Length); } } diff --git a/Source/Mosa.Utility.Launcher/Builder.cs b/Source/Mosa.Utility.Launcher/Builder.cs index ae69c2e997..a2d5d0b7f1 100644 --- a/Source/Mosa.Utility.Launcher/Builder.cs +++ b/Source/Mosa.Utility.Launcher/Builder.cs @@ -43,19 +43,11 @@ public void Build() Counters.Clear(); IsSucccessful = false; - Stopwatch.StartNew(); + Stopwatch.Start(); try { - if (!Directory.Exists(MosaSettings.TemporaryFolder)) - { - Directory.CreateDirectory(MosaSettings.ImageFolder); - } - - if (!Directory.Exists(MosaSettings.ImageFolder)) - { - Directory.CreateDirectory(MosaSettings.ImageFolder); - } + Directory.CreateDirectory(MosaSettings.ImageFolder); if (string.IsNullOrEmpty(MosaSettings.SourceFiles[0])) { @@ -211,14 +203,14 @@ private byte[] GetLimineCFG() private void CreateVMDK(string source) { - var arg = $"convert -f raw -O vmdk {Quote(source)} {Quote(MosaSettings.ImageFile)}"; + var arg = $"convert -f raw -O vmdk \"{source}\" \"{MosaSettings.ImageFile}\""; LaunchApplicationWithOutput(MosaSettings.QemuImgApp, arg); } private void CreateVDI(string source) { - var arg = $"convert -f raw -O vdi {Quote(source)} {Quote(MosaSettings.ImageFile)}"; + var arg = $"convert -f raw -O vdi \"{source}\" \"{MosaSettings.ImageFile}\""; LaunchApplicationWithOutput(MosaSettings.QemuImgApp, arg); } @@ -231,7 +223,7 @@ private void LaunchNDISASM() var startingAddress = MosaSettings.BaseAddress + MultibootHeaderLength; var fileOffset = Linker.BaseFileOffset + MultibootHeaderLength; - var arg = $"-b 32 -o0x{startingAddress:x} -e0x{fileOffset:x} {Quote(MosaSettings.OutputFile)}"; + var arg = $"-b 32 -o0x{startingAddress:x} -e0x{fileOffset:x} \"{MosaSettings.OutputFile}\""; //var nasmfile = Path.Combine(LauncherSettings.ImageFolder, $"{Path.GetFileNameWithoutExtension(LauncherSettings.SourceFiles[0])}.nasm"); @@ -244,7 +236,7 @@ private void LaunchNDISASM() private void GenerateASMFile() { - OutputStatus($"Reko Disassembly: {MosaSettings.AsmFile}"); + OutputStatus($"Executing Reko Disassembly: {MosaSettings.AsmFile}"); var map = new Dictionary>(); diff --git a/Source/Mosa.Utility.Launcher/CheckOptions.cs b/Source/Mosa.Utility.Launcher/CheckOptions.cs index 8d14c43cdb..0e8964eb79 100644 --- a/Source/Mosa.Utility.Launcher/CheckOptions.cs +++ b/Source/Mosa.Utility.Launcher/CheckOptions.cs @@ -17,8 +17,8 @@ public static string Verify(MosaSettings settings) { "bochs" when settings.ImageFormat == "vdi" => "Bochs does not support the VDI image format", "bochs" when settings.ImageFormat == "vmdk" => "Bochs does not support the VMDK image format", - "vmware" when settings.ImageFormat == "img" => "VMware does not support the IMG image format", - "vmware" when settings.ImageFormat == "vdi" => "VMware does not support the VHD image format", + "vmware" when settings.ImageFormat == "img" => "VMware Workstation does not support the IMG image format", + "vmware" when settings.ImageFormat == "vdi" => "VMware Workstation does not support the VHD image format", "virtualbox" when settings.ImageFormat == "img" => "VirtualBox does not support the IMG file format", _ => null, }; diff --git a/Source/Mosa.Utility.Launcher/SimpleTCP.cs b/Source/Mosa.Utility.Launcher/SimpleTCP.cs index 62443e944f..111fa05efb 100644 --- a/Source/Mosa.Utility.Launcher/SimpleTCP.cs +++ b/Source/Mosa.Utility.Launcher/SimpleTCP.cs @@ -213,7 +213,7 @@ public int GetByte() var b = receivedData.Dequeue(); if (b == NewLine) - lines--; + Interlocked.Decrement(ref lines); return b; } @@ -237,7 +237,7 @@ public byte[] GetBytes() bytes[i] = b; if (b == NewLine) - lines--; + Interlocked.Decrement(ref lines); } return bytes; @@ -313,7 +313,7 @@ private void ReadAsyncCallback(IAsyncResult ar) receivedData.Enqueue(b); if (b == NewLine) - lines++; + Interlocked.Increment(ref lines); } } } diff --git a/Source/Mosa.Utility.Launcher/Starter.cs b/Source/Mosa.Utility.Launcher/Starter.cs index 95ae4fea5a..63719fef99 100644 --- a/Source/Mosa.Utility.Launcher/Starter.cs +++ b/Source/Mosa.Utility.Launcher/Starter.cs @@ -15,10 +15,12 @@ public class Starter : BaseLauncher { public MosaLinker Linker { get; } - public bool IsSucccessful { get; private set; } + public bool IsSuccessful { get; private set; } public Process Process { get; private set; } + private readonly object lockObject = new object(); + public Starter(MosaSettings mosaSettings, CompilerHooks compilerHooks) : base(mosaSettings, compilerHooks) { @@ -32,7 +34,7 @@ public Starter(MosaSettings mosaSettings, CompilerHooks compilerHooks, MosaLinke public bool Launch(bool waitForExit = false) { - IsSucccessful = false; + IsSuccessful = false; Process = null; try @@ -41,14 +43,14 @@ public bool Launch(bool waitForExit = false) if (MosaSettings.LauncherTest) { - IsSucccessful = StartTestMonitor(Process, "##PASS##"); - return IsSucccessful; + IsSuccessful = StartTestMonitor(Process, "##PASS##"); + return IsSuccessful; } if (MosaSettings.LauncherSerial) { - IsSucccessful = StartSerialMonitor(Process); - return IsSucccessful; + IsSuccessful = StartSerialMonitor(Process); + return IsSuccessful; } Process.Start(); @@ -67,11 +69,11 @@ public bool Launch(bool waitForExit = false) //Output(process.Output); } - IsSucccessful = true; + IsSuccessful = true; } catch (Exception e) { - IsSucccessful = false; + IsSuccessful = false; Process = null; OutputStatus($"Exception: {e}"); } @@ -82,7 +84,7 @@ public bool Launch(bool waitForExit = false) Process.WaitForExit(); } - return IsSucccessful; + return IsSuccessful; } private bool StartTestMonitor(Process process, string successText) @@ -101,7 +103,7 @@ private bool StartTestMonitor(Process process, string successText) { var line = client.GetLine(); - lock (this) + lock (lockObject) { OutputStatus(line); } @@ -123,8 +125,6 @@ private bool StartTestMonitor(Process process, string successText) OutputStatus("VM Output"); OutputStatus("========================"); - Thread.Sleep(50); // wait a bit for the process to start - if (!client.Connect(MosaSettings.EmulatorSerialHost, MosaSettings.EmulatorSerialPort, 10000)) return false; @@ -167,8 +167,7 @@ private bool StartTestMonitor(Process process, string successText) private bool StartSerialMonitor(Process process) { - var output = new StringBuilder(); - var success = false; + var success = false; // TODO: Why is this always false? var kill = false; var client = new SimpleTCP(); @@ -182,7 +181,7 @@ private bool StartSerialMonitor(Process process) { var line = client.GetLine(); - lock (this) + lock (lockObject) { OutputStatus(line); } @@ -198,8 +197,6 @@ private bool StartSerialMonitor(Process process) { process.Start(); - Thread.Sleep(50); // wait a bit for the process to start - OutputStatus("VM Output"); OutputStatus("========================"); @@ -253,10 +250,26 @@ private Process LaunchQemu() string qemuApp, qemuUefi; - var arg = new StringBuilder(); + var sb = new StringBuilder(); + + if (MosaSettings.EmulatorAcceleration) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + sb.Append("-accel whpx "); + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + sb.Append("-accel hvf "); + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + sb.Append("-accel kvm "); + else + throw new NotSupportedException("Requested unsupported QEMU acceleration for host platform."); + } - arg.Append($"-m {MosaSettings.EmulatorMemory}M"); - arg.Append($" -smp cores={MosaSettings.EmulatorCores}"); + sb.Append("-m "); + sb.Append(MosaSettings.EmulatorMemory); + sb.Append('M'); + + sb.Append(" -smp cores="); + sb.Append(MosaSettings.EmulatorCores); switch (MosaSettings.Platform.ToLowerInvariant()) { @@ -264,48 +277,48 @@ private Process LaunchQemu() { qemuApp = MosaSettings.QemuX86App; qemuUefi = MosaSettings.QemuEdk2X86; - arg.Append(" -cpu qemu32,+sse4.1,abm,bmi1,bmi2,popcnt"); + sb.Append(" -cpu qemu32,+sse4.1,abm,bmi1,bmi2,popcnt"); break; } case "x64": { qemuApp = MosaSettings.QemuX64App; qemuUefi = MosaSettings.QemuEdk2X64; - arg.Append(" -cpu qemu64,+sse4.1,abm,bmi1,bmi2,popcnt"); + sb.Append(" -cpu qemu64,+sse4.1,abm,bmi1,bmi2,popcnt"); break; } case "arm32": { qemuApp = MosaSettings.QemuARM32App; qemuUefi = MosaSettings.QemuEdk2ARM32; - arg.Append(" -cpu arm1176"); + sb.Append(" -cpu arm1176"); break; } case "arm64": { qemuApp = MosaSettings.QemuARM64App; qemuUefi = MosaSettings.QemuEdk2ARM64; - arg.Append(" -cpu cortex-a7"); + sb.Append(" -cpu cortex-a7"); break; } default: throw new CompilerException($"Unknown platform: {MosaSettings.Platform}"); } - switch (MosaSettings.EmulatorSVGA) + switch (MosaSettings.EmulatorGraphics) { - case "virtio": arg.Append(" -device virtio-vga"); break; - case "vmware": arg.Append(" -vga vmware"); break; - case "cirrus": arg.Append(" -vga cirrus"); break; - case "std": arg.Append(" -vga std"); break; + case "virtio": sb.Append(" -device virtio-vga"); break; + case "vmware": sb.Append(" -vga vmware"); break; + case "cirrus": sb.Append(" -vga cirrus"); break; + case "std": sb.Append(" -vga std"); break; } if (!MosaSettings.EmulatorDisplay || MosaSettings.LauncherTest) { - arg.Append(" -display none"); + sb.Append(" -display none"); } else { - arg.Append(RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? " -display cocoa" : " -display sdl"); + sb.Append(RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? " -display cocoa" : " -display sdl"); } var serial = MosaSettings.EmulatorSerial; @@ -316,39 +329,56 @@ private Process LaunchQemu() { case "pipe": { - arg.Append($" -serial pipe:{MosaSettings.EmulatorSerialPipe}"); + sb.Append(" -serial pipe:\""); + sb.Append(MosaSettings.EmulatorSerialPipe); + sb.Append('"'); break; } case "tcpserver": { - arg.Append( - $" -serial tcp:{MosaSettings.EmulatorSerialHost}:{MosaSettings.EmulatorSerialPort},server,nowait"); + sb.Append(" -serial tcp:"); + sb.Append(MosaSettings.EmulatorSerialHost); + sb.Append(':'); + sb.Append(MosaSettings.EmulatorSerialPort); + sb.Append(",server,nowait"); break; } case "tcpclient": { - arg.Append($" -serial tcp:{MosaSettings.EmulatorSerialHost}:,client,nowait"); + sb.Append(" -serial tcp:"); + sb.Append(MosaSettings.EmulatorSerialHost); + sb.Append(':'); + sb.Append(MosaSettings.EmulatorSerialPort); + sb.Append(",client,nowait"); break; } default: { - arg.Append(" -serial null"); + sb.Append(" -serial null"); break; } } - if (MosaSettings.EmulatorGDB) arg.Append($" -S -gdb tcp::{MosaSettings.GDBPort}"); + if (MosaSettings.EmulatorGDB) + { + sb.Append(" -S -gdb tcp::"); + sb.Append(MosaSettings.GDBPort); + } switch (MosaSettings.ImageFormat) { case "bin": { - arg.Append($" -kernel {Quote(MosaSettings.ImageFile)}"); + sb.Append(" -kernel \""); + sb.Append(MosaSettings.ImageFile); + sb.Append('"'); break; } default: { - arg.Append($" -drive format=raw,file={Quote(MosaSettings.ImageFile)}"); + sb.Append(" -drive format=raw,file=\""); + sb.Append(MosaSettings.ImageFile); + sb.Append('"'); break; } } @@ -357,67 +387,87 @@ private Process LaunchQemu() { case "bios": { - arg.Append($" -L {Quote(MosaSettings.QemuBIOS)}"); + sb.Append(" -L \""); + sb.Append(MosaSettings.QemuBIOS); + sb.Append('"'); break; } case "uefi": { - arg.Append($"-drive if=pflash,format=raw,readonly=on,file={Quote(qemuUefi)}"); + sb.Append(" -drive if=pflash,format=raw,readonly=on,file=\""); + sb.Append(qemuUefi); + sb.Append('"'); break; } } - return CreateApplicationProcess(qemuApp, arg.ToString()); + return CreateApplicationProcess(qemuApp, sb.ToString()); } private Process LaunchBochs() { OutputStatus("Launching Bochs"); - var bochsdirectory = Path.GetDirectoryName(MosaSettings.BochsApp); - - var logfile = Path.Combine(MosaSettings.TemporaryFolder, $"{Path.GetFileNameWithoutExtension(MosaSettings.ImageFile)}-bochs.log"); - var configfile = Path.Combine(MosaSettings.TemporaryFolder, $"{Path.GetFileNameWithoutExtension(MosaSettings.ImageFile)}.bxrc"); + var logFile = Path.Combine(MosaSettings.TemporaryFolder, $"{Path.GetFileNameWithoutExtension(MosaSettings.ImageFile)}-bochs.log"); + var configFile = Path.Combine(MosaSettings.TemporaryFolder, $"{Path.GetFileNameWithoutExtension(MosaSettings.ImageFile)}.bxrc"); var sb = new StringBuilder(); - sb.AppendLine($"megs: {MosaSettings.EmulatorMemory}"); + sb.Append("megs: "); + sb.AppendLine(MosaSettings.EmulatorMemory.ToString()); sb.AppendLine("ata0: enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14"); sb.AppendLine("cpuid: mmx=1,sep=1,simd=sse4_2,apic=xapic,aes=1,movbe=1,xsave=1"); sb.AppendLine("boot: cdrom,disk"); - sb.AppendLine($"log: {Quote(logfile)}"); + sb.Append("log: \""); + sb.Append(logFile); + sb.AppendLine("\""); - sb.AppendLine($"romimage: file={Quote(Path.Combine(bochsdirectory, "BIOS-bochs-latest"))}"); + sb.Append("romimage: file=\""); + sb.Append(MosaSettings.BochsBIOS); + sb.AppendLine("\""); - sb.AppendLine($"vgaromimage: file={Quote(Path.Combine(bochsdirectory, "VGABIOS-lgpl-latest"))}"); + sb.Append("vgaromimage: file=\""); + sb.Append(MosaSettings.BochsVGABIOS); + sb.AppendLine("\""); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) sb.AppendLine("display_library: x, options=gui_debug"); - sb.AppendLine($"ata0-master: type=disk,path={Quote(MosaSettings.ImageFile)},biosdetect=none,cylinders=0,heads=0,spt=0"); + sb.Append("ata0-master: type=disk,path=\""); + sb.Append(MosaSettings.ImageFile); + sb.AppendLine("\",biosdetect=none,cylinders=0,heads=0,spt=0"); - switch (MosaSettings.EmulatorSVGA) + switch (MosaSettings.EmulatorGraphics) { case "vbe": sb.AppendLine("vga: extension=vbe"); break; case "cirrus": sb.AppendLine("vga: extension=cirrus"); break; } + // FIXME: Bochs waits for the server to be available before starting the VM switch (MosaSettings.EmulatorSerial) { case "pipe": { - sb.Append($@"com1: enabled=1, mode=pipe-server, dev=\\.\pipe\{MosaSettings.EmulatorSerialPipe}"); + sb.Append("com1: enabled=1, mode=pipe-server, dev=\"\\\\.\\pipe\\"); + sb.Append(MosaSettings.EmulatorSerialPipe); + sb.AppendLine("\""); break; } case "tcpserver": { - sb.AppendLine($"com1: enabled=1, mode=socket-server, dev={MosaSettings.EmulatorSerialHost}:{MosaSettings.EmulatorSerialPort}"); + sb.Append("com1: enabled=1, mode=socket-server, dev="); + sb.Append(MosaSettings.EmulatorSerialHost); + sb.Append(':'); + sb.AppendLine(MosaSettings.EmulatorSerialPort.ToString()); break; } case "tcpclient": { - sb.AppendLine($"com1: enabled=1, mode=socket-client, dev={MosaSettings.EmulatorSerialHost}:{MosaSettings.EmulatorSerialPort}"); + sb.Append("com1: enabled=1, mode=socket-client, dev="); + sb.Append(MosaSettings.EmulatorSerialHost); + sb.Append(':'); + sb.AppendLine(MosaSettings.EmulatorSerialPort.ToString()); break; } } @@ -425,12 +475,14 @@ private Process LaunchBochs() if (MosaSettings.EmulatorGDB) { // Untested - sb.AppendLine($"gdbstub: enabled=1, port={MosaSettings.GDBPort}, text_base=0, data_base=0, bss_base=0"); + sb.Append("gdbstub: enabled=1, port="); + sb.Append(MosaSettings.GDBPort); + sb.AppendLine(", text_base=0, data_base=0, bss_base=0"); } - File.WriteAllText(configfile, sb.ToString()); + File.WriteAllText(configFile, sb.ToString()); - return CreateApplicationProcess(MosaSettings.BochsApp, $"-q -f {Quote(configfile)}"); + return CreateApplicationProcess(MosaSettings.BochsApp, $"-q -f \"{configFile}\""); } private Process LaunchVMware() @@ -444,9 +496,13 @@ private Process LaunchVMware() sb.AppendLine("config.version = \"8\""); sb.AppendLine("virtualHW.version = \"17\""); - sb.AppendLine($"memsize = {Quote(MosaSettings.EmulatorMemory.ToString())}"); + sb.Append("memsize = \""); + sb.Append(MosaSettings.EmulatorMemory); + sb.AppendLine("\""); - sb.AppendLine($"displayName = \"MOSA - {Path.GetFileNameWithoutExtension(MosaSettings.SourceFiles[0])}\""); + sb.Append("displayName = \"MOSA - "); + sb.Append(Path.GetFileNameWithoutExtension(MosaSettings.SourceFiles[0])); + sb.AppendLine("\""); sb.AppendLine("guestOS = \"other\""); sb.AppendLine("priority.grabbed = \"normal\""); @@ -454,10 +510,15 @@ private Process LaunchVMware() sb.AppendLine("virtualHW.productCompatibility = \"hosted\""); sb.AppendLine("numvcpus = \"1\""); - sb.AppendLine($"cpuid.coresPerSocket = {Quote(MosaSettings.EmulatorCores.ToString())}"); + sb.Append("cpuid.coresPerSocket = \""); + sb.Append(MosaSettings.EmulatorCores); + sb.AppendLine("\""); sb.AppendLine("ide0:0.present = \"TRUE\""); - sb.AppendLine("ide0:0.fileName = " + Quote(MosaSettings.ImageFile)); + + sb.Append("ide0:0.fileName = \""); + sb.Append(MosaSettings.ImageFile); + sb.AppendLine("\""); sb.AppendLine("sound.present = \"TRUE\""); sb.AppendLine("sound.opl3.enabled = \"TRUE\""); @@ -466,13 +527,15 @@ private Process LaunchVMware() sb.AppendLine("floppy0.present = \"FALSE\""); // COM1 - if (NullToEmpty(MosaSettings.EmulatorSerial) == "pipe") + if (!string.IsNullOrEmpty(MosaSettings.EmulatorSerial) && MosaSettings.EmulatorSerial == "pipe") { sb.AppendLine("serial1.present = \"TRUE\""); sb.AppendLine("serial1.yieldOnMsrRead = \"FALSE\""); sb.AppendLine("serial1.fileType = \"pipe\""); - sb.AppendLine($"serial1.fileName = \"\\\\.\\pipe\\{MosaSettings.EmulatorSerialPipe}\""); + sb.Append("serial1.fileName = \"\\\\.\\pipe\\"); + sb.Append(MosaSettings.EmulatorSerialPipe); + sb.AppendLine("\""); sb.AppendLine("serial1.pipe.endPoint = \"server\""); sb.AppendLine("serial1.tryNoRxLoss = \"FALSE\""); @@ -486,15 +549,15 @@ private Process LaunchVMware() File.WriteAllText(configFile, sb.ToString()); - var arg = Quote(configFile) + " -x -q"; + var args = $"\"{configFile}\" -x -q"; if (!string.IsNullOrWhiteSpace(MosaSettings.VmwareWorkstationApp)) { - return CreateApplicationProcess(MosaSettings.VmwareWorkstationApp, arg); + return CreateApplicationProcess(MosaSettings.VmwareWorkstationApp, args); } return !string.IsNullOrWhiteSpace(MosaSettings.VmwarePlayerApp) - ? CreateApplicationProcess(MosaSettings.VmwarePlayerApp, arg) + ? CreateApplicationProcess(MosaSettings.VmwarePlayerApp, args) : null; } @@ -519,7 +582,7 @@ private Process LaunchVirtualBox() LaunchApplication(MosaSettings.VirtualBoxApp, $"createvm --name {MosaSettings.OSName} --ostype Other --register").WaitForExit(); LaunchApplication(MosaSettings.VirtualBoxApp, $"modifyvm {MosaSettings.OSName} --memory {MosaSettings.EmulatorMemory} --cpus {MosaSettings.EmulatorCores} --graphicscontroller vmsvga").WaitForExit(); LaunchApplication(MosaSettings.VirtualBoxApp, $"storagectl {MosaSettings.OSName} --name Controller --add ide --controller PIIX4").WaitForExit(); - LaunchApplication(MosaSettings.VirtualBoxApp, $"storageattach {MosaSettings.OSName} --storagectl Controller --port 0 --device 0 --type hdd --medium {Quote(MosaSettings.ImageFile)}").WaitForExit(); + LaunchApplication(MosaSettings.VirtualBoxApp, $"storageattach {MosaSettings.OSName} --storagectl Controller --port 0 --device 0 --type hdd --medium \"{MosaSettings.ImageFile}\"").WaitForExit(); return CreateApplicationProcess(MosaSettings.VirtualBoxApp, $"startvm {MosaSettings.OSName}"); } @@ -538,8 +601,9 @@ private void LaunchDebugger() sb.Append("-gdb-port "); sb.Append(MosaSettings.GDBPort); sb.Append(' '); - sb.Append("-image "); - sb.Append(Quote(MosaSettings.ImageFile)); + sb.Append("-image \""); + sb.Append(MosaSettings.ImageFile); + sb.Append('"'); LaunchApplication("Mosa.Tool.Debugger.exe", sb.ToString()); } @@ -577,12 +641,13 @@ private void LaunchGDB() OutputStatus("=================="); sb.Clear(); - sb.Append("-d "); - sb.Append(Quote(MosaSettings.TemporaryFolder)); - sb.Append(" -s "); - sb.Append(Quote(Path.Combine(MosaSettings.TemporaryFolder, Path.ChangeExtension(MosaSettings.ImageFile, ".bin")!))); - sb.Append(" -x "); - sb.Append(Quote(gdbScript)); + sb.Append("-d \""); + sb.Append(MosaSettings.TemporaryFolder); + sb.Append("\" -s \""); + sb.Append(Path.Combine(MosaSettings.TemporaryFolder, Path.ChangeExtension(MosaSettings.ImageFile, ".bin")!)); + sb.Append("\" -x \""); + sb.Append(gdbScript); + sb.Append('"'); LaunchConsoleApplication(MosaSettings.GDBApp, sb.ToString()); }