diff options
author | Richard Braun <rbraun@sceen.net> | 2013-06-12 18:27:53 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2013-07-06 19:02:09 +0200 |
commit | 48374912a30ae97b725ec99499b8f3ca683b6f8a (patch) | |
tree | 9f6e0599429f87f006251533f6c9ee68a4099c49 | |
parent | 577fb05e6d92e38bb94994ef88d09dfda137fb83 (diff) |
a bit more but unfinished
-rw-r--r-- | vm/vm_anon.c | 119 | ||||
-rw-r--r-- | vm/vm_anon.h | 39 |
2 files changed, 158 insertions, 0 deletions
diff --git a/vm/vm_anon.c b/vm/vm_anon.c new file mode 100644 index 00000000..fac7528c --- /dev/null +++ b/vm/vm_anon.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2013 Richard Braun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <kern/kmem.h> +#include <kern/init.h> +#include <kern/list.h> +#include <kern/llsync.h> +#include <kern/macros.h> +#include <kern/mutex.h> +#include <kern/panic.h> +#include <kern/stddef.h> +#include <kern/stdint.h> +#include <vm/vm_anon.h> +#include <vm/vm_object.h> + +/* + * Anonymous memory container. + */ +struct vm_anon { + struct vm_object object; + unsigned long nr_refs; + size_t size; +}; + +/* + * Anonymous pager operations. + */ +static void vm_anon_ref(struct vm_object *object); +static void vm_anon_unref(struct vm_object *object); +static int vm_anon_get(struct vm_object *object, uint64_t offset, + struct list *pages, int access_prot, int advice); + +static struct vm_object_pager vm_anon_pager = { + .ref = vm_anon_ref, + .unref = vm_anon_unref, + .get = vm_anon_get, +}; + +static struct kmem_cache vm_anon_cache; + +void __init +vm_anon_setup(void) +{ + kmem_cache_init(&vm_anon_cache, "vm_anon", sizeof(struct vm_anon), 0, + NULL, NULL, NULL, 0); +} + +struct vm_object * +vm_anon_create(size_t size) +{ + struct vm_anon *anon; + + anon = kmem_cache_alloc(&vm_anon_cache); + + if (anon == NULL) + return NULL; + + vm_object_init(&anon->object, &vm_anon_pager); + anon->nr_refs = 1; + anon->size = size; + return &anon->object; +} + +static void +vm_anon_ref(struct vm_object *object) +{ + struct vm_anon *anon; + + anon = structof(object, struct vm_anon, object); + + /* TODO Use atomic operations */ + mutex_lock(&anon->object.lock); + anon->nr_refs++; + mutex_unlock(&anon->object.lock); +} + +static void +vm_anon_unref(struct vm_object *object) +{ + struct vm_anon *anon; + unsigned int nr_refs; + + anon = structof(object, struct vm_anon, object); + + mutex_lock(&anon->object.lock); + anon->nr_refs--; + nr_refs = anon->nr_refs; + mutex_unlock(&anon->object.lock); + + if (nr_refs == 0) + panic("vm_anon: destruction not implemented"); +} + +static int +vm_anon_get(struct vm_object *object, uint64_t offset, struct list *pages, + int access_prot, int advice) +{ + (void)object; + (void)offset; + (void)pages; + (void)access_prot; + (void)advice; + + return -1; +} diff --git a/vm/vm_anon.h b/vm/vm_anon.h new file mode 100644 index 00000000..f3839233 --- /dev/null +++ b/vm/vm_anon.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2013 Richard Braun. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * + * Anonymous memory. + * + * Historically, this memory type refers to memory that isn't backed by a file + * on Unix, and as a result has no name. + */ + +#ifndef _VM_VM_ANON_H +#define _VM_VM_ANON_H + +#include <kern/stddef.h> +#include <vm/vm_object.h> + +/* + * Initialize the vm_anon module. + */ +void vm_anon_setup(void); + +/* + * Create an anonymous memory object. + */ +struct vm_object * vm_anon_create(size_t size); +#endif /* _VM_VM_ANON_H */ |