This commit is contained in:
kudzu_cp 2010-08-23 02:57:27 +00:00
parent d2a860698e
commit faaffecc61
12 changed files with 125 additions and 39 deletions

View file

@ -53,6 +53,7 @@
<Compile Include="DeviceIDAttribute.cs" />
<Compile Include="Global.cs" />
<Compile Include="Heap.cs" />
<Compile Include="IOGroup\ATA.cs" />
<Compile Include="IOGroup\Keyboard.cs" />
<Compile Include="IOGroup\PciBus.cs" />
<Compile Include="IOGroup\PciDevice.cs" />

View file

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cosmos.Core.IOGroup {
public class ATA : IOGroup {
[FlagsAttribute]
enum Status : byte {
ATA_SR_BSY = 0x80
, ATA_SR_DRD = 0x40
, ATA_SR_DF = 0x20
, ATA_SR_DSC = 0x10
, ATA_SR_DRQ = 0x08
, ATA_SR_COR = 0x04
, ATA_SR_IDX = 0x02
, ATA_SR_ERR = 0x01
};
public readonly IOPort PortControl;
public readonly IOPort PortData;
internal ATA(bool aSecondary) {
if (!aSecondary) {
PortControl = new IOPort(0x3F4);
PortData = new IOPort(0x1F0);
} else {
PortControl = new IOPort(0x374);
PortData = new IOPort(0x170);
}
}
}
}

