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.


(no commit message)
[palacios.git] / palacios / 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.1.1.1 $
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 struct Page;
36
37 /*
38  * List datatype for doubly-linked list of Pages.
39  */
40 DEFINE_LIST(Page_List, Page);
41
42 /*
43  * Each page of physical memory has one of these structures
44  * associated with it, to do allocation and bookkeeping.
45  */
46 struct Page {
47     unsigned flags;                      /* Flags indicating state of page */
48     DEFINE_LINK(Page_List, Page);        /* Link fields for Page_List */
49     int clock;
50     ulong_t vaddr;                       /* User virtual address where page is mapped */
51     pte_t *entry;                        /* Page table entry referring to the page */
52 };
53
54 IMPLEMENT_LIST(Page_List, Page);
55
56 void Init_Mem(struct Boot_Info* bootInfo);
57 void Init_BSS(void);
58 void* Alloc_Page(void);
59 void* Alloc_Pageable_Page(pte_t *entry, ulong_t vaddr);
60 void Free_Page(void* pageAddr);
61
62 /*
63  * Determine if given address is a multiple of the page size.
64  */
65 static __inline__ bool Is_Page_Multiple(ulong_t addr)
66 {
67     return addr == (addr & ~(PAGE_MASK));
68 }
69
70 /*
71  * Round given address up to a multiple of the page size
72  */
73 static __inline__ ulong_t Round_Up_To_Page(ulong_t addr)
74 {
75     if ((addr & PAGE_MASK) != 0) {
76         addr &= ~(PAGE_MASK);
77         addr += PAGE_SIZE;
78     }
79     return addr;
80 }
81
82 /*
83  * Round given address down to a multiple of the page size
84  */
85 static __inline__ ulong_t Round_Down_To_Page(ulong_t addr)
86 {
87     return addr & (~PAGE_MASK);
88 }
89
90 /*
91  * Get the index of the page in memory.
92  */
93 static __inline__ int Page_Index(ulong_t addr)
94 {
95     return (int) (addr >> PAGE_POWER);
96 }
97
98
99 /*
100  * Get the Page struct associated with given address.
101  */
102 static __inline__ struct Page *Get_Page(ulong_t addr)
103 {
104     extern struct Page* g_pageList;
105       return &g_pageList[Page_Index(addr)];
106       //return g_pageList + (sizeof(struct Page) * (int)(addr >> PAGE_POWER));
107 }
108
109 /*
110  * Get the physical address of the memory represented by given Page object.
111  */
112 static __inline__ ulong_t Get_Page_Address(struct Page *page)
113 {
114     extern struct Page* g_pageList;
115     ulong_t index = page - g_pageList;
116     return index << PAGE_POWER;
117 }
118
119 #endif  /* GEEKOS_MEM_H */