diff --git a/src/kernel/core/arch/sh4/arch_cpu.c b/src/kernel/core/arch/sh4/arch_cpu.c index 3f56e7b497..621eec9d79 100755 --- a/src/kernel/core/arch/sh4/arch_cpu.c +++ b/src/kernel/core/arch/sh4/arch_cpu.c @@ -86,8 +86,10 @@ sh4_invl_page(addr va) void arch_cpu_invalidate_TLB_range(addr start, addr end) { - for(; start < end; start += PAGE_SIZE) { + int num_pages = end/PAGE_SIZE - start/PAGE_SIZE; + while ( num_pages-- >= 0 ) { sh4_invl_page(start); + start += PAGE_SIZE; } } diff --git a/src/kernel/core/arch/x86/arch_cpu.c b/src/kernel/core/arch/x86/arch_cpu.c index 9ab47512da..53147ac502 100755 --- a/src/kernel/core/arch/x86/arch_cpu.c +++ b/src/kernel/core/arch/x86/arch_cpu.c @@ -123,8 +123,10 @@ i386_set_kstack(addr kstack) void arch_cpu_invalidate_TLB_range(addr start, addr end) { - for (; start < end; start += PAGE_SIZE) { + int num_pages = end/PAGE_SIZE - start/PAGE_SIZE; + while ( num_pages-- >= 0 ) { invalidate_TLB(start); + start += PAGE_SIZE; } } diff --git a/src/kernel/core/arch/x86/arch_vm_translation_map.c b/src/kernel/core/arch/x86/arch_vm_translation_map.c index c80e2fa7a7..5d6789892b 100755 --- a/src/kernel/core/arch/x86/arch_vm_translation_map.c +++ b/src/kernel/core/arch/x86/arch_vm_translation_map.c @@ -584,8 +584,10 @@ dprintf("vm_translation_map_create\n"); return ENOMEM; new_map->arch_data = (vm_translation_map_arch_info *)kmalloc(sizeof(vm_translation_map_arch_info)); - if(new_map == NULL) + if(new_map == NULL) { + recursive_lock_destroy(&new_map->lock); return ENOMEM; + } new_map->arch_data->num_invalidate_pages = 0; @@ -595,6 +597,7 @@ dprintf("vm_translation_map_create\n"); new_map->arch_data->pgdir_virt = kmalloc(PAGE_SIZE); if(new_map->arch_data->pgdir_virt == NULL) { kfree(new_map->arch_data); + recursive_lock_destroy(&new_map->lock); return ENOMEM; } if(((addr)new_map->arch_data->pgdir_virt % PAGE_SIZE) != 0) @@ -784,7 +787,7 @@ int vm_translation_map_quick_map(kernel_args *ka, addr va, addr pa, unsigned int pentry->rw = attributes & LOCK_RW; pentry->present = 1; - arch_cpu_invalidate_TLB_range(va, va+1); + arch_cpu_invalidate_TLB_range(va, va); return 0; } diff --git a/src/kernel/core/vm/vm_daemons.c b/src/kernel/core/vm/vm_daemons.c index 3388db5ab2..6a8d988045 100755 --- a/src/kernel/core/vm/vm_daemons.c +++ b/src/kernel/core/vm/vm_daemons.c @@ -58,7 +58,7 @@ static void scan_pages(vm_address_space *aspace, addr free_target) continue; } - page = vm_lookup_page(pa); + page = vm_lookup_page(pa / PAGE_SIZE); if(!page) { aspace->translation_map.ops->unlock(&aspace->translation_map); continue; diff --git a/src/kernel/core/vm/vm_page.c b/src/kernel/core/vm/vm_page.c index a059425cb9..eef4b15ff3 100755 --- a/src/kernel/core/vm/vm_page.c +++ b/src/kernel/core/vm/vm_page.c @@ -613,7 +613,7 @@ vm_page *vm_lookup_page(addr page_num) if(page_num < physical_page_offset) return NULL; page_num -= physical_page_offset; - if(page_num > num_pages) + if(page_num >= num_pages) return NULL; return &all_pages[page_num];