[Mono-dev] patch to mono-mman.c to accommodate Android, bug report for Arm thunk handling

Zoltan Varga vargaz at gmail.com
Tue Jan 20 22:16:02 EST 2009


Hi,

  This is now in SVN.

           Zoltan

2009/1/21 Koushik K. Dutta <koush at koushikdutta.com>:
> Hello again!
>
>
>
> Android's libc has an implementation of mmap, but does not implement shmem
> functions. Instead Android uses a different implementation of memory sharing
> called "ashmem".
>
>
>
> mono-mman.c assumes that if mmap is available/implemented, so is shm_open.
> This change further reorganizes the code so that mmap and and shm_open are
> uncoupled (as they are not really dependent on each other). This allows Mono
> on Android to use mmap instead of malloc.
>
>
>
>
>
> Incidentally, this change came out of necessity: if mmap is not available,
> Mono falls back to using the malloc based implementation of mono_valloc. The
> problem with malloc is that it exposed a bug in the Arm thunk handling:
>
> If the delta between the of a branch-and-link and the target's instruction
> pointer is greater than 0x1ffffff, it will attempt to utilize a thunk to
> explicitly set the program counter to the target. The problem with this is
> that the number of entries in the thunk table is hard coded to (code chunk
> length / 8). So if the intended thunk table fills up due to numerous thunks,
> it will check the other tables that are available. This is where malloc and
> mmap seem to behave differently:
>
> ·         mmap seems to provide sequential memory addresses with every
> successive call to the function. This works out well, since then the
> original branch-and-link that is being modified is in branch range of thunk
> tables that were created for other code chunks.
>
> ·         malloc , at least on Android, seems to provide wildly different
> addresses with each successive call (in a deterministic manner it seems). In
> my case, it starts out providing addresses in the 0x00700000 range. Then the
> addresses jump up into the 0x40000000 range. This is where if a thunk table
> fills up, and Mono can't find a suitable thunk slot (one that is in branch
> range), it fails at the assert in mini-arm.c:handle_thunk:~2035.
>
>
>
> So, although this bug exists for any Arm build, this patch just keeps it
> from surfacing on Android (for now). I looked into actually fixing this
> properly, because it is possible that it could occur with mmap (it is just
> very unlikely). But from my investigation, the changes would be too deep
> (changes to arm_patch, and more). And I'm not familiar enough with the code…
> yet. J
>
>
>
> Koushik Dutta
>
> www.koushikdutta.com
>
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>


More information about the Mono-devel-list mailing list