Messages in this thread Patch in this message | | | Date | Wed, 19 Jan 2011 00:56:57 -0800 | From | "H. Peter Anvin" <> | Subject | Re: Linux 2.6.38-rc1 doesn't boot |
| |
On 01/19/2011 12:12 AM, Shaohua Li wrote: > On Wed, 2011-01-19 at 15:49 +0800, Markus Trippelsdorf wrote: >> On 2011.01.19 at 08:39 +0100, Markus Trippelsdorf wrote: >>> On 2011.01.18 at 15:54 -0800, Linus Torvalds wrote: >>>> >>>> And as usual, report any regressions to the lists and the appropriate >>>> authorities. >>> >>> Unfortunately 2.6.38-rc1 doesn't even boot on my machine (amd64). >>> This is caused by 86b1e8dd83cbb0f: >>> x86: Make relocatable kernel work with new binutils >>> >>> Reverting the commit solves the problem. >> >> I'm running the latest binutils: >> GNU ld (Linux/GNU Binutils) 2.21.51.0.5.20110104 > Hmm, reproduce it here with binutils-2.21.51.0.6-20110118 > but not with GNU ld (GNU Binutils for Ubuntu) 2.20.51-system.20100908 > I got this in system.map: ffffffff03514880 D jiffies_64, which looks > wrong. > looks binutils changed something again. > Have no idea, CC Lu Hongjiu. >
Either way... the whole jiffies vs jiffies_64 thing is kind of ridiculous. We should be able to do it in a completely architecture-generic way by either making it a union(!) (with "jiffies" and "jiffies_64" presumably would be #defines, or we do a global replace across the tree), moving the variable declaration itself to a .S file (which would only have data components and therefore would be arch-generic) or doing something like the attached (untested since it is 1 am here) patch.
This should let us get rid of the hacks in *all* the architectures, not just x86.
-hpa diff --git a/kernel/timer.c b/kernel/timer.c index 43ca993..cb4db47 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -41,6 +41,7 @@ #include <linux/sched.h> #include <linux/slab.h> +#include <asm/byteorder.h> #include <asm/uaccess.h> #include <asm/unistd.h> #include <asm/div64.h> @@ -54,6 +55,12 @@ u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES; EXPORT_SYMBOL(jiffies_64); +#if defined(__LITTLE_ENDIAN) || (BITS_PER_LONG >= 64) +asm("jiffies = jiffies_64"); +#else +asm("jiffies = jiffies_64 + 4"); +#endif + /* * per-CPU timer vector definitions: */ | |