summaryrefslogtreecommitdiffstats
path: root/src/include/kernel/segment.H
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/kernel/segment.H')
-rw-r--r--src/include/kernel/segment.H52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/include/kernel/segment.H b/src/include/kernel/segment.H
new file mode 100644
index 000000000..5a4e7d092
--- /dev/null
+++ b/src/include/kernel/segment.H
@@ -0,0 +1,52 @@
+/** @file segment.H
+ * @brief Contains the definition of the virtual Segment class.
+ */
+#ifndef __KERNEL_SEGMENT_H
+#define __KERNEL_SEGMENT_H
+
+#include <kernel/task.H>
+
+/** @class Segment
+ * @brief Virtual segment class to handle virtual memory management within
+ * a 1TB segment.
+ */
+class Segment
+{
+ public:
+ /**
+ * @brief Constructor.
+ * @param[in] i_baseAddr - Base [virtual] address of this segment.
+ */
+ explicit Segment(uint64_t i_baseAddr) : iv_baseAddress(i_baseAddr) {};
+ /**
+ * @brief Destructor.
+ * No additional action necessary.
+ */
+ virtual ~Segment() {};
+
+ /**
+ * @brief Responsible for handling page faults within the 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.
+ */
+ virtual bool handlePageFault(task_t* i_task, uint64_t i_addr) = 0;
+
+ /**
+ * @brief Get the base address of this segment.
+ * @return Base address (as uint64_t).
+ */
+ uint64_t getBaseAddress() const { return iv_baseAddress; };
+
+ protected:
+ /** The base address of the segment. */
+ const uint64_t iv_baseAddress;
+};
+
+#endif
OpenPOWER on IntegriCloud