瀏覽代碼

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: Ley Foon Tan <lftan@altera.com>
Ley Foon Tan 10 年之前
父節點
當前提交
4a89c3088f
共有 2 個文件被更改,包括 1 次插入4 次删除
  1. 1 1
      arch/nios2/kernel/entry.S
  2. 0 3
      arch/nios2/mm/cacheflush.c

+ 1 - 1
arch/nios2/kernel/entry.S

@@ -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

+ 0 - 3
arch/nios2/mm/cacheflush.c

@@ -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 */