Esempio n. 1
0
u8 EncodeDisp(u32 disp,x86_mrm_t* to,u8 flags)
{
	//[reg+sdisp8] or [reg+sdisp32]
	//sdisp32 support only for now , sdisp8 for later
	if (flags&1)
	{
		if (IsS8(disp))
		{
			to->flags|=2;
			to->disp=disp;
			if (flags&4)
				return 0;
			else
				return make_modrm(1,0);
		}
	}
	if (flags&2)
	{
		to->flags|=4;
		to->disp=disp;
		if (flags&4)
			return 0;
		else
			return make_modrm(2,0);
	}
	verify(false);
	return 0;
}
Esempio n. 2
0
	void Apply(u8* base)
	{
		for (u32 i=0;i<externs.size();i++)
		{
			u8* dest=(u8*)externs[i].dst;

			u8* code_offset=base+externs[i].offs;
			u8* diff_offset=code_offset+externs[i].size;

			u32 diff=(u32)(dest-diff_offset);
			if (externs[i].size==1)
			{
				verify(IsS8(diff));
				*code_offset=(u8)diff;
			}
			else if (externs[i].size==2)
			{
				*(u16*)code_offset=(u16)diff;
			}
			else if (externs[i].size==4)
			{
				*(u32*)code_offset=(u32)diff;
			}
		}
	}
Esempio n. 3
0
//wut ?
void x86_block::ApplyPatches(u8* base)
{
	for (u32 i=0;i<patches.size();i++)
	{
		u8* dest=(u8*)patches[i].dest;

		u8* code_offset=base+patches[i].offset;
		u8* diff_offset=code_offset+(patches[i].type&0xF);

		if (patches[i].type&16)
		{
			if (patches[i].lbl->owner==this)
				dest = base + patches[i].lbl->target_opcode;
			else
				dest = patches[i].lbl->owner->x86_buff + patches[i].lbl->target_opcode;

		}

		u32 diff=(u32)(dest-diff_offset);
		if ((patches[i].type&0xF)==1)
		{
			verify(IsS8(diff));
			*code_offset=(u8)diff;
		}
		else if ((patches[i].type&0xF)==2)
		{
			*(u16*)code_offset=(u16)diff;
		}
		else if ((patches[i].type&0xF)==4)
		{
			*(u32*)code_offset=(u32)diff;
		}
	}
}
Esempio n. 4
0
//wut ?
void ppc_block::ApplyPatches(u8* base)
{
	for (u32 i=0;i<patches.size();i++)
	{
		u8* dest=(u8*)patches[i].dest;

		u8* code_offset=base+patches[i].offset;
		u8* diff_offset=code_offset;//gli wtf?!? +(patches[i].type&0xF);

		if (patches[i].type&16)
		{
			if (patches[i].lbl->owner==this)
				dest = base + patches[i].lbl->target_opcode;
			else
				dest = patches[i].lbl->owner->ppc_buff + patches[i].lbl->target_opcode;

		}

		s32 diff=(s32)(dest-diff_offset);
		
		if ((patches[i].type&0xF)==1)
		{
			verify(IsS8(diff));
			*code_offset=(u8)diff;
		}
		else if ((patches[i].type&0xF)==2)
		{
			*(u16*)code_offset=(u16)diff;
		}
		else if ((patches[i].type&0xF)==4)
		{
			*(u32*)code_offset=(u32)diff;
		}
		else if ((patches[i].type&0xF)==5) // 5 is for BC
		{
			verify(!(diff&3));
			verify(diff<0x10000);
			*(u32*)code_offset|=(u32)diff&0xffff;
		}
		else if ((patches[i].type&0xF)==6) // 6 is for B
		{
			verify(!(diff&3));
			verify(diff<0x04000000);
			*(u32*)code_offset|=(u32)diff&0x03ffffff;
		}
	}

	/* process branches */
	u32 i;
	PowerPC_instr op,newop;
	u32 opaddr,jmpaddr;
	for(i=0;i<ppc_indx;i+=4)
	{
		opaddr=(u32)&ppc_buff[i];
		op=*(u32*)&ppc_buff[i];

		jmpaddr=(op&0x03ffffff)-(opaddr&0x7fffffff);
		
		if((op&0xfc000000) == 0) // b
		{
			//printf("b %08x %08x %08x\n",opaddr,op,jmpaddr);
			GEN_B(newop,jmpaddr>>2,0,0);
			*(PowerPC_instr*)opaddr=newop;
		}
		else if((op&0xfc000000) == 1<<26) // bl