summaryrefslogtreecommitdiff
path: root/writer
diff options
context:
space:
mode:
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>2013-07-23 18:50:20 +0400
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>2013-07-23 18:50:20 +0400
commitf43fd7639eaedbd8059c9896b1de3ed9c83b69b8 (patch)
tree7c3d4d207ac3bbabe2c0eb4e6f2c85afb737ebee /writer
parent49b140726ccfad54fac4b3a571e5be2843e9b53d (diff)
downloadswap-modules-f43fd7639eaedbd8059c9896b1de3ed9c83b69b8.tar.gz
swap-modules-f43fd7639eaedbd8059c9896b1de3ed9c83b69b8.tar.bz2
swap-modules-f43fd7639eaedbd8059c9896b1de3ed9c83b69b8.zip
[FIX] get_args() for x86
Diffstat (limited to 'writer')
-rw-r--r--writer/kernel_operations.c74
-rw-r--r--writer/kernel_operations.h12
2 files changed, 44 insertions, 42 deletions
diff --git a/writer/kernel_operations.c b/writer/kernel_operations.c
index 59ce5993..76b1ecac 100644
--- a/writer/kernel_operations.c
+++ b/writer/kernel_operations.c
@@ -23,64 +23,76 @@
*
*/
-#include "kernel_operations.h"
-
-int get_args(unsigned long args[], int cnt, struct pt_regs *regs)
-{
- int i, arg_in_regs, stack_args;
-
- arg_in_regs = cnt < 3 ? cnt : 3;
+#include <asm/ptrace.h>
#if defined(CONFIG_ARM)
+int get_args(unsigned long args[], int cnt, struct pt_regs *regs)
+{
/* All args, except first 4, are passed on the stack */
- stack_args = 4;
+ enum { stack_args = 4 };
+ int i, args_in_regs;
+
+ args_in_regs = cnt < 3 ? cnt : 3;
/* Get first 4 args from registers */
- switch (arg_in_regs) {
+ switch (args_in_regs) {
case 3:
- args[3] = get_regs_r3(regs);
+ args[3] = regs->ARM_r3;
case 2:
- args[2] = get_regs_r2(regs);
+ args[2] = regs->ARM_r2;
case 1:
- args[1] = get_regs_r1(regs);
+ args[1] = regs->ARM_r1;
case 0:
- args[0] = get_regs_r0(regs);
+ args[0] = regs->ARM_r0;
+ }
+
+ /* Get other args from stack */
+ for (i = stack_args; i < cnt; ++i) {
+ unsigned long *args_in_sp = (unsigned long *)regs->ARM_sp;
+ args[i] = args_in_sp[i - stack_args];
}
+ return 0;
+}
#elif defined(CONFIG_X86_32)
- if (user_mode(regs)) {
- /* If we're in user mode on x86 arch, get arguments from stack */
- /* ONLY CDECL CALLING CONVENTION IS SUPPORTED RIGHT NOW */
- stack_args = 0;
- } else {
+
+int get_args(unsigned long args[], int cnt, struct pt_regs *regs)
+{
+ int i, stack_args = 0;
+
+ /* If we're in kernel mode on x86, get arguments from bx, cx, dx, si,
+ * di, bp
+ */
+ if (!user_mode(regs)) {
+ int args_in_regs;
+ args_in_regs = cnt < 5 ? cnt : 5;
stack_args = 6;
- /* If we're in kernel mode on x86, get arguments from bx, cx, dx, si,
- * di, bp */
- switch (arg_in_regs) {
+
+ switch (args_in_regs) {
case 5:
- args[5] = get_regs_bp(regs);
+ args[5] = regs->bp;
case 4:
- args[4] = get_regs_di(regs);
+ args[4] = regs->di;
case 3:
- args[3] = get_regs_si(regs);
+ args[3] = regs->si;
case 2:
- args[2] = get_regs_dx(regs);
+ args[2] = regs->dx;
case 1:
- args[1] = get_regs_cx(regs);
+ args[1] = regs->cx;
case 0:
- args[0] = get_regs_bx(regs);
+ args[0] = regs->bx;
}
}
-#endif /* CONFIG_arch */
-
/* Get other args from stack */
for (i = stack_args; i < cnt; ++i) {
- args[i] = *(unsigned long *)(get_regs_stack_ptr(regs) +
- ((i- stack_args) * sizeof(unsigned long)));
+ unsigned long *args_in_sp = (unsigned long *)regs->sp + 1;
+ args[i] = args_in_sp[i - stack_args];
}
return 0;
}
+
+#endif /* CONFIG_arch */
diff --git a/writer/kernel_operations.h b/writer/kernel_operations.h
index d5ead66c..c87c80c7 100644
--- a/writer/kernel_operations.h
+++ b/writer/kernel_operations.h
@@ -49,12 +49,8 @@
#define get_regs_ip(regs) regs->ARM_pc
#define get_regs_ret_func(regs) regs->ARM_lr
-#define get_regs_ret_val(regs) get_regs_r0(regs)
+#define get_regs_ret_val(regs) regs->ARM_r0
#define get_regs_stack_ptr(regs) regs->ARM_sp
-#define get_regs_r0(regs) regs->ARM_r0
-#define get_regs_r1(regs) regs->ARM_r1
-#define get_regs_r2(regs) regs->ARM_r2
-#define get_regs_r3(regs) regs->ARM_r3
#elif defined(CONFIG_X86_32)
@@ -62,12 +58,6 @@
#define get_regs_ret_func(regs) regs->bp + 8
#define get_regs_ret_val(regs) regs->ax
#define get_regs_stack_ptr(regs) regs->sp
-#define get_regs_bx(regs) regs->bx
-#define get_regs_cx(regs) regs->cx
-#define get_regs_dx(regs) regs->dx
-#define get_regs_si(regs) regs->si
-#define get_regs_di(regs) regs->di
-#define get_regs_bp(regs) regs->bp
#endif /* CONFIG_arch */