diff options
Diffstat (limited to 'src/include/kernel/segmentmgr.H')
-rw-r--r-- | src/include/kernel/segmentmgr.H | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/include/kernel/segmentmgr.H b/src/include/kernel/segmentmgr.H new file mode 100644 index 000000000..7048fa365 --- /dev/null +++ b/src/include/kernel/segmentmgr.H @@ -0,0 +1,92 @@ +/** @file segmentmgr.H + * Provides definition of the SegmentManager class. + */ + +#ifndef __KERNEL_SEGMENTMGR_H +#define __KERNEL_SEGMENTMGR_H + +#include <kernel/task.H> + +// Forward declaration. +class Segment; + +/** @class SegmentManager + * @brief Container of Segments. Responsible for managing the SLB. + * + * @note This class is not thread-safe on its own. Expectation is that + * the virtual memory manager will serialize internal operations. + */ +class SegmentManager +{ + public: + /** Segment Identifiers */ + enum SegmentIds + { + /** Base Segment (0-1TB). */ + BASE_SEGMENT_ID = 0, + /** Task Stack Segment (1-2TB). */ + STACK_SEGMENT_ID = 1, + /** MMIO Space Segment (2-3TB). */ + MMIO_SEGMENT_ID = 2, + + MAX_SEGMENTS = 4 + }; + + /** + * Constructor. Initializes instance variables. + */ + SegmentManager() + { + for(int i = 0; i < MAX_SEGMENTS; i++) + iv_segments[i] = NULL; + }; + /** + * Destructor. + * No action necessary. Associated segments are owned externally, + * such as in Singletons. + */ + ~SegmentManager() {}; + + /** + * @brief Responsible for directing page faults to the owning segment. + * + * @param[in] i_task - Task causing the page fault. + * @param[in] i_addr - Effective address accessed to cause fault. + * + * @return true - Page fault was successfully handled. + * + * If the page fault is not successfully handled the expectation is + * that the VMM will perform appropriate action, such as killing the + * task. + */ + static bool handlePageFault(task_t* i_task, uint64_t i_addr); + + /** + * @brief Adds a segment to the container. + * + * @param[in] i_segment - Segment object to associate to segment. + * @param[in] i_segId - Segment identifier (which TB) to associate. + * + * @note Ownership of the Segment object (for freeing memory) remains + * with the callee. + */ + static void addSegment(Segment* i_segment, size_t i_segId); + + /** + * @brief Update SLB on this hardware thread with associated segments. + */ + static void initSLB(); + + private: + /** See handlePageFault. */ + bool _handlePageFault(task_t* i_task, uint64_t i_addr); + /** See addSegment. */ + void _addSegment(Segment* i_segment, size_t i_segId); + /** See initSLB. */ + void _initSLB(); + + /** Array of segment objects to associated segment IDs. */ + Segment* iv_segments[MAX_SEGMENTS]; +}; + +#endif |