Revision: 955 Author: teawater Date: Sat Mar 3 22:34:21 2012 Log: Adding actionx http://code.google.com/p/kgtp/source/detail?r=955 Modified: /branches/actionx/gtp.c ======================================= --- /branches/actionx/gtp.c Sat Mar 3 21:22:07 2012 +++ /branches/actionx/gtp.c Sat Mar 3 22:34:21 2012 @@ -2794,96 +2794,6 @@ return 0; } - -#define gtp_action_x_getv \ - do { \ - struct gtp_var *tve; \ - \ - tve = gtp_gtp_var_array_find(arg); \ - if (!tve) \ - goto code_error_out; \ - \ - stack[sp++] = top; \ - \ - top = gtp_get_var(gts, tve); \ - } while (0) - -#ifdef GTP_PERF_EVENTS -#define gtp_action_x_setv_pe \ - do { \ - if (tve->ptid == pe_tv_en) \ - gtp_pe_set_en(tve->pts, (int)top); \ - else if (tve->ptid == pe_tv_val) \ - gtp_perf_event_set(tve->pts->event, (u64)top); \ - } while (0) -#else -#define gtp_action_x_setv_pe -#endif - -#define gtp_action_x_setv \ - do { \ - struct gtp_var *tve; \ - \ - tve = gtp_gtp_var_array_find(arg); \ - if (!tve) \ - goto code_error_out; \ - gtp_action_x_setv_pe; \ - tve->val = (uint64_t)top; \ - } while (0) - -#define gtp_action_x_tracev \ - do { \ - if (!gts->tpe->have_printk) { \ - struct gtp_var *tve; \ - \ - tve = gtp_gtp_var_array_find(arg); \ - if (!tve) \ - goto code_error_out; \ - \ - if (gtp_collect_var(gts, tve)) { \ - /* gtp_collect_var will set error \ - status with itself if it got \ - error. */ \ - goto out; \ - } \ - } \ - } while (0) - -#define gtp_action_x_tracev_printk \ - do { \ - struct gtp_var *tve; \ - \ - tve = gtp_gtp_var_array_find(arg); \ - if (!tve) \ - goto code_error_out; \ - \ - if (gtp_action_printk(gts, gtp_get_var(gts, tve), 0)) { \ - /* gtp_collect_var will set error status with \ - itself if it got error. */ \ - goto out; \ - } \ - } while (0) - -#define gtp_action_x_printf \ - do { \ - if (strstr((char *)(ebuf + pc), "%s")) { \ - int i; \ - char buf[50]; \ - \ - for (i = 0; i < 50; i++) { \ - if (probe_kernel_read(buf + i, \ - argv + i, 1)) \ - goto code_error_out; \ - if (!buf[i]) \ - break; \ - } \ - snprintf(pbuf, psize, (char *)(ebuf + pc), \ - buf); \ - } else { \ - snprintf(pbuf, psize, (char *)(ebuf + pc), \ - argv); \ - } \ - } while (0) #define STACK_MAX 32 static DEFINE_PER_CPU(ULONGEST[STACK_MAX], action_x_stack); @@ -3326,10 +3236,19 @@ goto code_error_out; break; /* getv */ - case 0x2c: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_getv; + case 0x2c: { + struct gtp_var *tve; + + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + + tve = gtp_gtp_var_array_find(arg); + if (!tve) + goto code_error_out; + stack[sp++] = top; + + top = gtp_get_var(gts, tve); + } break; /* getv_sepecial */ case op_special_getv: @@ -3339,10 +3258,24 @@ top = gtp_get_var_special(gts, arg); break; /* setv */ - case 0x2d: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_setv; + case 0x2d: { + struct gtp_var *tve; + + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + + tve = gtp_gtp_var_array_find(arg); + if (!tve) + goto code_error_out; +#ifdef GTP_PERF_EVENTS + if (tve->ptid == pe_tv_en) + gtp_pe_set_en(tve->pts, (int)top); + else if (tve->ptid == pe_tv_val) + gtp_perf_event_set(tve->pts->event, + (u64)top); +#endif + tve->val = (uint64_t)top; + } break; /* setv_sepecial */ case op_special_setv: @@ -3354,7 +3287,21 @@ case 0x2e: arg = ebuf[pc++]; arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_tracev; + + if (!gts->tpe->have_printk) { + struct gtp_var *tve; + + tve = gtp_gtp_var_array_find(arg); + if (!tve) + goto code_error_out; + + if (gtp_collect_var(gts, tve)) { + /* gtp_collect_var will set error + status with itself if it got + error. */ + goto out; + } + } break; /* tracev_special */ case op_special_tracev: @@ -3363,10 +3310,24 @@ gtp_collect_var_special(gts, arg); break; /* tracev_printk */ - case op_tracev_printk: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_tracev_printk; + case op_tracev_printk: { + struct gtp_var *tve; + + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + + tve = gtp_gtp_var_array_find(arg); + if (!tve) + goto code_error_out; + + if (gtp_action_printk(gts, + gtp_get_var(gts, tve), + 0)) { + /* gtp_collect_var will set error status + with itself if it got error. */ + goto out; + } + } break; /* printf */ case 0x31: { @@ -3380,7 +3341,23 @@ /* pop */ top = stack[--sp]; - gtp_action_x_printf; + if (strstr((char *)(ebuf + pc), "%s")) { + int i; + char buf[50]; + + for (i = 0; i < 50; i++) { + if (probe_kernel_read(buf + i, + argv + i, 1)) + goto code_error_out; + if (!buf[i]) + break; + } + snprintf(pbuf, psize, (char *)(ebuf + pc), + buf); + } else { + snprintf(pbuf, psize, (char *)(ebuf + pc), + argv); + } } else snprintf(pbuf, psize, (char *)(ebuf + pc));