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
44 int _fio_io_sema = -1;
45 int _fio_completion_sema = -1;
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)
79 _fio_io_sema = CreateSema(&sema);
83 _fio_block_mode = FIO_WAIT;
92 iSignalSema(_fio_completion_sema);
97 int fioSync(
int mode,
int *retVal)
101 if ((res = fioInit()) < 0)
104 if (_fio_block_mode != FIO_NOWAIT)
110 WaitSema(_fio_completion_sema);
111 SignalSema(_fio_completion_sema);
114 *retVal = *(
int *)UNCACHED_SEG(&_fio_recv_data[0]);
120 if (PollSema(_fio_completion_sema) < 0)
121 return FIO_INCOMPLETE;
123 SignalSema(_fio_completion_sema);
126 *retVal = *(
int *)UNCACHED_SEG(&_fio_recv_data[0]);
136 #ifdef F_fio_setblockmode
137 void fioSetBlockMode(
int blocking)
139 _fio_block_mode = blocking;
146 if (_fio_cd.server) {
147 memset(&_fio_cd, 0,
sizeof _fio_cd);
148 if (_fio_completion_sema >= 0) {
149 DeleteSema(_fio_completion_sema);
151 if (_fio_io_sema >= 0) {
152 DeleteSema(_fio_io_sema);
159 int fioOpen(
const char *name,
int mode)
164 if ((res = fioInit()) < 0)
167 WaitSema(_fio_io_sema);
168 WaitSema(_fio_completion_sema);
171 strncpy(arg.name, name, FIO_PATH_MAX - 1);
172 arg.name[FIO_PATH_MAX - 1] = 0;
174 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_OPEN, _fio_block_mode, &arg,
sizeof arg,
175 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
176 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
178 SignalSema(_fio_completion_sema);
182 SignalSema(_fio_io_sema);
198 if ((res = fioInit()) < 0)
201 WaitSema(_fio_io_sema);
202 WaitSema(_fio_completion_sema);
206 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_CLOSE, 0, &arg, 4, &arg, 4,
207 (
void *)_fio_intr, NULL)) >= 0) {
210 SignalSema(_fio_completion_sema);
214 SignalSema(_fio_io_sema);
220 #ifdef F__fio_read_intr
225 if (uncached->size1 && uncached->dest1) {
226 memcpy(uncached->dest1, uncached->buf1, uncached->size1);
229 if (uncached->size2 && uncached->dest2) {
230 memcpy(uncached->dest2, uncached->buf2, uncached->size2);
233 iSignalSema(_fio_completion_sema);
238 int fioRead(
int fd,
void *ptr,
int size)
243 if ((res = fioInit()) < 0)
246 WaitSema(_fio_io_sema);
247 WaitSema(_fio_completion_sema);
254 if (!IS_UNCACHED_SEG(ptr))
255 sceSifWriteBackDCache(ptr, size);
257 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_READ, _fio_block_mode, &arg,
sizeof arg,
258 _fio_recv_data, 4, (
void *)_fio_read_intr, _fio_intr_data)) >= 0) {
259 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
261 SignalSema(_fio_completion_sema);
265 SignalSema(_fio_io_sema);
272 int fioWrite(
int fd,
const void *ptr,
int size)
275 int mis, res, result;
277 if ((res = fioInit()) < 0)
280 WaitSema(_fio_io_sema);
281 WaitSema(_fio_completion_sema);
289 if ((u32)ptr & 0xf) {
290 mis = 16 - ((u32)ptr & 0xf);
297 memcpy(arg.aligned, ptr, mis);
299 if (!IS_UNCACHED_SEG(ptr))
300 sceSifWriteBackDCache((
void *)ptr, size);
302 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_WRITE, _fio_block_mode, &arg,
sizeof arg,
303 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
304 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
306 SignalSema(_fio_completion_sema);
310 SignalSema(_fio_io_sema);
317 int fioLseek(
int fd,
int offset,
int whence)
322 if ((res = fioInit()) < 0)
325 WaitSema(_fio_io_sema);
326 WaitSema(_fio_completion_sema);
332 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_LSEEK, 0, &arg,
sizeof arg,
333 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
334 result = arg.p.result;
336 SignalSema(_fio_completion_sema);
340 SignalSema(_fio_io_sema);
347 int fioIoctl(
int fd,
int request,
void *data)
352 if ((res = fioInit()) < 0)
355 WaitSema(_fio_io_sema);
356 WaitSema(_fio_completion_sema);
362 memcpy(arg.data, data, 1024);
364 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_IOCTL, 0, &arg,
sizeof arg,
365 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
366 result = arg.p.result;
368 SignalSema(_fio_completion_sema);
372 SignalSema(_fio_io_sema);
379 int fioRemove(
const char *name)
383 char path[FIO_PATH_MAX];
388 if ((res = fioInit()) < 0)
391 WaitSema(_fio_io_sema);
392 WaitSema(_fio_completion_sema);
394 strncpy(arg.path, name, FIO_PATH_MAX - 1);
395 arg.path[FIO_PATH_MAX - 1] = 0;
397 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_REMOVE, 0, &arg,
sizeof arg,
398 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
401 SignalSema(_fio_completion_sema);
405 SignalSema(_fio_io_sema);
412 int fioMkdir(
const char *path)
416 char path[FIO_PATH_MAX];
421 if ((res = fioInit()) < 0)
424 WaitSema(_fio_io_sema);
425 WaitSema(_fio_completion_sema);
427 strncpy(arg.path, path, FIO_PATH_MAX - 1);
428 arg.path[FIO_PATH_MAX - 1] = 0;
430 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_MKDIR, 0, &arg,
sizeof arg,
431 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
434 SignalSema(_fio_completion_sema);
438 SignalSema(_fio_io_sema);
445 int fioRmdir(
const char *dirname)
449 char path[FIO_PATH_MAX];
454 if ((res = fioInit()) < 0)
457 WaitSema(_fio_io_sema);
458 WaitSema(_fio_completion_sema);
460 strncpy(arg.path, dirname, FIO_PATH_MAX - 1);
461 arg.path[FIO_PATH_MAX - 1] = 0;
463 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_RMDIR, 0, &arg,
sizeof arg,
464 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
467 SignalSema(_fio_completion_sema);
471 SignalSema(_fio_io_sema);
478 int fioPutc(
int fd,
int c)
480 return fioWrite(fd, &c, 1);
495 int fioGets(
int fd,
char *buff,
int n)
501 read = fioRead(fd, buff, n);
503 for (i = 0; i < (read - 1); i++) {
506 fioLseek(fd, (i + 1) - read, SEEK_CUR);
511 fioLseek(fd, i - read, SEEK_CUR);
522 int fioDopen(
const char *name)
526 char name[FIO_PATH_MAX];
531 if ((res = fioInit()) < 0)
534 WaitSema(_fio_io_sema);
535 WaitSema(_fio_completion_sema);
537 strncpy(arg.name, name, FIO_PATH_MAX - 1);
538 arg.name[FIO_PATH_MAX - 1] = 0;
540 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DOPEN, 0, &arg,
sizeof arg,
541 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
544 SignalSema(_fio_completion_sema);
548 SignalSema(_fio_io_sema);
555 int fioDclose(
int fd)
564 if ((res = fioInit()) < 0)
567 WaitSema(_fio_io_sema);
568 WaitSema(_fio_completion_sema);
572 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DCLOSE, 0, &arg,
sizeof arg,
573 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
576 SignalSema(_fio_completion_sema);
580 SignalSema(_fio_io_sema);
592 if ((res = fioInit()) < 0)
595 WaitSema(_fio_io_sema);
596 WaitSema(_fio_completion_sema);
601 if (!IS_UNCACHED_SEG(buf))
604 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DREAD, 0, &arg,
sizeof arg,
605 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
606 result = arg.p.result;
608 SignalSema(_fio_completion_sema);
612 SignalSema(_fio_io_sema);
619 int fioGetstat(
const char *name,
io_stat_t *buf)
624 if ((res = fioInit()) < 0)
627 WaitSema(_fio_io_sema);
628 WaitSema(_fio_completion_sema);
631 strncpy(arg.name, name, FIO_PATH_MAX - 1);
632 arg.name[FIO_PATH_MAX - 1] = 0;
634 if (!IS_UNCACHED_SEG(buf))
635 sceSifWriteBackDCache(buf,
sizeof(
io_stat_t));
637 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_GETSTAT, 0, &arg,
sizeof arg,
638 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
639 result = arg.p.result;
641 SignalSema(_fio_completion_sema);
645 SignalSema(_fio_io_sema);
652 int fioChstat(
const char *name,
io_stat_t *buf, u32 cbit)
657 if ((res = fioInit()) < 0)
660 WaitSema(_fio_io_sema);
661 WaitSema(_fio_completion_sema);
664 memcpy(&arg.stat, buf,
sizeof(
io_stat_t));
665 strncpy(arg.name, name, FIO_PATH_MAX - 1);
666 arg.name[FIO_PATH_MAX - 1] = 0;
668 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_CHSTAT, 0, &arg,
sizeof arg,
669 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
670 result = arg.p.result;
672 SignalSema(_fio_completion_sema);
676 SignalSema(_fio_io_sema);
683 int fioFormat(
const char *name)
687 char path[FIO_PATH_MAX];
692 if ((res = fioInit()) < 0)
695 WaitSema(_fio_io_sema);
696 WaitSema(_fio_completion_sema);
698 strncpy(arg.path, name, FIO_PATH_MAX - 1);
699 arg.path[FIO_PATH_MAX - 1] = 0;
701 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_FORMAT, 0, &arg,
sizeof arg,
702 &arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
705 SignalSema(_fio_completion_sema);
709 SignalSema(_fio_io_sema);