diff options
author | roland <roland> | 2005-08-11 04:26:41 +0000 |
---|---|---|
committer | roland <roland> | 2005-08-11 04:26:41 +0000 |
commit | dcc6aa81cff7e6a07b90941bc29579e41d80365b (patch) | |
tree | 421b1bf3ec6cf5372ba63ab968283a8845bb3218 /runtime/loc2c-runtime.h | |
parent | 23038bd15115627068fd2c3931e2d36481fc8189 (diff) | |
download | systemtap-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.h | 50 |
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 |