@@ -49,8 +49,20 @@ void __flush_tlb_kernel_range(unsigned l
#ifndef CONFIG_SMP
#define flush_tlb_kernel_range(start,end) \
-do { flush_tsb_kernel_range(start,end); \
- __flush_tlb_kernel_range(start,end); \
+do { \
+ if ((start < HI_OBP_ADDRESS) && (end > LOW_OBP_ADDRESS)) { \
+ if (start < LOW_OBP_ADDRESS) { \
+ flush_tsb_kernel_range(start, LOW_OBP_ADDRESS); \
+ __flush_tlb_kernel_range(start, LOW_OBP_ADDRESS); \
+ } \
+ if (end > HI_OBP_ADDRESS) { \
+ flush_tsb_kernel_range(HI_OBP_ADDRESS, end); \
+ __flush_tlb_kernel_range(HI_OBP_ADDRESS, end); \
+ } \
+ } else { \
+ flush_tsb_kernel_range(start, end); \
+ __flush_tlb_kernel_range(start, end); \
+ } \
} while (0)
static inline void global_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr)
@@ -64,8 +76,20 @@ void smp_flush_tlb_kernel_range(unsigned
void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr);
#define flush_tlb_kernel_range(start, end) \
-do { flush_tsb_kernel_range(start,end); \
- smp_flush_tlb_kernel_range(start, end); \
+do { \
+ if ((start < HI_OBP_ADDRESS) && (end > LOW_OBP_ADDRESS)) { \
+ if (start < LOW_OBP_ADDRESS) { \
+ flush_tsb_kernel_range(start, LOW_OBP_ADDRESS); \
+ smp_flush_tlb_kernel_range(start, LOW_OBP_ADDRESS); \
+ } \
+ if (end > HI_OBP_ADDRESS) { \
+ flush_tsb_kernel_range(HI_OBP_ADDRESS, end); \
+ smp_flush_tlb_kernel_range(HI_OBP_ADDRESS, end); \
+ } \
+ } else { \
+ flush_tsb_kernel_range(start, end); \
+ smp_flush_tlb_kernel_range(start, end); \
+ } \
} while (0)
#define global_flush_tlb_page(mm, vaddr) \