void microbit_filesystem_init(void) { init_limits(); randomise_start_index(); file_chunk *base = first_page(); if (base->marker == PERSISTENT_DATA_MARKER) { file_system_chunks = &base[(FLASH_PAGESIZE>>MBFS_LOG_CHUNK_SIZE)-1]; } else if (((file_chunk *)last_page())->marker == PERSISTENT_DATA_MARKER) {
t_block *search_freed_block(size_t size) { t_page *page; t_block *b; size_t mem_width; t_page_type mal_type; mal_type = page_type(size); page = first_page(); b = NULL; while (page != NULL) { if (page->type == mal_type) b = search_freed_block_in_page(page, size); if (b != NULL) break ; page = page->next; } if (b == NULL) return (NULL); mem_width = b->size + BLOCK_SIZE; b->size = size; split_block(b, mem_width); b->is_free = 0; return (b); }
void main(){ lcd_init(); while(1){ first_page(); draw(); } }
struct phys_page *search_obj_chain(mm_context *ctx, struct mm_mapping *mapping, uintptr_t fault_addr) { struct mm_object *front_pobj = mapping->object; struct mm_object *pobj = front_pobj; struct phys_page *page; struct phys_page *new_page; uintptr_t fault_page = (uintptr_t)fault_addr & ~0xfff; int prot = PM_USER | (mapping->prot & PM_WRITABLE ? PM_WRITABLE : 0); while (pobj) { rwlock_wrlock(&pobj->lock); page = first_page(pobj); while (page) { if (mapping->start_addr + page->offset == fault_page) { switch (pobj->share_type) { case share_private: // kdebug("Object is private %p\n", fault_page); kpage_map_user((void *)fault_page, page, mm_pgtable_alloc_callback, ctx, ctx->cr3, prot); //mm_ctx_reload(ctx); break; case share_shared: // kdebug("Object is shared %p\n", fault_page); kpage_map_user((void *)fault_page, page, mm_pgtable_alloc_callback, ctx, ctx->cr3, prot); // mm_ctx_reload(ctx); break; case share_cow: // kdebug("%d: Object is cow %p %p\n", get_core_id(), fault_addr, ctx); /* Make a copy of the page and put it in front_pobj */ new_page = kphys_alloc(physmem_state_user); new_page->offset = fault_page - mapping->start_addr; front_pobj->page_list.add_head(new_page); ++front_pobj->npages; memcpy((void *)(pagestruct_to_phys(new_page) + VADDR_PHYSMEM), (void *)(pagestruct_to_phys(page) + VADDR_PHYSMEM), __PAGESIZE); kpage_map_user((void *)fault_page, new_page, mm_pgtable_alloc_callback, ctx, ctx->cr3, PM_WRITABLE | PM_USER); break; default: ; } rwlock_unlock(&pobj->lock); return page; } /* Go to the next one */ page = next_page(pobj, page); } rwlock_unlock(&pobj->lock); pobj = pobj->chain; } return NULL; }
void draw(void){ unsigned char i; first_page(); if(situation==0){ for(i=0;i<snakelen;i++){ set_dot(snakex[i],snakey[i]); } for(i=0;i<6;i++){ if(food[i]){ set_dot(foodx[i],foody[i]); } } }else if(situation==1){ for(i=0;i<32;i++){ LEDarraydata[i]=die[i]; } }else if(situation==3){ for(i=0;i<32;i++){ LEDarraydata[i]=win[i]; } } }
static void mm_change_commit(mm_context *ctx, struct mm_mapping *mapping, int flags) { struct mm_object *pobj = mapping->object->chain; struct phys_page *page; while (pobj && pobj->share_type == share_private) { rwlock_wrlock(&pobj->lock); page = first_page(pobj); while (page) { kpage_map_prot(ctx->cr3, (void *)(mapping->start_addr + page->offset), flags); /* Go to the next one */ page = next_page(pobj, page); } pobj->share_type = share_cow; rwlock_unlock(&pobj->lock); pobj = pobj->chain; } // uint64_t p; // uintptr_t start, end; // // start = mapping->start_addr; // end = start + mapping->length - 1; // // start &= ~0xfff; // end = __PAGEROUND(end); // //kdebug("s=%016lx e=%016lx\n", start, end); // // for (p=start; p<end; p+=__PAGESIZE) // { // //kdebug("Unmapping %016lx\n", p); // kpage_map_prot(ctx->cr3, (void *)p, flags); // } }
void mm_context_dump(mm_context *ctx) { return ; struct mm_mapping *pmap; // Process *proc; kdebug("---------------------------------------------\n"); // if ((proc = proctable.procobj_getref(ctx->pid)) == NULL) // { // kdebug("MM_CONTEXT - ERROR\n"); // return; // } // kdebug("MM_CONTEXT: pid=%d %s\n", ctx->pid, proc->name); kdebug("ctx %p\n", ctx); kdebug("cr3 %p\n", ctx->cr3); kdebug("low_addr %p\n", ctx->low_addr); kdebug("hi_addr %p\n", ctx->hi_addr); kdebug("anon_addr %p\n", ctx->anon_addr); pmap = first_mapping(ctx); while (pmap) { struct mm_object *pobj; kdebug("%p, %p %p ", pmap, pmap->start_addr, pmap->start_addr+pmap->length-1); if (pmap->prot & PROT_READ) kdebug("r"); else kdebug("-"); if (pmap->prot & PROT_WRITE) kdebug("w"); else kdebug("-"); if (pmap->prot & PROT_EXEC) kdebug("x"); else kdebug("-"); kdebug("\n"); pobj = pmap->object; while (pobj) { switch (pobj->share_type) { case share_cow: kdebug("cow - "); break; case share_private: kdebug("pri - "); break; case share_shared: kdebug("shr - "); break; default: kdebug("unk - "); break; } kdebug(" %d pages\n", pobj->npages); int page_count = 0; struct phys_page *page; page = first_page(pobj); while (page) { if (pobj->npages < 20) { kdebug(" %p\n", pmap->start_addr + page->offset); } ++page_count; page = next_page(pobj, page); } pobj = pobj->chain; } pmap = next_mapping(ctx, pmap); } kdebug("---------------------------------------------\n"); }