diff options
author | Richard Braun <rbraun@sceen.net> | 2012-09-30 19:31:58 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2012-09-30 19:31:58 +0200 |
commit | 69504fc63720b4bf2677d6074285b82256bc9b83 (patch) | |
tree | 47fad139526df60554e3fd26a7b8b1577f29d2d0 /vm/vm_map.h |
Initial commit
Diffstat (limited to 'vm/vm_map.h')
-rw-r--r-- | vm/vm_map.h | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/vm/vm_map.h b/vm/vm_map.h new file mode 100644 index 0000000..7231b6a --- /dev/null +++ b/vm/vm_map.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2011, 2012 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/>. + * + * + * Virtual memory map management. + */ + +#ifndef _VM_VM_MAP_H +#define _VM_VM_MAP_H + +#include <lib/list.h> +#include <lib/rbtree.h> +#include <lib/stdint.h> +#include <machine/pmap.h> + +/* + * Mapping flags and masks. + * + * All these flags can be used when creating a mapping. Most of them are + * also used as map entry flags. + */ +#define VM_MAP_PROT_READ 0x00001 +#define VM_MAP_PROT_WRITE 0x00002 +#define VM_MAP_PROT_EXEC 0x00004 +#define VM_MAP_PROT_ALL (VM_MAP_PROT_READ \ + | VM_MAP_PROT_WRITE \ + | VM_MAP_PROT_EXEC) +#define VM_MAP_PROT_MASK VM_MAP_PROT_ALL + +#define VM_MAP_MAX_PROT_READ (VM_MAP_PROT_READ << 4) +#define VM_MAP_MAX_PROT_WRITE (VM_MAP_PROT_WRITE << 4) +#define VM_MAP_MAX_PROT_EXEC (VM_MAP_PROT_EXEC << 4) +#define VM_MAP_MAX_PROT_ALL (VM_MAP_MAX_PROT_READ \ + | VM_MAP_MAX_PROT_WRITE \ + | VM_MAP_MAX_PROT_EXEC) +#define VM_MAP_MAX_PROT_MASK VM_MAP_MAX_PROT_ALL + +#define VM_MAP_INHERIT_SHARE 0x00100 +#define VM_MAP_INHERIT_COPY 0x00200 +#define VM_MAP_INHERIT_NONE 0x00400 +#define VM_MAP_INHERIT_MASK (VM_MAP_INHERIT_SHARE \ + | VM_MAP_INHERIT_COPY \ + | VM_MAP_INHERIT_NONE) + +#define VM_MAP_ADVISE_NORMAL 0x01000 +#define VM_MAP_ADVISE_RAND 0x02000 +#define VM_MAP_ADVISE_SEQ 0x04000 +#define VM_MAP_ADVISE_MASK (VM_MAP_ADVISE_NORMAL \ + | VM_MAP_ADVISE_RAND \ + | VM_MAP_ADVISE_SEQ) + +#define VM_MAP_NOMERGE 0x10000 +#define VM_MAP_FIXED 0x20000 /* Not an entry flag */ + +/* + * Flags that can be used as map entry flags. + */ +#define VM_MAP_ENTRY_MASK (VM_MAP_PROT_MASK \ + | VM_MAP_MAX_PROT_MASK \ + | VM_MAP_INHERIT_MASK \ + | VM_MAP_ADVISE_MASK \ + | VM_MAP_NOMERGE) + +/* + * Memory range descriptor. + */ +struct vm_map_entry { + struct list list_node; + struct rbtree_node tree_node; + unsigned long start; + unsigned long end; + struct vm_object *object; + uint64_t offset; + int flags; +}; + +/* + * Memory map. + */ +struct vm_map { + struct list entry_list; + struct rbtree entry_tree; + unsigned int nr_entries; + unsigned long start; + unsigned long end; + size_t size; + struct vm_map_entry *lookup_cache; + unsigned long find_cache; + size_t find_cache_threshold; + struct pmap *pmap; +}; + +/* + * Create a virtual mapping. + */ +int vm_map_enter(struct vm_map *map, struct vm_object *object, uint64_t offset, + unsigned long *startp, size_t size, size_t align, int flags); + +/* + * Remove mappings from start to end. + */ +void vm_map_remove(struct vm_map *map, unsigned long start, unsigned long end); + +/* + * Initialize a VM map. + */ +void vm_map_init(struct vm_map *map, struct pmap *pmap, unsigned long start, + unsigned long end); + +/* + * Early initialization of the vm_map module. + * + * This function creates the kernel map and the kentry cache, making it + * possible to map kernel memory. + */ +void vm_map_bootstrap(void); + +/* + * Set up the vm_map module. + */ +void vm_map_setup(void); + +/* + * Display information about a memory map. + */ +void vm_map_info(struct vm_map *map); + +#endif /* _VM_VM_MAP_H */ |