From 4b1fffae7ad45b1d973b088e919c53ef0880f190 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 24 Apr 2010 10:20:35 +0800 Subject: [PATCH] Fixed MM_UnmapHWPages overwriting the wrong area --- Kernel/arch/x86/mm_virt.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index f3cd7bb7..9c933342 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -1024,17 +1024,21 @@ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) void MM_UnmapHWPages(tVAddr VAddr, Uint Number) { int i, j; + + //Log_Debug("VirtMem", "MM_UnmapHWPages: (VAddr=0x%08x, Number=%i)", VAddr, Number); + // Sanity Check - if(VAddr < HW_MAP_ADDR || VAddr-Number*0x1000 > HW_MAP_MAX) return; + if(VAddr < HW_MAP_ADDR || VAddr+Number*0x1000 > HW_MAP_MAX) return; i = VAddr >> 12; LOCK( &gilTempMappings ); // Temp and HW share a directory, so they share a lock + for( j = 0; j < Number; j++ ) { - MM_DerefPhys( gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] & ~0xFFF ); - gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] = 0; + MM_DerefPhys( gaPageTable[ i + j ] & ~0xFFF ); + gaPageTable[ i + j ] = 0; } RELEASE( &gilTempMappings ); -- 2.20.1