summaryrefslogtreecommitdiffstats
path: root/runtime/loc2c-runtime.h
diff options
context:
space:
mode:
authorroland <roland>2005-08-11 04:26:41 +0000
committerroland <roland>2005-08-11 04:26:41 +0000
commitdcc6aa81cff7e6a07b90941bc29579e41d80365b (patch)
tree421b1bf3ec6cf5372ba63ab968283a8845bb3218 /runtime/loc2c-runtime.h
parent23038bd15115627068fd2c3931e2d36481fc8189 (diff)
downloadsystemtap-steved-dcc6aa81cff7e6a07b90941bc29579e41d80365b.tar.gz
systemtap-steved-dcc6aa81cff7e6a07b90941bc29579e41d80365b.tar.xz
systemtap-steved-dcc6aa81cff7e6a07b90941bc29579e41d80365b.zip
2005-08-10 Roland McGrath <roland@redhat.com>
* loc2c-runtime.h (store_bitfield): Fix argument use. (store_deref): New macro (three flavors).
Diffstat (limited to 'runtime/loc2c-runtime.h')
-rw-r--r--runtime/loc2c-runtime.h50
1 files changed, 49 insertions, 1 deletions
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h
index 6385ec83..ca26aa3b 100644
--- a/runtime/loc2c-runtime.h
+++ b/runtime/loc2c-runtime.h
@@ -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
@@ -84,6 +87,21 @@
_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) \
@@ -103,6 +121,21 @@
_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) \
@@ -122,4 +155,19 @@
_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