Author: wmb Date: Tue Mar 27 02:22:52 2012 New Revision: 2919 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2919
Log: Client library - big checkin to a) Support cell-sized stdin and stdout properties b) Clean up data typing to satisfy XCode compilers
Added: clients/lib/cellprop.c (contents, props changed) clients/lib/string.h (contents, props changed) clients/lib/x86/start.S Modified: clients/hello/hello.c clients/lib/1275.h clients/lib/arm/makefile clients/lib/arm/start.c clients/lib/debug.c clients/lib/intprop.c clients/lib/lib.c clients/lib/malloc.c clients/lib/malloc.h clients/lib/mem.c clients/lib/printf.c clients/lib/regprop.c clients/lib/strings.c clients/lib/strprop.c clients/lib/wrappers.c clients/lib/x86/makefile clients/lib/x86/start.s
Modified: clients/hello/hello.c ============================================================================== --- clients/hello/hello.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/hello/hello.c Tue Mar 27 02:22:52 2012 (r2919) @@ -1,4 +1,7 @@ -main() +#include "1275.h" + +int main() { printf("Hello, world\n"); + return 0; }
Modified: clients/lib/1275.h ============================================================================== --- clients/lib/1275.h Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/1275.h Tue Mar 27 02:22:52 2012 (r2919) @@ -1,13 +1,23 @@ // See license at end of file
-#include "types.h" +// ----------------------------------------------------------------- +// Type definitions and miscellaneous data structures
-typedef long phandle; -typedef long ihandle; +#ifndef __1275_h__ +#define __1275_h__ + +#define NULL 0 + +typedef unsigned char UCHAR; +typedef unsigned long ULONG; + +typedef ULONG cell_t ; +typedef ULONG phandle; +typedef ULONG ihandle;
typedef struct { - long hi, lo; - long size; + ULONG hi, lo; + ULONG size; } reg;
#ifdef putchar @@ -24,60 +34,73 @@
#define new(t) (t *)zalloc(sizeof(t));
-#ifdef SPRO -typedef long long cell_t; -#else -typedef unsigned long cell_t ; -#endif - -#ifdef CIF64 -#define LOW(index) ((index*2) + 1) -#else #define LOW(index) (index) -#endif
-extern int call_firmware(ULONG *); -extern void warn(char *fmt, ...); +// ----------------------------------------------------------------- +// External C library functions, and the like.
-#ifdef CIF64 -#define CIF_HANDLER_IN 6 -#else -#define CIF_HANDLER_IN 3 -#endif +#include <stdlib.h> + +extern int decode_int(UCHAR *); +extern void exit(int); +extern void fatal(char *fmt, ...); +extern void free(void *); +extern cell_t get_cell_prop(phandle, char *); +extern cell_t get_cell_prop_def(phandle, char *, cell_t); +extern int get_int_prop(phandle, char *); +extern int get_int_prop_def(phandle, char *, int); +extern char *get_str_prop(phandle, const char *, allocflag); +extern void *malloc(size_t); +extern void memcpy(void *, void *, size_t); +extern void memset(void *, int, size_t); +extern int memcmp(const void *, const void *, size_t); +extern int printf(char *fmt, ...); +extern void putchar(UCHAR); +extern void *realloc(void *, size_t); +extern void warn(char *fmt, ...); +extern void *zalloc(size_t);
+// ----------------------------------------------------------------- +// Open Firmware client interface calls. + +#define CIF_HANDLER_IN 3 extern int call_firmware(ULONG *); -extern void warn(char *fmt, ...); -int atoi(const char *s);
void OFClose(ihandle id); phandle OFPeer(phandle device_id); phandle OFChild(phandle device_id); phandle OFParent(phandle device_id); -long OFGetproplen(phandle device_id, char *name); -long OFGetprop(phandle device_id, char *name, char *buf, ULONG buflen); -long OFNextprop(phandle device_id, char *name, char *buf); -long OFSetprop(phandle device_id, char *name, char *buf, ULONG buflen); +long OFGetproplen(phandle device_id, const char *name); +long OFGetprop(phandle device_id, const char *name, UCHAR *buf, ULONG buflen); +long OFNextprop(phandle device_id, const char *name, UCHAR *buf); +long OFSetprop(phandle device_id, const char *name, UCHAR *buf, ULONG buflen); phandle OFFinddevice(char *devicename); ihandle OFOpen(char *devicename); ihandle OFCreate(char *devicename); void OFClose(ihandle id); -long OFRead(ihandle instance_id, char *addr, ULONG len); -long OFWrite(ihandle instance_id, char *addr, ULONG len); +long OFRead(ihandle instance_id, UCHAR *addr, ULONG len); +long OFWrite(ihandle instance_id, UCHAR *addr, ULONG len); long OFSeek(ihandle instance_id, ULONG poshi, ULONG poslo); -ULONG OFClaim(char *addr, ULONG size, ULONG align); -VOID OFRelease(char *addr, ULONG size); -long OFPackageToPath(phandle device_id, char *addr, ULONG buflen); +ULONG OFClaim(UCHAR *addr, ULONG size, ULONG align); +void OFRelease(UCHAR *addr, ULONG size); +long OFPackageToPath(phandle device_id, UCHAR *addr, ULONG buflen); phandle OFInstanceToPackage(ihandle ih); long OFCallMethod(char *method, ihandle id, ULONG arg); -long OFInterpret0(char *cmd); -ULONG OFMilliseconds(VOID); +long OFInterpret0(const char *cmd); +ULONG OFMilliseconds(void); void (*OFSetCallback(void (*func)(void)))(void); -long OFBoot(char *bootspec); -VOID OFEnter(VOID); -VOID OFExit(VOID); +void OFBoot(char *bootspec); +void OFEnter(void); +#ifdef __GNUC__ +void OFExit(void) __attribute__((noreturn)); +#else +void OFExit(void); +#endif long OFCallMethodV(char *method, ihandle id, int nargs, int nrets, ...); long OFInterpretV(char *cmd, int nargs, int nrets, ...);
+#endif // __1275_h__ + // LICENSE_BEGIN // Copyright (c) 2006 FirmWorks // @@ -101,3 +124,4 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // LICENSE_END +
Modified: clients/lib/arm/makefile ============================================================================== --- clients/lib/arm/makefile Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/arm/makefile Tue Mar 27 02:22:52 2012 (r2919) @@ -18,56 +18,56 @@ CFLAGS += -fno-stack-protector endif
+# DEVELOPER = $(shell xcode-select -print-path) +# SDK = $(shell xcodebuild -showsdks | grep iphoneos | head -1 | sed 's/.*-sdk //') +# CC = xcrun -sdk ${SDK} gcc +# +# Rationale for these flags: +# -Oz optimizes for smallest possible size. (Apple-specific) +# -fno-toplevel-reorder keeps inflate() as the first entry point. +# -ffreestanding means don't assume standard libraries, inlines, and builtins +# -thumb gives 30%-50% improvement over ARM32. +# -arch armv7 uses more powerful instructions for less space. +# -static -nostartfiles allows us to link this as a static text image. +# CFLAGS = -I.. -Oz -arch armv7 -mthumb -static -nostartfiles \ +# -I$(DEVELOPER)/Platforms/iPhoneOS.platform/Developer/SDKs/$(SDK).sdk/usr/include \ +# -fno-toplevel-reorder -ffreestanding +# +LIBOBJS = cellprop.o \ + debug.o \ + intprop.o \ + lib.o \ + malloc.o \ + mem.o \ + printf.o \ + regprop.o \ + strings.o \ + strprop.o \ + wrappers.o + all: libobp.a hello start.o
-libobp.a: lib.o printf.o wrappers.o malloc.o strings.o printf.o debug.o main.o intprop.o regprop.o strprop.o mem.o - ar rcv libobp.a lib.o malloc.o wrappers.o strings.o printf.o debug.o main.o intprop.o regprop.o strprop.o mem.o +libobp.a: ${LIBOBJS} + ar rcv libobp.a ${LIBOBJS} ranlib libobp.a
# Build machine-independent library routines
-main.o: ../main.c - ${CC} ${CFLAGS} -c ../main.c - -lib.o: ../lib.c - ${CC} ${CFLAGS} -c ../lib.c - -printf.o: ../printf.c - ${CC} ${CFLAGS} -c ../printf.c - -debug.o: ../debug.c - ${CC} ${CFLAGS} -c ../debug.c - -strings.o: ../strings.c - ${CC} ${CFLAGS} -c ../strings.c - -mem.o: ../mem.c - ${CC} ${CFLAGS} -c ../mem.c - -intprop.o: ../intprop.c - ${CC} ${CFLAGS} -c ../intprop.c - -regprop.o: ../regprop.c - ${CC} ${CFLAGS} -c ../regprop.c - -strprop.o: ../strprop.c - ${CC} ${CFLAGS} -c ../strprop.c - -wrappers.o: ../wrappers.c - ${CC} ${CFLAGS} -c ../wrappers.c - -malloc.o: ../malloc.c - ${CC} ${CFLAGS} -c ../malloc.c +%.o: ../%.c + ${CC} ${CFLAGS} -c $<
# Build processor-specific startup code and call gateway
start.o: start.c ${CC} ${CFLAGS} -c start.c
+# start.o: start.s +# ${CC} ${CFLAGS} -c start.s + # Hello is a demo program that uses the stdio library
hello: libobp.a start.o hello.o - ld -Bstatic -oformat elf32-powerpc -T ofclient.lds -Ttext 0x100000 -o hello start.o hello.o -L. -lobp + ${CC} ${CFLAGS} -e _start -o hello start.o hello.o -L. -lobp
hello.o: ../../hello/hello.c ${CC} ${CFLAGS} -c ../../hello/hello.c @@ -75,6 +75,5 @@ clean: rm -f *~ *.o hello* *.a
- dist: (cd ../..; tar cfh /tmp/lib.tar lib/*.c lib/*.h lib/ppcgcc/*.c lib/ppcgcc/*.lds lib/ppcgcc/makefile hello)
Modified: clients/lib/arm/start.c ============================================================================== --- clients/lib/arm/start.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/arm/start.c Tue Mar 27 02:22:52 2012 (r2919) @@ -13,7 +13,11 @@ extern void OFExit();
void +#ifdef __GNUC__ _start(void *promptr) +#else +start(void *promptr) +#endif { cif_handler = (int (*)()) promptr; ofw_setup();
Added: clients/lib/cellprop.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ clients/lib/cellprop.c Tue Mar 27 02:22:52 2012 (r2919) @@ -0,0 +1,66 @@ +// See license at end of file + +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +cell_t +decode_cell(UCHAR *p) +{ + int i; + cell_t res = 0; + + for (i = 0; i < sizeof(cell_t); i++) + res = (res << 8) + p[i]; + return res; +} + +cell_t +get_cell_prop(phandle node, char *key) +{ + cell_t res; + UCHAR buf[sizeof(cell_t)]; + + res = OFGetprop(node, key, buf, sizeof(cell_t)); + if (res != sizeof(cell_t)) { + return(-1); + } + return(decode_cell((UCHAR *) buf)); +} + +cell_t +get_cell_prop_def(phandle node, char *key, cell_t defval) +{ + cell_t res; + UCHAR buf[sizeof(cell_t)]; + + res = OFGetprop(node, key, buf, sizeof(cell_t)); + if (res != sizeof(cell_t)) { + return(defval); + } + return(decode_cell((UCHAR *) buf)); +} + +// LICENSE_BEGIN +// Copyright (c) 2006 FirmWorks +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// LICENSE_END
Modified: clients/lib/debug.c ============================================================================== --- clients/lib/debug.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/debug.c Tue Mar 27 02:22:52 2012 (r2919) @@ -10,7 +10,7 @@
int Debug = 0;
-VOID +void debug(int debug_level, char *fmt, ...) { va_list args;
Modified: clients/lib/intprop.c ============================================================================== --- clients/lib/intprop.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/intprop.c Tue Mar 27 02:22:52 2012 (r2919) @@ -17,7 +17,7 @@ get_int_prop(phandle node, char *key) { int res; - char buf[sizeof(int)]; + UCHAR buf[sizeof(int)];
res = OFGetprop(node, key, buf, sizeof(int)); if (res != sizeof(int)) { @@ -34,7 +34,7 @@ get_int_prop_def(phandle node, char *key, int defval) { int res; - char buf[sizeof(int)]; + UCHAR buf[sizeof(int)];
res = OFGetprop(node, key, buf, sizeof(int)); if (res != sizeof(int)) {
Modified: clients/lib/lib.c ============================================================================== --- clients/lib/lib.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/lib.c Tue Mar 27 02:22:52 2012 (r2919) @@ -3,13 +3,8 @@ /* For gcc, compile with -fno-builtin to suppress warnings */
#include "1275.h" - -extern void *malloc(); -extern char *get_str_prop(); -extern int get_int_prop(); -extern int get_int_prop_def(); - #include "stdio.h" +#include "string.h"
FILE _stdin = { -1, 0, 0}; FILE _stdout = { -1, 0, 0}; @@ -30,12 +25,13 @@ OFExit(); }
-VOID +void sleep(ULONG delay) { - delay = (delay * 1000) + OFMilliseconds(); - while ((OFMilliseconds() - delay) < 0) - ; + ULONG now = OFMilliseconds(); + delay *= 1000; + while ((OFMilliseconds() - now) < delay) + ; }
/* files */ @@ -48,6 +44,7 @@ return(_homedir); }
+void parse_homedir(char *progname) { char *p, *q, c; @@ -72,28 +69,31 @@ static char *argv[10]; phandle ph; char *argstr; - int i; + int i = 0; + extern int main(int, char**);
if ((ph = OFFinddevice("/chosen")) == -1) abort() ; - stdin->id = get_int_prop(ph, "stdin"); - stdout->id = get_int_prop(ph, "stdout"); + stdin->id = get_cell_prop(ph, "stdin"); + stdout->id = get_cell_prop(ph, "stdout");
argv[0] = get_str_prop(ph, "bootpath", ALLOC); + if (argv[0] != NULL) + parse_homedir(argv[0]); argstr = get_str_prop(ph, "bootargs", ALLOC); - - for (i = 1; i < 10;) { - if (*argstr == '\0') - break; - argv[i++] = argstr; - while (*argstr != ' ' && *argstr != '\0') - ++argstr; - if (*argstr == '\0') - break; - *argstr++ = '\0'; + if (argstr != NULL) { + for (i = 1; i < 10;) { + if (*argstr == '\0') + break; + argv[i++] = argstr; + while (*argstr != ' ' && *argstr != '\0') + ++argstr; + if (*argstr == '\0') + break; + *argstr++ = '\0'; + } } - parse_homedir(argv[0]); - main(i, argv); + return main(i, argv); }
FILE * @@ -202,11 +202,11 @@ }
int -fclose (FILE *fp) +fclose(FILE *fp) { fflush(fp); OFClose(fp->id); - free(fp); + free((UCHAR *)fp); return(0); }
@@ -216,13 +216,22 @@ return(fgetc(stdin)); }
-VOID -putchar(char c) +void +putchar(UCHAR c) { fputc(c, stdout); }
int +fputs(char *s, FILE *f) +{ + char c; + while ((c = *s++) != 0) + fputc(c, f); + return(0); +} + +int puts(char *s) { fputs(s, stdout); @@ -230,7 +239,7 @@ return(0); }
-VOID +void gets(char *buf) { while ((*buf = getchar()) != '\r') @@ -238,15 +247,6 @@ *buf = '\0'; }
-int -fputs(char *s, FILE *f) -{ - register char c; - while(c = *s++) - fputc(c, f); - return(0); -} - char * fgets(char *buf, int n, FILE *f) { @@ -260,23 +260,24 @@ return(buf); }
+int unlink(char *filename) { return(-1); /* XXX Implement me */ }
-system(char *str) +int +system(const char *str) { - OFInterpret0(str); + return (int)OFInterpret0(str); }
#define MAXENV 256 char * -getenv(char *str) +getenv(const char *str) { phandle ph; - int res;
if ((ph = OFFinddevice("/options")) == -1) return(NULL);
Modified: clients/lib/malloc.c ============================================================================== --- clients/lib/malloc.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/malloc.c Tue Mar 27 02:22:52 2012 (r2919) @@ -28,9 +28,7 @@
#define MALLOC #include "malloc.h" -#ifndef NULL -#define NULL 0 -#endif + #ifdef debug # define ASSERT(p,q) if (!(p)) fatal(q) #else @@ -43,16 +41,18 @@ */
#define PAGE_SIZE (ULONG)0x1000 -#define ULONG unsigned long
-char * -malloc(nbytes) - unsigned nbytes; +static ULONG _log2(ULONG n); +static void insque(struct qelem *, struct qelem *); +static void remque(struct qelem *); + +void * +malloc(size_t nbytes) { extern ULONG OFClaim(); - register struct overhead *p, *q; - register int surplus; - register struct qelem *bucket; + struct overhead *p, *q; + int surplus; + struct qelem *bucket; nbytes = ALIGN(nbytes, NALIGN) + sizeof(struct overhead); bucket = &buckets[_log2(nbytes-1) + 1]; /* log2 rounded up */ for (p = NULL; bucket < &buckets[NBUCKETS]; bucket++) { @@ -68,7 +68,7 @@ } if (p == NULL) { #ifdef USE_SBRK - register int i; + int i; p = (struct overhead *)CURBRK; if ((int)p == -1) return(NULL); @@ -80,7 +80,7 @@ q = (struct overhead *)CURBRK; if ((int)q == -1) return(NULL); - p->ov_length = (char *)q - (char *)p; + p->ov_length = (UCHAR *)q - (UCHAR *)p; surplus = p->ov_length - nbytes; /* add to end of adjacency chain */ ASSERT((FROMADJ(adjhead.q_back)) < p, "\nmalloc: Entry in \ @@ -110,7 +110,7 @@ } if (surplus > sizeof(struct overhead)) { /* if big enough, split it up */ - q = (struct overhead *)( (char *)p + nbytes); + q = (struct overhead *)( (UCHAR *)p + nbytes); q->ov_length = surplus; p->ov_length = nbytes; q->ov_magic = MAGIC_FREE; @@ -120,14 +120,13 @@ insque(TOBUK(q),&buckets[_log2(surplus)]); } p->ov_magic = MAGIC_BUSY; - return((char*)p + sizeof(struct overhead)); + return((void *)p + sizeof(struct overhead)); }
void -free(mem) -register char *mem; +free(void *mem) { - register struct overhead *p, *q; + struct overhead *p, *q; if (mem == NULL) return; p = (struct overhead *)(mem - sizeof(struct overhead)); @@ -142,14 +141,14 @@ a lower adjacent free area,\n addresses were found out of order!\n"); /* If lower segment can be merged */ if ( q->ov_magic == MAGIC_FREE - && (char *)q + q->ov_length == (char *)p + && (UCHAR *)q + q->ov_length == (UCHAR *)p ) { /* remove lower address area from bucket chain */ remque(TOBUK(q)); /* remove upper address area from adjacency chain */ remque(TOADJ(p)); q->ov_length += p->ov_length; - p->ov_magic = NULL; + p->ov_magic = 0; p = q; } } @@ -159,20 +158,20 @@ ASSERT(q > p, "\nfree: While trying to merge a free area with \ a higher adjacent free area,\n addresses were found out of order!\n"); if ( q->ov_magic == MAGIC_FREE - && (char *)p + p->ov_length == (char *)q + && (UCHAR *)p + p->ov_length == (UCHAR *)q ) { /* remove upper from bucket chain */ remque(TOBUK(q)); /* remove upper from adjacency chain */ remque(TOADJ(q)); p->ov_length += q->ov_length; - q->ov_magic = NULL; + q->ov_magic = 0; } } #ifdef USE_SBRK if ( /* freed area is at end of memory */ endfree && adjhead.q_back == TOADJ(p) - && (char*)p + p->ov_length == (char *)CURBRK + && (UCHAR*)p + p->ov_length == (UCHAR *)CURBRK ) { /* remove from end of adjacency chain */ remque(adjhead.q_back); @@ -187,16 +186,16 @@ return; }
-char * -realloc(mem,nbytes) -register char *mem; unsigned nbytes; -{ - register char *newmem; - register struct overhead *p, *q; - register int surplus; +void * +realloc(void *old, size_t nbytes) +{ + UCHAR *mem = (UCHAR *)old; + UCHAR *newmem; + struct overhead *p, *q; + int surplus; if (mem == NULL) return(malloc(nbytes)); - if(mem > (char*)FROMADJ(adjhead.q_back) + sizeof(struct overhead)) + if (mem > (UCHAR *)FROMADJ(adjhead.q_back) + sizeof(struct overhead)) return(NULL); p = (struct overhead *)(mem - sizeof(struct overhead)); @@ -215,14 +214,14 @@ #ifdef USE_SBRK if ( /* freed area is at end of memory */ endfree && adjhead.q_back == TOADJ(p) - && (char*)p + p->ov_length == (char *)CURBRK + && (UCHAR*)p + p->ov_length == (UCHAR *)CURBRK ) { /* release memory to system */ sbrk(-surplus); } else #endif { - q = (struct overhead *)( (char *)p + nbytes); + q = (struct overhead *)( (UCHAR *)p + nbytes); q->ov_length = surplus; q->ov_magic = MAGIC_FREE; insque(TOADJ(q),TOADJ(p)); @@ -238,32 +237,30 @@ } newmem = malloc(nbytes); if (newmem != mem && newmem != NULL) { - register int n; + int n; if (p->ov_magic == MAGIC_BUSY || p->ov_magic == MAGIC_FREE) { n = p->ov_length - sizeof(struct overhead); nbytes = (nbytes < n) ? nbytes : n ; } - memcpy(newmem,mem,nbytes); + memcpy(newmem, mem, nbytes); } if (p->ov_magic == MAGIC_BUSY) free(mem); return(newmem); }
-_log2(n) -register int n; +static ULONG _log2(ULONG n) { - register int i = 0; + int i = 0; while ((n >>= 1) > 0) i++; return(i); }
-void -insque(item,queu) -register struct qelem *item, *queu; +static void +insque(struct qelem *item, struct qelem *queu) { - register struct qelem *pueu; + struct qelem *pueu; pueu = queu->q_forw; item->q_forw = pueu; item->q_back = queu; @@ -271,11 +268,10 @@ pueu->q_back = item; }
-void -remque(item) -register struct qelem *item; +static void +remque(struct qelem *item) { - register struct qelem *queu, *pueu; + struct qelem *queu, *pueu; pueu = item->q_forw; queu = item->q_back; queu->q_forw = pueu;
Modified: clients/lib/malloc.h ============================================================================== --- clients/lib/malloc.h Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/malloc.h Tue Mar 27 02:22:52 2012 (r2919) @@ -4,6 +4,8 @@ * A "smarter" malloc William L. Sebok * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include "1275.h" + #define MAGIC_FREE 0x548a934c #define MAGIC_BUSY 0xc139569a
@@ -26,30 +28,30 @@ char endfree = 0; struct qelem adjhead = { &adjhead, &adjhead }; struct qelem buckets[NBUCKETS] = { - &buckets[0], &buckets[0], - &buckets[1], &buckets[1], - &buckets[2], &buckets[2], - &buckets[3], &buckets[3], - &buckets[4], &buckets[4], - &buckets[5], &buckets[5], - &buckets[6], &buckets[6], - &buckets[7], &buckets[7], - &buckets[8], &buckets[8], - &buckets[9], &buckets[9], - &buckets[10], &buckets[10], - &buckets[11], &buckets[11], - &buckets[12], &buckets[12], - &buckets[13], &buckets[13], - &buckets[14], &buckets[14], - &buckets[15], &buckets[15], - &buckets[16], &buckets[16], - &buckets[17], &buckets[17], - &buckets[18], &buckets[18], - &buckets[19], &buckets[19], - &buckets[20], &buckets[20], - &buckets[21], &buckets[21], - &buckets[22], &buckets[22], - &buckets[23], &buckets[23], + { &buckets[0], &buckets[0] }, + { &buckets[1], &buckets[1] }, + { &buckets[2], &buckets[2] }, + { &buckets[3], &buckets[3] }, + { &buckets[4], &buckets[4] }, + { &buckets[5], &buckets[5] }, + { &buckets[6], &buckets[6] }, + { &buckets[7], &buckets[7] }, + { &buckets[8], &buckets[8] }, + { &buckets[9], &buckets[9] }, + { &buckets[10], &buckets[10] }, + { &buckets[11], &buckets[11] }, + { &buckets[12], &buckets[12] }, + { &buckets[13], &buckets[13] }, + { &buckets[14], &buckets[14] }, + { &buckets[15], &buckets[15] }, + { &buckets[16], &buckets[16] }, + { &buckets[17], &buckets[17] }, + { &buckets[18], &buckets[18] }, + { &buckets[19], &buckets[19] }, + { &buckets[20], &buckets[20] }, + { &buckets[21], &buckets[21] }, + { &buckets[22], &buckets[22] }, + { &buckets[23], &buckets[23] }, }; #else extern char endfree; @@ -68,9 +70,6 @@ #define CURBRK sbrk(0) #endif
-extern void insque(), remque(); -extern char *malloc(), *realloc(); - // LICENSE_BEGIN // Copyright (c) 2006 FirmWorks //
Modified: clients/lib/mem.c ============================================================================== --- clients/lib/mem.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/mem.c Tue Mar 27 02:22:52 2012 (r2919) @@ -2,26 +2,26 @@
#include "1275.h"
-VOID -memcpy(char *to, char *from, int len) +void +memcpy(void *to, void *from, size_t len) { - while (len--) - *to++ = *from++; + while (len-- > 0) + *(UCHAR *)to++ = *(UCHAR *)from++; }
-VOID -memset(char *cp, int c, int len) +void +memset(void *cp, int c, size_t len) { - while (len--) - *(cp + len) = c; + while (len-- > 0) + *((UCHAR *)cp + len) = c; }
int -memcmp(const void *s1, const void *s2, int n) +memcmp(const void *s1, const void *s2, size_t n) { int diff; - while (n--) { - diff = *(unsigned char *)s1++ - *(unsigned char *)s2++; + while (n-- > 0) { + diff = *(UCHAR *)s1++ - *(UCHAR *)s2++; if (diff) return (diff < 0) ? -1 : 1; }
Modified: clients/lib/printf.c ============================================================================== --- clients/lib/printf.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/printf.c Tue Mar 27 02:22:52 2012 (r2919) @@ -16,7 +16,7 @@ int digit; const char *send = s+len;
- if (s != send && *s == '+' || *s == '-') { + if (s != send && (*s == '+' || *s == '-')) { minus = *s == '-'; s++; } @@ -69,7 +69,7 @@ return (int)strtol(s, NULL, 10); }
-STATIC int +static int printbase(ULONG x, int base, int fieldlen, char padchar, int upcase) { static char lc_digits[] = "0123456789abcdef"; @@ -80,7 +80,7 @@
memset(buf, 32, 0);
- if (base == 10 && (LONG) x < 0) { + if (base == 10 && (long) x < 0) { *s++ = '-'; x = -x; } @@ -92,7 +92,6 @@ x /= base; } while (x);
-cvtdone: for (fieldlen -= (s-buf); fieldlen > 0; --fieldlen) { putchar(padchar); n++; @@ -116,7 +115,7 @@ unsigned long mask; char padchar;
- while (c = *fmt++) { + while ((c = *fmt++)) { if (c != '%') { putchar(c); n++; @@ -149,7 +148,7 @@ goto out; } while (c == 'h') { // Mask for short modifier - if (mask = 0xffff) + if (mask == 0xffff) mask = 0xff; else mask = 0xffff; @@ -209,7 +208,7 @@ return (i); }
-VOID +void warn(char *fmt, ...) { va_list args; @@ -219,7 +218,7 @@ va_end(args); }
-VOID +void fatal(char *fmt, ...) { va_list args;
Modified: clients/lib/regprop.c ============================================================================== --- clients/lib/regprop.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/regprop.c Tue Mar 27 02:22:52 2012 (r2919) @@ -9,7 +9,6 @@ { static reg staticreg; reg *sregp; - int i;
if (buflen) staticreg.hi = decode_int(buf); @@ -24,11 +23,11 @@ get_reg_prop(phandle node, char *key) { int res; - char *buf; + UCHAR *buf; reg *regp; int len = OFGetproplen(node, key);
- buf = (char *)malloc(len); + buf = (UCHAR *)malloc(len); res = OFGetprop(node, key, buf, len); if (res != len) { fatal("get_reg_prop(node %x, key '%s', len %x) returned %x\n",
Added: clients/lib/string.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ clients/lib/string.h Tue Mar 27 02:22:52 2012 (r2919) @@ -0,0 +1,18 @@ +#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') +#define TOLOWER(c) ((c) - 'A' + 'a') + +int strcmp(const char *s, const char *t); +int strncmp(const char *s, const char *t, size_t len); +int strcasecmp(const char *s, const char *t); +int strncasecmp(const char *s, const char *t, size_t len); +int strlen(const char *s); +int strnlen(const char *s, size_t maxlen); +char *strcpy(char *to, const char *from); +char *strncpy(char *to, const char *from, size_t maxlen); +char *strcat(char *to, const char *from); +char *strchr(char *s, int c); +char *strctok(char *s, const char sep); +char *strstr(const char *haystack, const char *needle); +char *strcasestr(const char *haystack, const char *needle); +const void *memchr(const void *s, int c, size_t len); +int toupper(int c);
Modified: clients/lib/strings.c ============================================================================== --- clients/lib/strings.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/strings.c Tue Mar 27 02:22:52 2012 (r2919) @@ -3,9 +3,7 @@ /* For gcc, compile with -fno-builtin to suppress warnings */
#include "1275.h" - -#define ISUPPER(c) ((c) >= 'A' && (c) <= 'Z') -#define TOLOWER(c) ((c) + 'a' - 'A') +#include "string.h"
int strcmp(const char *s, const char *t) @@ -22,7 +20,7 @@ }
int -strncmp(const char *s, const char *t, int len) +strncmp(const char *s, const char *t, size_t len) { int diff = 0; int i; @@ -58,7 +56,7 @@ }
int -strncasecmp(const char *s, const char *t, int len) +strncasecmp(const char *s, const char *t, size_t len) { char sc, tc; int diff = 0; @@ -89,7 +87,7 @@ }
int -strnlen(const char *s, int maxlen) +strnlen(const char *s, size_t maxlen) { int i;
@@ -103,13 +101,13 @@ { int i = 0;
- while (to[i] = from[i]) + while ((to[i] = from[i])) i += 1; return to; }
char * -strncpy(char *to, const char *from, int maxlen) +strncpy(char *to, const char *from, size_t maxlen) { int i = 0;
@@ -190,7 +188,7 @@ return NULL; }
-const void *memchr(const void *s, int c, int len) +const void *memchr(const void *s, int c, size_t len) { const unsigned char *p = s; while (len--) {
Modified: clients/lib/strprop.c ============================================================================== --- clients/lib/strprop.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/strprop.c Tue Mar 27 02:22:52 2012 (r2919) @@ -4,33 +4,34 @@
#include "1275.h"
-extern void *malloc(); -VOID * -zalloc(int size) +void * +zalloc(size_t size) { - VOID *vp; + void *vp;
- vp = (void *)malloc(size); + vp = malloc(size); memset(vp, size, 0); return (vp); }
char * -get_str_prop(phandle node, char *key, allocflag alloc) +get_str_prop(phandle node, const char *key, allocflag alloc) { - int len, res; - static char *priv_buf, priv_buf_len = 0; + ULONG len; + int res; + static char *priv_buf; + static ULONG priv_buf_len = 0; char *cp;
len = OFGetproplen(node, key); - if (len == -1 || len == 0) - return((char *) 0); - /* - * Leave room for a null terminator, on the off chance that the - * property isn't null-terminated. + * Properly encoded properties have a null terminator, + * so if len == 1 we have a null string. */ - len += 1; + if (len == -1 || len == 0 || len == 1) { + return((char *) 0); + } + if (alloc == ALLOC) cp = (char *) zalloc(len); else { @@ -40,12 +41,11 @@ priv_buf = (char *) zalloc(len); priv_buf_len = len; } else - memset(priv_buf, len, 0); + memset((void *)priv_buf, len, 0); cp = priv_buf; } - len -= 1;
- res = OFGetprop(node, key, cp, len); + res = OFGetprop(node, key, (UCHAR *)cp, len); if (res != len) { fatal( "get_str_prop(node %x, key '%s', len %x) returned len %x\n",
Modified: clients/lib/wrappers.c ============================================================================== --- clients/lib/wrappers.c Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/wrappers.c Tue Mar 27 02:22:52 2012 (r2919) @@ -53,11 +53,7 @@ phandle OFPeer(phandle device_id) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"peer", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"peer",1,1,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = device_id; if (call_firmware(argarray) != 0) { @@ -69,11 +65,7 @@ phandle OFChild(phandle device_id) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"child", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"child",1,1,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = device_id; if (call_firmware(argarray) != 0) { @@ -85,11 +77,7 @@ phandle OFParent(phandle device_id) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"parent", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"parent", 1,1,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = device_id; if (call_firmware(argarray) != 0) { @@ -101,14 +89,10 @@ long OFGetproplen( phandle device_id, - char *name + const char *name ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"getproplen", 0,2, 0,1, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"getproplen", 2,1,0,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)device_id; argarray[CIF_HANDLER_IN+LOW(1)] = (long)name; if (call_firmware(argarray) != 0) @@ -121,16 +105,12 @@ long OFGetprop( phandle device_id, - char *name, - char *buf, + const char *name, + UCHAR *buf, ULONG buflen ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"getprop", 0,4, 0,1, 0,0, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"getprop", 4,1,0,0,0,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)device_id; argarray[CIF_HANDLER_IN+LOW(1)] = (long)name; argarray[CIF_HANDLER_IN+LOW(2)] = (long)buf; @@ -145,15 +125,11 @@ long OFNextprop( phandle device_id, - char *name, - char *buf + const char *name, + UCHAR *buf ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"nextprop", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"nextprop", 3,1,0,0,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)device_id; argarray[CIF_HANDLER_IN+LOW(1)] = (long)name; argarray[CIF_HANDLER_IN+LOW(2)] = (long)buf; @@ -167,16 +143,12 @@ long OFSetprop( phandle device_id, - char *name, - char *buf, + const char *name, + UCHAR *buf, ULONG buflen ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"setprop", 0,4, 0,1, 0,0, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"setprop", 4,1,0,0,0,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)device_id; argarray[CIF_HANDLER_IN+LOW(1)] = (long)name; argarray[CIF_HANDLER_IN+LOW(2)] = (long)buf; @@ -191,11 +163,7 @@ phandle OFFinddevice( char *devicename) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"finddevice", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"finddevice", 1,1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (long)devicename; if (call_firmware(argarray) != 0) @@ -208,11 +176,7 @@ ihandle OFOpen( char *devicename) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"open", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"open", 1,1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (long)devicename; if (call_firmware(argarray) != 0) @@ -226,11 +190,7 @@ ihandle OFCreate( char *devicename) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"firmworks,create", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"firmworks,create", 1,1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (long)devicename; if (call_firmware(argarray) != 0) @@ -243,11 +203,7 @@ void OFClose(ihandle id) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"close", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"close", 1,1,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)id; if (call_firmware(argarray) != 0) { @@ -261,15 +217,11 @@ long OFRead( ihandle instance_id, - char *addr, + UCHAR *addr, ULONG len ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"read", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"read", 3,1,0,0,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (long) instance_id; argarray[CIF_HANDLER_IN+LOW(1)] = (cell_t)addr; @@ -284,15 +236,11 @@ long OFWrite( ihandle instance_id, - char *addr, + UCHAR *addr, ULONG len ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"write", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"write", 3,1,0,0,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (long) instance_id; argarray[CIF_HANDLER_IN+LOW(1)] = (cell_t)addr; @@ -311,11 +259,7 @@ ULONG poslo ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"seek", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"seek", 3,1,0,0,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (long) instance_id; argarray[CIF_HANDLER_IN+LOW(1)] = poshi; @@ -328,16 +272,12 @@
ULONG OFClaim( - char *addr, + UCHAR *addr, ULONG size, ULONG align ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"claim", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"claim", 3,1,0,0,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)addr; argarray[CIF_HANDLER_IN+LOW(1)] = size; @@ -349,17 +289,13 @@ return (argarray[CIF_HANDLER_IN+LOW(3)]); }
-VOID +void OFRelease( - char *addr, + UCHAR *addr, ULONG size ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"release", 0,2, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"release", 2,0,0,0}; -#endif argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)addr; argarray[CIF_HANDLER_IN+LOW(1)] = size; call_firmware(argarray); @@ -368,15 +304,11 @@ long OFPackageToPath( phandle device_id, - char *addr, + UCHAR *addr, ULONG buflen ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"package-to-path", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"package-to-path", 3,1,0,0,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)device_id; argarray[CIF_HANDLER_IN+LOW(1)] = (cell_t)addr; @@ -385,24 +317,20 @@ { return (-1); } - return ((LONG)argarray[CIF_HANDLER_IN+LOW(3)]); + return ((ULONG)argarray[CIF_HANDLER_IN+LOW(3)]); }
phandle OFInstanceToPackage(ihandle ih) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"instance-to-package", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"instance-to-package", 1,1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)ih; if (call_firmware(argarray) != 0) { return (-1); } - return ((LONG)argarray[CIF_HANDLER_IN+LOW(1)]); + return ((ULONG)argarray[CIF_HANDLER_IN+LOW(1)]); }
long @@ -412,11 +340,7 @@ ULONG arg ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"call-method", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"call-method", 3,1,0,0,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)method; argarray[CIF_HANDLER_IN+LOW(1)] = (cell_t)id; @@ -425,7 +349,7 @@ { return (-1); } - return ((LONG)argarray[CIF_HANDLER_IN+LOW(3)]); + return ((ULONG)argarray[CIF_HANDLER_IN+LOW(3)]); }
#include <stdarg.h> @@ -440,16 +364,11 @@ ... ) { -#ifdef CIF64 - ULONG argarray[(MAXARGS+6)*2] = { 0 }; -#else cell_t argarray[MAXARGS+6] = { 0 }; -#endif va_list ap; int retval; int *intp; int argnum = 0; - unsigned long flags;
argarray[LOW(argnum++)] = (cell_t)"call-method"; argarray[LOW(argnum++)] = (cell_t)numargs+2; @@ -480,21 +399,17 @@
long OFInterpret0( - char *cmd + const char *cmd ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"interpret", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"interpret", 1,1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)cmd; if (call_firmware(argarray) != 0) { return (-1); } - return ((LONG)argarray[CIF_HANDLER_IN+LOW(1)]); + return ((ULONG)argarray[CIF_HANDLER_IN+LOW(1)]); }
long @@ -505,16 +420,11 @@ ... ) { -#ifdef CIF64 - ULONG argarray[(MAXARGS+5)*2] = { 0 }; -#else cell_t argarray[MAXARGS+5] = { 0 }; -#endif va_list ap; int retval; int *intp; int argnum = 0; - unsigned long flags;
argarray[LOW(argnum++)] = (cell_t)"interpret"; argarray[LOW(argnum++)] = (cell_t)numargs+1; @@ -544,13 +454,9 @@
ULONG -OFMilliseconds( VOID ) +OFMilliseconds( void ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"milliseconds", 0,0, 0,1, 0,0}; -#else cell_t argarray[] = { (cell_t)"milliseconds", 0,1,0}; -#endif if (call_firmware(argarray) != 0) { return (ULONG)0; @@ -560,11 +466,7 @@
void (*OFSetCallback(void (*func)(void)))(void) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"set-callback", 0,1, 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"set-callback", 1,1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)func; if (call_firmware(argarray) != 0) @@ -574,43 +476,32 @@ return ((void (*)(void))argarray[CIF_HANDLER_IN+LOW(1)]); }
-long +void OFBoot( char *bootspec ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"boot", 0,1, 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"boot", 1,0,0}; -#endif
argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)bootspec; call_firmware(argarray); }
-VOID -OFEnter( VOID ) +void +OFEnter( void ) { -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"enter", 0,0, 0,0}; -#else cell_t argarray[] = { (cell_t)"enter", 0,0}; -#endif
call_firmware(argarray); }
-/* volatile VOID */ - VOID -OFExit( VOID ) -{ -#ifdef CIF64 - ULONG argarray[] = { 0,(ULONG)"exit", 0,0, 0,0}; -#else +/* volatile void */ + void +OFExit( void ) +{ cell_t argarray[] = { (cell_t)"exit", 0,0}; -#endif call_firmware(argarray); + while (1); }
// LICENSE_BEGIN
Modified: clients/lib/x86/makefile ============================================================================== --- clients/lib/x86/makefile Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/x86/makefile Tue Mar 27 02:22:52 2012 (r2919) @@ -1,15 +1,27 @@ -# This makefile has been tested on a FreeBSD 2.2.5 system with GCC +# This makefile has been tested on OS X 10.6 with GCC
-# -fno-builtin has the effect of suppressing some warnings about -# functions that conflict with gcc builtins CC=gcc -CFLAGS=-g -m32 -fno-builtin -fno-stack-limit -fno-stack-protector +#CFLAGS=-g -m32 -fno-builtin -fno-stack-limit -fno-stack-protector +CFLAGS=-g -m32 -nostdlib -nostartfiles -fno-builtin -ffreestanding -fno-stack-protector -I.. +LFLAGS=-L.
-all: libobp.a hello hello.elf start.o +#all: libobp.a hello hello.elf start.o +all: libobp.a hello start.o
# Create a library file containing all the library routines
-OBJS=lib.o printf.o wrappers.o malloc.o strings.o printf.o debug.o main.o intprop.o regprop.o strprop.o mem.o callofw.o +OBJS= callofw.o \ + cellprop.o \ + debug.o \ + intprop.o \ + lib.o \ + malloc.o \ + mem.o \ + printf.o \ + regprop.o \ + strings.o \ + strprop.o \ + wrappers.o
libobp.a: ${OBJS} ar rcv libobp.a ${OBJS} @@ -22,21 +34,21 @@
# Build processor-specific startup code and call gateway
-start.o: start.s - ${CC} ${CFLAGS} -c start.s +start.o: start.S + ${CC} ${CFLAGS} -c start.S
# Hello is a demo program that uses the stdio library
-hello.elf: libobp.a start.o hello.o - ld -melf_i386 -Bstatic -N -Ttext 0x100000 -o $@ start.o hello.o libobp.a -lc - cp hello.elf hello.syms - strip hello.elf +#hello.elf: libobp.a start.o hello.o +# ld -melf_i386 -Bstatic -N -Ttext 0x100000 -o $@ start.o hello.o libobp.a -lc +# cp hello.elf hello.syms +# strip hello.elf
hello.o: ../../hello/hello.c ${CC} ${CFLAGS} -c ../../hello/hello.c
-hello: hello.o - ${CC} -m32 $< -o $@ +hello: start.o hello.o libobp.a + ${CC} ${CFLAGS} ${LFLAGS} start.o hello.o -o $@ -lobp
# Binary to ELF converter program
Added: clients/lib/x86/start.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ clients/lib/x86/start.S Tue Mar 27 02:22:52 2012 (r2919) @@ -0,0 +1,88 @@ +# See license at end of file + + .file "start.s" +.data + .align 2 +#ifdef __GNUC__ + .type _cifentry,@object + .size _cifentry,4 +#endif +_cifentry: + .long 0 + +LEB0: + .ascii "exit\0" + +#ifdef __GNUC__ + .type _exitblock,@object + .size _exitblock,12 +#endif +_exitblock: + .long LEB0 + .long 0 + .long 0 + +.text + .align 2 +#ifdef __GNUC__ + .globl _start +_start: +#else + .globl start +start: +#endif +# pushl %ebp +# movl %esp,%ebp + movl %eax,_cifentry + +#ifdef __GNUC__ + call ofw_setup +#else + call _ofw_setup +#endif + lea _exitblock, %eax + movl _cifentry,%ebx + call *%ebx +# jmp L1 +# .align 2,0x90 +#L1: +# leave + ret + +#ifdef __GNUC__ + .globl call_firmware +call_firmware: +#else + .globl _call_firmware +_call_firmware: +#endif + movl 4(%esp),%eax + push %ebx + movl _cifentry,%ebx + call *%ebx + pop %ebx + ret + +# LICENSE_BEGIN +# Copyright (c) 2006 FirmWorks +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# LICENSE_END
Modified: clients/lib/x86/start.s ============================================================================== --- clients/lib/x86/start.s Tue Mar 27 02:14:21 2012 (r2918) +++ clients/lib/x86/start.s Tue Mar 27 02:22:52 2012 (r2919) @@ -1,54 +1,75 @@ +# 1 "../../../clients/lib/x86/start.S" +# 1 "<built-in>" +# 1 "<command-line>" +# 1 "../../../clients/lib/x86/start.S" # See license at end of file
- .file "start.s" + .file "start.s" .data - .align 2 - .type _cifentry,@object - .size _cifentry,4 + .align 2 + + .type _cifentry,@object + .size _cifentry,4 + _cifentry: - .long 0 + .long 0
LEB0: - .ascii "exit\0" + .ascii "exit\0" + + + .type _exitblock,@object + .size _exitblock,12
- .type _exitblock,@object - .size _exitblock,12 _exitblock: - .long LEB0 - .long 0 - .long 0 + .long LEB0 + .long 0 + .long 0
.text - .align 2 -.globl _start - .type _start,@function + .align 2 + + .globl _start _start: -# pushl %ebp -# movl %esp,%ebp - movl %eax,_cifentry - call ofw_setup - lea _exitblock, %eax - movl _cifentry,%ebx - call *%ebx -# jmp L1 -# .align 2,0x90 + + + + +# pushl %ebp +# movl %esp,%ebp + movl %eax,_cifentry + + + call ofw_setup + + + + lea _exitblock, %eax + movl _cifentry,%ebx + call *%ebx +# jmp L1 +# .align 2,0x90 #L1: -# leave - ret +# leave + ret +
-.globl call_firmware - .type call_firmware,@function + .globl call_firmware call_firmware: - movl 4(%esp),%eax - push %ebx - movl _cifentry,%ebx - call *%ebx - pop %ebx - ret + + + + + movl 4(%esp),%eax + push %ebx + movl _cifentry,%ebx + call *%ebx + pop %ebx + ret
# LICENSE_BEGIN # Copyright (c) 2006 FirmWorks -# + # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including @@ -56,10 +77,10 @@ # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: -# + # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. -# + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -67,5 +88,5 @@ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# + # LICENSE_END
openfirmware@openfirmware.info