diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-11 23:18:47 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-10-11 23:18:47 +0300 |
| commit | 7237d673904d8568a2f9c290a0247c9d1a07c5d2 (patch) | |
| tree | 7deabe2dc64ddf05016eb3e3a4f22a7e252b5c35 /include | |
| parent | ebd34a9ab3809167e16e4107c8e72d1d81faff9c (diff) | |
| download | kmi-7237d673904d8568a2f9c290a0247c9d1a07c5d2.tar.gz kmi-7237d673904d8568a2f9c290a0247c9d1a07c5d2.zip | |
Start designing vmem framework
Diffstat (limited to 'include')
| -rw-r--r-- | include/apos/bytes.h | 1 | ||||
| -rw-r--r-- | include/apos/mem.h | 126 | ||||
| -rw-r--r-- | include/apos/types.h | 2 | ||||
| -rw-r--r-- | include/apos/utils.h | 3 | ||||
| -rw-r--r-- | include/apos/vmem.h | 32 |
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 */ |
