* powerpc 476, Little-endian, pte fault
@ 2011-10-31 5:30 Santosh Kumar
2011-10-31 5:51 ` Michael Neuling
2011-10-31 7:48 ` Shan Hai
0 siblings, 2 replies; 11+ messages in thread
From: Santosh Kumar @ 2011-10-31 5:30 UTC (permalink / raw)
To: linux-kernel
KERNEL: linux 2.6.39.4
POWERPC: 476, little endian.
I am trying to get linux 2.6.39.4 up on PPC 476 i have done done
Big-endian to little endian Changes in:
1) bitops header file.
2) while reading the device tree.
3) the PTE read/computed in head_32.S
4) added E bit in the TLB entries.
with all the above changes the kernel_init is done but and inited is mounted.
But while spawning init process the kernel continuously hits pte
faults at address 0x100000fc and never comes out. Please let me know
where i should be looking into.
-
Thanks
Santosh Kumar .A
Vision without Action is a daydream... Action without Vision is a nightmare...
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-10-31 5:30 powerpc 476, Little-endian, pte fault Santosh Kumar
@ 2011-10-31 5:51 ` Michael Neuling
[not found] ` <CAJw04pAh5QDQMkUHbj9=rRPiUCZejimHiydCJFMAoZeSd_ydhA@mail.gmail.com>
2011-10-31 7:48 ` Shan Hai
1 sibling, 1 reply; 11+ messages in thread
From: Michael Neuling @ 2011-10-31 5:51 UTC (permalink / raw)
To: Santosh Kumar; +Cc: linux-kernel, linuxppc-dev, Tony Breeds
Adding linuxppc-dev list to the CC
> KERNEL: linux 2.6.39.4
> POWERPC: 476, little endian.
>
> I am trying to get linux 2.6.39.4 up on PPC 476 i have done done
> Big-endian to little endian Changes in:
Can you explain what you are trying to do in more detail? What does "i
have done Big-endian to little endian Changes" mean?
> 1) bitops header file.
> 2) while reading the device tree.
> 3) the PTE read/computed in head_32.S
> 4) added E bit in the TLB entries.
>
> with all the above changes the kernel_init is done but and inited is
> mounted.
Can you post your patch?
Are you trying to boot the kernel in little endian or just run userspace
in little endian?
> But while spawning init process the kernel continuously hits pte
> faults at address 0x100000fc and never comes out. Please let me know
> where i should be looking into.
Is this the very first userspace instruction?
Mikey
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
[not found] ` <CAJw04pAh5QDQMkUHbj9=rRPiUCZejimHiydCJFMAoZeSd_ydhA@mail.gmail.com>
@ 2011-10-31 7:38 ` Santosh Kumar
2011-10-31 9:49 ` Michael Neuling
1 sibling, 0 replies; 11+ messages in thread
From: Santosh Kumar @ 2011-10-31 7:38 UTC (permalink / raw)
To: Michael Neuling; +Cc: linux-kernel, linuxppc-dev, Tony Breeds
This is not the first user-space instruction. While executing this
process kernel has added two TLB entries with TID(process id) 1. while
trying to map 0x100000fc it is raising pte faults .
Santosh Kumar .A
Vision without Action is a daydream... Action without Vision is a nightmare...
On 31 October 2011 12:05, Santosh Kumar <santoshkumar.a@gmail.com> wrote:
> I have built a cross compiler for ppc440 in little endian mode and
> using it to build the kernel.
>
> Yes i am running Linux in Little-Endian. This is the first user space
> process. I wrote the below program and running it as init from
> /sbin/init. I have also set the permissions with chmod +s.
>
> main()
> {
>
> while(1){
> printf("hello world");
> sleep(1);
> }
> }
>
> I have attached the patch.
>
> -
> Santosh Kumar .A
>
> Vision without Action is a daydream... Action without Vision is a nightmare...
>
>
>
> On 31 October 2011 11:21, Michael Neuling <mikey@neuling.org> wrote:
>> Adding linuxppc-dev list to the CC
>>
>>> KERNEL: linux 2.6.39.4
>>> POWERPC: 476, little endian.
>>>
>>> I am trying to get linux 2.6.39.4 up on PPC 476 i have done done
>>> Big-endian to little endian Changes in:
>>
>> Can you explain what you are trying to do in more detail? What does "i
>> have done Big-endian to little endian Changes" mean?
>>
>>> 1) bitops header file.
>>> 2) while reading the device tree.
>>> 3) the PTE read/computed in head_32.S
>>> 4) added E bit in the TLB entries.
>>>
>>> with all the above changes the kernel_init is done but and inited is
>>> mounted.
>>
>> Can you post your patch?
>>
>> Are you trying to boot the kernel in little endian or just run userspace
>> in little endian?
>>
>>> But while spawning init process the kernel continuously hits pte
>>> faults at address 0x100000fc and never comes out. Please let me know
>>> where i should be looking into.
>>
>> Is this the very first userspace instruction?
>>
>> Mikey
>>
>>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-10-31 5:30 powerpc 476, Little-endian, pte fault Santosh Kumar
2011-10-31 5:51 ` Michael Neuling
@ 2011-10-31 7:48 ` Shan Hai
2011-10-31 9:17 ` Santosh Kumar
1 sibling, 1 reply; 11+ messages in thread
From: Shan Hai @ 2011-10-31 7:48 UTC (permalink / raw)
To: Santosh Kumar; +Cc: linux-kernel
On Mon, Oct 31, 2011 at 11:00:14AM +0530, Santosh Kumar wrote:
> KERNEL: linux 2.6.39.4
> POWERPC: 476, little endian.
>
> I am trying to get linux 2.6.39.4 up on PPC 476 i have done done
> Big-endian to little endian Changes in:
> 1) bitops header file.
> 2) while reading the device tree.
> 3) the PTE read/computed in head_32.S
> 4) added E bit in the TLB entries.
>
> with all the above changes the kernel_init is done but and inited is mounted.
>
> But while spawning init process the kernel continuously hits pte
> faults at address 0x100000fc and never comes out. Please let me know
> where i should be looking into.
>
Please check whether the following commit is there in your tree.
2efaca927f5cd7ecd0f1554b8f9b6a9a2c329c03
Cheers
Shan Hai
> -
> Thanks
> Santosh Kumar .A
>
> Vision without Action is a daydream... Action without Vision is a nightmare...
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-10-31 7:48 ` Shan Hai
@ 2011-10-31 9:17 ` Santosh Kumar
0 siblings, 0 replies; 11+ messages in thread
From: Santosh Kumar @ 2011-10-31 9:17 UTC (permalink / raw)
To: Shan Hai; +Cc: linux-kernel
i tried this but the fixup_user_fault is called as the path followed
is different. Also i see that the flags passed to handle_mm_fault is 0
i.e the fault is not on a write access. Please let me know if i have
to use this fix some where else too.
thanks
Santosh Kumar .A
Vision without Action is a daydream... Action without Vision is a nightmare...
On 31 October 2011 13:18, Shan Hai <haishan.bai@gmail.com> wrote:
> On Mon, Oct 31, 2011 at 11:00:14AM +0530, Santosh Kumar wrote:
>> KERNEL: linux 2.6.39.4
>> POWERPC: 476, little endian.
>>
>> I am trying to get linux 2.6.39.4 up on PPC 476 i have done done
>> Big-endian to little endian Changes in:
>> 1) bitops header file.
>> 2) while reading the device tree.
>> 3) the PTE read/computed in head_32.S
>> 4) added E bit in the TLB entries.
>>
>> with all the above changes the kernel_init is done but and inited is mounted.
>>
>> But while spawning init process the kernel continuously hits pte
>> faults at address 0x100000fc and never comes out. Please let me know
>> where i should be looking into.
>>
>
> Please check whether the following commit is there in your tree.
> 2efaca927f5cd7ecd0f1554b8f9b6a9a2c329c03
>
> Cheers
> Shan Hai
>
>> -
>> Thanks
>> Santosh Kumar .A
>>
>> Vision without Action is a daydream... Action without Vision is a nightmare...
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
[not found] ` <CAJw04pAh5QDQMkUHbj9=rRPiUCZejimHiydCJFMAoZeSd_ydhA@mail.gmail.com>
2011-10-31 7:38 ` Santosh Kumar
@ 2011-10-31 9:49 ` Michael Neuling
2011-10-31 11:23 ` Benjamin Herrenschmidt
1 sibling, 1 reply; 11+ messages in thread
From: Michael Neuling @ 2011-10-31 9:49 UTC (permalink / raw)
To: Santosh Kumar; +Cc: linux-kernel, linuxppc-dev, Tony Breeds, Ian Munsie
> I have built a cross compiler for ppc440 in little endian mode and
> using it to build the kernel.
>
> Yes i am running Linux in Little-Endian. This is the first user space
> process. I wrote the below program and running it as init from
> /sbin/init. I have also set the permissions with chmod +s.
>
> main()
> {
>
> while(1){
> printf("hello world");
> sleep(1);
> }
> }
Does libc even support little endian on PPC?
> I have attached the patch.
This is a pretty huge patch:
115 files changed, 44479 insertions(+), 7398 deletions(-)
It seems to include a new platform as well as a bunch of unrelated junk.
I suggest you need to break this down into something more digestible.
Like remove all the junk in the patch. Then add the support for the new
platform (invader? platform). Then start looking at little endian.
Unless you do this, it's unlikely anyone here is going to be able to
help.
When you get to the little endian work, you might want to take a look at
this patch series from Ian Munsie:
http://lists.ozlabs.org/pipermail/linuxppc-dev/2010-October/086165.html
Mikey
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-10-31 9:49 ` Michael Neuling
@ 2011-10-31 11:23 ` Benjamin Herrenschmidt
2011-11-01 3:02 ` Santosh Kumar
0 siblings, 1 reply; 11+ messages in thread
From: Benjamin Herrenschmidt @ 2011-10-31 11:23 UTC (permalink / raw)
To: Michael Neuling; +Cc: Santosh Kumar, linuxppc-dev, Ian Munsie, linux-kernel
On Mon, 2011-10-31 at 20:49 +1100, Michael Neuling wrote:
> > I have built a cross compiler for ppc440 in little endian mode and
> > using it to build the kernel.
> >
> > Yes i am running Linux in Little-Endian. This is the first user space
> > process. I wrote the below program and running it as init from
> > /sbin/init. I have also set the permissions with chmod +s.
> >
> > main()
> > {
> >
> > while(1){
> > printf("hello world");
> > sleep(1);
> > }
> > }
>
> Does libc even support little endian on PPC?
Ian did a port a while back for uClibc, is that at least partially based
on it ?
> > I have attached the patch.
>
> This is a pretty huge patch:
>
> 115 files changed, 44479 insertions(+), 7398 deletions(-)
>
> It seems to include a new platform as well as a bunch of unrelated junk.
>
> I suggest you need to break this down into something more digestible.
> Like remove all the junk in the patch. Then add the support for the new
> platform (invader? platform). Then start looking at little endian.
> Unless you do this, it's unlikely anyone here is going to be able to
> help.
>
> When you get to the little endian work, you might want to take a look at
> this patch series from Ian Munsie:
>
> http://lists.ozlabs.org/pipermail/linuxppc-dev/2010-October/086165.html
Right, the new patch should be if possible based on Ian's series or at
least a cleaned / rebased variant of it. Then split in bits so we can
review it properly.
Cheers,
Ben.
> Mikey
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-10-31 11:23 ` Benjamin Herrenschmidt
@ 2011-11-01 3:02 ` Santosh Kumar
2011-11-01 13:44 ` Peter Bergner
0 siblings, 1 reply; 11+ messages in thread
From: Santosh Kumar @ 2011-11-01 3:02 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: Michael Neuling, linuxppc-dev, Ian Munsie, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 2302 bytes --]
I have attached the patch with only the relevant changes.
The patch is not based on uLIBC patch.
Glibc doesnt support little endian for PPC, but after minor changes to
makefile i got it working. With the compiler i am using i could get
2.6.31 on ppc440 working. I am using the same compiler as 476 & 440
instruction is almost the same.
Thanks
Santosh Kumar .A
Vision without Action is a daydream... Action without Vision is a nightmare...
On 31 October 2011 16:53, Benjamin Herrenschmidt
<benh@kernel.crashing.org> wrote:
> On Mon, 2011-10-31 at 20:49 +1100, Michael Neuling wrote:
>> > I have built a cross compiler for ppc440 in little endian mode and
>> > using it to build the kernel.
>> >
>> > Yes i am running Linux in Little-Endian. This is the first user space
>> > process. I wrote the below program and running it as init from
>> > /sbin/init. I have also set the permissions with chmod +s.
>> >
>> > main()
>> > {
>> >
>> > while(1){
>> > printf("hello world");
>> > sleep(1);
>> > }
>> > }
>>
>> Does libc even support little endian on PPC?
>
> Ian did a port a while back for uClibc, is that at least partially based
> on it ?
>
>> > I have attached the patch.
>>
>> This is a pretty huge patch:
>>
>> 115 files changed, 44479 insertions(+), 7398 deletions(-)
>>
>> It seems to include a new platform as well as a bunch of unrelated junk.
>>
>> I suggest you need to break this down into something more digestible.
>> Like remove all the junk in the patch. Then add the support for the new
>> platform (invader? platform). Then start looking at little endian.
>> Unless you do this, it's unlikely anyone here is going to be able to
>> help.
>>
>> When you get to the little endian work, you might want to take a look at
>> this patch series from Ian Munsie:
>>
>> http://lists.ozlabs.org/pipermail/linuxppc-dev/2010-October/086165.html
>
> Right, the new patch should be if possible based on Ian's series or at
> least a cleaned / rebased variant of it. Then split in bits so we can
> review it properly.
>
> Cheers,
> Ben.
>
>> Mikey
>> _______________________________________________
>> Linuxppc-dev mailing list
>> Linuxppc-dev@lists.ozlabs.org
>> https://lists.ozlabs.org/listinfo/linuxppc-dev
>
>
>
[-- Attachment #2: linux_ppc_476.patch --]
[-- Type: application/octet-stream, Size: 42386 bytes --]
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/boot/div64.S ../linux-2.6.39.4/arch/powerpc/boot/div64.S
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/boot/div64.S 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/boot/div64.S 2011-10-22 14:16:46.616117143 +0530
@@ -17,8 +17,13 @@
.globl __div64_32
__div64_32:
+#ifdef CONFIG_INVADER
+ lwz r5,4(r3) # get the dividend into r5/r6
+ lwz r6,0(r3)
+#else
lwz r5,0(r3) # get the dividend into r5/r6
lwz r6,4(r3)
+#endif
cmplw r5,r4
li r7,0
li r8,0
@@ -53,7 +58,12 @@
mullw r10,r0,r4 # and get the remainder
add r8,r8,r0
subf r6,r10,r6
+#ifdef CONFIG_INVADER
4: stw r7,0(r3) # return the quotient in *r3
stw r8,4(r3)
+#else
+4: stw r7,0(r3) # return the quotient in *r3
+ stw r8,4(r3)
+#endif
mr r3,r6 # return the remainder in r3
blr
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/boot/Makefile ../linux-2.6.39.4/arch/powerpc/boot/Makefile
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/boot/Makefile 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/boot/Makefile 2011-10-22 06:47:05.354137527 +0530
@@ -37,7 +37,7 @@
DTC_FLAGS ?= -p 1024
-$(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
+$(obj)/4xx.o: BOOTCFLAGS += -mcpu=440
$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
$(obj)/cuboot-hotfoot.o: BOOTCFLAGS += -mcpu=405
$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/boot/wrapper ../linux-2.6.39.4/arch/powerpc/boot/wrapper
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/boot/wrapper 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/boot/wrapper 2011-10-22 06:38:26.286134445 +0530
@@ -38,6 +38,7 @@
dts=
cacheit=
binary=
+gzip=
gzip=.gz
# cross-compilation prefix
@@ -50,7 +51,6 @@
object=arch/powerpc/boot
objbin=$object
dtc=scripts/dtc/dtc
-
# directory for working files
tmpdir=.
@@ -260,7 +260,6 @@
vmz="$vmz.$$"
fi
fi
-
vmz="$vmz$gzip"
# Extract kernel version information, some platforms want to include
@@ -277,12 +276,13 @@
case "$platform" in
uboot)
rm -f "$ofile"
- ${MKIMAGE} -A ppc -O linux -T kernel -C gzip -a $membase -e $membase \
+ ${MKIMAGE} -A ppc -O linux -T kernel -a $membase -e $membase \
$uboot_version -d "$vmz" "$ofile"
if [ -z "$cacheit" ]; then
rm -f "$vmz"
fi
exit 0
+ echo "not exiting"
;;
esac
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/bitops.h ../linux-2.6.39.4/arch/powerpc/include/asm/bitops.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/bitops.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/include/asm/bitops.h 2011-10-22 06:38:25.203141637 +0530
@@ -318,13 +318,34 @@
return __test_and_clear_bit(nr ^ BITOP_LE_SWIZZLE, addr);
}
+static inline unsigned long find_next_zero_bit_le(const void *addr,
+ unsigned long size, unsigned long offset)
+{
+ return find_next_zero_bit(addr, size, offset);
+}
+
+static inline unsigned long find_next_bit_le(const void *addr,
+ unsigned long size, unsigned long offset)
+{
+ return find_next_bit(addr, size, offset);
+}
+
+static inline unsigned long find_first_zero_bit_le(const void *addr,
+ unsigned long size)
+{
+ return find_first_zero_bit(addr, size);
+}
+
#define find_first_zero_bit_le(addr, size) \
find_next_zero_bit_le((addr), (size), 0)
+/*
unsigned long find_next_zero_bit_le(const void *addr,
unsigned long size, unsigned long offset);
unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset);
+*/
+
/* Bitmap functions for the ext2 filesystem */
#define ext2_set_bit_atomic(lock, nr, addr) \
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/byteorder.h ../linux-2.6.39.4/arch/powerpc/include/asm/byteorder.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/byteorder.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/include/asm/byteorder.h 2011-10-22 06:38:25.254182204 +0530
@@ -7,6 +7,12 @@
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
+
+#ifdef CONFIG_INVADER
+#include <linux/byteorder/little_endian.h>
+#else
#include <linux/byteorder/big_endian.h>
+#endif
+
#endif /* _ASM_POWERPC_BYTEORDER_H */
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/elf.h ../linux-2.6.39.4/arch/powerpc/include/asm/elf.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/elf.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/include/asm/elf.h 2011-10-22 06:38:25.140139532 +0530
@@ -118,13 +118,21 @@
# define ELF_GREG_TYPE elf_greg_t32
# define ELF_ARCH EM_PPC
# define ELF_CLASS ELFCLASS32
+#ifdef CONFIG_INVADER
+# define ELF_DATA ELFDATA2LSB
+#else
# define ELF_DATA ELFDATA2MSB
+#endif
#endif /* __powerpc64__ */
#ifndef ELF_ARCH
# define ELF_ARCH EM_PPC64
# define ELF_CLASS ELFCLASS64
+#ifdef CONFIG_INVADER
+# define ELF_DATA ELFDATA2LSB
+#else
# define ELF_DATA ELFDATA2MSB
+#endif
typedef elf_greg_t64 elf_greg_t;
typedef elf_gregset_t64 elf_gregset_t;
#else
iff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/pgtable-ppc32.h ../linux-2.6.39.4/arch/powerpc/include/asm/pgtable-ppc32.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/pgtable-ppc32.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/include/asm/pgtable-ppc32.h 2011-10-28 13:54:33.350779238 +0530
@@ -63,8 +63,12 @@
#ifdef CONFIG_HIGHMEM
#define KVIRT_TOP PKMAP_BASE
#else
+#ifdef CONFIG_INVADER
+#define KVIRT_TOP (0xbe000000UL)
+#else
#define KVIRT_TOP (0xfe000000UL) /* for now, could be FIXMAP_BASE ? */
#endif
+#endif
/*
* ioremap_bot starts at that address. Early ioremaps move down from there,
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/prom.h ../linux-2.6.39.4/arch/powerpc/include/asm/prom.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/prom.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/include/asm/prom.h 2011-10-22 06:38:25.211141792 +0530
@@ -20,6 +20,10 @@
#include <asm/irq.h>
#include <asm/atomic.h>
+#ifdef CONFIG_INVADER
+#include <asm/io.h>
+#endif
+
#define HAVE_ARCH_DEVTREE_FIXUPS
#ifdef CONFIG_PPC32
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/reg.h ../linux-2.6.39.4/arch/powerpc/include/asm/reg.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/include/asm/reg.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/include/asm/reg.h 2011-10-22 06:38:25.222139709 +0530
@@ -839,7 +839,11 @@
#define PVR_403GC 0x00200200
#define PVR_403GCX 0x00201400
#define PVR_405GP 0x40110000
+#ifdef CONFIG_INVADER
+#define PVR_476 0x7ff52080
+#else
#define PVR_476 0x11a52000
+#endif
#define PVR_STB03XXX 0x40310000
#define PVR_NP405H 0x41410000
#define PVR_NP405L 0x41610000
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/cacheinfo.c ../linux-2.6.39.4/arch/powerpc/kernel/cacheinfo.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/cacheinfo.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/cacheinfo.c 2011-10-24 17:02:11.354148243 +0530
@@ -203,7 +203,12 @@
if (!cache_size)
return -ENODEV;
+ printk("cache size: 0x%u\n", be32_to_cpup(cache_size));
+#ifdef CONFIG_INVADER
+ *ret = be32_to_cpup(cache_size);
+#else
*ret = *cache_size;
+#endif
return 0;
}
@@ -238,7 +243,12 @@
if (!line_size)
return -ENODEV;
+ printk("lne size: 0x%u\n", be32_to_cpup(line_size));
+#ifdef CONFIG_INVADER
+ *ret = be32_to_cpup(line_size);
+#else
*ret = *line_size;
+#endif
return 0;
}
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/cputable.c ../linux-2.6.39.4/arch/powerpc/kernel/cputable.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/cputable.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/cputable.c 2011-10-22 06:38:27.763108473 +0530
@@ -1853,6 +1853,22 @@
.machine_check = machine_check_47x,
.platform = "ppc470",
},
+#ifdef CONFIG_INVADER
+ { /* 476 others */
+ .pvr_mask = 0xffffffff,
+ .pvr_value = 0x7ff52080,
+ .cpu_name = "476fp",
+ .cpu_features = CPU_FTRS_47X,
+ .cpu_user_features = COMMON_USER_BOOKE |
+ PPC_FEATURE_HAS_FPU,
+ .mmu_features = MMU_FTR_TYPE_47x |
+ MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
+ .icache_bsize = 32,
+ .dcache_bsize = 32,
+ .machine_check = machine_check_47x,
+ .platform = "ppc470",
+ },
+#endif
{ /* default match */
.pvr_mask = 0x00000000,
.pvr_value = 0x00000000,
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/head_44x.S ../linux-2.6.39.4/arch/powerpc/kernel/head_44x.S
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/head_44x.S 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/head_44x.S 2011-10-30 16:00:57.409103255 +0530
@@ -259,8 +259,14 @@
/* Compute pte address */
rlwimi r12, r10, PPC44x_PTE_ADD_SHIFT, PPC44x_PTE_ADD_MASK_BIT, 28
+
+#ifdef CONFIG_INVADER
+ lwz r11, 4(r12) /* Get high word of pte entry */
+ lwz r12, 0(r12) /* Get low word of pte entry */
+#else
lwz r11, 0(r12) /* Get high word of pte entry */
lwz r12, 4(r12) /* Get low word of pte entry */
+#endif
lis r10,tlb_44x_index@ha
@@ -355,8 +361,13 @@
/* Compute pte address */
rlwimi r12, r10, PPC44x_PTE_ADD_SHIFT, PPC44x_PTE_ADD_MASK_BIT, 28
+#ifdef CONFIG_INVADER
+ lwz r11, 4(r12) /* Get high word of pte entry */
+ lwz r12, 0(r12) /* Get low word of pte entry */
+#else
lwz r11, 0(r12) /* Get high word of pte entry */
lwz r12, 4(r12) /* Get low word of pte entry */
+#endif
lis r10,tlb_44x_index@ha
@@ -508,8 +519,12 @@
/* Compute pte address */
rlwimi r12,r10,PPC44x_PTE_ADD_SHIFT,PPC44x_PTE_ADD_MASK_BIT,28
beq 2f /* Bail if no table */
- lwz r11,0(r12) /* Get high word of pte entry */
+#ifdef CONFIG_INVADER
+ lwz r11,4(r12) /* Get high word of pte entry */
+#else
+ lwz r11,0(r12) /* Get high word of pte entry */
+#endif
/* XXX can we do better ? maybe insert a known 0 bit from r11 into the
* bottom of r12 to create a data dependency... We can also use r10
* as destination nowadays
@@ -517,8 +532,12 @@
#ifdef CONFIG_SMP
lwsync
#endif
- lwz r12,4(r12) /* Get low word of pte entry */
+#ifdef CONFIG_INVADER
+ lwz r12,0(r12) /* Get low word of pte entry */
+#else
+ lwz r12,4(r12) /* Get low word of pte entry */
+#endif
andc. r13,r13,r12 /* Check permission */
/* Jump to common tlb load */
@@ -592,15 +611,23 @@
rlwimi r12,r10,PPC44x_PTE_ADD_SHIFT,PPC44x_PTE_ADD_MASK_BIT,28
beq 2f /* Bail if no table */
+#ifdef CONFIG_INVADER
+ lwz r11,4(r12) /* Get high word of pte entry */
+#else
lwz r11,0(r12) /* Get high word of pte entry */
+#endif
/* XXX can we do better ? maybe insert a known 0 bit from r11 into the
* bottom of r12 to create a data dependency... We can also use r10
* as destination nowadays
*/
-#ifdef CONFIG_SMP
+#ifndef CONFIG_SMP
lwsync
#endif
+#ifdef CONFIG_INVADER
+ lwz r11,0(r12) /* Get high word of pte entry */
+#else
lwz r12,4(r12) /* Get low word of pte entry */
+#endif
andc. r13,r13,r12 /* Check permission */
@@ -638,8 +665,12 @@
rlwimi r10,r12,29,30,30 /* DIRTY -> SW position */
and r11,r12,r10 /* Mask PTE bits to keep */
andi. r10,r12,_PAGE_USER /* User page ? */
+#ifdef CONFIG_INVADER
+ ori r11,r11,PPC47x_TLB2_E
+#endif
beq 1f /* nope, leave U bits empty */
rlwimi r11,r11,3,26,28 /* yes, copy S bits to U */
+
1: tlbwe r11,r13,2
/* Done...restore registers and get out of here.
@@ -935,6 +966,13 @@
*/
head_start_47x:
+// .align
+ nop
+ nop
+ nop
+
+ li r3, 0x3
+ rlwinm r23, r3, 1, 31, 31
/* Load our current PID->MMUCR TID and MSR IS->MMUCR STS */
mfspr r3,SPRN_PID /* Get PID */
mfmsr r4 /* Get MSR */
@@ -964,8 +1002,7 @@
clear_all_utlb_entries:
#; Set initial values.
-
- addis r3,0,0x8000
+ addis r3,0,0xa000 /* Invader change: quick fix?? */
addi r4,0,0
addi r5,0,0
b clear_utlb_entry
@@ -976,6 +1013,7 @@
clear_utlb_entry:
+// isync //not needed ??
tlbwe r4,r3,0
tlbwe r5,r3,1
tlbwe r5,r3,2
@@ -987,12 +1025,15 @@
cmpwi r4,0
bne clear_utlb_entry
- #; Restore original entry.
+ #; Restore original entry.
+#ifndef CONFIG_INVDER
+// Invader change
oris r23,r23,0x8000 /* specify the way */
tlbwe r24,r23,0
tlbwe r25,r23,1
tlbwe r26,r23,2
+#endif
/*
* Configure and load pinned entry into TLB for the kernel core
@@ -1018,7 +1059,12 @@
/* ERPN is 0 for first 4GB page */
/* Word 2 */
li r5,0
+#ifdef CONFIG_INVADER
+ ori r5,r5,(PPC47x_TLB2_S_RWX|PPC47x_TLB2_E)
+#else
ori r5,r5,PPC47x_TLB2_S_RWX
+#endif
+
#ifdef CONFIG_SMP
ori r5,r5,PPC47x_TLB2_M
#endif
@@ -1062,14 +1108,19 @@
/* Word 0 */
lis r3,PPC44x_EARLY_DEBUG_VIRTADDR@h
- ori r3,r3,PPC47x_TLB0_VALID | PPC47x_TLB0_TS | PPC47x_TLB0_1M
+ ori r3,r3, (PPC47x_TLB0_VALID | PPC47x_TLB0_TS | PPC47x_TLB0_1M)
/* Word 1 */
lis r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW@h
ori r4,r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH
- /* Word 2 */
+#ifdef CONFIG_INVADER
+ /* Removing M flag as there is no SMP support for now*/
+ li r5,(PPC47x_TLB2_S_RW | PPC47x_TLB2_I | PPC47x_TLB2_G | PPC47x_TLB2_E)
+
+#else
li r5,(PPC47x_TLB2_S_RW | PPC47x_TLB2_IMG)
+#endif
/* Bolted in way 0, bolt slot 5, we -hope- we don't hit the same
* congruence class as the kernel, we need to make sure of it at
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/irq.c ../linux-2.6.39.4/arch/powerpc/kernel/irq.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/irq.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/irq.c 2011-10-24 16:36:08.295113827 +0530
@@ -757,7 +757,11 @@
/* If host has no translation, then we assume interrupt line */
if (host->ops->xlate == NULL)
+#ifdef CONFIG_INVADER
+ hwirq = be32_to_cpu(intspec[0]);
+#else
hwirq = intspec[0];
+#endif
else {
if (host->ops->xlate(host, controller, intspec, intsize,
&hwirq, &type))
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/misc_32.S ../linux-2.6.39.4/arch/powerpc/kernel/misc_32.S
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/misc_32.S 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/misc_32.S 2011-10-26 15:51:22.562068744 +0530
@@ -60,6 +60,32 @@
/*
* This returns the high 64 bits of the product of two 64-bit numbers.
*/
+
+#ifdef CONFIG_INVADER
+_GLOBAL(mulhdu)
+ cmpwi r5,0
+ cmpwi cr1,r4,0
+ mr r10,r3
+ mulhwu r3,r3,r6
+ beq 1f
+ mulhwu r0,r10,r5
+ mullw r7,r10,r6
+ addc r7,r0,r7
+ addze r3,r3
+1: beqlr cr1 /* all done if high part of A is 0 */
+ mr r10,r4
+ mullw r9,r4,r6
+ mulhwu r4,r4,r6
+ beq 2f
+ mullw r0,r10,r5
+ mulhwu r8,r10,r5
+ addc r7,r0,r7
+ adde r3,r3,r8
+ addze r4,r4
+2: addc r3,r3,r9
+ addze r4,r4
+ blr
+#else
_GLOBAL(mulhdu)
cmpwi r6,0
cmpwi cr1,r3,0
@@ -83,6 +109,7 @@
2: addc r4,r4,r9
addze r3,r3
blr
+#endif
/*
* sub_reloc_offset(x) returns x - reloc_offset().
@@ -605,6 +632,42 @@
* lshrdi3: logical right shift
* ashldi3: left shift
*/
+#ifdef CONFIG_INVADER
+_GLOBAL(__ashrdi3)
+ subfic r6,r5,32
+ srw r3,r3,r5 # LSW = count > 31 ? 0 : LSW >> count
+ addi r7,r5,32 # could be xori, or addi with -32
+ slw r6,r4,r6 # t1 = count > 31 ? 0 : MSW << (32-count)
+ rlwinm r8,r7,0,32 # t3 = (count < 32) ? 32 : 0
+ sraw r7,r4,r7 # t2 = MSW >> (count-32)
+ or r3,r3,r6 # LSW |= t1
+ slw r7,r7,r8 # t2 = (count < 32) ? 0 : t2
+ sraw r4,r4,r5 # MSW = MSW >> count
+ or r3,r3,r7 # LSW |= t2
+ blr
+
+_GLOBAL(__ashldi3)
+ subfic r6,r5,32
+ slw r4,r4,r5 # MSW = count > 31 ? 0 : MSW << count
+ addi r7,r5,32 # could be xori, or addi with -32
+ srw r6,r3,r6 # t1 = count > 31 ? 0 : LSW >> (32-count)
+ slw r7,r3,r7 # t2 = count < 32 ? 0 : LSW << (count-32)
+ or r4,r4,r6 # MSW |= t1
+ slw r3,r3,r5 # LSW = LSW << count
+ or r4,r4,r7 # MSW |= t2
+ blr
+
+_GLOBAL(__lshrdi3)
+ subfic r6,r5,32
+ srw r3,r3,r5 # LSW = count > 31 ? 0 : LSW >> count
+ addi r7,r5,32 # could be xori, or addi with -32
+ slw r6,r4,r6 # t1 = count > 31 ? 0 : MSW << (32-count)
+ srw r7,r4,r7 # t2 = count < 32 ? 0 : MSW >> (count-32)
+ or r3,r3,r6 # LSW |= t1
+ srw r4,r4,r5 # MSW = MSW >> count
+ or r3,r3,r7 # LSW |= t2
+ blr
+#else
_GLOBAL(__ashrdi3)
subfic r6,r5,32
srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count
@@ -639,6 +702,7 @@
srw r3,r3,r5 # MSW = MSW >> count
or r4,r4,r7 # LSW |= t2
blr
+#endif
/*
* 64-bit comparison: __ucmpdi2(u64 a, u64 b)
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/module_32.c ../linux-2.6.39.4/arch/powerpc/kernel/module_32.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/module_32.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/module_32.c 2011-10-22 06:38:27.155103324 +0530
@@ -46,9 +46,15 @@
r_addend = 0;
for (i = 0; i < num; i++)
/* Only count 24-bit relocs, others don't need stubs */
+#ifdef CONFIG_INVADER
+ if ( ((ELF32_R_TYPE(rela[i].r_info) == R_PPC_REL24) && (ELF32_R_TYPE(rela[i].r_info) == R_PPC_REL14) &&
+ (r_info != ELF32_R_SYM(rela[i].r_info) ||
+ r_addend != rela[i].r_addend)) ) {
+#else
if (ELF32_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
(r_info != ELF32_R_SYM(rela[i].r_info) ||
r_addend != rela[i].r_addend)) {
+#endif
_count_relocs++;
r_info = ELF32_R_SYM(rela[i].r_info);
r_addend = rela[i].r_addend;
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/prom.c ../linux-2.6.39.4/arch/powerpc/kernel/prom.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/prom.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/prom.c 2011-10-22 12:32:28.777113831 +0530
@@ -103,6 +103,8 @@
memcpy(p, initial_boot_params, size);
initial_boot_params = (struct boot_param_header *)p;
DBG("Moved device tree to 0x%p\n", p);
+// invader debug
+ printk("Moved device tree to 0x%p\n", p);
}
DBG("<- move_device_tree\n");
@@ -300,7 +302,7 @@
*/
if (initial_boot_params && initial_boot_params->version >= 2) {
if (intserv[i] ==
- initial_boot_params->boot_cpuid_phys) {
+ be32_to_cpu(initial_boot_params->boot_cpuid_phys)) {
found = 1;
break;
}
@@ -344,8 +346,14 @@
* it uses 0x0f000001.
*/
prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
+ printk(KERN_DEBUG "INVADER PVR: 0x%x\n", be32_to_cpup(prop));
+#ifdef CONFIG_INVADER
+ if (prop && (be32_to_cpup(prop) & 0xff000000) == 0x0f000000)
+ identify_cpu(0, be32_to_cpup(prop));
+#else
if (prop && (*prop & 0xff000000) == 0x0f000000)
identify_cpu(0, *prop);
+#endif
identical_pvr_fixup(node);
}
@@ -478,6 +486,7 @@
if ((base + size) > 0x80000000ul)
size = 0x80000000ul - base;
}
+ printk(KERN_DEBUG "memblk Add1 base: 0x%llx, size: 0x%llx", base, size);
memblock_add(base, size);
} while (--rngs);
}
@@ -516,6 +525,7 @@
memstart_addr = min((u64)memstart_addr, base);
/* Add the chunk to the MEMBLOCK list */
+ printk(KERN_DEBUG "memblk Add2 base: 0x%llx, size: 0x%llx", base, size);
memblock_add(base, size);
}
@@ -541,12 +551,18 @@
unsigned long self_base;
unsigned long self_size;
+ // Invader Change
reserve_map = (u64 *)(((unsigned long)initial_boot_params) +
+#ifdef CONFIG_INVADER
+ be32_to_cpu(initial_boot_params->off_mem_rsvmap));
+#else
initial_boot_params->off_mem_rsvmap);
+#endif
/* before we do anything, lets reserve the dt blob */
self_base = __pa((unsigned long)initial_boot_params);
- self_size = initial_boot_params->totalsize;
+ self_size = be32_to_cpu(initial_boot_params->totalsize);
+
memblock_reserve(self_base, self_size);
#ifdef CONFIG_BLK_DEV_INITRD
@@ -560,13 +576,18 @@
* Handle the case where we might be booting from an old kexec
* image that setup the mem_rsvmap as pairs of 32-bit values
*/
- if (*reserve_map > 0xffffffffull) {
+ if (be64_to_cpu(*reserve_map) > 0xffffffffull) {
u32 base_32, size_32;
u32 *reserve_map_32 = (u32 *)reserve_map;
while (1) {
+#ifdef CONFIG_INVADER
+ base_32 = be32_to_cpu(*(reserve_map_32++));
+ size_32 = be32_to_cpu(*(reserve_map_32++));
+#else
base_32 = *(reserve_map_32++);
size_32 = *(reserve_map_32++);
+#endif
if (size_32 == 0)
break;
/* skip if the reservation is for the blob */
@@ -579,11 +600,17 @@
}
#endif
while (1) {
+// Invader Changes
+#ifdef CONFIG_INVADER
+ base = be64_to_cpu(*(reserve_map++));
+ size = be64_to_cpu(*(reserve_map++));
+#else
base = *(reserve_map++);
size = *(reserve_map++);
+#endif
if (size == 0)
break;
- DBG("reserving: %llx -> %llx\n", base, size);
+ DBG("reserving2: %llx -> %llx\n", base, size);
memblock_reserve(base, size);
}
}
@@ -912,8 +939,8 @@
{
struct dentry *d;
- flat_dt_blob.data = initial_boot_params;
- flat_dt_blob.size = initial_boot_params->totalsize;
+ flat_dt_blob.data = (initial_boot_params);
+ flat_dt_blob.size = be32_to_cpu(initial_boot_params->totalsize);
d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR,
powerpc_debugfs_root, &flat_dt_blob);
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/prom_init.c ../linux-2.6.39.4/arch/powerpc/kernel/prom_init.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/prom_init.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/prom_init.c 2011-10-22 06:38:27.610103651 +0530
@@ -789,7 +789,11 @@
} fake_elf = {
.elfhdr = {
.e_ident = { 0x7f, 'E', 'L', 'F',
+#ifdef CONFIG_INVADER
+ ELFCLASS32, ELFDATA2LSB, EV_CURRENT },
+#else
ELFCLASS32, ELFDATA2MSB, EV_CURRENT },
+#endif
.e_type = ET_EXEC, /* yeah right */
.e_machine = EM_PPC,
.e_version = EV_CURRENT,
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/vmlinux.lds.S ../linux-2.6.39.4/arch/powerpc/kernel/vmlinux.lds.S
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/kernel/vmlinux.lds.S 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/kernel/vmlinux.lds.S 2011-10-22 06:38:27.713103244 +0530
@@ -34,11 +34,15 @@
jiffies = jiffies_64;
#else
OUTPUT_ARCH(powerpc:common)
+#ifdef CONFIG_INVADER
jiffies = jiffies_64 + 4;
+#else
+jiffies = jiffies_64 + 4;
+#endif
#endif
SECTIONS
{
- . = 0;
+ . = 0x00;
reloc_start = .;
. = KERNELBASE;
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/lib/div64.S ../linux-2.6.39.4/arch/powerpc/lib/div64.S
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/lib/div64.S 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/lib/div64.S 2011-10-22 06:38:28.053112501 +0530
@@ -17,8 +17,13 @@
#include <asm/processor.h>
_GLOBAL(__div64_32)
+#ifdef CONFIG_INVADER
+ lwz r5,4(r3) # get the dividend into r5/r6
+ lwz r6,0(r3)
+#else
lwz r5,0(r3) # get the dividend into r5/r6
lwz r6,4(r3)
+#endif
cmplw r5,r4
li r7,0
li r8,0
@@ -53,7 +58,12 @@
mullw r10,r0,r4 # and get the remainder
add r8,r8,r0
subf r6,r10,r6
+#ifdef CONFIG_INVADER
+4: stw r7,4(r3) # return the quotient in *r3
+ stw r8,0(r3)
+#else
4: stw r7,0(r3) # return the quotient in *r3
stw r8,4(r3)
+#endif
mr r3,r6 # return the remainder in r3
blr
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/Makefile ../linux-2.6.39.4/arch/powerpc/Makefile
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/Makefile 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/Makefile 2011-10-22 06:42:29.464137538 +0530
@@ -17,8 +17,8 @@
# Set default 32 bits cross compilers for vdso and boot wrapper
CROSS32_COMPILE ?=
-CROSS32CC := $(CROSS32_COMPILE)gcc
-CROSS32AR := $(CROSS32_COMPILE)ar
+CROSS32CC := $(CROSS32_COMPILE)gcc -mlittle-endian -mno-mfcrf
+CROSS32AR := $(CROSS32_COMPILE)ar -EL
ifeq ($(HAS_BIARCH),y)
ifeq ($(CROSS32_COMPILE),)
@@ -57,9 +57,9 @@
UTS_MACHINE := $(OLDARCH)
ifeq ($(HAS_BIARCH),y)
-override AS += -a$(CONFIG_WORD_SIZE)
-override LD += -m elf$(CONFIG_WORD_SIZE)ppc
-override CC += -m$(CONFIG_WORD_SIZE)
+override AS += -a$(CONFIG_WORD_SIZE) -mlittle-endian
+override LD += -m elf$(CONFIG_WORD_SIZE)ppc -EL
+override CC += -m$(CONFIG_WORD_SIZE) -mlittle-endian -mno-mfcrf
override AR := GNUTARGET=elf$(CONFIG_WORD_SIZE)-powerpc $(AR)
endif
@@ -68,10 +68,10 @@
LDFLAGS_vmlinux := $(LDFLAGS_vmlinux-yy)
CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=none -mcall-aixdesc
-CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple
+CFLAGS-$(CONFIG_PPC32) := -ffixed-r2
KBUILD_CPPFLAGS += -Iarch/$(ARCH)
KBUILD_AFLAGS += -Iarch/$(ARCH)
-KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y)
+KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y)
CPP = $(CC) -E $(KBUILD_CFLAGS)
CHECKFLAGS += -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)__
@@ -119,7 +119,7 @@
# Never use string load/store instructions as they are
# often slow when they are implemented at all
-KBUILD_CFLAGS += -mno-string
+#KBUILD_CFLAGS += -mno-string
ifeq ($(CONFIG_6xx),y)
KBUILD_CFLAGS += -mcpu=powerpc
@@ -130,7 +130,7 @@
KBUILD_CFLAGS += -mno-sched-epilog
endif
-cpu-as-$(CONFIG_4xx) += -Wa,-m405
+cpu-as-$(CONFIG_4xx) += -Wa,-m440
cpu-as-$(CONFIG_6xx) += -Wa,-maltivec
cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec
cpu-as-$(CONFIG_E500) += -Wa,-me500
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/mm/44x_mmu.c ../linux-2.6.39.4/arch/powerpc/mm/44x_mmu.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/mm/44x_mmu.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/mm/44x_mmu.c 2011-10-24 17:26:29.012226884 +0530
@@ -165,7 +165,12 @@
"tlbwe %0,%3,2\n"
:
: "r" (PPC47x_TLB2_SW | PPC47x_TLB2_SR |
+#ifdef CONFIG_INVADER
+ PPC47x_TLB2_SX | PPC47x_TLB2_E
+#else
PPC47x_TLB2_SX
+#endif
+
#ifdef CONFIG_SMP
| PPC47x_TLB2_M
#endif
@@ -223,6 +228,7 @@
*/
BUG_ON(first_memblock_base != 0);
+ printk(KERN_DEBUG "setup_initial_memory_limit: 0x%llx, 0x%llx\n", first_memblock_base, first_memblock_size);
/* 44x has a 256M TLB entry pinned at boot */
memblock_set_current_limit(min_t(u64, first_memblock_size, PPC_PIN_SIZE));
}
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/invader/invader_setup.c ../linux-2.6.39.4/arch/powerpc/platforms/invader/invader_setup.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/invader/invader_setup.c 1970-01-01 05:30:00.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/platforms/invader/invader_setup.c 2011-10-24 15:53:49.024532082 +0530
@@ -0,0 +1,87 @@
+/*
+ LSI HEADER ???
+*/
+
+#include <linux/init.h>
+#include <linux/of_platform.h>
+
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/time.h>
+#include <asm/mpic.h>
+#include <asm/ppc4xx.h>
+#include <asm/irq.h>
+#include <asm/pci-bridge.h>
+
+#define DEBUG 1
+
+static struct of_device_id invader_of_bus_ids[] = {
+ { .compatible = "ibm,plb6", },
+ { .compatible = "simple-bus", },
+ { .compatible = "chrp,open-pic", },
+ {},
+};
+
+static int __init invader_device_probe(void)
+{
+ of_platform_bus_probe(NULL, invader_of_bus_ids, NULL);
+
+ return 0;
+}
+machine_device_initcall(invader, invader_device_probe);
+
+static int __init invader_probe(void)
+{
+ unsigned long root = of_get_flat_dt_root();
+
+ if (!of_flat_dt_is_compatible(root, "LSI,Invader"))
+ return 0;
+
+ ppc_pci_set_flags(PPC_PCI_REASSIGN_ALL_RSRC);
+
+ return 1;
+}
+
+static void __init invader_init_irq(void)
+{
+ struct mpic *mpic;
+ struct resource r;
+ struct device_node *np = NULL;
+
+ /* Find top level interrupt controller */
+ for_each_node_with_property(np, "interrupt-controller") {
+ if (of_get_property(np, "interrupts", NULL) == NULL)
+ break;
+ }
+ if (np == NULL)
+ panic("Invader: Can't find top level interrupt controller");
+
+ if (of_device_is_compatible(np, "chrp,open-pic")) {
+ /* The MPIC driver will get everything it needs from the
+ * device-tree, just pass 0 to all arguments
+ */
+ mpic = mpic_alloc(np, 0, MPIC_PRIMARY|MPIC_WANTS_RESET, 0, 0, " MPIC ");
+ BUG_ON(mpic == NULL);
+ mpic_init(mpic);
+ ppc_md.get_irq = mpic_get_irq;
+ } else
+ panic("Invader: Unrecognized top level interrupt controller");
+
+ printk("\n\n\t\t\tMPIC initialized\n\n\n");
+}
+
+static void __init invader_progress(char *s, unsigned short hex)
+{
+ printk("*** %04x : %s\n", hex, s ? s : "");
+}
+
+define_machine(invader) {
+ .name = "Invader",
+ .probe = invader_probe,
+ .progress = invader_progress,
+ .init_IRQ = invader_init_irq,
+ .get_irq = mpic_get_irq,
+ .calibrate_decr = generic_calibrate_decr,
+ .restart = ppc4xx_reset_system,
+};
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/invader/Kconfig ../linux-2.6.39.4/arch/powerpc/platforms/invader/Kconfig
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/invader/Kconfig 1970-01-01 05:30:00.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/platforms/invader/Kconfig 2011-10-22 06:38:25.833134467 +0530
@@ -0,0 +1,8 @@
+config INVADER
+ bool "Invader"
+ depends on PPC_47x
+ help
+ This option enabled support for LSI PPC476 "Invader"
+ evaluation board.
+
+
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/invader/Makefile ../linux-2.6.39.4/arch/powerpc/platforms/invader/Makefile
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/invader/Makefile 1970-01-01 05:30:00.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/platforms/invader/Makefile 2011-10-22 06:38:25.828374811 +0530
@@ -0,0 +1 @@
+obj-$(CONFIG_INVADER) += invader_setup.o
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/Kconfig ../linux-2.6.39.4/arch/powerpc/platforms/Kconfig
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/Kconfig 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/platforms/Kconfig 2011-10-22 06:38:26.083147732 +0530
@@ -20,6 +20,7 @@
source "arch/powerpc/platforms/44x/Kconfig"
source "arch/powerpc/platforms/40x/Kconfig"
source "arch/powerpc/platforms/amigaone/Kconfig"
+source "arch/powerpc/platforms/invader/Kconfig"
config KVM_GUEST
bool "KVM Guest support"
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/Makefile ../linux-2.6.39.4/arch/powerpc/platforms/Makefile
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/platforms/Makefile 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/platforms/Makefile 2011-10-22 06:38:25.910151396 +0530
@@ -22,3 +22,4 @@
obj-$(CONFIG_PPC_PS3) += ps3/
obj-$(CONFIG_EMBEDDED6xx) += embedded6xx/
obj-$(CONFIG_AMIGAONE) += amigaone/
+obj-$(CONFIG_INVADER) += invader/
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/sysdev/dcr.c ../linux-2.6.39.4/arch/powerpc/sysdev/dcr.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/sysdev/dcr.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/sysdev/dcr.c 2011-10-24 16:41:24.331106125 +0530
@@ -133,7 +133,12 @@
if (dr == NULL || ds & 1 || index >= (ds / 8))
return 0;
+ printk(KERN_DEBUG " dcr-reg: 0x%x", be32_to_cpu(dr[index * 2]));
+#ifdef CONFIG_INVADER
+ return be32_to_cpu(dr[index * 2]);
+#else
return dr[index * 2];
+#endif
}
EXPORT_SYMBOL_GPL(dcr_resource_start);
@@ -145,7 +150,12 @@
if (dr == NULL || ds & 1 || index >= (ds / 8))
return 0;
+ printk(KERN_DEBUG " dcr-reg2: 0x%x", be32_to_cpu(dr[index * 2]+1));
+#ifdef CONFIG_INVADER
+ return be32_to_cpu(dr[index * 2 + 1]);
+#else
return dr[index * 2 + 1];
+#endif
}
EXPORT_SYMBOL_GPL(dcr_resource_len);
@@ -177,6 +187,8 @@
/* Maybe could do some better range checking here */
ret = of_translate_address(dp, p);
+
+ printk(KERN_DEBUG " translate-dcr-reg: 0x%llx", ret);
if (ret != OF_BAD_ADDR)
ret += (u64)(stride) * (u64)dcr_n;
if (out_stride)
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/sysdev/mpic.c ../linux-2.6.39.4/arch/powerpc/sysdev/mpic.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/sysdev/mpic.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/sysdev/mpic.c 2011-10-25 18:07:53.637770104 +0530
@@ -296,7 +296,7 @@
dbasep = of_get_property(node, "dcr-reg", NULL);
- rb->dhost = dcr_map(node, *dbasep + offset, size);
+ rb->dhost = dcr_map(node, be32_to_cpup(dbasep) + offset, size);
BUG_ON(!DCR_MAP_OK(rb->dhost));
}
@@ -1179,8 +1179,9 @@
*/
if (paddr == 0 && !(mpic->flags & MPIC_USES_DCR)) {
const u32 *reg = of_get_property(node, "reg", NULL);
+ printk(KERN_DEBUG "mpic: reg: 0x%x\n", *reg);
BUG_ON(reg == NULL);
- paddr = of_translate_address(node, reg);
+ paddr = be32_to_cpu(of_translate_address(node, reg));
BUG_ON(paddr == OF_BAD_ADDR);
}
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/sysdev/ppc4xx_soc.c ../linux-2.6.39.4/arch/powerpc/sysdev/ppc4xx_soc.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/arch/powerpc/sysdev/ppc4xx_soc.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/arch/powerpc/sysdev/ppc4xx_soc.c 2011-10-25 18:04:40.509769915 +0530
@@ -93,7 +93,11 @@
of_node_put(np);
return -ENODEV;
}
+#ifdef CONFIG_INVADER
+ l2_size = be32_to_cpu(prop[0]);
+#else
l2_size = prop[0];
+#endif
/* Map DCRs */
dcrreg = of_get_property(np, "dcr-reg", &len);
@@ -103,8 +107,13 @@
of_node_put(np);
return -ENODEV;
}
+#ifdef CONFIG_INVADER
+ dcrbase_isram = be32_to_cpu(dcrreg[0]);
+ dcrbase_l2c = be32_to_cpu(dcrreg[2]);
+#else
dcrbase_isram = dcrreg[0];
dcrbase_l2c = dcrreg[2];
+#endif
/* Get and map irq number from device tree */
irq = irq_of_parse_and_map(np, 0);
@@ -199,6 +208,7 @@
struct device_node *np;
u32 reset_type = DBCR0_RST_SYSTEM;
const u32 *prop;
+ u32 propVal=0;
np = of_find_node_by_type(NULL, "cpu");
if (np) {
@@ -210,8 +220,17 @@
* 2 - PPC4xx chip reset
* 3 - PPC4xx system reset (default)
*/
+#ifdef CONFIG_INVADER
+ if (prop)
+ {
+ propVal = be32_to_cpup(prop);
+ if (((propVal>= 1) && (propVal <= 3)))
+ reset_type = propVal << 28;
+ }
+#else
if ((prop) && ((prop[0] >= 1) && (prop[0] <= 3)))
reset_type = prop[0] << 28;
+#endif
}
mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | reset_type);
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/fs/ext2/balloc.c ../linux-2.6.39.4/fs/ext2/balloc.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/fs/ext2/balloc.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/fs/ext2/balloc.c 2011-10-22 06:38:04.625107806 +0530
@@ -18,6 +18,9 @@
#include <linux/buffer_head.h>
#include <linux/capability.h>
+#ifdef CONFIG_INVADER
+//#include <asm-generic/bitops/le.h>
+#endif
/*
* balloc.c contains the blocks allocation and deallocation routines
*/
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/include/asm-generic/bitops/non-atomic.h ../linux-2.6.39.4/include/asm-generic/bitops/non-atomic.h
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/include/asm-generic/bitops/non-atomic.h 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/include/asm-generic/bitops/non-atomic.h 2011-10-22 12:40:27.954406170 +0530
@@ -105,4 +105,25 @@
return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
}
+static inline int test_bit_dbg(int nr, const volatile unsigned long *addr, volatile unsigned long *ret, volatile unsigned long *ret1, volatile unsigned long *ret2)
+{
+ if(ret)
+ *ret = (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+
+ if (ret1)
+ *ret1 = 1UL&(*ret);
+
+ if (ret2)
+ *ret2 = 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+
+#ifdef CONFIG_INVADER
+ return (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+#else
+ return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+#endif
+}
+
+
+
+
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/init/main.c ../linux-2.6.39.4/init/main.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/init/main.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/init/main.c 2011-10-30 14:04:41.250103375 +0530
@@ -664,7 +664,8 @@
int count = preempt_count();
int ret;
- if (initcall_debug)
+// if (initcall_debug)
+ if (1)
ret = do_one_initcall_debug(fn);
else
ret = fn();
@@ -729,6 +730,7 @@
static void run_init_process(const char *init_filename)
{
argv_init[0] = init_filename;
+ printk(KERN_DEBUG "RUNNING run_init_process %s\n", init_filename);
kernel_execve(init_filename, argv_init, envp_init);
}
@@ -747,6 +749,7 @@
current->signal->flags |= SIGNAL_UNKILLABLE;
+ printk(KERN_DEBUG "ramdisk_execute_command: %s, execute_command: %s\n",ramdisk_execute_command ,execute_command);
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command);
printk(KERN_WARNING "Failed to execute %s\n",
@@ -765,10 +768,10 @@
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
- run_init_process("/etc/init");
+/* run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
-
+*/
panic("No init found. Try passing init= option to kernel. "
"See Linux Documentation/init.txt for guidance.");
}
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/kernel/printk.c ../linux-2.6.39.4/kernel/printk.c
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/kernel/printk.c 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/kernel/printk.c 2011-10-24 11:52:01.814164824 +0530
@@ -1485,7 +1485,9 @@
}
console_unlock();
console_sysfs_notify();
-
+#ifdef CONFIG_INVADER
+ keep_bootcon = 1;
+#endif
/*
* By unregistering the bootconsoles after we enable the real console
* we get the "console xxx enabled" message on all the consoles -
diff -uNr ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/Makefile ../linux-2.6.39.4/Makefile
--- ../../../crosscompiler_with_gdb_c_c++_objc/work/linux-2.6.39.4/Makefile 2011-08-04 01:13:28.000000000 +0530
+++ ../linux-2.6.39.4/Makefile 2011-10-22 06:39:21.397105230 +0530
@@ -237,6 +237,7 @@
HOSTCC = gcc
HOSTCXX = g++
+#Invader Changes
HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
HOSTCXXFLAGS = -O2
@@ -320,9 +321,9 @@
# Make variables (CC, etc...)
-AS = $(CROSS_COMPILE)as
-LD = $(CROSS_COMPILE)ld
-CC = $(CROSS_COMPILE)gcc
+AS = $(CROSS_COMPILE)as -mlittle-endian
+LD = $(CROSS_COMPILE)ld -EL
+CC = $(CROSS_COMPILE)gcc -mlittle-endian -mno-mfcrf
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
@@ -359,10 +360,12 @@
-fno-strict-aliasing -fno-common \
-Werror-implicit-function-declaration \
-Wno-format-security \
- -fno-delete-null-pointer-checks
+ -fno-delete-null-pointer-checks \
+ -mlittle-endian \
+ -fsigned-char
KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=
-KBUILD_AFLAGS := -D__ASSEMBLY__
+KBUILD_AFLAGS := -D__ASSEMBLY__ -mlittle-endian
KBUILD_AFLAGS_MODULE := -DMODULE
KBUILD_CFLAGS_MODULE := -DMODULE
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
@@ -545,6 +548,7 @@
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS += -Os
else
+#Invader Changes
KBUILD_CFLAGS += -O2
endif
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-11-01 3:02 ` Santosh Kumar
@ 2011-11-01 13:44 ` Peter Bergner
2011-11-01 17:14 ` Santosh Kumar
0 siblings, 1 reply; 11+ messages in thread
From: Peter Bergner @ 2011-11-01 13:44 UTC (permalink / raw)
To: Santosh Kumar
Cc: Benjamin Herrenschmidt, linuxppc-dev, Michael Neuling, Ian Munsie,
linux-kernel
On Tue, 2011-11-01 at 08:32 +0530, Santosh Kumar wrote:
> I am using the same compiler as 476 & 440 instruction is almost the same.
Well the 476 implements ISA 2.05, which I think has added a fair amount
over the 440. Not to mention the 476 core that has been released has
a FP unit. I'll note that GCC has support for a 476 with and without
a FP unit, even though AFAIK, we only ship one with a FP unit.
The relevant options are -mcpu=476 (no FP unit) and -mcpu=476fp
(with FP unit). Basically, -mcpu=476 is equivalent to
-mcpu=476fp -msoft-float.
> @@ -53,7 +58,12 @@
> mullw r10,r0,r4 # and get the remainder
> add r8,r8,r0
> subf r6,r10,r6
> +#ifdef CONFIG_INVADER
> 4: stw r7,0(r3) # return the quotient in *r3
> stw r8,4(r3)
> +#else
> +4: stw r7,0(r3) # return the quotient in *r3
> + stw r8,4(r3)
> +#endif
> mr r3,r6 # return the remainder in r3
> blr
This looks like a typo, since you didn't actually swap the offsets
on the stw's like you did in all of the other patch hunks.
Peter
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-11-01 13:44 ` Peter Bergner
@ 2011-11-01 17:14 ` Santosh Kumar
2011-11-01 18:44 ` Peter Bergner
0 siblings, 1 reply; 11+ messages in thread
From: Santosh Kumar @ 2011-11-01 17:14 UTC (permalink / raw)
To: Peter Bergner
Cc: Benjamin Herrenschmidt, linuxppc-dev, Michael Neuling, Ian Munsie,
linux-kernel
> The relevant options are -mcpu=476 (no FP unit) and -mcpu=476fp> (with FP unit). Basically, -mcpu=476 is equivalent to> -mcpu=476fp -msoft-float.
Yes what you have mentioned is right.
I had a problem configuring the GCC for 476 in little endian mode,
therefore I am using 440 compiler. As this compiler doesn't accept
-mcpu=476 i am using -mcpu=440.
So is this PTE fault related to the compiler options?
Thanks,
Santosh Kumar .A
On 1 November 2011 19:14, Peter Bergner <bergner@vnet.ibm.com> wrote:
> On Tue, 2011-11-01 at 08:32 +0530, Santosh Kumar wrote:
>> I am using the same compiler as 476 & 440 instruction is almost the same.
>
> Well the 476 implements ISA 2.05, which I think has added a fair amount
> over the 440. Not to mention the 476 core that has been released has
> a FP unit. I'll note that GCC has support for a 476 with and without
> a FP unit, even though AFAIK, we only ship one with a FP unit.
> The relevant options are -mcpu=476 (no FP unit) and -mcpu=476fp
> (with FP unit). Basically, -mcpu=476 is equivalent to
> -mcpu=476fp -msoft-float.
>
>
>
>> @@ -53,7 +58,12 @@
>> mullw r10,r0,r4 # and get the remainder
>> add r8,r8,r0
>> subf r6,r10,r6
>> +#ifdef CONFIG_INVADER
>> 4: stw r7,0(r3) # return the quotient in *r3
>> stw r8,4(r3)
>> +#else
>> +4: stw r7,0(r3) # return the quotient in *r3
>> + stw r8,4(r3)
>> +#endif
>> mr r3,r6 # return the remainder in r3
>> blr
>
> This looks like a typo, since you didn't actually swap the offsets
> on the stw's like you did in all of the other patch hunks.
>
>
> Peter
>
>
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: powerpc 476, Little-endian, pte fault
2011-11-01 17:14 ` Santosh Kumar
@ 2011-11-01 18:44 ` Peter Bergner
0 siblings, 0 replies; 11+ messages in thread
From: Peter Bergner @ 2011-11-01 18:44 UTC (permalink / raw)
To: Santosh Kumar
Cc: Benjamin Herrenschmidt, linuxppc-dev, Michael Neuling, Ian Munsie,
linux-kernel
On Tue, 2011-11-01 at 22:44 +0530, Santosh Kumar wrote:
> I had a problem configuring the GCC for 476 in little endian mode,
What type of problem? I assume the binutils you are building
against has 476 support too, correct? You'll need that.
> So is this PTE fault related to the compiler options?
This could be caused by anything, but I highly doubt this is
caused by a compiler option issue. My $$ are that you either
have a bug in your kernel patch or there are more places in
the kernel source that need patching.
Peter
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-11-01 18:55 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-31 5:30 powerpc 476, Little-endian, pte fault Santosh Kumar
2011-10-31 5:51 ` Michael Neuling
[not found] ` <CAJw04pAh5QDQMkUHbj9=rRPiUCZejimHiydCJFMAoZeSd_ydhA@mail.gmail.com>
2011-10-31 7:38 ` Santosh Kumar
2011-10-31 9:49 ` Michael Neuling
2011-10-31 11:23 ` Benjamin Herrenschmidt
2011-11-01 3:02 ` Santosh Kumar
2011-11-01 13:44 ` Peter Bergner
2011-11-01 17:14 ` Santosh Kumar
2011-11-01 18:44 ` Peter Bergner
2011-10-31 7:48 ` Shan Hai
2011-10-31 9:17 ` Santosh Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox