From c0ff491972960e751c208e80ec89ec615cadf8e8 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Sun, 30 Jun 2024 03:30:32 -0700 Subject: [PATCH] ELF2 for PowerPC64 forgot to add new files new file: src/powerpc64-expand.S new file: src/powerpc64-linux.elf-main2.c new file: src/powerpc64le-expand.S new file: src/powerpc64le-linux.elf-main2.c --- src/stub/src/powerpc64-expand.S | 198 ++++++++++++++++++ src/stub/src/powerpc64-linux.elf-main2.c | 1 + src/stub/src/powerpc64le-expand.S | 5 + src/stub/src/powerpc64le-linux.elf-main2.c | 1 + .../tmp/powerpc64-darwin.dylib-entry.bin.dump | 52 ----- .../tmp/powerpc64-darwin.macho-entry.bin.dump | 52 ----- 6 files changed, 205 insertions(+), 104 deletions(-) create mode 100644 src/stub/src/powerpc64-expand.S create mode 100644 src/stub/src/powerpc64-linux.elf-main2.c create mode 100644 src/stub/src/powerpc64le-expand.S create mode 100644 src/stub/src/powerpc64le-linux.elf-main2.c delete mode 100644 src/stub/tmp/powerpc64-darwin.dylib-entry.bin.dump delete mode 100644 src/stub/tmp/powerpc64-darwin.macho-entry.bin.dump diff --git a/src/stub/src/powerpc64-expand.S b/src/stub/src/powerpc64-expand.S new file mode 100644 index 00000000..58f3a7ef --- /dev/null +++ b/src/stub/src/powerpc64-expand.S @@ -0,0 +1,198 @@ +#/* +; powerpc64-expand.S -- decompressors for powerpc64le +; +; This file is part of the UPX executable compressor. +; +; Copyright (C) 1996-2021 Markus Franz Xaver Johannes Oberhumer +; Copyright (C) 1996-2021 Laszlo Molnar +; Copyright (C) 2000-2021 John F. Reiser +; 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 Laszlo Molnar +; +; +; John F. Reiser +; +; +*/ + +#if !defined(BIG_ENDIAN) //{ +#error must "#define BIG_ENDIAN" as 0 or 1 +#endif //} + +NBPW= 8 +SZ_DLINE= 128 # size of data cache line in Apple G5 + +#include "arch/powerpc/64/ppc_regs.h" +#include "arch/powerpc/64/macros.S" + + section EXP_HEAD + +sz_unc= 0 +sz_cpr= 4 +b_method= 8 +b_ftid= 9 +b_cto8= 10 +b_extra= 11 +sz_binfo= 12 + +f_expand: .globl f_expand // f_expand(b_info *, dst, &dstlen) + .type f_expand,function +// Supervisor for de-compression, un-filter, and sync_cache +// Input to supervisor: +#define fx_src a0 +#define fx_dst a1 +#define fx_dstlen a2 + mflr r0 + PUSH4 fx_src,fx_dst,fx_dstlen,r0 // params to unfilter and sync_cache + +// Input to de-compressor: +#define xsrc a0 +#define xsrclen a1 +#define xdst a2 +#define xdstlen a3 +#define methb a4 + lbz methb,b_method(fx_src) + movr xdstlen,fx_dstlen // arg4 + movr xdst,fx_dst // arg3 + lwz xsrclen,sz_cpr(xsrc) // arg2 + addi xsrc,fx_src,sz_binfo // arg1 + call decompress + movr a3,a0 // save retval + + POP3 a2,a0,a1 // fx_src,fx_dst,fx_dstlen; keep f_expand.retaddr + ld a1,0(a1) // actual length used by decompressor + PUSH3 a0,a1,a3 // params for sync_cache + lbz a3,b_ftid(a2) + lbz a2,b_cto8(a2) + cmpi cr0,a3,0; beq no_unf + call unfilter +no_unf: + + POP2 a0,a1 // dst, len + add a1,a1,a0 // lo, hi + +CACHELINE=32 + ori a0,a0,-1+ CACHELINE // highest addr on cache line +cfl_nrv: + dcbst 0,a0 // initiate store (modified) cacheline to memory + cmpl cr0,a0,a1 // did we cover the highest-addressed byte? + icbi 0,a0 // discard instructions from cacheline + addi a0,a0,CACHELINE // highest addr on next line + blt cr0,cfl_nrv // not done yet + sync // wait for all memory operations to finish + isync // discard prefetched instructions (if any) +cfl_ret: + POP2 a0,r0 // retval, retaddr from f_expand + mtlr r0 + ret +// .unreq fx_src +// .unreq fx_dst +// .unreq fx_dstlen +// .unreq xsrc +// .unreq xsrclen +// .unreq xdst +// .unreq xdstlen +// .unreq methb + +decompress: // (src *, cpr_len, dst *, &dstlen); +// sections NRV2B, etc, inserted here by addLoader() from ::buildLinuxLoader() + + section EXP_TAIL +#define M_NRV2B_LE32 2 +#define M_NRV2B_8 3 +#define M_NRV2D_LE32 5 +#define M_NRV2D_8 6 +#define M_NRV2E_LE32 8 +#define M_NRV2E_8 9 +#define M_CL1B_LE32 11 +#define M_LZMA 14 + +#define hibit r0 /* holds 0x80000000 during decompress */ + +#define src a0 +#define lsrc a1 +#define dst a2 +#define ldst a3 /* Out: actually a reference: &len_dst */ +#define meth a4 + + .globl eof_nrv +eof_nrv: +#define tmp a1 +#define dst0 a4 + ld dst0,0(ldst) // original dst + mtlr t3 // return address + subf a0,lsrc,src + subf tmp,dst0,dst // -1+ dst length + addi a0,a0,1 // return 0: good; else: bad [+1: correct for lbzu] + addi tmp,tmp,1 // dst length + std tmp,0(ldst) + blr +#undef tmp +#undef dst0 + +unfilter: +#include "arch/powerpc/64/bxx.S" // unfilter code; args in registers, fall-through return + +// FIXME: will need extra parameter for multi-method decompression +#define NO_METHOD_CHECK 1 + +#define off a4 +#define len a5 +#define bits a6 +#define disp a7 + + section NRV2E +#if BIG_ENDIAN +#include "arch/powerpc/64/nrv2e_d.S" +#else +#include "arch/powerpc/64le/nrv2e_d.S" +#endif + + section NRV2D +#if BIG_ENDIAN +#include "arch/powerpc/64/nrv2d_d.S" +#else +#include "arch/powerpc/64le/nrv2d_d.S" +#endif + + section NRV2B +#if BIG_ENDIAN +#include "arch/powerpc/64/nrv2b_d.S" +#else +#include "arch/powerpc/64le/nrv2b_d.S" +#endif + +#undef off +#undef len +#undef bits +#undef disp + +#undef src +#undef lsrc +#undef dst +#undef ldst +#undef meth + +/* lzma has its own 'section's */ +#if BIG_ENDIAN +#include "arch/powerpc/64/lzma_d.S" +#else +#include "arch/powerpc/64le/lzma_d.S" +#endif + diff --git a/src/stub/src/powerpc64-linux.elf-main2.c b/src/stub/src/powerpc64-linux.elf-main2.c new file mode 100644 index 00000000..d2db8bc0 --- /dev/null +++ b/src/stub/src/powerpc64-linux.elf-main2.c @@ -0,0 +1 @@ +#include "amd64-linux.elf-main2.c" diff --git a/src/stub/src/powerpc64le-expand.S b/src/stub/src/powerpc64le-expand.S new file mode 100644 index 00000000..0037c90b --- /dev/null +++ b/src/stub/src/powerpc64le-expand.S @@ -0,0 +1,5 @@ +#if !defined(BIG_ENDIAN) || BIG_ENDIAN +#error must "#define BIG_ENDIAN 0" for powerpc64le +#endif + +#include "../src/powerpc64-expand.S" diff --git a/src/stub/src/powerpc64le-linux.elf-main2.c b/src/stub/src/powerpc64le-linux.elf-main2.c new file mode 100644 index 00000000..d2db8bc0 --- /dev/null +++ b/src/stub/src/powerpc64le-linux.elf-main2.c @@ -0,0 +1 @@ +#include "amd64-linux.elf-main2.c" diff --git a/src/stub/tmp/powerpc64-darwin.dylib-entry.bin.dump b/src/stub/tmp/powerpc64-darwin.dylib-entry.bin.dump deleted file mode 100644 index a7123545..00000000 --- a/src/stub/tmp/powerpc64-darwin.dylib-entry.bin.dump +++ /dev/null @@ -1,52 +0,0 @@ -file format elf64-powerpc - -Sections: -Idx Name Size VMA LMA File off Algn Flags - 0 MACOS000 08 0 0 040 2**0 CONTENTS - 1 NRV_HEAD 0 0 0 048 2**0 CONTENTS - 2 NRV2E 0154 0 0 048 2**0 CONTENTS - 3 NRV2D 013c 0 0 019c 2**0 CONTENTS - 4 NRV2B 0f8 0 0 02d8 2**0 CONTENTS - 5 LZMA_ELF00 094 0 0 03d0 2**0 CONTENTS - 6 LZMA_DEC30 028 0 0 0464 2**0 CONTENTS - 7 LZMA_DEC10 0bc0 0 0 048c 2**0 CONTENTS - 8 LZMA_DEC20 0c74 0 0 0104c 2**0 CONTENTS - 9 NRV_TAIL 01c 0 0 01cc0 2**0 CONTENTS - 10 CFLUSH 024 0 0 01cdc 2**0 CONTENTS - 11 ELFMAINY 0 0 0 01d00 2**0 CONTENTS - 12 ELFMAINZ 02e8 0 0 01d00 2**0 CONTENTS -SYMBOL TABLE: -0000000000000000 l d LZMA_DEC30 0 LZMA_DEC30 -0000000000000000 l d NRV_TAIL 0 NRV_TAIL -0000000000000000 l d ELFMAINZ 0 ELFMAINZ -0000000000000000 l d MACOS000 0 MACOS000 -0000000000000000 l d NRV_HEAD 0 NRV_HEAD -0000000000000000 l d NRV2E 0 NRV2E -0000000000000000 l d NRV2D 0 NRV2D -0000000000000000 l d NRV2B 0 NRV2B -0000000000000000 l d LZMA_ELF00 0 LZMA_ELF00 -0000000000000000 l d LZMA_DEC10 0 LZMA_DEC10 -0000000000000000 l d LZMA_DEC20 0 LZMA_DEC20 -0000000000000000 l d CFLUSH 0 CFLUSH -0000000000000000 l d ELFMAINY 0 ELFMAINY -0000000000000000 g MACOS000 0 _start - -RELOCATION RECORDS FOR [MACOS000]: -OFFSET TYPE VALUE -0000000000000004 R_PPC64_REL24 ELFMAINZ+0x00000000000002e4 - -RELOCATION RECORDS FOR [NRV2E]: -OFFSET TYPE VALUE -00000000000000c0 R_PPC64_REL14 NRV_TAIL - -RELOCATION RECORDS FOR [NRV2D]: -OFFSET TYPE VALUE -00000000000000c4 R_PPC64_REL14 NRV_TAIL - -RELOCATION RECORDS FOR [NRV2B]: -OFFSET TYPE VALUE -0000000000000098 R_PPC64_REL14 NRV_TAIL - -RELOCATION RECORDS FOR [LZMA_ELF00]: -OFFSET TYPE VALUE -0000000000000004 R_PPC64_REL14 LZMA_DEC30+0x0000000000000028 diff --git a/src/stub/tmp/powerpc64-darwin.macho-entry.bin.dump b/src/stub/tmp/powerpc64-darwin.macho-entry.bin.dump deleted file mode 100644 index ef07bdad..00000000 --- a/src/stub/tmp/powerpc64-darwin.macho-entry.bin.dump +++ /dev/null @@ -1,52 +0,0 @@ -file format elf64-powerpc - -Sections: -Idx Name Size VMA LMA File off Algn Flags - 0 MACOS000 04 0 0 040 2**0 CONTENTS - 1 NRV_HEAD 0 0 0 044 2**0 CONTENTS - 2 NRV2E 0154 0 0 044 2**0 CONTENTS - 3 NRV2D 013c 0 0 0198 2**0 CONTENTS - 4 NRV2B 0f8 0 0 02d4 2**0 CONTENTS - 5 LZMA_ELF00 094 0 0 03cc 2**0 CONTENTS - 6 LZMA_DEC30 028 0 0 0460 2**0 CONTENTS - 7 LZMA_DEC10 0bc0 0 0 0488 2**0 CONTENTS - 8 LZMA_DEC20 0c74 0 0 01048 2**0 CONTENTS - 9 NRV_TAIL 01c 0 0 01cbc 2**0 CONTENTS - 10 CFLUSH 024 0 0 01cd8 2**0 CONTENTS - 11 ELFMAINY 0 0 0 01cfc 2**0 CONTENTS - 12 ELFMAINZ 058 0 0 01cfc 2**0 CONTENTS -SYMBOL TABLE: -0000000000000000 l d LZMA_DEC30 0 LZMA_DEC30 -0000000000000000 l d NRV_TAIL 0 NRV_TAIL -0000000000000000 l d ELFMAINZ 0 ELFMAINZ -0000000000000000 l d MACOS000 0 MACOS000 -0000000000000000 l d NRV_HEAD 0 NRV_HEAD -0000000000000000 l d NRV2E 0 NRV2E -0000000000000000 l d NRV2D 0 NRV2D -0000000000000000 l d NRV2B 0 NRV2B -0000000000000000 l d LZMA_ELF00 0 LZMA_ELF00 -0000000000000000 l d LZMA_DEC10 0 LZMA_DEC10 -0000000000000000 l d LZMA_DEC20 0 LZMA_DEC20 -0000000000000000 l d CFLUSH 0 CFLUSH -0000000000000000 l d ELFMAINY 0 ELFMAINY -0000000000000000 g MACOS000 0 _start - -RELOCATION RECORDS FOR [MACOS000]: -OFFSET TYPE VALUE -0000000000000000 R_PPC64_REL24 ELFMAINZ+0x0000000000000048 - -RELOCATION RECORDS FOR [NRV2E]: -OFFSET TYPE VALUE -00000000000000c0 R_PPC64_REL14 NRV_TAIL - -RELOCATION RECORDS FOR [NRV2D]: -OFFSET TYPE VALUE -00000000000000c4 R_PPC64_REL14 NRV_TAIL - -RELOCATION RECORDS FOR [NRV2B]: -OFFSET TYPE VALUE -0000000000000098 R_PPC64_REL14 NRV_TAIL - -RELOCATION RECORDS FOR [LZMA_ELF00]: -OFFSET TYPE VALUE -0000000000000004 R_PPC64_REL14 LZMA_DEC30+0x0000000000000028