summaryrefslogtreecommitdiffstats
path: root/runtime/uprobes
diff options
context:
space:
mode:
authorJim Keniston <jkenisto@us.ibm.com>2008-09-12 17:32:12 -0700
committerJim Keniston <jkenisto@us.ibm.com>2008-09-12 17:32:12 -0700
commitc79cd4b878c3d4e66fd9203107b078734cfbe0a1 (patch)
treeba8eec348409a5212d21b8a33d00ad5d58cb2c43 /runtime/uprobes
parent06764a063364bfd97d168dd3d7d2621b818b3437 (diff)
downloadsystemtap-steved-c79cd4b878c3d4e66fd9203107b078734cfbe0a1.tar.gz
systemtap-steved-c79cd4b878c3d4e66fd9203107b078734cfbe0a1.tar.xz
systemtap-steved-c79cd4b878c3d4e66fd9203107b078734cfbe0a1.zip
Per bz6879, allow gs: and fs: instruction prefixes.
Diffstat (limited to 'runtime/uprobes')
-rw-r--r--runtime/uprobes/uprobes_i386.c5
-rw-r--r--runtime/uprobes/uprobes_x86.c11
-rw-r--r--runtime/uprobes/uprobes_x86_64.c11
3 files changed, 15 insertions, 12 deletions
diff --git a/runtime/uprobes/uprobes_i386.c b/runtime/uprobes/uprobes_i386.c
index 5fe7d781..51b06f79 100644
--- a/runtime/uprobes/uprobes_i386.c
+++ b/runtime/uprobes/uprobes_i386.c
@@ -41,7 +41,7 @@
W(0x30, 1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1), /* 30 */
W(0x40, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 40 */
W(0x50, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 50 */
- W(0x60, 1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0)| /* 60 */
+ W(0x60, 1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,0)| /* 60 */
W(0x70, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 70 */
W(0x80, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 80 */
W(0x90, 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1), /* 90 */
@@ -111,7 +111,8 @@
*
* others -- Do we need to support these?
* 07, 17, 1f - pop es, pop ss, pop ds
- * 26, 2e, 36, 3e, 64, 65 - es:, cs:, ss:, ds:, fs:, gs: segment prefixes
+ * 26, 2e, 36, 3e, - es:, cs:, ss:, ds: segment prefixes --
+ * but 64 and 65 (fs: and gs:) seems to be used, so we support them.
* 67 - addr16 prefix
* 9b - wait/fwait
* ce - into
diff --git a/runtime/uprobes/uprobes_x86.c b/runtime/uprobes/uprobes_x86.c
index ebb10d4e..05d2a978 100644
--- a/runtime/uprobes/uprobes_x86.c
+++ b/runtime/uprobes/uprobes_x86.c
@@ -43,7 +43,7 @@ static const unsigned long long good_insns_64[256 / 64] = {
W(0x30, 1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0), /* 30 */
W(0x40, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)| /* 40 */
W(0x50, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 50 */
- W(0x60, 0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0)| /* 60 */
+ W(0x60, 0,0,0,1,1,1,0,0,1,1,1,1,0,0,0,0)| /* 60 */
W(0x70, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 70 */
W(0x80, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 80 */
W(0x90, 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1)| /* 90 */
@@ -68,7 +68,7 @@ static const unsigned long long good_insns_32[256 / 64] = {
W(0x30, 1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1), /* 30 */
W(0x40, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 40 */
W(0x50, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 50 */
- W(0x60, 1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0)| /* 60 */
+ W(0x60, 1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,0)| /* 60 */
W(0x70, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 70 */
W(0x80, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 80 */
W(0x90, 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1)| /* 90 */
@@ -138,7 +138,8 @@ static const unsigned long long good_2byte_insns[256 / 64] = {
* others -- Do we need to support these?
* 0f - (floating-point?) prefetch instructions
* 07, 17, 1f - pop es, pop ss, pop ds
- * 26, 2e, 36, 3e, 64, 65 - es:, cs:, ss:, ds:, fs:, gs: segment prefixes
+ * 26, 2e, 36, 3e - es:, cs:, ss:, ds: segment prefixes --
+ * but 64 and 65 (fs: and gs:) seems to be used, so we support them.
* 67 - addr16 prefix
* 9b - wait/fwait
* ce - into
@@ -165,10 +166,10 @@ static inline int check_legacy_prefix(u8 byte)
case 0x2e:
case 0x36:
case 0x3e:
- case 0x64:
- case 0x65:
case 0xf0:
return -1;
+ case 0x64:
+ case 0x65:
case 0x66:
case 0x67:
case 0xf2:
diff --git a/runtime/uprobes/uprobes_x86_64.c b/runtime/uprobes/uprobes_x86_64.c
index 78969248..a681cab5 100644
--- a/runtime/uprobes/uprobes_x86_64.c
+++ b/runtime/uprobes/uprobes_x86_64.c
@@ -43,7 +43,7 @@ static const unsigned long good_insns_64[256 / 64] = {
W(0x30, 1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0), /* 30 */
W(0x40, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)| /* 40 */
W(0x50, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 50 */
- W(0x60, 0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,0)| /* 60 */
+ W(0x60, 0,0,0,1,1,1,0,0,1,1,1,1,0,0,0,0)| /* 60 */
W(0x70, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 70 */
W(0x80, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 80 */
W(0x90, 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1)| /* 90 */
@@ -68,7 +68,7 @@ static const unsigned long good_insns_32[256 / 64] = {
W(0x30, 1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1), /* 30 */
W(0x40, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 40 */
W(0x50, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 50 */
- W(0x60, 1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0)| /* 60 */
+ W(0x60, 1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,0)| /* 60 */
W(0x70, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), /* 70 */
W(0x80, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)| /* 80 */
W(0x90, 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1)| /* 90 */
@@ -138,7 +138,8 @@ static const unsigned long good_2byte_insns[256 / 64] = {
* others -- Do we need to support these?
* 0f - (floating-point?) prefetch instructions
* 07, 17, 1f - pop es, pop ss, pop ds
- * 26, 2e, 36, 3e, 64, 65 - es:, cs:, ss:, ds:, fs:, gs: segment prefixes
+ * 26, 2e, 36, 3e - es:, cs:, ss:, ds: segment prefixes --
+ * but 64 and 65 (fs: and gs:) seems to be used, so we support them.
* 67 - addr16 prefix
* 9b - wait/fwait
* ce - into
@@ -165,10 +166,10 @@ static inline int check_legacy_prefix(u8 byte)
case 0x2e:
case 0x36:
case 0x3e:
- case 0x64:
- case 0x65:
case 0xf0:
return -1;
+ case 0x64:
+ case 0x65:
case 0x66:
case 0x67:
case 0xf2: