@ -139,7 +139,12 @@ void UnmapRegion(VAddr base, u32 size) {
static u8 * GetPointerFromVMA ( VAddr vaddr ) {
u8 * direct_pointer = nullptr ;
auto & vma = Kernel : : g_current_process - > vm_manager . FindVMA ( vaddr ) - > second ;
auto & vm_manager = Kernel : : g_current_process - > vm_manager ;
auto it = vm_manager . FindVMA ( vaddr ) ;
ASSERT ( it ! = vm_manager . vma_map . end ( ) ) ;
auto & vma = it - > second ;
switch ( vma . type ) {
case Kernel : : VMAType : : AllocatedMemoryBlock :
direct_pointer = vma . backing_block - > data ( ) + vma . offset ;
@ -147,6 +152,8 @@ static u8* GetPointerFromVMA(VAddr vaddr) {
case Kernel : : VMAType : : BackingMemory :
direct_pointer = vma . backing_memory ;
break ;
case Kernel : : VMAType : : Free :
return nullptr ;
default :
UNREACHABLE ( ) ;
}
@ -341,11 +348,19 @@ void RasterizerMarkRegionCached(PAddr start, u32 size, int count_delta) {
if ( res_count = = 0 ) {
PageType & page_type = current_page_table - > attributes [ vaddr > > PAGE_BITS ] ;
switch ( page_type ) {
case PageType : : RasterizerCachedMemory :
page_type = PageType : : Memory ;
current_page_table - > pointers [ vaddr > > PAGE_BITS ] =
GetPointerFromVMA ( vaddr & ~ PAGE_MASK ) ;
case PageType : : RasterizerCachedMemory : {
u8 * pointer = GetPointerFromVMA ( vaddr & ~ PAGE_MASK ) ;
if ( pointer = = nullptr ) {
// It's possible that this function has called been while updating the pagetable
// after unmapping a VMA. In that case the underlying VMA will no longer exist,
// and we should just leave the pagetable entry blank.
page_type = PageType : : Unmapped ;
} else {
page_type = PageType : : Memory ;
current_page_table - > pointers [ vaddr > > PAGE_BITS ] = pointer ;
}
break ;
}
case PageType : : RasterizerCachedSpecial :
page_type = PageType : : Special ;
break ;