hacking PackLinuxElf64amd

This commit is contained in:
John Reiser 2006-07-14 19:43:38 -07:00
parent ef52ebb529
commit e64555aca0
4 changed files with 462 additions and 199 deletions

View File

@ -313,7 +313,7 @@ PackLinuxElf64amd::PackLinuxElf64amd(InputFile *f)
e_machine = Elf64_Ehdr::EM_X86_64;
ei_class = Elf64_Ehdr::ELFCLASS64;
ei_data = Elf64_Ehdr::ELFDATA2LSB;
ei_osabi = Elf32_Ehdr::ELFOSABI_NONE;
ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX;
}
PackLinuxElf64amd::~PackLinuxElf64amd()
@ -386,7 +386,7 @@ PackLinuxElf32x86::buildLinuxLoader(
// This adds the definition to the "library", to be used later.
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
// FIXME: memory leak delete [] cprLoader;
delete [] cprLoader;
int const n_mru = ft->n_mru; // FIXME: belongs to filter? packerf?
@ -487,6 +487,7 @@ PackLinuxElf32::buildLinuxLoader(
Filter const */*ft*/
)
{
initLoader(proto, szproto);
{
int const MAX_LOADER_LEN = 8000;
int *const eof_empty = new int[MAX_LOADER_LEN/sizeof(int)];
@ -546,13 +547,7 @@ PackLinuxElf64::buildLinuxLoader(
Filter const */*ft*/
)
{
{
int const MAX_LOADER_LEN = 8000;
int *const eof_empty = new int[MAX_LOADER_LEN/sizeof(int)];
eof_empty[0] = -1;
initLoader(eof_empty, MAX_LOADER_LEN, 0, 0);
delete[] eof_empty;
}
initLoader(proto, szproto);
struct b_info h; memset(&h, 0, sizeof(h));
unsigned fold_hdrlen = 0;
@ -585,8 +580,6 @@ PackLinuxElf64::buildLinuxLoader(
linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr);
delete [] cprLoader;
addStubEntrySections(proto, szproto);
addLoader("FOLDEXEC", NULL);
freezeLoader();
linker->relocate();
@ -1484,7 +1477,6 @@ void PackLinuxElf64amd::pack3(OutputFile *fo, Filter &ft)
#define PAGE_MASK (~0u<<12)
#define PAGE_SIZE (-PAGE_MASK)
upx_byte *const p = getLoader();
lsize = getLoaderSize();
acc_uint64l_t const lo_va_user = 0x400000; // XXX
acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr;
@ -1523,17 +1515,16 @@ void PackLinuxElf64amd::pack3(OutputFile *fo, Filter &ft)
adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary
adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary
// patch in order of descending address
patch_le32(p,lsize,"LENX", len0 - hlen);
patch_le32(p,lsize,"ADRX", adrx); // compressed input for eXpansion
linker->defineSymbol("LENX", len0 - hlen);
linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion
patch_le32(p,lsize,"CNTC", cntc); // count for copy
patch_le32(p,lsize,"LENU", lenu); // len for unmap
patch_le32(p,lsize,"ADRC", adrc); // addr for copy
patch_le32(p,lsize,"ADRU", adru); // addr for unmap
patch_le32(p,lsize,"JMPU", 12 + lo_va_user); // trampoline for unmap
patch_le32(p,lsize,"LENM", lenm); // len for map
patch_le32(p,lsize,"ADRM", adrm); // addr for map
linker->defineSymbol("CNTC", cntc); // count for copy
linker->defineSymbol("LENU", lenu); // len for unmap
linker->defineSymbol("ADRC", adrc); // addr for copy
linker->defineSymbol("ADRU", adru); // addr for unmap
linker->defineSymbol("JMPU", 12 + lo_va_user); // trampoline for unmap
linker->defineSymbol("LENM", lenm); // len for map
linker->defineSymbol("ADRM", adrm); // addr for map
#undef PAGE_SIZE
#undef PAGE_MASK

View File

@ -1,4 +1,4 @@
/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 3066 (0xbfa) bytes
/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 4969 (0x1369) bytes
This file is part of the UPX executable compressor.
@ -27,17 +27,17 @@
*/
#define LINUX_ELF64AMD_LOADER_SIZE 3066
#define LINUX_ELF64AMD_LOADER_ADLER32 0x7a3e6996
#define LINUX_ELF64AMD_LOADER_CRC32 0x5bbfae22
#define LINUX_ELF64AMD_LOADER_SIZE 4969
#define LINUX_ELF64AMD_LOADER_ADLER32 0x68fb7b22
#define LINUX_ELF64AMD_LOADER_CRC32 0xae9a2117
unsigned char linux_elf64amd_loader[3066] = {
unsigned char linux_elf64amd_loader[4969] = {
127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */
1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */
0, 0, 0, 0, 0, 0, 0, 0, 40, 3, 0, 0, 0, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 6, 0, 3, 0, /* 0x 30 */
232,178, 2, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 72,137,254, /* 0x 40 */
72,137,215, 49,219, 49,201, 72,131,205,255,232,129, 1, 0, 0, /* 0x 50 */
0, 0, 0, 0, 0, 0, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, /* 0x 20 */
0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 12, 0, 9, 0, /* 0x 30 */
232, 0, 0, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 72,137,254, /* 0x 40 */
72,137,215, 49,219, 49,201, 72,131,205,255,232, 0, 0, 0, 0, /* 0x 50 */
1,219,116, 2,243,195,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 60 */
243,195, 72,141, 4, 47,131,249, 5,138, 16,118, 33, 72,131,253, /* 0x 70 */
252,119, 27,131,233, 4,139, 16, 72,131,192, 4,131,233, 4,137, /* 0x 80 */
@ -48,180 +48,299 @@ unsigned char linux_elf64amd_loader[3066] = {
200, 65,255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, /* 0x d0 */
30, 72,131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 29, /* 0x e0 */
193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, /* 0x f0 */
244, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 100 */
0, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 100 */
8,139, 30, 72,131,238,252, 17,219,114, 40,255,193, 1,219,117, /* 0x 110 */
8,139, 30, 72,131,238,252, 17,219,114, 24, 65,255,211, 17,201, /* 0x 120 */
1,219,117, 8,139, 30, 72,131,238,252, 17,219,115,237,131,193, /* 0x 130 */
2,235, 5, 65,255,211, 17,201, 72,129,253, 0,251,255,255,131, /* 0x 140 */
209, 2,232, 27,255,255,255,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 150 */
209, 2,232, 0, 0, 0, 0,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 150 */
72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x 160 */
72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, /* 0x 170 */
17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 180 */
115,235,131,232, 3,114, 19,193,224, 8, 15,182,210, 9,208, 72, /* 0x 190 */
255,198,131,240,255,116, 81, 72, 99,232,141, 65, 1, 65,255,211, /* 0x 1a0 */
17,201, 65,255,211, 17,201,117, 24,137,193,131,192, 2, 65,255, /* 0x 1b0 */
211, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17,219,115, /* 0x 1c0 */
237, 72,129,253, 0,243,255,255, 17,193,232,147,254,255,255,235, /* 0x 1d0 */
135,252, 65, 91, 65,131,248, 8, 15,132,202,254,255,255, 65,131, /* 0x 1e0 */
248, 2, 15,132,112,255,255,255, 89, 72,137,240, 72, 41,200, 90, /* 0x 1f0 */
72, 41,215, 89,137, 57, 91, 93,195, 10, 36, 73,100, 58, 32, 85, /* 0x 200 */
80, 88, 32, 40, 67, 41, 32, 49, 57, 57, 54, 45, 50, 48, 48, 54, /* 0x 210 */
32,116,104,101, 32, 85, 80, 88, 32, 84,101, 97,109, 46, 32, 65, /* 0x 220 */
108,108, 32, 82,105,103,104,116,115, 32, 82,101,115,101,114,118, /* 0x 230 */
101,100, 46, 32,104,116,116,112, 58, 47, 47,117,112,120, 46,115, /* 0x 240 */
102, 46,110,101,116, 32, 36, 10, 0,104, 30, 0, 0, 0, 90,232, /* 0x 250 */
30, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, 67,124, 80, 82, /* 0x 260 */
79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105,108,101,100, 46, /* 0x 270 */
10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106,127, 95,106, 60, /* 0x 280 */
88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90,190, 0, 0, 0, /* 0x 290 */
0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, 5, 57,199,117, /* 0x 2a0 */
168,104, 0, 0, 0, 0,104, 0, 0, 0, 0,190, 0, 0, 0, 0, /* 0x 2b0 */
104, 0, 0, 0, 0,185, 0, 0, 0, 0,104, 0, 0, 0, 0,104, /* 0x 2c0 */
0, 0, 0, 0,137,250, 41,242, 1,213, 1,211,252,243, 72,165, /* 0x 2d0 */
151,137,222, 80,146,173, 80, 72,137,225,173,151,173, 68, 15,182, /* 0x 2e0 */
192,135,254,255,213, 89,195, 93,232,150,255,255,255, 0, 46,115, /* 0x 2f0 */
121,109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115, /* 0x 300 */
104,115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 76, 69, 88, /* 0x 310 */
69, 67, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 320 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 330 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 340 */
115,235,131,232, 3,114, 23,193,224, 8, 15,182,210, 9,208, 72, /* 0x 190 */
255,198,131,240,255, 15,132, 0, 0, 0, 0, 72, 99,232,141, 65, /* 0x 1a0 */
1, 65,255,211, 17,201, 65,255,211, 17,201,117, 24,137,193,131, /* 0x 1b0 */
192, 2, 65,255,211, 17,201, 1,219,117, 8,139, 30, 72,131,238, /* 0x 1c0 */
252, 17,219,115,237, 72,129,253, 0,243,255,255, 17,193,232, 0, /* 0x 1d0 */
0, 0, 0,235,131,252, 65, 91, 65,131,248, 8, 15,132, 0, 0, /* 0x 1e0 */
0, 0, 65,131,248, 2, 15,132, 0, 0, 0, 0, 89, 72,137,240, /* 0x 1f0 */
72, 41,200, 90, 72, 41,215, 89,137, 57, 91, 93,195, 10, 36, 73, /* 0x 200 */
100, 58, 32, 85, 80, 88, 32, 40, 67, 41, 32, 49, 57, 57, 54, 45, /* 0x 210 */
50, 48, 48, 54, 32,116,104,101, 32, 85, 80, 88, 32, 84,101, 97, /* 0x 220 */
109, 46, 32, 65,108,108, 32, 82,105,103,104,116,115, 32, 82,101, /* 0x 230 */
115,101,114,118,101,100, 46, 32,104,116,116,112, 58, 47, 47,117, /* 0x 240 */
112,120, 46,115,102, 46,110,101,116, 32, 36, 10, 0,104, 30, 0, /* 0x 250 */
0, 0, 90,232, 30, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, /* 0x 260 */
67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, /* 0x 270 */
108,101,100, 46, 10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106, /* 0x 280 */
127, 95,106, 60, 88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90, /* 0x 290 */
190, 0, 0, 0, 0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, /* 0x 2a0 */
5, 57,199,117,168,104, 0, 0, 0, 0,104, 0, 0, 0, 0,190, /* 0x 2b0 */
0, 0, 0, 0,104, 0, 0, 0, 0,185, 0, 0, 0, 0,104, 0, /* 0x 2c0 */
0, 0, 0,104, 0, 0, 0, 0,137,250, 41,242, 1,213, 1,211, /* 0x 2d0 */
252,243, 72,165,151,137,222, 80,146,173, 80, 72,137,225,173,151, /* 0x 2e0 */
173, 68, 15,182,192,135,254,255,213, 89,195,204, 93,232,149,255, /* 0x 2f0 */
255,255, 0, 46,115,121,109,116, 97, 98, 0, 46,115,116,114,116, /* 0x 300 */
97, 98, 0, 46,115,104,115,116,114,116, 97, 98, 0, 46,114,101, /* 0x 310 */
108, 97, 76, 69, 88, 69, 67, 48, 48, 48, 0, 46,114,101,108, 97, /* 0x 320 */
78, 82, 86, 50, 69, 0, 46,114,101,108, 97, 78, 82, 86, 50, 66, /* 0x 330 */
0, 46,114,101,108, 97, 76, 69, 88, 69, 67, 48, 53, 48, 0, 0, /* 0x 340 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 350 */
0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, /* 0x 360 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 360 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 370 */
64, 0, 0, 0, 0, 0, 0, 0,189, 2, 0, 0, 0, 0, 0, 0, /* 0x 380 */
0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 390 */
0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, /* 0x 3a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3b0 */
0, 6, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, /* 0x 3c0 */
4, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 3d0 */
24, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, /* 0x 3e0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3f0 */
253, 2, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, /* 0x 400 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 410 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, /* 0x 420 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 430 */
168, 4, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, /* 0x 440 */
5, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* 0x 450 */
24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, /* 0x 460 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 470 */
200, 5, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, /* 0x 480 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 490 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4b0 */
0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4c0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, /* 0x 4d0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4e0 */
8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4f0 */
0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, /* 0x 500 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 510 */
18, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 520 */
0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 16, 0, 0, 0, /* 0x 530 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 540 */
28, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 550 */
0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 16, 0, 0, 0, /* 0x 560 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 570 */
38, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 580 */
0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 16, 0, 0, 0, /* 0x 590 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5a0 */
48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5b0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x 5c0 */
65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x 5d0 */
68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x 5e0 */
84, 67, 0, 65, 68, 82, 88, 0, 76, 69, 78, 88, 0, 0, 0, 0, /* 0x 5f0 */
85, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, /* 0x 600 */
0, 0, 0, 0, 0, 0, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0, /* 0x 610 */
10, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 620 */
114, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 5, 0, 0, 0, /* 0x 630 */
0, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, /* 0x 640 */
10, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 650 */
124, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, /* 0x 660 */
0, 0, 0, 0, 0, 0, 0, 0,129, 2, 0, 0, 0, 0, 0, 0, /* 0x 670 */
10, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 680 */
134, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, /* 0x 690 */
0, 0, 0, 0, 0, 0, 0, 0,139, 2, 0, 0, 0, 0, 0, 0, /* 0x 6a0 */
10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6b0 */
144, 2, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, /* 0x 6c0 */
0, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x 6d0 */
54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x 6e0 */
114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x 6f0 */
32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x 700 */
54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x 710 */
73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 720 */
32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x 730 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x 740 */
65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 750 */
70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x 760 */
70,108, 97,103,115, 10, 32, 32, 48, 32, 76, 69, 88, 69, 67, 48, /* 0x 770 */
48, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 50, 98,100, /* 0x 780 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 790 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 7a0 */
48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x 7b0 */
50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x 7c0 */
82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x 7d0 */
83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, /* 0x 7e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x 7f0 */
32, 32, 32, 32,100, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, /* 0x 800 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 810 */
32, 76, 69, 88, 69, 67, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, /* 0x 820 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, /* 0x 830 */
32, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, 48, 48, 48, 48, /* 0x 840 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, /* 0x 850 */
97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 860 */
48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x 870 */
68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 880 */
48, 48, 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x 890 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x 8a0 */
32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 8b0 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 77, 10, 48, 48, /* 0x 8c0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x 8d0 */
32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, /* 0x 8e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 74, 77, /* 0x 8f0 */
80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 900 */
48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, /* 0x 910 */
42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 920 */
48, 48, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 930 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 940 */
32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 950 */
48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, 10, 48, 48, 48, /* 0x 960 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x 970 */
32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x 980 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, /* 0x 990 */
85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9a0 */
48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, /* 0x 9b0 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9c0 */
48, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9d0 */
48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 9e0 */
42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x 9f0 */
48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 88, 10, 48, 48, 48, 48, /* 0x a00 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, /* 0x a10 */
32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, /* 0x a20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 88, /* 0x a30 */
10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, /* 0x a40 */
67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 69, 88, 69, 67, /* 0x a50 */
48, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, /* 0x a60 */
32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x a70 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x a80 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 53, 53, /* 0x a90 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x aa0 */
32, 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ab0 */
48, 48, 48, 48, 48, 50, 53,100, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x ac0 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 77, 10, /* 0x ad0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 55, 50, /* 0x ae0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x af0 */
32, 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b00 */
48, 48, 48, 48, 48, 50, 55, 55, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x b10 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 85, 10, /* 0x b20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 55, 99, /* 0x b30 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x b40 */
32, 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b50 */
48, 48, 48, 48, 48, 50, 56, 49, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x b60 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 85, 10, /* 0x b70 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 56, 54, /* 0x b80 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x b90 */
32, 32, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ba0 */
48, 48, 48, 48, 48, 50, 56, 98, 32, 82, 95, 88, 56, 54, 95, 54, /* 0x bb0 */
52, 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 88, 10, /* 0x bc0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 57, 48, /* 0x bd0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, /* 0x be0 */
32, 32, 32, 76, 69, 78, 88, 10, 10, 10 /* 0x bf0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 380 */
32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 390 */
0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, /* 0x 3a0 */
112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3b0 */
8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3c0 */
27, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3d0 */
0, 0, 0, 0, 0, 0, 0, 0,240, 7, 0, 0, 0, 0, 0, 0, /* 0x 3e0 */
48, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, /* 0x 3f0 */
8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 400 */
46, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 410 */
0, 0, 0, 0, 0, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, /* 0x 420 */
172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 430 */
8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 440 */
41, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 450 */
0, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, /* 0x 460 */
48, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, /* 0x 470 */
8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 480 */
57, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 490 */
0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, /* 0x 4a0 */
133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4b0 */
8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4c0 */
52, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4d0 */
0, 0, 0, 0, 0, 0, 0, 0, 80, 8, 0, 0, 0, 0, 0, 0, /* 0x 4e0 */
48, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 5, 0, 0, 0, /* 0x 4f0 */
8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 500 */
68, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 510 */
0, 0, 0, 0, 0, 0, 0, 0,229, 1, 0, 0, 0, 0, 0, 0, /* 0x 520 */
29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 530 */
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 540 */
63, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 550 */
0, 0, 0, 0, 0, 0, 0, 0,128, 8, 0, 0, 0, 0, 0, 0, /* 0x 560 */
8, 1, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, /* 0x 570 */
8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 580 */
17, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 590 */
0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, /* 0x 5a0 */
77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5b0 */
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5c0 */
1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5d0 */
0, 0, 0, 0, 0, 0, 0, 0, 80, 6, 0, 0, 0, 0, 0, 0, /* 0x 5e0 */
104, 1, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 5, 0, 0, 0, /* 0x 5f0 */
8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 600 */
9, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 610 */
0, 0, 0, 0, 0, 0, 0, 0,184, 7, 0, 0, 0, 0, 0, 0, /* 0x 620 */
53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 630 */
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 640 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 650 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, /* 0x 660 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 670 */
0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 680 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, /* 0x 690 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6a0 */
0, 0, 0, 0, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6b0 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, /* 0x 6c0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6d0 */
8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6e0 */
0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, /* 0x 6f0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 700 */
18, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 710 */
0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 16, 0, 0, 0, /* 0x 720 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 730 */
28, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 740 */
0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 16, 0, 0, 0, /* 0x 750 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 760 */
38, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 770 */
0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 16, 0, 0, 0, /* 0x 780 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 790 */
48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 7a0 */
0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x 7b0 */
65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x 7c0 */
68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x 7d0 */
84, 67, 0, 65, 68, 82, 88, 0, 76, 69, 78, 88, 0, 0, 0, 0, /* 0x 7e0 */
1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, /* 0x 7f0 */
18, 1, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, /* 0x 800 */
2, 0, 0, 0, 4, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x 810 */
163, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x 820 */
46, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, /* 0x 830 */
2, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, /* 0x 840 */
127, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x 850 */
46, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, /* 0x 860 */
2, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, /* 0x 870 */
180, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, /* 0x 880 */
0, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, /* 0x 890 */
10, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 8a0 */
209, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, /* 0x 8b0 */
0, 0, 0, 0, 0, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, /* 0x 8c0 */
10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 8d0 */
219, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, /* 0x 8e0 */
0, 0, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, /* 0x 8f0 */
10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 900 */
229, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, /* 0x 910 */
0, 0, 0, 0, 0, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, /* 0x 920 */
10, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 930 */
239, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, /* 0x 940 */
0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x 950 */
2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x 960 */
19, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, /* 0x 970 */
4, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x 980 */
54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x 990 */
114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x 9a0 */
32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x 9b0 */
54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x 9c0 */
73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 9d0 */
32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x 9e0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x 9f0 */
65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x a00 */
70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x a10 */
70,108, 97,103,115, 10, 32, 32, 48, 32, 76, 69, 88, 69, 67, 48, /* 0x a20 */
48, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 55, 48, /* 0x a30 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x a40 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x a50 */
48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x a60 */
50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x a70 */
82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x a80 */
32, 32, 49, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, /* 0x a90 */
32, 32, 48, 48, 48, 48, 48, 48, 97, 99, 32, 32, 48, 48, 48, 48, /* 0x aa0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x ab0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x ac0 */
48, 48, 48, 48, 48, 48, 98, 48, 32, 32, 50, 42, 42, 51, 32, 32, /* 0x ad0 */
67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, /* 0x ae0 */
32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, /* 0x af0 */
86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, /* 0x b00 */
48, 48, 56, 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b10 */
48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b20 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, /* 0x b30 */
54, 48, 32, 32, 50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, /* 0x b40 */
84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, /* 0x b50 */
78, 76, 89, 10, 32, 32, 51, 32, 76, 69, 88, 69, 67, 48, 53, 48, /* 0x b60 */
32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 49,100, 32, 32, /* 0x b70 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b80 */
32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b90 */
48, 48, 32, 32, 48, 48, 48, 48, 48, 49,101, 53, 32, 32, 50, 42, /* 0x ba0 */
42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x bb0 */
76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, /* 0x bc0 */
77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, /* 0x bd0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x be0 */
32, 32,100, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, 48, 48, /* 0x bf0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x c00 */
69, 88, 69, 67, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c10 */
48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x c20 */
32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c30 */
48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, /* 0x c40 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x c50 */
32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, /* 0x c60 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, /* 0x c70 */
86, 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c80 */
48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 69, 88, /* 0x c90 */
69, 67, 48, 53, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ca0 */
48, 48, 48, 48, 48, 48, 32, 76, 69, 88, 69, 67, 48, 53, 48, 10, /* 0x cb0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x cc0 */
32,103, 32, 32, 32, 32, 32, 32, 32, 76, 69, 88, 69, 67, 48, 48, /* 0x cd0 */
48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ce0 */
48, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, /* 0x cf0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x d00 */
32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x d10 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 77, 10, 48, /* 0x d20 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x d30 */
32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, /* 0x d40 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x d50 */
69, 78, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d60 */
48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x d70 */
68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d80 */
48, 48, 48, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x d90 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x da0 */
32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x db0 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 85, 10, 48, 48, /* 0x dc0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x dd0 */
32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, /* 0x de0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, /* 0x df0 */
82, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e00 */
48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, /* 0x e10 */
42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e20 */
48, 48, 32, 76, 69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e30 */
48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x e40 */
32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e50 */
48, 48, 48, 48, 48, 48, 48, 32, 67, 78, 84, 67, 10, 48, 48, 48, /* 0x e60 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x e70 */
32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x e80 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, /* 0x e90 */
88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ea0 */
48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, /* 0x eb0 */
9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ec0 */
48, 32, 76, 69, 78, 88, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x ed0 */
73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x ee0 */
91, 76, 69, 88, 69, 67, 48, 48, 48, 93, 58, 10, 79, 70, 70, 83, /* 0x ef0 */
69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, /* 0x f00 */
69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, /* 0x f10 */
65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f20 */
48, 48, 48, 48, 48, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, /* 0x f30 */
80, 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, 69, 67, 48, 53, /* 0x f40 */
48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f50 */
48, 49, 49, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f60 */
48, 48, 48, 49, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x f70 */
67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, 69, 67, 48, 53, 48, /* 0x f80 */
43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x f90 */
102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x fa0 */
32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, /* 0x fb0 */
86, 50, 69, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, /* 0x fc0 */
32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x fd0 */
32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x fe0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 97, 51, /* 0x ff0 */
32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, /* 0x1000 */
32, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 43, 48,120, 48, 48, /* 0x1010 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,101, 10, 48, /* 0x1020 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 32, /* 0x1030 */
82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1040 */
32, 32, 76, 69, 88, 69, 67, 48, 53, 48, 43, 48,120, 48, 48, 48, /* 0x1050 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 51, 10, 10, 10, /* 0x1060 */
82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x1070 */
68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, 10, /* 0x1080 */
79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1090 */
32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x10a0 */
32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, /* 0x10b0 */
48, 48, 48, 48, 48, 48, 48, 48, 55,102, 32, 82, 95, 88, 56, 54, /* 0x10c0 */
95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, /* 0x10d0 */
69, 67, 48, 48, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x10e0 */
48, 48, 48, 48, 48, 48, 50,101, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x10f0 */
48, 48, 48, 48, 48, 48, 48, 52, 55, 32, 82, 95, 88, 56, 54, 95, /* 0x1100 */
54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, 69, /* 0x1110 */
67, 48, 53, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1120 */
48, 48, 48, 48, 48, 49, 51, 10, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x1130 */
84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x1140 */
32, 91, 76, 69, 88, 69, 67, 48, 53, 48, 93, 58, 10, 79, 70, 70, /* 0x1150 */
83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, /* 0x1160 */
80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1170 */
86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1180 */
48, 48, 48, 48, 48, 98, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1190 */
95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 77, 10, 48, /* 0x11a0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 98, 99, 32, /* 0x11b0 */
82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x11c0 */
32, 32, 76, 69, 78, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x11d0 */
48, 48, 48, 48, 48,100, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x11e0 */
95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 74, 77, 80, 85, 10, 48, /* 0x11f0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,100, 54, 32, /* 0x1200 */
82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1210 */
32, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1220 */
48, 48, 48, 48, 48,100, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1230 */
95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 67, 10, 48, /* 0x1240 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,101, 48, 32, /* 0x1250 */
82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1260 */
32, 32, 76, 69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1270 */
48, 48, 48, 48, 48,101, 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1280 */
95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 67, 78, 84, 67, 10, 48, /* 0x1290 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,101, 97, 32, /* 0x12a0 */
82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x12b0 */
32, 32, 65, 68, 82, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x12c0 */
48, 48, 48, 48, 48,101,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x12d0 */
95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 88, 10, 48, /* 0x12e0 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 57, 32, /* 0x12f0 */
82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1300 */
32, 32, 78, 82, 86, 50, 69, 43, 48,120, 48, 48, 48, 48, 48, 48, /* 0x1310 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 10, 48, 48, 48, 48, 48, /* 0x1320 */
48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 51, 32, 82, 95, 88, 56, /* 0x1330 */
54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 78, 82, /* 0x1340 */
86, 50, 66, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1350 */
48, 48, 48, 48, 48, 52, 10, 10, 10 /* 0x1360 */
};

View File

@ -154,9 +154,15 @@ copy1:
copy0:
rep; ret
.section NRV2E
#include "arch/amd64/nrv2e_d.S"
.section NRV2B
#include "arch/amd64/nrv2b_d.S"
//.section LZMA
//#include "arch/amd64/lzma_d.S"
.section LEXEC050
setup:
cld
pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit
@ -260,7 +266,7 @@ unfold:
ret
main:
// int3 # uncomment for debugging
int3 # uncomment for debugging
pop %rbp // &decompress
call unfold // push &b_info
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */

View File

@ -0,0 +1,147 @@
/*
; lzma_d.S -- 64-bit assembly
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 2006-2006 Markus Franz Xaver Johannes Oberhumer
; All Rights Reserved.
;
; UPX and the UCL library are free software; you can redistribute them
; and/or modify them under the terms of the GNU General Public License as
; published by the Free Software Foundation; either version 2 of
; the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; see the file COPYING.
; If not, write to the Free Software Foundation, Inc.,
; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
;
; Markus F.X.J. Oberhumer
; <markus@oberhumer.com>
; http://www.oberhumer.com/opensource/upx/
;
; ------------- DECOMPRESSION -------------
; Input:
; %rsi - source
; %rdi - dest
; cld
; Output:
; %rax - 0
; %rcx - 0
*/
#define section .section
//
// init
section LZMA_DEC00
// %rbx = alloca('UPXa');
mov %rsp,%rbp // save stack
lea UPXa(%rsp),%rbx
xor %rax, %rax
1:
push %rax
cmp %rbx,%rsp
jne 1b
addq $2,%rsi // skip 2 bytes for properties
pushq %rbx; addq $4,%rbx // &outSizeProcessed
pushq $ UPXb // outSize XXX: 2GB
pushq %rdi // out
pushq %rbx; addq $4,%rbx // &inSizeProcessed
pushq $ UPXc // inSize XXX: 2GB
pushq %rsi // in
pushq %rbx // &CLzmaDecoderState
pushq %rax // fake return address for call
// hardwired LzmaDecodeProperties()
movl $ UPXd,(%rbx) // lc, lp, pb, dummy
section LZMA_ELF00
#define LZMA_BASE_SIZE 1846
#define LZMA_LIT_SIZE 768
#ifndef O_OUTS // ELF defines them, others do not care
#define O_OUTS 0
#define O_INS 0
#endif
movq %rsp,%rbp // save stack
movl O_INS(%rbp),%edx // inSize XXX: 4GB
lodsb; subl $1,%edx // first byte, replaces LzmaDecodeProperties()
movb %al,%cl // cl= ((lit_context_bits + lit_pos_bits)<<3) | pos_bits
andb $6,%al // al= pos_bits
shrb $3,%cl // cl= lit_context_bits + lit_pos_bits
movq $-LZMA_LIT_SIZE,%rbx
shlq %cl,%rbx
// inSizeProcessed, outSizeProcessed, *_bits, CLzmaDecoderState
leaq -(2*4 +4) - 2*LZMA_BASE_SIZE(%rsp,%rbx,2), %rbx
andq $~0<<6,%rbx // 64-byte align
.elf_clearstack1:
pushq $0
cmpq %rbx,%rsp
jne .elf_clearstack1
pushq %rbx; addq $8,%rbx // &outSizeProcessed
movl O_OUTS(%rbp),%ecx // &outSize XXX: 2GB
pushq (%rcx) // outSize
pushq %rdi // out
pushq %rbx; addq $8,%rbx // &inSizeProcessed
movb %al,2(%rbx) // store pos_bits
lodsb; subl $1,%edx // second byte, replaces LzmaDecodeProperties()
movb %al,%cl // cl= (lit_pos_bits<<4) | lit_context_bits
andb $0xf,%al; movb %al, (%rbx) // store lit_context_bits
shrb $4, %cl; movb %cl,1(%rbx) // store lit_pos_bits
pushq %rdx // inSize -2
pushq %rsi // in
pushq %rbx // &CLzmaDecoderState
pushq %rax // return address slot (dummy CALL)
section LZMA_DEC10
#include "lzma_d_cs.S"
section LZMA_DEC20
#include "lzma_d_cf.S"
//
// cleanup
section LZMA_DEC30
addq -1*8(%rbx),%rsi // inSizeProcessed
addq -2*8(%rbx),%rdi // outSizeProcessed
xorq %rax,%rax
leaq -256(%rsp),%rcx
movq %rbp,%rsp // restore stack
1:
pushq %rax
cmpq %rcx,%rsp
jne 1b
movq %rbp,%rsp // restore stack
xorq %rcx,%rcx
// vi:ts=8:et