Esempio n. 1
0
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) {
Esempio n. 2
0
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);
}
Esempio n. 3
0
void main(){
	lcd_init();
	while(1){
		first_page();
		draw();
	}
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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];
		}
	}
}
Esempio n. 6
0
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);
//    }
}
Esempio n. 7
0
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");
}