@@ -244,7 +244,7 @@ void Machine::setup_linux_system_calls()
244244 } else {
245245 regs.rax = dst;
246246 }
247- PRINTMMAP (" mmap(0x%llX , %llu , prot=%llX, flags=%llX) = 0x%llX\n " ,
247+ PRINTMMAP (" mmap(0x%lX , %lu , prot=%llX, flags=%llX) = 0x%llX\n " ,
248248 address, length, regs.rdx , regs.r10 , regs.rax );
249249 cpu.set_registers (regs);
250250 return ;
@@ -300,7 +300,7 @@ void Machine::setup_linux_system_calls()
300300 {
301301 cpu.machine ().memzero (regs.rax , length);
302302 }
303- PRINTMMAP (" mmap(0x%llX , %llu , prot=%llX, flags=%llX) = 0x%llX\n " ,
303+ PRINTMMAP (" mmap(0x%lX , %lu , prot=%llX, flags=%llX) = 0x%llX\n " ,
304304 address, length, regs.rdx , regs.r10 , regs.rax );
305305 cpu.set_registers (regs);
306306 });
@@ -331,17 +331,16 @@ void Machine::setup_linux_system_calls()
331331 Machine::install_syscall_handler (
332332 SYS_brk, [](vCPU& cpu) { // BRK
333333 auto & regs = cpu.registers ();
334- if (regs.rdi > cpu.machine ().heap_address () + Machine::BRK_MAX)
335- {
336- regs.rax = cpu.machine ().heap_address () + Machine::BRK_MAX;
337- }
338- else if (regs.rdi < cpu.machine ().heap_address ())
339- {
340- regs.rax = cpu.machine ().heap_address ();
341- }
342- else
343- {
344- regs.rax = regs.rdi ;
334+ const uint64_t old_brk = cpu.machine ().brk_address ();
335+ uint64_t new_brk = regs.rdi ;
336+ if (new_brk < old_brk) {
337+ // brk() to a lower address, keep the old one
338+ // We can only grow the heap, not shrink it.
339+ regs.rax = old_brk;
340+ } else {
341+ // clamp brk() outside to the heap range
342+ new_brk = std::min (new_brk, cpu.machine ().brk_end_address ());
343+ regs.rax = new_brk;
345344 }
346345 SYSPRINT (" brk(0x%llX) = 0x%llX\n " , regs.rdi , regs.rax );
347346 cpu.set_registers (regs);
@@ -1049,7 +1048,7 @@ void Machine::setup_linux_system_calls()
10491048 Machine::install_syscall_handler (
10501049 SYS_getrlimit, [](vCPU& cpu) { // getrlimit
10511050 auto & regs = cpu.registers ();
1052- const auto g_rlim = regs.rsi ;
1051+ [[maybe_unused]] const auto g_rlim = regs.rsi ;
10531052 regs.rax = -ENOSYS;
10541053 SYSPRINT (" getrlimit(0x%llX) = %lld\n " , g_rlim, regs.rax );
10551054 cpu.set_registers (regs);
0 commit comments