@@ -5,6 +5,7 @@
*/
#include "alloc.h"
#include "asm/spinlock.h"
+#include "asm/page.h"
#include "asm/io.h"
#define MIN(a, b) ((a) < (b) ? (a) : (b))
@@ -137,6 +138,37 @@ phys_addr_t phys_zalloc(phys_addr_t size)
return phys_zalloc_aligned(size, align_min);
}
+static void *free_head;
+void heap_init(void *start, size_t size)
+{
+ void *p = (void *)ALIGN((unsigned long)start, PAGE_SIZE);
+
+ while (size >= PAGE_SIZE) {
+ *(void **)p = free_head;
+ free_head = p;
+ p += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+}
+
+void *alloc_page(void)
+{
+ void *p;
+
+ if (!free_head)
+ return NULL;
+
+ p = free_head;
+ free_head = *(void **)free_head;
+ return p;
+}
+
+void free_page(void *page)
+{
+ *(void **)page = free_head;
+ free_head = page;
+}
+
static void *early_malloc(size_t size)
{
phys_addr_t addr = phys_alloc_aligned_safe(size, align_min, true);
@@ -115,4 +115,14 @@ extern phys_addr_t phys_zalloc(phys_addr_t size);
*/
extern void phys_alloc_show(void);
+/*
+ * Heap page allocator
+ *
+ * After initializing with heap_init, {alloc,free}_page can be used
+ * to easily manage pages.
+ */
+extern void heap_init(void *start, size_t size);
+extern void *alloc_page(void);
+extern void free_page(void *page);
+
#endif /* _ALLOC_H_ */
@@ -1,39 +1,10 @@
#include "fwcfg.h"
#include "vm.h"
#include "libcflat.h"
+#include "alloc.h"
-static void *free = 0;
static void *vfree_top = 0;
-static void free_memory(void *mem, unsigned long size)
-{
- while (size >= PAGE_SIZE) {
- *(void **)mem = free;
- free = mem;
- mem += PAGE_SIZE;
- size -= PAGE_SIZE;
- }
-}
-
-void *alloc_page()
-{
- void *p;
-
- if (!free)
- return 0;
-
- p = free;
- free = *(void **)free;
-
- return p;
-}
-
-void free_page(void *page)
-{
- *(void **)page = free;
- free = page;
-}
-
extern char edata;
static unsigned long end_of_memory;
@@ -153,7 +124,7 @@ void setup_vm()
{
assert(!end_of_memory);
end_of_memory = fwcfg_get_u64(FW_CFG_RAM_SIZE);
- free_memory(&edata, end_of_memory - (unsigned long)&edata);
+ heap_init(&edata, end_of_memory - (unsigned long)&edata);
setup_mmu(end_of_memory);
}
@@ -3,6 +3,7 @@
all: test_cases
cflatobjs += lib/pci.o
+cflatobjs += lib/alloc.o
cflatobjs += lib/x86/io.o
cflatobjs += lib/x86/smp.o
cflatobjs += lib/x86/vm.o
This allows other arches to use {alloc,free}_page. Signed-off-by: Andrew Jones <drjones@redhat.com> --- lib/alloc.c | 32 ++++++++++++++++++++++++++++++++ lib/alloc.h | 10 ++++++++++ lib/x86/vm.c | 33 ++------------------------------- x86/Makefile.common | 1 + 4 files changed, 45 insertions(+), 31 deletions(-)