All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander Bulekov <alxndr@bu.edu>
To: Joelle van Dyne <j@getutm.app>
Cc: Richard Henderson <richard.henderson@linaro.org>,
	QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [PATCH v2 6/9] tcg: implement mirror mapped JIT for iOS
Date: Sun, 25 Oct 2020 19:43:04 -0400	[thread overview]
Message-ID: <20201025234304.v3sclooubjsdvqga@mozz.bu.edu> (raw)
In-Reply-To: <CA+E+eSBh7fQnn+PapM_hnuo=jeKih6Q+Vmbjyz3ci2Y_c-okZw@mail.gmail.com>

On 201025 1351, Joelle van Dyne wrote:
> > Finally, I'd like to have this implemented on Linux as well, or I'm afraid the
> > feature will bit-rot.  This can be trivially done by either (1)
> > MREMAP_DONTUNMAP or (2) mapping from posix shared memory instead of MAP_ANON so
> > that you can map the same memory twice.  Thus virtually all of the ifdefs
> > should go away.
> Just spent an hour trying to implement this for Linux and running into issues.
> 
> 1) Doesn't work because MREMAP_DONTUNMAP does in fact remove the entry
> from the page table. According to the man pages "After completion, any
> access to the range specified by old_address and old_size will result
> in a page fault." Seems like the feature is designed around memory
> locking, not mirror mapping.
> 
> 2) I tried doing shm_open() and mmap() but you can't PROT_EXEC on shm
> (see https://stackoverflow.com/questions/25275777/shared-executable-memory
> )
> 
> I think it may be possible to map a file on an executable partition,
> but I can foresee countless issues there including some security
> issues. Anyone have any other ideas?

Maybe memfd_create(2) + mmap? It doesn't require a tmpfs mount, so it should
be affected by noexec.
-Alex

