@@ -235,17 +235,24 @@ void Machine::setup_linux_system_calls()
235
235
dst = address;
236
236
}
237
237
// Readv into the area
238
+ const uint64_t read_length = regs.rsi ; // Don't align the read length
238
239
std::array<Machine::WrBuffer, 256 > buffers;
239
240
const size_t cnt =
240
- cpu.machine ().writable_buffers_from_range (buffers.size (), buffers.data (), dst, length );
241
+ cpu.machine ().writable_buffers_from_range (buffers.size (), buffers.data (), dst, read_length );
241
242
// Seek to the given offset in the file and read the contents into guest memory
242
243
if (preadv64 (real_fd, (const iovec *)&buffers[0 ], cnt, voff) < 0 ) {
243
244
regs.rax = ~0LL ; /* MAP_FAILED */
244
245
} else {
245
246
regs.rax = dst;
246
247
}
248
+ // Zero the remaining area
249
+ const size_t zero_length = length - read_length;
250
+ if (zero_length > 0 )
251
+ {
252
+ cpu.machine ().memzero (dst + read_length, zero_length);
253
+ }
247
254
PRINTMMAP (" mmap(0x%lX, %lu, prot=%llX, flags=%llX) = 0x%llX\n " ,
248
- address, length , regs.rdx , regs.r10 , regs.rax );
255
+ address, read_length , regs.rdx , regs.r10 , regs.rax );
249
256
cpu.set_registers (regs);
250
257
return ;
251
258
}
@@ -1072,14 +1079,18 @@ void Machine::setup_linux_system_calls()
1072
1079
struct rlimit64 lim{};
1073
1080
lim.rlim_cur = cpu.machine ().stack_address () - (4UL << 20 );
1074
1081
lim.rlim_max = cpu.machine ().stack_address ();
1082
+ SYSPRINT (" prlimit64: current stack limit 0x%llX max 0x%llX\n " ,
1083
+ lim.rlim_cur , lim.rlim_max );
1075
1084
cpu.machine ().copy_to_guest (oldptr, &lim, sizeof (lim));
1076
1085
}
1077
1086
else if (newptr != 0x0 )
1078
1087
{
1079
- // struct rlimit64 lim {};
1080
- // cpu.machine().copy_from_guest(&lim, newptr, sizeof(lim));
1081
- // printf("prlimit64: new stack limit 0x%llX max 0x%llX\n",
1082
- // lim.rlim_cur, lim.rlim_max);
1088
+ #ifdef VERBOSE_SYSCALLS
1089
+ struct rlimit64 lim {};
1090
+ cpu.machine ().copy_from_guest (&lim, newptr, sizeof (lim));
1091
+ SYSPRINT (" prlimit64: new stack limit 0x%llX max 0x%llX\n " ,
1092
+ lim.rlim_cur , lim.rlim_max );
1093
+ #endif
1083
1094
}
1084
1095
regs.rax = 0 ;
1085
1096
break ;
0 commit comments