2007-09-21 Patrick Mansfield <patmans@us.ibm.com>
* spu/dirfuncs.c: New file, holds the opendir, closedir, readdir, rewinddir, seekdir and telldir implementations. These are grouped in one file so that we do not need a separate file for the struct dirent and DIR allocation code. * spu/jsre.h: Add JSRE_OPENDIR and other dir opcodes. * spu/Makefile.in: Add dirfuncs.o.
This commit is contained in:
parent
63fbe1fd64
commit
79978d2076
|
@ -1,3 +1,12 @@
|
||||||
|
2007-09-21 Patrick Mansfield <patmans@us.ibm.com>
|
||||||
|
|
||||||
|
* spu/dirfuncs.c: New file, holds the opendir, closedir, readdir,
|
||||||
|
rewinddir, seekdir and telldir implementations. These are
|
||||||
|
grouped in one file so that we do not need a separate file for
|
||||||
|
the struct dirent and DIR allocation code.
|
||||||
|
* spu/jsre.h: Add JSRE_OPENDIR and other dir opcodes.
|
||||||
|
* spu/Makefile.in: Add dirfuncs.o.
|
||||||
|
|
||||||
2007-08-13 Carlos O'Donell <carlos@codesourcery.com>
|
2007-08-13 Carlos O'Donell <carlos@codesourcery.com>
|
||||||
|
|
||||||
* arm/crt0.S: Remove '.set' for __stack, hardware_init_hook,
|
* arm/crt0.S: Remove '.set' for __stack, hardware_init_hook,
|
||||||
|
|
|
@ -55,7 +55,7 @@ OBJCOPY = `t='$(program_transform_name)'; echo objcopy | sed -e $$t`
|
||||||
|
|
||||||
# object files needed
|
# object files needed
|
||||||
OBJS = \
|
OBJS = \
|
||||||
access.o chdir.o chmod.o chown.o close.o conv_stat.o dup.o \
|
access.o chdir.o chmod.o chown.o close.o conv_stat.o dirfuncs.o dup.o \
|
||||||
dup2.o exit.o fchdir.o fchmod.o fchown.o fdatasync.o fstat.o \
|
dup2.o exit.o fchdir.o fchmod.o fchown.o fdatasync.o fstat.o \
|
||||||
fsync.o ftruncate.o getcwd.o getpagesize.o getpid.o \
|
fsync.o ftruncate.o getcwd.o getpagesize.o getpid.o \
|
||||||
gettimeofday.o isatty.o kill.o lchown.o link.o lockf.o lseek.o \
|
gettimeofday.o isatty.o kill.o lchown.o link.o lockf.o lseek.o \
|
||||||
|
|
|
@ -0,0 +1,167 @@
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Put all of the dir functions in one file here, since it is not useful
|
||||||
|
* to use opendir without readdir, and then we can put the handling of the
|
||||||
|
* struct dirent here too.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "jsre.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The SPU DIR includes space for one dirent, and is 256 + 4 bytes in
|
||||||
|
* size, so keep this small.
|
||||||
|
*/
|
||||||
|
#define SPE_OPENDIR_MAX 4
|
||||||
|
|
||||||
|
static DIR spe_dir[SPE_OPENDIR_MAX]; /* zero by default */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int name;
|
||||||
|
unsigned int pad0[3];
|
||||||
|
} syscall_opendir_t;
|
||||||
|
|
||||||
|
DIR *
|
||||||
|
opendir (const char *name)
|
||||||
|
{
|
||||||
|
DIR *dir;
|
||||||
|
int ppc_dir, i;
|
||||||
|
syscall_opendir_t sys;
|
||||||
|
|
||||||
|
sys.name = (unsigned int) name;
|
||||||
|
for (i = 0; i < SPE_OPENDIR_MAX; i++) {
|
||||||
|
if (!spe_dir[i].ppc_dir) {
|
||||||
|
dir = &spe_dir[i];
|
||||||
|
__send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_OPENDIR, &sys);
|
||||||
|
/*
|
||||||
|
* Pull 64 bits out of the result.
|
||||||
|
*/
|
||||||
|
dir->ppc_dir = ((uint64_t*)&sys)[0];
|
||||||
|
if (!dir->ppc_dir) {
|
||||||
|
dir = NULL;
|
||||||
|
}
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = EMFILE;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
closedir (DIR *dir)
|
||||||
|
{
|
||||||
|
int rc, i;
|
||||||
|
uint64_t ppc_dir;
|
||||||
|
|
||||||
|
if (dir) {
|
||||||
|
/*
|
||||||
|
* Don't pass &dir->ppc_dir to __send_to_ppe, since it would be
|
||||||
|
* overwritten by the assist call.
|
||||||
|
*/
|
||||||
|
ppc_dir = dir->ppc_dir;
|
||||||
|
rc = __send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_CLOSEDIR, &ppc_dir);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to release the dir even if the closedir failed.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < SPE_OPENDIR_MAX; i++) {
|
||||||
|
if (spe_dir[i].ppc_dir == dir->ppc_dir) {
|
||||||
|
spe_dir[i].ppc_dir = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Gracefully handle NULL, but not other invalid dir values.
|
||||||
|
*/
|
||||||
|
rc = -1;
|
||||||
|
errno = EBADF;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t ppc_dir;
|
||||||
|
unsigned int pad0[2];
|
||||||
|
unsigned int dirent;
|
||||||
|
unsigned int pad1[3];
|
||||||
|
} syscall_readdir_t;
|
||||||
|
|
||||||
|
struct dirent *
|
||||||
|
readdir (DIR *dir)
|
||||||
|
{
|
||||||
|
syscall_readdir_t sys;
|
||||||
|
|
||||||
|
sys.ppc_dir = dir->ppc_dir;
|
||||||
|
sys.dirent = (unsigned int) &dir->dirent;
|
||||||
|
return (struct dirent *) __send_to_ppe (JSRE_POSIX1_SIGNALCODE,
|
||||||
|
JSRE_READDIR, &sys);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rewinddir (DIR *dir)
|
||||||
|
{
|
||||||
|
uint64_t ppc_dir = dir->ppc_dir;
|
||||||
|
|
||||||
|
__send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_REWINDDIR, &ppc_dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint64_t ppc_dir;
|
||||||
|
unsigned int pad0[2];
|
||||||
|
unsigned int offset;
|
||||||
|
unsigned int pad1[3];
|
||||||
|
} syscall_seekdir_t;
|
||||||
|
|
||||||
|
void
|
||||||
|
seekdir (DIR *dir, off_t offset)
|
||||||
|
{
|
||||||
|
syscall_seekdir_t sys;
|
||||||
|
|
||||||
|
sys.ppc_dir = dir->ppc_dir;
|
||||||
|
sys.offset = offset;
|
||||||
|
__send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_SEEKDIR, &sys);
|
||||||
|
}
|
||||||
|
|
||||||
|
off_t
|
||||||
|
telldir (DIR *dir)
|
||||||
|
{
|
||||||
|
uint64_t ppc_dir = dir->ppc_dir;
|
||||||
|
|
||||||
|
__send_to_ppe (JSRE_POSIX1_SIGNALCODE, JSRE_TELLDIR, &ppc_dir);
|
||||||
|
}
|
|
@ -78,6 +78,12 @@ Author: Andreas Neukoetter (ti95neuk@de.ibm.com)
|
||||||
#define JSRE_TRUNCATE 52
|
#define JSRE_TRUNCATE 52
|
||||||
#define JSRE_MKSTEMP 53
|
#define JSRE_MKSTEMP 53
|
||||||
#define JSRE_MKTEMP 54
|
#define JSRE_MKTEMP 54
|
||||||
|
#define JSRE_OPENDIR 55
|
||||||
|
#define JSRE_CLOSEDIR 56
|
||||||
|
#define JSRE_READDIR 57
|
||||||
|
#define JSRE_REWINDDIR 58
|
||||||
|
#define JSRE_SEEKDIR 59
|
||||||
|
#define JSRE_TELLDIR 60
|
||||||
|
|
||||||
struct jsre_stat {
|
struct jsre_stat {
|
||||||
unsigned int dev;
|
unsigned int dev;
|
||||||
|
|
Loading…
Reference in New Issue