Merge branch 'master' into fix/vgacanvas

This commit is contained in:
Quajak 2020-10-21 12:53:47 +02:00 committed by GitHub
commit b980508ed3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 1303 additions and 478 deletions

22
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,22 @@
---
name: Bug report
about: For bugs in Cosmos
title: ''
labels: Bug
assignees: ''
---
#### Area of Cosmos - What area of Cosmos are we dealing with?
#### Expected Behaviour - What do you think that should happen?
#### Actual Behaviour - What unexpectedly happens?
#### Reproduction - How did you get this error to appear?
#### Version - Were you using the User Kit or Dev Kit? And what User Kit version or Dev Kit commit (Cosmos, IL2CPU, X#)?

View file

@ -0,0 +1,29 @@
---
name: Build Error and Visual Studio Problems
about: For errors when trying to build a Cosmos Kernel or use VS
title: ''
labels: ''
assignees: ''
---
Have you checked Github Issues for similar errors?
**Exception**
Post the exception returned by Visual Studio
** VS Output Logs **
Post the entire output log given by Visual Studio for the build
**To Reproduce**
Describe any changes done to a clean kernel for this error to occur.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Context**
Before posting please confirm that the following are in order
[ ] Both Cosmos VS Extensions are installed
[ ] The Cosmos nuget packages are installed
Add any other context about the problem which might be helpful.

View file

@ -0,0 +1,22 @@
---
name: Feature request
about: Suggest an idea for Cosmos
title: ''
labels: Question
assignees: ''
---
Have you checked for similar suggestions?
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -0,0 +1,28 @@
---
name: Installation Error
about: For errors while trying to install Cosmos
title: ''
labels: 'Area: Installer'
assignees: ''
---
**Describe the problem**
A clear and concise description of where the installation is going wrong.
**Steps of installation up to now**
Steps to reproduce the behavior:
**Expected behavior**
A clear and concise description of what you expected to happen.
**Logs**
Please post the entire log given by Cosmos. For long logs please use pastebin.
**Steup (please complete the following information):**
- Cosmos Version (Userkit/Devkit)
- Are you using an admin account?
- VS Version if applicable
**Additional context**
Add any other context about the problem here.

View file

@ -0,0 +1,28 @@
---
name: Installation Problem
about: Create a report to help us improve
title: ''
labels: 'Area: Installer'
assignees: ''
---
**Describe the problem**
A clear and concise description of where the installation is going wrong/what error messages you got.
**Steps of installation up to now**
What steps of the installation have you done up to now:
**Expected behavior**
A clear and concise description of what you expected to happen.
**Logs**
Please post the entire log given by Cosmos. For long logs please use pastebin.
**Setup (please complete the following information):**
- Cosmos Version (Userkit/Devkit)
- Are you using an admin account?
- VS Version if applicable
**Additional context**
Add any other context about the problem here.

20
.github/ISSUE_TEMPLATE/plug-request.md vendored Normal file
View file

@ -0,0 +1,20 @@
---
name: Plug request
about: Suggest that a certain method should be plugged
title: ''
labels: ''
assignees: ''
---
**What is the usecase for this plug**
A clear and concise description of where the plug is needed
** Complexity of plug **
Can this plug be added without requiring new drivers or a lot of work? (Methods requiring Linq, Reflection or Networking etc. are too complex for this request)
**Describe alternatives you've considered**
Are there ways to work around this plug not existing?
**Additional context**
Add any other context about the plug request here.

View file

@ -30,7 +30,7 @@
</PropertyGroup>
<PropertyGroup>
<CommonVersion>0.1.0-build18</CommonVersion>
<CommonVersion>0.1.0-build37</CommonVersion>
<IL2CPUVersion>0.1.0-build355</IL2CPUVersion>
<XSharpVersion>0.1.0-build562</XSharpVersion>
</PropertyGroup>

View file

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Cosmos.Build.Common;
using Cosmos.Debug.DebugConnectors;
using Cosmos.Debug.Hosts;
namespace Cosmos.TestRunner.Core
{
partial class Engine
{
private void RunIsoInQemu(string iso, string harddisk, string workingDir)
{
if (!File.Exists(harddisk))
{
throw new FileNotFoundException("Harddisk file not found!", harddisk);
}
var xParams = new Dictionary<string, string>
{
{BuildPropertyNames.IsoFileString, iso}
};
var xDebugConnector = new DebugConnectorPipeClient("Cosmos\\Serial");
InitializeDebugConnector(xDebugConnector);
var xQemu = new Qemu(xParams, RunWithGDB, harddisk)
{
OnShutDown = (a, b) => { mKernelRunning = false; },
RedirectOutput = false,
LogError = s => OutputHandler.LogDebugMessage(s),
LogOutput = s => OutputHandler.LogDebugMessage(s)
};
HandleRunning(xDebugConnector, xQemu);
}
}
}

View file

@ -54,6 +54,9 @@ namespace Cosmos.TestRunner.Core
case RunTargetEnum.Bochs:
RunTask("RunISO", () => RunIsoInBochs(xIsoFile, xHarddiskPath, workingDirectory));
break;
case RunTargetEnum.Qemu:
RunTask("RunISO", () => RunIsoInQemu(xIsoFile, xHarddiskPath, workingDirectory));
break;
case RunTargetEnum.VMware:
RunTask("RunISO", () => RunIsoInVMware(xIsoFile, xHarddiskPath));
break;

View file

@ -106,7 +106,6 @@ namespace Cosmos.TestRunner.Core
foreach (var xTarget in RunTargets)
{
yield return new RunConfiguration(isElf: true, runTarget: xTarget);
//yield return new RunConfiguration(isElf: false, runTarget: xTarget);
}
}
}

View file

@ -4,6 +4,7 @@
{
Bochs,
VMware,
HyperV
HyperV,
Qemu
}
}

View file

@ -9,6 +9,11 @@
{
IsELF = isElf;
RunTarget = runTarget;
if (runTarget == RunTargetEnum.Qemu)
{
IsELF = false;
}
}
}
}

View file

@ -17,6 +17,7 @@ namespace Cosmos.TestRunner.Full
yield return RunTargetEnum.Bochs;
//yield return RunTargetEnum.VMware;
//yield return RunTargetEnum.HyperV;
//yield return RunTargetEnum.Qemu;
}
}

View file

@ -39,6 +39,7 @@ namespace Cosmos.Compiler.Tests.Bcl
DelegatesTest.Execute();
EventsTest.Execute();
RandomTests.Execute();
ConvertTests.Execute();
// System.Collections
HashtableTest.Execute();

View file

@ -0,0 +1,23 @@
using Cosmos.TestRunner;
using System;
using System.Collections.Generic;
using System.Text;
namespace Cosmos.Compiler.Tests.Bcl.System
{
public static class ConvertTests
{
public static void Execute()
{
Assert.AreEqual("1010", Convert.ToString(10, 2), "Convert.ToString(int, 2) works");
Assert.AreEqual("12", Convert.ToString(10, 8), "Convert.ToString(int, 8) works");
Assert.AreEqual("10", Convert.ToString(10, 10), "Convert.ToString(int, 10) works");
Assert.AreEqual("A", Convert.ToString(10, 16), "Convert.ToString(int, 16) works");
Assert.AreEqual("11000100000", Convert.ToString(1568, 2), "Convert.ToString(int, 2) works");
Assert.AreEqual("3040", Convert.ToString(1568, 8), "Convert.ToString(int, 8) works");
Assert.AreEqual("1568", Convert.ToString(1568, 10), "Convert.ToString(int, 10) works");
Assert.AreEqual("620", Convert.ToString(1568, 16), "Convert.ToString(int, 16) works");
}
}
}

View file

