@@ -62,7 +62,7 @@ static const mips_syscall_desc_t mips_syscall_args[] = {
62
62
MIPS_SYS (sys_syscall , 8 , syscall_default_handler) /* 4000 */
63
63
MIPS_SYS (sys_exit , 1 , syscall_default_handler)
64
64
MIPS_SYS (sys_fork , 0 , syscall_default_handler)
65
- MIPS_SYS (sys_read , 3 , syscall_default_handler )
65
+ MIPS_SYS (sys_read , 3 , do_sys_read )
66
66
MIPS_SYS (sys_write , 3 , do_sys_write)
67
67
MIPS_SYS (sys_open , 3 , syscall_default_handler) /* 4005 */
68
68
MIPS_SYS (sys_close , 1 , syscall_default_handler)
@@ -204,7 +204,7 @@ static const mips_syscall_desc_t mips_syscall_args[] = {
204
204
MIPS_SYS (sys_select , 5 , syscall_default_handler)
205
205
MIPS_SYS (sys_flock , 2 , syscall_default_handler)
206
206
MIPS_SYS (sys_msync , 3 , syscall_default_handler)
207
- MIPS_SYS (sys_readv , 3 , syscall_default_handler ) /* 4145 */
207
+ MIPS_SYS (sys_readv , 3 , do_sys_readv ) /* 4145 */
208
208
MIPS_SYS (sys_writev , 3 , do_sys_writev)
209
209
MIPS_SYS (sys_cacheflush , 3 , syscall_default_handler)
210
210
MIPS_SYS (sys_cachectl , 3 , syscall_default_handler)
@@ -598,6 +598,83 @@ int OsSyscallExceptionHandler::do_sys_write(std::uint32_t &result, Core *core,
598
598
return 0 ;
599
599
}
600
600
601
+ // ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
602
+ int OsSyscallExceptionHandler::do_sys_readv (std::uint32_t &result, Core *core,
603
+ std::uint32_t syscall_num,
604
+ std::uint32_t a1, std::uint32_t a2, std::uint32_t a3,
605
+ std::uint32_t a4, std::uint32_t a5, std::uint32_t a6,
606
+ std::uint32_t a7, std::uint32_t a8) {
607
+ (void )core; (void )syscall_num;
608
+ (void )a1; (void )a2; (void )a3; (void )a4; (void )a5; (void )a6; (void )a7; (void )a8;
609
+
610
+ result = 0 ;
611
+ int fd = a1;
612
+ std::uint32_t iov = a2;
613
+ int iovcnt = a3;
614
+ MemoryAccess *mem = core->get_mem_data ();
615
+ bool available;
616
+ unsigned int byte;
617
+
618
+ printf (" sys_readv to fd %d\n " , fd);
619
+
620
+ while (iovcnt-- > 0 ) {
621
+ std::uint32_t iov_base = mem->read_word (iov);
622
+ std::uint32_t iov_len = mem->read_word (iov + 4 );
623
+ iov += 8 ;
624
+ available = true ;
625
+ for (std::uint32_t i = 0 ; i < iov_len; i++) {
626
+ emit rx_byte_pool (fd, byte, available);
627
+ if (!available) {
628
+ // add final newline if there are no more data
629
+ mem->write_byte (iov_base++, ' \n ' );
630
+ result += 1 ;
631
+ break ;
632
+ }
633
+ mem->write_byte (iov_base++, byte);
634
+ result += 1 ;
635
+ }
636
+ if (!available)
637
+ break ;
638
+ }
639
+
640
+ return 0 ;
641
+ }
642
+
643
+ // ssize_t read(int fd, void *buf, size_t count);
644
+ int OsSyscallExceptionHandler::do_sys_read (std::uint32_t &result, Core *core,
645
+ std::uint32_t syscall_num,
646
+ std::uint32_t a1, std::uint32_t a2, std::uint32_t a3,
647
+ std::uint32_t a4, std::uint32_t a5, std::uint32_t a6,
648
+ std::uint32_t a7, std::uint32_t a8) {
649
+ (void )core; (void )syscall_num;
650
+ (void )a1; (void )a2; (void )a3; (void )a4; (void )a5; (void )a6; (void )a7; (void )a8;
651
+
652
+ result = 0 ;
653
+ int fd = a1;
654
+ std::uint32_t buf = a2;
655
+ int size = a3;
656
+ MemoryAccess *mem = core->get_mem_data ();
657
+ bool available;
658
+ unsigned int byte;
659
+
660
+ printf (" sys_read to fd %d\n " , fd);
661
+
662
+ result = 0 ;
663
+ while (size-- > 0 ) {
664
+ emit rx_byte_pool (fd, byte, available);
665
+ if (!available) {
666
+ // add final newline if there are no more data
667
+ mem->write_byte (buf++, ' \n ' );
668
+ result += 1 ;
669
+ break ;
670
+ }
671
+ mem->write_byte (buf++, byte);
672
+ result += 1 ;
673
+ }
674
+
675
+ return 0 ;
676
+ }
677
+
601
678
// int or void * brk(void *addr);
602
679
int OsSyscallExceptionHandler::do_sys_brk (std::uint32_t &result, Core *core,
603
680
std::uint32_t syscall_num,
0 commit comments