//! library/kernel/memory — the process's memory interface: the heap allocator, DMA-capable //! buffers, shared-memory regions, and the raw `mmap` grant they all sit on. One flat module //! (formerly runtime.heap / runtime.dma / runtime.shared_memory, plus the `mmap` wrappers that //! lived in the system.zig dumping ground). Its private files are heap.zig, dma.zig, and //! shared-memory.zig — imported only here, so the heap's state and C symbols exist once. const abi = @import("abi"); const sc = @import("system-call"); const heap = @import("heap.zig"); const dma = @import("dma.zig"); const shared = @import("shared-memory.zig"); // --- the heap: a std.mem.Allocator over a first-fit free list (C malloc/free are also // exported from heap.zig, compiled once here) --- pub const allocator = heap.allocator; // --- the raw grant every allocation sits on --- pub const PROT_READ: usize = abi.prot_read; pub const PROT_WRITE: usize = abi.prot_write; pub const PROT_EXEC: usize = abi.prot_exec; /// Grant `len` bytes (rounded up to whole pages) of fresh, zeroed, writable memory and /// return the base virtual address. On failure returns a value in the top page (`mmapFailed`). pub fn mmap(len: usize, prot: usize) usize { return sc.systemCall2(.mmap, len, prot); } /// Release a range previously handed out by `mmap`. pub fn munmap(base: usize, len: usize) usize { return sc.systemCall2(.munmap, base, len); } /// Whether an `mmap` return value is an error (a wrapped -errno lands in the top page). pub inline fn mmapFailed(ret: usize) bool { return ret > ~@as(usize, 0) - 4095; } // --- DMA-capable buffers: physically contiguous, pinned, uncacheable, physical address known --- pub const DmaRegion = dma.Region; pub const dma_coherent = dma.coherent; pub const dma_write_combining = dma.write_combining; pub const dma_below_4g = dma.below_4g; pub const dma_shareable = dma.shareable; pub const dmaAlloc = dma.alloc; pub const dmaFree = dma.free; // --- shared-memory regions: a capability handed to another process over an ipc_call send_cap --- pub const SharedRegion = shared.Region; pub const sharedCreate = shared.create; pub const sharedMap = shared.map; pub const sharedPhysical = shared.physical;