Cosmos/source/Cosmos.Core.DebugStub/CmdSend.xs
José Pedro 4e5e505e81
Fixed core dump.
Fixed test runner core dump handler.
Implemented debug engine core dump handler.
Added SendCoreDump calls for null reference, stack corruption and stack overflow exceptions.
2018-08-29 18:34:20 +01:00

430 lines
6.5 KiB
Text

namespace DebugStub
function SendRegisters {
// Send the actual started signal
AL = #Ds2Vs_Registers
ComWriteAL()
ESI = .PushAllPtr
ECX = 32
ComWriteX()
ESI = @.CallerESP
ComWrite32()
ESI = @.CallerEIP
ComWrite32()
}
function SendFrame {
AL = #Ds2Vs_Frame
ComWriteAL()
EAX = 32
ComWriteAX()
ESI = .CallerEBP
// Dont transmit EIP or old EBP
ESI + 8
ECX = 32
ComWriteX()
}
// AL contains channel
// BL contains command
// ESI contains data start pointer
// ECX contains number of bytes to send as command data
function SendCommandOnChannel{
+All
ComWriteAL()
-All
AL = BL
+All
ComWriteAL()
-All
+All
EAX = ECX
ComWriteEAX()
-All
// now ECX contains size of data (count)
// ESI contains address
while ECX != 0 {
ComWrite8()
ECX--
}
}
function SendStack {
AL = #Ds2Vs_Stack
ComWriteAL()
// Send size of bytes
ESI = .CallerESP
EAX = .CallerEBP
EAX - ESI
ComWriteAX()
// Send actual bytes
//
// Need to reload ESI, WriteAXToCompPort modifies it
ESI = .CallerESP
while ESI != .CallerEBP {
ComWrite8()
}
}
// sends a stack value
// Serial Params:
// 1: x32 - offset relative to EBP
// 2: x32 - size of data to send
function SendMethodContext {
+All
AL = #Ds2Vs_MethodContext
ComWriteAL()
ESI = .CallerEBP
// offset relative to ebp
// size of data to send
ComReadEAX()
ESI + EAX
ComReadEAX()
ECX = EAX
// now ECX contains size of data (count)
// ESI contains relative to EBP
while ECX != 0 {
ComWrite8()
ECX--
}
Exit:
-All
}
// none
// saveregs
// frame
//
// sends a stack value
// Serial Params:
// 1: x32 - address
// 2: x32 - size of data to send
function SendMemory {
+All
AL = #Ds2Vs_MemoryData
ComWriteAL()
ComReadEAX()
ESI = EAX
ComReadEAX()
ECX = EAX
// now ECX contains size of data (count)
// ESI contains address
while ECX != 0 {
ComWrite8()
ECX--
}
Exit:
-All
}
// Modifies: EAX, ESI
function SendTrace {
AL = #Ds2Vs_BreakPoint
// If we are running, its a tracepoint, not a breakpoint.
// In future, maybe separate these into 2 methods
if dword .DebugStatus = #Status_Run {
AL = #Ds2Vs_TracePoint
}
ComWriteAL()
// Send Calling EIP.
ESI = @.CallerEIP
ComWrite32()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendText {
+EBP
EBP = ESP
+All
// Write the type
AL = #Ds2Vs_Message
ComWriteAL()
// Write Length
ESI = EBP
ESI + 12
ECX = ESI[0]
ComWrite16()
// Address of string
ESI = EBP[8]
WriteChar:
if ECX = 0 goto Finalize
ComWrite8()
ECX--
// We are storing as 16 bits, but for now I will transmit 8 bits
// So we inc again to skip the 0
ESI++
goto WriteChar
////test
// Write Length
//ESI = EBP
//ESI + 12
//ECX = ESI[0]
//
//// Address of string
//ESI = EBP[8]
Finalize:
-All
-EBP
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendSimpleNumber {
+EBP
EBP = ESP
+All
// Write the type
AL = #Ds2Vs_SimpleNumber
ComWriteAL()
// Write value
EAX = EBP[8]
ComWriteEAX()
-All
-EBP
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendKernelPanic {
+EBP
EBP = ESP
+All
// Write the type
AL = #Ds2Vs_KernelPanic
ComWriteAL()
// Write value
EAX = EBP[8]
ComWriteEAX()
SendCoreDump()
-All
-EBP
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendSimpleLongNumber {
+EBP
EBP = ESP
+All
// Write the type
AL = #Ds2Vs_SimpleLongNumber
ComWriteAL()
// Write value
EAX = EBP[8]
ComWriteEAX()
EAX = EBP[12]
ComWriteEAX()
-All
-EBP
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendComplexNumber {
+EBP
EBP = ESP
+All
// Write the type
AL = #Ds2Vs_ComplexNumber
ComWriteAL()
// Write value
EAX = EBP[8]
ComWriteEAX()
-All
-EBP
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendComplexLongNumber {
+EBP
EBP = ESP
+All
// Write the type
AL = #Ds2Vs_ComplexLongNumber
ComWriteAL()
// Write value
EAX = EBP[8]
ComWriteEAX()
EAX = EBP[12]
ComWriteEAX()
-All
-EBP
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendPtr {
// Write the type
AL = #Ds2Vs_Pointer
ComWriteAL()
// pointer value
ESI = EBP[8]
ComWrite32()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendStackCorruptionOccurred {
// Write the type
AL = #Ds2Vs_StackCorruptionOccurred
ComWriteAL()
// pointer value
ESI = @.CallerEIP
ComWrite32()
SendCoreDump()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendStackOverflowOccurred {
// Write the type
AL = #Ds2Vs_StackOverflowOccurred
ComWriteAL()
// pointer value
ESI = @.CallerEIP
ComWrite32()
SendCoreDump()
}
// Input: None
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendInterruptOccurred {
// Write the type
+EAX
AL = #Ds2Vs_InterruptOccurred
ComWriteAL()
-EAX
ComWriteEAX()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendNullReferenceOccurred {
// Write the type
AL = #Ds2Vs_NullReferenceOccurred
ComWriteAL()
// pointer value
ESI = @.CallerEIP
ComWrite32()
SendCoreDump()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendMessageBox {
// Write the type
AL = #Ds2Vs_MessageBox
ComWriteAL()
// Write Length
ESI = EBP
ESI + 12
ECX = ESI[0]
ComWrite16()
// Address of string
ESI = EBP[8]
WriteChar:
if ECX = 0 return
ComWrite8()
ECX--
// We are storing as 16 bits, but for now I will transmit 8 bits
// So we inc again to skip the 0
ESI++
goto WriteChar
}
function SendCoreDump {
+EAX
+EBX
+ECX
+EDX
+EDI
+ESI
EAX = @.CallerEBP
+EAX
EAX = @.CallerEIP
+EAX
EAX = @.CallerESP
+EAX
ECX = 36
EAX = EBP
while EAX != 0 {
EBX = [EAX + 4]
+EBX
ECX + 4
EAX = [EAX]
}
// Send command
AL = #Ds2Vs_CoreDump
ComWriteAL()
EAX = ECX
ComWriteAX()
while ECX != 0 {
-EAX
ComWriteEAX()
ECX--
}
}