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>
7 * This is free software. You are permitted to use,
8 * redistribute, and modify it as specified in the file "COPYING".
14 #include <geekos/ktypes.h>
15 #include <geekos/defs.h>
16 #include <geekos/list.h>
17 #include <geekos/paging.h>
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 */
36 #define KERNEL_HEAP_SIZE (512*PAGE_SIZE)
38 #define VMM_AVAIL_MEM_SIZE (4096 * PAGE_SIZE)
43 #define ISA_HOLE_START 0x0A0000
44 #define ISA_HOLE_END 0x100000
52 * List datatype for doubly-linked list of Pages.
54 DEFINE_LIST(Page_List, Page);
57 * Each page of physical memory has one of these structures
58 * associated with it, to do allocation and bookkeeping.
61 unsigned flags; /* Flags indicating state of page */
62 DEFINE_LINK(Page_List, Page); /* Link fields for Page_List */
64 ulong_t vaddr; /* User virtual address where page is mapped */
65 pte_t *entry; /* Page table entry referring to the page */
68 IMPLEMENT_LIST(Page_List, Page);
70 void Init_Mem(struct Boot_Info* bootInfo);
72 void* Alloc_Page(void);
73 void* Alloc_Pageable_Page(pte_t *entry, ulong_t vaddr);
74 void Free_Page(void* pageAddr);
77 * Determine if given address is a multiple of the page size.
79 static __inline__ bool Is_Page_Multiple(ulong_t addr)
81 return addr == (addr & ~(PAGE_MASK));
85 * Round given address up to a multiple of the page size
87 static __inline__ ulong_t Round_Up_To_Page(ulong_t addr)
89 if ((addr & PAGE_MASK) != 0) {
97 * Round given address down to a multiple of the page size
99 static __inline__ ulong_t Round_Down_To_Page(ulong_t addr)
101 return addr & (~PAGE_MASK);
105 * Get the index of the page in memory.
107 static __inline__ int Page_Index(ulong_t addr)
109 return (int) (addr >> PAGE_POWER);
114 * Get the Page struct associated with given address.
116 static __inline__ struct Page *Get_Page(ulong_t addr)
118 extern struct Page* g_pageList;
119 return &g_pageList[Page_Index(addr)];
120 //return g_pageList + (sizeof(struct Page) * (int)(addr >> PAGE_POWER));
124 * Get the physical address of the memory represented by given Page object.
126 static __inline__ ulong_t Get_Page_Address(struct Page *page)
128 extern struct Page* g_pageList;
129 ulong_t index = page - g_pageList;
130 return index << PAGE_POWER;
133 #endif /* GEEKOS_MEM_H */