Commit 51fae6de authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras

[PATCH] powerpc: Add a is_kernel_addr() macro

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: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent cd0ca2ce
...@@ -1994,7 +1994,7 @@ static void __init prom_check_initrd(unsigned long r3, unsigned long r4) ...@@ -1994,7 +1994,7 @@ static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
if (r3 && r4 && r4 != 0xdeadbeef) { if (r3 && r4 && r4 != 0xdeadbeef) {
unsigned long val; 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; RELOC(prom_initrd_end) = RELOC(prom_initrd_start) + r4;
val = RELOC(prom_initrd_start); val = RELOC(prom_initrd_start);
......
...@@ -319,7 +319,7 @@ void __init check_for_initrd(void) ...@@ -319,7 +319,7 @@ void __init check_for_initrd(void)
/* If we were passed an initrd, set the ROOT_DEV properly if the values /* If we were passed an initrd, set the ROOT_DEV properly if the values
* look sensible. If not, clear initrd reference. * 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) initrd_end > initrd_start)
ROOT_DEV = Root_RAM0; ROOT_DEV = Root_RAM0;
else else
......
...@@ -134,14 +134,14 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) ...@@ -134,14 +134,14 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
else else
unmapped_base = TASK_UNMAPPED_BASE_USER64; unmapped_base = TASK_UNMAPPED_BASE_USER64;
if (pc >= KERNELBASE) if (is_kernel_addr(pc))
return; return;
slb_allocate(pc); slb_allocate(pc);
if (GET_ESID(pc) == GET_ESID(stack)) if (GET_ESID(pc) == GET_ESID(stack))
return; return;
if (stack >= KERNELBASE) if (is_kernel_addr(stack))
return; return;
slb_allocate(stack); slb_allocate(stack);
...@@ -149,7 +149,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) ...@@ -149,7 +149,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
|| (GET_ESID(stack) == GET_ESID(unmapped_base))) || (GET_ESID(stack) == GET_ESID(unmapped_base)))
return; return;
if (unmapped_base >= KERNELBASE) if (is_kernel_addr(unmapped_base))
return; return;
slb_allocate(unmapped_base); slb_allocate(unmapped_base);
} }
......
...@@ -122,7 +122,7 @@ static int __ste_allocate(unsigned long ea, struct mm_struct *mm) ...@@ -122,7 +122,7 @@ static int __ste_allocate(unsigned long ea, struct mm_struct *mm)
unsigned long offset; unsigned long offset;
/* Kernel or user address? */ /* Kernel or user address? */
if (ea >= KERNELBASE) { if (is_kernel_addr(ea)) {
vsid = get_kernel_vsid(ea); vsid = get_kernel_vsid(ea);
} else { } else {
if ((ea >= TASK_SIZE_USER64) || (! mm)) if ((ea >= TASK_SIZE_USER64) || (! mm))
...@@ -133,7 +133,7 @@ static int __ste_allocate(unsigned long ea, struct mm_struct *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); 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); offset = __get_cpu_var(stab_cache_ptr);
if (offset < NR_STAB_CACHE_ENTRIES) if (offset < NR_STAB_CACHE_ENTRIES)
__get_cpu_var(stab_cache[offset++]) = stab_entry; __get_cpu_var(stab_cache[offset++]) = stab_entry;
...@@ -190,7 +190,7 @@ void switch_stab(struct task_struct *tsk, struct mm_struct *mm) ...@@ -190,7 +190,7 @@ void switch_stab(struct task_struct *tsk, struct mm_struct *mm)
entry++, ste++) { entry++, ste++) {
unsigned long ea; unsigned long ea;
ea = ste->esid_data & ESID_MASK; ea = ste->esid_data & ESID_MASK;
if (ea < KERNELBASE) { if (!is_kernel_addr(ea)) {
ste->esid_data = 0; ste->esid_data = 0;
} }
} }
......
...@@ -168,7 +168,7 @@ void hpte_update(struct mm_struct *mm, unsigned long addr, ...@@ -168,7 +168,7 @@ void hpte_update(struct mm_struct *mm, unsigned long addr,
batch->mm = mm; batch->mm = mm;
batch->psize = psize; batch->psize = psize;
} }
if (addr < KERNELBASE) { if (!is_kernel_addr(addr)) {
vsid = get_vsid(mm->context.id, addr); vsid = get_vsid(mm->context.id, addr);
WARN_ON(vsid == 0); WARN_ON(vsid == 0);
} else } else
......
...@@ -252,7 +252,7 @@ static unsigned long get_pc(struct pt_regs *regs) ...@@ -252,7 +252,7 @@ static unsigned long get_pc(struct pt_regs *regs)
return (unsigned long)__va(pc); return (unsigned long)__va(pc);
/* Not sure where we were */ /* Not sure where we were */
if (pc < KERNELBASE) if (!is_kernel_addr(pc))
/* function descriptor madness */ /* function descriptor madness */
return *((unsigned long *)kernel_unknown_bucket); return *((unsigned long *)kernel_unknown_bucket);
...@@ -264,7 +264,7 @@ static int get_kernel(unsigned long pc) ...@@ -264,7 +264,7 @@ static int get_kernel(unsigned long pc)
int is_kernel; int is_kernel;
if (!mmcra_has_sihv) { if (!mmcra_has_sihv) {
is_kernel = (pc >= KERNELBASE); is_kernel = is_kernel_addr(pc);
} else { } else {
unsigned long mmcra = mfspr(SPRN_MMCRA); unsigned long mmcra = mfspr(SPRN_MMCRA);
is_kernel = ((mmcra & MMCRA_SIPR) == 0); is_kernel = ((mmcra & MMCRA_SIPR) == 0);
......
...@@ -178,7 +178,6 @@ static void rs64_handle_interrupt(struct pt_regs *regs, ...@@ -178,7 +178,6 @@ static void rs64_handle_interrupt(struct pt_regs *regs,
int val; int val;
int i; int i;
unsigned long pc = mfspr(SPRN_SIAR); unsigned long pc = mfspr(SPRN_SIAR);
int is_kernel = (pc >= KERNELBASE);
/* set the PMM bit (see comment below) */ /* set the PMM bit (see comment below) */
mtmsrd(mfmsr() | MSR_PMM); mtmsrd(mfmsr() | MSR_PMM);
...@@ -187,7 +186,7 @@ static void rs64_handle_interrupt(struct pt_regs *regs, ...@@ -187,7 +186,7 @@ static void rs64_handle_interrupt(struct pt_regs *regs,
val = ctr_read(i); val = ctr_read(i);
if (val < 0) { if (val < 0) {
if (ctr[i].enabled) { 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]); ctr_write(i, reset_value[i]);
} else { } else {
ctr_write(i, 0); ctr_write(i, 0);
......
...@@ -1013,7 +1013,7 @@ static long check_bp_loc(unsigned long addr) ...@@ -1013,7 +1013,7 @@ static long check_bp_loc(unsigned long addr)
unsigned int instr; unsigned int instr;
addr &= ~3; addr &= ~3;
if (addr < KERNELBASE) { if (!is_kernel_addr(addr)) {
printf("Breakpoints may only be placed at kernel addresses\n"); printf("Breakpoints may only be placed at kernel addresses\n");
return 0; return 0;
} }
...@@ -1064,7 +1064,7 @@ bpt_cmds(void) ...@@ -1064,7 +1064,7 @@ bpt_cmds(void)
dabr.address = 0; dabr.address = 0;
dabr.enabled = 0; dabr.enabled = 0;
if (scanhex(&dabr.address)) { if (scanhex(&dabr.address)) {
if (dabr.address < KERNELBASE) { if (!is_kernel_addr(dabr.address)) {
printf(badaddr); printf(badaddr);
break; break;
} }
......
...@@ -86,6 +86,12 @@ ...@@ -86,6 +86,12 @@
/* to align the pointer to the (next) page boundary */ /* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) _ALIGN(addr, PAGE_SIZE) #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__ #ifndef __ASSEMBLY__
#undef STRICT_MM_TYPECHECKS #undef STRICT_MM_TYPECHECKS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment