mapping memory in 0xb space

Igor Grobman igor at cs.wisc.edu
Wed Sep 29 04:52:16 EST 2004


On Tue, 28 Sep 2004, David Gibson wrote:
>
> Err... this seems likely to cause trouble.

So it has :-)

>  Recent kernels don't even
> have VSIDs allocated for the 0xb... region.

Looking at both 2.6.8 and 2.4.21, I don't see a difference in
get_kernel_vsid() code.

>  2.4.21 will have some
> kernel VSIDs there, but there will probably be a bunch of places that
> assume addresses below 0xc... are user addresses and compute the vsids
> accordingly.

Note that since I put in a bolted entry into the HPT, I assume I don't
have to worry about page fault handling code.  This leaves segments.  Both
DataAccess_common and DataAccessSLB_common call
do_stab_bolted/do_slb_bolted when confronted with an address in 0xb
region.  Presumably, this will fault in the segments I am interested in.


> Differences in the code for segment table and SLB
> machines are probably why it works (or seems to) on power3 but not
> power4.

SLB machines are LPAR machines, correct?  In that case, neither the power3
nor the power4 I am using are SLB machines.  Also, I narrowed it down to
working (or appearing to work) as long as the highest 5 bits of the page
index (those that end up as partial index in the HPTE) are zero.  This may
just be a weird coincidence.

>
> Also, unless you've created a new set, there are no Linux page tables
> for the 0xb region - the only linux page tables for the kernel are for
> the vmalloc (0xd) and ioremap (0xe) regions.

I am building page tables off the bolted_dir, which does exist in 2.4.21
for the 0xb region.  But again, assuming I insert a bolted entry in HPT,
do I even need to worry about linux page tables as such?


>
> Why on earth do you want to do this?

Good question ;-).  A long long time ago, I posted on this list and
explained.  Since then, I found what appeared to be a solution, except
that it appears power4 breaks it.  I am building a tool that allows
dynamic splicing of code into a running kernel (see
http://www.paradyn.org/html/kerninst.html).  In order for this to work, I
need to be able to overwrite a single instruction with a jump to
spliced-in code.  The target of the jump needs to be within the range (26
bits).  Therefore, I have a choice of 0xbfff.. addresses with backward
jumps from 0xc region, or the 0xff.. addresses for absolute jumps.  I
chose 0xbff.., because I found already-working code, originally written
for the performance counter interface.  Am I making more sense now?

Thanks,
Igor


> On Mon, Sep 27, 2004 at 02:47:15PM -0500, Igor Grobman wrote:
> > I would like to be able to remap memory into 0xb space with 2.4.21
kernel.
> > I have code that works fine on power3 box, but fails miserably on my
dual
> > power4+ box.  I am using btmalloc() from pmc.c with a modified range.
> > Normal btmalloc() allocation works fine, but if I change the range to
> > start with, e.g. 0xb00001FFFFF00000 (instead of 0xb00..), the kernel
> > crashes when accessing the allocated page.
> >
> > For those of you unfamiliar with btmalloc() code, it finds a physical
page
> > using get_free_pages(), subtracts PAGE_OFFSET (i.e. 0xc00...) to form
a
> > physical address, then inserts the page into linux page tables, using
the
> > VSID calculated with get_kernel_vsid() and the physical address
> > calculated above.  It also inserts an HPTE into the hardware page
table.
> > It doesn't do anything with regards to allocating segments.  I
understand
> > the segments should be faulted in.  I looked at the code in head.S,
and it
> > appears that do_stab_bolted should be doing this.  Yet, I am missing
someth$
> > because the btmalloc() code does not in fact work for pages in the
range I
> > specified above.
> >
> > I am running this on 7029-6E3 (p615?) machine with two power4+
processors.
> > I am using the kernel from Suse's 2.4.21-215 source package.
> >
> > Any ideas and attempts to un-confuse me are welcome.




More information about the Linuxppc64-dev mailing list