From 06801dab100134d0b9465324d0740d66c2f11728 Mon Sep 17 00:00:00 2001 From: Paul Mundt Date: Sat, 15 Aug 2009 01:57:36 +0900 Subject: [PATCH] --- yaml --- r: 163359 b: refs/heads/master c: 43bc61d86f8ea6edef2e02d1dc47617883fa9a9c h: refs/heads/master i: 163357: 6f0be5611c7c53bc00c753cd6da3eeef0969eb4a 163355: b1512b8f31f40af77a6b695d17eb433f92bba6da 163351: b87e29d00bae2caa9c664d1117a1b61887034780 163343: c73622d640385ad9fa1d4b41958f70a2c7b65e09 163327: 40cb03442d8cd24476b518974646aee9399ba7c8 v: v3 --- [refs] | 2 +- trunk/arch/sh/include/asm/system_32.h | 5 +++++ trunk/arch/sh/include/asm/system_64.h | 5 +++++ trunk/arch/sh/include/asm/types.h | 2 ++ trunk/arch/sh/mm/flush-sh4.c | 21 ++++++++++++--------- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 4627d6d9b934..adda8b073f7e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0837f52463583f76670ab2350e0f1541cb0351f5 +refs/heads/master: 43bc61d86f8ea6edef2e02d1dc47617883fa9a9c diff --git a/trunk/arch/sh/include/asm/system_32.h b/trunk/arch/sh/include/asm/system_32.h index 6c68a51f1cc5..d7299d69ff79 100644 --- a/trunk/arch/sh/include/asm/system_32.h +++ b/trunk/arch/sh/include/asm/system_32.h @@ -198,6 +198,11 @@ do { \ }) #endif +static inline reg_size_t register_align(void *val) +{ + return (unsigned long)(signed long)val; +} + int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, struct mem_access *ma); diff --git a/trunk/arch/sh/include/asm/system_64.h b/trunk/arch/sh/include/asm/system_64.h index 943acf5ea07c..218b54d9d660 100644 --- a/trunk/arch/sh/include/asm/system_64.h +++ b/trunk/arch/sh/include/asm/system_64.h @@ -37,4 +37,9 @@ do { \ #define jump_to_uncached() do { } while (0) #define back_to_cached() do { } while (0) +static inline reg_size_t register_align(void *val) +{ + return (unsigned long long)(signed long long)(signed long)val; +} + #endif /* __ASM_SH_SYSTEM_64_H */ diff --git a/trunk/arch/sh/include/asm/types.h b/trunk/arch/sh/include/asm/types.h index c7f3c94837dd..f8421f7ad63a 100644 --- a/trunk/arch/sh/include/asm/types.h +++ b/trunk/arch/sh/include/asm/types.h @@ -11,8 +11,10 @@ #ifdef CONFIG_SUPERH32 typedef u16 insn_size_t; +typedef u32 reg_size_t; #else typedef u32 insn_size_t; +typedef u64 reg_size_t; #endif #endif /* __ASSEMBLY__ */ diff --git a/trunk/arch/sh/mm/flush-sh4.c b/trunk/arch/sh/mm/flush-sh4.c index edefc53891a8..1b6b6a12a99b 100644 --- a/trunk/arch/sh/mm/flush-sh4.c +++ b/trunk/arch/sh/mm/flush-sh4.c @@ -10,10 +10,11 @@ */ void __weak __flush_wback_region(void *start, int size) { - unsigned long v, cnt, end; + reg_size_t aligned_start, v, cnt, end; - v = (unsigned long)start & ~(L1_CACHE_BYTES-1); - end = ((unsigned long)start + size + L1_CACHE_BYTES-1) + aligned_start = register_align(start); + v = aligned_start & ~(L1_CACHE_BYTES-1); + end = (aligned_start + size + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1); cnt = (end - v) / L1_CACHE_BYTES; @@ -52,10 +53,11 @@ void __weak __flush_wback_region(void *start, int size) */ void __weak __flush_purge_region(void *start, int size) { - unsigned long v, cnt, end; + reg_size_t aligned_start, v, cnt, end; - v = (unsigned long)start & ~(L1_CACHE_BYTES-1); - end = ((unsigned long)start + size + L1_CACHE_BYTES-1) + aligned_start = register_align(start); + v = aligned_start & ~(L1_CACHE_BYTES-1); + end = (aligned_start + size + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1); cnt = (end - v) / L1_CACHE_BYTES; @@ -90,10 +92,11 @@ void __weak __flush_purge_region(void *start, int size) */ void __weak __flush_invalidate_region(void *start, int size) { - unsigned long v, cnt, end; + reg_size_t aligned_start, v, cnt, end; - v = (unsigned long)start & ~(L1_CACHE_BYTES-1); - end = ((unsigned long)start + size + L1_CACHE_BYTES-1) + aligned_start = register_align(start); + v = aligned_start & ~(L1_CACHE_BYTES-1); + end = (aligned_start + size + L1_CACHE_BYTES-1) & ~(L1_CACHE_BYTES-1); cnt = (end - v) / L1_CACHE_BYTES;