void memory_catalog_initialize(struct MultibootInfo *multiboot_info) { next_unused_block = (struct MemoryCatalogBlock *) boot_allocate(sizeof(struct MemoryCatalogBlock) * kPagesPerMemorySpace); int memory_size_kibibytes = (multiboot_info->mem_lower + multiboot_info->mem_upper); cprintf("Found %dMB of usable RAM.\n", memory_size_kibibytes / 1024); size_t mmap_length = (size_t) multiboot_info->mmap_length; uintptr_t mmap_addr = (uintptr_t) multiboot_info->mmap_addr; size_t offset = 0; while (offset < mmap_length) { struct MultibootMemoryMapEntry *mmap_entry = (struct MultibootMemoryMapEntry *) (mmap_addr + offset); if (mmap_entry->type == MULTIBOOT_MEMORY_USABLE) { uintptr_t base_addr = mmap_entry->base_addr; if (base_addr % kMemoryCatalogBlockSize) { // TODO(jasonpr): Don't panic. Just round up, lessen the // length accordingly, and carry on. panic("Got misaligned memory mapping from bootloader: 0x%0x.\n", base_addr); } catalog_memory_range(base_addr, mmap_entry->length); } // Skip over the size field, and then the rest of the entry. offset += sizeof(mmap_entry->size) + mmap_entry->size; } }
void init_buddy() { get_mmap(); print_mmap(); // request memory for page descriptors // requested pages for all memory until the last available address -- because I can dt_size = (find_max_available_address() / PAGE_SIZE) * sizeof(page_descr); descr_table = (page_descr*) boot_allocate(dt_size); // initialize dt page_descr* prev = heads + 0; for(unsigned int i = 0; i < dt_size; ++i) { set_page_descr(descr_table + i, i, PAGE_DESCRIPTOR_RESERVED, 0, prev, NULL); } //initialize heads for(int i = 0; i < MAX_SIZE; ++i) { set_page_descr(heads + i, 0, PAGE_DESCRIPTOR_FICT, i, NULL, NULL); } //initialize actually available descriptors activate_available_mem(); //print_pages(); }
static irfboot *irf_boot_new (const GRETL_VAR *var, int periods) { irfboot *b; int err = 0; b = malloc(sizeof *b); if (b == NULL) { return NULL; } b->rE = NULL; b->Xt = NULL; b->Yt = NULL; b->Et = NULL; b->rtmp = NULL; b->ctmp = NULL; b->resp = NULL; b->C0 = NULL; b->sample = NULL; b->dset = NULL; b->horizon = periods; if (var->jinfo != NULL) { b->ncoeff = var->ncoeff + (var->neqns - jrank(var)) + n_restricted_terms(var); /* FIXME? */ } else { b->ncoeff = var->ncoeff; } #if BDEBUG fprintf(stderr, "boot: t1=%d, t2=%d, ncoeff=%d, horizon=%d\n", var->t1, var->t2, b->ncoeff, b->horizon); fprintf(stderr, " T=%d, neqns=%d, order=%d, rank=%d, ifc=%d\n", var->T, var->neqns, var->order, jrank(var), var->ifc); #endif err = boot_allocate(b, var); if (err) { irf_boot_free(b); b = NULL; } return b; }