Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-23 Thread Geert Uytterhoeven
On Tue, 18 Dec 2007, Andrew Morton wrote:
> On Tue, 18 Dec 2007 20:52:07 +0100 (CET) Geert Uytterhoeven <[EMAIL 
> PROTECTED]> wrote:
> > On Tue, 18 Dec 2007, Andrew Morton wrote:
> > > On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven <[EMAIL 
> > > PROTECTED]> wrote:
> > > > On recent kernels, I get the following error when using an initrd:
> > > > 
> > > > | initrd overwritten (0x00b78000 < 0x07668000) - disabling it.
> > > > 
> > > > My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
> > > > 0x).
> > > > The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 
> > > > (virtual).
> > > > The overwrite test compares the (virtual) initrd location to the 
> > > > (physical)
> > > > first available memory location, which fails.
> > > > 
> > > > This patch converts initrd_start to a page frame number, so it can be 
> > > > safely
> > > > compared with min_low_pfn.
> > > > 
> > > > Before the introduction of discontiguous memory support on m68k
> > > > (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
> > > > untouched by the m68k-specific code (zero, I guess), and everything 
> > > > worked
> > > > fine.
> > > 
> > > breaks x86.
> > > 
> > > init/main.c: In function 'start_kernel':
> > > init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
> > > init/main.c:603: warning: format '%08lx' expects type 'long unsigned 
> > > int', but argument 2 has type 'int'
> > 
> > Interestingly, virt_to_pfn() exists on a few architectures only :-(
> > 
> > So what's the correct portable construct to use instead?
> > 
> 
> I guess page_to_pfn(virt_to_page(addr))?

New version below. Tested on Amiga. Compile-tested on ia32 (i386_defconfig) and
pp64 (ps3_defconfig).

Subject: initrd: Fix virtual/physical mix-up in overwrite test

From: Geert Uytterhoeven <[EMAIL PROTECTED]>

On recent kernels, I get the following error when using an initrd:

| initrd overwritten (0x00b78000 < 0x07668000) - disabling it.

My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
0x).
The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 (virtual).
The overwrite test compares the (virtual) initrd location to the (physical)
first available memory location, which fails.

This patch converts initrd_start to a page frame number, so it can be safely
compared with min_low_pfn.

Before the introduction of discontiguous memory support on m68k
(12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
untouched by the m68k-specific code (zero, I guess), and everything worked
fine.

Signed-off-by: Geert Uytterhoeven <[EMAIL PROTECTED]>
---
On several platforms, initrd_below_start_ok is set to 1:

| arch/mips/kernel/setup.c:   initrd_below_start_ok = 1;
| arch/parisc/mm/init.c:  initrd_below_start_ok = 1;
| arch/powerpc/kernel/prom.c: initrd_below_start_ok = 1;
| arch/ppc/platforms/hdpu.c:  initrd_below_start_ok = 1;
| arch/xtensa/kernel/setup.c: initrd_below_start_ok = 1;

Some of these may be workarounds for this bug. Please check.

 init/main.c |5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

--- a/init/main.c
+++ b/init/main.c
@@ -598,9 +598,10 @@ asmlinkage void __init start_kernel(void
 
 #ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start && !initrd_below_start_ok &&
-   initrd_start < min_low_pfn << PAGE_SHIFT) {
+   page_to_pfn(virt_to_page(initrd_start)) < min_low_pfn) {
printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
-   "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
+   "disabling it.\n",
+   page_to_pfn(virt_to_page(initrd_start)), min_low_pfn);
initrd_start = 0;
}
 #endif

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-23 Thread Geert Uytterhoeven
On Tue, 18 Dec 2007, Andrew Morton wrote:
 On Tue, 18 Dec 2007 20:52:07 +0100 (CET) Geert Uytterhoeven [EMAIL 
 PROTECTED] wrote:
  On Tue, 18 Dec 2007, Andrew Morton wrote:
   On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven [EMAIL 
   PROTECTED] wrote:
On recent kernels, I get the following error when using an initrd:

| initrd overwritten (0x00b78000  0x07668000) - disabling it.

My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
0x).
The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 
(virtual).
The overwrite test compares the (virtual) initrd location to the 
(physical)
first available memory location, which fails.

