nuclear@17: #include nuclear@17: #include "mem.h" nuclear@17: #include "panic.h" nuclear@17: #include "vm.h" nuclear@17: nuclear@17: /* end of kernel image */ nuclear@17: extern int _end; nuclear@17: nuclear@17: static uint32_t brk; nuclear@17: nuclear@17: void init_mem(struct mboot_info *mb) nuclear@17: { nuclear@17: /* start the physical allocated break at the end of nuclear@17: * the kernel image nuclear@17: */ nuclear@17: brk = (uint32_t)&_end; nuclear@17: } nuclear@17: nuclear@17: uint32_t alloc_phys_page(void) nuclear@17: { nuclear@17: uint32_t addr, dbg_prev_brk; nuclear@17: nuclear@17: if(ADDR_TO_PGOFFS(brk)) { nuclear@17: /* brk is not aligned, find the next page-aligned address */ nuclear@17: addr = (brk + PGSIZE) & ~PGOFFS_MASK; nuclear@17: } else { nuclear@17: /* brk is aligned, so we can use that address directly */ nuclear@17: addr = brk; nuclear@17: } nuclear@17: nuclear@17: if(addr >= MAX_BRK) { nuclear@17: panic("alloc_phys_page() out of early alloc space"); nuclear@17: } nuclear@17: nuclear@17: dbg_prev_brk = brk; nuclear@17: brk = addr + PGSIZE; /* move the break to the end of the page */ nuclear@17: nuclear@17: printf("DBG: alloc_phys_page(): %x (brk %x -> %x)\n", addr, dbg_prev_brk, brk); nuclear@17: return addr; nuclear@17: }