diff options
author | Chris Zankel <chris@zankel.net> | 2007-08-22 13:14:51 -0400 |
---|---|---|
committer | Chris Zankel <chris@zankel.net> | 2007-08-27 16:54:16 -0400 |
commit | 6656920b0b50beacb6cb64cf55273cbb686e436e (patch) | |
tree | dab9fdb81821b455a29779de6ca3306dbdf05dbd /arch/xtensa/mm/fault.c | |
parent | ff6fd469885aafa5ec387babcb6537f3c00d6df0 (diff) |
[XTENSA] Add support for cache-aliasing
Add support for processors that have cache-aliasing issues, such as
the Stretch S5000 processor. Cache-aliasing means that the size of
the cache (for one way) is larger than the page size, thus, a page
can end up in several places in cache depending on the virtual to
physical translation. The method used here is to map a user page
temporarily through the auto-refill way 0 and of of the DTLB.
We probably will want to revisit this issue and use a better
approach with kmap/kunmap.
Signed-off-by: Chris Zankel <chris@zankel.net>
Diffstat (limited to 'arch/xtensa/mm/fault.c')
-rw-r--r-- | arch/xtensa/mm/fault.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c index 16004067add3..45d28f217c03 100644 --- a/arch/xtensa/mm/fault.c +++ b/arch/xtensa/mm/fault.c | |||
@@ -24,6 +24,8 @@ | |||
24 | unsigned long asid_cache = ASID_USER_FIRST; | 24 | unsigned long asid_cache = ASID_USER_FIRST; |
25 | void bad_page_fault(struct pt_regs*, unsigned long, int); | 25 | void bad_page_fault(struct pt_regs*, unsigned long, int); |
26 | 26 | ||
27 | #undef DEBUG_PAGE_FAULT | ||
28 | |||
27 | /* | 29 | /* |
28 | * This routine handles page faults. It determines the address, | 30 | * This routine handles page faults. It determines the address, |
29 | * and the problem, and then passes it off to one of the appropriate | 31 | * and the problem, and then passes it off to one of the appropriate |
@@ -64,7 +66,7 @@ void do_page_fault(struct pt_regs *regs) | |||
64 | exccause == EXCCAUSE_ITLB_MISS || | 66 | exccause == EXCCAUSE_ITLB_MISS || |
65 | exccause == EXCCAUSE_FETCH_CACHE_ATTRIBUTE) ? 1 : 0; | 67 | exccause == EXCCAUSE_FETCH_CACHE_ATTRIBUTE) ? 1 : 0; |
66 | 68 | ||
67 | #if 0 | 69 | #ifdef DEBUG_PAGE_FAULT |
68 | printk("[%s:%d:%08x:%d:%08x:%s%s]\n", current->comm, current->pid, | 70 | printk("[%s:%d:%08x:%d:%08x:%s%s]\n", current->comm, current->pid, |
69 | address, exccause, regs->pc, is_write? "w":"", is_exec? "x":""); | 71 | address, exccause, regs->pc, is_write? "w":"", is_exec? "x":""); |
70 | #endif | 72 | #endif |
@@ -219,7 +221,7 @@ bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) | |||
219 | 221 | ||
220 | /* Are we prepared to handle this kernel fault? */ | 222 | /* Are we prepared to handle this kernel fault? */ |
221 | if ((entry = search_exception_tables(regs->pc)) != NULL) { | 223 | if ((entry = search_exception_tables(regs->pc)) != NULL) { |
222 | #if 1 | 224 | #ifdef DEBUG_PAGE_FAULT |
223 | printk(KERN_DEBUG "%s: Exception at pc=%#010lx (%lx)\n", | 225 | printk(KERN_DEBUG "%s: Exception at pc=%#010lx (%lx)\n", |
224 | current->comm, regs->pc, entry->fixup); | 226 | current->comm, regs->pc, entry->fixup); |
225 | #endif | 227 | #endif |