#include #include #include "PPC.h" #include "../../misc.h" #include "../../any_op.h" /* reg r0-r31 r3 = eax */ /* cpuDummyInit_Add * Input param : * out : The file pointer that we write to (the output file to intel asm) * cpu_buffer : The memory buffer we have our binary code that we whant convert * cpu_pos : Current positions in the cpu_buffer * cpu_size : The memory size of the cpu_buffer * BaseAddress : The base address you whant the binay file should run from * cpuarch : if it exists diffent cpu from a manufactor like pentium, * pentinum-mmx so on, use this flag to specify which type * of cpu you whant or do not use it if it does not exists * other or any sub model. * * Return value : * value -1 : unimplement * value 0 : wrong opcode or not vaild opcode * value +1 and higher : who many byte we should add to cpu_pos */ /* Get Dest register */ #define PPC_GetBitArrayDstReg(opcode) (((opcode & 0x3) << 3) | ((opcode & 0xE000) >> 13)) /* Get Source register */ CPU_UNINT PPC_GetBitArrayBto31xx(CPU_UNINT opcode) { CPU_INT x1; /* FIXME make it to a macro * not tested to 100% yet */ x1 = ((opcode & 0x1F00)>>8); return x1; } CPU_UNINT PPC_GetBitArrayBto31(CPU_UNINT opcode) { CPU_INT x1; /* FIXME make it to a macro * not tested to 100% yet */ x1 = ((opcode & 0xFFFF0000)>>16); return x1; } CPU_INT PPC_Blr( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch) { BaseAddress +=cpu_pos; /* own translatons langues */ if (AllocAny()!=0) /* alloc memory for pMyBrainAnalys */ { return -1; } pMyBrainAnalys->op = OP_ANY_ret; pMyBrainAnalys->memAdr=BaseAddress; return 4; } CPU_INT PPC_Li( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch) { CPU_UNINT opcode; opcode = GetData32Le(cpu_buffer); BaseAddress +=cpu_pos; /* own translatons langues */ if (AllocAny()!=0) /* alloc memory for pMyBrainAnalys */ { return -1; } pMyBrainAnalys->op = OP_ANY_mov; pMyBrainAnalys->type= 8 + 16; /* 8 dst reg, 16 imm */ pMyBrainAnalys->src_size = 16; pMyBrainAnalys->src = PPC_GetBitArrayBto31(opcode); pMyBrainAnalys->dst = PPC_GetBitArrayDstReg(opcode); pMyBrainAnalys->memAdr=BaseAddress; return 4; } CPU_INT PPC_Stwu( FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress, CPU_UNINT cpuarch) { /* r1 store at -0x20(r1) */ CPU_UNINT opcode; CPU_SHORT tmp = 0; opcode = GetData32Le(cpu_buffer); BaseAddress +=cpu_pos; /* own translatons langues */ if (AllocAny()!=0) /* alloc memory for pMyBrainAnalys */ { return -1; } tmp = _byteswap_ushort( ((CPU_SHORT)((opcode >> 16) & 0xffff))); pMyBrainAnalys->op = OP_ANY_mov; pMyBrainAnalys->type= 2 + 64 + 128; pMyBrainAnalys->src_size = 32; pMyBrainAnalys->dst_size = 32; pMyBrainAnalys->src = PPC_GetBitArrayBto31xx(opcode); pMyBrainAnalys->dst = PPC_GetBitArrayDstReg(opcode); pMyBrainAnalys-> dst_extra = tmp; pMyBrainAnalys->memAdr=BaseAddress; return 4; }