From: Thomas De Schampheleire <patrickdepinguin+linuxppc@gmail.com>
To: Tabi Timur-B04825 <B04825@freescale.com>
Cc: linuxppc-dev <linuxppc-dev@ozlabs.org>
Subject: Re: Mapping an executable page
Date: Tue, 14 Jun 2011 10:56:31 +0200 [thread overview]
Message-ID: <BANLkTimhKOvY8XA=_20rjtkZ0Um45o2Bow@mail.gmail.com> (raw)
In-Reply-To: <BANLkTinOxqF=TcBxQOsfJSot-1XH3iErXA@mail.gmail.com>
Hi,
On Sun, May 29, 2011 at 4:53 PM, Tabi Timur-B04825 <B04825@freescale.com> w=
rote:
> On Fri, May 27, 2011 at 8:25 AM, Thomas De Schampheleire
> <patrickdepinguin+linuxppc@gmail.com> wrote:
>
>> Although I realize that what I need to achieve is unconventional, what
>> is the correct way of mapping a certain address range into memory, and
>> be able to execute from it?
>
> Have you tried looking at the actual TLB entry for this page to see if
> it's correct? =A0Also, you might need to do some kind of instruction
> cache flushing before you jump to that page.
Sorry to have delayed this so long.
I had to do quite some experimentation to get it finally working. Here
are my findings:
* to map a page as executable, the following does indeed work:
void __iomem *vaddr =3D __ioremap(map_start, map_size, (_PAGE_BASE |
_PAGE_KERNEL_RWX));
* However, if you jump to an address in that page, you'll have to make
sure that the entire code that executes is mapped (make map_size large
enough).
* When that range spanned multiple pages, I faced the issue of only
one page being actually mapped in the TLBs. My assumption is that the
call to __ioremap not necessarily updates the TLBs, but mainly some
kernel-internal tables. The actual TLB mapping presumably happens when
a data exception occurs.
Unfortunately, since I left the Linux kernel and jumped to other
(boot) code that reassigns the exception vectors, the kernel-internal
tables are not used anymore, and the exception handler cannot update
the TLBs correctly.
* Therefore, to make sure that the mapping I intended with __ioremap()
is actually reflected in the TLB tables, I added dummy reads of each
page in the TLB, prior to jumping to the boot code, as follows:
/* make sure memory is read, once every 4Kbyte is enough */
for (p =3D vaddr; p < vaddr + map_size; p +=3D 0x1000) {
unsigned long dummy =3D *(volatile unsigned long *)=
p;
(void)dummy;
}
* After these changes (make sure all code is mapped + make sure to
read all pages so that the TLBs are updated), my scenario works fine.
Best regards,
Thomas
next prev parent reply other threads:[~2011-06-14 8:56 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-27 13:25 Mapping an executable page Thomas De Schampheleire
2011-05-29 14:53 ` Tabi Timur-B04825
2011-06-14 8:56 ` Thomas De Schampheleire [this message]
2011-06-14 20:02 ` Timur Tabi
2011-06-14 20:07 ` Timur Tabi
2011-06-22 7:49 ` Thomas De Schampheleire
2011-06-22 11:40 ` Tabi Timur-B04825
2011-06-22 12:53 ` Thomas De Schampheleire
2011-06-22 7:44 ` Thomas De Schampheleire
2011-06-14 20:26 ` Scott Wood
2011-06-22 7:52 ` Thomas De Schampheleire
2011-05-31 16:01 ` McClintock Matthew-B29882
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='BANLkTimhKOvY8XA=_20rjtkZ0Um45o2Bow@mail.gmail.com' \
--to=patrickdepinguin+linuxppc@gmail.com \
--cc=B04825@freescale.com \
--cc=linuxppc-dev@ozlabs.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).