[PATCH] powerpc: Add a is_kernel_addr() macro
Michael Ellerman [Sun, 4 Dec 2005 07:39:15 +0000 (18:39 +1100)]
There's a bunch of code that compares an address with KERNELBASE to see if
it's a "kernel address", ie. >= KERNELBASE. The proper test is actually to
compare with PAGE_OFFSET, since we're going to change KERNELBASE soon.

So replace all of them with an is_kernel_addr() macro that does that.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>

arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/mm/slb.c
arch/powerpc/mm/stab.c
arch/powerpc/mm/tlb_64.c
arch/powerpc/oprofile/op_model_power4.c
arch/powerpc/oprofile/op_model_rs64.c
arch/powerpc/xmon/xmon.c
include/asm-powerpc/page.h

index bcdc209..369e1a6 100644 (file)
@@ -1994,7 +1994,7 @@ static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
        if (r3 && r4 && r4 != 0xdeadbeef) {
                unsigned long val;
 
-               RELOC(prom_initrd_start) = (r3 >= KERNELBASE) ? __pa(r3) : r3;
+               RELOC(prom_initrd_start) = is_kernel_addr(r3) ? __pa(r3) : r3;
                RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
 
                val = RELOC(prom_initrd_start);
index a6d8aeb..d5c52fa 100644 (file)
@@ -319,7 +319,7 @@ void __init check_for_initrd(void)
        /* If we were passed an initrd, set the ROOT_DEV properly if the values
         * look sensible. If not, clear initrd reference.
         */
-       if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
+       if (is_kernel_addr(initrd_start) && is_kernel_addr(initrd_end) &&
            initrd_end > initrd_start)
                ROOT_DEV = Root_RAM0;
        else
index 60e852f..a47b273 100644 (file)
@@ -134,14 +134,14 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
        else
                unmapped_base = TASK_UNMAPPED_BASE_USER64;
 
-       if (pc >= KERNELBASE)
+       if (is_kernel_addr(pc))
                return;
        slb_allocate(pc);
 
        if (GET_ESID(pc) == GET_ESID(stack))
                return;
 
-       if (stack >= KERNELBASE)
+       if (is_kernel_addr(stack))
                return;
        slb_allocate(stack);
 
@@ -149,7 +149,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
            || (GET_ESID(stack) == GET_ESID(unmapped_base)))
                return;
 
-       if (unmapped_base >= KERNELBASE)
+       if (is_kernel_addr(unmapped_base))
                return;
        slb_allocate(unmapped_base);
 }
index 51e7951..a18dab0 100644 (file)
@@ -122,7 +122,7 @@ static int __ste_allocate(unsigned long ea, struct mm_struct *mm)
        unsigned long offset;
 
        /* Kernel or user address? */
-       if (ea >= KERNELBASE) {
+       if (is_kernel_addr(ea)) {
                vsid = get_kernel_vsid(ea);
        } else {
                if ((ea >= TASK_SIZE_USER64) || (! mm))
@@ -133,7 +133,7 @@ static int __ste_allocate(unsigned long ea, struct mm_struct *mm)
 
        stab_entry = make_ste(get_paca()->stab_addr, GET_ESID(ea), vsid);
 
-       if (ea < KERNELBASE) {
+       if (!is_kernel_addr(ea)) {
                offset = __get_cpu_var(stab_cache_ptr);
                if (offset < NR_STAB_CACHE_ENTRIES)
                        __get_cpu_var(stab_cache[offset++]) = stab_entry;
@@ -190,7 +190,7 @@ void switch_stab(struct task_struct *tsk, struct mm_struct *mm)
                     entry++, ste++) {
                        unsigned long ea;
                        ea = ste->esid_data & ESID_MASK;
-                       if (ea < KERNELBASE) {
+                       if (!is_kernel_addr(ea)) {
                                ste->esid_data = 0;
                        }
                }
index 859d29a..bb3afb6 100644 (file)
@@ -168,7 +168,7 @@ void hpte_update(struct mm_struct *mm, unsigned long addr,
                batch->mm = mm;
                batch->psize = psize;
        }
-       if (addr < KERNELBASE) {
+       if (!is_kernel_addr(addr)) {
                vsid = get_vsid(mm->context.id, addr);
                WARN_ON(vsid == 0);
        } else
index a3401b4..659a021 100644 (file)
@@ -252,7 +252,7 @@ static unsigned long get_pc(struct pt_regs *regs)
                return (unsigned long)__va(pc);
 
        /* Not sure where we were */
-       if (pc < KERNELBASE)
+       if (!is_kernel_addr(pc))
                /* function descriptor madness */
                return *((unsigned long *)kernel_unknown_bucket);
 
@@ -264,7 +264,7 @@ static int get_kernel(unsigned long pc)
        int is_kernel;
 
        if (!mmcra_has_sihv) {
-               is_kernel = (pc >= KERNELBASE);
+               is_kernel = is_kernel_addr(pc);
        } else {
                unsigned long mmcra = mfspr(SPRN_MMCRA);
                is_kernel = ((mmcra & MMCRA_SIPR) == 0);
index e010b85..5c909ee 100644 (file)
@@ -178,7 +178,6 @@ static void rs64_handle_interrupt(struct pt_regs *regs,
        int val;
        int i;
        unsigned long pc = mfspr(SPRN_SIAR);
-       int is_kernel = (pc >= KERNELBASE);
 
        /* set the PMM bit (see comment below) */
        mtmsrd(mfmsr() | MSR_PMM);
@@ -187,7 +186,7 @@ static void rs64_handle_interrupt(struct pt_regs *regs,
                val = ctr_read(i);
                if (val < 0) {
                        if (ctr[i].enabled) {
-                               oprofile_add_pc(pc, is_kernel, i);
+                               oprofile_add_pc(pc, is_kernel_addr(pc), i);
                                ctr_write(i, reset_value[i]);
                        } else {
                                ctr_write(i, 0);
index 465b75c..22612ed 100644 (file)
@@ -1013,7 +1013,7 @@ static long check_bp_loc(unsigned long addr)
        unsigned int instr;
 
        addr &= ~3;
-       if (addr < KERNELBASE) {
+       if (!is_kernel_addr(addr)) {
                printf("Breakpoints may only be placed at kernel addresses\n");
                return 0;
        }
@@ -1064,7 +1064,7 @@ bpt_cmds(void)
                dabr.address = 0;
                dabr.enabled = 0;
                if (scanhex(&dabr.address)) {
-                       if (dabr.address < KERNELBASE) {
+                       if (!is_kernel_addr(dabr.address)) {
                                printf(badaddr);
                                break;
                        }
index 18c1e5e..94905ba 100644 (file)
 /* to align the pointer to the (next) page boundary */
 #define PAGE_ALIGN(addr)       _ALIGN(addr, PAGE_SIZE)
 
+/*
+ * Don't compare things with KERNELBASE or PAGE_OFFSET to test for
+ * "kernelness", use is_kernel_addr() - it should do what you want.
+ */
+#define is_kernel_addr(x)      ((x) >= PAGE_OFFSET)
+
 #ifndef __ASSEMBLY__
 
 #undef STRICT_MM_TYPECHECKS