Revision: 950 Author: teawater Date: Sat Mar 3 02:01:37 2012 Log: Adding actionx http://code.google.com/p/kgtp/source/detail?r=950 Modified: /branches/actionx/gtp.c ======================================= --- /branches/actionx/gtp.c Fri Mar 2 06:19:08 2012 +++ /branches/actionx/gtp.c Sat Mar 3 02:01:37 2012 @@ -249,12 +249,70 @@ #define INT2CHAR(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') -#define OP_SPECIAL_GETV 0xfa -#define OP_SPECIAL_SETV 0xfb -#define OP_SPECIAL_TRACEV 0xfc -#define OP_TRACE_PRINTK 0xfd -#define OP_TRACE_QUICK_PRINTK 0xfe -#define OP_TRACEV_PRINTK 0xff +#define OP_CHECK_ADD +#define OP_CHECK_SUB +#define OP_CHECK_MUL +#ifndef CONFIG_MIPS +#define OP_CHECK_DIV_SIGNED +#define OP_CHECK_DIV_UNSIGNED +#define OP_CHECK_REM_SIGNED +#define OP_CHECK_REM_UNSIGNED +#endif +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ +#define OP_CHECK_ + +enum { + op_check_add = 0xe6, + op_check_sub, + op_check_mul, + op_check_div_signed, + op_check_div_unsigned, + op_check_rem_signed, + op_check_rem_unsigned, + op_check_lsh, + op_check_rsh_signed, + op_check_rsh_unsigned, + op_check_trace, + op_check_bit_and, + op_check_bit_or, + op_check_bit_xor, + op_check_equal, + op_check_less_signed, + op_check_less_unsigned, + op_check_pop, + op_check_swap, + op_check_printf, + + op_special_getv = 0xfa, + op_special_setv, + op_special_tracev, + + op_trace_printk = 0xfd, + op_trace_quick_printk, + op_tracev_printk, +}; struct action_agent_exp { unsigned int size; @@ -2978,7 +3036,7 @@ top = stack[--sp]; break; /* trace_printk */ - case OP_TRACE_PRINTK: + case op_trace_printk: if (gtp_action_printk(gts, (ULONGEST)stack[--sp], (size_t) top)) @@ -2996,7 +3054,7 @@ pc++; break; /* trace_quick_printk */ - case OP_TRACE_QUICK_PRINTK: + case op_trace_printk: if (gtp_action_printk(gts, (ULONGEST) top, (size_t) ebuf[pc++])) goto out; @@ -3159,7 +3217,7 @@ gtp_action_x_getv; break; /* getv_sepecial */ - case OP_SPECIAL_GETV: + case op_special_getv: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; stack[sp++] = top; @@ -3172,7 +3230,7 @@ gtp_action_x_setv; break; /* setv_sepecial */ - case OP_SPECIAL_SETV: + case op_special_setv: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; gtp_set_var_special(gts, arg, top); @@ -3184,13 +3242,13 @@ gtp_action_x_tracev; break; /* tracev_special */ - case OP_SPECIAL_TRACEV: + case op_special_tracev: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; gtp_collect_var_special(gts, arg); break; /* tracev_printk */ - case OP_TRACEV_PRINTK: + case op_tracev_printk: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; gtp_action_x_tracev_printk; @@ -3523,7 +3581,7 @@ gtp_action_x_getv; break; /* getv_sepecial */ - case OP_SPECIAL_GETV: + case op_special_getv: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; stack[sp++] = top; @@ -3536,7 +3594,7 @@ gtp_action_x_setv; break; /* setv_sepecial */ - case OP_SPECIAL_SETV: + case op_special_setv: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; gtp_set_var_special(gts, arg, top); @@ -3548,7 +3606,7 @@ gtp_action_x_tracev; break; /* tracev_special */ - case OP_SPECIAL_TRACEV: + case op_special_tracev: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; gtp_collect_var_special(gts, arg); @@ -4602,7 +4660,8 @@ struct gtp_x_var *vlist = NULL, *vtmp; uint8_t *ebuf = ae->u.exp.buf; int last_trace_pc = -1; - unsigned int stack_size = 0; + unsigned int sp_max = 0; + int need_op_check = 0; reswitch: while (pc < ae->u.exp.size) { @@ -4684,8 +4743,8 @@ case 0x28: if (ae->type == 'X') { sp++; - if (stack_size < sp) - stack_size = sp; + if (sp_max < sp) + sp_max = sp; } break; @@ -4693,8 +4752,8 @@ case 0x22: if (ae->type == 'X') { sp++; - if (stack_size < sp) - stack_size = sp; + if (sp_max < sp) + sp_max = sp; } /* ext */ case 0x16: @@ -4724,8 +4783,8 @@ pc += 2; if (ae->type == 'X') { sp++; - if (stack_size < sp) - stack_size = sp; + if (sp_max < sp) + sp_max = sp; } break; @@ -4736,8 +4795,8 @@ pc += 4; if (ae->type == 'X') { sp++; - if (stack_size < sp) - stack_size = sp; + if (sp_max < sp) + sp_max = sp; } break; @@ -4748,8 +4807,8 @@ pc += 8; if (ae->type == 'X') { sp++; - if (stack_size < sp) - stack_size = sp; + if (sp_max < sp) + sp_max = sp; } break; @@ -4828,13 +4887,13 @@ else if (arg == GTP_VAR_COOKED_RDTSC_ID) gtp_access_cooked_rdtsc = 1; #endif - ebuf[pc - 3] = OP_SPECIAL_GETV; + ebuf[pc - 3] = op_special_getv; } } if (ae->type == 'X') { sp++; - if (stack_size < sp) - stack_size = sp; + if (sp_max < sp) + sp_max = sp; } break; @@ -4868,7 +4927,7 @@ if (arg == GTP_VAR_PRINTK_LEVEL_ID) tpe->have_printk = 1; - ebuf[pc - 3] = OP_SPECIAL_SETV; + ebuf[pc - 3] = op_special_setv; } } break; @@ -4902,7 +4961,7 @@ else if (arg == GTP_VAR_COOKED_RDTSC_ID) gtp_access_cooked_rdtsc = 1; #endif - ebuf[pc - 3] = OP_SPECIAL_TRACEV; + ebuf[pc - 3] = op_special_tracev; } } break; @@ -4979,15 +5038,17 @@ gtmp->non_goto_done = 1; goto reswitch; } - if (stack_size >= STACK_MAX) { - printk(KERN_WARNING "gtp_check_x: stack overflow."); + if (sp_max >= STACK_MAX) { + printk(KERN_WARNING "gtp_check_x: stack overflow, " + "current %d, max %d.\n", + sp_max, STACK_MAX); goto release_out; } ret = 0; #ifdef GTP_DEBUG printk(GTP_DEBUG "gtp_check_x: Code is OK. sp_checked is %d. " - "stack_size is %d.\n", - (ae->type == 'X'), stack_size); + "sp_max is %d.\n", + (ae->type == 'X'), sp_max); #endif release_out: @@ -5023,15 +5084,15 @@ switch (ebuf[last_trace_pc]) { /* trace */ case 0x0c: - ebuf[last_trace_pc] = OP_TRACE_PRINTK; + ebuf[last_trace_pc] = op_trace_printk; break; /* trace_quick */ case 0x0d: - ebuf[last_trace_pc] = OP_TRACE_QUICK_PRINTK; + ebuf[last_trace_pc] = op_trace_printk; break; /* tracev */ case 0x2e: - ebuf[last_trace_pc] = OP_TRACEV_PRINTK; + ebuf[last_trace_pc] = op_tracev_printk; break; } }