22#define NEWLIB_PORT_AWARE
28#define D(fmt, args...) printf("(%s:%s:%i):" #fmt, __FILE__, __FUNCTION__, __LINE__, ##args)
30extern SifRpcClientData_t _fio_cd;
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];
40SifRpcClientData_t _fio_cd;
45int _fio_completion_sema;
51 if (HasIopRebootedSinceLastCall())
59 while (((res = sceSifBindRpc(&_fio_cd, 0x80000001, 0)) >= 0) &&
60 (_fio_cd.server == NULL))
69 _fio_completion_sema = CreateSema(&sema);
70 if (_fio_completion_sema < 0)
72 _fio_completion_sema = 0;
80 _fio_io_sema = CreateSema(&sema);
87 _fio_block_mode = FIO_WAIT;
94 iSignalSema(_fio_completion_sema);
97int 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]);
135void fioSetBlockMode(
int blocking)
137 _fio_block_mode = blocking;
142 if (_fio_cd.server) {
143 memset(&_fio_cd, 0,
sizeof _fio_cd);
144 if (_fio_completion_sema > 0) {
145 DeleteSema(_fio_completion_sema);
146 _fio_completion_sema = 0;
148 if (_fio_io_sema > 0) {
149 DeleteSema(_fio_io_sema);
155int fioOpen(
const char *name,
int mode)
160 if ((res = fioInit()) < 0)
163 WaitSema(_fio_io_sema);
164 WaitSema(_fio_completion_sema);
167 strncpy(arg->name, name,
sizeof(arg->name));
168 arg->name[
sizeof(arg->name) - 1] = 0;
170 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_OPEN, _fio_block_mode, arg,
sizeof *arg,
171 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
172 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
174 SignalSema(_fio_completion_sema);
178 SignalSema(_fio_io_sema);
193 if ((res = fioInit()) < 0)
196 WaitSema(_fio_io_sema);
197 WaitSema(_fio_completion_sema);
201 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_CLOSE, 0, arg, 4, arg, 4,
202 (
void *)_fio_intr, NULL)) >= 0) {
203 result = arg->result;
205 SignalSema(_fio_completion_sema);
209 SignalSema(_fio_io_sema);
218 if (uncached->size1 && uncached->dest1) {
219 memcpy(uncached->dest1, uncached->buf1, uncached->size1);
222 if (uncached->size2 && uncached->dest2) {
223 memcpy(uncached->dest2, uncached->buf2, uncached->size2);
226 iSignalSema(_fio_completion_sema);
229int fioRead(
int fd,
void *ptr,
int size)
234 if ((res = fioInit()) < 0)
237 WaitSema(_fio_io_sema);
238 WaitSema(_fio_completion_sema);
245 if (!IS_UNCACHED_SEG(ptr))
246 sceSifWriteBackDCache(ptr, size);
248 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_READ, _fio_block_mode, arg,
sizeof *arg,
249 _fio_recv_data, 4, (
void *)_fio_read_intr, _fio_intr_data)) >= 0) {
250 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
252 SignalSema(_fio_completion_sema);
256 SignalSema(_fio_io_sema);
261int fioWrite(
int fd,
const void *ptr,
int size)
264 int mis, res, result;
266 if ((res = fioInit()) < 0)
269 WaitSema(_fio_io_sema);
270 WaitSema(_fio_completion_sema);
278 if ((u32)ptr & 0xf) {
279 mis = 16 - ((u32)ptr & 0xf);
286 memcpy(arg->aligned, ptr, mis);
288 if (!IS_UNCACHED_SEG(ptr))
289 sceSifWriteBackDCache((
void *)ptr, size);
291 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_WRITE, _fio_block_mode, arg,
sizeof *arg,
292 _fio_recv_data, 4, (
void *)_fio_intr, NULL)) >= 0) {
293 result = (_fio_block_mode == FIO_NOWAIT) ? 0 : _fio_recv_data[0];
295 SignalSema(_fio_completion_sema);
299 SignalSema(_fio_io_sema);
304int fioLseek(
int fd,
int offset,
int whence)
309 if ((res = fioInit()) < 0)
312 WaitSema(_fio_io_sema);
313 WaitSema(_fio_completion_sema);
316 arg->offset = offset;
317 arg->whence = whence;
319 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_LSEEK, 0, arg,
sizeof *arg,
320 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
321 result = arg->p.result;
323 SignalSema(_fio_completion_sema);
327 SignalSema(_fio_io_sema);
332int fioIoctl(
int fd,
int request,
void *data)
337 if ((res = fioInit()) < 0)
340 WaitSema(_fio_io_sema);
341 WaitSema(_fio_completion_sema);
347 memcpy(arg->data, data, 1024);
349 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_IOCTL, 0, arg,
sizeof *arg,
350 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
351 result = arg->p.result;
353 SignalSema(_fio_completion_sema);
357 SignalSema(_fio_io_sema);
362int fioRemove(
const char *name)
366 char path[FIO_PATH_MAX];
372 if ((res = fioInit()) < 0)
375 WaitSema(_fio_io_sema);
376 WaitSema(_fio_completion_sema);
378 strncpy(arg->path, name,
sizeof(arg->path));
379 arg->path[
sizeof(arg->path) - 1] = 0;
381 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_REMOVE, 0, arg,
sizeof *arg,
382 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
383 result = arg->result;
385 SignalSema(_fio_completion_sema);
389 SignalSema(_fio_io_sema);
394int fioMkdir(
const char *path)
398 char path[FIO_PATH_MAX];
404 if ((res = fioInit()) < 0)
407 WaitSema(_fio_io_sema);
408 WaitSema(_fio_completion_sema);
410 strncpy(arg->path, path,
sizeof(arg->path));
411 arg->path[
sizeof(arg->path) - 1] = 0;
413 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_MKDIR, 0, arg,
sizeof *arg,
414 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
415 result = arg->result;
417 SignalSema(_fio_completion_sema);
421 SignalSema(_fio_io_sema);
426int fioRmdir(
const char *dirname)
430 char path[FIO_PATH_MAX];
436 if ((res = fioInit()) < 0)
439 WaitSema(_fio_io_sema);
440 WaitSema(_fio_completion_sema);
442 strncpy(arg->path, dirname,
sizeof(arg->path));
443 arg->path[
sizeof(arg->path) - 1] = 0;
445 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_RMDIR, 0, arg,
sizeof *arg,
446 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
447 result = arg->result;
449 SignalSema(_fio_completion_sema);
453 SignalSema(_fio_io_sema);
458int fioPutc(
int fd,
int c)
460 return fioWrite(fd, &c, 1);
471int fioGets(
int fd,
char *buff,
int n)
477 read = fioRead(fd, buff, n);
479 for (i = 0; i < (read - 1); i++) {
482 fioLseek(fd, (i + 1) - read, SEEK_CUR);
487 fioLseek(fd, i - read, SEEK_CUR);
496int fioDopen(
const char *name)
500 char name[FIO_PATH_MAX];
506 if ((res = fioInit()) < 0)
509 WaitSema(_fio_io_sema);
510 WaitSema(_fio_completion_sema);
512 strncpy(arg->name, name,
sizeof(arg->name));
513 arg->name[
sizeof(arg->name) - 1] = 0;
515 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DOPEN, 0, arg,
sizeof *arg,
516 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
517 result = arg->result;
519 SignalSema(_fio_completion_sema);
523 SignalSema(_fio_io_sema);
538 if ((res = fioInit()) < 0)
541 WaitSema(_fio_io_sema);
542 WaitSema(_fio_completion_sema);
546 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DCLOSE, 0, arg,
sizeof *arg,
547 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
548 result = arg->result;
550 SignalSema(_fio_completion_sema);
554 SignalSema(_fio_io_sema);
564 if ((res = fioInit()) < 0)
567 WaitSema(_fio_io_sema);
568 WaitSema(_fio_completion_sema);
573 if (!IS_UNCACHED_SEG(buf))
576 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_DREAD, 0, arg,
sizeof *arg,
577 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
578 result = arg->p.result;
580 SignalSema(_fio_completion_sema);
584 SignalSema(_fio_io_sema);
589int fioGetstat(
const char *name,
io_stat_t *buf)
594 if ((res = fioInit()) < 0)
597 WaitSema(_fio_io_sema);
598 WaitSema(_fio_completion_sema);
601 strncpy(arg->name, name,
sizeof(arg->name));
602 arg->name[
sizeof(arg->name) - 1] = 0;
604 if (!IS_UNCACHED_SEG(buf))
605 sceSifWriteBackDCache(buf,
sizeof(
io_stat_t));
607 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_GETSTAT, 0, arg,
sizeof *arg,
608 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
609 result = arg->p.result;
611 SignalSema(_fio_completion_sema);
615 SignalSema(_fio_io_sema);
620int fioChstat(
const char *name,
io_stat_t *buf, u32 cbit)
625 if ((res = fioInit()) < 0)
628 WaitSema(_fio_io_sema);
629 WaitSema(_fio_completion_sema);
632 memcpy(&arg->stat, buf,
sizeof(
io_stat_t));
633 strncpy(arg->name, name,
sizeof(arg->name));
634 arg->name[
sizeof(arg->name) - 1] = 0;
636 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_CHSTAT, 0, arg,
sizeof *arg,
637 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
638 result = arg->p.result;
640 SignalSema(_fio_completion_sema);
644 SignalSema(_fio_io_sema);
649int fioFormat(
const char *name)
653 char path[FIO_PATH_MAX];
659 if ((res = fioInit()) < 0)
662 WaitSema(_fio_io_sema);
663 WaitSema(_fio_completion_sema);
665 strncpy(arg->path, name,
sizeof(arg->path));
666 arg->path[
sizeof(arg->path) - 1] = 0;
668 if ((res = sceSifCallRpc(&_fio_cd, FIO_F_FORMAT, 0, arg,
sizeof *arg,
669 arg, 4, (
void *)_fio_intr, NULL)) >= 0) {
670 result = arg->result;
672 SignalSema(_fio_completion_sema);
676 SignalSema(_fio_io_sema);