linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* Initrd and 2.6.33 curious behaviour
@ 2010-05-21 20:27 Robert Jarzmik
  2010-05-21 20:43 ` Russell King - ARM Linux
  0 siblings, 1 reply; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-21 20:27 UTC (permalink / raw)
  To: linux-arm-kernel

I pulled the 2.6.33 kernel and tried my mainboard with it (mioa701). My kernel
boots fine, but initrd load always fails.

After digging a bit in arch/arm/mm/init.c, I find that :
 - phys_initrd_start = 0xa0508000
 - phys_initrd_size = 3 759 480
 - initrd_start = 0 and initrd_end = 0

I'm a bit puzzled why initrd_start is null. I would expect it to be the virtual
address where the initrd is to be found.

Am I the only one with initrd problems on 2.6.34 kernels ?

For the record, the bootloader is the same I had before (haret), and the ATAGS
list passed to the kernel is correct. The initrd is the same I've been using
since 2.6.29 kernel. I have not tested since 2.6.32 I think.

Cheers.

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-21 20:27 Initrd and 2.6.33 curious behaviour Robert Jarzmik
@ 2010-05-21 20:43 ` Russell King - ARM Linux
  2010-05-22  9:36   ` Robert Jarzmik
  2010-05-22  9:37   ` Robert Jarzmik
  0 siblings, 2 replies; 10+ messages in thread
From: Russell King - ARM Linux @ 2010-05-21 20:43 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, May 21, 2010 at 10:27:05PM +0200, Robert Jarzmik wrote:
> I pulled the 2.6.33 kernel and tried my mainboard with it (mioa701). My
> kernel boots fine, but initrd load always fails.

Please post all the kernel messages.

> After digging a bit in arch/arm/mm/init.c, I find that :
>  - phys_initrd_start = 0xa0508000
>  - phys_initrd_size = 3 759 480
>  - initrd_start = 0 and initrd_end = 0

It's unclear where you're checking this.  The virtual pointers are only
setup if we're satisfied that the phys_* are within RAM, and we can
exclusively reserve the region.

If we can't reserve the region, that means something's overwritten it
during kernel boot and it's become unusable.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-21 20:43 ` Russell King - ARM Linux
@ 2010-05-22  9:36   ` Robert Jarzmik
  2010-05-22  9:37   ` Robert Jarzmik
  1 sibling, 0 replies; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-22  9:36 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

> On Fri, May 21, 2010 at 10:27:05PM +0200, Robert Jarzmik wrote:
>> I pulled the 2.6.33 kernel and tried my mainboard with it (mioa701). My
>> kernel boots fine, but initrd load always fails.
>
> Please post all the kernel messages.

If only I could ...
I have no serial console, only the screen, and until initrd is loaded, no
network connection. The mioa701 is a smartphone, with no keyboard, and only
bluetooth and USB as a communication mean.

The only thing I can see is the console output on the framebuffer, which is damn
small.

I was thinking that if at least 1 person could load the initrd, then I would
have no other choice but investigate. But if all people have the same problem,
there would be someone with a development board who will have a full console
output and find the issue easier.

>> After digging a bit in arch/arm/mm/init.c, I find that :
>>  - phys_initrd_start = 0xa0508000
>>  - phys_initrd_size = 3 759 480
>>  - initrd_start = 0 and initrd_end = 0
>
> It's unclear where you're checking this.  The virtual pointers are only
> setup if we're satisfied that the phys_* are within RAM, and we can
> exclusively reserve the region.
I added printk in do_mounts_rd.c, in the first lines of rd_load_image().
I had to remove the "static" statement from phys_initrd_* declaration in init.c,
and added extern declarations to reach the phys_initrd_* variables.

> If we can't reserve the region, that means something's overwritten it
> during kernel boot and it's become unusable.
When you say "overwritten", what is the criteria ? (ie. is it at least one byte
is non-zero, checksum failed, ...).

Or alternatively, is there a clever way of storing some data relative to
reserve_bootmem_node() or __reserve() to be printed at the tail of kernel log
(ie. in do_mounts_rd()) which would help me investigate ?

Cheers.

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-21 20:43 ` Russell King - ARM Linux
  2010-05-22  9:36   ` Robert Jarzmik
