Otto Moerbeek <[email protected]> wrote: > On Wed, Jan 20, 2021 at 07:04:08AM +0100, Christian Jullien wrote: > > > Hi, > > > > I'm running OpenBSD 6.8 on arm : > > > > $ sysctl | grep hw > > hw.machine=armv7 > > hw.model=ARM Cortex-A8 r3p2 > > hw.ncpu=1 > > hw.byteorder=1234 > > hw.pagesize=4096 > > hw.disknames=<edited> > > hw.diskcount=2 > > hw.cpuspeed=0 > > hw.product=TI AM335x BeagleBone Black > > hw.serialno==<edited> > > hw.physmem=477257728 > > hw.usermem=477241344 > > hw.ncpufound=1 > > hw.allowpowerdown=1 > > hw.ncpuonline=1 > > > > $ uname -a > > OpenBSD <edited> 6.8 GENERIC#353 armv7 > > $ clang -v > > OpenBSD clang version 10.0.1 > > Target: armv7-unknown-openbsd6.8-gnueabi > > Thread model: posix > > InstalledDir: /usr/bin > > > > And I'm trying to port my OpenLisp ISLISP compiler on it (which is quite > > different than OpenLISP, I have anteriority of the name). It needs a portion > > of memory reserved at a fixed address to allow to expand memory on demand > > and to save/restore images. > > This code works on all systems I know (> 160 GNU triplets) and it works for > > years on OpenBSD x86/x64. > > > > On arm, the portion of code below, sometimes does a coredump after mmap > > successfully returned the desired memory mapped region. > > Changing the start address or memory size (down to 0x200000 == 2Mb) does not > > change the issue. > > I can understand that mmap can fail for some given values but not why munmap > > fails after mmap success. > > This is not a bug. > > mmap with MAP_FIXED replaces any existing mapping. The unmap then zaps that > mapping, which could contain code or data used by the process. Due to > address space randomization of various things, it depens on luck. > > The proper way is to not depend on a fixed address. If your image dump > contains addresses, make them relative. For OpenLisp that might be a > huge task though. But depending on fixed addresses is not going to > work in the end. > > An approach that does not do damage but won't succeeed all the time: > > Try without MAP_FIXED. The hint will be used and if it overlaps with > an existing mapping, mmap will return a different address or MAP_FAILED > if it could not. Then check the address and if it isn't the expected > address, bail out. It is better to fail than to cause memory corruption.
Yep. As an experiment, try MAP_FIXED and suggest the address &printf. Good times, really very good times.
