mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 14:48:06 +00:00
[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: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
cd0ca2ce4b
commit
51fae6de24
9 changed files with 20 additions and 15 deletions
|
@ -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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
|| (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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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 @@
|
||||||
/* 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
|
||||||
|
|
Loading…
Add table
Reference in a new issue