Message ID | 20110116.195944.246522102.davem@davemloft.net |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
On Sun, 2011-01-16 at 19:59 -0800, David Miller wrote: > From: Alex Buell <alex.buell@munted.org.uk> > Date: Sat, 15 Jan 2011 12:57:09 +0000 > > > On Sat, 2011-01-15 at 13:07 +0100, Raúl Porcel wrote: > >> Thanks, it builds, but silo fails to work: > >> > >> Boot device: disk1 File and args: > >> SILO Version 1.4.14_git2010228_p1 > >> > >> Unknown ext2 error: 4294967295 > >> > >> Fatal error: Unable to open filesystem > >> > >> Couldn't load /etc/silo.conf > >> No config file loaded, you can boot just from this command line > >> Type [prompath;]part/path_to_image [parameters] on the prompt > >> E.g. /iommu/sbus/espdma/esp/sd@3,0;4/vmlinux root=/dev/sda4 > >> or 2/vmlinux.live (to load vmlinux.live from 2nd partition of boot disk) > >> boot: > > > > This problem exists with all versions of silo linked against > > e2fsprogs-1.41.14. > > Can you guys please test this patch out? It's against the current > tree. > > Thanks! > > -------------------- > malloc: Provide posix_memalign() implementation. > > ext2progs library really wants a working version of this, > and thankfully it's not that hard to do. > > Signed-off-by: David S. Miller <davem@davemloft.net> > > diff --git a/common/malloc.c b/common/malloc.c > index cc3946d..d05061b 100644 > --- a/common/malloc.c > +++ b/common/malloc.c > @@ -27,6 +27,12 @@ static char *malloc_ptr = (char *) MALLOC_BASE; > > static char *last_alloc = 0; > > +static char *align_ptr_to(char *ptr, unsigned long align) > +{ > + return (char *) ((((unsigned long) ptr) + (align - 1UL)) & > + ~(align - 1UL)); > +} > + > void *malloc (int size) > { > char *caddr; > @@ -34,10 +40,34 @@ void *malloc (int size) > caddr = malloc_ptr; > malloc_ptr += size; > last_alloc = caddr; > - malloc_ptr = (char *) ((((unsigned long) malloc_ptr) + 7) & (~7)); > + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); > return caddr; > } > > +int posix_memalign(void **memptr, unsigned long alignment, unsigned long size) > +{ > + char *caddr; > + > + if (alignment & (alignment - 1UL)) > + return -1; > + if (alignment & (sizeof(void *) - 1UL)) > + return -1; > + > + if (size == 0) { > + *memptr = (void *) 0; > + return 0; > + } > + > + caddr = align_ptr_to(malloc_ptr, alignment); > + malloc_ptr = (caddr + size); > + last_alloc = caddr; > + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); > + > + *memptr = caddr; > + > + return 0; > +} > + > void free (void *m) > { > if (m == last_alloc) > diff --git a/second/fs/ext2.c b/second/fs/ext2.c > index 12d00dc..57f5e9a 100644 > --- a/second/fs/ext2.c > +++ b/second/fs/ext2.c > @@ -163,9 +163,3 @@ void *realloc(void *p, int size) > { > return NULL; > } > - > -int posix_memalign(void **memptr, size_t alignment, size_t size) > -{ > - *memptr = NULL; > - return -1; > -} I'll test it first thing tomorrow morning. The 'Blade 2000's busy cross-compiling PPC packages for my dog-slow iMac at the moment.
On Sun, 2011-01-16 at 19:59 -0800, David Miller wrote: > From: Alex Buell <alex.buell@munted.org.uk> > Date: Sat, 15 Jan 2011 12:57:09 +0000 > > > On Sat, 2011-01-15 at 13:07 +0100, Raúl Porcel wrote: > >> Thanks, it builds, but silo fails to work: > >> > >> Boot device: disk1 File and args: > >> SILO Version 1.4.14_git2010228_p1 > >> > >> Unknown ext2 error: 4294967295 > >> > >> Fatal error: Unable to open filesystem > >> > >> Couldn't load /etc/silo.conf > >> No config file loaded, you can boot just from this command line > >> Type [prompath;]part/path_to_image [parameters] on the prompt > >> E.g. /iommu/sbus/espdma/esp/sd@3,0;4/vmlinux root=/dev/sda4 > >> or 2/vmlinux.live (to load vmlinux.live from 2nd partition of boot disk) > >> boot: > > > > This problem exists with all versions of silo linked against > > e2fsprogs-1.41.14. > > Can you guys please test this patch out? It's against the current > tree. > > Thanks! > > -------------------- > malloc: Provide posix_memalign() implementation. > > ext2progs library really wants a working version of this, > and thankfully it's not that hard to do. > > Signed-off-by: David S. Miller <davem@davemloft.net> > > diff --git a/common/malloc.c b/common/malloc.c > index cc3946d..d05061b 100644 > --- a/common/malloc.c > +++ b/common/malloc.c > @@ -27,6 +27,12 @@ static char *malloc_ptr = (char *) MALLOC_BASE; > > static char *last_alloc = 0; > > +static char *align_ptr_to(char *ptr, unsigned long align) > +{ > + return (char *) ((((unsigned long) ptr) + (align - 1UL)) & > + ~(align - 1UL)); > +} > + > void *malloc (int size) > { > char *caddr; > @@ -34,10 +40,34 @@ void *malloc (int size) > caddr = malloc_ptr; > malloc_ptr += size; > last_alloc = caddr; > - malloc_ptr = (char *) ((((unsigned long) malloc_ptr) + 7) & (~7)); > + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); > return caddr; > } > > +int posix_memalign(void **memptr, unsigned long alignment, unsigned long size) > +{ > + char *caddr; > + > + if (alignment & (alignment - 1UL)) > + return -1; > + if (alignment & (sizeof(void *) - 1UL)) > + return -1; > + > + if (size == 0) { > + *memptr = (void *) 0; > + return 0; > + } > + > + caddr = align_ptr_to(malloc_ptr, alignment); > + malloc_ptr = (caddr + size); > + last_alloc = caddr; > + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); > + > + *memptr = caddr; > + > + return 0; > +} > + > void free (void *m) > { > if (m == last_alloc) > diff --git a/second/fs/ext2.c b/second/fs/ext2.c > index 12d00dc..57f5e9a 100644 > --- a/second/fs/ext2.c > +++ b/second/fs/ext2.c > @@ -163,9 +163,3 @@ void *realloc(void *p, int size) > { > return NULL; > } > - > -int posix_memalign(void **memptr, size_t alignment, size_t size) > -{ > - *memptr = NULL; > - return -1; > -} With that patch, I now get a different error: SILO Version 1.4.14 ERROR: Last trap: Memory Address not aligned Error -256 {0] OK (Now I've got to boot off my rescue CD and rebuild SILO) Is anyone else getting the same error?
On 17/01/2011 13:22, Alex Buell wrote: > On Sun, 2011-01-16 at 19:59 -0800, David Miller wrote: >> From: Alex Buell<alex.buell@munted.org.uk> >> Date: Sat, 15 Jan 2011 12:57:09 +0000 >> >>> On Sat, 2011-01-15 at 13:07 +0100, Raúl Porcel wrote: >>>> Thanks, it builds, but silo fails to work: >>>> >>>> Boot device: disk1 File and args: >>>> SILO Version 1.4.14_git2010228_p1 >>>> >>>> Unknown ext2 error: 4294967295 >>>> >>>> Fatal error: Unable to open filesystem >>>> >>>> Couldn't load /etc/silo.conf >>>> No config file loaded, you can boot just from this command line >>>> Type [prompath;]part/path_to_image [parameters] on the prompt >>>> E.g. /iommu/sbus/espdma/esp/sd@3,0;4/vmlinux root=/dev/sda4 >>>> or 2/vmlinux.live (to load vmlinux.live from 2nd partition of boot disk) >>>> boot: >>> >>> This problem exists with all versions of silo linked against >>> e2fsprogs-1.41.14. >> >> Can you guys please test this patch out? It's against the current >> tree. >> >> Thanks! >> >> -------------------- >> malloc: Provide posix_memalign() implementation. >> >> ext2progs library really wants a working version of this, >> and thankfully it's not that hard to do. >> >> Signed-off-by: David S. Miller<davem@davemloft.net> >> >> diff --git a/common/malloc.c b/common/malloc.c >> index cc3946d..d05061b 100644 >> --- a/common/malloc.c >> +++ b/common/malloc.c >> @@ -27,6 +27,12 @@ static char *malloc_ptr = (char *) MALLOC_BASE; >> >> static char *last_alloc = 0; >> >> +static char *align_ptr_to(char *ptr, unsigned long align) >> +{ >> + return (char *) ((((unsigned long) ptr) + (align - 1UL))& >> + ~(align - 1UL)); >> +} >> + >> void *malloc (int size) >> { >> char *caddr; >> @@ -34,10 +40,34 @@ void *malloc (int size) >> caddr = malloc_ptr; >> malloc_ptr += size; >> last_alloc = caddr; >> - malloc_ptr = (char *) ((((unsigned long) malloc_ptr) + 7)& (~7)); >> + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); I think that should be 8UL because align_ptr_to does -1 to make it 7. >> return caddr; >> } >> >> +int posix_memalign(void **memptr, unsigned long alignment, unsigned long size) >> +{ >> + char *caddr; >> + >> + if (alignment& (alignment - 1UL)) >> + return -1; >> + if (alignment& (sizeof(void *) - 1UL)) >> + return -1; >> + >> + if (size == 0) { >> + *memptr = (void *) 0; >> + return 0; >> + } >> + >> + caddr = align_ptr_to(malloc_ptr, alignment); >> + malloc_ptr = (caddr + size); >> + last_alloc = caddr; >> + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); Ditto Regards Richard >> + >> + *memptr = caddr; >> + >> + return 0; >> +} >> + >> void free (void *m) >> { >> if (m == last_alloc) >> diff --git a/second/fs/ext2.c b/second/fs/ext2.c >> index 12d00dc..57f5e9a 100644 >> --- a/second/fs/ext2.c >> +++ b/second/fs/ext2.c >> @@ -163,9 +163,3 @@ void *realloc(void *p, int size) >> { >> return NULL; >> } >> - >> -int posix_memalign(void **memptr, size_t alignment, size_t size) >> -{ >> - *memptr = NULL; >> - return -1; >> -} > > With that patch, I now get a different error: > > SILO Version 1.4.14 > ERROR: Last trap: Memory Address not aligned > > Error -256 > {0] OK > > (Now I've got to boot off my rescue CD and rebuild SILO) > > Is anyone else getting the same error? -- To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2011-01-17 at 17:02 +0000, Richard Mortimer wrote: > >> - malloc_ptr = (char *) ((((unsigned long) malloc_ptr) + 7)& (~7)); > >> + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); > I think that should be 8UL because align_ptr_to does -1 to make it 7. > >> + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); > Ditto That would explain the different error, this time it was 256, the previous error was -1^32. I'll change the patch with the new values and see if that works.
diff --git a/common/malloc.c b/common/malloc.c index cc3946d..d05061b 100644 --- a/common/malloc.c +++ b/common/malloc.c @@ -27,6 +27,12 @@ static char *malloc_ptr = (char *) MALLOC_BASE; static char *last_alloc = 0; +static char *align_ptr_to(char *ptr, unsigned long align) +{ + return (char *) ((((unsigned long) ptr) + (align - 1UL)) & + ~(align - 1UL)); +} + void *malloc (int size) { char *caddr; @@ -34,10 +40,34 @@ void *malloc (int size) caddr = malloc_ptr; malloc_ptr += size; last_alloc = caddr; - malloc_ptr = (char *) ((((unsigned long) malloc_ptr) + 7) & (~7)); + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); return caddr; } +int posix_memalign(void **memptr, unsigned long alignment, unsigned long size) +{ + char *caddr; + + if (alignment & (alignment - 1UL)) + return -1; + if (alignment & (sizeof(void *) - 1UL)) + return -1; + + if (size == 0) { + *memptr = (void *) 0; + return 0; + } + + caddr = align_ptr_to(malloc_ptr, alignment); + malloc_ptr = (caddr + size); + last_alloc = caddr; + malloc_ptr = align_ptr_to(malloc_ptr, 7UL); + + *memptr = caddr; + + return 0; +} + void free (void *m) { if (m == last_alloc) diff --git a/second/fs/ext2.c b/second/fs/ext2.c index 12d00dc..57f5e9a 100644 --- a/second/fs/ext2.c +++ b/second/fs/ext2.c @@ -163,9 +163,3 @@ void *realloc(void *p, int size) { return NULL; } - -int posix_memalign(void **memptr, size_t alignment, size_t size) -{ - *memptr = NULL; - return -1; -}