diff --git a/source/Cosmos/Cosmos.Hardware/DebugUtil.cs b/source/Cosmos/Cosmos.Hardware/DebugUtil.cs index 5b971ffd2..499a89989 100644 --- a/source/Cosmos/Cosmos.Hardware/DebugUtil.cs +++ b/source/Cosmos/Cosmos.Hardware/DebugUtil.cs @@ -92,7 +92,7 @@ namespace Cosmos.Hardware { public static unsafe void LogInterruptOccurred(Interrupts.InterruptContext* aContext) { StartLogging(); WriteSerialString("Interrupt, 8); + WriteNumber(aContext->Interrupt, 32); WriteSerialString("\" SS=\""); WriteNumber(aContext->SS, 32); WriteSerialString("\" GS=\""); @@ -103,6 +103,8 @@ namespace Cosmos.Hardware { WriteNumber(aContext->ES, 32); WriteSerialString("\" DS=\""); WriteNumber(aContext->DS, 32); + WriteSerialString("\" CS=\""); + WriteNumber(aContext->CS, 32); WriteSerialString("\" ESI=\""); WriteNumber(aContext->ESI, 32); WriteSerialString("\" EBP=\""); @@ -121,8 +123,6 @@ namespace Cosmos.Hardware { WriteNumber(aContext->Param, 32); WriteSerialString("\" EIP=\""); WriteNumber(aContext->EIP, 32); - WriteSerialString("\" CS=\""); - WriteNumber(aContext->CS, 32); WriteSerialString("\" EFlags=\""); WriteNumber(aContext->EFlags, 32); WriteSerialString("\" UserESP=\""); diff --git a/source/Cosmos/Cosmos.Hardware/Interrupts.cs b/source/Cosmos/Cosmos.Hardware/Interrupts.cs index 77c37b6af..4db98aa8c 100644 --- a/source/Cosmos/Cosmos.Hardware/Interrupts.cs +++ b/source/Cosmos/Cosmos.Hardware/Interrupts.cs @@ -7,7 +7,6 @@ namespace Cosmos.Hardware { public class Interrupts: Hardware { [StructLayout(LayoutKind.Sequential)] public struct InterruptContext { - public uint SS; public uint GS; public uint FS; public uint ES; @@ -20,12 +19,13 @@ namespace Cosmos.Hardware { public uint EDX; public uint ECX; public uint EAX; - public byte Interrupt; + public uint Interrupt; public uint Param; - public uint EIP; + public uint UserESP; public uint CS; public uint EFlags; - public uint UserESP; + public uint SS; + public uint EIP; } public unsafe static void HandleInterrupt_Default(InterruptContext* aContext) { diff --git a/source/Cosmos/Cosmos.Kernel.Plugs/Assemblers/CreateIDT.cs b/source/Cosmos/Cosmos.Kernel.Plugs/Assemblers/CreateIDT.cs index e2c3555f4..fe07a25a7 100644 --- a/source/Cosmos/Cosmos.Kernel.Plugs/Assemblers/CreateIDT.cs +++ b/source/Cosmos/Cosmos.Kernel.Plugs/Assemblers/CreateIDT.cs @@ -59,7 +59,7 @@ namespace Cosmos.Kernel.Plugs.Assemblers { int[] xInterruptsWithParam = new int[] { 8, 10, 11, 12, 13, 14 }; for (int j = 0; j < 256; j++) { new Label("__ISR_Handler_" + j.ToString("X2")); - if (j < 0x20 || j > 0x2F) { + if (j < 0x20 || j > 0x2F || true) { new CPUNative.Cli(); } new CPUNative.Break(); @@ -72,14 +72,13 @@ namespace Cosmos.Kernel.Plugs.Assemblers { new CPUx86.Pushd("es"); new CPUx86.Pushd("fs"); new CPUx86.Pushd("gs"); - new CPUx86.Pushd("ss"); - new CPUx86.Pushd("esp"); + new CPUx86.Move("eax", "esp"); + new CPUx86.Pushd("eax"); MethodDefinition xHandler = GetInterruptHandler((byte)j); if (xHandler == null) { xHandler = GetMethodDef(typeof(HW.Interrupts).Assembly, typeof(HW.Interrupts).FullName, "HandleInterrupt_Default", true); } new CPUx86.Call(Label.GenerateLabelName(xHandler)); - new CPUx86.Popd("ss"); new CPUx86.Popd("gs"); new CPUx86.Popd("fs"); new CPUx86.Popd("es"); @@ -93,7 +92,7 @@ namespace Cosmos.Kernel.Plugs.Assemblers { new CPUNative.IRet(); } new Label("__AFTER__ALL__ISR__HANDLER__STUBS__"); - new CPUNative.Sti(); + //new CPUNative.Sti(); } } } diff --git a/source/Cosmos/Cosmos.Kernel/CPU.cs b/source/Cosmos/Cosmos.Kernel/CPU.cs index e5dcf12a3..18d520ef1 100644 --- a/source/Cosmos/Cosmos.Kernel/CPU.cs +++ b/source/Cosmos/Cosmos.Kernel/CPU.cs @@ -5,13 +5,16 @@ using System.Text; namespace Cosmos.Kernel { public class CPU { public static void Init() { - Hardware.CPU.CreateGDT(); - Hardware.PIC.Init(); - Hardware.Serial.InitSerial(0); - Hardware.DebugUtil.Initialize(); - Hardware.DebugUtil.SendMessage("Logging", "Initialized!"); - Hardware.PIT.SetSlowest(); - Hardware.CPU.CreateIDT(); + //Hardware.CPU.CreateGDT(); +// Hardware.PIC.Init(); +// Hardware.Serial.InitSerial(0); +// Hardware.DebugUtil.Initialize(); +// System.Diagnostics.Debugger.Break(); +// Hardware.DebugUtil.SendMessage("Logging", "Initialized!"); +// System.Diagnostics.Debugger.Break(); +// Hardware.PIT.SetSlowest(); +// System.Diagnostics.Debugger.Break(); + //Hardware.CPU.CreateIDT(); } } } diff --git a/source/Cosmos/Cosmos.Shell.Console/Program.cs b/source/Cosmos/Cosmos.Shell.Console/Program.cs index 544214e22..fbcb0c99b 100644 --- a/source/Cosmos/Cosmos.Shell.Console/Program.cs +++ b/source/Cosmos/Cosmos.Shell.Console/Program.cs @@ -5,10 +5,9 @@ using System.Text; namespace Cosmos.Shell.Console { class Program { static void Main() { - Kernel.CPU.Init(); + //Kernel.CPU.Init(); System.Console.WriteLine("Cosmos creation complete"); - Kernel.Interrupts.DoTest(); - + //Kernel.Interrupts.DoTest(); } } } diff --git a/source/Indy.IL2CPU.Assembler.X86.Native/Assembler.cs b/source/Indy.IL2CPU.Assembler.X86.Native/Assembler.cs index eb1d95e84..6ebbb9a1b 100644 --- a/source/Indy.IL2CPU.Assembler.X86.Native/Assembler.cs +++ b/source/Indy.IL2CPU.Assembler.X86.Native/Assembler.cs @@ -23,16 +23,13 @@ namespace Indy.IL2CPU.Assembler.X86.Native { protected override void EmitIDataSectionHeader() { } - public override void Flush() { - base.Flush(); - } - protected override void EmitFooter() { mOutputWriter.WriteLine("_end_data: ; -- end of CODE+DATA "); mOutputWriter.WriteLine(""); mOutputWriter.WriteLine(";--- bss --- place r*, d* ? directives here, so that you'll have a BSS. "); mOutputWriter.WriteLine(""); mOutputWriter.WriteLine(""); + mOutputWriter.WriteLine("org 0xA00000"); mOutputWriter.WriteLine("rb 50000 ; our own stack "); mOutputWriter.WriteLine("Kernel_Stack: "); mOutputWriter.WriteLine(""); @@ -105,6 +102,7 @@ namespace Indy.IL2CPU.Assembler.X86.Native { mOutputWriter.WriteLine("; some more startups todo"); mOutputWriter.WriteLine(" cli"); mOutputWriter.WriteLine(" push ebx"); + mOutputWriter.WriteLine(" xchg bx, bx"); mOutputWriter.WriteLine(" call " + EntryPointName); mOutputWriter.WriteLine(" .loop:"); mOutputWriter.WriteLine(" hlt"); @@ -112,4 +110,4 @@ namespace Indy.IL2CPU.Assembler.X86.Native { mOutputWriter.WriteLine(" "); } } -} +} \ No newline at end of file diff --git a/source/Indy.IL2CPU.Assembler.X86/JumpIfEquals.cs b/source/Indy.IL2CPU.Assembler.X86/JumpIfEquals.cs index 5e8afc31c..bd715d1f9 100644 --- a/source/Indy.IL2CPU.Assembler.X86/JumpIfEquals.cs +++ b/source/Indy.IL2CPU.Assembler.X86/JumpIfEquals.cs @@ -14,7 +14,7 @@ namespace Indy.IL2CPU.Assembler.X86 { Address = aAddress; } public override string ToString() { - return "je " + Address; + return "je near " + Address; } } } diff --git a/source/Indy.IL2CPU.IL.X86/Ldsfld.cs b/source/Indy.IL2CPU.IL.X86/Ldsfld.cs index 60066b631..c0cf1880f 100644 --- a/source/Indy.IL2CPU.IL.X86/Ldsfld.cs +++ b/source/Indy.IL2CPU.IL.X86/Ldsfld.cs @@ -67,7 +67,10 @@ namespace Indy.IL2CPU.IL.X86 { } Assembler.StackSizes.Push(mSize); if (mNeedsGC) { - new CPUx86.Push("[" + mDataName + "]"); + new Dup(null, null) { + Assembler = this.Assembler + }. + Assemble(); Engine.QueueMethodRef(GCImplementationRefs.IncRefCountRef); new CPUx86.Call(Label.GenerateLabelName(GCImplementationRefs.IncRefCountRef)); } diff --git a/source/Indy.IL2CPU/Engine.cs b/source/Indy.IL2CPU/Engine.cs index 3245f74f1..9eb7633b8 100644 --- a/source/Indy.IL2CPU/Engine.cs +++ b/source/Indy.IL2CPU/Engine.cs @@ -234,7 +234,7 @@ namespace Indy.IL2CPU { foreach (TypeDefinition xType in mTypes) { foreach (MethodDefinition xMethod in xType.Constructors) { if (xMethod.IsStatic) { - xEntryPointOp.Call(xMethod); + //xEntryPointOp.Call(xMethod); } } }