mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 04:18:43 +00:00
Fixed test runner core dump handler. Implemented debug engine core dump handler. Added SendCoreDump calls for null reference, stack corruption and stack overflow exceptions.
430 lines
6.5 KiB
Text
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--
|
|
}
|
|
}
|