From 3d769966455541f6a4296056f6156d2ad7eb2ef0 Mon Sep 17 00:00:00 2001 From: Jakub Jermar Date: Sat, 2 Dec 2006 20:16:35 +0000 Subject: [PATCH] Add dcache_flush() function that flushes D-Cache on sparc64. --- kernel/arch/sparc64/Makefile.inc | 1 + kernel/arch/sparc64/include/arch.h | 1 + kernel/arch/sparc64/include/{arch.h => mm/cache.h} | 19 ++++-------- .../sparc64/{include/arch.h => src/mm/cache.S} | 34 +++++++++------------- kernel/arch/sparc64/src/start.S | 6 ++++ 5 files changed, 28 insertions(+), 33 deletions(-) copy kernel/arch/sparc64/include/{arch.h => mm/cache.h} (73%) copy kernel/arch/sparc64/{include/arch.h => src/mm/cache.S} (71%) diff --git a/kernel/arch/sparc64/Makefile.inc b/kernel/arch/sparc64/Makefile.inc index f07d1d684..94be699e9 100644 --- a/kernel/arch/sparc64/Makefile.inc +++ b/kernel/arch/sparc64/Makefile.inc @@ -83,6 +83,7 @@ ARCH_SOURCES = \ arch/$(ARCH)/src/fpu_context.c \ arch/$(ARCH)/src/dummy.s \ arch/$(ARCH)/src/mm/as.c \ + arch/$(ARCH)/src/mm/cache.c \ arch/$(ARCH)/src/mm/frame.c \ arch/$(ARCH)/src/mm/page.c \ arch/$(ARCH)/src/mm/tlb.c \ diff --git a/kernel/arch/sparc64/include/arch.h b/kernel/arch/sparc64/include/arch.h index b60c9d028..01d15edfd 100644 --- a/kernel/arch/sparc64/include/arch.h +++ b/kernel/arch/sparc64/include/arch.h @@ -40,6 +40,7 @@ #define ASI_AIUP 0x10 /** Access to primary context with user privileges. */ #define ASI_AIUS 0x11 /** Access to secondary context with user privileges. */ #define ASI_NUCLEUS_QUAD_LDD 0x24 /** ASI for 16-byte atomic loads. */ +#define ASI_DCACHE_TAG 0x47 /** ASI D-Cache Tag. */ #define ASI_UPA_CONFIG 0x4a /** ASI of the UPA_CONFIG register. */ #define NWINDOWS 8 /** Number of register window sets. */ diff --git a/kernel/arch/sparc64/include/arch.h b/kernel/arch/sparc64/include/mm/cache.h similarity index 73% copy from kernel/arch/sparc64/include/arch.h copy to kernel/arch/sparc64/include/mm/cache.h index b60c9d028..a50650d5b 100644 --- a/kernel/arch/sparc64/include/arch.h +++ b/kernel/arch/sparc64/include/mm/cache.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005 Jakub Jermar + * Copyright (C) 2006 Jakub Jermar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,23 +26,16 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** @addtogroup sparc64 +/** @addtogroup sparc64mm * @{ */ -/** - * @file - * @brief Various sparc64-specific macros. +/** @file */ -#ifndef KERN_sparc64_ARCH_H_ -#define KERN_sparc64_ARCH_H_ +#ifndef KERN_sparc64_CACHE_H_ +#define KERN_sparc64_CACHE_H_ -#define ASI_AIUP 0x10 /** Access to primary context with user privileges. */ -#define ASI_AIUS 0x11 /** Access to secondary context with user privileges. */ -#define ASI_NUCLEUS_QUAD_LDD 0x24 /** ASI for 16-byte atomic loads. */ -#define ASI_UPA_CONFIG 0x4a /** ASI of the UPA_CONFIG register. */ - -#define NWINDOWS 8 /** Number of register window sets. */ +extern void dcache_flush(void); #endif diff --git a/kernel/arch/sparc64/include/arch.h b/kernel/arch/sparc64/src/mm/cache.S similarity index 71% copy from kernel/arch/sparc64/include/arch.h copy to kernel/arch/sparc64/src/mm/cache.S index b60c9d028..ba645ca00 100644 --- a/kernel/arch/sparc64/include/arch.h +++ b/kernel/arch/sparc64/src/mm/cache.S @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005 Jakub Jermar + * Copyright (C) 2006 Jakub Jermar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,25 +26,19 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/** @addtogroup sparc64 - * @{ - */ -/** - * @file - * @brief Various sparc64-specific macros. - */ - -#ifndef KERN_sparc64_ARCH_H_ -#define KERN_sparc64_ARCH_H_ +#include -#define ASI_AIUP 0x10 /** Access to primary context with user privileges. */ -#define ASI_AIUS 0x11 /** Access to secondary context with user privileges. */ -#define ASI_NUCLEUS_QUAD_LDD 0x24 /** ASI for 16-byte atomic loads. */ -#define ASI_UPA_CONFIG 0x4a /** ASI of the UPA_CONFIG register. */ +#define DCACHE_SIZE (16*1024) +#define DCACHE_LINE_SIZE 64 -#define NWINDOWS 8 /** Number of register window sets. */ +.global dcache_flush +dcache_flush: + set (DCACHE_SIZE - DCACHE_LINE_SIZE), %g1 + stxa %g0, [%g1] ASI_DCACHE_TAG +0: membar #Sync + subcc %g1, DCACHE_LINE_SIZE, %g1 + bnz,pt %xcc, 0b + stxa %g0, [%g1] ASI_DCACHE_TAG + retl + membar #Sync -#endif - -/** @} - */ diff --git a/kernel/arch/sparc64/src/start.S b/kernel/arch/sparc64/src/start.S index e05a930b3..188d27866 100644 --- a/kernel/arch/sparc64/src/start.S +++ b/kernel/arch/sparc64/src/start.S @@ -251,6 +251,12 @@ kernel_image_start: stx %l3, [%l4 + %lo(kernel_8k_tlb_data_template)] /* + * Flush D-Cache. + */ + call dcache_flush + nop + + /* * So far, we have not touched the stack. * It is a good idea to set the kernel stack to a known state now. */ -- 2.11.4.GIT