diff options
author | fche <fche> | 2006-12-18 11:31:26 +0000 |
---|---|---|
committer | fche <fche> | 2006-12-18 11:31:26 +0000 |
commit | 6d7aee59de0264b0bcaabd85498b8bb7f977cebe (patch) | |
tree | 6d851d241155606476e8550992c01dbf0f06ec17 | |
parent | ee6dda6f1fc2a8f952b69153fe7c1a6d0c73a7a3 (diff) | |
download | systemtap-steved-6d7aee59de0264b0bcaabd85498b8bb7f977cebe.tar.gz systemtap-steved-6d7aee59de0264b0bcaabd85498b8bb7f977cebe.tar.xz systemtap-steved-6d7aee59de0264b0bcaabd85498b8bb7f977cebe.zip |
2006-12-18 Frank Ch. Eigler <fche@elastic.org>
PR 3079
* loc2c-runtime.h (deref, store_deref): Fork x86 and x86-64
variants. Remove dysfunctional 64-bit ops from x86.
2006-12-18 Frank Ch. Eigler <fche@elastic.org>
* vfs.stp (ppos_pos): Protect contents with deref(), though
this blocks operation on i686 due to bug #3079.
-rw-r--r-- | runtime/ChangeLog | 6 | ||||
-rw-r--r-- | runtime/loc2c-runtime.h | 36 | ||||
-rw-r--r-- | tapset/ChangeLog | 5 | ||||
-rw-r--r-- | tapset/vfs.stp | 7 |
4 files changed, 52 insertions, 2 deletions
diff --git a/runtime/ChangeLog b/runtime/ChangeLog index 04cad62c..3807f8ea 100644 --- a/runtime/ChangeLog +++ b/runtime/ChangeLog @@ -1,3 +1,9 @@ +2006-12-18 Frank Ch. Eigler <fche@elastic.org> + + PR 3079 + * loc2c-runtime.h (deref, store_deref): Fork x86 and x86-64 + variants. Remove dysfunctional 64-bit ops from x86. + 2006-12-15 Frank Ch. Eigler <fche@elastic.org> * print.c (_stp_print_flush): Add a likely() marker to the hot path. diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h index 493f0193..c51908a9 100644 --- a/runtime/loc2c-runtime.h +++ b/runtime/loc2c-runtime.h @@ -120,7 +120,41 @@ #endif -#if defined __i386__ || defined __x86_64__ +#if defined __i386__ + +#define deref(size, addr) \ + ({ \ + int _bad = 0; \ + u8 _b; u16 _w; u32 _l; \ + intptr_t _v; \ + switch (size) \ + { \ + case 1: __get_user_asm(_b,addr,_bad,"b","b","=q",1); _v = _b; break; \ + case 2: __get_user_asm(_w,addr,_bad,"w","w","=r",1); _v = _w; break; \ + case 4: __get_user_asm(_l,addr,_bad,"l","","=r",1); _v = _l; break; \ + default: _v = __get_user_bad(); \ + } \ + if (_bad) \ + goto deref_fault; \ + _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; \ + default: __put_user_bad(); \ + } \ + if (_bad) \ + goto deref_fault; \ + }) + + +#elif defined __x86_64__ #define deref(size, addr) \ ({ \ diff --git a/tapset/ChangeLog b/tapset/ChangeLog index ea287395..8ab95e7b 100644 --- a/tapset/ChangeLog +++ b/tapset/ChangeLog @@ -1,3 +1,8 @@ +2006-12-18 Frank Ch. Eigler <fche@elastic.org> + + * vfs.stp (ppos_pos): Protect contents with deref(), though + this blocks operation on i686 due to bug #3079. + 2006-12-13 Mike Mason <mmlnx@us.ibm.com> * scheduler.stp: fixed last line in scheduler.ctxswitch to diff --git a/tapset/vfs.stp b/tapset/vfs.stp index 16c51b17..b121d5b9 100644 --- a/tapset/vfs.stp +++ b/tapset/vfs.stp @@ -37,7 +37,12 @@ function __find_bdevname(dev, bdev) function ppos_pos:long (ppos:long) %{ /* pure */ loff_t *ppos = (loff_t *)(long)THIS->ppos; - THIS->__retvalue = (int64_t)*ppos; + /* XXX: but see bug #3079 */ + THIS->__retvalue = (int64_t) deref (sizeof(loff_t), ppos); + if (0) { +deref_fault: + CONTEXT->last_error = "pointer dereference fault"; + } %} function __page_ino:long (page:long) %{ /* pure */ |