Compare commits

...

4 Commits

Author SHA1 Message Date
215e053b9a chore: replace link() with getModule() 2023-03-19 20:44:36 -05:00
acb59994fc chore: update to latest zig master 2023-02-23 02:43:58 -06:00
6d6a109a08 fix: gracefully exit
fix stack overflow bug in State.deinit
allow for code in another thread to signal shutdown to gdbstub
2023-02-13 20:01:01 -06:00
c1158b547e chore: update to zig master
current zig master has changes to build system
TODO: make use of Zig's package manager
2023-02-07 17:02:33 -06:00
4 changed files with 35 additions and 39 deletions

View File

@@ -1,54 +1,44 @@
const std = @import("std"); const std = @import("std");
const CompileStep = std.Build.CompileStep;
fn path(comptime suffix: []const u8) []const u8 { fn path(comptime suffix: []const u8) []const u8 {
if (suffix[0] == '/') @compileError("expected a relative path"); if (suffix[0] == '/') @compileError("expected a relative path");
return comptime (std.fs.path.dirname(@src().file) orelse ".") ++ std.fs.path.sep_str ++ suffix; return comptime (std.fs.path.dirname(@src().file) orelse ".") ++ std.fs.path.sep_str ++ suffix;
} }
const pkgs = struct { pub fn getModule(b: *std.Build) *std.build.Module {
const Pkg = std.build.Pkg;
pub const gdbstub: Pkg = .{
.name = "gdbstub",
.source = .{ .path = path("src/lib.zig") },
.dependencies = &[_]Pkg{network},
};
// https://github.com/MasterQ32/zig-network // https://github.com/MasterQ32/zig-network
pub const network: Pkg = .{ const network = b.createModule(.{ .source_file = .{ .path = path("lib/zig-network/network.zig") } });
.name = "network",
.source = .{ .path = path("lib/zig-network/network.zig") },
};
};
pub fn link(exe: *std.build.LibExeObjStep) void { return b.createModule(.{
exe.addPackage(pkgs.gdbstub); .source_file = .{ .path = path("src/lib.zig") },
.dependencies = &.{.{ .name = "network", .module = network }},
});
} }
pub fn build(b: *std.build.Builder) void { pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{}); const target = b.standardTargetOptions(.{});
_ = target; // const optimize = b.standardOptimizeOption(.{});
const mode = b.standardReleaseOptions();
// -- library -- // -- Library --
const lib = b.addStaticLibrary("gdbstub", "src/lib.zig");
lib.addPackage(pkgs.network);
lib.setBuildMode(mode); const lib_test = b.addTest(.{
lib.install(); .root_source_file = .{ .path = "src/lib.zig" },
.target = target,
});
const lib_tests = b.addTest("src/lib.zig"); const test_step = b.step("test", "Run Library Tests");
lib_tests.setBuildMode(mode); test_step.dependOn(&lib_test.step);
const test_step = b.step("lib-test", "Run Library Tests"); // -- Executable --
test_step.dependOn(&lib_tests.step);
// // -- Executable -- // const exe = b.addExecutable(.{
// const exe = b.addExecutable("gdbserver", "src/main.zig"); // .name = "gdbserver",
// .root_source_file = .{ .path = "src/main.zig" },
// .target = target,
// .optimize = optimize,
// });
// link(exe); // link(exe);
// exe.setTarget(target);
// exe.setBuildMode(mode);
// exe.install(); // exe.install();
// const run_cmd = exe.run(); // const run_cmd = exe.run();

View File

@@ -4,6 +4,7 @@ const Packet = @import("Packet.zig");
const Socket = network.Socket; const Socket = network.Socket;
const Allocator = std.mem.Allocator; const Allocator = std.mem.Allocator;
const Atomic = std.atomic.Atomic;
const Emulator = @import("lib.zig").Emulator; const Emulator = @import("lib.zig").Emulator;
const Self = @This(); const Self = @This();
@@ -94,16 +95,21 @@ const Action = union(enum) {
nack, nack,
}; };
pub fn run(self: *Self, allocator: Allocator) !void { pub fn run(self: *Self, allocator: Allocator, quit: *Atomic(bool)) !void {
var buf: [Packet.max_len]u8 = undefined; var buf: [Packet.max_len]u8 = undefined;
while (true) { while (true) {
const len = try self.client.receive(&buf); const len = try self.client.receive(&buf);
if (len == 0) break; if (len == 0) break;
if (quit.load(.Monotonic)) break;
const action = try self.parse(allocator, buf[0..len]); const action = try self.parse(allocator, buf[0..len]);
try self.send(allocator, action); try self.send(allocator, action);
} }
// Just in case its the gdbstub that exited first,
// attempt to signal to the GUI that it should also exit
quit.store(true, .Monotonic);
} }
fn parse(self: *Self, allocator: Allocator, input: []const u8) !Action { fn parse(self: *Self, allocator: Allocator, input: []const u8) !Action {

View File

@@ -25,7 +25,7 @@ const SwBkpt = struct {
} }
pub fn deinit(self: *@This()) void { pub fn deinit(self: *@This()) void {
self.deinit(); self.list.deinit();
self.* = undefined; self.* = undefined;
} }
@@ -47,7 +47,7 @@ const SwBkpt = struct {
} }
pub fn remove(self: *@This(), addr: u32) void { pub fn remove(self: *@This(), addr: u32) void {
for (self.list.items) |bkpt, i| { for (self.list.items, 0..) |bkpt, i| {
if (bkpt.addr == addr) { if (bkpt.addr == addr) {
_ = self.list.orderedRemove(i); _ = self.list.orderedRemove(i);
log.debug("Removed Breakpoint at 0x{X:0>8}", .{addr}); log.debug("Removed Breakpoint at 0x{X:0>8}", .{addr});
@@ -73,7 +73,7 @@ const HwBkpt = struct {
} }
pub fn add(self: *@This(), addr: u32, kind: u32) !void { pub fn add(self: *@This(), addr: u32, kind: u32) !void {
for (self.list) |*bkpt_opt| { for (&self.list) |*bkpt_opt| {
if (bkpt_opt.*) |bkpt| { if (bkpt_opt.*) |bkpt| {
if (bkpt.addr == addr) return; // idempotent if (bkpt.addr == addr) return; // idempotent
} else { } else {
@@ -88,7 +88,7 @@ const HwBkpt = struct {
} }
pub fn remove(self: *@This(), addr: u32) void { pub fn remove(self: *@This(), addr: u32) void {
for (self.list) |*bkpt_opt| { for (&self.list) |*bkpt_opt| {
const bkpt = bkpt_opt.* orelse continue; const bkpt = bkpt_opt.* orelse continue;
if (bkpt.addr == addr) { if (bkpt.addr == addr) {