/kernel/trunk/arch/mips32/src/mm/as.c |
---|
File deleted |
/kernel/trunk/arch/mips32/src/mm/tlb.c |
---|
30,7 → 30,7 |
#include <arch/mm/asid.h> |
#include <mm/tlb.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <mm/vm.h> |
#include <arch/cp0.h> |
#include <panic.h> |
#include <arch.h> |
92,7 → 92,7 |
badvaddr = cp0_badvaddr_read(); |
spinlock_lock(&AS->lock); |
spinlock_lock(&VM->lock); |
pte = find_mapping_and_check(badvaddr); |
if (!pte) |
103,7 → 103,7 |
*/ |
pte->a = 1; |
prepare_entry_hi(&hi, AS->asid, badvaddr); |
prepare_entry_hi(&hi, VM->asid, badvaddr); |
prepare_entry_lo(&lo, pte->lo.g, pte->lo.v, pte->lo.d, pte->lo.c, pte->lo.pfn); |
/* |
121,11 → 121,11 |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
tlbwr(); |
spinlock_unlock(&AS->lock); |
spinlock_unlock(&VM->lock); |
return; |
fail: |
spinlock_unlock(&AS->lock); |
spinlock_unlock(&VM->lock); |
tlb_refill_fail(pstate); |
} |
154,7 → 154,7 |
tlbp(); |
index.value = cp0_index_read(); |
spinlock_lock(&AS->lock); |
spinlock_lock(&VM->lock); |
/* |
* Fail if the entry is not in TLB. |
190,11 → 190,11 |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
tlbwi(); |
spinlock_unlock(&AS->lock); |
spinlock_unlock(&VM->lock); |
return; |
fail: |
spinlock_unlock(&AS->lock); |
spinlock_unlock(&VM->lock); |
tlb_invalid_fail(pstate); |
} |
223,7 → 223,7 |
tlbp(); |
index.value = cp0_index_read(); |
spinlock_lock(&AS->lock); |
spinlock_lock(&VM->lock); |
/* |
* Fail if the entry is not in TLB. |
266,11 → 266,11 |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
tlbwi(); |
spinlock_unlock(&AS->lock); |
spinlock_unlock(&VM->lock); |
return; |
fail: |
spinlock_unlock(&AS->lock); |
spinlock_unlock(&VM->lock); |
tlb_modified_fail(pstate); |
} |
312,7 → 312,7 |
/** Try to find PTE for faulting address |
* |
* Try to find PTE for faulting address. |
* The AS->lock must be held on entry to this function. |
* The VM->lock must be held on entry to this function. |
* |
* @param badvaddr Faulting virtual address. |
* |
328,40 → 328,15 |
/* |
* Handler cannot succeed if the ASIDs don't match. |
*/ |
if (hi.asid != AS->asid) { |
printf("EntryHi.asid=%d, AS->asid=%d\n", hi.asid, AS->asid); |
if (hi.asid != VM->asid) { |
printf("EntryHi.asid=%d, VM->asid=%d\n", hi.asid, VM->asid); |
return NULL; |
} |
/* |
* Check if the mapping exists in page tables. |
*/ |
pte = page_mapping_find(badvaddr, AS->asid, 0); |
if (pte && pte->lo.v) { |
/* |
* Mapping found in page tables. |
* Immediately succeed. |
*/ |
return pte; |
} else { |
/* |
* Mapping not found in page tables. |
* Resort to higher-level page fault handler. |
*/ |
if (as_page_fault(badvaddr)) { |
/* |
* The higher-level page fault handler succeeded, |
* The mapping ought to be in place. |
*/ |
pte = page_mapping_find(badvaddr, AS->asid, 0); |
ASSERT(pte && pte->lo.v); |
return pte; |
} |
} |
/* |
* Handler cannot succeed if badvaddr has no mapping. |
*/ |
pte = page_mapping_find(badvaddr, VM->asid, 0); |
if (!pte) { |
printf("No such mapping.\n"); |
return NULL; |
/kernel/trunk/arch/mips32/src/mm/vm.c |
---|
0,0 → 1,54 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <arch/mm/vm.h> |
#include <arch/mm/tlb.h> |
#include <mm/vm.h> |
#include <arch/cp0.h> |
#include <arch.h> |
/** Install ASID of the current VM |
* |
* Install ASID of the current VM. |
* |
* @param vm VM structure. |
*/ |
void vm_install_arch(vm_t *vm) |
{ |
entry_hi_t hi; |
ipl_t ipl; |
hi.value = cp0_entry_hi_read(); |
ipl = interrupts_disable(); |
spinlock_lock(&vm->lock); |
hi.asid = vm->asid; |
cp0_entry_hi_write(hi.value); |
spinlock_unlock(&vm->lock); |
interrupts_restore(ipl); |
} |
/kernel/trunk/arch/mips32/src/mips32.c |
---|
31,7 → 31,7 |
#include <arch/cp0.h> |
#include <arch/exception.h> |
#include <arch/asm.h> |
#include <mm/as.h> |
#include <mm/vm.h> |
#include <userspace.h> |
#include <arch/console.h> |
/kernel/trunk/arch/mips32/Makefile.inc |
---|
112,7 → 112,7 |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/vm.c \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/drivers/arc.c \ |
arch/$(ARCH)/src/drivers/msim.c \ |
/kernel/trunk/arch/mips32/include/mm/as.h |
---|
File deleted |
/kernel/trunk/arch/mips32/include/mm/vm.h |
---|
0,0 → 1,46 |
/* |
* Copyright (C) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef __mips32_VM_H__ |
#define __mips32_VM_H__ |
#include <arch/types.h> |
#include <typedefs.h> |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0x80000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffff |
#define USER_ADDRESS_SPACE_START_ARCH (__address) 0x00000000 |
#define USER_ADDRESS_SPACE_END_ARCH (__address) 0x7fffffff |
#define UTEXT_ADDRESS_ARCH 0x00004000 |
#define USTACK_ADDRESS_ARCH (0x80000000-PAGE_SIZE) |
#define UDATA_ADDRESS_ARCH 0x01001000 |
extern void vm_install_arch(vm_t *vm); |
#endif |