Subversion Repositories Kolibri OS

Rev

Rev 1066 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1066 Rev 1313
Line 336... Line 336...
336
 
336
 
337
            addr_t  *pte = &((addr_t*)page_tabs)[heap >> PAGE_WIDTH];
337
            addr_t  *pte = &((addr_t*)page_tabs)[heap >> PAGE_WIDTH];
Line -... Line 338...
-
 
338
            addr_t  *mpte = &map->pte[0];
338
            addr_t  *mpte = &map->pte[0];
339
 
339
 
340
            mem = heap;
340
#if 0
341
 
Line -... Line 342...
-
 
342
            if( flags & PG_MAP )
-
 
343
            {
-
 
344
 
341
            if( flags & PG_MAP )
345
#ifdef  ALLOC_IMM
-
 
346
 
342
                page = PG_DEMAND | (flags & 0xFFF);
347
                while( pages )
-
 
348
                {
-
 
349
                    u32_t   order;
-
 
350
                    addr_t  page_frame;
-
 
351
 
-
 
352
                    asm volatile ("bsr %0, %1":"=&r"(order):"r"(tmp):"cc");
-
 
353
                    asm volatile ("btr %0, %1" :"=r"(tmp):"r"(order):"cc");
-
 
354
 
343
 
355
                    page_frame = frame_alloc(1 << order) | (flags & 0xFFF);
344
            mem = heap;
356
 
345
            while(pages--)
357
                    for(i = 0; i < 1 << order; i++)
Line 346... Line 358...
346
            {
358
                    {
347
                *pte++  = 0; //page;
359
                        *pte++  = 0; //page;
348
                *mpte++ = page;
360
                        *mpte++ = page;
-
 
361
 
349
 
362
                        asm volatile ( "invlpg (%0)" ::"r" (mem) );
-
 
363
                        mem+=  4096;
350
                asm volatile ( "invlpg (%0)" ::"r" (mem) );
364
                    };
Line 351... Line 365...
351
                mem+=  4096;
365
                }
352
            };
366
#else
353
#else
-
 
354
            mem = heap;
-
 
355
 
-
 
356
            while(pages--)
-
 
357
            {
-
 
358
                if( flags & PG_MAP )
367
 
359
                    page = alloc_page();
368
                page = PG_DEMAND | (flags & 0xFFF);
360
 
-
 
361
                page |= flags & 0xFFF;
369
 
362
 
370
                while(pages--)
363
                *pte++  = 0;
371
                {
364
                *mpte++ = page;
372
                    *pte++  = 0;
-
 
373
                    *mpte++ = page;
-
 
374
                    asm volatile ( "invlpg (%0)" ::"r" (mem) );
-
 
375
                    mem+=  4096;
-
 
376
                };
-
 
377
#endif
-
 
378
            }
-
 
379
            else
Line -... Line 380...
-
 
380
            {
-
 
381
                while(pages--)
-
 
382
                {
-
 
383
                    *pte++  = 0; //page;
-
 
384
                    *mpte++ = 0;
-
 
385
 
365
 
386
                    asm volatile ( "invlpg (%0)" ::"r" (mem) );
Line 366... Line 387...
366
                asm volatile ( "invlpg (%0)" ::"r" (mem) );
387
                    mem+=  4096;
367
                mem+=  4096;
388
                };
Line 427... Line 448...
427
 
448
 
Line 428... Line 449...
428
        spinlock_unlock(&z_heap.lock);
449
        spinlock_unlock(&z_heap.lock);
429
        safe_sti(efl);
450
        safe_sti(efl);
Line 430... Line 451...
430
 
451
 
-
 
452
        for( i = 0; i < (map->size >> PAGE_WIDTH); )
431
        for( i = 0; i < (map->size >> PAGE_WIDTH); i++)
453
        {
-
 
454
           i+= frame_free(map->pte[i]);
Line 432... Line 455...
432
            frame_free(map->pte[i]);
455
        }
433
 
456
 
434
        frame_free( KA2PA(map) );
457
        frame_free( KA2PA(map) );
435
    }
458
    }
436
    else
459
    else
437
    {
460
    {
438
        spinlock_unlock(&z_heap.lock);
461
        spinlock_unlock(&z_heap.lock);
439
        safe_sti(efl);
462
        safe_sti(efl);
Line 440... Line -...
440
    };
-
 
441
};
463
    };
442
 
464
};
443
 
465
 
444
void __fastcall heap_fault(addr_t faddr, u32_t code)
466
void __fastcall heap_fault(addr_t faddr, u32_t code)
445
{
467
{
Line 464... Line 486...
464
        page = map->pte[idx];
486
        page = map->pte[idx];
Line 465... Line 487...
465
 
487
 
466
        if( page != 0)
488
        if( page != 0)
467
        {
-
 
468
#if 0
489
        {
469
            if( page & PG_DEMAND)
490
            if( page & PG_DEMAND)
470
            {
491
            {
471
                page &= ~PG_DEMAND;
492
                page &= ~PG_DEMAND;
Line 472... Line 493...
472
                page = alloc_page() | (page & 0xFFF);
493
                page = alloc_page() | (page & 0xFFF);
473
 
494
 
474
                map->pte[idx] = page;
-
 
475
            };
495
                map->pte[idx] = page;
476
#endif
496
            };
477
            ((addr_t*)page_tabs)[faddr >> PAGE_WIDTH] = page;
497
            ((addr_t*)page_tabs)[faddr >> PAGE_WIDTH] = page;
478
        };
498
        };