From: Vyacheslav Cherkashin Date: Tue, 23 Jul 2013 14:50:20 +0000 (+0400) Subject: [FIX] get_args() for x86 X-Git-Tag: Tizen_SDK_2.3~329 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f43fd7639eaedbd8059c9896b1de3ed9c83b69b8;p=kernel%2Fswap-modules.git [FIX] get_args() for x86 --- diff --git a/writer/kernel_operations.c b/writer/kernel_operations.c index 59ce599..76b1eca 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 #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 d5ead66..c87c80c 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 */