diff options
Diffstat (limited to 'arch/sh/include')
-rw-r--r-- | arch/sh/include/asm/page.h | 19 | ||||
-rw-r--r-- | arch/sh/include/asm/ptrace.h | 11 |
2 files changed, 20 insertions, 10 deletions
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h index 3accdc5ab122..8237d9f53e56 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; | |||
50 | extern unsigned long max_low_pfn, min_low_pfn; | 50 | extern unsigned long max_low_pfn, min_low_pfn; |
51 | extern unsigned long memory_start, memory_end; | 51 | extern unsigned long memory_start, memory_end; |
52 | 52 | ||
53 | #ifdef CONFIG_UNCACHED_MAPPING | ||
54 | extern unsigned long uncached_start, uncached_end; | ||
55 | |||
56 | extern int virt_addr_uncached(unsigned long kaddr); | ||
57 | extern void uncached_init(void); | ||
58 | #else | ||
59 | #define virt_addr_uncached(kaddr) (0) | ||
60 | #define uncached_init() do { } while (0) | ||
61 | #endif | ||
62 | |||
53 | static inline unsigned long | 63 | static inline unsigned long |
54 | pages_do_alias(unsigned long addr1, unsigned long addr2) | 64 | pages_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) |
61 | extern void copy_page(void *to, void *from); | 70 | extern 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 e879dffa324b..e11b14ea2c43 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 | } |