From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19253 invoked by alias); 2 Jun 2007 14:11:39 -0000 Received: (qmail 19246 invoked by uid 22791); 2 Jun 2007 14:11:38 -0000 X-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,DK_POLICY_SIGNSOME,TW_DR X-Spam-Check-By: sourceware.org Received: from mail119.messagelabs.com (HELO mail119.messagelabs.com) (216.82.241.179) by sourceware.org (qpsmtpd/0.31) with SMTP; Sat, 02 Jun 2007 14:11:35 +0000 X-VirusChecked: Checked X-Env-Sender: qbarnes@urbana.css.mot.com X-Msg-Ref: server-10.tower-119.messagelabs.com!1180793493!19535041!1 X-StarScan-Version: 5.5.12.11; banners=-,-,- X-Originating-IP: [129.188.136.8] Received: (qmail 7386 invoked from network); 2 Jun 2007 14:11:33 -0000 Received: from motgate8.mot.com (HELO motgate8.mot.com) (129.188.136.8) by server-10.tower-119.messagelabs.com with SMTP; 2 Jun 2007 14:11:33 -0000 Received: from il06exr03.mot.com (il06exr03.mot.com [129.188.137.133]) by motgate8.mot.com (8.12.11/Motorola) with ESMTP id l52EBX02005073; Sat, 2 Jun 2007 07:11:33 -0700 (MST) Received: from il06vts04.mot.com (il06vts04.mot.com [129.188.137.144]) by il06exr03.mot.com (8.13.1/Vontu) with SMTP id l52EBWmF021786; Sat, 2 Jun 2007 09:11:32 -0500 (CDT) Received: from udc.urbana.css.mot.com (udc.urbana.css.mot.com [10.12.0.51]) by il06exr03.mot.com (8.13.1/8.13.0) with ESMTP id l52EBWEI021776; Sat, 2 Jun 2007 09:11:32 -0500 (CDT) Received: from nova.urbana.css.mot.com (nova.urbana.css.mot.com [192.88.153.60]) by udc.urbana.css.mot.com (8.13.8+Sun/8.13.8) with ESMTP id l52EBWl9006570; Sat, 2 Jun 2007 09:11:32 -0500 (CDT) Received: (from qbarnes@localhost) by nova.urbana.css.mot.com (8.13.8+Sun/8.13.7/Submit) id l52EBVbw014882; Sat, 2 Jun 2007 09:11:31 -0500 (CDT) Date: Sat, 02 Jun 2007 14:11:00 -0000 From: Quentin Barnes To: Roland McGrath Cc: systemtap@sources.redhat.com Subject: Re: systemtap ARM port status Message-ID: <20070602141131.GA14872@urbana.css.mot.com> References: <20070601211153.GG5831@urbana.css.mot.com> <20070601214751.798DF1F8512@magilla.localdomain> <20070602032937.GA12821@urbana.css.mot.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline In-Reply-To: <20070602032937.GA12821@urbana.css.mot.com> User-Agent: Mutt/1.4.2.1i X-POPI: This message is Motorola General Business Information (MGBI). X-Organization: Motorola Cellular Subscriber Group, Urbana Design Center X-Phone: (217) 384-8726 X-Vontu: Pass X-IsSubscribed: yes Mailing-List: contact systemtap-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: systemtap-owner@sourceware.org X-SW-Source: 2007-q2/txt/msg00446.txt.bz2 On Fri, Jun 01, 2007 at 10:29:37PM -0500, Quentin Barnes wrote: [...] >So I think all I have to do to properly port the deref() macro >for ARM is to copy the ARM's __{get|put}_user_asm_{byte|half|word}() >macros to loc2c-runtime.h, rename them to the _stp_* variety, and >have them use the "ldrb", "strb", "ldr", and "str" instructions. Overnight testing revealed that works. Attached is the ARM version that seems to do the right thing: Index: loc2c-runtime.h =================================================================== --- loc2c-runtime.h (.../vendor/usr/src/systemtap-20070526/runtime/loc2c-runtime.h) (revision 206) +++ loc2c-runtime.h (.../branches/kprobes/usr/src/systemtap-20070526/runtime/loc2c-runtime.h) (revision 206) @@ -112,6 +112,13 @@ #define fetch_register(regno) ((intptr_t) c->regs->gpr[regno]) #define store_register(regno) (c->regs->gpr[regno] = (value)) +#elif defined (__arm__) + +#undef fetch_register +#undef store_register +#define fetch_register(regno) ((long) c->regs->uregs[regno]) +#define store_register(regno) (c->regs->uregs[regno] = (value)) + #elif defined (__s390__) || defined (__s390x__) #undef fetch_register #undef store_register @@ -294,6 +301,141 @@ goto deref_fault; \ }) +#elif defined (__arm__) + +#define __stp_get_user_asm_byte(x,addr,err) \ + __asm__ __volatile__( \ + "1: ldrb %1,[%2],#0\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + " .align 2\n" \ + "3: mov %0, %3\n" \ + " mov %1, #0\n" \ + " b 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 3\n" \ + " .long 1b, 3b\n" \ + " .previous" \ + : "+r" (err), "=&r" (x) \ + : "r" (addr), "i" (-EFAULT) \ + : "cc") + +#ifndef __ARMEB__ +#define __stp_get_user_asm_half(x,__gu_addr,err) \ +({ \ + unsigned long __b1, __b2; \ + __stp_get_user_asm_byte(__b1, __gu_addr, err); \ + __stp_get_user_asm_byte(__b2, __gu_addr + 1, err); \ + (x) = __b1 | (__b2 << 8); \ +}) +#else +#define __stp_get_user_asm_half(x,__gu_addr,err) \ +({ \ + unsigned long __b1, __b2; \ + __stp_get_user_asm_byte(__b1, __gu_addr, err); \ + __stp_get_user_asm_byte(__b2, __gu_addr + 1, err); \ + (x) = (__b1 << 8) | __b2; \ +}) +#endif + +#define __stp_get_user_asm_word(x,addr,err) \ + __asm__ __volatile__( \ + "1: ldr %1,[%2],#0\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + " .align 2\n" \ + "3: mov %0, %3\n" \ + " mov %1, #0\n" \ + " b 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 3\n" \ + " .long 1b, 3b\n" \ + " .previous" \ + : "+r" (err), "=&r" (x) \ + : "r" (addr), "i" (-EFAULT) \ + : "cc") + +#define __stp_put_user_asm_byte(x,__pu_addr,err) \ + __asm__ __volatile__( \ + "1: strb %1,[%2],#0\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + " .align 2\n" \ + "3: mov %0, %3\n" \ + " b 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 3\n" \ + " .long 1b, 3b\n" \ + " .previous" \ + : "+r" (err) \ + : "r" (x), "r" (__pu_addr), "i" (-EFAULT) \ + : "cc") + +#ifndef __ARMEB__ +#define __stp_put_user_asm_half(x,__pu_addr,err) \ +({ \ + unsigned long __temp = (unsigned long)(x); \ + __stp_put_user_asm_byte(__temp, __pu_addr, err); \ + __stp_put_user_asm_byte(__temp >> 8, __pu_addr + 1, err); \ +}) +#else +#define __stp_put_user_asm_half(x,__pu_addr,err) \ +({ \ + unsigned long __temp = (unsigned long)(x); \ + __stp_put_user_asm_byte(__temp >> 8, __pu_addr, err); \ + __stp_put_user_asm_byte(__temp, __pu_addr + 1, err); \ +}) +#endif + +#define __stp_put_user_asm_word(x,__pu_addr,err) \ + __asm__ __volatile__( \ + "1: str %1,[%2],#0\n" \ + "2:\n" \ + " .section .fixup,\"ax\"\n" \ + " .align 2\n" \ + "3: mov %0, %3\n" \ + " b 2b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 3\n" \ + " .long 1b, 3b\n" \ + " .previous" \ + : "+r" (err) \ + : "r" (x), "r" (__pu_addr), "i" (-EFAULT) \ + : "cc") + +#define deref(size, addr) \ + ({ \ + int _bad = 0; \ + intptr_t _v=0; \ + switch (size){ \ + case 1: __stp_get_user_asm_byte(_v, addr, _bad); break; \ + case 2: __stp_get_user_asm_half(_v, addr, _bad); break; \ + case 4: __stp_get_user_asm_word(_v, addr, _bad); break; \ + default: __get_user_bad(); break; \ + } \ + if (_bad) \ + goto deref_fault; \ + _v; \ + }) + +#define store_deref(size, addr, value) \ + ({ \ + int _bad=0; \ + switch (size){ \ + case 1: __stp_put_user_asm_byte(value, addr, _bad); break; \ + case 2: __stp_put_user_asm_half(value, addr, _bad); break; \ + case 4: __stp_put_user_asm_word(value, addr, _bad); break; \ + case 8: __stp_put_user_asm_dword(value, addr, _bad); break; \ + default: __put_user_bad(); break; \ + } \ + if (_bad) \ + goto deref_fault; \ + }) + #elif defined (__s390__) || defined (__s390x__) #ifndef EX_TABLE