Revision: 954 Author: teawater Date: Sat Mar 3 21:22:07 2012 Log: Adding actionx http://code.google.com/p/kgtp/source/detail?r=954 Modified: /branches/actionx/gtp.c ======================================= --- /branches/actionx/gtp.c Sat Mar 3 20:23:24 2012 +++ /branches/actionx/gtp.c Sat Mar 3 21:22:07 2012 @@ -250,7 +250,7 @@ #define INT2CHAR(h) ((h) > 9 ? (h) + 'a' - 10 : (h) + '0') enum { - op_check_add = 0xe6, + op_check_add = 0xe5, op_check_sub, op_check_mul, op_check_div_signed, @@ -269,6 +269,7 @@ op_check_less_unsigned, op_check_pop, op_check_swap, + op_check_if_goto, op_check_printf, /* XXX: still not used. */ op_special_getv = 0xfa, @@ -2920,695 +2921,482 @@ if (unlikely(ae->u.exp.need_var_lock)) spin_lock(>p_var_lock); - if (ae->type == 'X') { - while (pc < ae->u.exp.size) { + while (1) { #ifdef GTP_DEBUG - printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); + printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); #endif - switch (ebuf[pc++]) { - /* add */ - case 0x02: + switch (ebuf[pc++]) { + /* add */ + case 0x02: + top += stack[--sp]; + break; + case op_check_add: + if (sp) top += stack[--sp]; - break; - /* sub */ - case 0x03: + else + goto code_error_out; + break; + /* sub */ + case 0x03: + top = stack[--sp] - top; + break; + case op_check_sub: + if (sp) top = stack[--sp] - top; - break; - /* mul */ - case 0x04: + else + goto code_error_out; + break; + /* mul */ + case 0x04: + top *= stack[--sp]; + break; + case op_check_mul: + if (sp) top *= stack[--sp]; - break; + else + goto code_error_out; + break; #ifndef CONFIG_MIPS - /* div_signed */ - case 0x05: - if (top) { - LONGEST l = (LONGEST) stack[--sp]; - do_div(l, (LONGEST) top); - top = l; - } else - goto code_error_out; - break; - /* div_unsigned */ - case 0x06: - if (top) { - ULONGEST ul = stack[--sp]; - do_div(ul, top); - top = ul; - } else - goto code_error_out; - break; - /* rem_signed */ - case 0x07: - if (top) { - LONGEST l1 = (LONGEST) stack[--sp]; - LONGEST l2 = (LONGEST) top; - top = do_div(l1, l2); - } else - goto code_error_out; - break; - /* rem_unsigned */ - case 0x08: - if (top) { - ULONGEST ul1 = stack[--sp]; - ULONGEST ul2 = top; - top = do_div(ul1, ul2); - } else - goto code_error_out; - break; + /* div_signed */ + case 0x05: + if (top) { + LONGEST l = (LONGEST) stack[--sp]; + do_div(l, (LONGEST) top); + top = l; + } else + goto code_error_out; + break; + case op_check_div_signed: + if (top && sp) { + LONGEST l = (LONGEST) stack[--sp]; + do_div(l, (LONGEST) top); + top = l; + } else + goto code_error_out; + break; + /* div_unsigned */ + case 0x06: + if (top) { + ULONGEST ul = stack[--sp]; + do_div(ul, top); + top = ul; + } else + goto code_error_out; + break; + case op_check_div_unsigned: + if (top && sp) { + ULONGEST ul = stack[--sp]; + do_div(ul, top); + top = ul; + } else + goto code_error_out; + break; + /* rem_signed */ + case 0x07: + if (top) { + LONGEST l1 = (LONGEST) stack[--sp]; + LONGEST l2 = (LONGEST) top; + top = do_div(l1, l2); + } else + goto code_error_out; + break; + case op_check_rem_signed: + if (top && sp) { + LONGEST l1 = (LONGEST) stack[--sp]; + LONGEST l2 = (LONGEST) top; + top = do_div(l1, l2); + } else + goto code_error_out; + break; + /* rem_unsigned */ + case 0x08: + if (top) { + ULONGEST ul1 = stack[--sp]; + ULONGEST ul2 = top; + top = do_div(ul1, ul2); + } else + goto code_error_out; + break; + case op_check_rem_unsigned: + if (top && sp) { + ULONGEST ul1 = stack[--sp]; + ULONGEST ul2 = top; + top = do_div(ul1, ul2); + } else + goto code_error_out; + break; #endif - /* lsh */ - case 0x09: + /* lsh */ + case 0x09: + top = stack[--sp] << top; + break; + case op_check_lsh: + if (sp) top = stack[--sp] << top; - break; - /* rsh_signed */ - case 0x0a: + else + goto code_error_out; + break; + /* rsh_signed */ + case 0x0a: + top = ((LONGEST) stack[--sp]) >> top; + break; + case op_check_rsh_signed: + if (sp) top = ((LONGEST) stack[--sp]) >> top; - break; - /* rsh_unsigned */ - case 0x0b: + else + goto code_error_out; + break; + /* rsh_unsigned */ + case 0x0b: + top = stack[--sp] >> top; + break; + case op_check_rsh_unsigned: + if (sp) top = stack[--sp] >> top; - break; - /* trace */ - case 0x0c: - --sp; - if (!gts->tpe->have_printk) { - if (gtp_action_memory_read - (gts, -1, - (CORE_ADDR) stack[sp], - (size_t) top)) - goto out; + else + goto code_error_out; + break; + /* trace */ + case 0x0c: + --sp; + if (!gts->tpe->have_printk) { + if (gtp_action_memory_read + (gts, -1, + (CORE_ADDR) stack[sp], + (size_t) top)) + goto out; + } + top = stack[--sp]; + break; + case op_check_trace: + if (sp > 1) { + if (gtp_action_memory_read + (gts, -1, (CORE_ADDR) stack[--sp], + (size_t) top)) { + /* gtp_action_memory_read will + set error status with itself + if it got error. */ + goto out; } top = stack[--sp]; - break; - /* trace_printk */ - case op_trace_printk: - if (gtp_action_printk(gts, - (ULONGEST)stack[--sp], - (size_t) top)) + } else + goto code_error_out; + break; + /* trace_printk */ + case op_trace_printk: + if (gtp_action_printk(gts, + (ULONGEST)stack[--sp], + (size_t) top)) + goto out; + top = stack[--sp]; + break; + /* trace_quick */ + case 0x0d: + if (!gts->tpe->have_printk) { + if (gtp_action_memory_read + (gts, -1, (CORE_ADDR) top, + (size_t) ebuf[pc])) goto out; - top = stack[--sp]; - break; - /* trace_quick */ - case 0x0d: - if (!gts->tpe->have_printk) { - if (gtp_action_memory_read - (gts, -1, (CORE_ADDR) top, - (size_t) ebuf[pc])) - goto out; - } - pc++; - break; - /* trace_quick_printk */ - case op_trace_quick_printk: - if (gtp_action_printk(gts, (ULONGEST) top, - (size_t) ebuf[pc++])) - goto out; - break; - /* log_not */ - case 0x0e: - top = !top; - break; - /* bit_and */ - case 0x0f: + } + pc++; + break; + /* trace_quick_printk */ + case op_trace_quick_printk: + if (gtp_action_printk(gts, (ULONGEST) top, + (size_t) ebuf[pc++])) + goto out; + break; + /* log_not */ + case 0x0e: + top = !top; + break; + /* bit_and */ + case 0x0f: + top &= stack[--sp]; + break; + case op_check_bit_and: + if (sp) top &= stack[--sp]; - break; - /* bit_or */ - case 0x10: + else + goto code_error_out; + break; + /* bit_or */ + case 0x10: + top |= stack[--sp]; + break; + case op_check_bit_or: + if (sp) top |= stack[--sp]; - break; - /* bit_xor */ - case 0x11: + else + goto code_error_out; + break; + /* bit_xor */ + case 0x11: + top ^= stack[--sp]; + break; + case op_check_bit_xor: + if (sp) top ^= stack[--sp]; - break; - /* bit_not */ - case 0x12: - top = ~top; - break; - /* equal */ - case 0x13: + else + goto code_error_out; + break; + /* bit_not */ + case 0x12: + top = ~top; + break; + /* equal */ + case 0x13: + top = (stack[--sp] == top); + break; + case op_check_equal: + if (sp) top = (stack[--sp] == top); - break; - /* less_signed */ - case 0x14: + else + goto code_error_out; + break; + /* less_signed */ + case 0x14: + top = (((LONGEST) stack[--sp]) + < ((LONGEST) top)); + break; + case op_check_less_signed: + if (sp) top = (((LONGEST) stack[--sp]) < ((LONGEST) top)); - break; - /* less_unsigned */ - case 0x15: + else + goto code_error_out; + break; + /* less_unsigned */ + case 0x15: + top = (stack[--sp] < top); + break; + case op_check_less_unsigned: + if (sp) top = (stack[--sp] < top); - break; - /* ext */ - case 0x16: - arg = ebuf[pc++]; - if (arg < (sizeof(LONGEST)*8)) { - LONGEST mask = 1 << (arg - 1); - top &= ((LONGEST) 1 << arg) - 1; - top = (top ^ mask) - mask; - } - break; - /* ref8 */ - case 0x17: - if (probe_kernel_read - (cnv.u8.bytes, - (void *)(CORE_ADDR)top, 1)) - goto code_error_out; - top = (ULONGEST) cnv.u8.val; - break; - /* ref16 */ - case 0x18: - if (probe_kernel_read - (cnv.u16.bytes, - (void *)(CORE_ADDR)top, 2)) - goto code_error_out; - top = (ULONGEST) cnv.u16.val; - break; - /* ref32 */ - case 0x19: - if (probe_kernel_read - (cnv.u32.bytes, - (void *)(CORE_ADDR)top, 4)) - goto code_error_out; - top = (ULONGEST) cnv.u32.val; - break; - /* ref64 */ - case 0x1a: - if (probe_kernel_read - (cnv.u64.bytes, - (void *)(CORE_ADDR)top, 8)) - goto code_error_out; - top = (ULONGEST) cnv.u64.val; - break; - /* if_goto */ - case 0x20: - /* The not check sp code don't - support if_goto. */ + else goto code_error_out; - break; - /* goto */ - case 0x21: - pc = (ebuf[pc] << 8) + (ebuf[pc + 1]); - break; - /* const8 */ - case 0x22: - stack[sp++] = top; - top = ebuf[pc++]; - break; - /* const16 */ - case 0x23: - stack[sp++] = top; - top = ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - break; - /* const32 */ - case 0x24: - stack[sp++] = top; - top = ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - break; - /* const64 */ - case 0x25: - stack[sp++] = top; - top = ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - top = (top << 8) + ebuf[pc++]; - break; - /* reg */ - case 0x26: - stack[sp++] = top; - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - top = gtp_action_reg_read(gts->regs, gts->tpe, - arg); - if (gts->tpe->reason != gtp_stop_normal) - goto error_out; - break; - /* end */ - case 0x27: - if (gts->run) - *(gts->run) = (int)top; - goto out; - break; - /* dup */ - case 0x28: - stack[sp++] = top; - break; + break; + /* ext */ + case 0x16: + arg = ebuf[pc++]; + if (arg < (sizeof(LONGEST)*8)) { + LONGEST mask = 1 << (arg - 1); + top &= ((LONGEST) 1 << arg) - 1; + top = (top ^ mask) - mask; + } + break; + /* ref8 */ + case 0x17: + if (probe_kernel_read + (cnv.u8.bytes, + (void *)(CORE_ADDR)top, 1)) + goto code_error_out; + top = (ULONGEST) cnv.u8.val; + break; + /* ref16 */ + case 0x18: + if (probe_kernel_read + (cnv.u16.bytes, + (void *)(CORE_ADDR)top, 2)) + goto code_error_out; + top = (ULONGEST) cnv.u16.val; + break; + /* ref32 */ + case 0x19: + if (probe_kernel_read + (cnv.u32.bytes, + (void *)(CORE_ADDR)top, 4)) + goto code_error_out; + top = (ULONGEST) cnv.u32.val; + break; + /* ref64 */ + case 0x1a: + if (probe_kernel_read + (cnv.u64.bytes, + (void *)(CORE_ADDR)top, 8)) + goto code_error_out; + top = (ULONGEST) cnv.u64.val; + break; + /* if_goto */ + case 0x20: + if (top) + pc = (ebuf[pc] << 8) + + (ebuf[pc + 1]); + else + pc += 2; /* pop */ - case 0x29: + top = stack[--sp]; + break; + case op_check_if_goto: + if (top) + pc = (ebuf[pc] << 8) + + (ebuf[pc + 1]); + else + pc += 2; + /* pop */ + if (sp) top = stack[--sp]; - break; - /* zero_ext */ - case 0x2a: - arg = ebuf[pc++]; - if (arg < (sizeof(LONGEST)*8)) - top &= ((LONGEST) 1 << arg) - 1; - break; - /* swap */ - case 0x2b: + else + goto code_error_out; + break; + /* goto */ + case 0x21: + pc = (ebuf[pc] << 8) + (ebuf[pc + 1]); + break; + /* const8 */ + case 0x22: + stack[sp++] = top; + top = ebuf[pc++]; + break; + /* const16 */ + case 0x23: + stack[sp++] = top; + top = ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + break; + /* const32 */ + case 0x24: + stack[sp++] = top; + top = ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + break; + /* const64 */ + case 0x25: + stack[sp++] = top; + top = ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + top = (top << 8) + ebuf[pc++]; + break; + /* reg */ + case 0x26: + stack[sp++] = top; + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + top = gtp_action_reg_read(gts->regs, gts->tpe, + arg); + if (gts->tpe->reason != gtp_stop_normal) + goto error_out; + break; + /* end */ + case 0x27: + if (gts->run) + *(gts->run) = (int)top; + goto out; + break; + /* dup */ + case 0x28: + stack[sp++] = top; + break; + /* pop */ + case 0x29: + top = stack[--sp]; + break; + case op_check_pop: + if (sp) + top = stack[--sp]; + else + goto code_error_out; + break; + /* zero_ext */ + case 0x2a: + arg = ebuf[pc++]; + if (arg < (sizeof(LONGEST)*8)) + top &= ((LONGEST) 1 << arg) - 1; + break; + /* swap */ + case 0x2b: + stack[sp] = top; + top = stack[sp - 1]; + stack[sp - 1] = stack[sp]; + break; + case op_check_swap: + if (sp) { stack[sp] = top; top = stack[sp - 1]; stack[sp - 1] = stack[sp]; - break; - /* getv */ - case 0x2c: + } else + goto code_error_out; + break; + /* getv */ + case 0x2c: + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + gtp_action_x_getv; + break; + /* getv_sepecial */ + case op_special_getv: + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + stack[sp++] = top; + top = gtp_get_var_special(gts, arg); + break; + /* setv */ + case 0x2d: + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + gtp_action_x_setv; + break; + /* setv_sepecial */ + case op_special_setv: + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + gtp_set_var_special(gts, arg, top); + break; + /* tracev */ + case 0x2e: + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + gtp_action_x_tracev; + break; + /* tracev_special */ + 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: + arg = ebuf[pc++]; + arg = (arg << 8) + ebuf[pc++]; + gtp_action_x_tracev_printk; + break; + /* printf */ + case 0x31: { arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_getv; - break; - /* getv_sepecial */ - case op_special_getv: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - stack[sp++] = top; - top = gtp_get_var_special(gts, arg); - break; - /* setv */ - case 0x2d: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_setv; - break; - /* setv_sepecial */ - case op_special_setv: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_set_var_special(gts, arg, top); - break; - /* tracev */ - case 0x2e: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_tracev; - break; - /* tracev_special */ - 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: - arg = ebuf[pc++]; - arg = (arg << 8) + ebuf[pc++]; - gtp_action_x_tracev_printk; - break; - /* printf */ - case 0x31: { - arg = ebuf[pc++]; - - if (arg) { - void *argv = (void *) - (unsigned long) - top; - - /* pop */ - top = stack[--sp]; - - gtp_action_x_printf; - } else - snprintf(pbuf, psize, - (char *)(ebuf + pc)); - psize -= strlen(pbuf); - pbuf += strlen(pbuf); - - pc += strlen((char *)ebuf + pc) + 1; - } - break; - } - } - } else { - /* The x execution code don't support printk so it doesn't have - printk ae support. */ - while (pc < ae->u.exp.size) { -#ifdef GTP_DEBUG - printk(GTP_DEBUG "gtp_parse_x: cmd %x\n", ebuf[pc]); -#endif - - switch (ebuf[pc++]) { - /* add */ - case 0x02: - if (sp) - top += stack[--sp]; - else - goto code_error_out; - break; - /* sub */ - case 0x03: - if (sp) - top = stack[--sp] - top; - else - goto code_error_out; - break; - /* mul */ - case 0x04: - if (sp) - top *= stack[--sp]; - else - goto code_error_out; - break; -#ifndef CONFIG_MIPS - /* div_signed */ - case 0x05: - if (top && sp) { - LONGEST l = (LONGEST) stack[--sp]; - do_div(l, (LONGEST) top); - top = l; - } else - goto code_error_out; - break; - /* div_unsigned */ - case 0x06: - if (top && sp) { - ULONGEST ul = stack[--sp]; - do_div(ul, top); - top = ul; - } else - goto code_error_out; - break; - /* rem_signed */ - case 0x07: - if (top && sp) { - LONGEST l1 = (LONGEST) stack[--sp]; - LONGEST l2 = (LONGEST) top; - top = do_div(l1, l2); - } else - goto code_error_out; - break; - /* rem_unsigned */ - case 0x08: - if (top && sp) { - ULONGEST ul1 = stack[--sp]; - ULONGEST ul2 = top; - top = do_div(ul1, ul2); - } else - goto code_error_out; - break; -#endif - /* lsh */ - case 0x09: - if (sp) - top = stack[--sp] << top; - else - goto code_error_out; - break; - /* rsh_signed */ - case 0x0a: - if (sp) - top = ((LONGEST) stack[--sp]) >> top; - else - goto code_error_out; - break; - /* rsh_unsigned */ - case 0x0b: - if (sp) - top = stack[--sp] >> top; - else - goto code_error_out; - break; - /* trace */ - case 0x0c: - if (sp > 1) { - if (gtp_action_memory_read - (gts, -1, (CORE_ADDR) stack[--sp], - (size_t) top)) { - /* gtp_action_memory_read will - set error status with itself - if it got error. */ - goto out; - } - top = stack[--sp]; - } else - goto code_error_out; - break; - /* trace_quick */ - case 0x0d: - if (gtp_action_memory_read - (gts, -1, (CORE_ADDR) top, - (size_t) ebuf[pc++])) { - /* gtp_action_memory_read will set - error status with itself if it got - error. */ - goto out; - } - break; - /* log_not */ - case 0x0e: - top = !top; - break; - /* bit_and */ - case 0x0f: - if (sp) - top &= stack[--sp]; - else - goto code_error_out; - break; - /* bit_or */ - case 0x10: - if (sp) - top |= stack[--sp]; - else - goto code_error_out; - break; - /* bit_xor */ - case 0x11: - if (sp) - top ^= stack[--sp]; - else - goto code_error_out; - break; - /* bit_not */ - case 0x12: - top = ~top; - break; - /* equal */ - case 0x13: - if (sp) - top = (stack[--sp] == top); - else - goto code_error_out; - break; - /* less_signed */ - case 0x14: - if (sp) - top = (((LONGEST) stack[--sp]) - < ((LONGEST) top)); - else - goto code_error_out; - break; - /* less_unsigned */ - case 0x15: - if (sp) - top = (stack[--sp] < top); - else - goto code_error_out; - break; - /* ext */ - case 0x16: - arg = ebuf[pc++]; - if (arg < (sizeof(LONGEST)*8)) { - LONGEST mask = 1 << (arg - 1); - top &= ((LONGEST) 1 << arg) - 1; - top = (top ^ mask) - mask; - } - break; - /* ref8 */ - case 0x17: - if (probe_kernel_read - (cnv.u8.bytes, - (void *)(CORE_ADDR)top, 1)) - goto code_error_out; - top = (ULONGEST) cnv.u8.val; - break; - /* ref16 */ - case 0x18: - if (probe_kernel_read - (cnv.u16.bytes, - (void *)(CORE_ADDR)top, 2)) - goto code_error_out; - top = (ULONGEST) cnv.u16.val; - break; - /* ref32 */ - case 0x19: - if (probe_kernel_read - (cnv.u32.bytes, - (void *)(CORE_ADDR)top, 4)) - goto code_error_out; - top = (ULONGEST) cnv.u32.val; - break; - /* ref64 */ - case 0x1a: - if (probe_kernel_read - (cnv.u64.bytes, - (void *)(CORE_ADDR)top, 8)) - goto code_error_out; - top = (ULONGEST) cnv.u64.val; - break; - /* if_goto */ - case 0x20: - if (top) - pc = (ebuf[pc] << 8) - + (ebuf[pc + 1]); - else - pc += 2; - /* pop */ - if (sp) - top = stack[--sp]; - else - goto code_error_out; - break; - /* goto */ - case 0x21: - pc = (ebuf[pc] << 8) + (ebuf[pc + 1]); - break; - /* const8 */ - case 0x22: - stack[sp++] = top; - top = ebuf[pc++]; - break; - /* const16 */ - case 0x23: - stack[sp++] = top; - top = ebuf[pc++]; ***The diff for this file has been truncated for email.***