mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
Improved cpu exception tracing.
This commit is contained in:
parent
967c67f19f
commit
dfdc58ee53
5 changed files with 3027 additions and 3013 deletions
|
|
@ -142,6 +142,8 @@ namespace Cosmos.Core
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private static uint mLastKnownAddress;
|
||||||
|
|
||||||
private static IRQDelegate[] mIRQ_Handlers = new IRQDelegate[256];
|
private static IRQDelegate[] mIRQ_Handlers = new IRQDelegate[256];
|
||||||
|
|
||||||
// We used to use:
|
// We used to use:
|
||||||
|
|
@ -396,7 +398,9 @@ namespace Cosmos.Core
|
||||||
|
|
||||||
public static void HandleInterrupt_06(ref IRQContext aContext)
|
public static void HandleInterrupt_06(ref IRQContext aContext)
|
||||||
{
|
{
|
||||||
HandleException(aContext.EIP, "Invalid Opcode", "EInvalidOpcode", ref aContext, true);
|
// although mLastKnownAddress is a static, we need to get it here, any subsequent calls will change the value!!!
|
||||||
|
var xLastKnownAddress = mLastKnownAddress;
|
||||||
|
HandleException(aContext.EIP, "Invalid Opcode", "EInvalidOpcode", ref aContext, xLastKnownAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void HandleInterrupt_07(ref IRQContext aContext)
|
public static void HandleInterrupt_07(ref IRQContext aContext)
|
||||||
|
|
@ -472,7 +476,7 @@ namespace Cosmos.Core
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private static void HandleException(uint aEIP, string aDescription, string aName, ref IRQContext ctx, bool printOriginalEIP = false)
|
private static void HandleException(uint aEIP, string aDescription, string aName, ref IRQContext ctx, uint lastKnownAddressValue = 0)
|
||||||
{
|
{
|
||||||
// At this point we are in a very unstable state.
|
// At this point we are in a very unstable state.
|
||||||
// Try not to use any Cosmos routines, just
|
// Try not to use any Cosmos routines, just
|
||||||
|
|
@ -514,18 +518,18 @@ namespace Cosmos.Core
|
||||||
PutErrorChar(0, 25,'*');
|
PutErrorChar(0, 25,'*');
|
||||||
PutErrorChar(0, 26,' ');
|
PutErrorChar(0, 26,' ');
|
||||||
|
|
||||||
if (printOriginalEIP)
|
if (lastKnownAddressValue != 0)
|
||||||
{
|
{
|
||||||
PutErrorString(1, 0, "Original EIP: 0x");
|
PutErrorString(1, 0, "Last known address: 0x");
|
||||||
// start eip at 16
|
// start eip at 16
|
||||||
PutErrorChar(1, 16, xHex[(int)((aEIP >> 28) & 0xF)]);
|
PutErrorChar(1, 16, xHex[(int)((lastKnownAddressValue >> 28) & 0xF)]);
|
||||||
PutErrorChar(1, 17, xHex[(int)((aEIP >> 24) & 0xF)]);
|
PutErrorChar(1, 17, xHex[(int)((lastKnownAddressValue >> 24) & 0xF)]);
|
||||||
PutErrorChar(1, 18, xHex[(int)((aEIP >> 20) & 0xF)]);
|
PutErrorChar(1, 18, xHex[(int)((lastKnownAddressValue >> 20) & 0xF)]);
|
||||||
PutErrorChar(1, 19, xHex[(int)((aEIP >> 16) & 0xF)]);
|
PutErrorChar(1, 19, xHex[(int)((lastKnownAddressValue >> 16) & 0xF)]);
|
||||||
PutErrorChar(1, 20, xHex[(int)((aEIP >> 12) & 0xF)]);
|
PutErrorChar(1, 20, xHex[(int)((lastKnownAddressValue >> 12) & 0xF)]);
|
||||||
PutErrorChar(1, 21, xHex[(int)((aEIP >> 8) & 0xF)]);
|
PutErrorChar(1, 21, xHex[(int)((lastKnownAddressValue >> 8) & 0xF)]);
|
||||||
PutErrorChar(1, 22, xHex[(int)((aEIP >> 4) & 0xF)]);
|
PutErrorChar(1, 22, xHex[(int)((lastKnownAddressValue >> 4) & 0xF)]);
|
||||||
PutErrorChar(1, 23, xHex[(int)(aEIP & 0xF)]);
|
PutErrorChar(1, 23, xHex[(int)(lastKnownAddressValue & 0xF)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,6 @@ indent_size = 2
|
||||||
|
|
||||||
[IL/*.cs]
|
[IL/*.cs]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|
||||||
|
[AppAssembler.cs]
|
||||||
|
indent_style = 4
|
||||||
|
|
@ -64,10 +64,6 @@ namespace Cosmos.IL2CPU
|
||||||
|
|
||||||
protected void MethodBegin(MethodInfo aMethod)
|
protected void MethodBegin(MethodInfo aMethod)
|
||||||
{
|
{
|
||||||
if (aMethod.MethodBase.GetFullName() == "SystemUInt64SystemCollectionsGenericList1SystemUInt64get_ItemSystemInt32")
|
|
||||||
{
|
|
||||||
Console.Write("");
|
|
||||||
}
|
|
||||||
new Comment("---------------------------------------------------------");
|
new Comment("---------------------------------------------------------");
|
||||||
new Comment("Assembly: " + aMethod.MethodBase.DeclaringType.Assembly.FullName);
|
new Comment("Assembly: " + aMethod.MethodBase.DeclaringType.Assembly.FullName);
|
||||||
new Comment("Type: " + aMethod.MethodBase.DeclaringType.ToString());
|
new Comment("Type: " + aMethod.MethodBase.DeclaringType.ToString());
|
||||||
|
|
@ -285,11 +281,22 @@ namespace Cosmos.IL2CPU
|
||||||
{
|
{
|
||||||
xReturnSize = ILOp.Align(ILOp.SizeOfType(xMethInfo.ReturnType), 4);
|
xReturnSize = ILOp.Align(ILOp.SizeOfType(xMethInfo.ReturnType), 4);
|
||||||
}
|
}
|
||||||
if (aMethod.PlugMethod == null && !aMethod.IsInlineAssembler)
|
var xMethodLabel = ILOp.GetMethodLabel(aMethod);
|
||||||
|
if (aMethod.PlugMethod == null
|
||||||
|
&& !aMethod.IsInlineAssembler)
|
||||||
{
|
{
|
||||||
new Cosmos.Assembler.Label(ILOp.GetMethodLabel(aMethod) + EndOfMethodLabelNameNormal);
|
new Cosmos.Assembler.Label(xMethodLabel + EndOfMethodLabelNameNormal);
|
||||||
|
|
||||||
|
new Comment("Following code is for debugging. Adjust accordingly!");
|
||||||
|
new Mov
|
||||||
|
{
|
||||||
|
DestinationRef = ElementReference.New("static_field__Cosmos_Core_INTs_mLastKnownAddress"),
|
||||||
|
DestinationIsIndirect = true,
|
||||||
|
SourceRef = ElementReference.New(xMethodLabel + EndOfMethodLabelNameNormal)
|
||||||
|
};
|
||||||
}
|
}
|
||||||
new Mov { DestinationReg = Registers.ECX, SourceValue = 0 };
|
|
||||||
|
new Mov { DestinationReg = Registers.ECX, SourceValue = 0 };
|
||||||
var xTotalArgsSize = (from item in aMethod.MethodBase.GetParameters()
|
var xTotalArgsSize = (from item in aMethod.MethodBase.GetParameters()
|
||||||
select (int)ILOp.Align(ILOp.SizeOfType(item.ParameterType), 4)).Sum();
|
select (int)ILOp.Align(ILOp.SizeOfType(item.ParameterType), 4)).Sum();
|
||||||
if (!aMethod.MethodBase.IsStatic)
|
if (!aMethod.MethodBase.IsStatic)
|
||||||
|
|
@ -343,7 +350,7 @@ namespace Cosmos.IL2CPU
|
||||||
}
|
}
|
||||||
// extra stack space is the space reserved for example when a "public static int TestMethod();" method is called, 4 bytes is pushed, to make room for result;
|
// extra stack space is the space reserved for example when a "public static int TestMethod();" method is called, 4 bytes is pushed, to make room for result;
|
||||||
}
|
}
|
||||||
var xLabelExc = ILOp.GetMethodLabel(aMethod) + EndOfMethodLabelNameException;
|
var xLabelExc = xMethodLabel + EndOfMethodLabelNameException;
|
||||||
new Cosmos.Assembler.Label(xLabelExc);
|
new Cosmos.Assembler.Label(xLabelExc);
|
||||||
if (aMethod.MethodAssembler == null && aMethod.PlugMethod == null && !aMethod.IsInlineAssembler)
|
if (aMethod.MethodAssembler == null && aMethod.PlugMethod == null && !aMethod.IsInlineAssembler)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue