diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index 4c51e32cf..450f0d933 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,3 +1,10 @@ +2007-06-20 Patrick Mansfield + + * spu/jsre.h: Add JSRE_GETCWD. + * spu/getcwd.c: New file, implement getcwd with help from an + assist call. + * spu/Makefile.in: Add getcwd. + 2007-06-20 Patrick Mansfield * spu/jsre.h: Add defines for new assist calls. diff --git a/libgloss/spu/Makefile.in b/libgloss/spu/Makefile.in index 49916cd68..3da5a2383 100644 --- a/libgloss/spu/Makefile.in +++ b/libgloss/spu/Makefile.in @@ -56,7 +56,7 @@ OBJCOPY = `t='$(program_transform_name)'; echo objcopy | sed -e $$t` # object files needed OBJS = \ access.o chdir.o chmod.o chown.o close.o dup.o exit.o fchdir.o \ - fchmod.o fchown.o fstat.o ftruncate.o getpagesize.o getpid.o \ + fchmod.o fchown.o fstat.o ftruncate.o getcwd.o getpagesize.o getpid.o \ gettimeofday.o isatty.o kill.o lchown.o lseek.o mkdir.o \ mknod.o nanosleep.o open.o read.o rmdir.o sbrk.o stat.o syscalls.o \ unlink.o write.o diff --git a/libgloss/spu/getcwd.c b/libgloss/spu/getcwd.c new file mode 100644 index 000000000..482af2229 --- /dev/null +++ b/libgloss/spu/getcwd.c @@ -0,0 +1,109 @@ +/* + Copyright 2007 + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include "jsre.h" + +#define ALLOC_BASE 64 +#define ALLOC_INCR 64 + +typedef struct +{ + unsigned int buf; + unsigned int pad0[3]; + unsigned int size; + unsigned int pad1[3]; +} syscall_getcwd_t; + +char * +getcwd (char *buf, size_t size) +{ + syscall_getcwd_t sys; + int retry_alloc, local_alloc; + char *newbuf; + char *res; + + /* + * Do not let the ppu side allocate memory, since it has to be used on + * the SPU (must be in LS), and it can't easily be freed on the spu + * side. So check for NULL buf, handle allocations here, and only call + * the assist call with a non-NULL buf. + */ + retry_alloc = 0; + local_alloc = 0; + if (!buf) { + local_alloc = 1; + if (size == 0) { + retry_alloc = 1; + size = ALLOC_BASE; + } + buf = malloc (size); + if (!buf) { + /* + * Leave errno as set by malloc. + */ + return NULL; + } + } + + /* + * Let the assist call check for error cases, specifically let it handle + * non-NULL buf and size of zero. + */ + + sys.buf = (unsigned int) buf; + sys.size = (unsigned int) size; + res = (char*) __send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_GETCWD, &sys); + + while (!res && retry_alloc && errno == ERANGE) { + size += ALLOC_INCR; + newbuf = realloc (buf, size); + if (!newbuf) { + free (buf); + return NULL; + } + buf = newbuf; + + sys.buf = (unsigned int) buf; + sys.size = (unsigned int) size; + res = (char*) __send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_GETCWD, &sys); + } + + if (!res && local_alloc) { + free (buf); + } + + return res; +} diff --git a/libgloss/spu/jsre.h b/libgloss/spu/jsre.h index 707a2a2fe..143289e81 100644 --- a/libgloss/spu/jsre.h +++ b/libgloss/spu/jsre.h @@ -62,6 +62,7 @@ Author: Andreas Neukoetter (ti95neuk@de.ibm.com) #define JSRE_CHOWN 40 #define JSRE_FCHOWN 41 #define JSRE_LCHOWN 42 +#define JSRE_GETCWD 43 typedef struct { unsigned int dev;