//--- // fxos.memory: Standard memory regions //--- #ifndef LIBFXOS_MEMORY_H #define LIBFXOS_MEMORY_H #include #include namespace FxOS { /* Memory area enumeration with a few tools */ class MemoryArea { public: enum MemoryAreaName { /* Userspace seen from user and privileged mode */ U0, P0, /* Second half of memory, only for privileged mode */ P1, P2, P3, P4, }; MemoryArea() = default; /* Construction from MemoryAreaName */ constexpr MemoryArea(MemoryAreaName name): m_name(name) {} /* Start, end (last byte in area) and size of area */ uint32_t start() const noexcept; uint32_t end() const noexcept; uint32_t size() const noexcept; /* Conversion to MemoryAreaName for switch */ constexpr operator MemoryAreaName() noexcept { return m_name; } /* Comparison operators */ constexpr bool operator==(MemoryArea a) const { return m_name == a.m_name; } constexpr bool operator!=(MemoryArea a) const { return m_name != a.m_name; } private: MemoryAreaName m_name; }; struct MemoryRegion { /* Address space regions that correspond to standard (ie. contiguous multi-addressable) memory */ static MemoryRegion const &ROM; static MemoryRegion const &RAM; static MemoryRegion const &ROM_P2; static MemoryRegion const &RAM_P2; static MemoryRegion const &RS; static MemoryRegion const &ILRAM; static MemoryRegion const &XRAM; static MemoryRegion const &YRAM; /* Determine if an address falls into one of the standard regions. Throws std::out_of_range if none. */ static MemoryRegion const *region_for(uint32_t address); /* Short constructor which calls guess_flags() */ MemoryRegion(std::string name, uint32_t start, uint32_t end, bool writable); /* Region name */ std::string name {}; /* Start address and end address. Generally the end address has one additionnaly byte. This is okay since no region is supposed to extend to the very end of the memory. */ uint32_t start, end; /* The region is writable under normal conditions */ bool writable; /* The cache is active in that region (if enabled) */ bool cacheable; /* The MMU is active in that region (if enabled) */ bool mappable; /* Returns the size of the region */ uint32_t size() const noexcept; /* Returns the area associated to the region (assuming it is fully contained in one, which should always be the case) */ MemoryArea area() const noexcept; /* Automatically guess the cacheable and mappable flags */ void guess_flags() noexcept; }; } /* namespace FxOS */ #endif /* LIBFXOS_MEMORY_H */