@ -12,7 +12,6 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO
/// </summary>
public static void Execute(Debugger mDebugger)
{
mDebugger.Send("START TEST: Delete a directory:");
Directory.CreateDirectory(@"0:\TestDir1");
Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 wasn't created!");
@ -97,22 +96,20 @@ namespace Cosmos.Kernel.Tests.Fat.System.IO
mDebugger.Send("");
#if false
mDebugger.Send("START TEST: Delete a file with Directory.Delete:");
File.Create(@"0:\file1.txt");
mDebugger.Send("START TEST: Creating a subdirecty with Directory.CreateDirectory:");
try
{
Directory.Delete(@"0:\file1.txt");
}
catch (Exception e)
{
Assert.IsTrue(File.Exists(@"0:\file1.txt"), "The file was deleted by Directory.Delete.");
}
Directory.CreateDirectory(@"0:\TestDir1");
Assert.IsTrue(Directory.Exists(@"0:\TestDir1"), "TestDir1 was created!");
Directory.CreateDirectory(@"0:\TestDir1\test");
Assert.IsTrue(Directory.Exists(@"0:\TestDir1\test"), "test subdirectory was created!");
Directory.Delete(@"0:\TestDir1\test");
Assert.IsFalse(Directory.Exists(@"0:\TestDir1\test"), "test subdirectory was deleted!");
Directory.Delete(@"0:\TestDir1");
Assert.IsFalse(Directory.Exists(@"0:\TestDir1"), "TestDir1 was deleted!");
mDebugger.Send("END TEST");
mDebugger.Send("");
#endif
mDebugger.Send("START TEST: Create a directory with a Long Filename:");
Directory.CreateDirectory(@"0:\TestDir1");

View file

@ -83,6 +83,9 @@ namespace GraphicTest
pen.Color = Color.MediumPurple;
aCanvas.DrawPolygon(pen, new Point(200, 250), new Point(250, 300), new Point(220, 350), new Point(210, 275));
/* Color.FromName */
aCanvas.Clear(Color.FromName("Navy"));
/* A LimeGreen rectangle */
pen.Color = Color.LimeGreen;
aCanvas.DrawRectangle(pen, 450, 300, 80, 60);
@ -114,7 +117,9 @@ namespace GraphicTest
aCanvas.DrawImage(bitmap, new Point(0, 0));
aCanvas.DrawImage(bitmap2, new Point(200, 0));
//Scale Bitmap
aCanvas.DrawImage(bitmap,0,0,50,50);
aCanvas.DrawImageAlpha(bitmap3, new Point(0, 300));
/* Drawing ellipses */

View file

@ -22,9 +22,12 @@ namespace ProcessorTests
{
try
{
TestMultibootMemoryMap();
TestGetRam();
TestVendorNameIsNotBlank();
TestCycleCount();
TestCycleRateIsNotZero();
TestMultiboot();
TestController.Completed();
}
@ -36,6 +39,27 @@ namespace ProcessorTests
}
}
public void TestGetRam()
{
Assert.IsTrue(CPU.GetAmountOfRAM() > 0, "CPU.GetAmountOfRAM() returns a positive value: " + CPU.GetAmountOfRAM());
}
public void TestMultibootMemoryMap()
{
var memoryMap = CPU.GetMemoryMap();
for (int i = 0; i < memoryMap.Length; i++)
{
mDebugger.Send($"Memory Map: {memoryMap[i].Address} " +
$"Length: {memoryMap[i].Length} Type: {memoryMap[i].Type}");
}
Assert.IsTrue(memoryMap.Length != 0, "Memory Map is not empty! Length " + memoryMap.Length);
}
public void TestMultiboot()
{
Assert.IsTrue(Multiboot.GetMBIAddress() != 0, $"Multiboot.GetMBIAddress works {Multiboot.GetMBIAddress()}");
}
public void TestBrandStringBlank()
{
string brandString = CPU.GetCPUBrandString();

View file

@ -1,4 +1,6 @@
namespace Cosmos.Core
using Cosmos.Debug.Kernel;
namespace Cosmos.Core
{
/// <summary>
/// Bootstrap class. Used to invoke pre-boot methods.
@ -22,7 +24,7 @@
/// <summary>
/// Multiboot header pointer.
/// </summary>
public static Multiboot.Header* header;
public static Multiboot.Header* MultibootHeader;
/// <summary>
/// VBE mode info pointer.
@ -59,13 +61,10 @@
*/
CPU.InitFloat();
header = (Multiboot.Header*)Multiboot.GetMBIAddress();
MultibootHeader = (Multiboot.Header*)Multiboot.GetMBIAddress();
modeinfo = (Core.VBE.ModeInfo*)header->vbeModeInfo;
controllerinfo = (Core.VBE.ControllerInfo*)header->vbeControlInfo;
// Managed_Memory_System.ManagedMemory.Initialize();
// Managed_Memory_System.ManagedMemory.SetUpMemoryArea();
modeinfo = (Core.VBE.ModeInfo*)MultibootHeader->vbeModeInfo;
controllerinfo = (Core.VBE.ControllerInfo*)MultibootHeader->vbeControlInfo;
}
}
}

View file

@ -1,5 +1,7 @@
#define COSMOSDEBUG
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using IL2CPU.API.Attribs;
namespace Cosmos.Core
@ -110,8 +112,6 @@ namespace Cosmos.Core
return xResult;
}
/// <summary>
/// Get CPU vendor name.
/// </summary>
@ -300,7 +300,8 @@ namespace Cosmos.Core
if (!(rs == ""))
{
return rs;
} else
}
else
{
throw new NotSupportedException();
}
@ -308,14 +309,12 @@ namespace Cosmos.Core
throw new NotSupportedException();
}
/// <summary>
/// Check if can read CPU ID. Plugged.
/// </summary>
/// <returns>non-zero if can read.</returns>
/// <exception cref="NotImplementedException">Thrown on fatal error, contact support.</exception>
internal static int CanReadCPUID() => throw new NotImplementedException();
public static int CanReadCPUID() => throw new NotImplementedException();
/// <summary>
/// Read CPU ID. Plugged.
@ -326,7 +325,7 @@ namespace Cosmos.Core
/// <param name="ecx">ecx.</param>
/// <param name="edx">edx.</param>
/// <exception cref="NotImplementedException">Thrown on fatal error, contact support.</exception>
internal static void ReadCPUID(uint type, ref int eax, ref int ebx, ref int ecx, ref int edx) => throw new NotImplementedException();
public static void ReadCPUID(uint type, ref int eax, ref int ebx, ref int ecx, ref int edx) => throw new NotImplementedException();
/// <summary>
/// Read timestamp counter. Plugged.
@ -341,5 +340,107 @@ namespace Cosmos.Core
/// <returns>ulong value.</returns>
/// <exception cref="NotImplementedException">Thrown on fatal error, contact support.</exception>
internal static ulong ReadFromModelSpecificRegister() => throw new NotImplementedException();
/// <summary>
/// Checks if Multiboot returned a memory map
/// </summary>
/// <returns></returns>
public static unsafe bool MemoryMapExists()
{
return (Bootstrap.MultibootHeader->Flags & 1 << 6) == 64;
}
/// <summary>
/// Get the Memory Map Information from Multiboot
/// </summary>
/// <returns>Returns an array of MemoryMaps containing the Multiboot Memory Map information. The array may have empty values at the end.</returns>
public static unsafe MemoryMap[] GetMemoryMap()
{
if (!MemoryMapExists())
{
throw new Exception("No Memory Map was returned by Multiboot");
}
var rawMap = new RawMemoryMap[64];
var currentMap = (RawMemoryMap*)Bootstrap.MultibootHeader->memMapAddress;
int counter = 0;
while ((uint)currentMap < (Bootstrap.MultibootHeader->memMapAddress + Bootstrap.MultibootHeader->memMapLength) && counter < 64)
{
rawMap[counter++] = *currentMap;
currentMap = (RawMemoryMap*)((uint*)currentMap + ((currentMap->Size + 4 )>> 2)); //The size is in bits, not bytes
if (currentMap->Size == 0)
{
break;
}
}
if (counter >= 64)
{
throw new Exception("Memory Map returned too many segments");
}
var entireMap = new MemoryMap[counter];
for (int i = 0; i < counter; i++)
{
var rawMemoryMap = rawMap[i];
entireMap[i] = new MemoryMap
{
Address = (ulong)rawMemoryMap.HighBaseAddr << 32 | rawMemoryMap.LowBaseAddr,
Length = (ulong)rawMemoryMap.HighLength << 32 | rawMemoryMap.LowLength,
Type = rawMemoryMap.Type
};
}
return entireMap;
}
}
public class MemoryMap
{
/// <summary>
/// Base Address of the memory region
/// </summary>
public ulong Address;
/// <summary>
/// Length in bytes of the region
/// </summary>
public ulong Length;
/// <summary>
/// Type of RAM in region. 1 is available. 3 is for ACPI. All other is unavailable
/// </summary>
public uint Type;
}
[StructLayout(LayoutKind.Explicit, Size = 24)]
public struct RawMemoryMap
{
/// <summary>
/// Size of this entry
/// </summary>
[FieldOffset(0)]
public uint Size;
/// <summary>
/// Low 32 bits of the base address
/// </summary>
[FieldOffset(4)]
public uint LowBaseAddr;
/// <summary>
/// High 32 bits of the base address
/// </summary>
[FieldOffset(8)]
public uint HighBaseAddr;
/// <summary>
/// Low 32 bits of the length of memory block in bytes
/// </summary>
[FieldOffset(12)]
public uint LowLength;
/// <summary>
/// High 32 bits of the length of memory block in bytes
/// </summary>
[FieldOffset(16)]
public uint HighLength;
/// <summary>
/// Type of memory area, 1 if usable RAM, everything else unusable.
/// </summary>
[FieldOffset(20)]
public uint Type;
}
}

View file

@ -8,6 +8,7 @@ namespace Cosmos.Core
/// </summary>
public unsafe class MemoryOperations
{
#region Fill
/// <summary>
/// Fill memory block. Plugged.
/// </summary>
@ -183,6 +184,23 @@ namespace Cosmos.Core
}
}
/// <summary>
/// Fill source to destination.
/// </summary>
/// <param name="dest">Destination.</param>
/// <param name="src">Source.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe void Fill(sbyte[] dest, sbyte[] src)
{
fixed (sbyte* destPtr = dest)
fixed (sbyte* srcPtr = src)
{
Copy(destPtr, srcPtr, dest.Length);
}
}
#endregion Fill
#region Copy
/// <summary>
/// Copy source to destination.
/// plugged.
@ -329,19 +347,6 @@ namespace Cosmos.Core
}
}
/// <summary>
/// Fill source to destination.
/// </summary>
/// <param name="dest">Destination.</param>
/// <param name="src">Source.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe void Fill(sbyte[] dest, sbyte[] src)
{
fixed (sbyte* destPtr = dest)
fixed (sbyte* srcPtr = src)
{
Copy(destPtr, srcPtr, dest.Length);
}
}
#endregion Copy
}
}

View file

