]> sourceware.org Git - systemtap.git/commitdiff
2005-08-10 Roland McGrath <roland@redhat.com>
authorroland <roland>
Thu, 11 Aug 2005 04:26:41 +0000 (04:26 +0000)
committerroland <roland>
Thu, 11 Aug 2005 04:26:41 +0000 (04:26 +0000)
* loc2c-runtime.h (store_bitfield): Fix argument use.
(store_deref): New macro (three flavors).

runtime/loc2c-runtime.h

index 6385ec8318d73f0976412499989fe9d1fe89020e..ca26aa3b74b9f007a6993b308027643b794fd157 100644 (file)
@@ -18,7 +18,7 @@
   target = (target                                                           \
            &~ ((((__typeof (base)) 1 << (nbits)) - 1)                        \
                << (sizeof (base) * 8 - (higherbits) - (nbits)))              \
-           | ((__typeof (base)) (value)                                      \
+           | ((__typeof (base)) (base)                                       \
               << (sizeof (base) * 8 - (higherbits) - (nbits))))
 
 
@@ -26,6 +26,8 @@
 #include <asm/uaccess.h>
 
 #define fetch_register(regno) ((intptr_t) c->regs->dwarf_register_##regno)
+#define store_register(regno, value) \
+  (c->regs->dwarf_register_##regno = (value))
 
 #if defined __i386__
 
@@ -61,6 +63,7 @@
 
 #undef fetch_register
 #define fetch_register(regno) ((intptr_t) c->regs->gpr[regno])
+#define store_register(regno) (c->regs->gpr[regno] = (value))
 
 #endif
 
     _v;                                                                              \
   })
 
+#define store_deref(size, addr, value)                                       \
+  ({                                                                         \
+    int _bad = 0;                                                            \
+    switch (size)                                                            \
+      {                                                                              \
+      case 1: __put_user_asm(((u8)(value),addr,_bad,"b","b","iq",1); break;   \
+      case 2: __put_user_asm(((u16)(value),addr,_bad,"w","w","ir",1); break;  \
+      case 4: __put_user_asm(((u32)(value),addr,_bad,"l","k","ir",1); break;  \
+      case 8: __put_user_asm(((u64)(value),addr,_bad,"q","","ir",1); break;   \
+      default: __put_user_bad();                                             \
+      }                                                                              \
+    if (_bad)                                                                \
+      goto deref_fault;                                                              \
+  })
+
 #elif defined __powerpc64__
 
 #define deref(size, addr)                                                    \
     _v;                                                                              \
   })
 
+#define store_deref(size, addr, value)                                       \
+  ({                                                                         \
+    int _bad = 0;                                                            \
+    switch (size)                                                            \
+      {                                                                              \
+      case 1: __put_user_asm(((u8)(value),addr,_bad,"stb",1); break;                 \
+      case 2: __put_user_asm(((u16)(value),addr,_bad,"sth",1); break;                \
+      case 4: __put_user_asm(((u32)(value),addr,_bad,"stw",1); break;                \
+      case 8: __put_user_asm(((u64)(value),addr,_bad,"std",1); break;        \
+      default: __put_user_bad();                                             \
+      }                                                                              \
+    if (_bad)                                                                \
+      goto deref_fault;                                                              \
+  })
+
 #elif defined __powerpc__
 
 #define deref(size, addr)                                                    \
     _v;                                                                              \
   })
 
+#define store_deref(size, addr, value)                                       \
+  ({                                                                         \
+    int _bad = 0;                                                            \
+    switch (size)                                                            \
+      {                                                                              \
+      case 1: __put_user_asm(((u8)(value),addr,_bad,"stb"); break;           \
+      case 2: __put_user_asm(((u16)(value),addr,_bad,"sth"); break;          \
+      case 4: __put_user_asm(((u32)(value),addr,_bad,"stw"); break;          \
+      case 8: __put_user_asm2(((u64)(value),addr,_bad); break;               \
+      default: __put_user_bad();                                             \
+      }                                                                              \
+    if (_bad)                                                                \
+      goto deref_fault;                                                              \
+  })
+
 #endif
This page took 0.029799 seconds and 5 git commands to generate.