Skip to content

Commit ee049f0

Browse files
committed
Handle more host commands, up to qWasmCallStack
1 parent 97f5791 commit ee049f0

File tree

2 files changed

+57
-17
lines changed

2 files changed

+57
-17
lines changed

Sources/GDBRemoteProtocol/GDBHostCommand.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ package struct GDBHostCommand: Equatable {
2323
case subsequentThreadInfo
2424
case targetStatus
2525
case registerInfo
26+
case structuredDataPlugins
27+
case transfer
28+
case readMemoryBinaryData
29+
case readMemory
30+
case wasmCallStack
2631

2732
case generalRegisters
2833

@@ -56,6 +61,12 @@ package struct GDBHostCommand: Equatable {
5661
self = .subsequentThreadInfo
5762
case "?":
5863
self = .targetStatus
64+
case "qStructuredDataPlugins":
65+
self = .structuredDataPlugins
66+
case "qXfer":
67+
self = .transfer
68+
case "qWasmCallStack":
69+
self = .wasmCallStack
5970

6071
default:
6172
return nil
@@ -69,7 +80,16 @@ package struct GDBHostCommand: Equatable {
6980

7081
package init(kindString: String, arguments: String) throws {
7182
let registerInfoPrefix = "qRegisterInfo"
72-
if kindString.starts(with: registerInfoPrefix) {
83+
84+
if kindString.starts(with: "x") {
85+
self.kind = .readMemoryBinaryData
86+
self.arguments = String(kindString.dropFirst())
87+
return
88+
} else if kindString.starts(with: "m") {
89+
self.kind = .readMemory
90+
self.arguments = String(kindString.dropFirst())
91+
return
92+
} else if kindString.starts(with: registerInfoPrefix) {
7393
self.kind = .registerInfo
7494

7595
guard arguments.isEmpty else {

Sources/WasmKitGDBHandler/WasmKitDebugger.swift

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,35 @@ import SystemPackage
55
import WasmKit
66

77
package actor WasmKitDebugger {
8+
enum Error: Swift.Error {
9+
case unknownTransferArguments
10+
}
11+
812
private let module: Module
13+
private let moduleFilePath: FilePath
914
private let logger: Logger
1015

1116
package init(logger: Logger, moduleFilePath: FilePath) throws {
1217
self.logger = logger
1318
self.module = try parseWasm(filePath: moduleFilePath)
19+
self.moduleFilePath = moduleFilePath
1420
}
1521

16-
package func handle(command: GDBHostCommand) -> GDBTargetResponse {
22+
package func handle(command: GDBHostCommand) throws -> GDBTargetResponse {
1723
let responseKind: GDBTargetResponse.Kind
1824
logger.trace("handling GDB host command", metadata: ["GDBHostCommand": .string(command.kind.rawValue)])
1925

2026
var isNoAckModeActivated = false
21-
responseKind =
2227
switch command.kind {
2328
case .startNoAckMode:
2429
isNoAckModeActivated = true
2530
fallthrough
2631

2732
case .isThreadSuffixSupported, .listThreadsInStopReply:
28-
.ok
33+
responseKind = .ok
2934

3035
case .hostInfo:
31-
.keyValuePairs([
36+
responseKind = .keyValuePairs([
3237
"arch": "wasm32",
3338
"ptrsize": "4",
3439
"endian": "little",
@@ -37,15 +42,16 @@ package actor WasmKitDebugger {
3742
])
3843

3944
case .supportedFeatures:
40-
.raw("qXfer:libraries:read+;PacketSize=1000;")
45+
responseKind = .raw("qXfer:libraries:read+;PacketSize=1000;")
4146

4247
case .vContSupportedActions:
43-
.vContSupportedActions([.continue, .step])
48+
responseKind = .vContSupportedActions([.continue, .step])
49+
50+
case .isVAttachOrWaitSupported, .enableErrorStrings, .structuredDataPlugins, .readMemoryBinaryData:
51+
responseKind = .empty
4452

45-
case .isVAttachOrWaitSupported, .enableErrorStrings:
46-
.empty
4753
case .processInfo:
48-
.keyValuePairs([
54+
responseKind = .keyValuePairs([
4955
"pid": "1",
5056
"parent-pid": "1",
5157
"arch": "wasm32",
@@ -54,23 +60,23 @@ package actor WasmKitDebugger {
5460
])
5561

5662
case .currentThreadID:
57-
.raw("QC1")
63+
responseKind = .raw("QC1")
5864

5965
case .firstThreadInfo:
60-
.raw("m1")
66+
responseKind = .raw("m1")
6167

6268
case .subsequentThreadInfo:
63-
.raw("l")
69+
responseKind = .raw("l")
6470

6571
case .targetStatus:
66-
.keyValuePairs([
72+
responseKind = .keyValuePairs([
6773
"T05thread": "1",
6874
"reason": "trace",
6975
])
7076

7177
case .registerInfo:
7278
if command.arguments == "0" {
73-
.keyValuePairs([
79+
responseKind = .keyValuePairs([
7480
"name": "pc",
7581
"bitsize": "64",
7682
"offset": "0",
@@ -82,10 +88,24 @@ package actor WasmKitDebugger {
8288
"generic": "pc",
8389
])
8490
} else {
85-
.raw("E45")
91+
responseKind = .raw("E45")
8692
}
8793

88-
case .generalRegisters:
94+
case .transfer:
95+
if command.arguments.starts(with: "libraries:read:") {
96+
responseKind = .raw("""
97+
l<library-list>
98+
<library name="\(self.moduleFilePath.string)"><section address="0x4000000000000000"/></library>
99+
</library-list>
100+
""")
101+
} else {
102+
throw Error.unknownTransferArguments
103+
}
104+
105+
case .readMemory:
106+
responseKind = .empty
107+
108+
case .wasmCallStack, .generalRegisters:
89109
fatalError()
90110
}
91111

0 commit comments

Comments
 (0)