Skip to content

Commit

Permalink
sh: Add register alignment helpers for shared flushers.
Browse files Browse the repository at this point in the history
This plugs in some register alignment helpers for the shared flushers,
allowing them to also be used on SH-5. The main rationale here is that
in the SH-5 case we have a variable ABI, where the pointer size may not
equal the register width. This register extension is taken care of by
the SH-5 code already today, and is otherwise unused on the SH-4 code.
This combines the two and allows us to kill off the SH-5 implementation.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
  • Loading branch information
Paul Mundt committed Aug 14, 2009
1 parent 0837f52 commit 43bc61d
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 9 deletions.
5 changes: 5 additions & 0 deletions arch/sh/include/asm/system_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
5 changes: 5 additions & 0 deletions arch/sh/include/asm/system_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
2 changes: 2 additions & 0 deletions arch/sh/include/asm/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__ */
Expand Down
21 changes: 12 additions & 9 deletions arch/sh/mm/flush-sh4.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 43bc61d

Please sign in to comment.