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.


Release 1.0
[palacios.git] / misc / test_vm / include / geekos / mem.h
diff --git a/misc/test_vm/include/geekos/mem.h b/misc/test_vm/include/geekos/mem.h
new file mode 100644 (file)
index 0000000..87489f4
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Physical memory allocation
+ * Copyright (c) 2001,2003,2004 David H. Hovemeyer <daveho@cs.umd.edu>
+ * Copyright (c) 2003, Jeffrey K. Hollingsworth <hollings@cs.umd.edu>
+ * $Revision: 1.1 $
+ * 
+ * This is free software.  You are permitted to use,
+ * redistribute, and modify it as specified in the file "COPYING".
+ */
+
+#ifndef GEEKOS_MEM_H
+#define GEEKOS_MEM_H
+
+#include <geekos/ktypes.h>
+#include <geekos/defs.h>
+#include <geekos/list.h>
+#include <geekos/paging.h>
+
+struct Boot_Info;
+
+/*
+ * Page flags
+ */
+#define PAGE_AVAIL     0x0000   /* page is on the freelist */
+#define PAGE_KERN      0x0001   /* page used by kernel code or data */
+#define PAGE_HW        0x0002   /* page used by hardware (e.g., ISA hole) */
+#define PAGE_ALLOCATED 0x0004   /* page is allocated */
+#define PAGE_UNUSED    0x0008   /* page is unused */
+#define PAGE_HEAP      0x0010   /* page is in kernel heap */
+#define PAGE_PAGEABLE  0x0020   /* page can be paged out */
+#define PAGE_LOCKED    0x0040    /* page is taken should not be freed */
+
+/*
+ * PC memory map
+ */
+#define ISA_HOLE_START 0x0A0000
+#define ISA_HOLE_END   0x100000
+
+/*
+ * We reserve the two pages just after the ISA hole for the initial
+ * kernel thread's context object and stack.
+ */
+//#define HIGHMEM_START (ISA_HOLE_END + 8192)
+#define HIGHMEM_START ISA_HOLE_END
+/*
+ * Make the kernel heap this size
+ */
+#define KERNEL_HEAP_SIZE (1024*1024)
+
+struct Page;
+
+/*
+ * List datatype for doubly-linked list of Pages.
+ */
+DEFINE_LIST(Page_List, Page);
+
+/*
+ * Each page of physical memory has one of these structures
+ * associated with it, to do allocation and bookkeeping.
+ */
+struct Page {
+    unsigned flags;                     /* Flags indicating state of page */
+    DEFINE_LINK(Page_List, Page);       /* Link fields for Page_List */
+    int clock;
+    ulong_t vaddr;                      /* User virtual address where page is mapped */
+    pte_t *entry;                       /* Page table entry referring to the page */
+};
+
+IMPLEMENT_LIST(Page_List, Page);
+
+void Init_Mem(struct Boot_Info* bootInfo);
+void Init_BSS(void);
+void* Alloc_Page(void);
+void* Alloc_Pageable_Page(pte_t *entry, ulong_t vaddr);
+void Free_Page(void* pageAddr);
+
+/*
+ * Determine if given address is a multiple of the page size.
+ */
+static __inline__ bool Is_Page_Multiple(ulong_t addr)
+{
+    return addr == (addr & ~(PAGE_MASK));
+}
+
+/*
+ * Round given address up to a multiple of the page size
+ */
+static __inline__ ulong_t Round_Up_To_Page(ulong_t addr)
+{
+    if ((addr & PAGE_MASK) != 0) {
+       addr &= ~(PAGE_MASK);
+       addr += PAGE_SIZE;
+    }
+    return addr;
+}
+
+/*
+ * Round given address down to a multiple of the page size
+ */
+static __inline__ ulong_t Round_Down_To_Page(ulong_t addr)
+{
+    return addr & (~PAGE_MASK);
+}
+
+/*
+ * Get the index of the page in memory.
+ */
+static __inline__ int Page_Index(ulong_t addr)
+{
+    return (int) (addr >> PAGE_POWER);
+}
+
+/*
+ * Get the Page struct associated with given address.
+ */
+static __inline__ struct Page *Get_Page(ulong_t addr)
+{
+    extern struct Page* g_pageList;
+    return &g_pageList[Page_Index(addr)];
+}
+
+/*
+ * Get the physical address of the memory represented by given Page object.
+ */
+static __inline__ ulong_t Get_Page_Address(struct Page *page)
+{
+    extern struct Page* g_pageList;
+    ulong_t index = page - g_pageList;
+    return index << PAGE_POWER;
+}
+
+#endif  /* GEEKOS_MEM_H */