Commit 4a89c308 authored by Ley Foon Tan's avatar Ley Foon Tan

nios2: fix cache coherency issue when debug with gdb

Remove the end address checking for flushda function. We need to flush
each address line for flushda instruction, from start to end address.
This is because flushda instruction only flush the cache if tag and line
fields are matched.

Change to use ldwio instruction (bypass cache) to load the instruction
that causing trap. Our interest is the actual instruction that executed
by the processor, this should be uncached.
Note, EA address might be an userspace cached address.
Signed-off-by: default avatarLey Foon Tan <lftan@altera.com>
parent e3e29f99
...@@ -161,7 +161,7 @@ ENTRY(inthandler) ...@@ -161,7 +161,7 @@ ENTRY(inthandler)
*********************************************************************** ***********************************************************************
*/ */
ENTRY(handle_trap) ENTRY(handle_trap)
ldw r24, -4(ea) /* instruction that caused the exception */ ldwio r24, -4(ea) /* instruction that caused the exception */
srli r24, r24, 4 srli r24, r24, 4
andi r24, r24, 0x7c andi r24, r24, 0x7c
movia r9,trap_table movia r9,trap_table
......
...@@ -23,9 +23,6 @@ static void __flush_dcache(unsigned long start, unsigned long end) ...@@ -23,9 +23,6 @@ static void __flush_dcache(unsigned long start, unsigned long end)
end += (cpuinfo.dcache_line_size - 1); end += (cpuinfo.dcache_line_size - 1);
end &= ~(cpuinfo.dcache_line_size - 1); end &= ~(cpuinfo.dcache_line_size - 1);
if (end > start + cpuinfo.dcache_size)
end = start + cpuinfo.dcache_size;
for (addr = start; addr < end; addr += cpuinfo.dcache_line_size) { for (addr = start; addr < end; addr += cpuinfo.dcache_line_size) {
__asm__ __volatile__ (" flushda 0(%0)\n" __asm__ __volatile__ (" flushda 0(%0)\n"
: /* Outputs */ : /* Outputs */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment