#ifdef CONFIG_ARM
-#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_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
+#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_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 CONFIG_X86_32
-#define get_regs_ip(regs) regs->ip
-//TODO Ret function address for x86!
-#define get_regs_ret_func(regs) regs->bp
-#define get_regs_ret_val(regs) regs->ax
-#define get_regs_r0(regs) 0
-#define get_regs_r1(regs) 0
-#define get_regs_r2(regs) 0
-#define get_regs_r3(regs) 0
+#define get_regs_ip(regs) regs->ip
+#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 */
-
+int get_args(unsigned long args[], int cnt, struct pt_regs *regs);
#endif /* __KERNEL_OPERATIONS_H__ */
return payload + sizeof(*mfe);
}
-static int get_args(unsigned long args[], int cnt, struct pt_regs *regs)
-{
- int i, arg_in_regs;
-
- arg_in_regs = cnt < 3 ? cnt : 3;
- switch (arg_in_regs) {
- case 3:
-//TODO x86
- args[3] = get_regs_r3(regs);
- case 2:
-//TODO x86
- args[2] = get_regs_r2(regs);
- case 1:
-//TODO x86
- args[1] = get_regs_r1(regs);
- case 0:
-//TODO x86
- args[0] = get_regs_r0(regs);
- }
-
- /* FIXME: cnt > 4 */
- for (i = 4; i < cnt; ++i) {
- args[i] = 0;
- }
-
- return 0;
-}
-
static int pack_args(char *buf, int len, const char *fmt, struct pt_regs *regs)
{
enum { args_cnt = 16 };