std1.0.0-beta-7 SafeC docs

Source kernel/paging.h

View in the repository

// SafeC Standard Library — Page Table Management
// Virtual memory page table entries and mapping. Freestanding-safe.
#pragma once

// Page table flags
#define PAGE_PRESENT    1
#define PAGE_WRITABLE   2
#define PAGE_USER       4
#define PAGE_WRITE_THRU 8
#define PAGE_NO_CACHE   16
#define PAGE_ACCESSED   32
#define PAGE_DIRTY      64
#define PAGE_HUGE       128

#define PAGE_SIZE       4096
#define PAGE_TABLE_SIZE 512

namespace std {

struct PageEntry {
    unsigned long value;  // raw page table entry (flags + physical address)
};

struct PageTable {
    struct PageEntry entries[PAGE_TABLE_SIZE];

    // Initialize all entries to zero.
    void          init();

    // Map entry at `idx` to `phys_addr` with `flags`.
    void          map(int idx, unsigned long phys_addr, unsigned int flags);

    // Unmap entry at `idx`.
    void          unmap(int idx);

    // Check if entry at `idx` is present. Returns 1 if present.
    int           is_present(int idx) const;

    // Get physical address from entry at `idx`. Returns 0 if not present.
    unsigned long get_phys(int idx) const;

    // Get flags from entry at `idx`.
    unsigned int  get_flags(int idx) const;

    // Set flags on existing mapping (preserves physical address).
    void          set_flags(int idx, unsigned int flags);
};

} // namespace std