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 | }; |