@@ -204,6 +204,8 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
204
204
#define TARGET_NR__llseek TARGET_NR_llseek
205
205
#endif
206
206
207
+ static bool last_read_empty = false;
208
+
207
209
#ifdef __NR_gettid
208
210
_syscall0 (int , gettid )
209
211
#else
@@ -671,6 +673,7 @@ abi_long do_brk(abi_ulong new_brk)
671
673
}
672
674
target_brk = new_brk ;
673
675
DEBUGF_BRK (TARGET_ABI_FMT_lx " (new_brk <= brk_page)\n" , target_brk );
676
+ printf ("[tracer-debug] New BRK: 0x%lx\n" , (unsigned long ) target_brk );
674
677
return target_brk ;
675
678
}
676
679
@@ -699,6 +702,7 @@ abi_long do_brk(abi_ulong new_brk)
699
702
brk_page = HOST_PAGE_ALIGN (target_brk );
700
703
DEBUGF_BRK (TARGET_ABI_FMT_lx " (mapped_addr == brk_page)\n" ,
701
704
target_brk );
705
+ printf ("[tracer-debug] New BRK: 0x%lx\n" , (unsigned long ) target_brk );
702
706
return target_brk ;
703
707
} else if (mapped_addr != -1 ) {
704
708
/* Mapped but at wrong address, meaning there wasn't actually
@@ -718,6 +722,7 @@ abi_long do_brk(abi_ulong new_brk)
718
722
return - TARGET_ENOMEM ;
719
723
#endif
720
724
/* For everything else, return the previous break. */
725
+ printf ("[tracer-debug] BRK unchanged (0x%lx\n)" , (unsigned long ) target_brk );
721
726
return target_brk ;
722
727
}
723
728
@@ -5572,6 +5577,14 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
5572
5577
if (!(p = lock_user (VERIFY_WRITE , arg2 , arg3 , 0 )))
5573
5578
goto efault ;
5574
5579
ret = get_errno (read (arg1 , p , arg3 ));
5580
+ if (ret == 0 ) {
5581
+ if (last_read_empty ) {
5582
+ exit_group (1 );
5583
+ }
5584
+ last_read_empty = true;
5585
+ } else {
5586
+ last_read_empty = false;
5587
+ }
5575
5588
unlock_user (p , arg2 , ret );
5576
5589
}
5577
5590
break ;
0 commit comments