This patch converts initrd_start to a page frame number, so it can be 
safely
compared with min_low_pfn.

Before the introduction of discontiguous memory support on m68k
(12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
untouched by the m68k-specific code (zero, I guess), and everything 
worked
fine.
   
   breaks x86.
   
   init/main.c: In function 'start_kernel':
   init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
   init/main.c:603: warning: format '%08lx' expects type 'long unsigned 
   int', but argument 2 has type 'int'
  
  Interestingly, virt_to_pfn() exists on a few architectures only :-(
  
  So what's the correct portable construct to use instead?
  
 
 I guess page_to_pfn(virt_to_page(addr))?

New version below. Tested on Amiga. Compile-tested on ia32 (i386_defconfig) and
pp64 (ps3_defconfig).

Subject: initrd: Fix virtual/physical mix-up in overwrite test

From: Geert Uytterhoeven [EMAIL PROTECTED]

On recent kernels, I get the following error when using an initrd:

| initrd overwritten (0x00b78000  0x07668000) - disabling it.

My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
0x).
The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 (virtual).
The overwrite test compares the (virtual) initrd location to the (physical)
first available memory location, which fails.

This patch converts initrd_start to a page frame number, so it can be safely
compared with min_low_pfn.

Before the introduction of discontiguous memory support on m68k
(12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
untouched by the m68k-specific code (zero, I guess), and everything worked
fine.

Signed-off-by: Geert Uytterhoeven [EMAIL PROTECTED]
---
On several platforms, initrd_below_start_ok is set to 1:

| arch/mips/kernel/setup.c:   initrd_below_start_ok = 1;
| arch/parisc/mm/init.c:  initrd_below_start_ok = 1;
| arch/powerpc/kernel/prom.c: initrd_below_start_ok = 1;
| arch/ppc/platforms/hdpu.c:  initrd_below_start_ok = 1;
| arch/xtensa/kernel/setup.c: initrd_below_start_ok = 1;

Some of these may be workarounds for this bug. Please check.

 init/main.c |5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

--- a/init/main.c
+++ b/init/main.c
@@ -598,9 +598,10 @@ asmlinkage void __init start_kernel(void
 
 #ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start  !initrd_below_start_ok 
-   initrd_start  min_low_pfn  PAGE_SHIFT) {
+   page_to_pfn(virt_to_page(initrd_start))  min_low_pfn) {
printk(KERN_CRIT initrd overwritten (0x%08lx  0x%08lx) - 
-   disabling it.\n,initrd_start,min_low_pfn  PAGE_SHIFT);
+   disabling it.\n,
+   page_to_pfn(virt_to_page(initrd_start)), min_low_pfn);
initrd_start = 0;
}
 #endif

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say programmer or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-18 Thread Andrew Morton
On Tue, 18 Dec 2007 20:52:07 +0100 (CET) Geert Uytterhoeven <[EMAIL PROTECTED]> 
wrote:

> On Tue, 18 Dec 2007, Andrew Morton wrote:
> > On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven <[EMAIL 
> > PROTECTED]> wrote:
> > > On recent kernels, I get the following error when using an initrd:
> > > 
> > > | initrd overwritten (0x00b78000 < 0x07668000) - disabling it.
> > > 
> > > My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
> > > 0x).
> > > The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 
> > > (virtual).
> > > The overwrite test compares the (virtual) initrd location to the 
> > > (physical)
> > > first available memory location, which fails.
> > > 
> > > This patch converts initrd_start to a page frame number, so it can be 
> > > safely
> > > compared with min_low_pfn.
> > > 
> > > Before the introduction of discontiguous memory support on m68k
> > > (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
> > > untouched by the m68k-specific code (zero, I guess), and everything worked
> > > fine.
> > 
> > breaks x86.
> > 
> > init/main.c: In function 'start_kernel':
> > init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
> > init/main.c:603: warning: format '%08lx' expects type 'long unsigned int', 
> > but argument 2 has type 'int'
> 
> Interestingly, virt_to_pfn() exists on a few architectures only :-(
> 
> So what's the correct portable construct to use instead?
> 

I guess page_to_pfn(virt_to_page(addr))?
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-18 Thread Geert Uytterhoeven
On Tue, 18 Dec 2007, Andrew Morton wrote:
> On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven <[EMAIL 
> PROTECTED]> wrote:
> > On recent kernels, I get the following error when using an initrd:
> > 
> > | initrd overwritten (0x00b78000 < 0x07668000) - disabling it.
> > 
> > My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
> > 0x).
> > The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 (virtual).
> > The overwrite test compares the (virtual) initrd location to the (physical)
> > first available memory location, which fails.
> > 
> > This patch converts initrd_start to a page frame number, so it can be safely
> > compared with min_low_pfn.
> > 
> > Before the introduction of discontiguous memory support on m68k
> > (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
> > untouched by the m68k-specific code (zero, I guess), and everything worked
> > fine.
> 
> breaks x86.
> 
> init/main.c: In function 'start_kernel':
> init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
> init/main.c:603: warning: format '%08lx' expects type 'long unsigned int', 
> but argument 2 has type 'int'

Interestingly, virt_to_pfn() exists on a few architectures only :-(

So what's the correct portable construct to use instead?

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-18 Thread Andrew Morton
On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven <[EMAIL PROTECTED]> 
wrote:

> On recent kernels, I get the following error when using an initrd:
> 
> | initrd overwritten (0x00b78000 < 0x07668000) - disabling it.
> 
> My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
> 0x).
> The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 (virtual).
> The overwrite test compares the (virtual) initrd location to the (physical)
> first available memory location, which fails.
> 
> This patch converts initrd_start to a page frame number, so it can be safely
> compared with min_low_pfn.
> 
> Before the introduction of discontiguous memory support on m68k
> (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
> untouched by the m68k-specific code (zero, I guess), and everything worked
> fine.

breaks x86.

init/main.c: In function 'start_kernel':
init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
init/main.c:603: warning: format '%08lx' expects type 'long unsigned int', but 
argument 2 has type 'int'
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-18 Thread Andrew Morton
On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven [EMAIL PROTECTED] 
wrote:

 On recent kernels, I get the following error when using an initrd:
 
 | initrd overwritten (0x00b78000  0x07668000) - disabling it.
 
 My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
 0x).
 The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 (virtual).
 The overwrite test compares the (virtual) initrd location to the (physical)
 first available memory location, which fails.
 
 This patch converts initrd_start to a page frame number, so it can be safely
 compared with min_low_pfn.
 
 Before the introduction of discontiguous memory support on m68k
 (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
 untouched by the m68k-specific code (zero, I guess), and everything worked
 fine.

breaks x86.

init/main.c: In function 'start_kernel':
init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
init/main.c:603: warning: format '%08lx' expects type 'long unsigned int', but 
argument 2 has type 'int'
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-18 Thread Geert Uytterhoeven
On Tue, 18 Dec 2007, Andrew Morton wrote:
 On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven [EMAIL 
 PROTECTED] wrote:
  On recent kernels, I get the following error when using an initrd:
  
  | initrd overwritten (0x00b78000  0x07668000) - disabling it.
  
  My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
  0x).
  The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 (virtual).
  The overwrite test compares the (virtual) initrd location to the (physical)
  first available memory location, which fails.
  
  This patch converts initrd_start to a page frame number, so it can be safely
  compared with min_low_pfn.
  
  Before the introduction of discontiguous memory support on m68k
  (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
  untouched by the m68k-specific code (zero, I guess), and everything worked
  fine.
 
 breaks x86.
 
 init/main.c: In function 'start_kernel':
 init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
 init/main.c:603: warning: format '%08lx' expects type 'long unsigned int', 
 but argument 2 has type 'int'

Interestingly, virt_to_pfn() exists on a few architectures only :-(

So what's the correct portable construct to use instead?

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [EMAIL PROTECTED]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say programmer or something like that.
-- Linus Torvalds
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-18 Thread Andrew Morton
On Tue, 18 Dec 2007 20:52:07 +0100 (CET) Geert Uytterhoeven [EMAIL PROTECTED] 
wrote:

 On Tue, 18 Dec 2007, Andrew Morton wrote:
  On Sun, 16 Dec 2007 11:51:00 +0100 (CET) Geert Uytterhoeven [EMAIL 
  PROTECTED] wrote:
   On recent kernels, I get the following error when using an initrd:
   
   | initrd overwritten (0x00b78000  0x07668000) - disabling it.
   
   My Amiga 4000 has 12 MiB of RAM at physical address 0x0740 (virtual
   0x).
   The initrd is located at the end of RAM: 0x00b78000 - 0x00c0 
   (virtual).
   The overwrite test compares the (virtual) initrd location to the 
   (physical)
   first available memory location, which fails.
   
   This patch converts initrd_start to a page frame number, so it can be 
   safely
   compared with min_low_pfn.
   
   Before the introduction of discontiguous memory support on m68k
   (12d810c1b8c2b913d48e629e2b5c01d105029839), min_low_pfn was just left
   untouched by the m68k-specific code (zero, I guess), and everything worked
   fine.
  
  breaks x86.
  
  init/main.c: In function 'start_kernel':
  init/main.c:601: error: implicit declaration of function 'virt_to_pfn'
  init/main.c:603: warning: format '%08lx' expects type 'long unsigned int', 
  but argument 2 has type 'int'
 
 Interestingly, virt_to_pfn() exists on a few architectures only :-(
 
 So what's the correct portable construct to use instead?
 

I guess page_to_pfn(virt_to_page(addr))?
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-16 Thread Roman Zippel
Hi,

On Sunday 16 December 2007, Geert Uytterhoeven wrote:

> --- a/init/main.c
> +++ b/init/main.c
> @@ -598,9 +598,9 @@ asmlinkage void __init start_kernel(void
>
>  #ifdef CONFIG_BLK_DEV_INITRD
>   if (initrd_start && !initrd_below_start_ok &&
> - initrd_start < min_low_pfn << PAGE_SHIFT) {
> + virt_to_pfn(initrd_start) < min_low_pfn) {
>   printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
> - "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
> + "disabling it.\n", virt_to_pfn(initrd_start), min_low_pfn);
>   initrd_start = 0;
>   }
>  #endif

BTW this is some really old code, so another option might be to remove this 
check completely as the same check is already done via bootmem.

bye, Roman
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] initrd: Fix virtual/physical mix-up in overwrite test

2007-12-16 Thread Roman Zippel
Hi,

On Sunday 16 December 2007, Geert Uytterhoeven wrote:

 --- a/init/main.c
 +++ b/init/main.c
 @@ -598,9 +598,9 @@ asmlinkage void __init start_kernel(void

  #ifdef CONFIG_BLK_DEV_INITRD
   if (initrd_start  !initrd_below_start_ok 
 - initrd_start  min_low_pfn  PAGE_SHIFT) {
 + virt_to_pfn(initrd_start)  min_low_pfn) {
   printk(KERN_CRIT initrd overwritten (0x%08lx  0x%08lx) - 
 - disabling it.\n,initrd_start,min_low_pfn  PAGE_SHIFT);
 + disabling it.\n, virt_to_pfn(initrd_start), min_low_pfn);
   initrd_start = 0;
   }
  #endif

BTW this is some really old code, so another option might be to remove this 
check completely as the same check is already done via bootmem.

bye, Roman
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/