fix: return E22 if hwbreak arr full

Also, ensure that the above case is the only time we return an errno
err. All the others are actually problems when parsing an invalid packet
so we should nack instead
This commit is contained in:
Rekai Nyangadzayi Musuka 2023-01-26 23:12:39 -06:00
parent 59b6b51466
commit dbf00006e7
1 changed files with 27 additions and 21 deletions

View File

@ -77,8 +77,8 @@ pub fn parse(self: *Self, allocator: Allocator, state: *State, emu: Emulator) !S
'G' => @panic("TODO: Register Write"), 'G' => @panic("TODO: Register Write"),
'm' => { 'm' => {
var tokens = std.mem.tokenize(u8, self.contents[1..], ","); var tokens = std.mem.tokenize(u8, self.contents[1..], ",");
const addr_str = tokens.next() orelse return .{ .static = "E9999" }; // EUNKNOWN const addr_str = tokens.next() orelse return error.InvalidPacket;
const length_str = tokens.next() orelse return .{ .static = "E9999" }; // EUNKNOWN const length_str = tokens.next() orelse return error.InvalidPacket;
const addr = try std.fmt.parseInt(u32, addr_str, 16); const addr = try std.fmt.parseInt(u32, addr_str, 16);
const len = try std.fmt.parseInt(u32, length_str, 16); const len = try std.fmt.parseInt(u32, length_str, 16);
@ -119,39 +119,43 @@ pub fn parse(self: *Self, allocator: Allocator, state: *State, emu: Emulator) !S
// Breakpoints // Breakpoints
'z' => switch (self.contents[1]) { 'z' => switch (self.contents[1]) {
'0' => @panic("TODO: Remove Software Breakpoint"), '0' => return .{ .static = "" }, //TODO: Remove Software Breakpoint
'1' => { '1' => {
var tokens = std.mem.tokenize(u8, self.contents[2..], ","); var tokens = std.mem.tokenize(u8, self.contents[2..], ",");
const addr_str = tokens.next() orelse return .{ .static = "E9999" };
// const kind_str = tokens.next() orelse return .{ .static = "E9999" };
const addr_str = tokens.next() orelse return error.InvalidPacket;
const addr = try std.fmt.parseInt(u32, addr_str, 16); const addr = try std.fmt.parseInt(u32, addr_str, 16);
// const kind = try std.fmt.parseInt(u32, kind_str, 16);
state.hw_bkpt.remove(addr); state.hw_bkpt.remove(addr);
return .{ .static = "OK" }; return .{ .static = "OK" };
}, },
'2' => @panic("TODO: Remove Write Watchpoint"), '2' => return .{ .static = "" }, // TODO: Remove Write Watchpoint
'3' => @panic("TODO: Remove Read Watchpoint"), '3' => return .{ .static = "" }, // TODO: Remove Read Watchpoint
'4' => @panic("TODO: Remove Access Watchpoint"), '4' => return .{ .static = "" }, // TODO: Remove Access Watchpoint
else => return .{ .static = "" }, else => return .{ .static = "" },
}, },
'Z' => switch (self.contents[1]) { 'Z' => switch (self.contents[1]) {
'0' => @panic("TODO: Insert Software Breakpoint"), '0' => return .{ .static = "" }, //TODO: Insert Software Breakpoint
'1' => { '1' => {
var tokens = std.mem.tokenize(u8, self.contents[2..], ","); var tokens = std.mem.tokenize(u8, self.contents[2..], ",");
const addr_str = tokens.next() orelse return .{ .static = "E9999" }; const addr_str = tokens.next() orelse return error.InvalidPacket;
const kind_str = tokens.next() orelse return .{ .static = "E9999" }; const kind_str = tokens.next() orelse return error.InvalidPacket;
const addr = try std.fmt.parseInt(u32, addr_str, 16); const addr = try std.fmt.parseInt(u32, addr_str, 16);
const kind = try std.fmt.parseInt(u32, kind_str, 16); const kind = try std.fmt.parseInt(u32, kind_str, 16);
try state.hw_bkpt.add(addr, kind); state.hw_bkpt.add(addr, kind) catch |e| {
switch (e) {
error.OutOfSpace => return .{ .static = "E22" }, // FIXME: Which errno?
else => return e,
}
};
return .{ .static = "OK" }; return .{ .static = "OK" };
}, },
'2' => @panic("TODO: Insert Write Watchpoint"), '2' => return .{ .static = "" }, // TODO: Insert Write Watchpoint
'3' => @panic("TODO: Insert Read Watchpoint"), '3' => return .{ .static = "" }, // TODO: Insert Read Watchpoint
'4' => @panic("TODO: Insert Access Watchpoint"), '4' => return .{ .static = "" }, // TODO: Insert Access Watchpoint
else => return .{ .static = "" }, else => return .{ .static = "" },
}, },
@ -171,6 +175,7 @@ pub fn parse(self: *Self, allocator: Allocator, state: *State, emu: Emulator) !S
}, },
'q' => { 'q' => {
if (self.contents[1] == 'C' and self.contents.len == 2) return .{ .static = "QC1" }; if (self.contents[1] == 'C' and self.contents.len == 2) return .{ .static = "QC1" };
if (substr(self.contents[1..], "fThreadInfo")) return .{ .static = "m1" }; if (substr(self.contents[1..], "fThreadInfo")) return .{ .static = "m1" };
if (substr(self.contents[1..], "sThreadInfo")) return .{ .static = "l" }; if (substr(self.contents[1..], "sThreadInfo")) return .{ .static = "l" };
if (substr(self.contents[1..], "Attached")) return .{ .static = "1" }; // Tell GDB we're attached to a process if (substr(self.contents[1..], "Attached")) return .{ .static = "1" }; // Tell GDB we're attached to a process
@ -188,9 +193,10 @@ pub fn parse(self: *Self, allocator: Allocator, state: *State, emu: Emulator) !S
_ = tokens.next(); // Xfer _ = tokens.next(); // Xfer
_ = tokens.next(); // features _ = tokens.next(); // features
_ = tokens.next(); // read _ = tokens.next(); // read
const annex = tokens.next() orelse return .{ .static = "E9999" };
const offset_str = tokens.next() orelse return .{ .static = "E99999" }; const annex = tokens.next() orelse return error.InvalidPacket;
const length_str = tokens.next() orelse return .{ .static = "E9999" }; const offset_str = tokens.next() orelse return error.InvalidPacket;
const length_str = tokens.next() orelse return error.InvalidPacket;
if (std.mem.eql(u8, annex, "target.xml")) { if (std.mem.eql(u8, annex, "target.xml")) {
const offset = try std.fmt.parseInt(usize, offset_str, 16); const offset = try std.fmt.parseInt(usize, offset_str, 16);
@ -219,8 +225,8 @@ pub fn parse(self: *Self, allocator: Allocator, state: *State, emu: Emulator) !S
_ = tokens.next(); // Xfer _ = tokens.next(); // Xfer
_ = tokens.next(); // memory-map _ = tokens.next(); // memory-map
_ = tokens.next(); // read _ = tokens.next(); // read
const offset_str = tokens.next() orelse return .{ .static = "E9999" }; const offset_str = tokens.next() orelse return error.InvalidPacket;
const length_str = tokens.next() orelse return .{ .static = "E9999" }; const length_str = tokens.next() orelse return error.InvalidPacket;
const offset = try std.fmt.parseInt(usize, offset_str, 16); const offset = try std.fmt.parseInt(usize, offset_str, 16);
const length = try std.fmt.parseInt(usize, length_str, 16); const length = try std.fmt.parseInt(usize, length_str, 16);