kern

annotate src/vm.h @ 80:4db99a52863e

fixed the "endianess" of the text messages in the ATA identify info block. this is the first time I've seen wrong byteorder in ascii text, the ATA committee should be commended.
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 06 Dec 2011 13:35:39 +0200
parents b45e2d5f0ae1
children
rev   line source
nuclear@17 1 #ifndef VM_H_
nuclear@17 2 #define VM_H_
nuclear@17 3
nuclear@17 4 #include <stdlib.h>
nuclear@17 5 #include "mboot.h"
nuclear@68 6 #include "rbtree.h"
nuclear@17 7
nuclear@47 8 #define KMEM_START 0xc0000000
nuclear@68 9 #define KMEM_START_PAGE ADDR_TO_PAGE(KMEM_START)
nuclear@47 10
nuclear@17 11 /* page mapping flags */
nuclear@17 12 #define PG_PRESENT (1 << 0)
nuclear@17 13 #define PG_WRITABLE (1 << 1)
nuclear@17 14 #define PG_USER (1 << 2)
nuclear@17 15 #define PG_WRITE_THROUGH (1 << 3)
nuclear@17 16 #define PG_NOCACHE (1 << 4)
nuclear@17 17 #define PG_ACCESSED (1 << 5)
nuclear@17 18 #define PG_DIRTY (1 << 6)
nuclear@17 19 #define PG_TYPE (1 << 7)
nuclear@17 20 /* PG_GLOBAL mappings won't flush from TLB */
nuclear@17 21 #define PG_GLOBAL (1 << 8)
nuclear@17 22
nuclear@17 23
nuclear@17 24 #define PGSIZE 4096
nuclear@23 25 #define PAGE_COUNT (1024 * 1024)
nuclear@23 26
nuclear@17 27 #define PGOFFS_MASK 0xfff
nuclear@17 28 #define PGNUM_MASK 0xfffff000
nuclear@18 29 #define PGENT_ADDR_MASK PGNUM_MASK
nuclear@17 30
nuclear@23 31 #define ADDR_TO_PAGE(x) ((uint32_t)(x) >> 12)
nuclear@23 32 #define PAGE_TO_ADDR(x) ((uint32_t)(x) << 12)
nuclear@17 33
nuclear@17 34 #define ADDR_TO_PGTBL(x) ((uint32_t)(x) >> 22)
nuclear@17 35 #define ADDR_TO_PGTBL_PG(x) (((uint32_t)(x) >> 12) & 0x3ff)
nuclear@17 36 #define ADDR_TO_PGOFFS(x) ((uint32_t)(x) & PGOFFS_MASK)
nuclear@17 37
nuclear@17 38 #define PAGE_TO_PGTBL(x) ((uint32_t)(x) >> 10)
nuclear@17 39 #define PAGE_TO_PGTBL_PG(x) ((uint32_t)(x) & 0x3ff)
nuclear@17 40
nuclear@57 41 /* argument to clone_vm */
nuclear@57 42 #define CLONE_SHARED 0
nuclear@57 43 #define CLONE_COW 1
nuclear@57 44
nuclear@57 45 /* last argument to *_page_bit */
nuclear@57 46 #define PAGE_ONLY 0
nuclear@57 47 #define WHOLE_PATH 1
nuclear@17 48
nuclear@68 49 struct vm_page {
nuclear@68 50 int vpage, ppage;
nuclear@68 51 unsigned int flags;
nuclear@68 52
nuclear@68 53 int nref;
nuclear@68 54 };
nuclear@68 55
nuclear@69 56 struct process;
nuclear@69 57
nuclear@26 58 void init_vm(void);
nuclear@17 59
nuclear@23 60 int map_page(int vpage, int ppage, unsigned int attr);
nuclear@43 61 int unmap_page(int vpage);
nuclear@23 62 int map_page_range(int vpg_start, int pgcount, int ppg_start, unsigned int attr);
nuclear@43 63 int unmap_page_range(int vpg_start, int pgcount);
nuclear@23 64 int map_mem_range(uint32_t vaddr, size_t sz, uint32_t paddr, unsigned int attr);
nuclear@17 65
nuclear@69 66 uint32_t virt_to_phys(uint32_t vaddr);
nuclear@43 67 int virt_to_phys_page(int vpg);
nuclear@69 68
nuclear@69 69 uint32_t virt_to_phys_proc(struct process *p, uint32_t vaddr);
nuclear@69 70 int virt_to_phys_page_proc(struct process *p, int vpg);
nuclear@18 71
nuclear@22 72 enum {
nuclear@22 73 MEM_KERNEL,
nuclear@22 74 MEM_USER
nuclear@22 75 };
nuclear@22 76
nuclear@22 77 int pgalloc(int num, int area);
nuclear@47 78 int pgalloc_vrange(int start, int num);
nuclear@23 79 void pgfree(int start, int num);
nuclear@23 80
nuclear@72 81 /* don't be fooled by the fact these two accept process arguments
nuclear@72 82 * they in fact work only for the "current" process (psrc and p)
nuclear@72 83 */
nuclear@69 84 void clone_vm(struct process *pdest, struct process *psrc, int cow);
nuclear@72 85 void cleanup_vm(struct process *p);
nuclear@57 86
nuclear@57 87 int get_page_bit(int pgnum, uint32_t bit, int wholepath);
nuclear@57 88 void set_page_bit(int pgnum, uint32_t bit, int wholepath);
nuclear@57 89 void clear_page_bit(int pgnum, uint32_t bit, int wholepath);
nuclear@43 90
nuclear@68 91 /* construct the vm map for the current user mappings */
nuclear@68 92 int cons_vmmap(struct rbtree *vmmap);
nuclear@68 93
nuclear@69 94 struct vm_page *get_vm_page(int vpg);
nuclear@69 95 struct vm_page *get_vm_page_proc(struct process *p, int vpg);
nuclear@69 96
nuclear@23 97 void dbg_print_vm(int area);
nuclear@22 98
nuclear@47 99 /* defined in vm-asm.S */
nuclear@47 100 void set_pgdir_addr(uint32_t addr);
nuclear@55 101 uint32_t get_pgdir_addr(void);
nuclear@47 102
nuclear@17 103 #endif /* VM_H_ */