@ -139,7 +139,7 @@ namespace Cosmos.Core
/// <returns>True if is available, false if not</returns>
public static bool IsAvailable()
{
if ((Bootstrap.header->Flags & VBEINFO_PRESENT) == 0)
if ((Bootstrap.MultibootHeader->Flags & VBEINFO_PRESENT) == 0)
{
return false;
}

View file

@ -1,64 +0,0 @@
namespace Cosmos.Core
{
/// <summary>
/// ProcessorInformation class. Used to get vendor information from the CPU.
/// </summary>
public unsafe class ProcessorInformation
{
/// <summary>
/// Returns the Processor's vendor name
/// </summary>
/// <returns>CPU Vendor name</returns>
public static string GetVendorName()
{
if (CanReadCPUID() > 0)
{
int[] raw = new int[3];
fixed (int* ptr = raw)
FetchCPUVendor(ptr);
return new string(new char[] {
(char)(raw[0] >> 24),
(char)((raw[0] >> 16) & 0xff),
(char)((raw[0] >> 8) & 0xff),
(char)(raw[0] & 0xff),
(char)(raw[1] >> 24),
(char)((raw[1] >> 16) & 0xff),
(char)((raw[1] >> 8) & 0xff),
(char)(raw[1] & 0xff),
(char)(raw[2] >> 24),
(char)((raw[2] >> 16) & 0xff),
(char)((raw[2] >> 8) & 0xff),
(char)(raw[2] & 0xff),
});
}
else
return "\0";
}
/// <summary>
/// Check if can read CPU ID.
/// </summary>
/// <returns>int value.</returns>
internal static int CanReadCPUID() => 0; //plugged
/// <summary>
/// Fetch CPU vendor.
/// </summary>
/// <param name="target">pointer to target.</param>
internal static void FetchCPUVendor(int* target) { } //plugged
/// <summary>
/// Returns the number of CPU cycles since startup of the current CPU core
/// </summary>
/// <returns>Number of CPU cycles since startup</returns>
public static long GetCycleCount() => 0; //plugged
/// <summary>
/// Returns the number of CPU cycles per seconds
/// </summary>
/// <returns>Number of CPU cycles per seconds</returns>
public static long GetCycleRate() => 0; //plugged
}
}

View file

@ -1,12 +1,25 @@
using Cosmos.Core;
using IL2CPU.API.Attribs;
using XSharp;
using XSharp.Assembler;
namespace Cosmos.Core_Asm
{
[Plug(Target = typeof(Multiboot))]
public class MultibootImpl
{
[PlugMethod(Assembler = typeof(MultibootAsm))]
public static uint GetMBIAddress() => throw null;
[PlugMethod(Assembler = typeof(MultibootImplAsm))]
public static uint GetMBIAddress()
{
return 0;
}
}
public class MultibootImplAsm : AssemblerMethod
{
public override void AssembleNew(Assembler aAssembler, object aMethodInfo)
{
XS.Push("MultiBootInfo_Structure", isIndirect: true);
}
}
}

View file

@ -1,212 +0,0 @@
using Cosmos.Core;
using IL2CPU.API;
using IL2CPU.API.Attribs;
using XSharp;
namespace Cosmos.Core_Asm
{
[Plug(Target = typeof(ProcessorInformation))]
public unsafe class ProcessorInformationImpl
{
/* The following three int*-pointers are needed for the lea instruction due to the following reason:
* When comiling, the IL-code will be translated into x86-ASM, which has specific and unique names for local variables.
* To access these local variables, I have to pass their excat name to the instruction in question. This is rather
* difficult with reflection, if these variables reside in the local function scope. For this reason, I move the
* pointer to class scope to access them quicker and more easily
*/
private static int* __cyclesrdtscptr, __raterdmsrptr, __vendortargetptr;
private static long __ticktate = -1;
/// <summary>
/// Returns the number of CPU cycles since startup
/// </summary>
/// <returns>Number of CPU cycles</returns>
public static long GetCycleCount()
{
int[] val = new int[2];
fixed (int* ptr = val)
{
__cyclesrdtsc(ptr);
}
return ((long)val[0] << 32) | (uint)val[1];
}
/// <summary>
/// Returns the CPU cycle rate (in cycles/µs)
/// </summary>
/// <returns>CPU cycle rate</returns>
public static long GetCycleRate()
{
if (__ticktate == -1)
{
int[] raw = new int[4];
fixed (int* ptr = raw)
{
__raterdmsr(ptr);
}
ulong l1 = (ulong)__maxrate();
ulong l2 = ((ulong)raw[0] << 32) | (uint)raw[1];
ulong l3 = ((ulong)raw[2] << 32) | (uint)raw[3];
__ticktate = (long)l2; // (long)((double)l1 * l3 / l2);
}
return __ticktate;
}
/// <summary>
/// Copies the maximum cpu rate set by the bios at startup to the given int pointer
/// </summary>
[Inline]
private static int __maxrate()
{
/*
* mov eax, 16h
* cpuid
* and eax, ffffh
* ret
*/
XS.Set(XSRegisters.EAX, 0x00000016);
XS.Cpuid();
XS.And(XSRegisters.EAX, 0x0000ffff);
XS.Return();
return 0;
}
/// <summary>
/// Copies the cycle count to the given int pointer
/// </summary>
[Inline]
private static void __cyclesrdtsc(int* target)
{
/*
* push eax
* push ecx
* push edx
* lea esi, target
* rdtsc
* mov [esi+4], eax
* mov [esi], edx
* pop edx
* pop ecx
* pop eax
* ret
*/
__cyclesrdtscptr = target;
string intname = LabelName.GetStaticFieldName(typeof(CPUImpl).GetField(nameof(__cyclesrdtscptr)));
XS.Push(XSRegisters.EAX);
XS.Push(XSRegisters.ECX);
XS.Push(XSRegisters.EDX);
XS.Lea(XSRegisters.ESI, intname);
XS.Rdtsc();
XS.Set(XSRegisters.ESI, XSRegisters.EAX, destinationIsIndirect: true, destinationDisplacement: 4);
XS.Set(XSRegisters.ESI, XSRegisters.EDX, destinationIsIndirect: true);
XS.Push(XSRegisters.EDX);
XS.Push(XSRegisters.ECX);
XS.Push(XSRegisters.EAX);
XS.Return();
}
/// <summary>
/// Copies the cycle rate to the given int pointer
/// </summary>
[Inline]
private static void __raterdmsr(int* target)
{
/*
* ; esi register layout: (mperf_hi, mperf_lo, aperf_hi, aperf_lo)
* ;
* ; int* ptr = new int[4];
* ;
* lea esi, ptr ;equivalent with `mov esi, &ptr`
* mov ecx, e7h
* rdmsr
* mov [esi + 4], eax
* mov [esi], edx
* mov ecx, e8h
* rdmsr
* mov [esi + 12], eax
* mov [esi + 8], edx
* xor eax, eax
* ret
*/
__raterdmsrptr = target;
string intname = LabelName.GetStaticFieldName(typeof(CPUImpl).GetField(nameof(__raterdmsrptr)));
XS.Lea(XSRegisters.ESI, intname);
XS.Set(XSRegisters.ECX, 0xe7);
XS.Rdmsr();
XS.Set(XSRegisters.EAX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 4);
XS.Set(XSRegisters.EDX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 0);
XS.Set(XSRegisters.ECX, 0xe8);
XS.Rdmsr();
XS.Set(XSRegisters.EAX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 12);
XS.Set(XSRegisters.EDX, XSRegisters.ESI, destinationIsIndirect: true, destinationDisplacement: 8);
XS.Xor(XSRegisters.EAX, XSRegisters.EAX); // XS.Set(XSRegisters.EAX, 0);
XS.Return();
}
[Inline]
internal static void FetchCPUVendor(int* target)
{
/*
* lea esi, target
* xor eax, eax
* cpuid
* mov [esi], ebx
* mov [esi + 4], edx
* mov [esi + 8], ecx
* ret
*/
__vendortargetptr = target;
string intname = LabelName.GetStaticFieldName(typeof(CPUImpl).GetField(nameof(__vendortargetptr)));
XS.Lea(XSRegisters.ESI, intname); // new Lea { DestinationReg = RegistersEnum.ESI, SourceRef = ElementReference.New(intname) };
XS.Cpuid();
XS.Set(XSRegisters.ESI, XSRegisters.EBX, destinationIsIndirect: true);
XS.Set(XSRegisters.ESI, XSRegisters.EDX, destinationIsIndirect: true, destinationDisplacement: 4);
XS.Set(XSRegisters.ESI, XSRegisters.ECX, destinationIsIndirect: true, destinationDisplacement: 8);
XS.Return();
}
[Inline]
internal static int CanReadCPUID()
{
/*
* pushfd
* pushfd
* xor dword [esp], 00200000h
* popfd
* pushfd
* pop eax
* xor eax, [esp]
* and eax, 00200000h
* ret
*/
XS.Pushfd();
XS.Pushfd();
XS.Xor(XSRegisters.ESP, 0x00200000, destinationIsIndirect: true);
XS.Popfd();
XS.Pushfd();
XS.Pop(XSRegisters.EAX);
XS.Xor(XSRegisters.EAX, XSRegisters.ESP, destinationIsIndirect: true);
XS.Popfd();
XS.And(XSRegisters.EAX, 0x00200000);
XS.Return();
return 0; // should be ignored by the compiler
}
}
}

View file

@ -13,7 +13,7 @@ namespace Cosmos.Core_Plugs.System.Diagnostics
{
if (Stopwatch.IsHighResolution)
// see https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx for more details
return (long)(ProcessorInformation.GetCycleCount() / (double)ProcessorInformation.GetCycleRate() * 1000000d);
return (long)(CPU.GetCPUUptime() / (double)CPU.GetCPUUptime() * 1000000d);
else
return DateTime.UtcNow.Ticks;
}

View file

@ -23,10 +23,10 @@ namespace Cosmos.Core_Plugs.System.Threading
// if ((ms > 0) && (ms != Timeout.Infinite))
// {
// double fac = ProcessorInformation.GetCycleRate() / 1000d;
// double ticks = ms / 1000d * Stopwatch.Frequency + ProcessorInformation.GetCycleCount() * fac;
// double fac = CPU.GetCycleRate() / 1000d;
// double ticks = ms / 1000d * Stopwatch.Frequency + CPU.GetCycleCount() * fac;
// while (ticks < ProcessorInformation.GetCycleCount() * fac)
// while (ticks < CPU.GetCycleCount() * fac)
// new Action(() => { }).Invoke(); // execute an empty operation
// }
// else if (ms < 0)

View file

@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using Cosmos.Build.Common;
namespace Cosmos.Debug.Hosts
{
public class Qemu : Host
{
private static Process qemuProcess;
private string _harddiskFile;
private string _isoFile;
private string _debugPortString;
public bool RedirectOutput = false;
public Action<string> LogOutput;
public Action<string> LogError;
public Qemu(Dictionary<string, string> aParams, bool aUseGDB, string aHarddisk = null)
: base(aParams, aUseGDB)
{
if (String.IsNullOrWhiteSpace(aHarddisk))
{
_harddiskFile = Path.Combine(CosmosPaths.Build, @"VMWare\Workstation\Filesystem.vmdk");
}
else
{
_harddiskFile = aHarddisk;
}
if (aParams.ContainsKey("ISOFile"))
{
_isoFile = aParams["IOSFile"];
}
_debugPortString = "Cosmos\\Serial";
}
public override void Start()
{
qemuProcess = new Process();
var qemuStartInfo = qemuProcess.StartInfo;
qemuStartInfo.FileName = QemuSupport.QemuExe.FullName;
string xQemuArguments = "-m 128";
xQemuArguments += $" -cdrom {_isoFile}";
if (!string.IsNullOrWhiteSpace(_harddiskFile))
{
xQemuArguments += $" -hda {_harddiskFile}";
}
if (!string.IsNullOrWhiteSpace(_debugPortString))
{
xQemuArguments += $" -chardev pipe,path=\\\\Cosmos\\Serial,id=Cosmos -device isa-serial,chardev=Cosmos";
}
xQemuArguments += " -boot d";
qemuStartInfo.Arguments = xQemuArguments;
if (RedirectOutput)
{
if (LogOutput == null)
{
throw new Exception("No LogOutput handler specified!");
}
if (LogError == null)
{
throw new Exception("No LogError handler specified!");
}
}
qemuProcess.EnableRaisingEvents = true;
qemuProcess.Exited += ExitCallback;
qemuProcess.Start();
if (RedirectOutput)
{
qemuProcess.BeginErrorReadLine();
qemuProcess.BeginOutputReadLine();
}
}
private void ExitCallback(object sender, EventArgs e)
{
if (OnShutDown != null)
{
try
{
OnShutDown(sender, e);
}
catch
{
}
}
}
public override void Stop()
{
if (qemuProcess != null)
{
try
{
qemuProcess.Kill();
}
catch
{
}
}
Cleanup();
}
private void Cleanup()
{
OnShutDown(this, null);
qemuProcess.Exited -= ExitCallback;
}
}
}

View file

@ -176,8 +176,10 @@ namespace Cosmos.HAL
* |--------|---------------------------|
* | 0x04 | 5-button mouse |
* |--------|---------------------------|
* | 0x50 | Laptop Touchpad |
* |--------|---------------------------|
*/
if (xFirstByte == 0x00 || xFirstByte == 0x03 || xFirstByte == 0x04)
if (xFirstByte == 0x00 || xFirstByte == 0x03 || xFirstByte == 0x04 || xFirstByte == 0x50)
{
var xDevice = new PS2Mouse(aPort, xFirstByte);
xDevice.Initialize();

View file

@ -512,6 +512,8 @@ namespace Cosmos.System.FileSystem.FAT.Listing
/// <exception cref="NotSupportedException">Thrown when FAT type is unknown.</exception>
public void DeleteDirectoryEntry()
{
Global.mFileSystemDebugger.SendInternal("-- FatDirectoryEntry.DeleteDirectoryEntry --");
if (mEntryType == DirectoryEntryTypeEnum.Unknown)
{
throw new NotImplementedException();
@ -524,12 +526,17 @@ namespace Cosmos.System.FileSystem.FAT.Listing
var xData = ((FatDirectoryEntry)mParent).GetDirectoryEntryData();
var xEntryOffset = mEntryHeaderDataOffset - 32;
while (xData[xEntryOffset + 11] == FatDirectoryEntryAttributeConsts.LongName)
if(mEntryHeaderDataOffset > 32)
{
xData[xEntryOffset] = FatDirectoryEntryAttributeConsts.UnusedOrDeletedEntry;
xEntryOffset -= 32;
var xEntryOffset = mEntryHeaderDataOffset - 32;
Global.mFileSystemDebugger.SendInternal("xEntryOffset: " + xEntryOffset);
while (xData[xEntryOffset + 11] == FatDirectoryEntryAttributeConsts.LongName)
{
xData[xEntryOffset] = FatDirectoryEntryAttributeConsts.UnusedOrDeletedEntry;
xEntryOffset -= 32;
}
}
((FatDirectoryEntry)mParent).SetDirectoryEntryData(xData);
@ -988,6 +995,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing
internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, byte aValue)
{
Global.mFileSystemDebugger.SendInternal(" -- FatDirectoryEntry.SetDirectoryEntryMetadataValue(uint) --");
Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset);
Global.mFileSystemDebugger.SendInternal("aValue = " + aValue);
if (IsRootDirectory())
@ -1043,6 +1051,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing
internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, ushort aValue)
{
Global.mFileSystemDebugger.SendInternal(" -- FatDirectoryEntry.SetDirectoryEntryMetadataValue(uint) --");
Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset);
Global.mFileSystemDebugger.SendInternal("aValue = " + aValue);
if (IsRootDirectory())
@ -1054,6 +1063,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing
if (xData.Length > 0)
{
Global.mFileSystemDebugger.SendInternal("mEntryHeaderDataOffset = " + mEntryHeaderDataOffset);
var xValue = new byte[aEntryMetadata.DataLength];
xValue.SetUInt16(0, aValue);
uint offset = mEntryHeaderDataOffset + aEntryMetadata.DataOffset;
@ -1100,6 +1110,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing
internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, uint aValue)
{
Global.mFileSystemDebugger.SendInternal(" -- FatDirectoryEntry.SetDirectoryEntryMetadataValue(uint) --");
Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset);
Global.mFileSystemDebugger.SendInternal("aValue = " + aValue);
if (IsRootDirectory())
@ -1157,6 +1168,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing
internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, long aValue)
{
Global.mFileSystemDebugger.SendInternal("-- FatDirectoryEntry.SetDirectoryEntryMetadataValue(long) --");
Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset);
Global.mFileSystemDebugger.SendInternal("aValue =");
Global.mFileSystemDebugger.SendInternal(aValue);
@ -1218,6 +1230,7 @@ namespace Cosmos.System.FileSystem.FAT.Listing
internal void SetDirectoryEntryMetadataValue(FatDirectoryEntryMetadata aEntryMetadata, string aValue)
{
Global.mFileSystemDebugger.SendInternal("-- FatDirectoryEntry.SetDirectoryEntryMetadataValue(string) --");
Global.mFileSystemDebugger.SendInternal("aEntryMetadata = " + aEntryMetadata.DataOffset);
Global.mFileSystemDebugger.SendInternal($"aValue = {aValue}");
if (IsRootDirectory())

View file

@ -855,7 +855,48 @@ namespace Cosmos.System.Graphics
}
}
}
private int[] scaleImage(Image image, int newWidth, int newHeight)
{
int[] pixels = image.rawData;
int w1 = (int)image.Width;
int h1 = (int)image.Height;
int[] temp = new int[newWidth * newHeight];
int x_ratio = (int)((w1 << 16) / newWidth) + 1;
int y_ratio = (int)((h1 << 16) / newHeight) + 1;
int x2, y2;
for (int i = 0; i < newHeight; i++)
{
for (int j = 0; j < newWidth; j++)
{
x2 = ((j * x_ratio) >> 16);
y2 = ((i * y_ratio) >> 16);
temp[(i * newWidth) + j] = pixels[(y2 * w1) + x2];
}
}
return temp;
}
/// <summary>
/// Draw a Scaled Bitmap.
/// </summary>
/// <param name="image">Image to Scale.</param>
/// <param name="x">X coordinate.</param>
/// <param name="y">Y coordinate.</param>
/// <param name="w">Desired Width.</param>
/// <param name="h">Desired Height.</param>
public virtual void DrawImage(Image image, int x, int y,int w,int h)
{
int[] pixels = scaleImage(image, w, h);
for (int _x = 0; _x < w; _x++)
{
for (int _y = 0; _y < h; _y++)
{
Global.mDebugger.SendInternal(pixels[_x + _y * w]);
DrawPoint(new Pen(Color.FromArgb(pixels[_x + _y * w])), x + _x, y + _y);
}
}
}
/// <summary>
/// Draw image with alpha channel.
/// </summary>

