diff options
author | hunt <hunt> | 2007-06-15 15:19:30 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-06-15 15:19:30 +0000 |
commit | 7711e84449611959f6ee4c51ff396e71446d79eb (patch) | |
tree | e26b861a8ecb56503bace0d80c9dfb5c6d2693c7 | |
parent | 4e5724ff0caa7e9b09c149ea69734585611b52b1 (diff) | |
download | systemtap-steved-7711e84449611959f6ee4c51ff396e71446d79eb.tar.gz systemtap-steved-7711e84449611959f6ee4c51ff396e71446d79eb.tar.xz systemtap-steved-7711e84449611959f6ee4c51ff396e71446d79eb.zip |
2007-06-15 Martin Hunt <hunt@redhat.com>
From Quentin Barnes.
* loc2c-runtime.h: Latest arm marcos.
* stack-arm.c (__stp_stack_print): Add a cast.
* regs.c (_stp_ret_addr): Define for arm.
-rw-r--r-- | runtime/ChangeLog | 6 | ||||
-rw-r--r-- | runtime/loc2c-runtime.h | 149 | ||||
-rw-r--r-- | runtime/regs.c | 2 | ||||
-rw-r--r-- | runtime/stack-arm.c | 2 |
4 files changed, 151 insertions, 8 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog index f92aa0a1..3cdc94fb 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,3 +1,9 @@ +2007-06-15 Martin Hunt <hunt@redhat.com> + From Quentin Barnes. + * loc2c-runtime.h: Latest arm marcos. + * stack-arm.c (__stp_stack_print): Add a cast. + * regs.c (_stp_ret_addr): Define for arm. + 2007-06-07 Martin Hunt <hunt@redhat.com> PR 4075 fix from Ananth Mavinakayanahalli * string.h (_stp_get_user): Define. diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index df180949..02d4df17 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -1,6 +1,7 @@ /* target operations * Copyright (C) 2005 Red Hat Inc. * Copyright (C) 2005, 2006, 2007 Intel Corporation. + * Copyright (C) 2007 Quentin Barnes. * * This file is part of systemtap, and is free software. You can * redistribute it and/or modify it under the terms of the GNU General @@ -303,14 +304,148 @@ #elif defined (__arm__) +/* Macros for ARM lifted from 2.6.21.1's linux/include/asm-arm/uaccess.h + * and slightly altered. */ + +#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") + +#ifndef __ARMEB__ +#define __reg_oper0 "%R2" +#define __reg_oper1 "%Q2" +#else +#define __reg_oper0 "%Q2" +#define __reg_oper1 "%R2" +#endif + +#define __stp_put_user_asm_dword(x,__pu_addr,err) \ + __asm__ __volatile__( \ + "1: str " __reg_oper1 ", [%1], #4\n" \ + "2: str " __reg_oper0 ", [%1], #0\n" \ + "3:\n" \ + " .section .fixup,\"ax\"\n" \ + " .align 2\n" \ + "4: mov %0, %3\n" \ + " b 3b\n" \ + " .previous\n" \ + " .section __ex_table,\"a\"\n" \ + " .align 3\n" \ + " .long 1b, 4b\n" \ + " .long 2b, 4b\n" \ + " .previous" \ + : "+r" (err), "+r" (__pu_addr) \ + : "r" (x), "i" (-EFAULT) \ + : "cc") + #define deref(size, addr) \ ({ \ int _bad = 0; \ intptr_t _v=0; \ switch (size){ \ - case 1: __get_user_asm_byte(_v, addr, _bad); break; \ - case 2: __get_user_asm_half(_v, addr, _bad); break; \ - case 4: __get_user_asm_word(_v, addr, _bad); break; \ + 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) \ @@ -322,10 +457,10 @@ ({ \ int _bad=0; \ switch (size){ \ - case 1: __put_user_asm_byte(value, addr, _bad); break; \ - case 2: __put_user_asm_half(value, addr, _bad); break; \ - case 4: __put_user_asm_word(value, addr, _bad); break; \ - case 8: __put_user_asm_dword(value, addr, _bad); break; \ + 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) \ diff --git a/runtime/regs.c b/runtime/regs.c index d202c8aa..00130e99 100644 --- a/runtime/regs.c +++ b/runtime/regs.c @@ -47,6 +47,8 @@ unsigned long _stp_ret_addr (struct pt_regs *regs) return regs->b0; #elif defined (__s390__) || defined (__s390x__) return regs->gprs[14]; +#elif defined (__arm__) + return regs->ARM_r0; #else #error Unimplemented architecture #endif diff --git a/runtime/stack-arm.c b/runtime/stack-arm.c index 9d3307ec..0c8ce450 100644 --- a/runtime/stack-arm.c +++ b/runtime/stack-arm.c @@ -59,7 +59,7 @@ static void __stp_stack_print (struct pt_regs *regs, int verbose, int levels) _stp_symbol_print((unsigned long)pc); _stp_print_char('\n'); } else { - _stp_printf("%08lx ", pc); + _stp_printf("%08lx ", (unsigned long)pc); } /* Sanity check the next_fp. */ |