> 
> -j
> 
> On Mon, Oct 19, 2020 at 5:20 PM Richard Henderson
> <richard.henderson@linaro.org> wrote:
> >
> > On 10/19/20 3:39 PM, Joelle van Dyne wrote:
> > >> Explicit cast may not be needed here so this could be a macro if caling it
> > >> differently helps or why don't you just use tcg_mirror_prr_rw directly
> > >> everywhere?
> > >
> > > There are quite a bit of code that depends on tcg_insn_unit * type such as
> > >
> > > *tcg_code_ptr_rw(s, code_ptr) = insn;
> > >
> > > and
> > >
> > > (tcg_code_ptr_rw(s, p))[i] = NOP;
> > >
> > > I think it's cleaner to not have to manually cast in every one of 30+
> > > instances of this. In v1, I used a macro but was told to use an inline
> > > function instead.
> >
> > Yep.
> >
> > >> Is that !defined or are you missing an implementation and #else here?
> > > No, `flush_dcache_range` is only needed when mirror mapped (after
> > > writing to the RW mirror). Now there is no iOS compatible compiler for
> > > any other arch than x86 and ARM. However, in the slim chance that
> > > Apple decides to change arch again in the future and moves to RISC-V
> > > or something, then we get a nice compiler error.
> >
> > *shrug* As opposed to the nice compiler error you get for a missing function
> > declaration?
> >
> > That said, I think __builtin___clear_cache() may be the target-independent
> > runtime function that you need.  Both GCC and LLVM support this, and I'd be
> > surprised if that doesn't carry through to iOS.
> >
> > >> Maybe this patch could be split up some more, making the RW offset
> > >> handling and cache management separate patches even if they don't work
> > >> separately just to make it easier to review.
> > >
> > > I can probably do that for v3 but imo most of the LOC here is because
> > > the same change has to be done to every TCG target. No matter how you
> > > split up the patches, it will look like a lot of changes.
> >
> > It occurs to me that the majority of the code changes in patches 5 and 6 are
> > due to your choice that code_gen_buffer points to the RX copy and not the RW copy.
> >
> > Swap the two, and instead have an inline function that produces the executable
> > pointer from the rw pointer, and suddenly there are very much fewer changes
> > required.
> >
> > For the most part, tcg/$cpu/ generates pc-relative code, so it need not
> > consider the absolute address.  There are a few exceptions including,
> > obviously, 32-bit x86.  But the number of places that occurs is small.
> >
> > There's the assignment to tb->tc.ptr of course, and
> > tcg_ctx.code_gen_prologue/epilogue.
> >
> > In any case, each of these changes (generic, per tcg backend) can occur before
> > you finally add a non-zero displacement that actually separates the RX and RW
> > mappings.
> >
> > Finally, I'd like to have this implemented on Linux as well, or I'm afraid the
> > feature will bit-rot.  This can be trivially done by either (1)
> > MREMAP_DONTUNMAP or (2) mapping from posix shared memory instead of MAP_ANON so
> > that you can map the same memory twice.  Thus virtually all of the ifdefs
> > should go away.
> >
> >
> > r~
> 


  reply	other threads:[~2020-10-25 23:44 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-19  1:39 [PATCH v2 0/9] iOS and Apple Silicon host support Joelle van Dyne
2020-10-19  1:39 ` [PATCH v2 1/9] configure: option to disable host block devices Joelle van Dyne
2020-10-19  1:39 ` [PATCH v2 2/9] configure: cross-compiling without cross_prefix Joelle van Dyne
2020-10-19  8:07   ` Thomas Huth
2020-10-19  8:09     ` Thomas Huth
2020-10-19 11:24       ` BALATON Zoltan via
2020-10-19 22:24         ` Joelle van Dyne
2020-10-20  5:15           ` Thomas Huth
2020-10-20  8:34             ` Paolo Bonzini
2020-10-25 19:24               ` Joelle van Dyne
2020-10-26  7:54                 ` Paolo Bonzini
2020-10-26 15:33                   ` Joelle van Dyne
2020-10-26 16:15                     ` Paolo Bonzini
2020-10-26 18:51                       ` Thomas Huth
2020-10-19  1:39 ` [PATCH v2 3/9] qemu: add support for iOS host Joelle van Dyne
2020-10-19  1:39 ` [PATCH v2 4/9] coroutine: add libucontext as external library Joelle van Dyne
2020-10-19  1:39 ` [PATCH v2 5/9] tcg: add const hints for code pointers Joelle van Dyne
2020-10-19  1:39   ` Joelle van Dyne
2020-10-19 23:19   ` Richard Henderson
2020-10-19 23:19     ` Richard Henderson
2020-10-19 23:26     ` Joelle van Dyne
2020-10-19 23:27   ` Richard Henderson
2020-10-19 23:27     ` Richard Henderson
2020-10-19 23:36     ` Joelle van Dyne
2020-10-19 23:41       ` Richard Henderson
2020-10-19  1:39 ` [PATCH v2 6/9] tcg: implement mirror mapped JIT for iOS Joelle van Dyne
2020-10-19  1:39   ` Joelle van Dyne
2020-10-19 11:48   ` BALATON Zoltan via
2020-10-19 11:48     ` BALATON Zoltan
2020-10-19 22:39     ` Joelle van Dyne
2020-10-19 23:45       ` BALATON Zoltan via
2020-10-20  0:19       ` Richard Henderson
2020-10-25 19:46         ` Joelle van Dyne
2020-10-25 20:51         ` Joelle van Dyne
2020-10-25 23:43           ` Alexander Bulekov [this message]
2020-10-19  1:39 ` [PATCH v2 7/9] tcg: mirror mapping RWX pages for iOS optional Joelle van Dyne
2020-10-20  1:27   ` Richard Henderson
2020-10-19  1:39 ` [PATCH v2 8/9] tcg: support JIT on Apple Silicon Joelle van Dyne
2020-10-19  1:39 ` [PATCH v2 9/9] block: check availablity for preadv/pwritev on mac Joelle van Dyne
2020-10-19  8:27   ` Thomas Huth
2020-10-19 22:20     ` Joelle van Dyne
2020-10-20  5:19       ` Thomas Huth
2020-10-19  8:29 ` [PATCH v2 0/9] iOS and Apple Silicon host support Thomas Huth
2020-10-26 15:30   ` Joelle van Dyne

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201025234304.v3sclooubjsdvqga@mozz.bu.edu \
    --to=alxndr@bu.edu \
    --cc=j@getutm.app \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.