Use std.BoundedArray instead of FixedVec
This commit is contained in:
+9
-10
@@ -1,7 +1,6 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
const kernel = @import("../kernel.zig");
|
const kernel = @import("../kernel.zig");
|
||||||
const vec = @import("../util/vec.zig");
|
|
||||||
const log = @import("../debug.zig").log;
|
const log = @import("../debug.zig").log;
|
||||||
const mem = @import("../mem.zig");
|
const mem = @import("../mem.zig");
|
||||||
const vmm = @import("vmm.zig");
|
const vmm = @import("vmm.zig");
|
||||||
@@ -112,24 +111,24 @@ const PhysicalMemoryManager = struct {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var gMemoryRegions: vec.FixedVec(MemoryRegion, 16) = .{};
|
var gMemoryRegions: std.BoundedArray(MemoryRegion, 16) = .{};
|
||||||
var gReservedRegions: vec.FixedVec(MemoryRegion, 16) = .{};
|
var gReservedRegions: std.BoundedArray(MemoryRegion, 16) = .{};
|
||||||
var gPhysicalMemoryLock = Spinlock{};
|
var gPhysicalMemoryLock = Spinlock{};
|
||||||
var gPhysicalMemory = PhysicalMemoryManager{ .pageArray = undefined };
|
var gPhysicalMemory = PhysicalMemoryManager{ .pageArray = undefined };
|
||||||
|
|
||||||
pub fn addMemoryRegion(name: []const u8, base: u64, size: u64) void {
|
pub fn addMemoryRegion(name: []const u8, base: u64, size: u64) void {
|
||||||
log.info("Memory: '{s}', base 0x{x}, size 0x{x}", .{ name, base, size });
|
log.info("Memory: '{s}', base 0x{x}, size 0x{x}", .{ name, base, size });
|
||||||
gMemoryRegions.push(.{ .name = name, .range = .{ .start = base, .len = size } });
|
gMemoryRegions.append(.{ .name = name, .range = .{ .start = base, .len = size } }) catch @panic("memory regions overflow");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn addReservedRegion(name: []const u8, base: u64, size: u64) void {
|
pub fn addReservedRegion(name: []const u8, base: u64, size: u64) void {
|
||||||
log.info("Reserved: '{s}', base 0x{x}, size 0x{x}", .{ name, base, size });
|
log.info("Reserved: '{s}', base 0x{x}, size 0x{x}", .{ name, base, size });
|
||||||
gReservedRegions.push(.{ .name = name, .range = .{ .start = base, .len = size } });
|
gReservedRegions.append(.{ .name = name, .range = .{ .start = base, .len = size } }) catch @panic("reserved regions overflow");
|
||||||
}
|
}
|
||||||
|
|
||||||
fn isReservedIn(page: u64) ?*const MemoryRegion {
|
fn isReservedIn(page: u64) ?*const MemoryRegion {
|
||||||
for (0..gReservedRegions.len) |i| {
|
for (0..gReservedRegions.len) |i| {
|
||||||
const region = &gReservedRegions.data[i];
|
const region = &gReservedRegions.buffer[i];
|
||||||
if (page >= region.range.start and page < region.range.end()) {
|
if (page >= region.range.start and page < region.range.end()) {
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
@@ -161,7 +160,7 @@ fn allocFromRegion(region: *const MemoryRegion, reason: []const u8, pageCount: u
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn allocPageArray(pageCount: usize) []Page {
|
fn allocPageArray(pageCount: usize) []Page {
|
||||||
for (gMemoryRegions.asConstSlice()) |region| {
|
for (gMemoryRegions.constSlice()) |region| {
|
||||||
if (allocFromRegion(®ion, "page-array", pageCount)) |physAddress| {
|
if (allocFromRegion(®ion, "page-array", pageCount)) |physAddress| {
|
||||||
const vaddr = (mem.PhysicalAddress{ .raw = physAddress }).virtualize();
|
const vaddr = (mem.PhysicalAddress{ .raw = physAddress }).virtualize();
|
||||||
const len = pageCount * PhysicalMemoryManager.RECORDS_PER_PAGE;
|
const len = pageCount * PhysicalMemoryManager.RECORDS_PER_PAGE;
|
||||||
@@ -180,7 +179,7 @@ pub fn init() void {
|
|||||||
var memoryStart: u64 = std.math.maxInt(u64);
|
var memoryStart: u64 = std.math.maxInt(u64);
|
||||||
var memoryEnd: u64 = std.math.minInt(u64);
|
var memoryEnd: u64 = std.math.minInt(u64);
|
||||||
|
|
||||||
for (gMemoryRegions.asConstSlice()) |region| {
|
for (gMemoryRegions.constSlice()) |region| {
|
||||||
if (region.range.start < memoryStart) {
|
if (region.range.start < memoryStart) {
|
||||||
memoryStart = region.range.start;
|
memoryStart = region.range.start;
|
||||||
}
|
}
|
||||||
@@ -195,14 +194,14 @@ pub fn init() void {
|
|||||||
const pageArray = allocPageArray(pageArrayPages);
|
const pageArray = allocPageArray(pageArrayPages);
|
||||||
var availablePages: usize = 0;
|
var availablePages: usize = 0;
|
||||||
|
|
||||||
for (gMemoryRegions.asConstSlice()) |region| {
|
for (gMemoryRegions.constSlice()) |region| {
|
||||||
const offset = (region.range.start - memoryStart) / vmm.PAGE_SIZE;
|
const offset = (region.range.start - memoryStart) / vmm.PAGE_SIZE;
|
||||||
for (0..region.range.len / vmm.PAGE_SIZE) |i| {
|
for (0..region.range.len / vmm.PAGE_SIZE) |i| {
|
||||||
pageArray[offset + i].makeAvailable();
|
pageArray[offset + i].makeAvailable();
|
||||||
availablePages += 1;
|
availablePages += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (gReservedRegions.asConstSlice()) |region| {
|
for (gReservedRegions.constSlice()) |region| {
|
||||||
const offset = (region.range.start - memoryStart) / vmm.PAGE_SIZE;
|
const offset = (region.range.start - memoryStart) / vmm.PAGE_SIZE;
|
||||||
for (0..region.range.len / vmm.PAGE_SIZE) |i| {
|
for (0..region.range.len / vmm.PAGE_SIZE) |i| {
|
||||||
if (offset + i >= pageArray.len) {
|
if (offset + i >= pageArray.len) {
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
pub fn FixedVec(comptime T: type, comptime N: usize) type {
|
|
||||||
return struct {
|
|
||||||
data: [N]T = undefined,
|
|
||||||
len: usize = 0,
|
|
||||||
|
|
||||||
pub fn push(self: *@This(), value: T) void {
|
|
||||||
if (self.len + 1 >= self.data.len) {
|
|
||||||
@panic("Fixed vector overflowed");
|
|
||||||
}
|
|
||||||
self.data[self.len] = value;
|
|
||||||
self.len += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn asConstSlice(self: *const @This()) []const T {
|
|
||||||
return self.data[0..self.len];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user