[Mono-dev] ARM/NativeClient port

Nikolay Igotti olonho at google.com
Tue Feb 5 12:14:25 UTC 2013


       Hi Zoltan,

 Good idea, but unfortunately for [reg + reg] loads it's hard to easily
verify
that address does not escapes sandbox, so NaCL only allows [reg + imm]
addressing mode.

 So far, my approach is to augment MonoDomain with jumptable field, and
replace inline jumptable with access to this domain-wide table.

 Generated ASM for trampoline looks like:

  movw rX, lo(jump_table_entry_addr)
  movt rX, hi(jump_table_entry_addr)
  ldr rX, [rX]
  bic rX, rX, #MASK ; for NaCL only
  bx rX

and patching code decodes location to patch from movw/movt instruction
(similar to what you suggested).

 Nikolay.

On Tue, Feb 5, 2013 at 10:35 AM, Zoltan Varga <vargaz at gmail.com> wrote:

>
> On Mon, Feb 4, 2013 at 10:34 AM, Nikolay Igotti <olonho at google.com> wrote:
>
>>    Hi Zoltan,
>>
>>  For PC-relative addressing at least 2 conditions has to be satisfied:
>>  1. code must know which PC it runs at
>>  2. offset to data must be smaller than 4K to fit into immediate encoding
>>
>> If we're not using inline constant pools, it would lead to rather tricky
>> memory layout of code
>> interleaved with data.
>>
>>   Nikolay
>>
>>
> PC relative addressing is already used by the runtime in AOT mode, see the
> implementation of the OP_AOTCONST opcode, you can generate:
> movw <temp reg>, 0
> movt <temp reg>, 0
> mov <dreg>, [pc+temp reg]
> and patch the movw/movt when the address of the code and the data is
> known. I.e. for trampolines, this is already known, for methods, you can
> patch the movw/movt
> in mono_arch_patch_code ().
>
>                     Zoltan
>
>
>>
>> On Sun, Feb 3, 2013 at 10:09 PM, Zoltan Varga <vargaz at gmail.com> wrote:
>>
>>> >  Hi,
>>> >
>>> >  We're working on implementation of Mono JIT/ARM for Native Client,
>>> and want to discuss certain details about design of our solution.
>>> >  Native Client's sandboxing mechanism, being a SFI solution, has
>>> rather strict  limitations on how verifiable machine code may look like. To
>>> be precise:
>>>
>>> >  Our idea is to emit per-method (or per class?) "jump table"
>>> somewhere in .data, which contains list of all relocations, and use some
>>> register to point to this table.
>>> > So for example, trampoline like this:
>>> >        ldr ip, [pc, #0]
>>> > b skip
>>> >        .word target
>>> >      skip:
>>> > mov lr, pc
>>> > mov pc, ip
>>> > would become (if r10 is used as jump table base register):
>>> >      .align 4 # for NaCl only
>>> >         ldr ip, [r10, #32] # unique (per-method or class) index for
>>> every callsite
>>> >         nop  # for NaCl only, to have bl at bundle end
>>> >         bic r10, r10, #0xc000000f # for NaCl only
>>> >         bl ip # or blx
>>> >  r10 could point somewhere in method metadata, where its relocation
>>> table is stored.
>>>
>>> > So our question is if someone sees problem with such approach, or
>>> could suggest better alternative. Also advises which register could be used
>>> as the jump table base, and where > to store
>>> > such a table (maybe patch info?) are very welcome.
>>>
>>> Hi,
>>>
>>> ARM has PC relative addressing, so it would be easier to use that
>>> instead of reserving a register.
>>>
>>>                  Zoltan
>>>
>>> _______________________________________________
>>> Mono-devel-list mailing list
>>> Mono-devel-list at lists.ximian.com
>>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20130205/845eda37/attachment.html>


More information about the Mono-devel-list mailing list