T291: Implement offset in mapping capabilities.
authorMoritz Hoffmann <moritz.hoffmann@inf.ethz.ch>
Tue, 27 Sep 2016 14:17:31 +0000 (16:17 +0200)
committerMoritz Hoffmann <moritz.hoffmann@inf.ethz.ch>
Tue, 27 Sep 2016 14:17:31 +0000 (16:17 +0200)
Signed-off-by: Moritz Hoffmann <moritz.hoffmann@inf.ethz.ch>

capabilities/caps.hl
kernel/arch/x86_32/page_mappings_arch.c
kernel/arch/x86_64/page_mappings_arch.c
kernel/include/capabilities.h
kernel/include/paging_generic.h
kernel/paging_generic.c

index 3f8d04b..c0fd967 100644 (file)
@@ -159,6 +159,7 @@ cap Frame from RAM from_self {
 cap Frame_Mapping from Frame {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -175,6 +176,7 @@ cap DevFrame from PhysAddr from_self {
 cap DevFrame_Mapping from DevFrame {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -198,6 +200,7 @@ cap VNode_x86_64_pml4 from RAM {
 cap VNode_x86_64_pml4_Mapping from VNode_x86_64_pml4 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -214,6 +217,7 @@ cap VNode_x86_64_pdpt from RAM {
 cap VNode_x86_64_pdpt_Mapping from VNode_x86_64_pdpt {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -229,6 +233,7 @@ cap VNode_x86_64_pdir from RAM {
 cap VNode_x86_64_pdir_Mapping from VNode_x86_64_pdir {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -244,6 +249,7 @@ cap VNode_x86_64_ptable from RAM {
 cap VNode_x86_64_ptable_Mapping from VNode_x86_64_ptable {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -262,6 +268,7 @@ cap VNode_x86_32_pdpt from RAM {
 cap VNode_x86_32_pdpt_Mapping from VNode_x86_32_pdpt {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -277,6 +284,7 @@ cap VNode_x86_32_pdir from RAM {
 cap VNode_x86_32_pdir_Mapping from VNode_x86_32_pdir {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -292,6 +300,7 @@ cap VNode_x86_32_ptable from RAM {
 cap VNode_x86_32_ptable_Mapping from VNode_x86_32_ptable {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -309,6 +318,7 @@ cap VNode_ARM_l1 from RAM {
 cap VNode_ARM_l1_Mapping from VNode_ARM_l1 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -323,6 +333,7 @@ cap VNode_ARM_l2 from RAM {
 cap VNode_ARM_l2_Mapping from VNode_ARM_l2 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -339,6 +350,7 @@ cap VNode_AARCH64_l0 from RAM {
 cap VNode_AARCH64_l0_Mapping from VNode_AARCH64_l0 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -353,6 +365,7 @@ cap VNode_AARCH64_l1 from RAM {
 cap VNode_AARCH64_l1_Mapping from VNode_AARCH64_l1 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -367,6 +380,7 @@ cap VNode_AARCH64_l2 from RAM {
 cap VNode_AARCH64_l2_Mapping from VNode_AARCH64_l2 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
@@ -381,6 +395,7 @@ cap VNode_AARCH64_l3 from RAM {
 cap VNode_AARCH64_l3_Mapping from VNode_AARCH64_l3 {
     "struct capability" frame;
     eq lvaddr pte;
+    uint32 offset;
     uint16 pte_count;
 
     address { get_address(frame) };
index e5ab682..7ec3ff4 100644 (file)
@@ -121,6 +121,7 @@ static errval_t x86_32_pdir(struct capability *dest, cslot_t slot,
         // Set metadata
         create_mapping_cap(mapping_cte, src,
                            dest_lp + slot * sizeof(union x86_32_ptable_entry),
+                           offset,
                            pte_count);
 
         for (; slot < last_slot; slot++, offset += X86_32_LARGE_PAGE_SIZE) {
@@ -217,6 +218,7 @@ static errval_t x86_32_ptable(struct capability *dest, cslot_t slot,
     // Set metadata
     create_mapping_cap(mapping_cte, src,
                        dest_lp + slot * sizeof(union x86_32_ptable_entry),
+                       offset,
                        pte_count);
 
 
index cd949aa..98726f5 100644 (file)
@@ -158,6 +158,7 @@ static errval_t x86_64_non_ptable(struct capability *dest, cslot_t slot,
     // set metadata
     create_mapping_cap(mapping_cte, src,
                        dest_lp + slot * sizeof(union x86_64_ptable_entry),
+                       offset,
                        pte_count);
 
     cslot_t last_slot = slot + pte_count;
@@ -249,6 +250,7 @@ static errval_t x86_64_ptable(struct capability *dest, cslot_t slot,
     // Set metadata
     create_mapping_cap(mapping_cte, src,
                        dest_lp + slot * sizeof(union x86_64_ptable_entry),
+                       offset,
                        pte_count);
 
     cslot_t last_slot = slot + pte_count;
index 30ecca0..d130667 100644 (file)
@@ -77,6 +77,38 @@ static inline struct cte *cte_for_cap(struct capability *cap)
     return (struct cte *) ((char *)cap - offsetof(struct cte, cap));
 }
 
+/*
+ * \brief Get a mapping's offset into a frame.
+ *
+ * Return the offset at which the mapping cap maps the backing frame.
+ */
+static inline size_t caps_get_mapping_offset(struct capability *cap) {
+
+    // This function should be emitted by hamlet or somesuch.
+    STATIC_ASSERT(49 == ObjType_Num, "Check Mapping definitions");
+
+    switch (cap->type) {
+    case ObjType_VNode_AARCH64_l3_Mapping:
+    case ObjType_VNode_AARCH64_l2_Mapping:
+    case ObjType_VNode_AARCH64_l1_Mapping:
+    case ObjType_VNode_AARCH64_l0_Mapping:
+    case ObjType_VNode_ARM_l2_Mapping:
+    case ObjType_VNode_ARM_l1_Mapping:
+    case ObjType_VNode_x86_32_ptable_Mapping:
+    case ObjType_VNode_x86_32_pdir_Mapping:
+    case ObjType_VNode_x86_32_pdpt_Mapping:
+    case ObjType_VNode_x86_64_ptable_Mapping:
+    case ObjType_VNode_x86_64_pdir_Mapping:
+    case ObjType_VNode_x86_64_pdpt_Mapping:
+    case ObjType_VNode_x86_64_pml4_Mapping:
+    case ObjType_DevFrame_Mapping:
+    case ObjType_Frame_Mapping:
+        return cap->u.frame_mapping.offset << 10;
+    default:
+        return 0;
+    }
+}
+
 int sprint_cap(char *buf, size_t len, struct capability *cap);
 void caps_trace(const char *func, int line, struct cte *cte, const char *msg);
 errval_t caps_create_new(enum objtype type, lpaddr_t addr, size_t bits,
index 50518a0..dc05b62 100644 (file)
@@ -27,7 +27,7 @@ struct mapping_info {
 struct cte;
 struct capability;
 void create_mapping_cap(struct cte *mapping_cte, struct capability *frame,
-                        lvaddr_t pte, size_t pte_count);
+                        lvaddr_t pte, size_t offset, size_t pte_count);
 errval_t compile_vaddr(struct cte *ptable, size_t entry, genvaddr_t *retvaddr);
 errval_t unmap_capability(struct cte *mem);
 errval_t lookup_cap_for_mapping(genpaddr_t paddr, lvaddr_t pte, struct cte **retcte);
index 7bc0585..9b40f5e 100644 (file)
@@ -95,13 +95,17 @@ static inline size_t get_offset(struct cte *mapping, struct cte *next)
  * 'set_cap()' for mapping caps
  */
 void create_mapping_cap(struct cte *mapping_cte, struct capability *frame,
-                        lvaddr_t pte, size_t pte_count)
+                        lvaddr_t pte, size_t offset, size_t pte_count)
 {
     assert(mapping_cte->cap.type == ObjType_Null);
+    // Currently, we have 32 bit offsets with 10 minimum page size, hence
+    // the offset can be at most 42 bits. FIXME
+    assert(offset <= 1l << 42);
 
     mapping_cte->cap.type = get_mapping_type(frame->type);
     mapping_cte->cap.u.frame_mapping.frame = frame;
     mapping_cte->cap.u.frame_mapping.pte = pte;
+    mapping_cte->cap.u.frame_mapping.offset = offset >> 10;
     mapping_cte->cap.u.frame_mapping.pte_count = pte_count;
 }