21 #define NEWLIB_PORT_AWARE
27 #define D(fmt, args...) printf("(%s:%s:%i):" #fmt, __FILE__, __FUNCTION__, __LINE__, ##args)
30 extern int _fio_block_mode;
31 extern int _fio_io_sema;
32 extern int _fio_completion_sema;
33 extern int _fio_recv_data[512];
34 extern int _fio_intr_data[32];
39 #ifdef F___fio_internals
45 int _fio_completion_sema;
61 while (((res = sceSifBindRpc(&_fio_cd, 0x80000001, 0)) >= 0) &&
62 (_fio_cd.server == NULL))
71 _fio_completion_sema = CreateSema(&sema);
72 if (_fio_completion_sema < 0)
74 _fio_completion_sema = 0;
82 _fio_io_sema = CreateSema(&sema);
89 _fio_block_mode = FIO_WAIT;
98 iSignalSema(_fio_completion_sema);
103 int fioSync(
int mode,
int *retVal)
107 if ((res = fioInit()) < 0)
110 if (_fio_block_mode != FIO_NOWAIT)
116 WaitSema(_fio_completion_sema);
117 SignalSema(_fio_completion_sema);
120 *retVal = *(
int *)UNCACHED_SEG(&_fio_recv_data[0]);
126 if (PollSema(_fio_completion_sema) < 0)
127 return FIO_INCOMPLETE;
129 SignalSema(_fio_completion_sema);
132 *retVal = *(
int *)UNCACHED_SEG(&_fio_recv_data[0]);
142 #ifdef F_fio_setblockmode
143 void fioSetBlockMode(
int blocking)
145 _fio_block_mode = blocking;
152 if (_fio_cd.server) {
153 memset(&_fio_cd, 0,
sizeof _fio_cd);
154 if (_fio_completion_sema > 0) {
155 DeleteSema(_fio_completion_sema);
156 _fio_completion_sema = 0;
158 if (_fio_io_sema > 0) {
159 DeleteSema(_fio_io_sema);
167 int fioOpen(
const char *name,
int mode)
172 if ((res = fioInit()) < 0)
175 WaitSema(_fio_io_sema);
176 WaitSema(_fio_completion_sema);
179 strncpy(arg.name, name,
sizeof(arg.name));
180 arg.name[
sizeof(arg.name) - 1] = 0;
182 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_OPEN, _fio_block_mode, &arg,
sizeof arg,
183 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
184 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
186 SignalSema(_fio_completion_sema);
190 SignalSema(_fio_io_sema);
206 if ((res = fioInit()) < 0)
209 WaitSema(_fio_io_sema);
210 WaitSema(_fio_completion_sema);
214 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_CLOSE, 0, &arg, 4, &arg, 4,
215 (
void *)_fio_intr, NULL)) >= 0) {
218 SignalSema(_fio_completion_sema);
222 SignalSema(_fio_io_sema);
228 #ifdef F__fio_read_intr
233 if (uncached->size1 && uncached->dest1) {
234 memcpy(uncached->dest1, uncached->buf1, uncached->size1);
237 if (uncached->size2 && uncached->dest2) {
238 memcpy(uncached->dest2, uncached->buf2, uncached->size2);
241 iSignalSema(_fio_completion_sema);
246 int fioRead(
int fd,
void *ptr,
int size)
251 if ((res = fioInit()) < 0)
254 WaitSema(_fio_io_sema);
255 WaitSema(_fio_completion_sema);
262 if (!IS_UNCACHED_SEG(ptr))
263 sceSifWriteBackDCache(ptr, size);
265 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_READ, _fio_block_mode, &arg,
sizeof arg,
266 _fio_recv_data, 4, (
void *)_fio_read_intr, _fio_intr_data)) >= 0) {
267 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
269 SignalSema(_fio_completion_sema);
273 SignalSema(_fio_io_sema);
280 int fioWrite(
int fd,
const void *ptr,
int size)
283 int mis, res, result;
285 if ((res = fioInit()) < 0)
288 WaitSema(_fio_io_sema);
289 WaitSema(_fio_completion_sema);
297 if ((u32)ptr & 0xf) {
298 mis = 16 - ((u32)ptr & 0xf);
305 memcpy(arg.aligned, ptr, mis);
307 if (!IS_UNCACHED_SEG(ptr))
308 sceSifWriteBackDCache((
void *)ptr, size);
310 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_WRITE, _fio_block_mode, &arg,
sizeof arg,
311 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
312 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
314 SignalSema(_fio_completion_sema);
318 SignalSema(_fio_io_sema);
325 int fioLseek(
int fd,
int offset,
int whence)
330 if ((res = fioInit()) < 0)
333 WaitSema(_fio_io_sema);
334 WaitSema(_fio_completion_sema);
340 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_LSEEK, 0, &arg,
sizeof arg,
341 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
342 result = arg.p.result;
344 SignalSema(_fio_completion_sema);
348 SignalSema(_fio_io_sema);
355 int fioIoctl(
int fd,
int request,
void *data)
360 if ((res = fioInit()) < 0)
363 WaitSema(_fio_io_sema);
364 WaitSema(_fio_completion_sema);
370 memcpy(arg.data, data, 1024);
372 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_IOCTL, 0, &arg,
sizeof arg,
373 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
374 result = arg.p.result;
376 SignalSema(_fio_completion_sema);
380 SignalSema(_fio_io_sema);
387 int fioRemove(
const char *name)
391 char path[FIO_PATH_MAX];
396 if ((res = fioInit()) < 0)
399 WaitSema(_fio_io_sema);
400 WaitSema(_fio_completion_sema);
402 strncpy(arg.path, name,
sizeof(arg.path));
403 arg.path[
sizeof(arg.path) - 1] = 0;
405 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_REMOVE, 0, &arg,
sizeof arg,
406 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
409 SignalSema(_fio_completion_sema);
413 SignalSema(_fio_io_sema);
420 int fioMkdir(
const char *path)
424 char path[FIO_PATH_MAX];
429 if ((res = fioInit()) < 0)
432 WaitSema(_fio_io_sema);
433 WaitSema(_fio_completion_sema);
435 strncpy(arg.path, path,
sizeof(arg.path));
436 arg.path[
sizeof(arg.path) - 1] = 0;
438 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_MKDIR, 0, &arg,
sizeof arg,
439 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
442 SignalSema(_fio_completion_sema);
446 SignalSema(_fio_io_sema);
453 int fioRmdir(
const char *dirname)
457 char path[FIO_PATH_MAX];
462 if ((res = fioInit()) < 0)
465 WaitSema(_fio_io_sema);
466 WaitSema(_fio_completion_sema);
468 strncpy(arg.path, dirname,
sizeof(arg.path));
469 arg.path[
sizeof(arg.path) - 1] = 0;
471 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_RMDIR, 0, &arg,
sizeof arg,
472 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
475 SignalSema(_fio_completion_sema);
479 SignalSema(_fio_io_sema);
486 int fioPutc(
int fd,
int c)
488 return fioWrite(fd, &c, 1);
503 int fioGets(
int fd,
char *buff,
int n)
509 read = fioRead(fd, buff, n);
511 for (i = 0; i < (read - 1); i++) {
514 fioLseek(fd, (i + 1) - read, SEEK_CUR);
519 fioLseek(fd, i - read, SEEK_CUR);
530 int fioDopen(
const char *name)
534 char name[FIO_PATH_MAX];
539 if ((res = fioInit()) < 0)
542 WaitSema(_fio_io_sema);
543 WaitSema(_fio_completion_sema);
545 strncpy(arg.name, name,
sizeof(arg.name));
546 arg.name[
sizeof(arg.name) - 1] = 0;
548 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DOPEN, 0, &arg,
sizeof arg,
549 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
552 SignalSema(_fio_completion_sema);
556 SignalSema(_fio_io_sema);
563 int fioDclose(
int fd)
572 if ((res = fioInit()) < 0)
575 WaitSema(_fio_io_sema);
576 WaitSema(_fio_completion_sema);
580 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DCLOSE, 0, &arg,
sizeof arg,
581 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
584 SignalSema(_fio_completion_sema);
588 SignalSema(_fio_io_sema);
600 if ((res = fioInit()) < 0)
603 WaitSema(_fio_io_sema);
604 WaitSema(_fio_completion_sema);
609 if (!IS_UNCACHED_SEG(buf))
612 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DREAD, 0, &arg,
sizeof arg,
613 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
614 result = arg.p.result;
616 SignalSema(_fio_completion_sema);
620 SignalSema(_fio_io_sema);
627 int fioGetstat(
const char *name,
io_stat_t *buf)
632 if ((res = fioInit()) < 0)
635 WaitSema(_fio_io_sema);
636 WaitSema(_fio_completion_sema);
639 strncpy(arg.name, name,
sizeof(arg.name));
640 arg.name[
sizeof(arg.name) - 1] = 0;
642 if (!IS_UNCACHED_SEG(buf))
643 sceSifWriteBackDCache(buf,
sizeof(
io_stat_t));
645 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_GETSTAT, 0, &arg,
sizeof arg,
646 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
647 result = arg.p.result;
649 SignalSema(_fio_completion_sema);
653 SignalSema(_fio_io_sema);
660 int fioChstat(
const char *name,
io_stat_t *buf, u32 cbit)
665 if ((res = fioInit()) < 0)
668 WaitSema(_fio_io_sema);
669 WaitSema(_fio_completion_sema);
672 memcpy(&arg.stat, buf,
sizeof(
io_stat_t));
673 strncpy(arg.name, name,
sizeof(arg.name));
674 arg.name[
sizeof(arg.name) - 1] = 0;
676 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_CHSTAT, 0, &arg,
sizeof arg,
677 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
678 result = arg.p.result;
680 SignalSema(_fio_completion_sema);
684 SignalSema(_fio_io_sema);
691 int fioFormat(
const char *name)
695 char path[FIO_PATH_MAX];
700 if ((res = fioInit()) < 0)
703 WaitSema(_fio_io_sema);
704 WaitSema(_fio_completion_sema);
706 strncpy(arg.path, name,
sizeof(arg.path));
707 arg.path[
sizeof(arg.path) - 1] = 0;
709 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_FORMAT, 0, &arg,
sizeof arg,
710 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
713 SignalSema(_fio_completion_sema);
717 SignalSema(_fio_io_sema);