qemu-devel.nongnu.org archive mirror
 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: 39+ 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 23:19   ` Richard Henderson
2020-10-19 23:26     ` Joelle van Dyne
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 11:48   ` BALATON Zoltan via
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).