21#define NEWLIB_PORT_AWARE
26#define D(fmt, args...) printf("(%s:%s:%i):" #fmt, __FILE__, __FUNCTION__, __LINE__, ##args)
28extern int _iop_reboot_count;
31extern int _fio_block_mode;
32extern int _fio_io_sema;
33extern int _fio_completion_sema;
34extern int _fio_recv_data[512];
35extern int _fio_intr_data[32];
40#ifdef F___fio_internals
47int _fio_completion_sema = -1;
55 static int _rb_count = 0;
57 if (_rb_count != _iop_reboot_count) {
58 _rb_count = _iop_reboot_count;
68 while (((res = SifBindRpc(&_fio_cd, 0x80000001, 0)) >= 0) &&
69 (_fio_cd.server == NULL))
78 _fio_completion_sema = CreateSema(&sema);
79 if (_fio_completion_sema < 0)
86 _fio_io_sema = CreateSema(&sema);
91 _fio_block_mode = FIO_WAIT;
100 iSignalSema(_fio_completion_sema);
105int fioSync(
int mode,
int *retVal)
109 if ((res = fioInit()) < 0)
112 if (_fio_block_mode != FIO_NOWAIT)
118 WaitSema(_fio_completion_sema);
119 SignalSema(_fio_completion_sema);
122 *retVal = *(
int *)UNCACHED_SEG(&_fio_recv_data[0]);
128 if (PollSema(_fio_completion_sema) < 0)
129 return FIO_INCOMPLETE;
131 SignalSema(_fio_completion_sema);
134 *retVal = *(
int *)UNCACHED_SEG(&_fio_recv_data[0]);
144#ifdef F_fio_setblockmode
145void fioSetBlockMode(
int blocking)
147 _fio_block_mode = blocking;
156 memset(&_fio_cd, 0,
sizeof _fio_cd);
157 if (_fio_completion_sema >= 0) {
158 DeleteSema(_fio_completion_sema);
160 if (_fio_io_sema >= 0) {
161 DeleteSema(_fio_io_sema);
168int fioOpen(
const char *name,
int mode)
173 if ((res = fioInit()) < 0)
176 WaitSema(_fio_io_sema);
177 WaitSema(_fio_completion_sema);
180 strncpy(arg.name, name, FIO_PATH_MAX - 1);
181 arg.name[FIO_PATH_MAX - 1] = 0;
183 if ((res = SifCallRpc(&_fio_cd, FIO_F_OPEN, _fio_block_mode, &arg,
sizeof arg,
184 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
185 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
187 SignalSema(_fio_completion_sema);
191 SignalSema(_fio_io_sema);
207 if ((res = fioInit()) < 0)
210 WaitSema(_fio_io_sema);
211 WaitSema(_fio_completion_sema);
215 if ((res = SifCallRpc(&_fio_cd, FIO_F_CLOSE, 0, &arg, 4, &arg, 4,
216 (
void *)_fio_intr, NULL)) >= 0) {
219 SignalSema(_fio_completion_sema);
223 SignalSema(_fio_io_sema);
229#ifdef F__fio_read_intr
234 if (uncached->size1 && uncached->dest1) {
235 memcpy(uncached->dest1, uncached->buf1, uncached->size1);
238 if (uncached->size2 && uncached->dest2) {
239 memcpy(uncached->dest2, uncached->buf2, uncached->size2);
242 iSignalSema(_fio_completion_sema);
247int fioRead(
int fd,
void *ptr,
int size)
252 if ((res = fioInit()) < 0)
255 WaitSema(_fio_io_sema);
256 WaitSema(_fio_completion_sema);
263 if (!IS_UNCACHED_SEG(ptr))
264 SifWriteBackDCache(ptr, size);
266 if ((res = SifCallRpc(&_fio_cd, FIO_F_READ, _fio_block_mode, &arg,
sizeof arg,
267 _fio_recv_data, 4, (
void *)_fio_read_intr, _fio_intr_data)) >= 0) {
268 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
270 SignalSema(_fio_completion_sema);
274 SignalSema(_fio_io_sema);
281int fioWrite(
int fd,
const void *ptr,
int size)
284 int mis, res, result;
286 if ((res = fioInit()) < 0)
289 WaitSema(_fio_io_sema);
290 WaitSema(_fio_completion_sema);
298 if ((u32)ptr & 0xf) {
299 mis = 16 - ((u32)ptr & 0xf);
306 memcpy(arg.aligned, ptr, mis);
308 if (!IS_UNCACHED_SEG(ptr))
309 SifWriteBackDCache((
void *)ptr, size);
311 if ((res = SifCallRpc(&_fio_cd, FIO_F_WRITE, _fio_block_mode, &arg,
sizeof arg,
312 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
313 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
315 SignalSema(_fio_completion_sema);
319 SignalSema(_fio_io_sema);
326int fioLseek(
int fd,
int offset,
int whence)
331 if ((res = fioInit()) < 0)
334 WaitSema(_fio_io_sema);
335 WaitSema(_fio_completion_sema);
341 if ((res = SifCallRpc(&_fio_cd, FIO_F_LSEEK, 0, &arg,
sizeof arg,
342 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
343 result = arg.p.result;
345 SignalSema(_fio_completion_sema);
349 SignalSema(_fio_io_sema);
356int fioIoctl(
int fd,
int request,
void *data)
361 if ((res = fioInit()) < 0)
364 WaitSema(_fio_io_sema);
365 WaitSema(_fio_completion_sema);
371 memcpy(arg.data, data, 1024);
373 if ((res = SifCallRpc(&_fio_cd, FIO_F_IOCTL, 0, &arg,
sizeof arg,
374 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
375 result = arg.p.result;
377 SignalSema(_fio_completion_sema);
381 SignalSema(_fio_io_sema);
388int fioRemove(
const char *name)
392 char path[FIO_PATH_MAX];
397 if ((res = fioInit()) < 0)
400 WaitSema(_fio_io_sema);
401 WaitSema(_fio_completion_sema);
403 strncpy(arg.path, name, FIO_PATH_MAX - 1);
404 arg.path[FIO_PATH_MAX - 1] = 0;
406 if ((res = SifCallRpc(&_fio_cd, FIO_F_REMOVE, 0, &arg,
sizeof arg,
407 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
410 SignalSema(_fio_completion_sema);
414 SignalSema(_fio_io_sema);
421int fioMkdir(
const char *path)
425 char path[FIO_PATH_MAX];
430 if ((res = fioInit()) < 0)
433 WaitSema(_fio_io_sema);
434 WaitSema(_fio_completion_sema);
436 strncpy(arg.path, path, FIO_PATH_MAX - 1);
437 arg.path[FIO_PATH_MAX - 1] = 0;
439 if ((res = SifCallRpc(&_fio_cd, FIO_F_MKDIR, 0, &arg,
sizeof arg,
440 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
443 SignalSema(_fio_completion_sema);
447 SignalSema(_fio_io_sema);
454int fioRmdir(
const char *dirname)
458 char path[FIO_PATH_MAX];
463 if ((res = fioInit()) < 0)
466 WaitSema(_fio_io_sema);
467 WaitSema(_fio_completion_sema);
469 strncpy(arg.path, dirname, FIO_PATH_MAX - 1);
470 arg.path[FIO_PATH_MAX - 1] = 0;
472 if ((res = SifCallRpc(&_fio_cd, FIO_F_RMDIR, 0, &arg,
sizeof arg,
473 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
476 SignalSema(_fio_completion_sema);
480 SignalSema(_fio_io_sema);
487int fioPutc(
int fd,
int c)
489 return fioWrite(fd, &c, 1);
504int fioGets(
int fd,
char *buff,
int n)
510 read = fioRead(fd, buff, n);
512 for (i = 0; i < (read - 1); i++) {
515 fioLseek(fd, (i + 1) - read, SEEK_CUR);
520 fioLseek(fd, i - read, SEEK_CUR);
531int fioDopen(
const char *name)
535 char name[FIO_PATH_MAX];
540 if ((res = fioInit()) < 0)
543 WaitSema(_fio_io_sema);
544 WaitSema(_fio_completion_sema);
546 strncpy(arg.name, name, FIO_PATH_MAX - 1);
547 arg.name[FIO_PATH_MAX - 1] = 0;
549 if ((res = SifCallRpc(&_fio_cd, FIO_F_DOPEN, 0, &arg,
sizeof arg,
550 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
553 SignalSema(_fio_completion_sema);
557 SignalSema(_fio_io_sema);
573 if ((res = fioInit()) < 0)
576 WaitSema(_fio_io_sema);
577 WaitSema(_fio_completion_sema);
581 if ((res = SifCallRpc(&_fio_cd, FIO_F_DCLOSE, 0, &arg,
sizeof arg,
582 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
585 SignalSema(_fio_completion_sema);
589 SignalSema(_fio_io_sema);
601 if ((res = fioInit()) < 0)
604 WaitSema(_fio_io_sema);
605 WaitSema(_fio_completion_sema);
610 if (!IS_UNCACHED_SEG(buf))
613 if ((res = SifCallRpc(&_fio_cd, FIO_F_DREAD, 0, &arg,
sizeof arg,
614 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
615 result = arg.p.result;
617 SignalSema(_fio_completion_sema);
621 SignalSema(_fio_io_sema);
628int fioGetstat(
const char *name,
io_stat_t *buf)
633 if ((res = fioInit()) < 0)
636 WaitSema(_fio_io_sema);
637 WaitSema(_fio_completion_sema);
640 strncpy(arg.name, name, FIO_PATH_MAX - 1);
641 arg.name[FIO_PATH_MAX - 1] = 0;
643 if (!IS_UNCACHED_SEG(buf))
644 SifWriteBackDCache(buf,
sizeof(
io_stat_t));
646 if ((res = SifCallRpc(&_fio_cd, FIO_F_GETSTAT, 0, &arg,
sizeof arg,
647 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
648 result = arg.p.result;
650 SignalSema(_fio_completion_sema);
654 SignalSema(_fio_io_sema);
661int fioChstat(
const char *name,
io_stat_t *buf, u32 cbit)
666 if ((res = fioInit()) < 0)
669 WaitSema(_fio_io_sema);
670 WaitSema(_fio_completion_sema);
673 memcpy(&arg.stat, buf,
sizeof(
io_stat_t));
674 strncpy(arg.name, name, FIO_PATH_MAX - 1);
675 arg.name[FIO_PATH_MAX - 1] = 0;
677 if ((res = SifCallRpc(&_fio_cd, FIO_F_CHSTAT, 0, &arg,
sizeof arg,
678 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
679 result = arg.p.result;
681 SignalSema(_fio_completion_sema);
685 SignalSema(_fio_io_sema);
692int fioFormat(
const char *name)
696 char path[FIO_PATH_MAX];
701 if ((res = fioInit()) < 0)
704 WaitSema(_fio_io_sema);
705 WaitSema(_fio_completion_sema);
707 strncpy(arg.path, name, FIO_PATH_MAX - 1);
708 arg.path[FIO_PATH_MAX - 1] = 0;
710 if ((res = SifCallRpc(&_fio_cd, FIO_F_FORMAT, 0, &arg,
sizeof arg,
711 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
714 SignalSema(_fio_completion_sema);
718 SignalSema(_fio_io_sema);