aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/apos/bytes.h1
-rw-r--r--include/apos/mem.h126
-rw-r--r--include/apos/types.h2
-rw-r--r--include/apos/utils.h3
-rw-r--r--include/apos/vmem.h32
5 files changed, 55 insertions, 109 deletions
diff --git a/include/apos/bytes.h b/include/apos/bytes.h
index da0ab67..37fe084 100644
--- a/include/apos/bytes.h
+++ b/include/apos/bytes.h
@@ -2,6 +2,7 @@
#define APOS_BYTES_H
#include <apos/types.h>
+#include <apos/builtin.h>
uint16_t __bswap16(uint16_t u);
uint32_t __bswap32(uint32_t u);
diff --git a/include/apos/mem.h b/include/apos/mem.h
index 5e33e28..630fcd9 100644
--- a/include/apos/mem.h
+++ b/include/apos/mem.h
@@ -4,112 +4,18 @@
#include <apos/utils.h>
#include <pages.h>
-#if defined(O0_WIDTH)
-#define MM_O0_SHIFT (0)
-#define MM_O0_WIDTH (1UL << (O0_WIDTH))
-#define MM_O0_SIZE (1UL << MM_O0_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O0_SHIFT 0
-#define MM_O0_WIDTH 0
-#define MM_O0_SIZE 0
-#endif
-
-#if defined(O1_WIDTH)
-#define MM_O1_SHIFT (MM_O0_SHIFT + (O0_WIDTH))
-#define MM_O1_WIDTH (1UL << (O1_WIDTH))
-#define MM_O1_SIZE (1UL << MM_O1_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O1_SHIFT 0
-#define MM_O1_SHIFT 0
-#define MM_O1_SIZE 0
-#endif
-
-#if defined(O2_WIDTH)
-#define MM_O2_SHIFT (MM_O1_SHIFT + (O1_WIDTH))
-#define MM_O2_WIDTH (1UL << (O2_WIDTH))
-#define MM_O2_SIZE (1UL << MM_O2_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O2_SHIFT 0
-#define MM_O2_WIDTH 0
-#define MM_O2_SIZE 0
-#endif
-
-#if defined(O3_WIDTH)
-#define MM_O3_SHIFT (MM_O2_SHIFT + (O2_WIDTH))
-#define MM_O3_WIDTH (1UL << (O3_WIDTH))
-#define MM_O3_SIZE (1UL << MM_O3_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O3_SHIFT 0
-#define MM_O3_WIDTH 0
-#define MM_O3_SIZE 0
-#endif
-
-#if defined(O4_WIDTH)
-#define MM_O4_SHIFT (MM_O3_SHIFT + (O3_WIDTH))
-#define MM_O4_SHIFT (1UL << (O4_WIDTH))
-#define MM_O4_SIZE (1UL << MM_O4_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O4_SHIFT 0
-#define MM_O4_WIDTH 0
-#define MM_O4_SIZE 0
-#endif
-
-#if defined(O5_WIDTH)
-#define MM_O5_SHIFT (MM_O4_SHIFT + (O4_WIDTH))
-#define MM_O5_WIDTH (1UL << (O5_WIDTH))
-#define MM_O5_SIZE (1UL << MM_O5_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O5_SHIFT 0
-#define MM_O5_WIDTH 0
-#define MM_O5_SIZE 0
-#endif
-
-#if defined(O6_WIDTH)
-#define MM_O6_SHIFT (MM_O5_SHIFT + (O5_WIDTH))
-#define MM_O6_WIDTH (1UL << (O6_WIDTH))
-#define MM_O6_SIZE (1UL << MM_O6_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O6_SHIFT 0
-#define MM_O6_WIDTH 0
-#define MM_O6_SIZE 0
-#endif
-
-#if defined(O7_WIDTH)
-#define MM_O7_SHIFT (MM_O6_SHIFT + (O6_WIDTH))
-#define MM_O7_WIDTH (1UL << (O7_WIDTH))
-#define MM_O7_SIZE (1UL << MM_O7_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O7_SHIFT 0
-#define MM_O7_WIDTH 0
-#define MM_O7_SIZE 0
-#endif
-
-#if defined(O8_WIDTH)
-#define MM_O8_SHIFT (MM_O7_SHIFT + (O7_WIDTH))
-#define MM_O8_WIDTH (1UL << (O8_WIDTH))
-#define MM_O8_SIZE (1UL << MM_O8_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O8_SHIFT 0
-#define MM_O8_WIDTH 0
-#define MM_O8_SIZE 0
-#endif
-
-#if defined(O9_WIDTH)
-#define MM_O9_SHIFT (MM_O8_SHIFT + (O8_WIDTH))
-#define MM_O9_WIDTH (1UL << (O9_WIDTH))
-#define MM_O9_SIZE (1UL << MM_O9_SHIFT << PAGE_SHIFT)
-#else
-#define MM_O9_SHIFT 0
-#define MM_O9_WIDTH 0
-#define MM_O9_SIZE 0
-#endif
+enum mm_mode_t {
+ Sv48,
+ Sv39,
+ Sv32,
+};
#define MM_OINFO_WIDTH (sizeof(mm_info_t) * 8)
#define pnum_to_index(pnum, order) (((pnum) >> __o_offset(order)) & (__o_width(order) - 1))
#define pm_to_index(paddr, order) (pnum_to_index(pm_to_pnum(paddr), (order)))
-#define pm_to_pnum(paddr) ((paddr) >> PAGE_SHIFT)
-#define pnum_to_paddr(pnum) ((pnum) << PAGE_SHIFT)
+#define pm_to_pnum(paddr) ((paddr) >> __mm_page_shift)
+#define pnum_to_paddr(pnum) ((pnum) << __mm_page_shift)
#define move_forward(var, num) (((var) += (num)) - (num))
@@ -121,15 +27,21 @@
#define next_elems(num) (sizeof(void *) * (num))
#define max_index(order) (__o_width(order) - 1)
-#define __o_offset(order) (mm_shifts[order])
-#define __o_width(order) (mm_widths[order])
-#define __o_elems(order) (mm_widths[order] / MM_OINFO_WIDTH)
+#define __o_offset(order) (__mm_shifts[order])
+#define __o_width(order) (__mm_widths[order])
+#define __o_elems(order) (__mm_widths[order] / MM_OINFO_WIDTH)
#define __o_container(idx) ((idx) / MM_OINFO_WIDTH)
#define __o_bit(idx) ((idx) & (MM_OINFO_WIDTH - 1))
-extern const size_t mm_shifts[10];
-extern const size_t mm_widths[10];
-extern const size_t mm_sizes[10];
+extern size_t __mm_shifts[10];
+extern size_t __mm_widths[10];
+extern size_t __mm_sizes[10];
+
+extern size_t __mm_page_shift;
+extern size_t __mm_max_order;
+
+void init_mem(size_t max_order, size_t shifts[10], size_t page_shift);
+enum mm_mode_t get_mmode(void *fdt);
#endif /* APOS_MEM_H */
diff --git a/include/apos/types.h b/include/apos/types.h
index 791c394..7cc4e28 100644
--- a/include/apos/types.h
+++ b/include/apos/types.h
@@ -1,8 +1,6 @@
#ifndef APOS_TYPES_H
#define APOS_TYPES_H
-#include <apos/builtin.h>
-
typedef _Bool bool;
#define true 1
#define false 0
diff --git a/include/apos/utils.h b/include/apos/utils.h
index 3855a37..39d5b83 100644
--- a/include/apos/utils.h
+++ b/include/apos/utils.h
@@ -11,6 +11,9 @@
#define MIN4(a, b, c, d) (MIN3(a, b, c) <= MIN3(b, c, d) ? MIN3(a, b, c) : MIN3(b, c, d))
/* etc... */
+#define GLUE2(x, y) x##y
+#define GLUE(x, y) GLUE2(x, y)
+
#include <apos/types.h>
static inline size_t align_up(size_t val, size_t a)
diff --git a/include/apos/vmem.h b/include/apos/vmem.h
new file mode 100644
index 0000000..589e814
--- /dev/null
+++ b/include/apos/vmem.h
@@ -0,0 +1,32 @@
+#ifndef APOS_VMEM_H
+#define APOS_VMEM_H
+
+/* arch-specific data */
+#include <vmem.h>
+
+/* general overview of the different functions:
+ * (un)map_vmem: map one known page of physical memory to one known page of
+ * virtual memory
+ *
+ * (un)map_vregion: map known physical region to unknown virtual region within
+ * start and end
+ *
+ * (un)map_vsize: map unknown physical region to unknown virtual region
+ */
+
+void map_vmem(struct vm_branch_t *branch,
+ pm_t paddr, vm_t vaddr,
+ uint8_t flags, enum mm_order_t order);
+
+void unmap_vmem(struct vm_branch_t *branch, vm_t vaddr, enum mm_order_t order);
+
+#define map_kvregion(b, pb, pt) map_vregion(b, pb, pt, VMEM_BASE, VMEM_TOP);
+#define map_uvregion(b, pb, pt) map_vregion(b, pb, pt, UMEM_BASE, UMEM_TOP);
+
+vm_t map_vregion(struct vm_branch_t *branch, pm_t base, pm_t top, vm_t start, vm_t end);
+void unmap_vregion(struct vm_branch_t *branch, pm_t base, pm_t top);
+
+vm_t map_vsize(struct vm_branch_t *branch, size_t size);
+void unmap_vsize(struct vm_branch_t *branch, size_t size);
+
+#endif /* APOS_VMEM_H */