Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merging for release RC2
[palacios-OLD.git] / geekos / include / geekos / mem.h
1 /*
2  * Physical memory allocation
3  * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
4  * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
5  * $Revision: 1.2 $
6  * 
7  * This is free software.  You are permitted to use,
8  * redistribute, and modify it as specified in the file "COPYING".
9  */
10
11 #ifndef GEEKOS_MEM_H
12 #define GEEKOS_MEM_H
13
14 #include <geekos/ktypes.h>
15 #include <geekos/defs.h>
16 #include <geekos/list.h>
17 #include <geekos/paging.h>
18
19 struct Boot_Info;
20
21 /*
22  * Page flags
23  */
24 #define PAGE_AVAIL     0x0000    /* page is on the freelist */
25 #define PAGE_KERN      0x0001    /* page used by kernel code or data */
26 #define PAGE_HW        0x0002    /* page used by hardware (e.g., ISA hole) */
27 #define PAGE_ALLOCATED 0x0004    /* page is allocated */
28 #define PAGE_UNUSED    0x0008    /* page is unused */
29 #define PAGE_HEAP      0x0010    /* page is in kernel heap */
30 #define PAGE_PAGEABLE  0x0020    /* page can be paged out */
31 #define PAGE_LOCKED    0x0040    /* page is taken should not be freed */
32 #define PAGE_VM        0x0080    /* page is used by the VM */
33
34
35
36 #define KERNEL_HEAP_SIZE (512*PAGE_SIZE)
37
38 #define VMM_AVAIL_MEM_SIZE  (4096 * PAGE_SIZE)
39
40 /*
41  * PC memory map
42  */
43 #define ISA_HOLE_START 0x0A0000
44 #define ISA_HOLE_END   0x100000
45
46
47
48
49 struct Page;
50
51 /*
52  * List datatype for doubly-linked list of Pages.
53  */
54 DEFINE_LIST(Page_List, Page);
55
56 /*
57  * Each page of physical memory has one of these structures
58  * associated with it, to do allocation and bookkeeping.
59  */
60 struct Page {
61     unsigned flags;                      /* Flags indicating state of page */
62     DEFINE_LINK(Page_List, Page);        /* Link fields for Page_List */
63     int clock;
64     ulong_t vaddr;                       /* User virtual address where page is mapped */
65     pte_t *entry;                        /* Page table entry referring to the page */
66 };
67
68 IMPLEMENT_LIST(Page_List, Page);
69
70 void Init_Mem(struct Boot_Info* bootInfo);
71 void Init_BSS(void);
72 void* Alloc_Page(void);
73 void* Alloc_Pageable_Page(pte_t *entry, ulong_t vaddr);
74 void Free_Page(void* pageAddr);
75
76 /*
77  * Determine if given address is a multiple of the page size.
78  */
79 static __inline__ bool Is_Page_Multiple(ulong_t addr)
80 {
81     return addr == (addr & ~(PAGE_MASK));
82 }
83
84 /*
85  * Round given address up to a multiple of the page size
86  */
87 static __inline__ ulong_t Round_Up_To_Page(ulong_t addr)
88 {
89     if ((addr & PAGE_MASK) != 0) {
90         addr &= ~(PAGE_MASK);
91         addr += PAGE_SIZE;
92     }
93     return addr;
94 }
95
96 /*
97  * Round given address down to a multiple of the page size
98  */
99 static __inline__ ulong_t Round_Down_To_Page(ulong_t addr)
100 {
101     return addr & (~PAGE_MASK);
102 }
103
104 /*
105  * Get the index of the page in memory.
106  */
107 static __inline__ int Page_Index(ulong_t addr)
108 {
109     return (int) (addr >> PAGE_POWER);
110 }
111
112
113 /*
114  * Get the Page struct associated with given address.
115  */
116 static __inline__ struct Page *Get_Page(ulong_t addr)
117 {
118     extern struct Page* g_pageList;
119       return &g_pageList[Page_Index(addr)];
120       //return g_pageList + (sizeof(struct Page) * (int)(addr >> PAGE_POWER));
121 }
122
123 /*
124  * Get the physical address of the memory represented by given Page object.
125  */
126 static __inline__ ulong_t Get_Page_Address(struct Page *page)
127 {
128     extern struct Page* g_pageList;
129     ulong_t index = page - g_pageList;
130     return index << PAGE_POWER;
131 }
132
133 #endif  /* GEEKOS_MEM_H */