From 57e24de52a1318edb9f253f9c3199772567998b1 Mon Sep 17 00:00:00 2001 From: Tony Breeds Date: Thu, 6 Jan 2011 17:32:13 +0000 Subject: [PATCH] yaboot does not compile against new e2fsprogs release Add some "hacky" workarounds for missing libc functions required by e2fsprogs. Signed-off-by: Tony Breeds --- Makefile | 1 + include/nonstd.h | 35 +++++++++++++++++++++++++ lib/malloc.c | 47 +++++++++++++++++++++++++++++++++ lib/nonstd.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 150 insertions(+) create mode 100644 include/nonstd.h create mode 100644 lib/nonstd.c diff --git a/Makefile b/Makefile index f549977..b46165f 100644 --- a/Makefile +++ b/Makefile @@ -84,6 +84,7 @@ OBJS = second/crt0.o second/yaboot.o second/cache.o second/prom.o second/file.o second/partition.o second/fs.o second/cfg.o second/setjmp.o second/cmdline.o \ second/fs_of.o second/fs_ext2.o second/fs_iso.o second/fs_swap.o \ second/iso_util.o \ + lib/nonstd.o \ lib/nosys.o lib/string.o lib/strtol.o lib/vsprintf.o lib/ctype.o lib/malloc.o lib/strstr.o ifeq ($(USE_MD5_PASSWORDS),y) diff --git a/include/nonstd.h b/include/nonstd.h new file mode 100644 index 0000000..bad5f48 --- /dev/null +++ b/include/nonstd.h @@ -0,0 +1,35 @@ +/* + * nonstd.h - A collection of trivial wrappers to allow typical libraries + * to work within the yaboot environment. + * + * Copyright 2011 Tony Breeds, IBM Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef NONSTD_H +#define NONSTD_H + +typedef int FILE; + +extern FILE *stdout; + +int printf(const char *format, ...); +int fprintf(FILE *stream, const char *format, ...); +int fputs(const char *s, FILE *stream); +int fflush(FILE *stream); +char *getenv(const char *name); + +#endif diff --git a/lib/malloc.c b/lib/malloc.c index 81d7717..0121112 100644 --- a/lib/malloc.c +++ b/lib/malloc.c @@ -23,6 +23,10 @@ #include "stddef.h" #include "string.h" +/* Copied from asm-generic/errno-base.h */ +#define ENOMEM 12 /* Out of memory */ +#define EINVAL 22 /* Invalid argument */ + /* Imported functions */ extern void prom_printf (char *fmt, ...); @@ -60,6 +64,49 @@ void *malloc (unsigned int size) return caddr; } +/* Do not fall back to the malloc above as posix_memalign is needed by + * external libraries not yaboot */ +int posix_memalign(void **memptr, size_t alignment, size_t size) +{ + char *caddr; + /* size of allocation including the alignment */ + size_t alloc_size; + + if (!malloc_ptr) + return EINVAL; + + /* Minimal aligment is sizeof(void *) */ + if (alignment < sizeof(void*)) + alignment = sizeof(void*); + + /* Check for valid alignment and power of 2 */ + if ((alignment % sizeof(void*) != 0) || ((alignment-1)&alignment)) + return EINVAL; + + if (size == 0) { + *memptr=NULL; + return 0; + } + + caddr = (char*)( + (size_t)((malloc_ptr + sizeof(int))+(alignment-1)) & + (~(alignment-1)) + ); + + alloc_size = size + (caddr - (malloc_ptr+sizeof(int))); + + if ((malloc_ptr + alloc_size + sizeof(int)) > malloc_top) + return ENOMEM; + + *(int *)(caddr - sizeof(int)) = size; + malloc_ptr += alloc_size + sizeof(int); + last_alloc = caddr; + malloc_ptr = (char *) ((((unsigned int) malloc_ptr) + 3) & (~3)); + *memptr=(void*)caddr; + + return 0; +} + void *realloc(void *ptr, unsigned int size) { char *caddr, *oaddr = ptr; diff --git a/lib/nonstd.c b/lib/nonstd.c new file mode 100644 index 0000000..5aeb0cb --- /dev/null +++ b/lib/nonstd.c @@ -0,0 +1,67 @@ +/* + * nonstd.c - A collection of trivial wrappers to allow typical libraries + * to work within the yaboot environment. + * + * Copyright 2011 Tony Breeds, IBM Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "ctype.h" +#include "types.h" +#include "stddef.h" +#include "stdlib.h" +#include "ctype.h" +#include "prom.h" +#include "nonstd.h" + +FILE *stdout; + +int printf(const char *format, ...) +{ + va_list ap; + va_start (ap, format); + prom_vfprintf (prom_stdout, format, ap); + va_end (ap); + + return 0; +} + +int fprintf(FILE *stream, const char *format, ...) +{ + va_list ap; + va_start (ap, format); + prom_vfprintf (prom_stdout, format, ap); + va_end (ap); + + return 0; +} + +int fputs(const char *s, FILE *stream) +{ + prom_printf("%s", s); + + return 0; +} + +int fflush(FILE *stream) +{ + return 0; +} + +char *getenv(const char *name) +{ + return NULL; +} -- 2.39.2