applied some bugfixes from eduOS

This commit is contained in:
Steffen Vogel 2014-06-30 00:37:05 +02:00
parent 7d756306cf
commit 1ce6a27fc5
2 changed files with 34 additions and 58 deletions

View file

@ -36,11 +36,11 @@
#ifdef CONFIG_MULTIBOOT #ifdef CONFIG_MULTIBOOT
/// Does the bootloader provide mem_* fields? /// Does the bootloader provide mem_* fields?
#define MULTIBOOT_INFO_MEM 0x00000001 #define MULTIBOOT_INFO_MEM (1 << 0)
/// Does the bootloader provide a list of modules? /// Does the bootloader provide a list of modules?
#define MULTIBOOT_INFO_MODS 0x00000008 #define MULTIBOOT_INFO_MODS (1 << 3)
/// Does the bootloader provide a full memory map? /// Does the bootloader provide a full memory map?
#define MULTIBOOT_INFO_MEM_MAP 0x00000040 #define MULTIBOOT_INFO_MEM_MAP (1 << 6)
typedef uint16_t multiboot_uint16_t; typedef uint16_t multiboot_uint16_t;
typedef uint32_t multiboot_uint32_t; typedef uint32_t multiboot_uint32_t;

View file

@ -80,75 +80,50 @@ inline static void page_clear_mark(size_t i)
size_t get_pages(size_t npages) size_t get_pages(size_t npages)
{ {
// first page is reserved size_t cnt, off;
static size_t start = 1;
size_t i, j, l;
size_t k = 0;
size_t ret = 0;
if (BUILTIN_EXPECT(!npages, 0)) if (BUILTIN_EXPECT(!npages, 0))
return ret; return 0;
if (BUILTIN_EXPECT(npages > atomic_int32_read(&total_available_pages), 0)) if (BUILTIN_EXPECT(npages > atomic_int32_read(&total_available_pages), 0))
return ret; return 0;
spinlock_lock(&bitmap_lock); spinlock_lock(&bitmap_lock);
i = start; off = 1;
next_try: while (off <= BITMAP_SIZE*8 - npages) {
while((k < BITMAP_SIZE) && page_marked(i)) { for (cnt=0; cnt<npages; cnt++) {
k++; if (page_marked(off+cnt))
i = (i+1) & (BITMAP_SIZE-1); goto next;
} }
if (k >= BITMAP_SIZE) for (cnt=0; cnt<npages; cnt++) {
goto oom; page_set_mark(off+cnt);
for(j=1; (j<npages) && (i+j < BITMAP_SIZE) && (k < BITMAP_SIZE); j++, k++) {
if (page_marked(i+j)) {
i = (i+j) & (BITMAP_SIZE-1);
goto next_try;
} }
}
if (i+j >= BITMAP_SIZE) {
i = 1;
goto next_try;
}
if (k >= BITMAP_SIZE)
goto oom;
ret = i*PAGE_SIZE;
kprintf("get_pages: ret 0x%x, i = %d, j = %d, npages = %d\n", ret, i, j, npages); // TODO: remove
for(l=i; l<i+j; l++)
page_set_mark(l);
start = i+j;
spinlock_unlock(&bitmap_lock); spinlock_unlock(&bitmap_lock);
atomic_int32_add(&total_allocated_pages, npages); atomic_int32_add(&total_allocated_pages, npages);
atomic_int32_sub(&total_available_pages, npages); atomic_int32_sub(&total_available_pages, npages);
return ret; return off << PAGE_BITS;
next: off += cnt+1;
}
oom:
spinlock_unlock(&bitmap_lock); spinlock_unlock(&bitmap_lock);
return ret; return 0;
} }
int put_pages(size_t phyaddr, size_t npages) int put_pages(size_t phyaddr, size_t npages)
{ {
if (BUILTIN_EXPECT(!phyaddr || !npages, 0))
return -EINVAL;
size_t i, ret = 0; size_t i, ret = 0;
size_t base = phyaddr >> PAGE_BITS; size_t base = phyaddr >> PAGE_BITS;
kprintf("put_pages: phyaddr=%#lx, npages = %d", phyaddr, npages); // TODO: remove if (BUILTIN_EXPECT(!phyaddr, 0))
return -EINVAL;
if (BUILTIN_EXPECT(!npages, 0))
return -EINVAL;
spinlock_lock(&bitmap_lock); spinlock_lock(&bitmap_lock);
@ -164,7 +139,8 @@ int put_pages(size_t phyaddr, size_t npages)
atomic_int32_sub(&total_allocated_pages, ret); atomic_int32_sub(&total_allocated_pages, ret);
atomic_int32_add(&total_available_pages, ret); atomic_int32_add(&total_available_pages, ret);
kprintf(", ret = %d\n", ret); // TODO: remove kprintf("put_pages: phyaddr=%#lx, npages = %d, ret = %d\n",
phyaddr, npages, ret); // TODO: remove
return ret; return ret;
} }
@ -223,14 +199,14 @@ int mmu_init(void)
} }
else if (mb_info->flags & MULTIBOOT_INFO_MEM) { else if (mb_info->flags & MULTIBOOT_INFO_MEM) {
size_t page; size_t page;
size_t pages_lower = mb_info->mem_lower >> 2; size_t pages_lower = mb_info->mem_lower >> 2; /* KiB to page number */
size_t pages_upper = mb_info->mem_upper >> 2; size_t pages_upper = mb_info->mem_upper >> 2;
for (page=0; page<pages_lower; page++) for (page=0; page<pages_lower; page++)
page_clear_mark(page); page_clear_mark(page);
for (page=0x100000; page<pages_upper+0x100000; page++) for (page=0; page<pages_upper; page++)
page_clear_mark(page); page_clear_mark(page + 256); /* 1 MiB == 256 pages offset */
atomic_int32_add(&total_pages, pages_lower + pages_upper); atomic_int32_add(&total_pages, pages_lower + pages_upper);
atomic_int32_add(&total_available_pages, pages_lower + pages_upper); atomic_int32_add(&total_available_pages, pages_lower + pages_upper);