Author: fireball Date: Fri Jun 1 21:39:49 2007 New Revision: 26960
URL: http://svn.reactos.org/svn/reactos?rev=26960&view=rev Log: - Added OFW function calls lib by FirmWorks (should be changed to arty's OFW generation tool in future). - Hacked FreeLdr's multiboot entry point, so it does what's needed by the OFW loading stub. - We can call OFW functions from FreeLdr now.
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/1275.h (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/debug.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/intprop.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/lib.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/main.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.h (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/mem.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/printf.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/regprop.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/stdio.h (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/strprop.c (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/types.h (with props) branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/wrappers.c (with props) Modified: branches/olpc/boot/freeldr/freeldr/arch/i386/arch.S branches/olpc/boot/freeldr/freeldr/freeldr.c branches/olpc/boot/freeldr/freeldr/freeldr_arch.rbuild
Modified: branches/olpc/boot/freeldr/freeldr/arch/i386/arch.S URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/arch.S (original) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/arch.S Fri Jun 1 21:39:49 2007 @@ -276,6 +276,14 @@
ret
+EXTERN(_call_firmware) + movl 4(%esp),%eax + push %ebx + movl cifentry,%ebx + call *%ebx + pop %ebx + ret + /* Multiboot support * * Allows freeldr to be loaded as a "multiboot kernel" by @@ -295,7 +303,7 @@ * ourself to 0x8000 */ #define FREELDR_BASE 0x8000 -#define INITIAL_BASE 0x200000 +#define INITIAL_BASE 0x8000
/* Align 32 bits boundary */ .align 4 @@ -328,26 +336,29 @@ /* Although the multiboot spec says we should be called with the * segment registers set to 4GB flat mode, let's be sure and set up * our own */ - lgdt gdtptrhigh + INITIAL_BASE - FREELDR_BASE + /* lgdt gdtptrhigh + INITIAL_BASE - FREELDR_BASE */ /* Reload segment selectors */ - ljmp $PMODE_CS, $(mb1 + INITIAL_BASE - FREELDR_BASE) +/* ljmp $PMODE_CS, $(mb1 + INITIAL_BASE - FREELDR_BASE) mb1: movw $PMODE_DS,%dx movw %dx,%ds - movw %dx,%es + movw %dx,%es*/
/* Check for valid multiboot signature */ cmpl $MULTIBOOT_BOOTLOADER_MAGIC,%eax jne mbfail
+ /* Store pointer to OFW */ + movl %esi,cifentry + /* Store multiboot info in a safe place */ - movl %ebx,%esi - movl $(mb_info + INITIAL_BASE - FREELDR_BASE),%edi - movl $MB_INFO_SIZE,%ecx - rep movsb + //movl %ebx,%esi + //movl $(mb_info + INITIAL_BASE - FREELDR_BASE),%edi + //movl $MB_INFO_SIZE,%ecx + //rep movsb
/* Save commandline */ - movl MB_INFO_FLAGS_OFFSET(%ebx),%edx + /*movl MB_INFO_FLAGS_OFFSET(%ebx),%edx testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx) jz mb3 movl MB_INFO_COMMAND_LINE_OFFSET(%ebx),%esi @@ -358,57 +369,56 @@ testb %al,%al jz mb3 dec %ecx - jnz mb2 + jnz mb2*/ mb3:
/* Copy to low mem */ - movl $INITIAL_BASE,%esi - movl $FREELDR_BASE,%edi - movl $(__bss_end__ - FREELDR_BASE),%ecx - addl $3,%ecx - shrl $2,%ecx - rep movsl + //movl $INITIAL_BASE,%esi + //movl $FREELDR_BASE,%edi + //movl $(__bss_end__ - FREELDR_BASE),%ecx + //addl $3,%ecx + //shrl $2,%ecx + //rep movsl
/* Load the GDT and IDT */ - lgdt gdtptr - lidt i386idtptr + //lgdt gdtptr + //lidt i386idtptr
/* Clear prefetch queue & correct CS, * jump to low mem */ - ljmp $PMODE_CS, $mb4 -mb4: + //ljmp $PMODE_CS, $mb4 +//mb4: /* Reload segment selectors */ - movw $PMODE_DS,%dx - movw %dx,%ds - movw %dx,%es - movw %dx,%fs - movw %dx,%gs - movw %dx,%ss - movl $STACK32ADDR,%esp - - movl $mb_info,%ebx + //movw $PMODE_DS,%dx + //movw %dx,%ds + //movw %dx,%es + //movw %dx,%fs + //movw %dx,%gs + //movw %dx,%ss + //movl $STACK32ADDR,%esp + + //movl $mb_info,%ebx /* See if the boot device was passed in */ - movl MB_INFO_FLAGS_OFFSET(%ebx),%edx - testl $MB_INFO_FLAG_BOOT_DEVICE,%edx - jz mb5 + //movl MB_INFO_FLAGS_OFFSET(%ebx),%edx + //testl $MB_INFO_FLAG_BOOT_DEVICE,%edx + //jz mb5 /* Retrieve boot device info */ - movl MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax - shrl $16,%eax - incb %al - movb %al,_i386BootPartition - movb %ah,_i386BootDrive - jmp mb6 + //movl MB_INFO_BOOT_DEVICE_OFFSET(%ebx),%eax + //shrl $16,%eax + //incb %al + //movb %al,_i386BootPartition + //movb %ah,_i386BootDrive + //jmp mb6 mb5: /* No boot device known, assume first partition of first harddisk */ movb $0x80,_i386BootDrive movb $1,_i386BootPartition mb6: /* Check for command line */ - mov $cmdline,%eax - testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx) - jnz mb7 - xorl %eax,%eax + //mov $cmdline,%eax + //testl $MB_INFO_FLAG_COMMAND_LINE,MB_INFO_FLAGS_OFFSET(%ebx) + //jnz mb7 + //xorl %eax,%eax mb7: - /* GO! */ pushl %eax call _BootMain @@ -484,6 +494,10 @@ .word 0x3ff /* Limit */ .long 0 /* Base Address */
+/* Pointer to OFW */ +cifentry: + .long 0 + EXTERN(_i386BootDrive) .long 0
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/1275.h URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/1275.h (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/1275.h Fri Jun 1 21:39:49 2007 @@ -1,0 +1,49 @@ +// See license at end of file + +#include "types.h" + +typedef long phandle; +typedef long ihandle; + +typedef struct { + long hi, lo; + long size; +} reg; + +#ifdef putchar +# undef putchar +#endif +#ifdef puts +# undef puts +#endif + +typedef enum { + NOALLOC, + ALLOC +} allocflag; + +#define new(t) (t *)zalloc(sizeof(t)); + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/1275.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/debug.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/debug.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/debug.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,51 @@ +// See license at end of file + +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +#include <stdarg.h> + +int level = 0; + +int Debug = 0; + +VOID +debug(int debug_level, char *fmt, ...) +{ + va_list args; + int i; + + if (!(debug_level & Debug)) + return; + + va_start(args, fmt); + for (i = 0; i < level; ++i) + putchar('\t'); + printf(fmt, args); + va_end(args); +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/debug.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/intprop.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/intprop.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/intprop.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,68 @@ +// See license at end of file + +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +int +decode_int(UCHAR *p) +{ + ULONG i = *p++ << 8; + i = (i + *p++) << 8; + i = (i + *p++) << 8; + return (i + *p); +} + +int +get_int_prop(phandle node, char *key) +{ + int res; + char buf[sizeof(int)]; + + res = OFGetprop(node, key, buf, sizeof(int)); + if (res != sizeof(int)) { +#ifdef notdef + fatal("get_int_prop(node %x, key '%s') returned %x\n", + node, key, res); +#endif + return(-1); + } + return(decode_int((UCHAR *) buf)); +} + +int +get_int_prop_def(phandle node, char *key, int defval) +{ + int res; + char buf[sizeof(int)]; + + res = OFGetprop(node, key, buf, sizeof(int)); + if (res != sizeof(int)) { + return(defval); + } + return(decode_int((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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/intprop.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/lib.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/lib.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/lib.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,272 @@ +// See license at end of file + +/* 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(); + +void +abort() +{ + OFExit(); +} + +void +exit() +{ + OFExit(); +} + +VOID +sleep(ULONG delay) +{ + delay = (delay * 1000) + OFMilliseconds(); + while ((OFMilliseconds() - delay) < 0) + ; +} + +/* files */ + +#include "stdio.h" + +FILE _stdin = { -1, 0, 0}; +FILE _stdout = { -1, 0, 0}; +FILE *stdin = &_stdin; +FILE *stdout = &_stdout; + +char _homedir[128]; + +char * +gethomedir() +{ + return(_homedir); +} + +parse_homedir(char *progname) +{ + char *p, *q, c; + + p = progname + strlen(progname); + while (p > progname) { + c = *--p; + if (c == ',' || c == ':' || c == '\') { + ++p; + break; + } + } + for (q = _homedir; progname < p; ) + *q++ = *progname++; + + *q = '\0'; +} + +FILE * +fopen (char *name, char *mode) +{ + FILE *fp; + + fp = (FILE *)malloc(sizeof(struct _file)); + if (fp == (FILE *)NULL) + return ((FILE *)NULL); + + if ((fp->id = OFOpen(name)) == 0) + return ((FILE *)NULL); + + fp->bufc = 0; + return(fp); +} + +int +ferror(FILE *fp) +{ + return(0); /* Implement me */ +} + +void +fputc(char c, FILE *fp) +{ + if (fp == stdout && c == '\n') + fputc('\r', fp); + + fp->buf[fp->bufc++] = c; + + if ((fp->bufc == 127) || (fp == stdout && c == '\n')) { + OFWrite(fp->id, fp->buf, fp->bufc); + fp->bufc = 0; + } +} + +void +fflush (FILE *fp) +{ + if (fp->bufc != 0) { + OFWrite(fp->id, fp->buf, fp->bufc); + fp->bufc = 0; + } +} + +int +fgetc(FILE *fp) +{ + int count; + + /* try to read from the buffer */ + if (fp->bufc != 0) { + fp->bufc--; + return(*fp->inbufp++); + } + + /* read from the file */ + do { + count = OFRead(fp->id, fp->buf, 128); + } while (count == -2); /* Wait until input available */ + + if (count > 0) + { + fp->bufc = count-1; + fp->inbufp = fp->buf; + return(*fp->inbufp++); + } + + /* otherwise return EOF */ + return (-1); +} + +int +fclose (FILE *fp) +{ + fflush(fp); + OFClose(fp->id); + free(fp); + return(0); +} + +int +getchar() +{ + return(fgetc(stdin)); +} + +VOID +putchar(char c) +{ + fputc(c, stdout); +} + +int +puts(char *s) +{ + fputs(s, stdout); + putchar('\n'); + return(0); +} + +VOID +gets(char *buf) +{ + while ((*buf = getchar()) != '\r') + buf++; + *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) +{ + char *p = buf; + + while ((n > 1) && ((*p = fgetc(f)) != '\n')) { + p++; + n--; + } + *p = '\0'; + return(buf); +} + +unlink(char *filename) +{ + return(-1); +/* XXX Implement me */ +} + +system(char *str) +{ + OFInterpret0(str); +} + +#define MAXENV 256 +char * +getenv(char *str) +{ + phandle ph; + int res; + + if ((ph = OFFinddevice("/options")) == -1) + return(NULL); + + return (get_str_prop(ph, str, 0)); +} + +int +stdout_rows() +{ + phandle ph; + int res; + + if ((ph = OFFinddevice("/chosen")) == -1) + return(24); + res = get_int_prop_def(ph, "stdout-#lines", 24); + if (res < 0) + return(24); /* XXX should look in device node too */ + return (res); +} + +int +stdout_columns() +{ + phandle ph; + int res; + + if ((ph = OFFinddevice("/chosen")) == -1) + return(80); + res = get_int_prop_def(ph, "stdout-#columns", 80); + if (res < 0) + return(80); /* XXX should look in device node too */ + return (res); +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/lib.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/main.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/main.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/main.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,6 @@ +#ifdef __GNUC__ +void +__main() +{ +} +#endif
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/main.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,307 @@ +// See license at end of file + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * A "smarter" malloc William L. Sebok + * Sept. 24, 1984 + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * If n = the size of an area rounded DOWN to the nearest power of two, + * all free areas of memory whose length is the same index n is organized + * into a chain with other free areas of index n. A request for memory + * takes the first item in the chain whose index is the size of the + * request rounded UP to the nearest power of two. If this chain is + * empty the next higher chain is examined. If no larger chain has memory + * then new memory is allocated. Only the amount of new memory needed is + * allocated. Any old free memory left after an allocation is returned + * to the free list. Extra new memory returned because of rounding + * to page boundaries is returned to free list. + * + * All memory areas (free or busy) handled by malloc are also chained + * sequentially by increasing address. When memory is freed it is + * merged with adjacent free areas, if any. If a free area of memory + * ends at the end of memory (i.e. at the break), the break is + * contracted, freeing the memory back to the system. + * + * Notes: + * ov_length field includes sizeof(struct overhead) + * adjacency chain includes all memory, allocated plus free. + */ + +#define MALLOC +#include "malloc.h" +#ifndef NULL +#define NULL 0 +#endif +#ifdef debug +# define ASSERT(p,q) if (!(p)) fatal(q) +#else +# define ASSERT(p,q) +#endif + +#define ALIGN(n, granule) ((n + ((granule)-1)) & ~((granule)-1)) +/* +// PowerPC page size = 4 KB; PC page size is the same??? +*/ + +#define PAGE_SIZE (ULONG)0x1000 +#define ULONG unsigned long + +char * +malloc(nbytes) + unsigned nbytes; +{ + extern ULONG OFClaim(); + register struct overhead *p, *q; + register int surplus; + register 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++) { + if (bucket->q_forw != bucket) { + /* remove from bucket chain */ + p = FROMBUK(bucket->q_forw); + ASSERT(p->ov_magic == MAGIC_FREE, "\nmalloc: Entry \ +not marked FREE found on Free List!\n"); + remque(TOBUK(p)); + surplus = p->ov_length - nbytes; + break; + } + } + if (p == NULL) { +#ifdef USE_SBRK + register int i; + p = (struct overhead *)CURBRK; + if ((int)p == -1) + return(NULL); + if (i = (int)p&(NALIGN-1)) + sbrk(NALIGN-i); + p = (struct overhead *)sbrk(nbytes); + if ((int)p == -1) + return(NULL); + q = (struct overhead *)CURBRK; + if ((int)q == -1) + return(NULL); + p->ov_length = (char *)q - (char *)p; + surplus = p->ov_length - nbytes; + /* add to end of adjacency chain */ + ASSERT((FROMADJ(adjhead.q_back)) < p, "\nmalloc: Entry in \ +adjacency chain found with address lower than Chain head!\n" ); + insque(TOADJ(p),adjhead.q_back); +#else + struct qelem *pp; + int alloc_size = ALIGN(nbytes, PAGE_SIZE); + + p = (struct overhead *)OFClaim(0, alloc_size, NALIGN); + if (p == (struct overhead *)-1) + return(NULL); + p->ov_length = alloc_size; + surplus = p->ov_length - nbytes; + + /* add to adjacency chain in the correct place */ + for (pp = adjhead.q_forw; + pp != &adjhead; + pp = pp->q_forw) { + if (p < FROMADJ(pp)) + break; + } + ASSERT(pp == &adjhead || (p < FROMADJ(pp)), + "\nmalloc: Bogus insertion in adjacency list\n"); + insque(TOADJ(p),pp->q_back); +#endif + } + if (surplus > sizeof(struct overhead)) { + /* if big enough, split it up */ + q = (struct overhead *)( (char *)p + nbytes); + q->ov_length = surplus; + p->ov_length = nbytes; + q->ov_magic = MAGIC_FREE; + /* add surplus into adjacency chain */ + insque(TOADJ(q),TOADJ(p)); + /* add surplus into bucket chain */ + insque(TOBUK(q),&buckets[_log2(surplus)]); + } + p->ov_magic = MAGIC_BUSY; + return((char*)p + sizeof(struct overhead)); +} + +void +free(mem) +register char *mem; +{ + register struct overhead *p, *q; + if (mem == NULL) + return; + p = (struct overhead *)(mem - sizeof(struct overhead)); + if (p->ov_magic == MAGIC_FREE) + return; + if (p->ov_magic != MAGIC_BUSY) { + fatal("attempt to free memory not allocated with malloc!\n"); + } + q = FROMADJ((TOADJ(p))->q_back); + if (q != FROMADJ(&adjhead)) { /* q is not the first list item */ + ASSERT(q < p, "\nfree: While trying to merge a free area with \ +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 + ) { + /* 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 = q; + } + } + q = FROMADJ((TOADJ(p))->q_forw); + if (q != FROMADJ(&adjhead)) { /* q is not the last list item */ + /* upper segment can be merged */ + 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 + ) { + /* 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; + } + } +#ifdef USE_SBRK + if ( /* freed area is at end of memory */ + endfree && adjhead.q_back == TOADJ(p) + && (char*)p + p->ov_length == (char *)CURBRK + ) { + /* remove from end of adjacency chain */ + remque(adjhead.q_back); + /* release memory to system */ + sbrk( -((int)(p->ov_length))); + return; + } +#endif + p->ov_magic = MAGIC_FREE; + /* place in bucket chain */ + insque(TOBUK(p),&buckets[_log2(p->ov_length)]); + return; +} + +char * +realloc(mem,nbytes) +register char *mem; unsigned nbytes; +{ + register char *newmem; + register struct overhead *p, *q; + register int surplus; + if (mem == NULL) + return(malloc(nbytes)); + if(mem > (char*)FROMADJ(adjhead.q_back) + sizeof(struct overhead)) + return(NULL); + + p = (struct overhead *)(mem - sizeof(struct overhead)); + nbytes = (nbytes + (NALIGN-1)) & (~(NALIGN-1)); + if ( p->ov_magic == MAGIC_BUSY + && (q = FROMADJ(adjhead.q_back)) != p + && (q->ov_magic != MAGIC_FREE || (FROMADJ(q->ov_adj.q_back) != p)) + ) + free(mem); + if( (p->ov_magic == MAGIC_BUSY || p->ov_magic == MAGIC_FREE) + && (surplus = p->ov_length - nbytes - sizeof(struct overhead)) >= 0 + ) { + if (surplus > sizeof(struct overhead)) { + /* return surplus to free list */ + nbytes += sizeof(struct overhead); +#ifdef USE_SBRK + if ( /* freed area is at end of memory */ + endfree && adjhead.q_back == TOADJ(p) + && (char*)p + p->ov_length == (char *)CURBRK + ) { + /* release memory to system */ + sbrk(-surplus); + } else +#endif + { + q = (struct overhead *)( (char *)p + nbytes); + q->ov_length = surplus; + q->ov_magic = MAGIC_FREE; + insque(TOADJ(q),TOADJ(p)); + insque(TOBUK(q),&buckets[_log2(surplus)]); + } + p->ov_length = nbytes; + } + if (p->ov_magic == MAGIC_FREE) { + remque(TOBUK(p)); + p->ov_magic = MAGIC_BUSY; + } + return(mem); + } + newmem = malloc(nbytes); + if (newmem != mem && newmem != NULL) { + register 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); + } + if (p->ov_magic == MAGIC_BUSY) + free(mem); + return(newmem); +} + +_log2(n) +register int n; +{ + register int i = 0; + while ((n >>= 1) > 0) + i++; + return(i); +} + +void +insque(item,queu) +register struct qelem *item, *queu; +{ + register struct qelem *pueu; + pueu = queu->q_forw; + item->q_forw = pueu; + item->q_back = queu; + queu->q_forw = item; + pueu->q_back = item; +} + +void +remque(item) +register struct qelem *item; +{ + register struct qelem *queu, *pueu; + pueu = item->q_forw; + queu = item->q_back; + queu->q_forw = pueu; + pueu->q_back = queu; +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.h URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.h (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.h Fri Jun 1 21:39:49 2007 @@ -1,0 +1,96 @@ +// See license at end of file + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * A "smarter" malloc William L. Sebok + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#define MAGIC_FREE 0x548a934c +#define MAGIC_BUSY 0xc139569a + +#define NBUCKETS 24 +#define NALIGN sizeof(long) + +struct qelem { + struct qelem *q_forw; + struct qelem *q_back; +}; + +struct overhead { + struct qelem ov_adj; /* adjacency chain pointers */ + struct qelem ov_buk; /* bucket chain pointers */ + long ov_magic; + unsigned long ov_length; +}; + +#ifdef MALLOC +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], +}; +#else +extern char endfree; +extern struct qelem adjhead, buckets[NBUCKETS]; +#endif + +/* + * The following macros depend on the order of the elements in struct overhead + */ +#define TOADJ(p) ((struct qelem *)(p)) +#define FROMADJ(p) ((struct overhead *)(p)) +#define FROMBUK(p) ((struct overhead *)( (char *)p - sizeof(struct qelem))) +#define TOBUK(p) ((struct qelem *)( (char *)p + sizeof(struct qelem))) + +#ifndef CURBRK +#define CURBRK sbrk(0) +#endif CURBRK + +extern void insque(), remque(); +extern char *malloc(), *realloc(); + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/malloc.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/mem.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/mem.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/mem.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,17 @@ +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +VOID +memcpy(char *to, char *from, size_t len) +{ + while (len--) + *to++ = *from++; +} + +VOID +memset(char *cp, int c, size_t len) +{ + while (len--) + *(cp + len) = c; +}
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/mem.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/printf.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/printf.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/printf.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,177 @@ +// See license at end of file + +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +#include <stdarg.h> + +int +atoi(char *s) +{ + int temp = 0, base = 10; + + if (*s == '0') { + ++s; + if (*s == 'x') { + ++s; + base = 16; + } else { + base = 8; + } + } + while (*s) { + switch (*s) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + temp = (temp * base) + (*s++ - '0'); + break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + temp = (temp * base) + (*s++ - 'a' + 10); + break; + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + temp = (temp * base) + (*s++ - 'A' + 10); + break; + default: + return (temp); + } + } + return (temp); +} + +STATIC int +printbase(ULONG x, int base) +{ + static char itoa[] = "0123456789abcdef"; + ULONG j; + char buf[16], *s = buf; + int n = 0; + + if (x == 0) { + putchar('0'); + n++; + return (n); + } + memset(buf, 16, 0); + while (x) { + j = x % base; + *s++ = itoa[j]; + x -= j; + x /= base; + } + + for (--s; s >= buf; --s) { + putchar(*s); + n++; + } + return (n); +} + +int +_printf(char *fmt, va_list args) +{ + ULONG x; + char c, *s; + int n = 0; + + while (c = *fmt++) { + if (c != '%') { + putchar(c); + n++; + continue; + } + switch (c = *fmt++) { + case 'x': + x = va_arg(args, ULONG); + n += printbase(x, 16); + break; + case 'o': + x = va_arg(args, ULONG); + n += printbase(x, 8); + break; + case 'd': + x = va_arg(args, ULONG); + if ((LONG) x < 0) { + putchar('-'); + n++; + x = -x; + } + n += printbase(x, 10); + break; + case 'c': + c = va_arg(args, char); + putchar(c); + n++; + break; + case 's': + s = va_arg(args, char *); + while (*s) { + putchar(*s++); + n++; + } + break; + default: + putchar(c); + n++; + break; + } + } + return(n); +} + +int +ofwprintf(char *fmt, ...) +{ + va_list args; + int i; + + va_start(args, fmt); + i = _printf(fmt, args); + va_end(args); + return (i); +} + +VOID +warn(char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + (void)_printf(fmt, args); + va_end(args); +} + +VOID +fatal(char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + (void)_printf(fmt, args); + OFExit(); + va_end(args); +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/printf.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/regprop.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/regprop.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/regprop.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,65 @@ +// See license at end of file + +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +reg * +decode_reg(UCHAR *buf, int buflen) +{ + static reg staticreg; + reg *sregp; + int i; + + if (buflen) + staticreg.hi = decode_int(buf); + if (buflen > 4) + staticreg.lo = decode_int(buf+4); + if (buflen > 8) + staticreg.size = decode_int(buf+8); + return (sregp = &staticreg); +} + +reg * +get_reg_prop(phandle node, char *key) +{ + int res; + char *buf; + reg *regp; + int len = OFGetproplen(node, key); + + buf = (char *)malloc(len); + res = OFGetprop(node, key, buf, len); + if (res != len) { + fatal("get_reg_prop(node %x, key '%s', len %x) returned %x\n", + node, key, len, res); + return ((reg *) 0); + } + regp = decode_reg(buf, len); + free(buf); + return (regp); +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/regprop.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/stdio.h URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/stdio.h (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/stdio.h Fri Jun 1 21:39:49 2007 @@ -1,0 +1,39 @@ +// See license at end of file + +typedef struct _file { + long id; + int bufc; + char *inbufp; + char buf[128]; +} FILE; + +extern FILE *stdin; +extern FILE *stdout; + +#define EOF -1 +extern FILE *fopen(); + + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/stdio.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/strprop.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/strprop.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/strprop.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,80 @@ +// See license at end of file + +/* For gcc, compile with -fno-builtin to suppress warnings */ + +#include "1275.h" + +extern void *malloc(); +VOID * +zalloc(int size) +{ + VOID *vp; + + vp = (void *)malloc(size); + memset(vp, size, 0); + return (vp); +} + +char * +get_str_prop(phandle node, char *key, allocflag alloc) +{ + int len, res; + static char *priv_buf, 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. + */ + len += 1; + if (alloc == ALLOC) + cp = (char *) zalloc(len); + else { + if (len > priv_buf_len) { + if (priv_buf_len) + free(priv_buf); + priv_buf = (char *) zalloc(len); + priv_buf_len = len; + } else + memset(priv_buf, len, 0); + cp = priv_buf; + } + len -= 1; + + res = OFGetprop(node, key, cp, len); + if (res != len) { + fatal( + "get_str_prop(node %x, key '%s', len %x) returned len %x\n", + node, key, len, res); + return((char *) 0); + } + return(cp); +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/strprop.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/types.h URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/types.h (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/types.h Fri Jun 1 21:39:49 2007 @@ -1,0 +1,10 @@ +#define STATIC static +#define VOID void +#define UCHAR unsigned char +#define ULONG unsigned long +#define LONG long +#define NULL 0 + +typedef unsigned int size_t; + +VOID fatal(char *fmt, ...);
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/types.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/wrappers.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/arch/i... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/wrappers.c (added) +++ branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/wrappers.c Fri Jun 1 21:39:49 2007 @@ -1,0 +1,545 @@ +// See license at end of file + +/*++ + +Abstract: + + This module implements the wrapper for the P1275 boot firmware client + program interface. There is a wrapper routine for each of the client + interface service. The wrapper routine constructs a client interface + argument array as illustraed in the figure below, places its address + in r3 and transfers control to the client interface handler. The + return address of the wrapper routine is placed in lr register. + + The Client interface handler performs the service specified in the + argument array and return to wrapper routine which in turn return + to the client program. The client interface handler returns an + overall success or failure code to the caller as a subroutine + return value (%o0 for SPARC, %r3 for PowerPC, %eax for x86). + + + Layout of the argument array + + +--------------------------------------+ + | Name of the client interface service | + +--------------------------------------+ + | Number of input arguments | + +--------------------------------------+ + | Number of return values | + +--------------------------------------+ + | Input arguments (arg1, ..., argN) | + +--------------------------------------+ + | Returned values (ret1, ..., retN) | + +--------------------------------------+ + +--*/ + +#include "1275.h" + +#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, ...); + +#ifdef CIF64 +#define CIF_HANDLER_IN 6 +#else +#define CIF_HANDLER_IN 3 +#endif + +// Device tree routines + +// +// Peer() - This routines outputs the identifier(phandle) of the device node that is +// the next sibling of the specified device node. +// +// Inputs: +// phandle - identifier of a device node +// +// Outputs: +// sibling_phandle - identifier of the next sibling. +// Zero if there are no more siblings. +// + +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) + { + return (phandle)0; + } + return ((phandle)argarray[CIF_HANDLER_IN+LOW(1)]); +} + +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) + { + return (phandle)0; + } + return ((phandle)argarray[CIF_HANDLER_IN+LOW(1)]); +} + +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) + { + return (phandle)0; + } + return ((phandle)argarray[CIF_HANDLER_IN+LOW(1)]); +} + +long +OFGetproplen( + phandle device_id, + 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) + { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(2)]); +} + +long +OFGetprop( + phandle device_id, + char *name, + char *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; + argarray[CIF_HANDLER_IN+LOW(3)] = buflen; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(4)]); +} + +long +OFNextprop( + phandle device_id, + char *name, + char *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; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(3)]); +} + +long +OFSetprop( + phandle device_id, + char *name, + char *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; + argarray[CIF_HANDLER_IN+LOW(3)] = buflen; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(4)]); +} + +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) + { + return (phandle)0; + } + return ((phandle) argarray[CIF_HANDLER_IN+LOW(1)]); +} + +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) + { + return (ihandle)0; + } + return ((ihandle) argarray[CIF_HANDLER_IN+LOW(1)]); +} + +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) + { +#ifdef notdef + warn("OFClose(%x) failed\n", id); +#endif + } + +} + +long +OFRead( + ihandle instance_id, + char *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; + argarray[CIF_HANDLER_IN+LOW(2)] = len; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(3)]); +} + +long +OFWrite( + ihandle instance_id, + char *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; + argarray[CIF_HANDLER_IN+LOW(2)] = len; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(3)]); +} + +long +OFSeek( + ihandle instance_id, + ULONG poshi, + 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; + argarray[CIF_HANDLER_IN+LOW(2)] = poslo; + if (call_firmware(argarray) != 0) { + return (-1); + } + return (argarray[CIF_HANDLER_IN+LOW(3)]); +} + +ULONG +OFClaim( + char *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; + argarray[CIF_HANDLER_IN+LOW(2)] = align; + if (call_firmware(argarray) != 0) + { + return (ULONG)0; + } + return (argarray[CIF_HANDLER_IN+LOW(3)]); +} + +VOID +OFRelease( + char *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); +} + +long +OFPackageToPath( + phandle device_id, + char *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; + argarray[CIF_HANDLER_IN+LOW(2)] = buflen; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return ((LONG)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)]); +} + +long +OFCallMethod( + char *method, + ihandle id, + 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; + argarray[CIF_HANDLER_IN+LOW(2)] = arg; + if (call_firmware(argarray) != 0) + { + return (-1); + } + return ((LONG)argarray[CIF_HANDLER_IN+LOW(3)]); +} + +long +OFInterpret0( + 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)]); +} + +ULONG +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; + } + return (argarray[CIF_HANDLER_IN+LOW(0)]); +} + +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) + { + return (NULL); + } + return ((void (*)(void))argarray[CIF_HANDLER_IN+LOW(1)]); +} + +long +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 ) +{ +#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 + cell_t argarray[] = { (cell_t)"exit", 0,0}; +#endif + call_firmware(argarray); +} + +// 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
Propchange: branches/olpc/boot/freeldr/freeldr/arch/i386/ofw/wrappers.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/olpc/boot/freeldr/freeldr/freeldr.c URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/freeld... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/freeldr.c (original) +++ branches/olpc/boot/freeldr/freeldr/freeldr.c Fri Jun 1 21:39:49 2007 @@ -20,8 +20,16 @@ #include <freeldr.h> #include <debug.h>
+int +ofwprintf(char *fmt, ...); +VOID +OFExit( VOID ); + + VOID BootMain(LPSTR CmdLine) { + OFExit(); + ofwprintf("Hi from the bootloader!\n"); CmdLineParse(CmdLine);
MachInit(CmdLine);
Modified: branches/olpc/boot/freeldr/freeldr/freeldr_arch.rbuild URL: http://svn.reactos.org/svn/reactos/branches/olpc/boot/freeldr/freeldr/freeld... ============================================================================== --- branches/olpc/boot/freeldr/freeldr/freeldr_arch.rbuild (original) +++ branches/olpc/boot/freeldr/freeldr/freeldr_arch.rbuild Fri Jun 1 21:39:49 2007 @@ -1,7 +1,7 @@ <directory name="arch"> <directory name="i386"> <if property="ARCH" value="i386"> - <module name="freeldr_arch" type="objectlibrary"> + <module name="freeldr_arch" type="objectlibrary" allowwarnings="true"> <include base="freeldr_base">include</include> <include base="freeldr_base">cache</include> <include base="ntoskrnl">include</include> @@ -38,6 +38,17 @@ <file>xboxmem.c</file> <file>xboxrtc.c</file> <file>xboxvideo.c</file> + + <file>ofw/debug.c</file> + <file>ofw/intprop.c</file> + <file>ofw/lib.c</file> + <file>ofw/main.c</file> + <file>ofw/malloc.c</file> + <file>ofw/mem.c</file> + <file>ofw/printf.c</file> + <file>ofw/regprop.c</file> + <file>ofw/strprop.c</file> + <file>ofw/wrappers.c</file> </module> </if> </directory>