View file

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
namespace Cosmos.Core.IOGroup {
public class PIC {
public class PIC : IOGroup {
public readonly IOPort PortCmd1 = new IOPort(0x20);
public readonly IOPort PortData1 = new IOPort(0x21);
public readonly IOPort PortCmd2 = new IOPort(0xA0);

View file

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
namespace Cosmos.Core.IOGroup {
public class PIT {
public class PIT : IOGroup {
public readonly IOPort Port40 = new IOPort(0x40);
public readonly IOPort Port43 = new IOPort(0x43);
public readonly IOPort Port61 = new IOPort(0x61);

View file

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
namespace Cosmos.Core.IOGroup {
public class PciBus {
public class PciBus : IOGroup {
public IOPort ConfigAddressPort = new IOPort(0xCF8);
public IOPort ConfigDataPort = new IOPort(0xCFC);
}

View file

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
namespace Cosmos.Core.IOGroup {
public class PciDevice {
public class PciDevice : IOGroup {
internal PciDevice() {
}
}

View file

@ -43,6 +43,47 @@ namespace Cosmos.Core {
return IO.ConfigDataPort.DWord;
}
protected void DebugSendBAR(UInt32 aAddr, byte aBar) {
UInt32 x = ReadRegister(aAddr, (byte)(0x10 + aBar * 4));
if ((x & 0x01) == 0x01) {
//TODO: Fix this 0 back to F when compmiler bug is fixed
x = x & 0x0FFFFFFC;
Global.Dbg.Send("BAR (IO) " + aBar + ": " + x.ToHex());
} else {
Global.Dbg.Send("BAR " + aBar + ": " + x.ToHex());
}
}
protected void DebugSendDevice(UInt32 aAddr) {
UInt32 x;
Global.Dbg.Send("--------------");
Global.Dbg.Send("ATA Controller");
x = ReadRegister(aAddr, 0x04);
Global.Dbg.Send("Status: " + ((UInt16)(x >> 16)).ToHex());
Global.Dbg.Send("Command: " + ((UInt16)(x & 0xFFFF)).ToHex());
x = ReadRegister(aAddr, 0x08);
Global.Dbg.Send("Class Code: " + ((byte)(x >> 24)).ToHex());
Global.Dbg.Send("Subclass: " + ((byte)((x >> 16) & 0xFF)).ToHex());
Global.Dbg.Send("Prog IF: " + ((byte)((x >> 8) & 0xFF)).ToHex());
Global.Dbg.Send("Revision ID: " + ((byte)(x & 0xFF)).ToHex());
x = ReadRegister(aAddr, 0x0C);
Global.Dbg.Send("BIST: " + ((byte)(x >> 24)).ToHex());
Global.Dbg.Send("Header Type: " + ((byte)((x >> 16) & 0xFF)).ToHex());
Global.Dbg.Send("Latency Timer: " + ((byte)((x >> 8) & 0xFF)).ToHex());
Global.Dbg.Send("Cache Line Size: " + ((byte)(x & 0xFF)).ToHex());
for (byte i = 0; i <= 5; i++) {
DebugSendBAR(aAddr, i);
}
Global.Dbg.Send("Max Latency: " + ((byte)(x >> 24)).ToHex());
Global.Dbg.Send("Min Grant: " + ((byte)((x >> 16) & 0xFF)).ToHex());
Global.Dbg.Send("Interrupt PIN: " + ((byte)((x >> 8) & 0xFF)).ToHex());
Global.Dbg.Send("Interrupt Line: " + ((byte)(x & 0xFF)).ToHex());
Global.Dbg.Send("--------------");
}
protected void EnumerateBusses() {
// We have to scan all busses. Normally only 0 and 1 are used.
// During dev, just scan first 4...takes too long to scan rest till our
@ -62,41 +103,7 @@ namespace Cosmos.Core {
UInt16 xDeviceID = (UInt16)(x >> 16);
if ((xVendorID == 0x8086) && (xDeviceID == 0x7111)) {
Global.Dbg.Send("--------------");
Global.Dbg.Send("ATA Controller");
x = ReadRegister(xAddr, 0x04);
Global.Dbg.Send("Status: " + ((UInt16)(x >> 16)).ToHex());
Global.Dbg.Send("Command: " + ((UInt16)(x & 0xFFFF)).ToHex());
x = ReadRegister(xAddr, 0x08);
Global.Dbg.Send("Class Code: " + ((byte)(x >> 24)).ToHex());
Global.Dbg.Send("Subclass: " + ((byte)((x >> 16) & 0xFF)).ToHex());
Global.Dbg.Send("Prog IF: " + ((byte)((x >> 8) & 0xFF)).ToHex());
Global.Dbg.Send("Revision ID: " + ((byte)(x & 0xFF)).ToHex());
x = ReadRegister(xAddr, 0x0C);
Global.Dbg.Send("BIST: " + ((byte)(x >> 24)).ToHex());
Global.Dbg.Send("Header Type: " + ((byte)((x >> 16) & 0xFF)).ToHex());
Global.Dbg.Send("Latency Timer: " + ((byte)((x >> 8) & 0xFF)).ToHex());
Global.Dbg.Send("Cache Line Size: " + ((byte)(x & 0xFF)).ToHex());
x = ReadRegister(xAddr, 0x10);
Global.Dbg.Send("BAR 0: " + x.ToHex());
x = ReadRegister(xAddr, 0x14);
Global.Dbg.Send("BAR 1: " + x.ToHex());
x = ReadRegister(xAddr, 0x18);
Global.Dbg.Send("BAR 2: " + x.ToHex());
x = ReadRegister(xAddr, 0x1C);
Global.Dbg.Send("BAR 3: " + x.ToHex());
x = ReadRegister(xAddr, 0x20);
Global.Dbg.Send("BAR 4: " + x.ToHex());
x = ReadRegister(xAddr, 0x24);
Global.Dbg.Send("BAR 5: " + x.ToHex());
x = ReadRegister(xAddr, 0x3C);
Global.Dbg.Send("Max Latency: " + ((byte)(x >> 24)).ToHex());
Global.Dbg.Send("Min Grant: " + ((byte)((x >> 16) & 0xFF)).ToHex());
Global.Dbg.Send("Interrupt PIN: " + ((byte)((x >> 8) & 0xFF)).ToHex());
Global.Dbg.Send("Interrupt Line: " + ((byte)(x & 0xFF)).ToHex());
Global.Dbg.Send("--------------");
DebugSendDevice(xAddr);
}
var xInfo = new PciInfo(xVendorID, xDeviceID);

View file

@ -0,0 +1,13 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<p>
<a href="http://wiki.osdev.org/ATA">http://wiki.osdev.org/ATA</a><br />
</p>
</body>
</html>

View file

@ -74,6 +74,7 @@
<None Include="Cosmos.snk" />
</ItemGroup>
<ItemGroup>
<Content Include="ATA.html" />
<Content Include="Drivers\ReadMe.html" />
<Content Include="Keyboard.html" />
<Content Include="TextScreen.html" />

View file

@ -48,6 +48,12 @@
<Compile Include="BreakpointsOS.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Kernel\Common\Cosmos.Common.Extensions\Cosmos.Common.Extensions.csproj">
<Project>{1FAC100C-D732-4EA4-B518-5AF4BAF64F2E}</Project>
<Name>Cosmos.Common.Extensions</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text;
using Sys = Cosmos.System;
using Cosmos.Debug.Kernel;
using Cosmos.Common.Extensions;
namespace BreakpointsKernel {
public class BreakpointsOS : Sys.Kernel {
@ -11,6 +12,10 @@ namespace BreakpointsKernel {
}
protected override void BeforeRun() {
UInt32 x = 0x000010E1;
x = x & 0xFFFFFFFC;
Console.WriteLine(x.ToHex());
Console.WriteLine("Hello " + 6.ToString());
//Debugger.Send("Hello from Cosmos!");
Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back.");

View file

@ -15,6 +15,25 @@
<h3>
Matthijs - Next Release</h3>
<ul>
<li>Literal bug<ul>
<li>
<pre>UInt32 x = 0x000010E1;
x = x &amp; 0xFFFFFFFC;
Console.WriteLine(x.ToHex());
This produces 000000E1
If you change it to
x = x &amp; 0x0FFFFFFC;
it works. It seems our compiler is outputting wrong when the high bit is set. The outputted ASM when the high bit is set is wrong:
System_Void__BreakpointsKernel_BreakpointsOS_BeforeRun____DOT__00000008:
; [Cosmos.IL2CPU.X86.IL.Ldc_I4]
push dword 0xFC
; Stack contains 2 items: (4, 4) </pre>
</li>
</ul>
</li>
<li>Express isnt showing any templates</li>
</ul>
<h3>