From 8da0171e5ca3492cdb34422184a1c96acd0b5165 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 21 May 2022 21:02:17 +0300 Subject: add status info to memory mappings + next up would probably be to start working on process/thread relationships, largely as documented. Still not entirely sure about how I want to handle fork, but I suppose I might figure it out at some point. --- include/apos/assert.h | 42 ++++++++++++++++++++++++++++++++++++++++++ include/apos/dmem.h | 4 ++-- include/apos/mem.h | 2 ++ include/apos/mem_regions.h | 7 ++++--- include/apos/tcb.h | 5 +++++ include/apos/types.h | 3 +++ include/apos/vmem.h | 18 +++++++++--------- 7 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 include/apos/assert.h (limited to 'include/apos') diff --git a/include/apos/assert.h b/include/apos/assert.h new file mode 100644 index 0000000..7200fd2 --- /dev/null +++ b/include/apos/assert.h @@ -0,0 +1,42 @@ +#ifndef APOS_ASSERT_H +#define APOS_ASSERT_H + +#include +#include + +/* TODO: should this exit or do something explosive like that? */ +#if !defined(DNDEBUG) +#define catastrophic_assert(x) \ + do { \ + if (x) { \ + err("catastrophic assertion failed: %s\n", QUOTE(x)); \ + while (1) \ + ; \ + } \ + } while (0); + +#define hard_assert(x, r) \ + do { \ + if (x) { \ + warn("hard assertion failed: %s\n", QUOTE(x)); \ + return r; \ + } \ + } while (0); + +#define soft_assert(x) \ + do { \ + if (x) { \ + info("soft assertion failed: %s\n", QUOTE(x)); \ + } \ + } while (0); +#else +#define catastrophic_assert(x) +#define hard_assert(x, r) +#define soft_assert(x) +#endif + +/* use when return value doesn't exist, like hard_assert(x, + * RETURN_VOID); */ +#define RETURN_VOID + +#endif /* APOS_ASSERT_H */ diff --git a/include/apos/dmem.h b/include/apos/dmem.h index d337e61..3ee93b6 100644 --- a/include/apos/dmem.h +++ b/include/apos/dmem.h @@ -14,8 +14,8 @@ vm_t alloc_devmem(struct tcb *t, pm_t dev_start, size_t bytes, vmflags_t flags); stat_t free_devmem(struct tcb *t, vm_t dev_start); stat_t dev_free_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order t); + vmflags_t flags, enum mm_order t, void *); stat_t dev_alloc_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order t); + vmflags_t flags, enum mm_order t, void *); #endif /* APOS_DEV_H */ diff --git a/include/apos/mem.h b/include/apos/mem.h index bc60f21..f3eded7 100644 --- a/include/apos/mem.h +++ b/include/apos/mem.h @@ -45,6 +45,8 @@ #define MR_SHARED (1 << 9) /* owner of shared region */ #define MR_OWNED (1 << 10) +/* copy on write */ +#define MR_COW (1 << 11) extern size_t __mm_shifts[10]; extern size_t __mm_widths[10]; diff --git a/include/apos/mem_regions.h b/include/apos/mem_regions.h index 7841dde..efe0592 100644 --- a/include/apos/mem_regions.h +++ b/include/apos/mem_regions.h @@ -41,11 +41,12 @@ struct mem_region *find_closest_used_region(struct mem_region_root *r, struct mem_region *find_free_region(struct mem_region_root *r, size_t size, size_t *align); -#define REGION_TRY_AGAIN 1 typedef stat_t region_callback_t(struct vm_branch *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order order); + vmflags_t flags, enum mm_order order, + void *data); vm_t map_fill_region(struct vm_branch *b, region_callback_t *mem_handler, - pm_t offset, vm_t start, size_t bytes, vmflags_t flags); + pm_t offset, vm_t start, size_t bytes, vmflags_t flags, + void *data); #endif /* APOS_MEM_REGIONS_H */ diff --git a/include/apos/tcb.h b/include/apos/tcb.h index 821d822..11e1b5a 100644 --- a/include/apos/tcb.h +++ b/include/apos/tcb.h @@ -28,6 +28,9 @@ struct tcb { /* vm root branch */ struct vm_branch *b_r; + + struct tcb *parent; + struct tcb *next; }; void init_tcbs(); @@ -41,4 +44,6 @@ void use_tcb(struct tcb *); struct tcb *get_tcb(id_t tid); +stat_t clone_tcb_maps(struct tcb *); + #endif /* APOS_TCB_H */ diff --git a/include/apos/types.h b/include/apos/types.h index d413957..2f45857 100644 --- a/include/apos/types.h +++ b/include/apos/types.h @@ -197,6 +197,9 @@ enum { ERR_ALIGN = -2, /* wrong alignment */ ERR_NF = -1, /* not found */ OK = 0, /* OK */ + INFO_TRGN = 1, /* try again */ + INFO_SEFF = 2, /* side effects */ + INFO_CONT = 3, /* continue */ }; #include /* arch-specific type definitions (pm_t/vm_t etc) */ diff --git a/include/apos/vmem.h b/include/apos/vmem.h index 17f998d..f1b0d19 100644 --- a/include/apos/vmem.h +++ b/include/apos/vmem.h @@ -15,20 +15,20 @@ stat_t free_uvmem(struct tcb *r, vm_t a); stat_t init_uvmem(struct tcb *r, vm_t base, vm_t top); stat_t alloc_uvmem_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order order); + vmflags_t flags, enum mm_order order, void *data); stat_t alloc_shared_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order order); + vmflags_t flags, enum mm_order order, void *data); stat_t free_uvmem_wrapper(struct vm_branch *b, pm_t *offset, vm_t vaddr, - vmflags_t flags, enum mm_order order); + vmflags_t flags, enum mm_order order, void *data); -#define map_allocd_region(b, start, bytes, flags) \ - map_fill_region(b, &alloc_uvmem_wrapper, 0, start, bytes, flags) +#define map_allocd_region(b, start, bytes, flags, data) \ + map_fill_region(b, &alloc_uvmem_wrapper, 0, start, bytes, flags, data) -#define map_shared_region(b, start, bytes, flags) \ - map_fill_region(b, &alloc_shared_wrapper, 0, start, bytes, flags) +#define map_shared_region(b, start, bytes, flags, data) \ + map_fill_region(b, &alloc_shared_wrapper, 0, start, bytes, flags, data) -#define unmap_freed_region(b, start, bytes, flags) \ - map_fill_region(b, &free_uvmem_wrapper, 0, start, bytes, flags) +#define unmap_freed_region(b, start, bytes, flags, data) \ + map_fill_region(b, &free_uvmem_wrapper, 0, start, bytes, flags, data) #define vm_flags(x) ((x) & ~0xff) #define vp_flags(x) ((x)&0xff) -- cgit v1.3