aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/include/asm
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2010-02-17 02:28:00 -0500
committerPaul Mundt <lethal@linux-sh.org>2010-02-17 02:28:00 -0500
commit9edef28653a519bf0a48250f36cce96b1736ec4e (patch)
tree68049b29e69228fe0cdf26b27a3743928c5e7fdb /arch/sh/include/asm
parent51becfd96287b3913b13075699433730984e2f4f (diff)
sh: uncached mapping helpers.
This adds some helper routines for uncached mapping support. This simplifies some of the cases where we need to check the uncached mapping boundaries in addition to giving us a centralized location for building more complex manipulation on top of. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/include/asm')
-rw-r--r--arch/sh/include/asm/page.h19
-rw-r--r--arch/sh/include/asm/ptrace.h11
2 files changed, 20 insertions, 10 deletions
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
index 3accdc5ab12..8237d9f53e5 100644
--- a/arch/sh/include/asm/page.h
+++ b/arch/sh/include/asm/page.h
@@ -50,13 +50,22 @@ extern unsigned long shm_align_mask;
50extern unsigned long max_low_pfn, min_low_pfn; 50extern unsigned long max_low_pfn, min_low_pfn;
51extern unsigned long memory_start, memory_end; 51extern unsigned long memory_start, memory_end;
52 52
53#ifdef CONFIG_UNCACHED_MAPPING
54extern unsigned long uncached_start, uncached_end;
55
56extern int virt_addr_uncached(unsigned long kaddr);
57extern void uncached_init(void);
58#else
59#define virt_addr_uncached(kaddr) (0)
60#define uncached_init() do { } while (0)
61#endif
62
53static inline unsigned long 63static inline unsigned long
54pages_do_alias(unsigned long addr1, unsigned long addr2) 64pages_do_alias(unsigned long addr1, unsigned long addr2)
55{ 65{
56 return (addr1 ^ addr2) & shm_align_mask; 66 return (addr1 ^ addr2) & shm_align_mask;
57} 67}
58 68
59
60#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 69#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
61extern void copy_page(void *to, void *from); 70extern void copy_page(void *to, void *from);
62 71
@@ -135,6 +144,14 @@ typedef struct page *pgtable_t;
135#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 144#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
136#endif 145#endif
137 146
147#ifdef CONFIG_UNCACHED_MAPPING
148#define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start)
149#define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET)
150#else
151#define UNCAC_ADDR(addr) ((addr))
152#define CAC_ADDR(addr) ((addr))
153#endif
154
138#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) 155#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
139#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) 156#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
140 157
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h
index e879dffa324..e11b14ea2c4 100644
--- a/arch/sh/include/asm/ptrace.h
+++ b/arch/sh/include/asm/ptrace.h
@@ -139,15 +139,8 @@ static inline unsigned long profile_pc(struct pt_regs *regs)
139{ 139{
140 unsigned long pc = instruction_pointer(regs); 140 unsigned long pc = instruction_pointer(regs);
141 141
142#ifdef CONFIG_UNCACHED_MAPPING 142 if (virt_addr_uncached(pc))
143 /* 143 return CAC_ADDR(pc);
144 * If PC points in to the uncached mapping, fix it up and hand
145 * back the cached equivalent.
146 */
147 if ((pc >= (memory_start + cached_to_uncached)) &&
148 (pc < (memory_start + cached_to_uncached + uncached_size)))
149 pc -= cached_to_uncached;
150#endif
151 144
152 return pc; 145 return pc;
153} 146}