@ 2010-05-22  9:37   ` Robert Jarzmik
  2010-05-22  9:46     ` Russell King - ARM Linux
  1 sibling, 1 reply; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-22  9:37 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

> On Fri, May 21, 2010 at 10:27:05PM +0200, Robert Jarzmik wrote:
>> I pulled the 2.6.33 kernel and tried my mainboard with it (mioa701). My
>> kernel boots fine, but initrd load always fails.
>
> Please post all the kernel messages.

If only I could ...
I have no serial console, only the screen, and until initrd is loaded, no
network connection. The mioa701 is a smartphone, with no keyboard, and only
bluetooth and USB as a communication mean.

The only thing I can see is the console output on the framebuffer, which is damn
small.

I was thinking that if at least 1 person could load the initrd, then I would
have no other choice but investigate. But if all people have the same problem,
there would be someone with a development board who will have a full console
output and find the issue easier.

>> After digging a bit in arch/arm/mm/init.c, I find that :
>>  - phys_initrd_start = 0xa0508000
>>  - phys_initrd_size = 3 759 480
>>  - initrd_start = 0 and initrd_end = 0
>
> It's unclear where you're checking this.  The virtual pointers are only
> setup if we're satisfied that the phys_* are within RAM, and we can
> exclusively reserve the region.
I added printk in do_mounts_rd.c, in the first lines of rd_load_image().
I had to remove the "static" statement from phys_initrd_* declaration in init.c,
and added extern declarations to reach the phys_initrd_* variables.

> If we can't reserve the region, that means something's overwritten it
> during kernel boot and it's become unusable.
When you say "overwritten", what is the criteria ? (ie. is it at least one byte
is non-zero, checksum failed, ...).

Or alternatively, is there a clever way of storing some data relative to
reserve_bootmem_node() or __reserve() to be printed at the tail of kernel log
(ie. in do_mounts_rd()) which would help me investigate ?

Cheers.

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-22  9:37   ` Robert Jarzmik
@ 2010-05-22  9:46     ` Russell King - ARM Linux
  2010-05-23  0:23       ` Robert Jarzmik
  0 siblings, 1 reply; 10+ messages in thread
From: Russell King - ARM Linux @ 2010-05-22  9:46 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, May 22, 2010 at 11:37:43AM +0200, Robert Jarzmik wrote:
> Or alternatively, is there a clever way of storing some data relative to
> reserve_bootmem_node() or __reserve() to be printed at the tail of kernel log
> (ie. in do_mounts_rd()) which would help me investigate ?

You could boot with 'quiet' so that the kernel shuts up most of the
noisy kernel messages.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-22  9:46     ` Russell King - ARM Linux
@ 2010-05-23  0:23       ` Robert Jarzmik
  2010-05-23  9:01         ` Russell King - ARM Linux
  0 siblings, 1 reply; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-23  0:23 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:
> You could boot with 'quiet' so that the kernel shuts up most of the
> noisy kernel messages.

