summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhunt <hunt>2007-06-15 15:19:30 +0000
committerhunt <hunt>2007-06-15 15:19:30 +0000
commit7711e84449611959f6ee4c51ff396e71446d79eb (patch)
treee26b861a8ecb56503bace0d80c9dfb5c6d2693c7
parent4e5724ff0caa7e9b09c149ea69734585611b52b1 (diff)
downloadsystemtap-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/ChangeLog6
-rw-r--r--runtime/loc2c-runtime.h149
-rw-r--r--runtime/regs.c2
-rw-r--r--runtime/stack-arm.c2
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. */