lkml.org 
[lkml]   [2011]   [Jan]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: 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:
*/
\
 
 \ /
  Last update: 2011-01-19 10:01    [W:0.098 / U:10.800 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site