Files
reactos/rosapps/devutils/cputointel/From/PPC/PPCBrain.c
Magnus Olsen 7c96cb069a adding blr opcode (can not found it in the ibm or motorala doc, the primary opcode refens to addi).
now we can disambler two opcode the li and blr, add blr to my own asm langues. 

svn path=/trunk/; revision=25448
2007-01-14 12:10:53 +00:00

135 lines
4.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "PPCBrain.h"
#include "PPC.h"
#include "../../misc.h"
/*
* DummyBrain is example how you create you own cpu brain to translate from
* cpu to intel assembler, I have not add DummyBrain to the loader it is not
* need it in our example. When you write you own brain, it must be setup in
* misc.c function LoadPFileImage and PEFileStart, PEFileStart maybe does not
* need the brain you have writen so you do not need setup it there then.
*
* input param:
* cpu_buffer : the memory buffer with loaded program we whant translate
* cpu_pos : the positions in the cpu_buffer
* cpu_size : the alloced memory size of the cpu_buffer
* BaseAddress : the virtual memory address we setup to use.
* cpuarch : the sub arch for the brain, example if it exists more one
* cpu with same desgin but few other opcode or extend opcode
* outfp : the output file pointer
*
* mode : if we should run disambler of this binary or
* translate it, Disambler will not calc the
* the row name right so we simple give each
row a name. In translations mode we run a
* analys so we getting better optimzing and
* only row name there we need.
* value for mode are :
* 0 = disambler mode
* 1 = translate mode intel
*
* return value
* 0 : Ok
* 1 : unimplemt
* 2 : Unkonwn Opcode
* 3 : unimplement cpu
* 4 : unknown machine
*/
CPU_INT PPCBrain( CPU_BYTE *cpu_buffer,
CPU_UNINT cpu_pos,
CPU_UNINT cpu_size,
CPU_UNINT BaseAddress,
CPU_UNINT cpuarch,
FILE *outfp,
CPU_INT mode)
{
CPU_UNINT cpu_oldpos;
CPU_INT cpuint;
CPU_INT retcode = 0;
CPU_INT retsize;
/* 0x12 = 0001 0010,
0x10 = 0001 0000
0x13 = 0001 0011
0x20 = 0010 0000 0 0000 0010 2
0x80 = 1000 0000 0 0000 1000 8
0x4e = 0010 1110 E 1110 0010 2
0x20 00 80 4e
0010 0000 0000 0000 1000 0000 0100 1110
*/
/* now we start the process */
while (cpu_pos<cpu_size)
{
cpu_oldpos = cpu_pos;
cpuint = GetData32Le(&cpu_buffer[cpu_pos]);
///* Add */
//if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_Addx))) == ConvertBitToByte32(cpuPPCInit_Addx))
//{
// retsize = PPC_Addx( outfp, cpu_buffer, cpu_pos, cpu_size,
// BaseAddress, cpuarch, mode);
// if (retsize<0)
// retcode = 1;
// else
// cpu_pos += retsize;
//}
/* 0x38 Ld aslo known as Li */
if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_Ld))) == ConvertBitToByte32(cpuPPCInit_Ld))
{
retsize = PPC_Ld( outfp, cpu_buffer, cpu_pos, cpu_size,
BaseAddress, cpuarch, mode);
if (retsize<0)
retcode = 1;
else
cpu_pos += retsize;
}
/* hard code the op blr */
if ((cpuint - (cpuint & GetMaskByte32(cpuPPCInit_Blr))) == ConvertBitToByte32(cpuPPCInit_Blr))
{
retsize = PPC_Blr( outfp, cpu_buffer, cpu_pos, cpu_size,
BaseAddress, cpuarch, mode);
if (retsize<0)
retcode = 1;
else
cpu_pos += retsize;
}
/* Found all Opcode and breakout and return no error found */
if (cpu_pos >=cpu_size)
{
break;
}
/* Check if we have found a cpu opcode */
if (cpu_oldpos == cpu_pos)
{
if (retcode == 0)
{
/* no unimplement error where found so we return a msg for unknown opcode */
printf("Unkonwn Opcode found at 0x%8x opcode 0x%2x\n",cpu_oldpos+BaseAddress,(unsigned int)cpu_buffer[cpu_oldpos]);
retcode = 2;
}
}
/* Erorro Found ? */
if (retcode!=0)
{
/* Erorro Found break and return the error code */
break;
}
}
return retcode;
}