@@ -22,14 +22,18 @@
#define div_factor 3
+struct dummy {
+ char dummy_array[MAX_STACK_SIZE * 2];
+};
+
static u32 rand1, preh_val, posth_val, jph_val;
static int errors, handler_errors, num_tests;
-static u32 (*target)(u32 value);
+static u32 (*target)(u32 value, struct dummy d);
static u32 (*target2)(u32 value);
-static noinline u32 kprobe_target(u32 value)
+static noinline u32 kprobe_target(u32 value, struct dummy d)
{
- return (value / div_factor);
+ return (value / div_factor - d.dummy_array[0] + d.dummy_array[1]);
}
static int kp_pre_handler(struct kprobe *p, struct pt_regs *regs)
@@ -54,9 +58,11 @@ static struct kprobe kp = {
.post_handler = kp_post_handler
};
-static int test_kprobe(void)
+static int noinline test_kprobe(void)
{
int ret;
+ static struct dummy dummy;
+ memset(&dummy, 10, sizeof(dummy));
ret = register_kprobe(&kp);
if (ret < 0) {
@@ -64,7 +70,8 @@ static int test_kprobe(void)
return ret;
}
- ret = target(rand1);
+ ret = target(rand1, dummy);
+ memset(&dummy, 10, sizeof(dummy));
unregister_kprobe(&kp);
if (preh_val == 0) {
@@ -111,6 +118,8 @@ static int test_kprobes(void)
{
int ret;
struct kprobe *kps[2] = {&kp, &kp2};
+ struct dummy dummy;
+ memset(&dummy, 10, sizeof(dummy));
/* addr and flags should be cleard for reusing kprobe. */
kp.addr = NULL;
@@ -123,7 +132,7 @@ static int test_kprobes(void)
preh_val = 0;
posth_val = 0;
- ret = target(rand1);
+ ret = target(rand1, dummy);
if (preh_val == 0) {
pr_err("kprobe pre_handler not called\n");
@@ -154,7 +163,7 @@ static int test_kprobes(void)
}
-static u32 j_kprobe_target(u32 value)
+static u32 j_kprobe_target(u32 value, struct dummy d)
{
if (value != rand1) {
handler_errors++;
@@ -174,6 +183,8 @@ static struct jprobe jp = {
static int test_jprobe(void)
{
int ret;
+ struct dummy dummy;
+ memset(&dummy, 10, sizeof(dummy));
ret = register_jprobe(&jp);
if (ret < 0) {
@@ -181,7 +192,7 @@ static int test_jprobe(void)
return ret;
}
- ret = target(rand1);
+ ret = target(rand1, dummy);
unregister_jprobe(&jp);
if (jph_val == 0) {
pr_err("jprobe handler not called\n");
@@ -200,6 +211,8 @@ static int test_jprobes(void)
{
int ret;
struct jprobe *jps[2] = {&jp, &jp2};
+ struct dummy dummy;
+ memset(&dummy, 10, sizeof(dummy));
/* addr and flags should be cleard for reusing kprobe. */
jp.kp.addr = NULL;
@@ -211,7 +224,7 @@ static int test_jprobes(void)
}
jph_val = 0;
- ret = target(rand1);
+ ret = target(rand1, dummy);
if (jph_val == 0) {
pr_err("jprobe handler not called\n");
handler_errors++;
@@ -262,6 +275,8 @@ static struct kretprobe rp = {
static int test_kretprobe(void)
{
int ret;
+ struct dummy dummy;
+ memset(&dummy, 10, sizeof(dummy));
ret = register_kretprobe(&rp);
if (ret < 0) {
@@ -269,7 +284,7 @@ static int test_kretprobe(void)
return ret;
}
- ret = target(rand1);
+ ret = target(rand1, dummy);
unregister_kretprobe(&rp);
if (krph_val != rand1) {
pr_err("kretprobe handler not called\n");
@@ -306,6 +321,8 @@ static int test_kretprobes(void)
{
int ret;
struct kretprobe *rps[2] = {&rp, &rp2};
+ struct dummy dummy;
+ memset(&dummy, 10, sizeof(dummy));
/* addr and flags should be cleard for reusing kprobe. */
rp.kp.addr = NULL;
@@ -317,7 +334,7 @@ static int test_kretprobes(void)
}
krph_val = 0;
- ret = target(rand1);
+ ret = target(rand1, dummy);
if (krph_val != rand1) {
pr_err("kretprobe handler not called\n");
handler_errors++;