aboutsummaryrefslogtreecommitdiff
path: root/mirai/crimson/render/modules.zig
blob: 8520fb1ba109347408154b052209d2c6cff00cc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//! Render Loaded Modules

const serial = @import("../../drivers/serial/serial.zig");

pub const ModuleInfo = struct {
    name: [64]u8,
    name_len: usize,
    base_address: u64,
    size: u64,
};

pub const max_modules = 32;

var loaded_modules: [max_modules]ModuleInfo = undefined;
var module_count: usize = 0;

pub fn register_module(name: []const u8, base_address: u64, size: u64) bool {
    if (module_count >= max_modules) {
        return false;
    }

    var module = &loaded_modules[module_count];
    const len = @min(name.len, 63);
    for (name[0..len], 0..) |c, i| {
        module.name[i] = c;
    }
    module.name[len] = 0;
    module.name_len = len;
    module.base_address = base_address;
    module.size = size;

    module_count += 1;
    return true;
}

pub fn render() void {
    if (module_count == 0) {
        serial.printf("Loaded Modules: (none registered)\n\n", .{});
        return;
    }

    serial.printf("Loaded Modules:\n", .{});

    for (0..module_count) |i| {
        const module = &loaded_modules[i];
        serial.printf("  %s: %x - %x (%d bytes)\n", .{
            module.name[0..module.name_len],
            module.base_address,
            module.base_address + module.size,
            module.size,
        });
    }

    serial.printf("\n", .{});
}

pub fn find_module_for_address(address: u64) ?*const ModuleInfo {
    for (0..module_count) |i| {
        const module = &loaded_modules[i];
        if (address >= module.base_address and address < module.base_address + module.size) {
            return module;
        }
    }
    return null;
}

pub fn clear_modules() void {
    module_count = 0;
}