Bug 12341 - deref()/store_deref() variations between arches
Summary: deref()/store_deref() variations between arches
Status: RESOLVED FIXED
Alias: None
Product: systemtap
Classification: Unclassified
Component: runtime (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Unassigned
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-12-22 20:54 UTC by David Smith
Modified: 2012-02-06 20:48 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description David Smith 2010-12-22 20:54:35 UTC
There is a different deref()/store_deref() macro in runtime/loc2c-runtime.h for each arch.

For i386/x86_64, deref() calls the kernel's __get_user_asm().  store_deref() calls the kernel's __put_user_asm().

For ia64, deref() calls the kernel's __get_user_size().  store_deref() calls the kernel's __put_user_size().

For powerpc, deref() calls __stp_get_user_asm(), which is custom powerpc assembly code (that looks almost identical to the kernel's __get_user_asm()).  store_deref() calls __stp_put_user_asm(), which is custom powerpc assembly code.

For s390, deref() calls __stp_get_user_asm(), which is custom s390 assembly.  store_deref() calls __stp_put_user_asm(), which is custom s390 assembly.

It might be possible for all arches to use the kernel's own routines, instead of having custom (powerpc/s390) assembly code.  The __get_user_size()/__put_user_size() routines might be the most attractive choice (as the ia64 uses), since they know how handle all the different size combinations.

(If __get_user_size()/__put_user_size() works for the i386, that could eliminate the need for the i386 special version of kread/kwrite that can handle 64-bit values.)
Comment 1 David Smith 2011-01-04 21:50:16 UTC
(In reply to comment #0)
> (If __get_user_size()/__put_user_size() works for the i386, that could
> eliminate the need for the i386 special version of kread/kwrite that can handle
> 64-bit values.)

Unfortunately, this idea won't work.  Looking at the i386 header files in kernels 2.6.9/2.6.18/2.6.36, none of the i386 __get_user_size() macros can handle 64-bit values.
Comment 2 David Smith 2011-01-06 20:58:39 UTC
(In reply to comment #0)
> For powerpc, deref() calls __stp_get_user_asm(), which is custom powerpc
> assembly code (that looks almost identical to the kernel's __get_user_asm()). 
> store_deref() calls __stp_put_user_asm(), which is custom powerpc assembly
> code.

For powerpc, I've discovered some history.

loc2c-runtime.h originally used the kernel's __get_user_asm() macros.

This changed on 20 Mar 2006 in the following commit:

<http://sources.redhat.com/git/gitweb.cgi?p=systemtap.git;a=commitdiff;h=15eeafe9465119eb443f59b332e24ecfeec10488>

To fix bug 2076 (ppc64 runtime is broken under kernel v2.6.15-RC5):

<http://sourceware.org/bugzilla/show_bug.cgi?id=2076>

which was caused by the "__get_user_asm" macro changing to taking 4 arguments (from 5).

There is (hopefully) a better way to fix that problem than duplicating __get_user_asm()/__put_user_asm().

Note that we just can't go back to calling __get_user_asm(), since in current kernels __get_user_asm2() is used on powerpc to get 64-bit values.  We'll need to call something a bit higher up.
Comment 3 David Smith 2011-03-07 18:37:23 UTC
Commit ece7abd fixes this problem for powerpc.
Comment 4 David Smith 2011-03-07 19:22:02 UTC
(In reply to comment #3)
> Commit ece7abd fixes this problem for powerpc.

This commit was tested on the following kernels with no testsuite regressions:

2.6.9-89.EL
2.6.18-238.el5
2.6.32-118.el6.ppc64
Comment 5 Mark Wielaard 2011-12-10 20:08:37 UTC
The deref/store_deref functions were split into user and kernel versions to accommodate the s390x setup which uses different address spaces for user and kernel addresses.

commit f1e8e7e0a601d1378262ba69890ce3e7d4519ab5
Author: Mark Wielaard <mjw@redhat.com>
Date:   Fri Nov 25 15:11:00 2011 +0100

    loc2c-runtime.h: Split deref and store_deref into user and kernel version.
    
    All references to deref have been updated to use either the user or kernel
    variant where appropriate, but kderef is currently still defined as uderef,
    and store_kderef as store_uderef. Which should work fine for all arches
    except s390.

There are still separate variants for the different architectures.
Comment 6 David Smith 2012-02-06 20:48:08 UTC
Since all arches (except for arm) now use the kernel's own routines instead of custom assembly code, let's close this one.