55 lines
1.7 KiB
Zig
55 lines
1.7 KiB
Zig
const buffer = @import("ring_buffer.zig");
|
|
const vm = @import("arch/vm.zig");
|
|
|
|
pub const Connection = struct {
|
|
pid: u64,
|
|
read_buffer: buffer.RingBuffer,
|
|
write_buffer: buffer.RingBuffer,
|
|
|
|
pub fn read(self: *Connection, comptime T: type, out: *T) bool {
|
|
return self.read_buffer.readType(T, out);
|
|
}
|
|
|
|
pub fn write(self: *Connection, comptime T: type, in: *const T) bool {
|
|
return self.write_buffer.writeType(T, in);
|
|
}
|
|
|
|
pub fn readBytes(self: *Connection, bytes: [*]u8, length: usize) bool {
|
|
return self.read_buffer.read(bytes, length);
|
|
}
|
|
|
|
pub fn writeBytes(self: *Connection, bytes: []u8) bool {
|
|
return self.write_buffer.writeSlice(bytes);
|
|
}
|
|
};
|
|
|
|
pub const KERNEL_BUFFER_ADDRESS_OFFSET = 0x0000;
|
|
pub const INIT_WRITE_BUFFER_ADDRESS_OFFSET = 0x1000;
|
|
pub const INIT_READ_BUFFER_ADDRESS_OFFSET = 0x2000;
|
|
|
|
var kernel_buffer: ?buffer.RingBuffer = null;
|
|
|
|
pub fn setKernelBuffer(buf: buffer.RingBuffer) void {
|
|
kernel_buffer = buf;
|
|
}
|
|
|
|
pub fn getKernelBuffer() ?buffer.RingBuffer {
|
|
return kernel_buffer;
|
|
}
|
|
|
|
const PAGE_SIZE = vm.PAGE_SIZE;
|
|
|
|
fn createPageBufferFromAddress(address: u64) buffer.RingBuffer {
|
|
const data: [*]u8 = @ptrFromInt(address);
|
|
|
|
return buffer.RingBuffer.init(data, PAGE_SIZE, false);
|
|
}
|
|
|
|
pub fn readInitBuffers(base_address: u64) Connection {
|
|
kernel_buffer = createPageBufferFromAddress(base_address + KERNEL_BUFFER_ADDRESS_OFFSET);
|
|
const read_buffer = createPageBufferFromAddress(base_address + INIT_READ_BUFFER_ADDRESS_OFFSET);
|
|
const write_buffer = createPageBufferFromAddress(base_address + INIT_WRITE_BUFFER_ADDRESS_OFFSET);
|
|
|
|
return .{ .pid = 0, .read_buffer = read_buffer, .write_buffer = write_buffer };
|
|
}
|