From 3d40b0e96bfc8f1d9e5e6d66741e6b7c43b92a93 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Sun, 8 Sep 2019 21:22:53 +0900 Subject: [PATCH] (LibGoblin) * WorkBackup --- libgoblin/drd64_libgoblin_dwarf_expression.c | 238 +++++++++++++++++++++------ libgoblin/drd64_libgoblin_type_dwarf.h | 11 +- 2 files changed, 197 insertions(+), 52 deletions(-) diff --git a/libgoblin/drd64_libgoblin_dwarf_expression.c b/libgoblin/drd64_libgoblin_dwarf_expression.c index 92f6425..8479bc3 100644 --- a/libgoblin/drd64_libgoblin_dwarf_expression.c +++ b/libgoblin/drd64_libgoblin_dwarf_expression.c @@ -49,11 +49,14 @@ void assert( NULL != p_exp ); - i_id = p_exp->i_id; - p_next = p_exp->p_next; + i_id = p_exp->i_id; + p_next = p_exp->p_next; memset( p_exp, 0x00, sizeof( LibGoblin_DWARF_Expression ) ); - p_exp->i_id = i_id; - p_exp->p_next = p_next; + p_exp->i_id = i_id; + p_exp->p_next = p_next; + + p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_NOTEVALUATE; + p_exp->dw_depth = 0; return; } @@ -99,7 +102,10 @@ DWord Byte b_opcode; Byte b_value; Byte b_reg; + Byte *pb_skip; Byte *pb_now; + short s_value; + Word w_value; QWord qw_remain; DWord dw_value; QWord qw_value; @@ -126,17 +132,18 @@ DWord // ------------------------ pb_now = pb_data; - //dw_depth = 0; qw_remain = (( 0 == dw_size ) ? 512 : (QWord)dw_size ); qw_value = 0x00000000; p_exp->result.qw_value = 0x00000000; p_exp->dw_requested = LIBGOBLIN_DWARF_REQUEST_NONE; p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_ERROR; - p_exp->dw_depth = 0; if( LIBGOBLIN_DWARF_REQUEST_NONE != p_exp->dw_setdata ) { p_exp->dw_reqsize = 0; } - memset( &((p_exp)->t_stack), 0x00, - sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH ); + if( NULL == p_exp->resume.pb_resume ) { + p_exp->dw_depth = 0; + memset( &((p_exp)->t_stack), 0x00, + sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH ); + } do { b_opcode = *pb_now++; @@ -472,11 +479,12 @@ DWord { p_exp->dw_requested |= LIBGOBLIN_DWARF_REQUEST_CFAADDR; } break; + // Arithmetic & Logical Operation ---- case DW_OP_abs: // 0x19 // 2019/09/03 Lunch-Coding (Required TEST!!) if( 0 == p_exp->dw_depth ) { goto goto_DWARF_Expression_Evaluate_post; } - if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag ) { + if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth - 1].b_flag ) { ii_value = POP_DWARF_SIGN( p_exp ); if( 0 > ii_value ) { ii_value *= -1; } PUSH_DWARF_SIGN( p_exp, ii_value ); @@ -509,14 +517,52 @@ DWord break; case DW_OP_minus: // 0x1c + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value -= qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_mod: // 0x1d + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value %= qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_mul: // 0x1e + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value *= qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_neg: // 0x1f + // 2019/09/08 (Required TEST!!) + if( 1 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_value = POP_DWARF_SIGN( p_exp ); + ii_value *= -1; + PUSH_DWARF_SIGN( p_exp, ii_value ); break; case DW_OP_not: // 0x20 + // 2019/09/08 (Required TEST!!) + if( 1 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_value = POP_DWARF( p_exp ); + qw_value = ~qw_value; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_or: // 0x21 // 2019/09/03 Lunch-Coding (Required TEST!!) @@ -528,112 +574,199 @@ DWord qw_value |= qw_temp; PUSH_DWARF( p_exp, qw_value ); break; - case DW_OP_plus: // 0x22 + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value += qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_plus_uconst: // 0x23 + // 2019/09/08 (Required TEST!!) + if( 1 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_value = POP_DWARF( p_exp ); + pb_now = DWARF_Common_DecodeULEB128( &qw_temp, pb_now, &qw_remain ); + + qw_value += qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_shl: // 0x24 + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value <<= qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_shr: // 0x25 + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value >>= qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; case DW_OP_shra: // 0x26 + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + ii_value >>= qw_temp; + PUSH_DWARF_SIGN( p_exp, ii_value ); break; case DW_OP_xor: // 0x27 + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + qw_temp = POP_DWARF( p_exp ); + qw_value = POP_DWARF( p_exp ); + qw_value ^= qw_temp; + PUSH_DWARF( p_exp, qw_value ); break; - case DW_OP_bra: // 0x28 - break; + + // Flow Control Operation ---- case DW_OP_eq: // 0x29 + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( ii_value == ii_temp ) { PUSH_DWARF( p_exp, 0x01 ); } + else { PUSH_DWARF( p_exp, 0x00 ); } break; case DW_OP_ge: // 0x2a + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( ii_value >= ii_temp ) { PUSH_DWARF( p_exp, 0x01 ); } + else { PUSH_DWARF( p_exp, 0x00 ); } break; case DW_OP_gt: // 0x2b + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( ii_value > ii_temp ) { PUSH_DWARF( p_exp, 0x01 ); } + else { PUSH_DWARF( p_exp, 0x00 ); } break; case DW_OP_le: // 0x2c + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( ii_value <= ii_temp ) { PUSH_DWARF( p_exp, 0x01 ); } + else { PUSH_DWARF( p_exp, 0x00 ); } break; case DW_OP_lt: // 0x2d + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( ii_value < ii_temp ) { PUSH_DWARF( p_exp, 0x01 ); } + else { PUSH_DWARF( p_exp, 0x00 ); } break; case DW_OP_ne: // 0x2e + // 2019/09/08 (Required TEST!!) + if( 2 > p_exp->dw_depth ) + { goto goto_DWARF_Expression_Evaluate_post; } + + ii_temp = POP_DWARF_SIGN( p_exp ); + ii_value = POP_DWARF_SIGN( p_exp ); + if( ii_value != ii_temp ) { PUSH_DWARF( p_exp, 0x01 ); } + else { PUSH_DWARF( p_exp, 0x00 ); } break; case DW_OP_skip: // 0x2f + // 2019/09/08 (Required TEST!!) + s_value = *((short *)pb_now); + pb_now += 2; + qw_remain -= 2; + + pb_skip = pb_now + s_value; + if( 0 > s_value ) { qw_remain += (-1 * s_value); } + else { qw_remain -= s_value; } + break; + case DW_OP_bra: // 0x28 + break; + case DW_OP_call2: // 0x98 + w_value = *((Word *)pb_now); + pb_now += 2; + qw_remain -= 2; + + p_exp->qw_calloffset = (QWord)w_value; + p_exp->resume.pb_resume = pb_now; + p_exp->resume.qw_remain = qw_remain; + p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_CALLING; + goto goto_DWARF_Expression_Evaluate_post; + break; + case DW_OP_call4: // 0x99 + break; + case DW_OP_call_ref: // 0x9a break; - case DW_OP_reg0: // 0x50 + // Special Operation ---- + case DW_OP_nop: // 0x96 break; + + case DW_OP_reg0: // 0x50 case DW_OP_reg1: // 0x51 - break; case DW_OP_reg2: // 0x52 - break; case DW_OP_reg3: // 0x53 - break; case DW_OP_reg4: // 0x54 - break; case DW_OP_reg5: // 0x55 - break; case DW_OP_reg6: // 0x56 - break; case DW_OP_reg7: // 0x57 - break; case DW_OP_reg8: // 0x58 - break; case DW_OP_reg9: // 0x59 - break; case DW_OP_reg10: // 0x5a - break; case DW_OP_reg11: // 0x5b - break; case DW_OP_reg12: // 0x5c - break; case DW_OP_reg13: // 0x5d - break; case DW_OP_reg14: // 0x5e - break; case DW_OP_reg15: // 0x5f - break; case DW_OP_reg16: // 0x60 - break; case DW_OP_reg17: // 0x61 - break; case DW_OP_reg18: // 0x62 - break; case DW_OP_reg19: // 0x63 - break; case DW_OP_reg20: // 0x64 - break; case DW_OP_reg21: // 0x65 - break; case DW_OP_reg22: // 0x66 - break; case DW_OP_reg23: // 0x67 - break; case DW_OP_reg24: // 0x68 - break; case DW_OP_reg25: // 0x69 - break; case DW_OP_reg26: // 0x6a - break; case DW_OP_reg27: // 0x6b - break; case DW_OP_reg28: // 0x6c - break; case DW_OP_reg29: // 0x6d - break; case DW_OP_reg30: // 0x6e - break; case DW_OP_reg31: // 0x6f break; case DW_OP_regx: // 0x90 break; + case DW_OP_piece: // 0x93 break; - case DW_OP_nop: // 0x96 - break; - case DW_OP_call2: // 0x98 - break; - case DW_OP_call4: // 0x99 - break; - case DW_OP_call_ref: // 0x9a - break; case DW_OP_bit_piece: // 0x9d break; case DW_OP_implicit_value: // 0x9e @@ -684,6 +817,9 @@ DWord } p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_REQUESTED; } + else if( NULL != p_exp->resume.pb_resume ) { + p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_RETCALL; + } else if( 0 < p_exp->dw_depth ) { p_exp->dw_status = LIBGOBLIN_DWARF_STATUS_EVALUATED; p_exp->result.qw_value = p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value; diff --git a/libgoblin/drd64_libgoblin_type_dwarf.h b/libgoblin/drd64_libgoblin_type_dwarf.h index c4f1574..51c1eb7 100644 --- a/libgoblin/drd64_libgoblin_type_dwarf.h +++ b/libgoblin/drd64_libgoblin_type_dwarf.h @@ -41,7 +41,10 @@ Comment: #define LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH 256 #define LIBGOBLIN_DWARF_STATUS_EVALUATED 0x00 -#define LIBGOBLIN_DWARF_STATUS_REQUESTED 0x01 +#define LIBGOBLIN_DWARF_STATUS_NOTEVALUATE 0x01 +#define LIBGOBLIN_DWARF_STATUS_REQUESTED 0x02 +#define LIBGOBLIN_DWARF_STATUS_CALLING 0x03 // resume stack +#define LIBGOBLIN_DWARF_STATUS_RETCALL 0x04 // resume stack #define LIBGOBLIN_DWARF_STATUS_ERROR 0x10 // bit 4-0 is REG num. (MASK: 0x1f) @@ -92,6 +95,12 @@ typedef struct { Int64 ii_value; } result; + struct { + Byte *pb_resume; + QWord qw_remain; + } resume; + + QWord qw_calloffset; DWord dw_reqsize; // for DW_OP_deref_size & DW_OP_xderef_size Ptr ptr_reference; // for DW_OP_deref(_size) & DW_OP_xderef(_size) Ptr ptr_tlsbase; // for DW_OP_form_tls_address -- 2.11.0