diff mbox

silo fails to build with e2fsprogs-1.41.14 (undefined references to posix_memalign)

Message ID 20110116.195944.246522102.davem@davemloft.net
State Accepted
Delegated to: David Miller
Headers show

Commit Message

David Miller Jan. 17, 2011, 3:59 a.m. UTC
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>

--
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

Comments

Alex Buell Jan. 17, 2011, 4:03 a.m. UTC | #1
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.
Alex Buell Jan. 17, 2011, 1:22 p.m. UTC | #2
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?
Richard Mortimer Jan. 17, 2011, 5:02 p.m. UTC | #3
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
Alex Buell Jan. 17, 2011, 5:23 p.m. UTC | #4
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 mbox

Patch

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;
-}