From 2ac717c789c15646457454febc8f0f6f35bdb2d2 Mon Sep 17 00:00:00 2001 From: Hubert Badocha Date: Wed, 8 Nov 2023 13:23:15 +0100 Subject: [PATCH] vm: add VM_OBJ_PHYSMEM define JIRA: RTOS-665 --- proc/msg.c | 4 +-- proc/process.c | 4 +-- syscalls.c | 5 ++-- vm/map.c | 68 +++++++++++++++++++++++++------------------------- vm/object.c | 7 +++--- vm/object.h | 4 +++ 6 files changed, 47 insertions(+), 45 deletions(-) diff --git a/proc/msg.c b/proc/msg.c index 8ed41e968..d593b7983 100644 --- a/proc/msg.c +++ b/proc/msg.c @@ -118,7 +118,7 @@ static void *msg_map(int dir, kmsg_t *kmsg, void *data, size_t size, process_t * return NULL; } - vaddr = vm_mmap(msg_common.kmap, NULL, NULL, SIZE_PAGE, PROT_READ | PROT_WRITE, (void *)-1, bpa, flags); + vaddr = vm_mmap(msg_common.kmap, NULL, NULL, SIZE_PAGE, PROT_READ | PROT_WRITE, VM_OBJ_PHYSMEM, bpa, flags); ml->bvaddr = vaddr; if (vaddr == NULL) { return NULL; @@ -162,7 +162,7 @@ static void *msg_map(int dir, kmsg_t *kmsg, void *data, size_t size, process_t * nep = nbp; } - vaddr = vm_mmap(msg_common.kmap, NULL, NULL, SIZE_PAGE, PROT_READ | PROT_WRITE, (void *)-1, epa, flags); + vaddr = vm_mmap(msg_common.kmap, NULL, NULL, SIZE_PAGE, PROT_READ | PROT_WRITE, VM_OBJ_PHYSMEM, epa, flags); ml->evaddr = vaddr; if (vaddr == NULL) { return NULL; diff --git a/proc/process.c b/proc/process.c index f77dc7fdc..aebb4485d 100644 --- a/proc/process.c +++ b/proc/process.c @@ -830,7 +830,7 @@ int process_load(process_t *process, vm_object_t *o, off_t base, size_t size, vo hal_tls_t tlsNew; ptr_t tbssAddr = 0; - if (o != (void *)-1) { + if (o != VM_OBJ_PHYSMEM) { return -ENOEXEC; } @@ -1327,7 +1327,7 @@ int proc_syspageSpawnName(const char *imap, const char *dmap, const char *name, int proc_syspageSpawn(syspage_prog_t *program, vm_map_t *imap, vm_map_t *map, const char *path, char **argv) { - return proc_spawn((void *)-1, imap, map, program->start, program->end - program->start, path, argv, NULL); + return proc_spawn(VM_OBJ_PHYSMEM, imap, map, program->start, program->end - program->start, path, argv, NULL); } diff --git a/syscalls.c b/syscalls.c index 1574933cf..cc903e0f5 100644 --- a/syscalls.c +++ b/syscalls.c @@ -66,7 +66,7 @@ void *syscalls_mmap(void *ustack) if ((flags & MAP_ANONYMOUS) != 0) { if ((flags & MAP_PHYSMEM) != 0) { - o = (void *)-1; + o = VM_OBJ_PHYSMEM; } else if ((flags & MAP_CONTIGUOUS) != 0) { o = vm_objectContiguous(size); @@ -75,10 +75,9 @@ void *syscalls_mmap(void *ustack) } } else { - return MAP_FAILED; + o = NULL; } } - else { if (posix_get_oid(fildes, &oid) != EOK) { return MAP_FAILED; diff --git a/vm/map.c b/vm/map.c index 98d0c49da..67736f085 100644 --- a/vm/map.c +++ b/vm/map.c @@ -77,7 +77,7 @@ static void map_augment(rbnode_t *node) break; } - n->lmaxgap = (size_t) (n->vaddr <= p->vaddr) ? (n->vaddr - n->map->start) : (n->vaddr - p->vaddr) - p->size; + n->lmaxgap = (size_t)(n->vaddr <= p->vaddr) ? (n->vaddr - n->map->start) : (n->vaddr - p->vaddr) - p->size; } else { map_entry_t *l = lib_treeof(map_entry_t, linkage, node->left); @@ -91,7 +91,7 @@ static void map_augment(rbnode_t *node) break; } - n->rmaxgap = (size_t) (n->vaddr >= p->vaddr) ? (n->map->stop - n->vaddr) - n->size : (p->vaddr - n->vaddr) - n->size; + n->rmaxgap = (size_t)(n->vaddr >= p->vaddr) ? (n->map->stop - n->vaddr) - n->size : (p->vaddr - n->vaddr) - n->size; } else { map_entry_t *r = lib_treeof(map_entry_t, linkage, node->right); @@ -228,7 +228,7 @@ static void *_map_map(vm_map_t *map, void *vaddr, process_t *proc, size_t size, amap_t *amap; #ifdef NOMMU - if (o == (void *)-1) + if (o == VM_OBJ_PHYSMEM) return (void *)(ptr_t)offs; #endif @@ -425,12 +425,12 @@ int _vm_munmap(vm_map_t *map, void *vaddr, size_t size) s->object = vm_objectRef(e->object); s->offs = (e->offs == -1) ? -1 : e->offs + (vaddr + size - e->vaddr); s->vaddr = vaddr + size; - s->size = (size_t) (e->vaddr + e->size - s->vaddr); + s->size = (size_t)(e->vaddr + e->size - s->vaddr); s->aoffs = e->aoffs + (vaddr + size - e->vaddr); s->amap = amap_ref(e->amap); - e->size = (size_t) (vaddr - e->vaddr); + e->size = (size_t)(vaddr - e->vaddr); e->rmaxgap = size; map_augment(&e->linkage); @@ -624,7 +624,7 @@ static int _map_force(vm_map_t *map, map_entry_t *e, void *paddr, int prot) if (e->amap == NULL) p = vm_objectPage(map, NULL, e->object, paddr, (e->offs < 0) ? e->offs : e->offs + offs); - else /* if (e->object != (void *)-1) FIXME disabled until memory objects are created for syspage progs */ + else /* if (e->object != VM_OBJ_PHYSMEM) FIXME disabled until memory objects are created for syspage progs */ p = amap_page(map, e->amap, e->object, paddr, e->aoffs + offs, (e->offs < 0) ? e->offs : e->offs + offs, prot); if (prot & PROT_WRITE) @@ -645,9 +645,10 @@ static int _map_force(vm_map_t *map, map_entry_t *e, void *paddr, int prot) if (e->flags & MAP_DEVICE) attr |= PGHD_DEV; - if (p == NULL && e->object == (void *)-1) { - if (page_map(&map->pmap, paddr, e->offs + offs, attr) < 0) + if ((p == NULL) && (e->object == VM_OBJ_PHYSMEM)) { + if (page_map(&map->pmap, paddr, e->offs + offs, attr) < 0) { return -ENOMEM; + } } else if (p == NULL) { return -ENOMEM; @@ -675,7 +676,7 @@ static void map_pageFault(unsigned int n, exc_context_t *ctx) #ifdef PAGEFAULTSTOP process_dumpException(n, ctx); - __asm__ volatile ("1: b 1b"); + __asm__ volatile("1: b 1b"); #endif if (hal_exceptionsPC(ctx) >= VADDR_KERNEL) /* output exception ASAP to avoid being deadlocked on spinlock */ @@ -928,10 +929,10 @@ void vm_mapinfo(meminfo_t *info) if (info->entry.map != NULL && info->entry.mapsz > size) { e = lib_treeof(map_entry_t, linkage, n); - info->entry.map[size].vaddr = e->vaddr; - info->entry.map[size].size = e->size; - info->entry.map[size].flags = e->flags; - info->entry.map[size].prot = e->prot; + info->entry.map[size].vaddr = e->vaddr; + info->entry.map[size].size = e->size; + info->entry.map[size].flags = e->flags; + info->entry.map[size].prot = e->prot; info->entry.map[size].anonsz = ~0; if (e->amap != NULL) { @@ -942,14 +943,14 @@ void vm_mapinfo(meminfo_t *info) } } - info->entry.map[size].offs = e->offs; + info->entry.map[size].offs = e->offs; - if (e->object == NULL) + if (e->object == NULL) { info->entry.map[size].object = OBJECT_ANONYMOUS; - - else if (e->object == (void *)-1) + } + else if (e->object == VM_OBJ_PHYSMEM) { info->entry.map[size].object = OBJECT_MEMORY; - + } else { info->entry.map[size].object = OBJECT_OID; info->entry.map[size].oid = e->object->oid; @@ -963,9 +964,9 @@ void vm_mapinfo(meminfo_t *info) do { if (info->entry.map != NULL && info->entry.mapsz > size) { info->entry.map[size].vaddr = e->vaddr; - info->entry.map[size].size = e->size; + info->entry.map[size].size = e->size; info->entry.map[size].flags = e->flags; - info->entry.map[size].prot = e->prot; + info->entry.map[size].prot = e->prot; info->entry.map[size].anonsz = ~0; if (e->amap != NULL) { @@ -976,14 +977,14 @@ void vm_mapinfo(meminfo_t *info) } } - info->entry.map[size].offs = e->offs; + info->entry.map[size].offs = e->offs; - if (e->object == NULL) + if (e->object == NULL) { info->entry.map[size].object = OBJECT_ANONYMOUS; - - else if (e->object == (void *)-1) + } + else if (e->object == VM_OBJ_PHYSMEM) { info->entry.map[size].object = OBJECT_MEMORY; - + } else { info->entry.map[size].object = OBJECT_OID; info->entry.map[size].oid = e->object->oid; @@ -992,8 +993,7 @@ void vm_mapinfo(meminfo_t *info) ++size; e = e->next; - } - while (e != process->entries); + } while (e != process->entries); #endif proc_lockClear(&map->lock); @@ -1014,9 +1014,9 @@ void vm_mapinfo(meminfo_t *info) e = lib_treeof(map_entry_t, linkage, n); info->entry.kmap[size].vaddr = e->vaddr; - info->entry.kmap[size].size = e->size; + info->entry.kmap[size].size = e->size; info->entry.kmap[size].flags = e->flags; - info->entry.kmap[size].prot = e->prot; + info->entry.kmap[size].prot = e->prot; info->entry.kmap[size].anonsz = ~0; if (e->amap != NULL) { @@ -1027,14 +1027,14 @@ void vm_mapinfo(meminfo_t *info) } } - info->entry.kmap[size].offs = e->offs; + info->entry.kmap[size].offs = e->offs; - if (e->object == NULL) + if (e->object == NULL) { info->entry.kmap[size].object = OBJECT_ANONYMOUS; - - else if (e->object == (void *)-1) + } + else if (e->object == VM_OBJ_PHYSMEM) { info->entry.kmap[size].object = OBJECT_MEMORY; - + } else { info->entry.kmap[size].object = OBJECT_OID; info->entry.kmap[size].oid = e->object->oid; diff --git a/vm/object.c b/vm/object.c index 7eab5f981..2b6e21352 100644 --- a/vm/object.c +++ b/vm/object.c @@ -112,7 +112,7 @@ int vm_objectGet(vm_object_t **o, oid_t oid) vm_object_t *vm_objectRef(vm_object_t *o) { - if (o != NULL && o != (void *)-1) { + if ((o != NULL) && (o != VM_OBJ_PHYSMEM)) { proc_lockSet(&object_common.lock); o->refs++; proc_lockClear(&object_common.lock); @@ -126,8 +126,9 @@ int vm_objectPut(vm_object_t *o) { int i; - if (o == NULL || o == (void *)-1) + if ((o == NULL) || (o == VM_OBJ_PHYSMEM)) { return EOK; + } proc_lockSet(&object_common.lock); @@ -301,8 +302,6 @@ int _object_init(vm_map_t *kmap, vm_object_t *kernel) } - - #if 0 void map_pageFault(unsigned int n, exc_context_t *ctx) { diff --git a/vm/object.h b/vm/object.h index 480d84827..afd538b41 100644 --- a/vm/object.h +++ b/vm/object.h @@ -21,6 +21,7 @@ #include "proc/lock.h" #include "amap.h" + struct _vm_map_t; typedef struct _vm_object_t { @@ -32,6 +33,9 @@ typedef struct _vm_object_t { } vm_object_t; +#define VM_OBJ_PHYSMEM ((vm_object_t *)-1) + + extern vm_object_t *vm_objectRef(vm_object_t *o);