Patchwork target-mips: Fix 32 bit mode (wrong size of physical addresses)

login
register
mail settings
Submitter Stefan Weil
Date March 13, 2010, 10:36 p.m.
Message ID <1268519780-6607-1-git-send-email-weil@mail.berlios.de>
Download mbox | patch
Permalink /patch/47722/
State New
Headers show

Comments

Stefan Weil - March 13, 2010, 10:36 p.m.
Commit 30724e758a21ba9f807efafe268626bd479db9de breaks
malta (and other) mips 32 bit emulation.

Fixing the physical address size for 32 bit machines
makes it work again.

Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 target-mips/mips-defs.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
Paul Brook - March 14, 2010, 1:46 p.m.
> Commit 30724e758a21ba9f807efafe268626bd479db9de breaks
> malta (and other) mips 32 bit emulation.
> 
> Fixing the physical address size for 32 bit machines
> makes it work again.

>-#define TARGET_PHYS_ADDR_SPACE_BITS 36
>+#define TARGET_PHYS_ADDR_SPACE_BITS 32

This is almost certainly the wrong change.

Paul
Stefan Weil - March 14, 2010, 4:28 p.m.
Paul Brook schrieb:
>> Commit 30724e758a21ba9f807efafe268626bd479db9de breaks
>> malta (and other) mips 32 bit emulation.
>>
>> Fixing the physical address size for 32 bit machines
>> makes it work again.
>
>> -#define TARGET_PHYS_ADDR_SPACE_BITS 36
>> +#define TARGET_PHYS_ADDR_SPACE_BITS 32
>
> This is almost certainly the wrong change.
>
> Paul

Yes, Aurelien already said this, too, and I agree that my patch
fixes the problem but is the wrong solution.

The wrong part seems to be loading or starting of the elf kernel image:
the "boot loader" jumps to a memory location which is filled with
nops (0). Either the load address of the kernel code is wrong, or
the boot loader jumps to the wrong address.

The problem is also malta specific - mips ar7 emulation works fine.
I did not test the other mips machines, so I cannot say whether they
have this problem, too (maybe yes because of code copy + paste).

Regards,
Stefan
Aurelien Jarno - March 14, 2010, 4:44 p.m.
On Sun, Mar 14, 2010 at 05:28:51PM +0100, Stefan Weil wrote:
> Paul Brook schrieb:
> >> Commit 30724e758a21ba9f807efafe268626bd479db9de breaks
> >> malta (and other) mips 32 bit emulation.
> >>
> >> Fixing the physical address size for 32 bit machines
> >> makes it work again.
> >
> >> -#define TARGET_PHYS_ADDR_SPACE_BITS 36
> >> +#define TARGET_PHYS_ADDR_SPACE_BITS 32
> >
> > This is almost certainly the wrong change.
> >
> > Paul
> 
> Yes, Aurelien already said this, too, and I agree that my patch
> fixes the problem but is the wrong solution.
> 
> The wrong part seems to be loading or starting of the elf kernel image:
> the "boot loader" jumps to a memory location which is filled with
> nops (0). Either the load address of the kernel code is wrong, or
> the boot loader jumps to the wrong address.
> 
> The problem is also malta specific - mips ar7 emulation works fine.
> I did not test the other mips machines, so I cannot say whether they
> have this problem, too (maybe yes because of code copy + paste).
> 

Yes, the problem is that load_elf() only support mangling the addresses
through an addend. This is not working on MIPS as the addend would be
different depending on the type of ELF kernel (32 or 64-bit). The
correct operation for MIPS is too mangle the upper bits to do a kseg0 ->
physical translation.

I am working on a patch, will post it later today.

Patch

diff --git a/target-mips/mips-defs.h b/target-mips/mips-defs.h
index c57de02..dc1ac80 100644
--- a/target-mips/mips-defs.h
+++ b/target-mips/mips-defs.h
@@ -14,7 +14,7 @@ 
 #define TARGET_VIRT_ADDR_SPACE_BITS 42
 #else
 #define TARGET_LONG_BITS 32
-#define TARGET_PHYS_ADDR_SPACE_BITS 36
+#define TARGET_PHYS_ADDR_SPACE_BITS 32
 #define TARGET_VIRT_ADDR_SPACE_BITS 32
 #endif