[PATCH v6 5/7] ARM: kprobes: disallow probing stack consuming instructions

2014-10-22 Thread Wang Nan
This patch prohibit probing instructions for which the stack
requirement are unable to be determined statically. Some test cases
are found not work again after the modification, this patch also
removes them.

Signed-off-by: Wang Nan 
---
 arch/arm/kernel/kprobes-test-arm.c | 16 ++--
 arch/arm/kernel/kprobes.c  |  8 
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/arch/arm/kernel/kprobes-test-arm.c 
b/arch/arm/kernel/kprobes-test-arm.c
index 264c064..59f9b25 100644
--- a/arch/arm/kernel/kprobes-test-arm.c
+++ b/arch/arm/kernel/kprobes-test-arm.c
@@ -476,7 +476,8 @@ void kprobe_arm_test_cases(void)
TEST_GROUP("Extra load/store instructions")
 
TEST_RPR(  "strhr",0, VAL1,", [r",1, 48,", -r",2, 24,"]")
-   TEST_RPR(  "streqh  r",14,VAL2,", [r",13,0, ", r",12, 48,"]")
+   TEST_RPR(  "streqh  r",14,VAL2,", [r",11,0, ", r",12, 48,"]")
+   TEST_UNSUPPORTED(  "streqh  r14, [r13, r12]")
TEST_RPR(  "strhr",1, VAL1,", [r",2, 24,", r",3,  48,"]!")
TEST_RPR(  "strneh  r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
TEST_RPR(  "strhr",2, VAL1,", [r",3, 24,"], r",4, 48,"")
@@ -565,7 +566,8 @@ void kprobe_arm_test_cases(void)
 
 #if __LINUX_ARM_ARCH__ >= 5
TEST_RPR(  "strdr",0, VAL1,", [r",1, 48,", -r",2,24,"]")
-   TEST_RPR(  "strccd  r",8, VAL2,", [r",13,0, ", r",12,48,"]")
+   TEST_RPR(  "strccd  r",8, VAL2,", [r",11,0, ", r",12,48,"]")
+   TEST_UNSUPPORTED(  "strccd r8, [r13, r12]")
TEST_RPR(  "strdr",4, VAL1,", [r",2, 24,", r",3, 48,"]!")
TEST_RPR(  "strcsd  r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
TEST_RPR(  "strdr",2, VAL1,", [r",5, 24,"], r",4,48,"")
@@ -639,13 +641,15 @@ void kprobe_arm_test_cases(void)
TEST_RP( "str"byte" r",2, VAL1,", [r",3, 24,"], #48")   
\
TEST_RP( "str"byte" r",10,VAL2,", [r",9, 64,"], #-48")  
\
TEST_RPR("str"byte" r",0, VAL1,", [r",1, 48,", -r",2, 24,"]")   
\
-   TEST_RPR("str"byte" r",14,VAL2,", [r",13,0, ", r",12, 48,"]")   
\
+   TEST_RPR("str"byte" r",14,VAL2,", [r",11,0, ", r",12, 48,"]")   
\
+   TEST_UNSUPPORTED("str"byte" r14, [r13, r12]")   \
TEST_RPR("str"byte" r",1, VAL1,", [r",2, 24,", r",3,  48,"]!")  
\
TEST_RPR("str"byte" r",12,VAL2,", [r",11,48,", -r",10,24,"]!")  
\
TEST_RPR("str"byte" r",2, VAL1,", [r",3, 24,"], r",4, 48,"")
\
TEST_RPR("str"byte" r",10,VAL2,", [r",9, 48,"], -r",11,24,"")   
\
TEST_RPR("str"byte" r",0, VAL1,", [r",1, 24,", r",2,  32,", asl 
#1]")\
-   TEST_RPR("str"byte" r",14,VAL2,", [r",13,0, ", r",12, 32,", lsr 
#2]")\
+   TEST_RPR("str"byte" r",14,VAL2,", [r",11,0, ", r",12, 32,", lsr 
#2]")\
+   TEST_UNSUPPORTED("str"byte" r14, [r13, r12, lsr #2]")\
TEST_RPR("str"byte" r",1, VAL1,", [r",2, 24,", r",3,  32,", asr 
#3]!")\
TEST_RPR("str"byte" r",12,VAL2,", [r",11,24,", r",10, 4,", ror 
#31]!")\
TEST_P(  "ldr"byte" r0, [r",0,  24,", #-2]")
\
@@ -669,12 +673,12 @@ void kprobe_arm_test_cases(void)
 
LOAD_STORE("")
TEST_P(   "str  pc, [r",0,0,", #15*4]")
-   TEST_R(   "str  pc, [sp, r",2,15*4,"]")
+   TEST_UNSUPPORTED(   "strpc, [sp, r2]")
TEST_BF(  "ldr  pc, [sp, #15*4]")
TEST_BF_R("ldr  pc, [sp, r",2,15*4,"]")
 
TEST_P(   "str  sp, [r",0,0,", #13*4]")
-   TEST_R(   "str  sp, [sp, r",2,13*4,"]")
+   TEST_UNSUPPORTED(   "strsp, [sp, r2]")
TEST_BF(  "ldr  sp, [sp, #13*4]")
TEST_BF_R("ldr  sp, [sp, r",2,13*4,"]")
 
diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c
index 028159c..afbb3e5 100644
--- a/arch/arm/kernel/kprobes.c
+++ b/arch/arm/kernel/kprobes.c
@@ -111,6 +111,14 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
break;
}
 
+   /*
+* Unable to instrument insn like 'str r0, [sp, +/-r1]'.
+* __und_svc protects 64 bytes stack, so instrumenting insn
+* likes 'str r0, [sp, #-68]' should be prohibited.
+*/
+   if ((p->ainsn.stack_space < 0) || (p->ainsn.stack_space > 64))
+   return -EINVAL;
+
return 0;
 }
 
-- 
1.8.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v6 5/7] ARM: kprobes: disallow probing stack consuming instructions

2014-10-22 Thread Wang Nan
This patch prohibit probing instructions for which the stack
requirement are unable to be determined statically. Some test cases
are found not work again after the modification, this patch also
removes them.

Signed-off-by: Wang Nan wangn...@huawei.com
---
 arch/arm/kernel/kprobes-test-arm.c | 16 ++--
 arch/arm/kernel/kprobes.c  |  8 
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/arch/arm/kernel/kprobes-test-arm.c 
b/arch/arm/kernel/kprobes-test-arm.c
index 264c064..59f9b25 100644
--- a/arch/arm/kernel/kprobes-test-arm.c
+++ b/arch/arm/kernel/kprobes-test-arm.c
@@ -476,7 +476,8 @@ void kprobe_arm_test_cases(void)
TEST_GROUP(Extra load/store instructions)
 
TEST_RPR(  strhr,0, VAL1,, [r,1, 48,, -r,2, 24,])
-   TEST_RPR(  streqh  r,14,VAL2,, [r,13,0, , r,12, 48,])
+   TEST_RPR(  streqh  r,14,VAL2,, [r,11,0, , r,12, 48,])
+   TEST_UNSUPPORTED(  streqh  r14, [r13, r12])
TEST_RPR(  strhr,1, VAL1,, [r,2, 24,, r,3,  48,]!)
TEST_RPR(  strneh  r,12,VAL2,, [r,11,48,, -r,10,24,]!)
TEST_RPR(  strhr,2, VAL1,, [r,3, 24,], r,4, 48,)
@@ -565,7 +566,8 @@ void kprobe_arm_test_cases(void)
 
 #if __LINUX_ARM_ARCH__ = 5
TEST_RPR(  strdr,0, VAL1,, [r,1, 48,, -r,2,24,])
-   TEST_RPR(  strccd  r,8, VAL2,, [r,13,0, , r,12,48,])
+   TEST_RPR(  strccd  r,8, VAL2,, [r,11,0, , r,12,48,])
+   TEST_UNSUPPORTED(  strccd r8, [r13, r12])
TEST_RPR(  strdr,4, VAL1,, [r,2, 24,, r,3, 48,]!)
TEST_RPR(  strcsd  r,12,VAL2,, [r,11,48,, -r,10,24,]!)
TEST_RPR(  strdr,2, VAL1,, [r,5, 24,], r,4,48,)
@@ -639,13 +641,15 @@ void kprobe_arm_test_cases(void)
TEST_RP( strbyte r,2, VAL1,, [r,3, 24,], #48)   
\
TEST_RP( strbyte r,10,VAL2,, [r,9, 64,], #-48)  
\
TEST_RPR(strbyte r,0, VAL1,, [r,1, 48,, -r,2, 24,])   
\
-   TEST_RPR(strbyte r,14,VAL2,, [r,13,0, , r,12, 48,])   
\
+   TEST_RPR(strbyte r,14,VAL2,, [r,11,0, , r,12, 48,])   
\
+   TEST_UNSUPPORTED(strbyte r14, [r13, r12])   \
TEST_RPR(strbyte r,1, VAL1,, [r,2, 24,, r,3,  48,]!)  
\
TEST_RPR(strbyte r,12,VAL2,, [r,11,48,, -r,10,24,]!)  
\
TEST_RPR(strbyte r,2, VAL1,, [r,3, 24,], r,4, 48,)
\
TEST_RPR(strbyte r,10,VAL2,, [r,9, 48,], -r,11,24,)   
\
TEST_RPR(strbyte r,0, VAL1,, [r,1, 24,, r,2,  32,, asl 
#1])\
-   TEST_RPR(strbyte r,14,VAL2,, [r,13,0, , r,12, 32,, lsr 
#2])\
+   TEST_RPR(strbyte r,14,VAL2,, [r,11,0, , r,12, 32,, lsr 
#2])\
+   TEST_UNSUPPORTED(strbyte r14, [r13, r12, lsr #2])\
TEST_RPR(strbyte r,1, VAL1,, [r,2, 24,, r,3,  32,, asr 
#3]!)\
TEST_RPR(strbyte r,12,VAL2,, [r,11,24,, r,10, 4,, ror 
#31]!)\
TEST_P(  ldrbyte r0, [r,0,  24,, #-2])
\
@@ -669,12 +673,12 @@ void kprobe_arm_test_cases(void)
 
LOAD_STORE()
TEST_P(   str  pc, [r,0,0,, #15*4])
-   TEST_R(   str  pc, [sp, r,2,15*4,])
+   TEST_UNSUPPORTED(   strpc, [sp, r2])
TEST_BF(  ldr  pc, [sp, #15*4])
TEST_BF_R(ldr  pc, [sp, r,2,15*4,])
 
TEST_P(   str  sp, [r,0,0,, #13*4])
-   TEST_R(   str  sp, [sp, r,2,13*4,])
+   TEST_UNSUPPORTED(   strsp, [sp, r2])
TEST_BF(  ldr  sp, [sp, #13*4])
TEST_BF_R(ldr  sp, [sp, r,2,13*4,])
 
diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c
index 028159c..afbb3e5 100644
--- a/arch/arm/kernel/kprobes.c
+++ b/arch/arm/kernel/kprobes.c
@@ -111,6 +111,14 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
break;
}
 
+   /*
+* Unable to instrument insn like 'str r0, [sp, +/-r1]'.
+* __und_svc protects 64 bytes stack, so instrumenting insn
+* likes 'str r0, [sp, #-68]' should be prohibited.
+*/
+   if ((p-ainsn.stack_space  0) || (p-ainsn.stack_space  64))
+   return -EINVAL;
+
return 0;
 }
 
-- 
1.8.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/