View file

@ -0,0 +1,440 @@
//#define COSMOSDEBUG
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using IL2CPU.API.Attribs;
namespace Cosmos.System_Plugs.System.Drawing
{
[Plug(Target = typeof(global::System.Drawing.Color))]
class ColorImpl
{
/// <summary>Implements System.Drawing.Color.FromName
/// <para>See https://docs.microsoft.com/de-de/dotnet/api/system.drawing.color.fromname?view=netcore-3.1 for Usage Explanation</para>
/// </summary>
public static Color FromName(string name)
{
switch(name)
{
case "AliceBlue":
return Color.AliceBlue;
case "AntiqueWhite":
return Color.AntiqueWhite;
case "Aqua":
return Color.Aqua;
case "Aquamarine":
return Color.Aquamarine;
case "Azure":
return Color.Azure;
case "Beige":
return Color.Beige;
case "Bisque":
return Color.Bisque;
case "Black":
return Color.Black;
case "BlueViolet":
return Color.BlueViolet;
case "Brown":
return Color.Brown;
case "BurlyWood":
return Color.BurlyWood;
case "CadetBlue":
return Color.CadetBlue;
case "Chartreuse":
return Color.Chartreuse;
case "Chocolate":
return Color.Chocolate;
case "Coral":
return Color.Coral;
case "CornflowerBlue":
return Color.CornflowerBlue;
case "Cornsilk":
return Color.Cornsilk;
case "Crimson":
return Color.Crimson;
case "Cyan":
return Color.Cyan;
case "DarkBlue":
return Color.DarkBlue;
case "DarkCyan":
return Color.DarkCyan;
case "DarkGoldenrod":
return Color.DarkGoldenrod;
case "DarkGray":
return Color.DarkGray;
case "DarkGreen":
return Color.DarkGreen;
case "DarkKhaki":
return Color.DarkKhaki;
case "DarkMagenta":
return Color.DarkMagenta;
case "DarkOliveGreen":
return Color.DarkOliveGreen;
case "AliceOrange":
return Color.DarkOrange;
case "DarkOrchid":
return Color.DarkOrchid;
case "DarkRed":
return Color.DarkRed;
case "DarkSalmon":
return Color.DarkSalmon;
case "DarkSeaGreen":
return Color.DarkSeaGreen;
case "DarkSlateBlue":
return Color.DarkSlateBlue;
case "DarkSlateGray":
return Color.DarkSlateGray;
case "DarkTurquoise":
return Color.DarkTurquoise;
case "DarkViolet":
return Color.DarkViolet;
case "DeepPink":
return Color.DeepPink;
case "DeepSkyBlue":
return Color.DeepSkyBlue;
case "DimGray":
return Color.DimGray;
case "DodgerBlue":
return Color.DodgerBlue;
case "Firebrick":
return Color.Firebrick;
case "FloralWhite":
return Color.FloralWhite;
case "ForestGreen":
return Color.ForestGreen;
case "Fuchsia":
return Color.Fuchsia;
case "Gainsboro":
return Color.Gainsboro;
case "GhostWhite":
return Color.GhostWhite;
case "Gold":
return Color.Gold;
case "Goldenrod":
return Color.Goldenrod;
case "Gray":
return Color.Gray;
case "Green":
return Color.Green;
case "GreenYellow":
return Color.GreenYellow;
case "Honeydew":
return Color.Honeydew;
case "HotPink":
return Color.HotPink;
case "IndianRed":
return Color.IndianRed;
case "Indigo":
return Color.Indigo;
case "Ivory":
return Color.Ivory;
case "Khaki":
return Color.Khaki;
case "Lavender":
return Color.Lavender;
case "LavenderBlush":
return Color.LavenderBlush;
case "LawnGreen":
return Color.LawnGreen;
case "LemonChiffon":
return Color.LemonChiffon;
case "LightBlue":
return Color.LightBlue;
case "LightCoral":
return Color.LightCoral;
case "LightCyan":
return Color.LightCyan;
case "LightGoldenrodYellow":
return Color.LightGoldenrodYellow;
case "LightGreen":
return Color.LightGreen;
case "LightGray":
return Color.LightGray;
case "LightPink":
return Color.LightPink;
case "LightSalmon":
return Color.LightSalmon;
case "LightSeaGreen":
return Color.LightSeaGreen;
case "LightSkyBlue":
return Color.LightSkyBlue;
case "LightSlateGray":
return Color.LightSlateGray;
case "LightSteelBlue":
return Color.LightSteelBlue;
case "LightYellow":
return Color.LightYellow;
case "Lime":
return Color.Lime;
case "LimeGreen":
return Color.LimeGreen;
case "Linen":
return Color.Linen;
case "Magenta":
return Color.Magenta;
case "Maroon":
return Color.Maroon;
case "MediumAquamarine":
return Color.MediumAquamarine ;
case "MediumBlue":
return Color.MediumBlue;
case "MediumOrchid":
return Color.MediumOrchid;
case "MediumPurple":
return Color.MediumPurple;
case "MediumSeaGreen":
return Color.MediumSeaGreen;
case "MediumSlateBlue":
return Color.MediumSlateBlue;
case "MediumSpringGreen":
return Color.MediumSpringGreen;
case "MediumTurquoise":
return Color.MediumTurquoise;
case "MediumVioletRed":
return Color.MediumVioletRed;
case "MidnightBlue":
return Color.MidnightBlue;
case "MintCream":
return Color.MintCream;
case "MistyRose":
return Color.MistyRose;
case "Moccasin":
return Color.Moccasin;
case "NavajoWhite":
return Color.NavajoWhite;
case "Navy":
return Color.Navy;
case "OldLace":
return Color.OldLace;
case "Olive":
return Color.Olive;
case "OliveDrab":
return Color.OliveDrab;
case "Orange":
return Color.Orange;
case "OrangeRed":
return Color.OrangeRed;
case "Orchid":
return Color.Orchid;
case "PaleGoldenrod":
return Color.PaleGoldenrod;
case "PaleGreen":
return Color.PaleGreen;
case "PaleTurquoise":
return Color.PaleTurquoise;
case "PaleVioletRed":
return Color.PaleVioletRed;
case "PapayaWhip":
return Color.PapayaWhip;
case "PeachPuff":
return Color.PeachPuff;
case "Peru":
return Color.Peru;
case "Pink":
return Color.Pink;
case "Plum":
return Color.Plum;
case "PowderBlue":
return Color.PowderBlue;
case "Purple":
return Color.Purple;
case "Red":
return Color.Red;
case "RosyBrown":
return Color.RosyBrown;
case "RoyalBlue":
return Color.RoyalBlue;
case "SaddleBrown":
return Color.SaddleBrown;
case "Salmon":
return Color.Salmon;
case "SandyBrown":
return Color.SandyBrown;
case "SeaGreen":
return Color.SeaGreen;
case "Sienna":
return Color.Sienna;
case "Silver":
return Color.Silver;
case "SkyBlue":
return Color.SkyBlue;
case "SlateBlue":
return Color.SlateBlue;
case "SlateGray":
return Color.SlateGray;
case "Snow":
return Color.Snow;
case "SpringGreen":
return Color.SpringGreen;
case "SteelBlue":
return Color.SteelBlue;
case "Tan":
return Color.Tan;
case "Thistle":
return Color.Thistle;
case "Tomato":
return Color.Tomato;
case "Transparent":
return Color.Transparent;
case "Turquoise":
return Color.Turquoise;
case "Violet":
return Color.Violet;
case "Wheat":
return Color.Wheat;
case "White":
return Color.White;
case "WhiteSmoke":
return Color.WhiteSmoke;
case "Yellow":
return Color.Yellow;
case "YellowGreen":
return Color.YellowGreen;
case "":
throw new ArgumentException("Color Name must be passed to FromName");
default:
throw new ArgumentException("{0} is not a valid Color Name", name);
}
}
}
}

