libgloss: bfin: implement getpid/fstat/stat/link/unlink syscalls

The current syscalls.c implements getpid/fstat/stat/link/unlink as mere
stubs.  So replace them with useful calls to do_syscall now that our sim
can support them.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Michael Frysinger 2011-07-01 21:47:36 +00:00
parent ecd3577e1d
commit 1df99a60b3
2 changed files with 34 additions and 20 deletions

View File

@ -1,3 +1,16 @@
2011-07-01 Mike Frysinger <vapier@gentoo.org>
* bfin/syscalls.c (_getpid): Call do_syscall with func argument n and
return the result.
(_fstat): Delete stub body. Add block array and assign file/st to it.
Call do_syscall with result.
(_stat): Delete stub body. Add block array and assign fname/st to
it. Call do_syscall with result.
(_link): Change func arguments to accept two strings. Add block array
and assign existing/new to it. Call do_syscall with result.
(_unlink): Change func arguments to accept a string. Call do_syscall
with new argument.
2011-07-01 Mike Frysinger <vapier@gentoo.org> 2011-07-01 Mike Frysinger <vapier@gentoo.org>
* bfin/syscalls.c (_lseek): Change 3rd arg name to whence. Increase * bfin/syscalls.c (_lseek): Change 3rd arg name to whence. Increase

View File

@ -117,7 +117,7 @@ _kill (int n, int m)
int int
_getpid (int n) _getpid (int n)
{ {
return 1; return do_syscall (SYS_getpid, &n);
} }
caddr_t caddr_t
@ -156,40 +156,41 @@ _sbrk (int incr)
extern void memset (struct stat *, int, unsigned int); extern void memset (struct stat *, int, unsigned int);
int int
_fstat (int file, struct stat * st) _fstat (int file, struct stat *st)
{ {
memset (st, 0, sizeof (* st)); int block[2];
st->st_mode = S_IFCHR;
st->st_blksize = 1024; block[0] = file;
return 0; block[1] = (int) st;
return do_syscall (SYS_fstat, block);
} }
int _stat (const char *fname, struct stat *st) int _stat (const char *fname, struct stat *st)
{ {
int file; int block[2];
/* The best we can do is try to open the file readonly. If it exists, block[0] = (int) fname;
then we can guess a few things about it. */ block[1] = (int) st;
if ((file = _open (fname, O_RDONLY)) < 0)
return -1;
memset (st, 0, sizeof (* st)); return do_syscall (SYS_stat, block);
st->st_mode = S_IFREG | S_IREAD;
st->st_blksize = 1024;
_close (file); /* Not interested in the error. */
return 0;
} }
int int
_link (void) _link (const char *existing, const char *new)
{ {
return -1; int block[2];
block[0] = (int) existing;
block[1] = (int) new;
return do_syscall (SYS_link, block);
} }
int int
_unlink (void) _unlink (const char *path)
{ {
return -1; return do_syscall (SYS_unlink, path);
} }
void void