Cosmos/source/Cosmos.Debug.DebugStub/CmdSend.xs
Matthijs ter Woord 9460718e75 - Performance improvement of debugconnector. Debugging and test runner are impacted
- new SendNumber overload introduced for easier debugging of low level stuff.
2015-07-28 19:24:39 -04:00

279 lines
4.6 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 Length
EAX = EBP[8]
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()
}
// Input: Stack
// Output: None
// Modifies: EAX, ECX, EDX, ESI
function SendNullReferenceOccurred {
// Write the type
AL = #Ds2Vs_NullReferenceOccurred
ComWriteAL()
// pointer value
ESI = @.CallerEIP
ComWrite32()
}
// 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
}