applied some bugfixes from eduOS
This commit is contained in:
parent
7d756306cf
commit
1ce6a27fc5
2 changed files with 34 additions and 58 deletions
|
@ -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;
|
||||||
|
|
72
mm/memory.c
72
mm/memory.c
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue