commit
8df7fd34e1
@ -1,23 +1,19 @@
|
|||||||
/* 7zAlloc.h -- Allocation functions
|
/* 7zAlloc.h -- Allocation functions
|
||||||
2013-03-25 : Igor Pavlov : Public domain */
|
2017-04-03 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef __7Z_ALLOC_H
|
#ifndef __7Z_ALLOC_H
|
||||||
#define __7Z_ALLOC_H
|
#define __7Z_ALLOC_H
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include "7zTypes.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
EXTERN_C_BEGIN
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *SzAlloc(void *p, size_t size);
|
void *SzAlloc(ISzAllocPtr p, size_t size);
|
||||||
void SzFree(void *p, void *address);
|
void SzFree(ISzAllocPtr p, void *address);
|
||||||
|
|
||||||
void *SzAllocTemp(void *p, size_t size);
|
void *SzAllocTemp(ISzAllocPtr p, size_t size);
|
||||||
void SzFreeTemp(void *p, void *address);
|
void SzFreeTemp(ISzAllocPtr p, void *address);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
EXTERN_C_END
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,135 +1,230 @@
|
|||||||
/* Bra.c -- Converters for RISC code
|
/* Bra.c -- Converters for RISC code
|
||||||
2010-04-16 : Igor Pavlov : Public domain */
|
2017-04-04 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
|
#include "CpuArch.h"
|
||||||
#include "Bra.h"
|
#include "Bra.h"
|
||||||
|
|
||||||
SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
||||||
{
|
{
|
||||||
SizeT i;
|
Byte *p;
|
||||||
if (size < 4)
|
const Byte *lim;
|
||||||
return 0;
|
size &= ~(size_t)3;
|
||||||
size -= 4;
|
ip += 4;
|
||||||
ip += 8;
|
p = data;
|
||||||
for (i = 0; i <= size; i += 4)
|
lim = data + size;
|
||||||
{
|
|
||||||
if (data[i + 3] == 0xEB)
|
|
||||||
{
|
|
||||||
UInt32 dest;
|
|
||||||
UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]);
|
|
||||||
src <<= 2;
|
|
||||||
if (encoding)
|
if (encoding)
|
||||||
dest = ip + (UInt32)i + src;
|
|
||||||
else
|
for (;;)
|
||||||
dest = src - (ip + (UInt32)i);
|
{
|
||||||
dest >>= 2;
|
for (;;)
|
||||||
data[i + 2] = (Byte)(dest >> 16);
|
{
|
||||||
data[i + 1] = (Byte)(dest >> 8);
|
if (p >= lim)
|
||||||
data[i + 0] = (Byte)dest;
|
return p - data;
|
||||||
|
p += 4;
|
||||||
|
if (p[-1] == 0xEB)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
UInt32 v = GetUi32(p - 4);
|
||||||
|
v <<= 2;
|
||||||
|
v += ip + (UInt32)(p - data);
|
||||||
|
v >>= 2;
|
||||||
|
v &= 0x00FFFFFF;
|
||||||
|
v |= 0xEB000000;
|
||||||
|
SetUi32(p - 4, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (p >= lim)
|
||||||
|
return p - data;
|
||||||
|
p += 4;
|
||||||
|
if (p[-1] == 0xEB)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
UInt32 v = GetUi32(p - 4);
|
||||||
|
v <<= 2;
|
||||||
|
v -= ip + (UInt32)(p - data);
|
||||||
|
v >>= 2;
|
||||||
|
v &= 0x00FFFFFF;
|
||||||
|
v |= 0xEB000000;
|
||||||
|
SetUi32(p - 4, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
||||||
{
|
{
|
||||||
SizeT i;
|
Byte *p;
|
||||||
if (size < 4)
|
const Byte *lim;
|
||||||
return 0;
|
size &= ~(size_t)1;
|
||||||
size -= 4;
|
p = data;
|
||||||
ip += 4;
|
lim = data + size - 4;
|
||||||
for (i = 0; i <= size; i += 2)
|
|
||||||
|
if (encoding)
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
UInt32 b1;
|
||||||
|
for (;;)
|
||||||
{
|
{
|
||||||
if ((data[i + 1] & 0xF8) == 0xF0 &&
|
UInt32 b3;
|
||||||
(data[i + 3] & 0xF8) == 0xF8)
|
if (p > lim)
|
||||||
|
return p - data;
|
||||||
|
b1 = p[1];
|
||||||
|
b3 = p[3];
|
||||||
|
p += 2;
|
||||||
|
b1 ^= 8;
|
||||||
|
if ((b3 & b1) >= 0xF8)
|
||||||
|
break;
|
||||||
|
}
|
||||||
{
|
{
|
||||||
UInt32 dest;
|
UInt32 v =
|
||||||
UInt32 src =
|
((UInt32)b1 << 19)
|
||||||
(((UInt32)data[i + 1] & 0x7) << 19) |
|
+ (((UInt32)p[1] & 0x7) << 8)
|
||||||
((UInt32)data[i + 0] << 11) |
|
+ (((UInt32)p[-2] << 11))
|
||||||
(((UInt32)data[i + 3] & 0x7) << 8) |
|
+ (p[0]);
|
||||||
(data[i + 2]);
|
|
||||||
|
|
||||||
src <<= 1;
|
p += 2;
|
||||||
if (encoding)
|
{
|
||||||
dest = ip + (UInt32)i + src;
|
UInt32 cur = (ip + (UInt32)(p - data)) >> 1;
|
||||||
else
|
v += cur;
|
||||||
dest = src - (ip + (UInt32)i);
|
}
|
||||||
dest >>= 1;
|
|
||||||
|
p[-4] = (Byte)(v >> 11);
|
||||||
|
p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));
|
||||||
|
p[-2] = (Byte)v;
|
||||||
|
p[-1] = (Byte)(0xF8 | (v >> 8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
UInt32 b1;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
UInt32 b3;
|
||||||
|
if (p > lim)
|
||||||
|
return p - data;
|
||||||
|
b1 = p[1];
|
||||||
|
b3 = p[3];
|
||||||
|
p += 2;
|
||||||
|
b1 ^= 8;
|
||||||
|
if ((b3 & b1) >= 0xF8)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
UInt32 v =
|
||||||
|
((UInt32)b1 << 19)
|
||||||
|
+ (((UInt32)p[1] & 0x7) << 8)
|
||||||
|
+ (((UInt32)p[-2] << 11))
|
||||||
|
+ (p[0]);
|
||||||
|
|
||||||
|
p += 2;
|
||||||
|
{
|
||||||
|
UInt32 cur = (ip + (UInt32)(p - data)) >> 1;
|
||||||
|
v -= cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000));
|
||||||
|
SetUi16(p - 2, (UInt16)(v | 0xF800));
|
||||||
|
*/
|
||||||
|
|
||||||
data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7));
|
p[-4] = (Byte)(v >> 11);
|
||||||
data[i + 0] = (Byte)(dest >> 11);
|
p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7));
|
||||||
data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7));
|
p[-2] = (Byte)v;
|
||||||
data[i + 2] = (Byte)dest;
|
p[-1] = (Byte)(0xF8 | (v >> 8));
|
||||||
i += 2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
||||||
{
|
{
|
||||||
SizeT i;
|
Byte *p;
|
||||||
if (size < 4)
|
const Byte *lim;
|
||||||
return 0;
|
size &= ~(size_t)3;
|
||||||
size -= 4;
|
ip -= 4;
|
||||||
for (i = 0; i <= size; i += 4)
|
p = data;
|
||||||
|
lim = data + size;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
{
|
{
|
||||||
if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1)
|
for (;;)
|
||||||
{
|
{
|
||||||
UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) |
|
if (p >= lim)
|
||||||
((UInt32)data[i + 1] << 16) |
|
return p - data;
|
||||||
((UInt32)data[i + 2] << 8) |
|
p += 4;
|
||||||
((UInt32)data[i + 3] & (~3));
|
/* if ((v & 0xFC000003) == 0x48000001) */
|
||||||
|
if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1)
|
||||||
UInt32 dest;
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
UInt32 v = GetBe32(p - 4);
|
||||||
if (encoding)
|
if (encoding)
|
||||||
dest = ip + (UInt32)i + src;
|
v += ip + (UInt32)(p - data);
|
||||||
else
|
else
|
||||||
dest = src - (ip + (UInt32)i);
|
v -= ip + (UInt32)(p - data);
|
||||||
data[i + 0] = (Byte)(0x48 | ((dest >> 24) & 0x3));
|
v &= 0x03FFFFFF;
|
||||||
data[i + 1] = (Byte)(dest >> 16);
|
v |= 0x48000000;
|
||||||
data[i + 2] = (Byte)(dest >> 8);
|
SetBe32(p - 4, v);
|
||||||
data[i + 3] &= 0x3;
|
|
||||||
data[i + 3] |= dest;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
||||||
{
|
{
|
||||||
UInt32 i;
|
Byte *p;
|
||||||
if (size < 4)
|
const Byte *lim;
|
||||||
return 0;
|
size &= ~(size_t)3;
|
||||||
size -= 4;
|
ip -= 4;
|
||||||
for (i = 0; i <= size; i += 4)
|
p = data;
|
||||||
{
|
lim = data + size;
|
||||||
if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) ||
|
|
||||||
(data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0))
|
for (;;)
|
||||||
{
|
{
|
||||||
UInt32 src =
|
for (;;)
|
||||||
((UInt32)data[i + 0] << 24) |
|
{
|
||||||
((UInt32)data[i + 1] << 16) |
|
if (p >= lim)
|
||||||
((UInt32)data[i + 2] << 8) |
|
return p - data;
|
||||||
((UInt32)data[i + 3]);
|
/*
|
||||||
UInt32 dest;
|
v = GetBe32(p);
|
||||||
|
p += 4;
|
||||||
src <<= 2;
|
m = v + ((UInt32)5 << 29);
|
||||||
|
m ^= (UInt32)7 << 29;
|
||||||
|
m += (UInt32)1 << 22;
|
||||||
|
if ((m & ((UInt32)0x1FF << 23)) == 0)
|
||||||
|
break;
|
||||||
|
*/
|
||||||
|
p += 4;
|
||||||
|
if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) ||
|
||||||
|
(p[-4] == 0x7F && (p[-3] >= 0xC0)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
UInt32 v = GetBe32(p - 4);
|
||||||
|
v <<= 2;
|
||||||
if (encoding)
|
if (encoding)
|
||||||
dest = ip + i + src;
|
v += ip + (UInt32)(p - data);
|
||||||
else
|
else
|
||||||
dest = src - (ip + i);
|
v -= ip + (UInt32)(p - data);
|
||||||
dest >>= 2;
|
|
||||||
|
|
||||||
dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000;
|
|
||||||
|
|
||||||
data[i + 0] = (Byte)(dest >> 24);
|
v &= 0x01FFFFFF;
|
||||||
data[i + 1] = (Byte)(dest >> 16);
|
v -= (UInt32)1 << 24;
|
||||||
data[i + 2] = (Byte)(dest >> 8);
|
v ^= 0xFF000000;
|
||||||
data[i + 3] = (Byte)dest;
|
v >>= 2;
|
||||||
|
v |= 0x40000000;
|
||||||
|
SetBe32(p - 4, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
@ -1,69 +1,53 @@
|
|||||||
/* BraIA64.c -- Converter for IA-64 code
|
/* BraIA64.c -- Converter for IA-64 code
|
||||||
2013-11-12 : Igor Pavlov : Public domain */
|
2017-01-26 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
|
#include "CpuArch.h"
|
||||||
#include "Bra.h"
|
#include "Bra.h"
|
||||||
|
|
||||||
static const Byte kBranchTable[32] =
|
|
||||||
{
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
4, 4, 6, 6, 0, 0, 7, 7,
|
|
||||||
4, 4, 0, 0, 4, 4, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding)
|
||||||
{
|
{
|
||||||
SizeT i;
|
SizeT i;
|
||||||
if (size < 16)
|
if (size < 16)
|
||||||
return 0;
|
return 0;
|
||||||
size -= 16;
|
size -= 16;
|
||||||
for (i = 0; i <= size; i += 16)
|
i = 0;
|
||||||
|
do
|
||||||
{
|
{
|
||||||
UInt32 instrTemplate = data[i] & 0x1F;
|
unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3;
|
||||||
UInt32 mask = kBranchTable[instrTemplate];
|
if (m)
|
||||||
UInt32 bitPos = 5;
|
|
||||||
int slot;
|
|
||||||
for (slot = 0; slot < 3; slot++, bitPos += 41)
|
|
||||||
{
|
{
|
||||||
UInt32 bytePos, bitRes;
|
m++;
|
||||||
UInt64 instruction, instNorm;
|
do
|
||||||
int j;
|
|
||||||
if (((mask >> slot) & 1) == 0)
|
|
||||||
continue;
|
|
||||||
bytePos = (bitPos >> 3);
|
|
||||||
bitRes = bitPos & 0x7;
|
|
||||||
instruction = 0;
|
|
||||||
for (j = 0; j < 6; j++)
|
|
||||||
instruction += (UInt64)data[i + j + bytePos] << (8 * j);
|
|
||||||
|
|
||||||
instNorm = instruction >> bitRes;
|
|
||||||
if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0)
|
|
||||||
{
|
{
|
||||||
UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF);
|
Byte *p = data + (i + (size_t)m * 5 - 8);
|
||||||
UInt32 dest;
|
if (((p[3] >> m) & 15) == 5
|
||||||
src |= ((UInt32)(instNorm >> 36) & 1) << 20;
|
&& (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0)
|
||||||
|
{
|
||||||
src <<= 4;
|
unsigned raw = GetUi32(p);
|
||||||
|
unsigned v = raw >> m;
|
||||||
|
v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3);
|
||||||
|
|
||||||
|
v <<= 4;
|
||||||
if (encoding)
|
if (encoding)
|
||||||
dest = ip + (UInt32)i + src;
|
v += ip + (UInt32)i;
|
||||||
else
|
else
|
||||||
dest = src - (ip + (UInt32)i);
|
v -= ip + (UInt32)i;
|
||||||
|
v >>= 4;
|
||||||
dest >>= 4;
|
|
||||||
|
v &= 0x1FFFFF;
|
||||||
instNorm &= ~((UInt64)(0x8FFFFF) << 13);
|
v += 0x700000;
|
||||||
instNorm |= ((UInt64)(dest & 0xFFFFF) << 13);
|
v &= 0x8FFFFF;
|
||||||
instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20));
|
raw &= ~((UInt32)0x8FFFFF << m);
|
||||||
|
raw |= (v << m);
|
||||||
instruction &= (1 << bitRes) - 1;
|
SetUi32(p, raw);
|
||||||
instruction |= (instNorm << bitRes);
|
}
|
||||||
for (j = 0; j < 6; j++)
|
|
||||||
data[i + j + bytePos] = (Byte)(instruction >> (8 * j));
|
|
||||||
}
|
}
|
||||||
|
while (++m <= 4);
|
||||||
}
|
}
|
||||||
|
i += 16;
|
||||||
}
|
}
|
||||||
|
while (i <= size);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue