* kernel oops due to unaligned access with lswi
@ 2003-11-15 21:04 Olaf Hering
2003-11-15 22:24 ` Olaf Hering
2003-11-16 0:40 ` Paul Mackerras
0 siblings, 2 replies; 24+ messages in thread
From: Olaf Hering @ 2003-11-15 21:04 UTC (permalink / raw)
To: Alan Modra; +Cc: linuxppc-dev
Alan,
2.6 has a function parse_header(), its part of gunzip and used for
initramfs as example. I got an oops, exception 600, sig 7. I think that
means unaligned access.
Why does the compiler optimize this one? I see it with 2.95, 3.2, 3.3
and 3.4 with -O1 and better, not with -O0.
gcc -msoft-float -mmultiple -mstring -O2 -Wall -Wstrict-prototypes \
-Wno-trigraphs -Wno-uninitialized -version -fno-strict-aliasing \
-fno-common -ffixed-r2 -fomit-frame-pointer -o parse_header \
-c parse_header.c -v --save-temps
lswi 9,31,8
stswi 9,28,8
s = r31. How can gcc be sure that s aligned?
ppc64 will call memcpy (tested with gcc3.2.3).
.file "parse_header.c"
.section .init.text,"ax",@progbits
.align 2
.type parse_header,@function
parse_header:
stwu 1,-112(1)
mflr 0
stmw 27,92(1)
stw 0,116(1)
li 0,0
stb 0,64(1)
li 30,0
addi 31,3,6
addi 28,1,56
addi 27,1,8
.L6:
lswi 9,31,8
stswi 9,28,8
slwi 29,30,2
mr 3,28
li 4,0
li 5,16
bl simple_strtoul
stwx 3,29,27
addi 30,30,1
addi 31,31,8
cmpwi 0,30,11
ble+ 0,.L6
lwz 0,116(1)
mtlr 0
lmw 27,92(1)
addi 1,1,112
blr
.Lfe1:
.size parse_header,.Lfe1-parse_header
.section ".text"
.align 2
.globl main
.type main,@function
main:
stwu 1,-16(1)
mflr 0
stw 0,20(1)
lis 3,0x1
ori 3,3,57920
bl malloc
bl parse_header
li 3,0
lwz 0,20(1)
mtlr 0
addi 1,1,16
blr
.Lfe2:
.size main,.Lfe2-main
.ident "GCC: (GNU) 3.2.3 (SuSE Linux)"
#include <stdlib.h>
typedef unsigned int __kernel_size_t;
extern void *memcpy(void *, const void *, __kernel_size_t);
extern unsigned long simple_strtoul(const char *, char **, unsigned int);
static void __attribute__ ((__section__(".init.text"))) parse_header(char *s)
{
unsigned long parsed[12];
char buf[9];
int i;
buf[8] = '\0';
for (i = 0, s += 6; i < 12; i++, s += 8) {
memcpy(buf, s, 8);
parsed[i] = simple_strtoul(buf, ((void *) 0), 16);
}
}
int
main(void)
{
char *s;
s = malloc(123456);
parse_header(s);
return 0;
}
--
USB is for mice, FireWire is for men!
sUse lINUX ag, nÜRNBERG
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 24+ messages in thread* Re: kernel oops due to unaligned access with lswi 2003-11-15 21:04 kernel oops due to unaligned access with lswi Olaf Hering @ 2003-11-15 22:24 ` Olaf Hering 2003-11-15 22:30 ` David Edelsohn 2003-11-16 0:40 ` Paul Mackerras 1 sibling, 1 reply; 24+ messages in thread From: Olaf Hering @ 2003-11-15 22:24 UTC (permalink / raw) To: Alan Modra; +Cc: linuxppc-dev On Sat, Nov 15, Olaf Hering wrote: > > Alan, > > 2.6 has a function parse_header(), its part of gunzip and used for > initramfs as example. I got an oops, exception 600, sig 7. I think that > means unaligned access. This might be a useable workaround. --- ../linuxppc-2.5_2.6.0-test9-bk.orig/init/initramfs.c 2003-10-18 17:25:50.000000000 +0200 +++ init/initramfs.c 2003-11-15 23:09:57.000000000 +0100 @@ -100,11 +100,11 @@ static void __init parse_header(char *s) { unsigned long parsed[12]; char buf[9]; - int i; + int i, j = 1; buf[8] = '\0'; for (i = 0, s += 6; i < 12; i++, s += 8) { - memcpy(buf, s, 8); + memcpy(buf, s, 7 + j); /* s might be unaligned, gcc will optimized the call to lswi on ppc */ parsed[i] = simple_strtoul(buf, NULL, 16); } ino = parsed[0]; -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-15 22:24 ` Olaf Hering @ 2003-11-15 22:30 ` David Edelsohn 2003-11-15 22:37 ` Olaf Hering 2003-11-15 22:43 ` Olaf Hering 0 siblings, 2 replies; 24+ messages in thread From: David Edelsohn @ 2003-11-15 22:30 UTC (permalink / raw) To: Olaf Hering; +Cc: Alan Modra, linuxppc-dev >>>>> Olaf Hering writes: Olaf> 2.6 has a function parse_header(), its part of gunzip and used for Olaf> initramfs as example. I got an oops, exception 600, sig 7. I think that Olaf> means unaligned access. Olaf> + memcpy(buf, s, 7 + j); /* s might be unaligned, gcc will optimized the call to lswi on ppc */ lswi specifically accepts unaligned addresses. david ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-15 22:30 ` David Edelsohn @ 2003-11-15 22:37 ` Olaf Hering 2003-11-15 22:43 ` Olaf Hering 1 sibling, 0 replies; 24+ messages in thread From: Olaf Hering @ 2003-11-15 22:37 UTC (permalink / raw) To: David Edelsohn; +Cc: Alan Modra, linuxppc-dev On Sat, Nov 15, David Edelsohn wrote: > >>>>> Olaf Hering writes: > > Olaf> 2.6 has a function parse_header(), its part of gunzip and used for > Olaf> initramfs as example. I got an oops, exception 600, sig 7. I think that > Olaf> means unaligned access. > > Olaf> + memcpy(buf, s, 7 + j); /* s might be unaligned, gcc will optimized the call to lswi on ppc */ > > lswi specifically accepts unaligned addresses. Thanks. Then the bug is somewhere else, because it crashes like this if I use '8' instead of '7 + j' (no memcpy call): Calibrating delay loop... 89.49 BogoMIPS Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Serial port locked ON by debugger ! vector: 600 at pc = c025bf14, lr = c025bf20 msr = 9030, sp = c02598c0 [c0259810] dar = c043cffa, dsisr = a53f current = c02191c8, pid = 0, comm = swapper mon> di c025bf14 c025bf14 7d3f44aa lswi r9,r31,8 c025bf18 7d3c45aa stswi r9,r28,8 c025bf1c 4be62ee1 bl 0xc00bedfc c025bf20 2c1e000b cmpwi r30,11 c025bf24 3bff0008 addi r31,r31,8 c025bf28 7c7dd92e stwx r3,r29,r27 c025bf2c 4081ffd4 ble 0xc025bf00 c025bf30 8001002c lwz r0,44(r1) c025bf34 81210030 lwz r9,48(r1) c025bf38 5400a016 rlwinm r0,r0,20,0,11 c025bf3c 81610008 lwz r11,8(r1) c025bf40 7c004b78 or r0,r0,r9 c025bf44 5409a32e rlwinm r9,r0,20,12,23 c025bf48 540a063e clrlwi r10,r0,24 c025bf4c 7d4a4b78 or r10,r10,r9 c025bf50 54006016 rlwinm r0,r0,12,0,11 mon> r R00 = 00000008 R01 = c02598c0 R02 = c02191c8 R03 = c02598f8 R04 = 00000000 R05 = 00000010 R06 = c043cfb1 R07 = 00000001 R08 = 00000000 R09 = c02224f4 R10 = ffffffd0 R11 = 00000000 R12 = 00014fac R13 = deadbeef R14 = deadbeef R15 = deadbeef R16 = deadbeef R17 = deadbeef R18 = deadbeef R19 = deadbeef R20 = 0000003f R21 = 000001ff R22 = c47f1408 R23 = c032e008 R24 = 00000006 R25 = 00000009 R26 = 0000000f R27 = c02598c8 R28 = c02598f8 R29 = 00000024 R30 = 0000000a R31 = c043cffa pc = c025bf14 msr = 00009030 lr = c025bf20 cr = 95000053 ctr = 00000000 xer = c000be6f trap = 600 mon> pmac 7200/90 with 601 cpu. -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-15 22:30 ` David Edelsohn 2003-11-15 22:37 ` Olaf Hering @ 2003-11-15 22:43 ` Olaf Hering 2003-11-15 22:59 ` David Edelsohn 1 sibling, 1 reply; 24+ messages in thread From: Olaf Hering @ 2003-11-15 22:43 UTC (permalink / raw) To: David Edelsohn; +Cc: Alan Modra, linuxppc-dev On Sat, Nov 15, David Edelsohn wrote: > >>>>> Olaf Hering writes: > > Olaf> 2.6 has a function parse_header(), its part of gunzip and used for > Olaf> initramfs as example. I got an oops, exception 600, sig 7. I think that > Olaf> means unaligned access. > > Olaf> + memcpy(buf, s, 7 + j); /* s might be unaligned, gcc will optimized the call to lswi on ppc */ > > lswi specifically accepts unaligned addresses. The asm diff looks like that: --- initramfs-8.s 2003-11-15 23:41:12.000000000 +0100 +++ initramfs-7+j.s 2003-11-15 23:41:36.000000000 +0100 @@ -165,16 +165,18 @@ addi 28,1,56 addi 27,1,8 .L85: + mr 4,31 + li 5,8 + mr 3,28 slwi 29,30,2 + bl memcpy + addi 30,30,1 mr 3,28 li 4,0 li 5,16 - addi 30,30,1 - lswi 9,31,8 - stswi 9,28,8 + addi 31,31,8 bl simple_strtoul cmpwi 0,30,11 - addi 31,31,8 stwx 3,29,27 ble+ 0,.L85 lwz 0,44(1) -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-15 22:43 ` Olaf Hering @ 2003-11-15 22:59 ` David Edelsohn 2003-11-16 10:17 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 24+ messages in thread From: David Edelsohn @ 2003-11-15 22:59 UTC (permalink / raw) To: Olaf Hering; +Cc: Alan Modra, linuxppc-dev I didn't mean that lswi cannot take an alignment exception on some PPC implementations, but that lswi is suppose to be able to handle block loads from addresses with arbitrary alignment. David ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-15 22:59 ` David Edelsohn @ 2003-11-16 10:17 ` Benjamin Herrenschmidt 2003-11-16 17:49 ` Kumar Gala 2003-11-16 23:04 ` David Edelsohn 0 siblings, 2 replies; 24+ messages in thread From: Benjamin Herrenschmidt @ 2003-11-16 10:17 UTC (permalink / raw) To: David Edelsohn; +Cc: Olaf Hering, Alan Modra, linuxppc-dev list On Sun, 2003-11-16 at 09:59, David Edelsohn wrote: > I didn't mean that lswi cannot take an alignment exception on some > PPC implementations, but that lswi is suppose to be able to handle block > loads from addresses with arbitrary alignment I remember beeing regulary told (I think by Apple while I was still doing MacOS hacking) that those string instructions were evil, deprecated, and should be avoided as they weren't peforming better than the equivalent set of load/store instructions... Is this still true ? In which case we may want to avoid generating them from gcc.. Also, if the 601 effectively gets alignement exceptions on these, it's quite bad to have them implicitely generated by gcc for memcpy's since our OFs seem to not implement the alignement handler for them, thus breaking our boot wrappers. Finally, the pem32b at least seem to be clear about not encouraging to use these especially on non-aligned accesses. It looks like a weird optimisation to do for memcpy... Ben. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 10:17 ` Benjamin Herrenschmidt @ 2003-11-16 17:49 ` Kumar Gala 2003-11-16 22:19 ` Alan Modra 2003-11-16 23:12 ` Benjamin Herrenschmidt 2003-11-16 23:04 ` David Edelsohn 1 sibling, 2 replies; 24+ messages in thread From: Kumar Gala @ 2003-11-16 17:49 UTC (permalink / raw) To: benh; +Cc: Olaf Hering, linuxppc-dev list, Alan Modra, David Edelsohn If Ben's comments are correct simply removing -mstring as an option passed to the build should get the desired behavior. - kumar On Nov 16, 2003, at 4:17 AM, Benjamin Herrenschmidt wrote: > > On Sun, 2003-11-16 at 09:59, David Edelsohn wrote: >> I didn't mean that lswi cannot take an alignment exception on some >> PPC implementations, but that lswi is suppose to be able to handle >> block >> loads from addresses with arbitrary alignment > > I remember beeing regulary told (I think by Apple while I was still > doing MacOS hacking) that those string instructions were evil, > deprecated, and should be avoided as they weren't peforming better > than the equivalent set of load/store instructions... Is this > still true ? In which case we may want to avoid generating them > from gcc.. > > Also, if the 601 effectively gets alignement exceptions on these, > it's quite bad to have them implicitely generated by gcc for memcpy's > since our OFs seem to not implement the alignement handler for them, > thus breaking our boot wrappers. > > Finally, the pem32b at least seem to be clear about not encouraging > to use these especially on non-aligned accesses. It looks like a > weird optimisation to do for memcpy... > > Ben. > > ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 17:49 ` Kumar Gala @ 2003-11-16 22:19 ` Alan Modra 2003-11-16 22:45 ` Jon Masters 2003-11-17 0:50 ` Paul Mackerras 2003-11-16 23:12 ` Benjamin Herrenschmidt 1 sibling, 2 replies; 24+ messages in thread From: Alan Modra @ 2003-11-16 22:19 UTC (permalink / raw) To: Kumar Gala; +Cc: benh, Olaf Hering, linuxppc-dev list, David Edelsohn On Sun, Nov 16, 2003 at 11:49:32AM -0600, Kumar Gala wrote: > If Ben's comments are correct simply removing -mstring as an option > passed to the build should get the desired behavior. Yes. I can't see any problem with gcc's behaviour here, and I'm surprised that some processor is taking alignment exceptions on lswi. book3 ppcas says lswi will generate an alignment exception when "the operand is in storage that is Write Through Required or Caching Inhibited, or the processor is in Little-Endian mode". It can also happen for operands that cross segment boundaries or page boudaries with different attributes. -- Alan Modra IBM OzLabs - Linux Technology Centre ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 22:19 ` Alan Modra @ 2003-11-16 22:45 ` Jon Masters 2003-11-17 0:50 ` Paul Mackerras 1 sibling, 0 replies; 24+ messages in thread From: Jon Masters @ 2003-11-16 22:45 UTC (permalink / raw) To: Alan Modra; +Cc: linuxppc-dev list Alan Modra wrote: | On Sun, Nov 16, 2003 at 11:49:32AM -0600, Kumar Gala wrote: | |>If Ben's comments are correct simply removing -mstring as an option |>passed to the build should get the desired behavior. | | | Yes. I can't see any problem with gcc's behaviour here, and I'm | surprised that some processor is taking alignment exceptions on lswi. The 601 reputedly broke a number of the PowerPC specifications however so I am not surprised if it has this problem - the trouble is you can fix up the alignment exception handler in Linux but not the firmware handlers being used prior to that. Anyway people suggested workarounds. Jon. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 22:19 ` Alan Modra 2003-11-16 22:45 ` Jon Masters @ 2003-11-17 0:50 ` Paul Mackerras 2003-11-17 7:55 ` Olaf Hering 1 sibling, 1 reply; 24+ messages in thread From: Paul Mackerras @ 2003-11-17 0:50 UTC (permalink / raw) To: Alan Modra Cc: Kumar Gala, benh, Olaf Hering, linuxppc-dev list, David Edelsohn Alan Modra writes: > Yes. I can't see any problem with gcc's behaviour here, and I'm > surprised that some processor is taking alignment exceptions on lswi. > book3 ppcas says lswi will generate an alignment exception when "the > operand is in storage that is Write Through Required or Caching > Inhibited, or the processor is in Little-Endian mode". It can also > happen for operands that cross segment boundaries or page boudaries with > different attributes. Well, firstly PPCAS didn't exist when the 601 was designed, and secondly the architecture allows implementations to consist of a mix of hardware and software - meaning that hardware can take an exception on any condition it likes and expect software to fix it up (provided hardware gives software enough information to fix it up, etc.). The original PPC architecture talks about one of the reasons for an alignment interrupt being that "the operand of an elementary string load or store crosses a protection boundary". And the 601 manual says that a string load or store (except lscbx) will only cause an interrupt if it crosses a page boundary and it is not word aligned. Olaf, do we know what the source and destination addresses were? Paul. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-17 0:50 ` Paul Mackerras @ 2003-11-17 7:55 ` Olaf Hering 0 siblings, 0 replies; 24+ messages in thread From: Olaf Hering @ 2003-11-17 7:55 UTC (permalink / raw) To: Paul Mackerras Cc: Alan Modra, Kumar Gala, benh, linuxppc-dev list, David Edelsohn On Mon, Nov 17, Paul Mackerras wrote: > Olaf, do we know what the source and destination addresses were? source was c0fe4ffa, I cant reproduce it righht now to get the destination address. -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 17:49 ` Kumar Gala 2003-11-16 22:19 ` Alan Modra @ 2003-11-16 23:12 ` Benjamin Herrenschmidt 2003-11-16 23:31 ` David Edelsohn 1 sibling, 1 reply; 24+ messages in thread From: Benjamin Herrenschmidt @ 2003-11-16 23:12 UTC (permalink / raw) To: Kumar Gala; +Cc: Olaf Hering, linuxppc-dev list, Alan Modra, David Edelsohn On Mon, 2003-11-17 at 04:49, Kumar Gala wrote: > If Ben's comments are correct simply removing -mstring as an option > passed to the build should get the desired behavior. We surely don't want them on G5 at least as they are microcoded Ben. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 23:12 ` Benjamin Herrenschmidt @ 2003-11-16 23:31 ` David Edelsohn 2003-11-17 9:19 ` Gabriel Paubert 0 siblings, 1 reply; 24+ messages in thread From: David Edelsohn @ 2003-11-16 23:31 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: Kumar Gala, Olaf Hering, linuxppc-dev list, Alan Modra >>>>> Benjamin Herrenschmidt writes: Ben> We surely don't want them on G5 at least as they are microcoded Again, one cannot approach this as black or white. What about optimizing for size? david ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 23:31 ` David Edelsohn @ 2003-11-17 9:19 ` Gabriel Paubert 0 siblings, 0 replies; 24+ messages in thread From: Gabriel Paubert @ 2003-11-17 9:19 UTC (permalink / raw) To: David Edelsohn Cc: Benjamin Herrenschmidt, Kumar Gala, Olaf Hering, linuxppc-dev list, Alan Modra On Sun, Nov 16, 2003 at 06:31:45PM -0500, David Edelsohn wrote: > > >>>>> Benjamin Herrenschmidt writes: > > Ben> We surely don't want them on G5 at least as they are microcoded > > Again, one cannot approach this as black or white. What about > optimizing for size? Using lswi/stswi is fine when optimizing for size, but I think that using these instructions for the case of an 8 byte move is wrong in most cases because an additional instruction is often (but not always) needed to compute the address. Moving 8 bytes with lswi/stswi: la rx,src # compute source address lswi 5,rx,8 la ry, dst# compute destination address stswi 5,ry,8 Moving 8 bytes with standard instructions: lwz rx,src lwz ry,src+4 stw rx,dst stw ry,dst+4 IMHO, lswi/stswi should only be used when the move would be split into 3 or more l[bhw]z/st[bhw] pairs (i.e., for sizes of 7 or 9 and up). Regards, Gabriel ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 10:17 ` Benjamin Herrenschmidt 2003-11-16 17:49 ` Kumar Gala @ 2003-11-16 23:04 ` David Edelsohn 2003-11-17 0:40 ` Paul Mackerras 2003-11-19 21:51 ` linas 1 sibling, 2 replies; 24+ messages in thread From: David Edelsohn @ 2003-11-16 23:04 UTC (permalink / raw) To: benh; +Cc: Olaf Hering, Alan Modra, linuxppc-dev list >>>>> Benjamin Herrenschmidt writes: Ben> I remember beeing regulary told (I think by Apple while I was still Ben> doing MacOS hacking) that those string instructions were evil, Ben> deprecated, and should be avoided as they weren't peforming better Ben> than the equivalent set of load/store instructions... Is this Ben> still true ? In which case we may want to avoid generating them Ben> from gcc.. The information that you received about lwsi are overly simplistic. The instructions are neither overly good nor overly bad -- they should not be used for everything, but neither should they be avoided at all cost. They are particularly good for producing compact code and preserving the instruction cache. Remember, programming, including assembly language programming, is an art. David ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 23:04 ` David Edelsohn @ 2003-11-17 0:40 ` Paul Mackerras 2003-11-19 21:51 ` linas 1 sibling, 0 replies; 24+ messages in thread From: Paul Mackerras @ 2003-11-17 0:40 UTC (permalink / raw) To: David Edelsohn; +Cc: benh, Olaf Hering, Alan Modra, linuxppc-dev list David Edelsohn writes: > The information that you received about lwsi are overly > simplistic. The instructions are neither overly good nor overly bad -- > they should not be used for everything, but neither should they be avoided > at all cost. They are particularly good for producing compact code and > preserving the instruction cache. Remember, programming, including > assembly language programming, is an art. In the experiments that I did comparing different memcpy loops, I didn't find any combination of alignment, size of copy and processor implementation where using string loads/stores was as fast as than ordinary loads and stores. So I am inclined to think that the only advantage of the string load/store instructions is in saving a little bit of icache. Paul. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 23:04 ` David Edelsohn 2003-11-17 0:40 ` Paul Mackerras @ 2003-11-19 21:51 ` linas 2003-11-19 22:06 ` Hollis Blanchard 1 sibling, 1 reply; 24+ messages in thread From: linas @ 2003-11-19 21:51 UTC (permalink / raw) To: David Edelsohn; +Cc: benh, Olaf Hering, Alan Modra, linuxppc-dev list On Sun, Nov 16, 2003 at 06:04:11PM -0500, David Edelsohn wrote: > > >>>>> Benjamin Herrenschmidt writes: > > Ben> I remember beeing regulary told (I think by Apple while I was still > Ben> doing MacOS hacking) that those string instructions were evil, > Ben> deprecated, and should be avoided as they weren't peforming better > Ben> than the equivalent set of load/store instructions... Is this > Ben> still true ? In which case we may want to avoid generating them > Ben> from gcc.. > > The information that you received about lwsi are overly > simplistic. The instructions are neither overly good nor overly bad -- > they should not be used for everything, but neither should they be avoided > at all cost. They are particularly good for producing compact code and > preserving the instruction cache. Remember, programming, including > assembly language programming, is an art. Back in ye olde dayes, these insns were way better (by a factor of 3x) for doing load/stores to i/o space, cause they could pump out a word every bus cycle as opposed to every 3 cycles (due to pipeline stalls). I guess things like G5, etc. now have enough load/store units and etc. hardware that this is no longer an issue? So that if I wanted to, I could PIO fast enough to e.g. keep a pci bus saturated? (We used PIO in ye olde days for dynamic data that would have gone stale by the time a dma was set up and run.) Just curious, these insn's used to be freinds, not enemies. --linas ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-19 21:51 ` linas @ 2003-11-19 22:06 ` Hollis Blanchard 2003-11-19 22:50 ` linas 0 siblings, 1 reply; 24+ messages in thread From: Hollis Blanchard @ 2003-11-19 22:06 UTC (permalink / raw) To: linas; +Cc: linuxppc-dev list On Wednesday, Nov 19, 2003, at 15:51 US/Central, linas@austin.ibm.com wrote: > Just curious, these insn's used to be freinds, not enemies. I think they've always been the enemy of the CPU designers. At least that's how it was explained to me from a Motorolan, and I assume the same is true for IBM. And they're the ones writing the CPU manuals telling people not to use the instructions... :) -- Hollis Blanchard IBM Linux Technology Center ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-19 22:06 ` Hollis Blanchard @ 2003-11-19 22:50 ` linas 0 siblings, 0 replies; 24+ messages in thread From: linas @ 2003-11-19 22:50 UTC (permalink / raw) To: Hollis Blanchard; +Cc: linuxppc-dev list On Wed, Nov 19, 2003 at 04:06:15PM -0600, Hollis Blanchard wrote: > On Wednesday, Nov 19, 2003, at 15:51 US/Central, linas@austin.ibm.com > wrote: > > Just curious, these insn's used to be freinds, not enemies. > > I think they've always been the enemy of the CPU designers. At least > that's how it was explained to me from a Motorolan, and I assume the > same is true for IBM. And they're the ones writing the CPU manuals > telling people not to use the instructions... :) Depends on whose CPU designer camp you visit. DEC Alpha strategy: pump up the clock; minimize number of gate delays between start of insn cycle and end of cycle. Less gate delay == faster clock. Ye olde superscalar strategy: do more per clock cycle by deploying more transistors (even if one must have slower clock as a result.) The load string insn needs a big fat shift register with oodles of gate delays right in the middle of the load/store path. No other insn's need or use this register. Getting rid of it allows you to pump up the clock. The original POWER cpu designers clearly thought it was a worthwhile tradeoff, otherwise it wouldn't have been in the insn set to begin with. But the alpha camp sure made a clear and ringing point ... --linas ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-15 21:04 kernel oops due to unaligned access with lswi Olaf Hering 2003-11-15 22:24 ` Olaf Hering @ 2003-11-16 0:40 ` Paul Mackerras 2003-11-16 1:45 ` Olaf Hering 2003-11-16 5:07 ` Benjamin Herrenschmidt 1 sibling, 2 replies; 24+ messages in thread From: Paul Mackerras @ 2003-11-16 0:40 UTC (permalink / raw) To: Olaf Hering; +Cc: Alan Modra, linuxppc-dev Olaf, > lswi 9,31,8 > stswi 9,28,8 > > s = r31. How can gcc be sure that s aligned? What machine is this? I looked at the manuals for 750, 7450, POWER4 and they all handle unaligned string ops in hardware. The alignment handler doesn't handle string ops, I believe, although it could. And which arch (ppc32 or ppc64)? Paul. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 0:40 ` Paul Mackerras @ 2003-11-16 1:45 ` Olaf Hering 2003-11-16 16:49 ` Olaf Hering 2003-11-16 5:07 ` Benjamin Herrenschmidt 1 sibling, 1 reply; 24+ messages in thread From: Olaf Hering @ 2003-11-16 1:45 UTC (permalink / raw) To: Paul Mackerras; +Cc: Alan Modra, linuxppc-dev On Sun, Nov 16, Paul Mackerras wrote: > Olaf, > > > lswi 9,31,8 > > stswi 9,28,8 > > > > s = r31. How can gcc be sure that s aligned? > > What machine is this? I looked at the manuals for 750, 7450, POWER4 > and they all handle unaligned string ops in hardware. The alignment > handler doesn't handle string ops, I believe, although it could. And > which arch (ppc32 or ppc64)? Its a 7200/90 with 601 cpu. And I'm afraid, the zlib.c needs also tweaking. I think the gcc built-in memcpy is used in the bootloader. Same issue, 'DEFAULT CATCH!, code=FFF00600' without this change (adds also zlib debugging, but doesnt work for prepboot right now, if enabled). --- ../linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/lib/zlib.c 2003-09-12 18:26:51.000000000 +0200 +++ arch/ppc/boot/lib/zlib.c 2003-11-16 02:43:22.000000000 +0100 @@ -1,3 +1,5 @@ +#define DEBUG_ZLIB 1 +#define verbose 1 /* * This file is derived from various .h and .c files from the zlib-0.95 * distribution by Jean-loup Gailly and Mark Adler, with some additions @@ -85,11 +87,11 @@ extern char *z_errmsg[]; /* indexed by 1 /* Diagnostic functions */ #ifdef DEBUG_ZLIB -# include <stdio.h> +# include <nonstdio.h> # ifndef verbose # define verbose 0 # endif -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Assert(cond,msg) {if(!(cond)) printf(msg);} # define Trace(x) fprintf x # define Tracev(x) {if (verbose) fprintf x ;} # define Tracevv(x) {if (verbose>1) fprintf x ;} @@ -884,7 +886,14 @@ local int inflate_blocks( t = s->sub.left; if (t > n) t = n; if (t > m) t = m; +#if 0 zmemcpy(q, p, t); +#else + { + int i; + for(i=0;i <t;i++)q[i]=p[i]; + } +#endif p += t; n -= t; q += t; m -= t; if ((s->sub.left -= t) != 0) @@ -1230,7 +1239,7 @@ local uInt cpdext[] = { /* Extra bits fo #define N_MAX 288 /* maximum number of codes in any set */ #ifdef DEBUG_ZLIB - uInt inflate_hufts; + local uInt inflate_hufts; #endif local int huft_build( -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 1:45 ` Olaf Hering @ 2003-11-16 16:49 ` Olaf Hering 0 siblings, 0 replies; 24+ messages in thread From: Olaf Hering @ 2003-11-16 16:49 UTC (permalink / raw) To: Paul Mackerras; +Cc: Alan Modra, linuxppc-dev On Sun, Nov 16, Olaf Hering wrote: > > On Sun, Nov 16, Paul Mackerras wrote: > > > Olaf, > > > > > lswi 9,31,8 > > > stswi 9,28,8 > > > > > > s = r31. How can gcc be sure that s aligned? > > > > What machine is this? I looked at the manuals for 750, 7450, POWER4 > > and they all handle unaligned string ops in hardware. The alignment > > handler doesn't handle string ops, I believe, although it could. And > > which arch (ppc32 or ppc64)? > > Its a 7200/90 with 601 cpu. And I'm afraid, the zlib.c needs also > tweaking. I think the gcc built-in memcpy is used in the bootloader. > Same issue, 'DEFAULT CATCH!, code=FFF00600' without this change (adds > also zlib debugging, but doesnt work for prepboot right now, if enabled). This patch allows zlib debugging, defines a dummy printf for prep, prints all 4 bytes of a pointer in the coff bootloader. diff -x bin -x ash -x klibc-0.81 -purNX /home/olaf/kernel/kernel_exclude.txt linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/common/misc-common.c linuxppc-2.5_2.6.0-test9-bk/arch/ppc/boot/common/misc-common.c --- linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/common/misc-common.c 2003-09-12 19:39:38.000000000 +0200 +++ linuxppc-2.5_2.6.0-test9-bk/arch/ppc/boot/common/misc-common.c 2003-11-16 17:42:36.000000000 +0100 @@ -67,6 +67,8 @@ extern unsigned char serial_getc(unsigne extern void serial_putc(unsigned long com_port, unsigned char c); #endif +int printf(const char *fmt, ...) { return 0; } + void pause(void) { puts("pause\n"); diff -x bin -x ash -x klibc-0.81 -purNX /home/olaf/kernel/kernel_exclude.txt linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/lib/zlib.c linuxppc-2.5_2.6.0-test9-bk/arch/ppc/boot/lib/zlib.c --- linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/lib/zlib.c 2003-09-12 18:26:51.000000000 +0200 +++ linuxppc-2.5_2.6.0-test9-bk/arch/ppc/boot/lib/zlib.c 2003-11-16 17:35:40.000000000 +0100 @@ -1,3 +1,7 @@ +#if 0 +#define DEBUG_ZLIB 1 +#define verbose 1 +#endif /* * This file is derived from various .h and .c files from the zlib-0.95 * distribution by Jean-loup Gailly and Mark Adler, with some additions @@ -85,16 +89,16 @@ extern char *z_errmsg[]; /* indexed by 1 /* Diagnostic functions */ #ifdef DEBUG_ZLIB -# include <stdio.h> +# include <nonstdio.h> # ifndef verbose # define verbose 0 # endif -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) fprintf x -# define Tracev(x) {if (verbose) fprintf x ;} -# define Tracevv(x) {if (verbose>1) fprintf x ;} -# define Tracec(c,x) {if (verbose && (c)) fprintf x ;} -# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;} +# define Assert(cond,msg) {if(!(cond)) printf(msg);} +# define Trace(x) printf x +# define Tracev(x) {if (verbose) printf x ;} +# define Tracevv(x) {if (verbose>1) printf x ;} +# define Tracec(c,x) {if (verbose && (c)) printf x ;} +# define Tracecv(c,x) {if (verbose>1 && (c)) printf x ;} #else # define Assert(cond,msg) # define Trace(x) @@ -311,7 +315,7 @@ int inflateReset( z->msg = Z_NULL; z->state->mode = z->state->nowrap ? BLOCKS : METHOD; inflate_blocks_reset(z->state->blocks, z, &c); - Trace((stderr, "inflate: reset\n")); + Trace(("inflate: reset\n")); return Z_OK; } @@ -328,7 +332,7 @@ int inflateEnd( inflate_blocks_free(z->state->blocks, z, &c); ZFREE(z, z->state, sizeof(struct internal_state)); z->state = Z_NULL; - Trace((stderr, "inflate: end\n")); + Trace(("inflate: end\n")); return Z_OK; } @@ -372,7 +376,7 @@ int inflateInit2( inflateEnd(z); return Z_MEM_ERROR; } - Trace((stderr, "inflate: allocated\n")); + Trace(("inflate: allocated\n")); /* reset state */ inflateReset(z); @@ -437,7 +441,7 @@ int inflate( z->state->sub.marker = 5; /* can't try inflateSync */ break; } - Trace((stderr, "inflate: zlib header ok\n")); + Trace(("inflate: zlib header ok\n")); z->state->mode = BLOCKS; case BLOCKS: r = inflate_blocks(z->state->blocks, z, r); @@ -482,7 +486,7 @@ int inflate( z->state->sub.marker = 5; /* can't try inflateSync */ break; } - Trace((stderr, "inflate: zlib check ok\n")); + Trace(("inflate: zlib check ok\n")); z->state->mode = DONE; case DONE: return Z_STREAM_END; @@ -766,7 +770,7 @@ local void inflate_blocks_reset( s->read = s->write = s->window; if (s->checkfn != Z_NULL) s->check = (*s->checkfn)(0L, Z_NULL, 0); - Trace((stderr, "inflate: blocks reset\n")); + Trace(("inflate: blocks reset\n")); } @@ -789,7 +793,7 @@ local inflate_blocks_statef *inflate_blo s->end = s->window + w; s->checkfn = c; s->mode = TYPE; - Trace((stderr, "inflate: blocks allocated\n")); + Trace(("inflate: blocks allocated\n")); inflate_blocks_reset(s, z, &s->check); return s; } @@ -822,7 +826,7 @@ local int inflate_blocks( switch (t >> 1) { case 0: /* stored */ - Trace((stderr, "inflate: stored block%s\n", + Trace(("inflate: stored block%s\n", s->last ? " (last)" : "")); DUMPBITS(3) t = k & 7; /* go to byte boundary */ @@ -830,7 +834,7 @@ local int inflate_blocks( s->mode = LENS; /* get length of stored block */ break; case 1: /* fixed */ - Trace((stderr, "inflate: fixed codes block%s\n", + Trace(("inflate: fixed codes block%s\n", s->last ? " (last)" : "")); { uInt bl, bd; @@ -850,7 +854,7 @@ local int inflate_blocks( s->mode = CODES; break; case 2: /* dynamic */ - Trace((stderr, "inflate: dynamic codes block%s\n", + Trace(("inflate: dynamic codes block%s\n", s->last ? " (last)" : "")); DUMPBITS(3) s->mode = TABLE; @@ -874,7 +878,7 @@ local int inflate_blocks( } s->sub.left = (uInt)b & 0xffff; b = k = 0; /* dump bits */ - Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); + Tracev(("inflate: stored length %u\n", s->sub.left)); s->mode = s->sub.left ? STORED : TYPE; break; case STORED: @@ -884,12 +888,16 @@ local int inflate_blocks( t = s->sub.left; if (t > n) t = n; if (t > m) t = m; +#if 0 zmemcpy(q, p, t); +#else + { int i; for(i=0;i <t;i++)q[i]=p[i]; } +#endif p += t; n -= t; q += t; m -= t; if ((s->sub.left -= t) != 0) break; - Tracev((stderr, "inflate: stored end, %lu total out\n", + Tracev(("inflate: stored end, %lu total out\n", z->total_out + (q >= s->read ? q - s->read : (s->end - s->read) + (q - s->window)))); s->mode = s->last ? DRY : TYPE; @@ -917,7 +925,7 @@ local int inflate_blocks( s->sub.trees.nblens = t; DUMPBITS(14) s->sub.trees.index = 0; - Tracev((stderr, "inflate: table sizes ok\n")); + Tracev(("inflate: table sizes ok\n")); s->mode = BTREE; case BTREE: while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) @@ -939,7 +947,7 @@ local int inflate_blocks( LEAVE } s->sub.trees.index = 0; - Tracev((stderr, "inflate: bits tree ok\n")); + Tracev(("inflate: bits tree ok\n")); s->mode = DTREE; case DTREE: while (t = s->sub.trees.table, @@ -1002,7 +1010,7 @@ local int inflate_blocks( r = t; LEAVE } - Tracev((stderr, "inflate: trees ok\n")); + Tracev(("inflate: trees ok\n")); if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) { inflate_trees_free(td, z); @@ -1025,7 +1033,7 @@ local int inflate_blocks( inflate_trees_free(s->sub.decode.td, z); inflate_trees_free(s->sub.decode.tl, z); LOAD - Tracev((stderr, "inflate: codes end, %lu total out\n", + Tracev(("inflate: codes end, %lu total out\n", z->total_out + (q >= s->read ? q - s->read : (s->end - s->read) + (q - s->window)))); if (!s->last) @@ -1068,7 +1076,7 @@ local int inflate_blocks_free( inflate_blocks_reset(s, z, c); ZFREE(z, s->window, s->end - s->window); ZFREE(z, s, sizeof(struct inflate_blocks_state)); - Trace((stderr, "inflate: blocks freed\n")); + Trace(("inflate: blocks freed\n")); return Z_OK; } @@ -1230,7 +1238,7 @@ local uInt cpdext[] = { /* Extra bits fo #define N_MAX 288 /* maximum number of codes in any set */ #ifdef DEBUG_ZLIB - uInt inflate_hufts; + local uInt inflate_hufts; #endif local int huft_build( @@ -1687,7 +1695,7 @@ local inflate_codes_statef *inflate_code c->dbits = (Byte)bd; c->ltree = tl; c->dtree = td; - Tracev((stderr, "inflate: codes new\n")); + Tracev(("inflate: codes new\n")); } return c; } @@ -1743,7 +1751,7 @@ local int inflate_codes( if (e == 0) /* literal */ { c->sub.lit = t->base; - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? + Tracevv((t->base >= 0x20 && t->base < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", t->base)); c->mode = LIT; @@ -1764,7 +1772,7 @@ local int inflate_codes( } if (e & 32) /* end of block */ { - Tracevv((stderr, "inflate: end of block\n")); + Tracevv(("inflate: end of block\n")); c->mode = WASH; break; } @@ -1779,7 +1787,7 @@ local int inflate_codes( DUMPBITS(j) c->sub.code.need = c->dbits; c->sub.code.tree = c->dtree; - Tracevv((stderr, "inflate: length %u\n", c->len)); + Tracevv(("inflate: length %u\n", c->len)); c->mode = DIST; case DIST: /* i: get distance next */ j = c->sub.code.need; @@ -1809,7 +1817,7 @@ local int inflate_codes( NEEDBITS(j) c->sub.copy.dist += (uInt)b & inflate_mask[j]; DUMPBITS(j) - Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); + Tracevv(("inflate: distance %u\n", c->sub.copy.dist)); c->mode = COPY; case COPY: /* o: copying bytes in window, waiting for space */ #ifndef __TURBOC__ /* Turbo C bug for following expression */ @@ -1860,7 +1868,7 @@ local void inflate_codes_free( ) { ZFREE(z, c, sizeof(struct inflate_codes_state)); - Tracev((stderr, "inflate: codes free\n")); + Tracev(("inflate: codes free\n")); } /*+++++*/ @@ -1995,7 +2003,7 @@ local int inflate_fast( if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) { DUMPBITS(t->bits) - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? + Tracevv((t->base >= 0x20 && t->base < 0x7f ? "inflate: * literal '%c'\n" : "inflate: * literal 0x%02x\n", t->base)); *q++ = (Byte)t->base; @@ -2010,7 +2018,7 @@ local int inflate_fast( e &= 15; c = t->base + ((uInt)b & inflate_mask[e]); DUMPBITS(e) - Tracevv((stderr, "inflate: * length %u\n", c)); + Tracevv(("inflate: * length %u\n", c)); /* decode distance base of block to copy */ GRABBITS(15); /* max bits for distance code */ @@ -2024,7 +2032,7 @@ local int inflate_fast( GRABBITS(e) /* get extra bits (up to 13) */ d = t->base + ((uInt)b & inflate_mask[e]); DUMPBITS(e) - Tracevv((stderr, "inflate: * distance %u\n", d)); + Tracevv(("inflate: * distance %u\n", d)); /* do the copy */ m -= c; @@ -2069,7 +2077,7 @@ local int inflate_fast( if ((e = (t = t->next + ((uInt)b & inflate_mask[e]))->exop) == 0) { DUMPBITS(t->bits) - Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? + Tracevv((t->base >= 0x20 && t->base < 0x7f ? "inflate: * literal '%c'\n" : "inflate: * literal 0x%02x\n", t->base)); *q++ = (Byte)t->base; @@ -2079,7 +2087,7 @@ local int inflate_fast( } else if (e & 32) { - Tracevv((stderr, "inflate: * end of block\n")); + Tracevv(("inflate: * end of block\n")); UNGRAB UPDATE return Z_STREAM_END; diff -x bin -x ash -x klibc-0.81 -purNX /home/olaf/kernel/kernel_exclude.txt linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/openfirmware/coffmain.c linuxppc-2.5_2.6.0-test9-bk/arch/ppc/boot/openfirmware/coffmain.c --- linuxppc-2.5_2.6.0-test9-bk.orig/arch/ppc/boot/openfirmware/coffmain.c 2003-10-14 13:33:50.000000000 +0200 +++ linuxppc-2.5_2.6.0-test9-bk/arch/ppc/boot/openfirmware/coffmain.c 2003-11-16 17:22:48.000000000 +0100 @@ -60,7 +60,7 @@ void boot(int a1, int a2, void *prom) a1 = initrd_start; a2 = initrd_size; claim(initrd_start, ram_end - initrd_start, 0); - printf("initial ramdisk moving 0x%x <- 0x%p (%x bytes)\n\r", + printf("initial ramdisk moving 0x%08x <- 0x%p (%08x bytes)\n\r", initrd_start, (char *)(&__ramdisk_begin), initrd_size); memcpy((char *)initrd_start, (char *)(&__ramdisk_begin), initrd_size); prog_size = initrd_start - prog_start; -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: kernel oops due to unaligned access with lswi 2003-11-16 0:40 ` Paul Mackerras 2003-11-16 1:45 ` Olaf Hering @ 2003-11-16 5:07 ` Benjamin Herrenschmidt 1 sibling, 0 replies; 24+ messages in thread From: Benjamin Herrenschmidt @ 2003-11-16 5:07 UTC (permalink / raw) To: Paul Mackerras; +Cc: Olaf Hering, Alan Modra, linuxppc-dev list On Sun, 2003-11-16 at 11:40, Paul Mackerras wrote: > Olaf, > > > lswi 9,31,8 > > stswi 9,28,8 > > > > s = r31. How can gcc be sure that s aligned? > > What machine is this? I looked at the manuals for 750, 7450, POWER4 > and they all handle unaligned string ops in hardware. The alignment > handler doesn't handle string ops, I believe, although it could. And > which arch (ppc32 or ppc64)? One of your old friends actually: olaf> pmac 7200/90 with 601 cpu. :) Ben. ** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/ ^ permalink raw reply [flat|nested] 24+ messages in thread
end of thread, other threads:[~2003-11-19 22:50 UTC | newest] Thread overview: 24+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2003-11-15 21:04 kernel oops due to unaligned access with lswi Olaf Hering 2003-11-15 22:24 ` Olaf Hering 2003-11-15 22:30 ` David Edelsohn 2003-11-15 22:37 ` Olaf Hering 2003-11-15 22:43 ` Olaf Hering 2003-11-15 22:59 ` David Edelsohn 2003-11-16 10:17 ` Benjamin Herrenschmidt 2003-11-16 17:49 ` Kumar Gala 2003-11-16 22:19 ` Alan Modra 2003-11-16 22:45 ` Jon Masters 2003-11-17 0:50 ` Paul Mackerras 2003-11-17 7:55 ` Olaf Hering 2003-11-16 23:12 ` Benjamin Herrenschmidt 2003-11-16 23:31 ` David Edelsohn 2003-11-17 9:19 ` Gabriel Paubert 2003-11-16 23:04 ` David Edelsohn 2003-11-17 0:40 ` Paul Mackerras 2003-11-19 21:51 ` linas 2003-11-19 22:06 ` Hollis Blanchard 2003-11-19 22:50 ` linas 2003-11-16 0:40 ` Paul Mackerras 2003-11-16 1:45 ` Olaf Hering 2003-11-16 16:49 ` Olaf Hering 2003-11-16 5:07 ` Benjamin Herrenschmidt
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).