mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 12:30:32 +00:00
424 lines
6.9 KiB
Text
424 lines
6.9 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()
|
|
}
|
|
|
|
// Input: Stack
|
|
// Output: None
|
|
// Modifies: EAX, ECX, EDX, ESI
|
|
function SendStackOverflowOccurred {
|
|
// Write the type
|
|
AL = #Ds2Vs_StackOverflowOccurred
|
|
ComWriteAL()
|
|
|
|
// pointer value
|
|
ESI = @.CallerEIP
|
|
ComWrite32()
|
|
}
|
|
|
|
// 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()
|
|
}
|
|
|
|
// 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
|
|
+EAX
|
|
ECX = ECX + 4
|
|
EAX = [EAX]
|
|
}
|
|
|
|
// Send command
|
|
AL = #Ds2Vs_CoreDump
|
|
ComWriteAL()
|
|
EAX = ECX
|
|
ComWriteAX()
|
|
while ECX != 0 {
|
|
-EAX
|
|
ComWriteEAX()
|
|
ECX--
|
|
}
|
|
}
|