View file

@ -20,6 +20,11 @@ namespace Cosmos.System_Plugs.System
{
string result = "";
if(aThis == 0)
{
result = "0";
}
while (aThis != 0)
{
if ((aThis % 16) < 10)

View file

@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Text;
using Cosmos.Common.Extensions;
using IL2CPU.API.Attribs;
namespace Cosmos.System_Plugs.System
{
[Plug(TargetName = "System.ParseNumbers, System.Private.CoreLib")]
class ParseNumbersImpl
{
public static string IntToString(int value, int radix, int width, char paddingChar, int flags)
{
if (flags != 0)
{
throw new NotImplementedException("IntToString with non-zero flags is not supported");
}
string valueString = "";
if (radix == 2 || radix == 8 || radix == 16)
{
int shiftRightAmount = 1;
if (radix == 8)
{
shiftRightAmount = 3;
}
else if (radix == 16)
{
shiftRightAmount = 4;
}
if (value < 0)
{
throw new NotImplementedException();
}
while (value > 0)
{
valueString = (value % radix).ToString("X") + valueString;
value >>= shiftRightAmount;
}
}
else if (radix == 10)
{
valueString = value.ToString();
}
else
{
throw new ArgumentException(nameof(radix));
}
if (width == -1)
{
return valueString;
}
if (valueString.Length > width)
{
throw new NotImplementedException("IntToString Case not handled when value is longer than width");
}
int count = width - valueString.Length;
for (int i = 0; i < count; i++)
{
valueString = paddingChar + valueString;
}
return valueString;
}
}
}

View file

@ -281,7 +281,7 @@ namespace Cosmos.VS.DebugEngine.AD7.Impl
private void CreateDebugConnector()
{
mDbgConnector = null;
mDebugInfo.TryGetValue(BuildPropertyNames.VisualStudioDebugPortString, out var xPort);
// using (var xDebug = new StreamWriter(@"e:\debug.info", false))
@ -309,13 +309,11 @@ namespace Cosmos.VS.DebugEngine.AD7.Impl
string xPortType = xParts[0].ToLower();
string xPortParam = xParts[1].ToLower();
var xLaunch = mDebugInfo[BuildPropertyNames.LaunchString];
OutputText("Starting debug connector.");
switch (xPortType)
{
case "pipe:":
if (xLaunch == "HyperV")
if (mLaunch == LaunchType.HyperV || mLaunch == LaunchType.Qemu)
{
mDbgConnector = new DebugConnectorPipeClient(xPortParam);
}
@ -325,7 +323,7 @@ namespace Cosmos.VS.DebugEngine.AD7.Impl
}
break;
case "serial:":
if (xLaunch == "IntelEdison")
if (mLaunch == LaunchType.IntelEdison)
{
mDbgConnector = new DebugConnectorEdison(xPortParam, Path.ChangeExtension(mDebugInfo["ISOFile"], ".bin"));
}
@ -336,7 +334,6 @@ namespace Cosmos.VS.DebugEngine.AD7.Impl
break;
default:
throw new Exception("No debug connector found for port type '" + xPortType + "'");
}
mDbgConnector.SetConnectionHandler(DebugConnectorConnected);
mDbgConnector.CmdBreak += new Action<uint>(DbgCmdBreak);
@ -560,6 +557,13 @@ namespace Cosmos.VS.DebugEngine.AD7.Impl
//((Host.Bochs)mHost).FixBochsConfiguration(new KeyValuePair<string, string>[] { new KeyValuePair<string, string>("IsoFileName", mISO) });
break;
case LaunchType.Qemu:
if (!QemuSupport.QemuEnabled)
{
throw new Exception("The Qemu emulator doesn't seem to be installed on this machine.");
}
mHost = new Qemu(mDebugInfo, xUseGDB);
break;
case LaunchType.IntelEdison:
mHost = new IntelEdison(mDebugInfo, false);
break;

View file

@ -28,6 +28,7 @@
<EnumValue Name="VMware" DisplayName="VMware" />
<EnumValue Name="Slave" DisplayName="Attached Slave (CanaKit)" />
<EnumValue Name="Bochs" DisplayName="Bochs" />
<EnumValue Name="Qemu" DisplayName="Qemu" />
<EnumValue Name="IntelEdison" DisplayName="Intel Edison" />
<EnumValue Name="HyperV" DisplayName="Hyper-V" />
</EnumProperty>

View file

@ -82,6 +82,7 @@
this.tabBochs = new System.Windows.Forms.TabPage();
this.checkStartBochsDebugGui = new System.Windows.Forms.CheckBox();
this.checkEnableBochsDebug = new System.Windows.Forms.CheckBox();
this.tabQemu = new System.Windows.Forms.TabPage();
this.tabPXE = new System.Windows.Forms.TabPage();
this.butnPxeRefresh = new System.Windows.Forms.Button();
this.comboPxeInterface = new System.Windows.Forms.ComboBox();
@ -111,14 +112,15 @@
this.tabLaunch.SuspendLayout();
this.tabVMware.SuspendLayout();
this.tabBochs.SuspendLayout();
this.tabQemu.SuspendLayout();
this.tabPXE.SuspendLayout();
this.tabUSB.SuspendLayout();
this.tabISO.SuspendLayout();
this.tabSlave.SuspendLayout();
this.SuspendLayout();
//
//
// panel1
//
//
this.panel1.Controls.Add(this.lablCurrentProfile);
this.panel1.Controls.Add(this.label11);
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
@ -126,27 +128,27 @@
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(635, 43);
this.panel1.TabIndex = 3;
//
//
// lablCurrentProfile
//
//
this.lablCurrentProfile.AutoSize = true;
this.lablCurrentProfile.Location = new System.Drawing.Point(99, 17);
this.lablCurrentProfile.Name = "lablCurrentProfile";
this.lablCurrentProfile.Size = new System.Drawing.Size(41, 13);
this.lablCurrentProfile.TabIndex = 1;
this.lablCurrentProfile.Text = "label12";
//
//
// label11
//
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(17, 17);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(76, 13);
this.label11.TabIndex = 0;
this.label11.Text = "Current Profile:";
//
//
// TabControl1
//
//
this.TabControl1.Controls.Add(this.tabProfile);
this.TabControl1.Controls.Add(this.tabCompile);
this.TabControl1.Controls.Add(this.tabAssembler);
@ -156,6 +158,7 @@
this.TabControl1.Controls.Add(this.tabVMware);
this.TabControl1.Controls.Add(this.tabHyperV);
this.TabControl1.Controls.Add(this.tabBochs);
this.TabControl1.Controls.Add(this.tabQemu);
this.TabControl1.Controls.Add(this.tabPXE);
this.TabControl1.Controls.Add(this.tabUSB);
this.TabControl1.Controls.Add(this.tabISO);
@ -167,9 +170,9 @@
this.TabControl1.SelectedIndex = 0;
this.TabControl1.Size = new System.Drawing.Size(635, 512);
this.TabControl1.TabIndex = 1;
//
//
// tabProfile
//
//
this.tabProfile.Controls.Add(this.lablPreset);
this.tabProfile.Controls.Add(this.panel2);
this.tabProfile.Controls.Add(this.lablDeployText);
@ -181,9 +184,9 @@
this.tabProfile.TabIndex = 8;
this.tabProfile.Text = "Profile";
this.tabProfile.UseVisualStyleBackColor = true;
//
//
// lablPreset
//
//
this.lablPreset.AutoSize = true;
this.lablPreset.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lablPreset.ForeColor = System.Drawing.SystemColors.HotTrack;
@ -192,9 +195,9 @@
this.lablPreset.Size = new System.Drawing.Size(247, 13);
this.lablPreset.TabIndex = 7;
this.lablPreset.Text = "** This is a preset. Some options are restricted.";
//
//
// panel2
//
//
this.panel2.Controls.Add(this.lboxProfile);
this.panel2.Controls.Add(this.toolStrip1);
this.panel2.Dock = System.Windows.Forms.DockStyle.Left;
@ -202,9 +205,9 @@
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(200, 480);
this.panel2.TabIndex = 6;
//
//
// lboxProfile
//
//
this.lboxProfile.Dock = System.Windows.Forms.DockStyle.Fill;
this.lboxProfile.FormattingEnabled = true;
this.lboxProfile.Location = new System.Drawing.Point(0, 27);
@ -212,9 +215,9 @@
this.lboxProfile.Size = new System.Drawing.Size(200, 453);
this.lboxProfile.Sorted = true;
this.lboxProfile.TabIndex = 3;
//
//
// toolStrip1
//
//
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.butnProfileClone,
@ -225,9 +228,9 @@
this.toolStrip1.Size = new System.Drawing.Size(200, 27);
this.toolStrip1.TabIndex = 2;
this.toolStrip1.Text = "toolStrip1";
//
//
// butnProfileClone
//
//
this.butnProfileClone.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.butnProfileClone.Image = ((System.Drawing.Image)(resources.GetObject("butnProfileClone.Image")));
this.butnProfileClone.ImageTransparentColor = System.Drawing.Color.Magenta;
@ -235,9 +238,9 @@
this.butnProfileClone.Size = new System.Drawing.Size(24, 24);
this.butnProfileClone.Text = "Clone";
this.butnProfileClone.ToolTipText = "Create a new profile from an existing one.";
//
//
// butnProfileDelete
//
//
this.butnProfileDelete.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.butnProfileDelete.Image = ((System.Drawing.Image)(resources.GetObject("butnProfileDelete.Image")));
this.butnProfileDelete.ImageTransparentColor = System.Drawing.Color.Magenta;
@ -245,9 +248,9 @@
this.butnProfileDelete.Size = new System.Drawing.Size(24, 24);
this.butnProfileDelete.Text = "Delete";
this.butnProfileDelete.ToolTipText = "Delete selected profile";
//
//
// butnProfileRename
//
//
this.butnProfileRename.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.butnProfileRename.Image = ((System.Drawing.Image)(resources.GetObject("butnProfileRename.Image")));
this.butnProfileRename.ImageTransparentColor = System.Drawing.Color.Magenta;
@ -255,17 +258,17 @@
this.butnProfileRename.Size = new System.Drawing.Size(24, 24);
this.butnProfileRename.Text = "Rename";
this.butnProfileRename.ToolTipText = "Rename selected profile.";
//
//
// lablDeployText
//
//
this.lablDeployText.Location = new System.Drawing.Point(217, 44);
this.lablDeployText.Name = "lablDeployText";
this.lablDeployText.Size = new System.Drawing.Size(228, 137);
this.lablDeployText.TabIndex = 4;
this.lablDeployText.Text = "label1";
//
//
// lablBuildOnly
//
//
this.lablBuildOnly.AutoSize = true;
this.lablBuildOnly.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lablBuildOnly.ForeColor = System.Drawing.SystemColors.HotTrack;
@ -274,9 +277,9 @@
this.lablBuildOnly.Size = new System.Drawing.Size(310, 13);
this.lablBuildOnly.TabIndex = 3;
this.lablBuildOnly.Text = "** This is a build only option. No process will be launched.";
//
//
// tabCompile
//
//
this.tabCompile.AutoScroll = true;
this.tabCompile.Controls.Add(this.labelBinFormat);
this.tabCompile.Controls.Add(this.comboBinFormat);
@ -290,10 +293,10 @@
this.tabCompile.TabIndex = 0;
this.tabCompile.Text = "Compile";
this.tabCompile.UseVisualStyleBackColor = true;
//
//
// labelBinFormat
//
this.labelBinFormat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
//
this.labelBinFormat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.labelBinFormat.AutoSize = true;
this.labelBinFormat.Enabled = false;
@ -305,18 +308,18 @@
this.labelBinFormat.TabIndex = 23;
this.labelBinFormat.Text = "Bin format:";
this.labelBinFormat.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
//
// comboBinFormat
//
//
this.comboBinFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBinFormat.FormattingEnabled = true;
this.comboBinFormat.Location = new System.Drawing.Point(34, 136);
this.comboBinFormat.Name = "comboBinFormat";
this.comboBinFormat.Size = new System.Drawing.Size(228, 21);
this.comboBinFormat.TabIndex = 22;
//
//
// comboFramework
//
//
this.comboFramework.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboFramework.Enabled = false;
this.comboFramework.FormattingEnabled = true;
@ -324,10 +327,10 @@
this.comboFramework.Name = "comboFramework";
this.comboFramework.Size = new System.Drawing.Size(228, 21);
this.comboFramework.TabIndex = 5;
//
//
// labelFramework
//
this.labelFramework.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
//
this.labelFramework.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.labelFramework.AutoSize = true;
this.labelFramework.Enabled = false;
@ -339,9 +342,9 @@
this.labelFramework.TabIndex = 21;
this.labelFramework.Text = "Framework:";
this.labelFramework.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
//
// tabAssembler
//
//
this.tabAssembler.Controls.Add(this.checkUseInternalAssembler);
this.tabAssembler.Controls.Add(this.labelInternalAssembler);
this.tabAssembler.Location = new System.Drawing.Point(4, 22);
@ -350,10 +353,10 @@
this.tabAssembler.TabIndex = 10;
this.tabAssembler.Text = "Assembler";
this.tabAssembler.UseVisualStyleBackColor = true;
//
//
// checkUseInternalAssembler
//
this.checkUseInternalAssembler.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
//
this.checkUseInternalAssembler.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.checkUseInternalAssembler.AutoSize = true;
this.checkUseInternalAssembler.Enabled = false;
@ -365,9 +368,9 @@
this.checkUseInternalAssembler.TabIndex = 6;
this.checkUseInternalAssembler.Text = "Use Internal Assembler";
this.checkUseInternalAssembler.UseVisualStyleBackColor = true;
//
//
// labelInternalAssembler
//
//
this.labelInternalAssembler.Enabled = false;
this.labelInternalAssembler.Location = new System.Drawing.Point(40, 32);
this.labelInternalAssembler.Margin = new System.Windows.Forms.Padding(44, 0, 3, 0);
@ -375,9 +378,9 @@
this.labelInternalAssembler.Size = new System.Drawing.Size(224, 18);
this.labelInternalAssembler.TabIndex = 20;
this.labelInternalAssembler.Text = "Experimental. Check if you like to crash!";
//
//
// tabDebug
//
//
this.tabDebug.AutoScroll = true;
this.tabDebug.Controls.Add(this.chckEnableDebugStub);
this.tabDebug.Controls.Add(this.panlDebugSettings);
@ -388,9 +391,9 @@
this.tabDebug.TabIndex = 2;
this.tabDebug.Text = "Debug";
this.tabDebug.UseVisualStyleBackColor = true;
//
//
// chckEnableDebugStub
//
//
this.chckEnableDebugStub.AutoSize = true;
this.chckEnableDebugStub.Location = new System.Drawing.Point(14, 6);
this.chckEnableDebugStub.Name = "chckEnableDebugStub";
@ -398,9 +401,9 @@
this.chckEnableDebugStub.TabIndex = 7;
this.chckEnableDebugStub.Text = "Enable Remote Debugging";
this.chckEnableDebugStub.UseVisualStyleBackColor = true;
//
//
// panlDebugSettings
//
//
this.panlDebugSettings.Controls.Add(this.stackCorruptionDetectionGroupBox);
this.panlDebugSettings.Controls.Add(this.debugLevelGroupBox);
this.panlDebugSettings.Controls.Add(this.debugStubGroupBox);
@ -408,9 +411,9 @@
this.panlDebugSettings.Name = "panlDebugSettings";
this.panlDebugSettings.Size = new System.Drawing.Size(280, 400);
this.panlDebugSettings.TabIndex = 33;
//
//
// stackCorruptionDetectionGroupBox
//
//
this.stackCorruptionDetectionGroupBox.Controls.Add(this.label12);
this.stackCorruptionDetectionGroupBox.Controls.Add(this.comboStackCorruptionDetectionLevel);
this.stackCorruptionDetectionGroupBox.Controls.Add(this.chkEnableStackCorruptionDetection);
@ -419,18 +422,18 @@
this.stackCorruptionDetectionGroupBox.Size = new System.Drawing.Size(260, 90);
this.stackCorruptionDetectionGroupBox.TabIndex = 34;
this.stackCorruptionDetectionGroupBox.TabStop = false;
//
//
// label12
//
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(3, 42);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(85, 13);
this.label12.TabIndex = 30;
this.label12.Text = "Detection Level:";
//
//
// comboStackCorruptionDetectionLevel
//
//
this.comboStackCorruptionDetectionLevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboStackCorruptionDetectionLevel.FormattingEnabled = true;
this.comboStackCorruptionDetectionLevel.Location = new System.Drawing.Point(33, 58);
@ -438,9 +441,9 @@
this.comboStackCorruptionDetectionLevel.Size = new System.Drawing.Size(220, 21);
this.comboStackCorruptionDetectionLevel.TabIndex = 9;
this.comboStackCorruptionDetectionLevel.SelectedIndexChanged += new System.EventHandler(this.stackCorruptionDetectionLevelComboBox_SelectedIndexChanged);
//
//
// chkEnableStackCorruptionDetection
//
//
this.chkEnableStackCorruptionDetection.AutoSize = true;
this.chkEnableStackCorruptionDetection.Location = new System.Drawing.Point(6, 19);
this.chkEnableStackCorruptionDetection.Name = "chkEnableStackCorruptionDetection";
@ -449,9 +452,9 @@
this.chkEnableStackCorruptionDetection.Text = "Enable Stack Corruption Detection";
this.chkEnableStackCorruptionDetection.UseVisualStyleBackColor = true;
this.chkEnableStackCorruptionDetection.CheckedChanged += new System.EventHandler(this.chkEnableStacckCorruptionDetection_CheckedChanged);
//
//
// debugLevelGroupBox
//
//
this.debugLevelGroupBox.Controls.Add(this.comboTraceMode);
this.debugLevelGroupBox.Controls.Add(this.label5);
this.debugLevelGroupBox.Controls.Add(this.label4);
@ -461,18 +464,18 @@
this.debugLevelGroupBox.Size = new System.Drawing.Size(260, 125);
this.debugLevelGroupBox.TabIndex = 34;
this.debugLevelGroupBox.TabStop = false;
//
//
// comboTraceMode
//
//
this.comboTraceMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboTraceMode.FormattingEnabled = true;
this.comboTraceMode.Location = new System.Drawing.Point(34, 94);
this.comboTraceMode.Name = "comboTraceMode";
this.comboTraceMode.Size = new System.Drawing.Size(220, 21);
this.comboTraceMode.TabIndex = 10;
//
//
// label5
//
//
this.label5.AutoSize = true;
this.label5.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label5.Location = new System.Drawing.Point(3, 73);
@ -482,9 +485,9 @@
this.label5.TabIndex = 26;
this.label5.Text = "Tracing:";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
//
// label4
//
//
this.label4.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label4.Location = new System.Drawing.Point(3, 19);
this.label4.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
@ -493,18 +496,18 @@
this.label4.TabIndex = 24;
this.label4.Text = "Debug Level:";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
//
// comboDebugMode
//
//
this.comboDebugMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboDebugMode.FormattingEnabled = true;
this.comboDebugMode.Location = new System.Drawing.Point(34, 46);
this.comboDebugMode.Name = "comboDebugMode";
this.comboDebugMode.Size = new System.Drawing.Size(220, 21);
this.comboDebugMode.TabIndex = 9;
//
//
// debugStubGroupBox
//
//
this.debugStubGroupBox.Controls.Add(this.checkIgnoreDebugStubAttribute);
this.debugStubGroupBox.Controls.Add(this.label9);
this.debugStubGroupBox.Controls.Add(this.cmboVisualStudioDebugPort);
@ -515,9 +518,9 @@
this.debugStubGroupBox.Size = new System.Drawing.Size(260, 140);
this.debugStubGroupBox.TabIndex = 31;
this.debugStubGroupBox.TabStop = false;
//
//
// checkIgnoreDebugStubAttribute
//
//
this.checkIgnoreDebugStubAttribute.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.checkIgnoreDebugStubAttribute.Location = new System.Drawing.Point(6, 19);
this.checkIgnoreDebugStubAttribute.Name = "checkIgnoreDebugStubAttribute";
@ -525,18 +528,18 @@
this.checkIgnoreDebugStubAttribute.TabIndex = 11;
this.checkIgnoreDebugStubAttribute.Text = "Ignore DebugStub Attribute Settings";
this.checkIgnoreDebugStubAttribute.UseVisualStyleBackColor = true;
//
//
// label9
//
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(6, 42);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(69, 13);
this.label9.TabIndex = 29;
this.label9.Text = "Cosmos Port:";
//
//
// cmboVisualStudioDebugPort
//
//
this.cmboVisualStudioDebugPort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmboVisualStudioDebugPort.FormattingEnabled = true;
this.cmboVisualStudioDebugPort.Items.AddRange(new object[] {
@ -550,9 +553,9 @@
this.cmboVisualStudioDebugPort.Size = new System.Drawing.Size(220, 21);
this.cmboVisualStudioDebugPort.Sorted = true;
this.cmboVisualStudioDebugPort.TabIndex = 13;
//
//
// cmboCosmosDebugPort
//
//
this.cmboCosmosDebugPort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmboCosmosDebugPort.FormattingEnabled = true;
this.cmboCosmosDebugPort.Items.AddRange(new object[] {
@ -566,18 +569,18 @@
this.cmboCosmosDebugPort.Size = new System.Drawing.Size(220, 21);
this.cmboCosmosDebugPort.Sorted = true;
this.cmboCosmosDebugPort.TabIndex = 12;
//
//
// label10
//
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(6, 90);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(93, 13);
this.label10.TabIndex = 30;
this.label10.Text = "Visual Studio Port:";
//
//
// tabDeployment
//
//
this.tabDeployment.Controls.Add(this.lboxDeployment);
this.tabDeployment.Location = new System.Drawing.Point(4, 22);
this.tabDeployment.Name = "tabDeployment";
@ -585,9 +588,9 @@
this.tabDeployment.TabIndex = 11;
this.tabDeployment.Text = "Deployment";
this.tabDeployment.UseVisualStyleBackColor = true;
//
//
// lboxDeployment
//
//
this.lboxDeployment.Dock = System.Windows.Forms.DockStyle.Left;
this.lboxDeployment.FormattingEnabled = true;
this.lboxDeployment.Location = new System.Drawing.Point(0, 0);
@ -595,9 +598,9 @@
this.lboxDeployment.Size = new System.Drawing.Size(206, 486);
this.lboxDeployment.Sorted = true;
this.lboxDeployment.TabIndex = 15;
//
//
// tabLaunch
//
//
this.tabLaunch.Controls.Add(this.lboxLaunch);
this.tabLaunch.Location = new System.Drawing.Point(4, 22);
this.tabLaunch.Name = "tabLaunch";
@ -605,9 +608,9 @@
this.tabLaunch.TabIndex = 12;
this.tabLaunch.Text = "Launch";
this.tabLaunch.UseVisualStyleBackColor = true;
//
//
// lboxLaunch
//
//
this.lboxLaunch.Dock = System.Windows.Forms.DockStyle.Left;
this.lboxLaunch.FormattingEnabled = true;
this.lboxLaunch.Location = new System.Drawing.Point(0, 0);
@ -615,9 +618,9 @@
this.lboxLaunch.Size = new System.Drawing.Size(206, 486);
this.lboxLaunch.Sorted = true;
this.lboxLaunch.TabIndex = 16;
//
//
// tabVMware
//
//
this.tabVMware.Controls.Add(this.checkEnableGDB);
this.tabVMware.Controls.Add(this.checkStartCosmosGDB);
this.tabVMware.Controls.Add(this.label3);
@ -629,9 +632,9 @@
this.tabVMware.TabIndex = 4;
this.tabVMware.Text = "VMware";
this.tabVMware.UseVisualStyleBackColor = true;
//
//
// checkEnableGDB
//
//
this.checkEnableGDB.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.checkEnableGDB.Location = new System.Drawing.Point(9, 77);
this.checkEnableGDB.Name = "checkEnableGDB";
@ -639,9 +642,9 @@
this.checkEnableGDB.TabIndex = 19;
this.checkEnableGDB.Text = "Enable GDB Debugger";
this.checkEnableGDB.UseVisualStyleBackColor = true;
//
//
// checkStartCosmosGDB
//
//
this.checkStartCosmosGDB.AutoSize = true;
this.checkStartCosmosGDB.Enabled = false;
this.checkStartCosmosGDB.Location = new System.Drawing.Point(24, 103);
@ -651,18 +654,18 @@
this.checkStartCosmosGDB.TabIndex = 20;
this.checkStartCosmosGDB.Text = "Use Cosmos GDB Client";
this.checkStartCosmosGDB.UseVisualStyleBackColor = true;
//
//
// label3
//
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(6, 12);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(42, 13);
this.label3.TabIndex = 18;
this.label3.Text = "Edition:";
//
//
// cmboVMwareEdition
//
//
this.cmboVMwareEdition.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmboVMwareEdition.FormattingEnabled = true;
this.cmboVMwareEdition.Location = new System.Drawing.Point(26, 37);
@ -670,9 +673,9 @@
this.cmboVMwareEdition.Size = new System.Drawing.Size(143, 21);
this.cmboVMwareEdition.Sorted = true;
this.cmboVMwareEdition.TabIndex = 18;
//
//
// tabBochs
//
//
this.tabBochs.Controls.Add(this.checkStartBochsDebugGui);
this.tabBochs.Controls.Add(this.checkEnableBochsDebug);
this.tabBochs.Location = new System.Drawing.Point(4, 22);
@ -682,9 +685,9 @@
this.tabBochs.TabIndex = 5;
this.tabBochs.Text = "Bochs";
this.tabBochs.UseVisualStyleBackColor = true;
//
//
// checkStartBochsDebugGui
//
//
this.checkStartBochsDebugGui.Enabled = false;
this.checkStartBochsDebugGui.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.checkStartBochsDebugGui.Location = new System.Drawing.Point(24, 43);
@ -693,9 +696,9 @@
this.checkStartBochsDebugGui.TabIndex = 35;
this.checkStartBochsDebugGui.Text = "Use Bochs Debugger GUI";
this.checkStartBochsDebugGui.UseVisualStyleBackColor = true;
//
//
// checkEnableBochsDebug
//
//
this.checkEnableBochsDebug.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.checkEnableBochsDebug.Location = new System.Drawing.Point(9, 17);
this.checkEnableBochsDebug.Name = "checkEnableBochsDebug";
@ -703,9 +706,19 @@
this.checkEnableBochsDebug.TabIndex = 21;
this.checkEnableBochsDebug.Text = "Enable Bochs Debugger";
this.checkEnableBochsDebug.UseVisualStyleBackColor = true;
//
//
// tabQemu
//
this.tabQemu.Location = new System.Drawing.Point(4, 22);
this.tabQemu.Name = "tabQemu";
this.tabQemu.Padding = new System.Windows.Forms.Padding(3);
this.tabQemu.Size = new System.Drawing.Size(627, 486);
this.tabQemu.TabIndex = 5;
this.tabQemu.Text = "Qemu";
this.tabQemu.UseVisualStyleBackColor = true;
//
// tabPXE
//
//
this.tabPXE.Controls.Add(this.butnPxeRefresh);
this.tabPXE.Controls.Add(this.comboPxeInterface);
this.tabPXE.Controls.Add(this.label1);
@ -716,9 +729,9 @@
this.tabPXE.TabIndex = 6;
this.tabPXE.Text = "PXE";
this.tabPXE.UseVisualStyleBackColor = true;
//
//
// butnPxeRefresh
//
//
this.butnPxeRefresh.AutoSize = true;
this.butnPxeRefresh.Image = ((System.Drawing.Image)(resources.GetObject("butnPxeRefresh.Image")));
this.butnPxeRefresh.Location = new System.Drawing.Point(177, 31);
@ -727,25 +740,25 @@
this.butnPxeRefresh.Size = new System.Drawing.Size(23, 23);
this.butnPxeRefresh.TabIndex = 23;
this.butnPxeRefresh.UseVisualStyleBackColor = true;
//
//
// comboPxeInterface
//
//
this.comboPxeInterface.Location = new System.Drawing.Point(28, 32);
this.comboPxeInterface.Name = "comboPxeInterface";
this.comboPxeInterface.Size = new System.Drawing.Size(146, 21);
this.comboPxeInterface.TabIndex = 22;
//
//
// label1
//
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(13, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(52, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Interface:";
//
//
// tabUSB
//
//
this.tabUSB.Controls.Add(this.label7);
this.tabUSB.Location = new System.Drawing.Point(4, 22);
this.tabUSB.Name = "tabUSB";
@ -754,18 +767,18 @@
this.tabUSB.TabIndex = 7;
this.tabUSB.Text = "USB";
this.tabUSB.UseVisualStyleBackColor = true;
//
//
// label7
//
//
this.label7.Location = new System.Drawing.Point(16, 15);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(375, 102);
this.label7.TabIndex = 1;
this.label7.Text = "There are no current USB options. The target drive will be requested when you run" +
" the project.";
//
//
// tabISO
//
//
this.tabISO.Controls.Add(this.label8);
this.tabISO.Location = new System.Drawing.Point(4, 22);
this.tabISO.Name = "tabISO";
@ -774,17 +787,17 @@
this.tabISO.TabIndex = 8;
this.tabISO.Text = "ISO";
this.tabISO.UseVisualStyleBackColor = true;
//
//
// label8
//
//
this.label8.Location = new System.Drawing.Point(17, 16);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(375, 102);
this.label8.TabIndex = 1;
this.label8.Text = "There are currently no ISO options.";
//
//
// tabSlave
//
//
this.tabSlave.Controls.Add(this.cmboSlavePort);
this.tabSlave.Controls.Add(this.label6);
this.tabSlave.Location = new System.Drawing.Point(4, 22);
@ -794,9 +807,9 @@
this.tabSlave.TabIndex = 13;
this.tabSlave.Text = "Slave";
this.tabSlave.UseVisualStyleBackColor = true;
//
//
// cmboSlavePort
//
//
this.cmboSlavePort.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmboSlavePort.FormattingEnabled = true;
this.cmboSlavePort.Items.AddRange(new object[] {
@ -810,18 +823,18 @@
this.cmboSlavePort.Size = new System.Drawing.Size(146, 21);
this.cmboSlavePort.Sorted = true;
this.cmboSlavePort.TabIndex = 23;
//
//
// label6
//
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(15, 15);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(59, 13);
this.label6.TabIndex = 34;
this.label6.Text = "Slave Port:";
//
//
// tabHyperV
//
//
this.tabHyperV.Location = new System.Drawing.Point(4, 22);
this.tabHyperV.Name = "tabHyperV";
this.tabHyperV.Padding = new System.Windows.Forms.Padding(3);
@ -829,9 +842,9 @@
this.tabHyperV.TabIndex = 14;
this.tabHyperV.Text = "Hyper-V";
this.tabHyperV.UseVisualStyleBackColor = true;
//
//
// CosmosPage
//
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.TabControl1);
@ -865,6 +878,7 @@
this.tabVMware.ResumeLayout(false);
this.tabVMware.PerformLayout();
this.tabBochs.ResumeLayout(false);
this.tabQemu.ResumeLayout(false);
this.tabPXE.ResumeLayout(false);
this.tabPXE.PerformLayout();
this.tabUSB.ResumeLayout(false);
@ -909,6 +923,7 @@
private System.Windows.Forms.CheckBox checkIgnoreDebugStubAttribute;
private System.Windows.Forms.TabPage tabBochs;
private System.Windows.Forms.CheckBox checkEnableBochsDebug;
private System.Windows.Forms.TabPage tabQemu;
private System.Windows.Forms.TabPage tabVMware;
private System.Windows.Forms.CheckBox checkEnableGDB;
private System.Windows.Forms.CheckBox checkStartCosmosGDB;

View file

@ -36,6 +36,7 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
protected int mHyperVDebugPipe;
protected bool mShowTabBochs;
protected bool mShowTabQemu;
protected bool mShowTabDebug;
protected bool mShowTabDeployment;
protected bool mShowTabLaunch;
@ -98,8 +99,8 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
if (xValue != mViewModel.BuildProperties.Launch)
{
mViewModel.BuildProperties.Launch = xValue;
// Bochs requires an ISO. Force Deployment property.
if (LaunchType.Bochs == xValue)
// Bochs and Qemu requires an ISO. Force Deployment property.
if (xValue == LaunchType.Bochs)
{
if (DeploymentType.ISO != mViewModel.BuildProperties.Deployment)
{
@ -329,6 +330,7 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
RemoveTab(tabISO);
RemoveTab(tabSlave);
RemoveTab(tabBochs);
RemoveTab(tabQemu);
if (mShowTabDebug)
{
@ -372,6 +374,10 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
{
TabControl1.TabPages.Add(tabBochs);
}
if (mShowTabQemu)
{
TabControl1.TabPages.Add(tabQemu);
}
if (TabControl1.TabPages.Contains(xTab))
{
@ -435,6 +441,15 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
cmboVisualStudioDebugPort.Enabled = false;
cmboVisualStudioDebugPort.SelectedIndex = mVMwareAndBochsDebugPipe;
}
else if (mViewModel.BuildProperties.Profile == "Qemu")
{
mShowTabQemu = true;
chckEnableDebugStub.Checked = true;
chkEnableStackCorruptionDetection.Checked = true;
cmboCosmosDebugPort.Enabled = false;
cmboVisualStudioDebugPort.Enabled = false;
cmboVisualStudioDebugPort.SelectedIndex = mVMwareAndBochsDebugPipe;
}
else if (mViewModel.BuildProperties.Profile == "IntelEdison")
{
mShowTabBochs = false;
@ -513,7 +528,8 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
mShowTabVMware = mViewModel.BuildProperties.Launch == LaunchType.VMware;
mShowTabHyperV = mViewModel.BuildProperties.Launch == LaunchType.HyperV;
mShowTabSlave = mViewModel.BuildProperties.Launch == LaunchType.Slave;
mShowTabBochs = (LaunchType.Bochs == mViewModel.BuildProperties.Launch);
mShowTabBochs = mViewModel.BuildProperties.Launch == LaunchType.Bochs;
mShowTabQemu = mViewModel.BuildProperties.Launch == LaunchType.Qemu;
//
UpdateTabs();
}

View file

@ -15,6 +15,10 @@ namespace Cosmos.VS.ProjectSystem.VS.PropertyPages
{
Add("Bochs", "Bochs");
}
if (QemuSupport.QemuEnabled)
{
Add("Qemu", "Qemu");
}
Add("IntelEdison", "Intel Edison Serial boot");
Add("HyperV", "Hyper-V");
}