fix ppc64 linkage error on G5
PATCH 1/1 fix ppc64 linkage error on G5
When 2.6.12-rc1-mm1 is configured for a ppc64/G5, so CONFIG_PPC_PSERIES is disabled, linking of vmlinux fails with:
arch/ppc64/kernel/built-in.o(.text+0x7de0): In function `.sys_call_table32':
: undefined reference to .ppc_rtas' arch/ppc64/kernel/built-in.o(.text+0x8668): In function .sys_call_table':
: undefined reference to `.ppc_rtas'
make: *** [.tmp_vmlinux1] Error 1
This is because 2.6.12-rc1-mm1 contains the apparently broken patch:
arch/ppc64/kernel/misc.S 2005-03-21 01:07:42.000000000 -0800 _GLOBAL(kernel_thread) · line 685
Quoted 10 lines
arch/ppc64/kernel/misc.S 2005-03-21 01:07:42.000000000 -0800 renamed from arch/ppc64/kernel/misc.S 2005-03-17 21:43:54.000000000 -0800 +1
-1@@ -680,7 +680,7 @@ _GLOBAL(kernel_thread) ld r30,-16(r1) blr -#ifndef CONFIG_PPC_PSERIES /* hack hack hack */ +#ifdef CONFIG_PPC_RTAS /* hack hack hack */ #define ppc_rtas sys_ni_syscall #endif
PPC_PSERIES implies PPC_RTAS. It seems someone tried to clean up the condition but accidentally negated it: on PSERIES the system call will now go to sys_ni_syscall, and on !PSERIES linking will fail.
Fix: negate the condition.
arch/ppc64/kernel/misc.S renamed from arch/ppc64/kernel/misc.S.~1~ +1 -1
@@ -680,7 +680,7 @@ _GLOBAL(kernel_thread) ld r30,-16(r1) blr -#ifdef CONFIG_PPC_RTAS /* hack hack hack */ +#ifndef CONFIG_PPC_RTAS /* hack hack hack */ #define ppc_rtas sys_ni_syscall #endif
PATCH 1/1 ppc64: fix linkage error on G5
Quoted 9 lines
When 2.6.12-rc1-mm1 is configured for a ppc64/G5, so
CONFIG_PPC_PSERIESis disabled, linking of vmlinux fails with:arch/ppc64/kernel/built-in.o(.text+0x7de0): In function `.sys_call_table32':
: undefined reference to.ppc_rtas' arch/ppc64/kernel/built-in.o(.text+0x8668): In function.sys_call_table':
: undefined reference to `.ppc_rtas'
make: *** [.tmp_vmlinux1] Error 1
It turns out we are trying to fix this problem twice, we may as well remove the #define hack and use cond_syscall.
--
Move the ppc64 specific cond_syscall(ppc_rtas) into sys_ni.c so that it takes effect. With this fixed we can remove the #define hack.
arch/ppc64/kernel/misc.S renamed from arch/ppc64/kernel/misc.S~fix_ppc_rtas +0 -4
@@ -680,10 +680,6 @@ _GLOBAL(kernel_thread) ld r30,-16(r1) blr -#ifdef CONFIG_PPC_RTAS /* hack hack hack */ -#define ppc_rtas sys_ni_syscall -#endif - /* Why isn't this a) automatic, b) written in 'C'? */ .balign 8 _GLOBAL(sys_call_table32)
arch/ppc64/kernel/syscalls.c renamed from arch/ppc64/kernel/syscalls.c~fix_ppc_rtas +0 -3
@@ -256,6 +256,3 @@ void do_show_syscall_exit(unsigned long {printk (" -> %lx, current=%p cpu=%d\n" , r3, current,smp_processor_id ()); } - -/* Only exists on P-series. */ -cond_syscall (ppc_rtas);
kernel/sys_ni.c renamed from kernel/sys_ni.c~fix_ppc_rtas +1 -0
@@ -83,3 +83,4 @@ cond_syscall(sys_pciconfig_write);cond_syscall (sys_pciconfig_iobase);cond_syscall (sys32_ipc);cond_syscall (sys32_sysctl); +cond_syscall (ppc_rtas);