[FIX] get_args() for x86
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 23 Jul 2013 14:50:20 +0000 (18:50 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Tue, 23 Jul 2013 14:50:20 +0000 (18:50 +0400)
writer/kernel_operations.c
writer/kernel_operations.h

index 59ce599..76b1eca 100644 (file)
  *
  */
 
-#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 */
index d5ead66..c87c80c 100644 (file)
 
 #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)
 
 #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 */