With "quiet" option, the kernel console outputs only 1 line :
"Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)"

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-23  0:23       ` Robert Jarzmik
@ 2010-05-23  9:01         ` Russell King - ARM Linux
  2010-05-23 10:09           ` Robert Jarzmik
  0 siblings, 1 reply; 10+ messages in thread
From: Russell King - ARM Linux @ 2010-05-23  9:01 UTC (permalink / raw)
  To: linux-arm-kernel

On Sun, May 23, 2010 at 02:23:33AM +0200, Robert Jarzmik wrote:
> Russell King - ARM Linux <linux@arm.linux.org.uk> writes:
> > You could boot with 'quiet' so that the kernel shuts up most of the
> > noisy kernel messages.
> 
> With "quiet" option, the kernel console outputs only 1 line :
> "Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)"

Right, so none of the errors in the ARM MM initialization are being
triggered, so the initrd image isn't being corrupted.

The reason that initrd_start is zero at rd_load_ramdisk is that in
populate_rootfs(), the initrd is written into the ramfs root as a
/initrd.image file.  Then the original initrd image is freed, resulting
in both initrd_start and initrd_end being zeroed.

Do you have CONFIG_BLK_DEV_RAM enabled?  Try some debugging (using
pr_err() and booting with 'quiet' so you can see the output) in
populate_rootfs().

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-23  9:01         ` Russell King - ARM Linux
@ 2010-05-23 10:09           ` Robert Jarzmik
  2010-05-24 19:22             ` Robert Jarzmik
  2010-05-27 12:00             ` Robert Jarzmik
  0 siblings, 2 replies; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-23 10:09 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

> On Sun, May 23, 2010 at 02:23:33AM +0200, Robert Jarzmik wrote:
> The reason that initrd_start is zero at rd_load_ramdisk is that in
> populate_rootfs(), the initrd is written into the ramfs root as a
> /initrd.image file.  Then the original initrd image is freed, resulting
> in both initrd_start and initrd_end being zeroed.
I understand better now.

> Do you have CONFIG_BLK_DEV_RAM enabled?  Try some debugging (using
> pr_err() and booting with 'quiet' so you can see the output) in
> populate_rootfs().
CONFIG_BLK_DEV_RAM is enabled. I'll add some debugging now and will try again.

Thanks for the help.

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-23 10:09           ` Robert Jarzmik
@ 2010-05-24 19:22             ` Robert Jarzmik
  2010-05-27 12:00             ` Robert Jarzmik
  1 sibling, 0 replies; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-24 19:22 UTC (permalink / raw)
  To: linux-arm-kernel

Robert Jarzmik <robert.jarzmik@free.fr> writes:
> CONFIG_BLK_DEV_RAM is enabled. I'll add some debugging now and will try again.
>
OK, found out the culprit.
My bootloader(haret) is to be blamed : the first 6 bytes of initrd as the kernel
sees them are totally different from the actual 6 first bytes of initrd file.

The long story is that when haret stops wince MMU, it "reorders" the pages to
create a physically contiguous kernel and initrd, from the scattered pages
allocated in wince. The relocation algorithm is faulty, as it doesn't cope with
the cases where there is a double dependency (ie. a kernel page should be moved
to the page occupied by a initrd page, and the initrd page should be moved to
where resides the kernel page).

It's funny how people want to solve the hanoi towers problem without a spare
slot ...

Cheers.

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Initrd and 2.6.33 curious behaviour
  2010-05-23 10:09           ` Robert Jarzmik
  2010-05-24 19:22             ` Robert Jarzmik
@ 2010-05-27 12:00             ` Robert Jarzmik
  1 sibling, 0 replies; 10+ messages in thread
From: Robert Jarzmik @ 2010-05-27 12:00 UTC (permalink / raw)
  To: linux-arm-kernel


I have made some progress.

I have traced that :
 - after the bootloader has disabled the MMU, disabled the caches, quiesced
 the DMAs and masked the interrupts, and just before the final jump to the
 kernel first instruction :
   => the first u32 at physical address 0xa0508000 is 1f:8b:08:08
   => this is the correct begining of my initrd.gz

In function setup_arch(), just after paging_init(mdesc), I read the value again
with a "rjk = *((unsigned int *)(phys_to_virt(0xa0508000)));", and it has
changed to 10:00:00:a0.

Now, I would need some help to trace this memory location before
paging_init(). My current understanding is that before paging_init(), the MMU is
set by __create_page_tables(). The mapping doesn't cover the initrd area.
If I was to be able to watch this area, I would need to :
 - amend __create_page_tables(), and add a mapping for the 0xa0508000 area (1MB
 is enough)
 - read the value of the u32 at physical address 0xa0508000 from this mapping
 - printk the stored value at the end of setup_arch()

The questions I have are :
 - is this the right approach ?
 - which virtual address space can I use for my mapping

--
Robert

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-05-27 12:00 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-21 20:27 Initrd and 2.6.33 curious behaviour Robert Jarzmik
2010-05-21 20:43 ` Russell King - ARM Linux
2010-05-22  9:36   ` Robert Jarzmik
2010-05-22  9:37   ` Robert Jarzmik
2010-05-22  9:46     ` Russell King - ARM Linux
2010-05-23  0:23       ` Robert Jarzmik
2010-05-23  9:01         ` Russell King - ARM Linux
2010-05-23 10:09           ` Robert Jarzmik
2010-05-24 19:22             ` Robert Jarzmik
2010-05-27 12:00             ` Robert Jarzmik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).