Files
upx/src/stub/src/arm64-darwin.macho-entry.S
T
2016-09-22 09:55:13 +02:00

160 lines
4.2 KiB
ArmAsm

/* arm64-darwin.macho-entry.S -- iPhone program entry point & decompressor (Elf binary)
*
* This file is part of the UPX executable compressor.
*
* Copyright (C) 1996-2015 Markus Franz Xaver Johannes Oberhumer
* Copyright (C) 1996-2015 Laszlo Molnar
* Copyright (C) 2000-2015 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
* <markus@oberhumer.com> <ml1050@users.sourceforge.net>
*
* John F. Reiser
* <jreiser@users.sourceforge.net>
*/
//#define SIMULATE_ON_DEBIAN_EABI4 1
#undef SIMULATE_ON_DEBIAN_EABI4
#ifdef SIMULATE_ON_DEBIAN_EABI4 /*{*/
#define LINUX_ARM_CACHEFLUSH 1 /* SIMULATE_ON_DEBIAN_EABI4 */
#define ARMEL_EABI4 1 /* SIMULATE_ON_DEBIAN_EABI4 */
#else /*}{ usual case */
#define DARWIN_ARM_CACHEFLUSH 1
#define ARMEL_DARWIN 1
#endif /*}*/
#define lr x30
#include "arch/arm64/v8/macros.S"
sz_b_info= 12
sz_unc= 0
sz_cpr= 4
b_method= 8
sz_l_info= 12
sz_p_info= 12
PROT_READ= 1
PROT_WRITE= 2
PROT_EXEC= 4
MAP_PRIVATE= 2
MAP_FIXED= 0x10
MAP_ANONYMOUS= 0x20
PAGE_SHIFT= 12
PAGE_SIZE = -(~0<<PAGE_SHIFT)
__NR_exit = 1 + __NR_SYSCALL_BASE
__NR_write = 4 + __NR_SYSCALL_BASE
__NR_mmap = 197 + __NR_SYSCALL_BASE
// DEBUG ONLY:
__ARM_NR_BASE = 0xf0000 + __NR_SYSCALL_BASE
__ARM_NR_cacheflush = 2 + __ARM_NR_BASE
//.long sz_pack2 // placed there by ::pack3()
section MACHMAINX
_start: .globl _start
sub sp,sp,#4 // space for mhdrp
stp x0,x1,[sp,#-30*8]! // paranoia; omit r30(lr), r31(sp)
stp x2,x3,[sp,#2*8]
stp x4,x5,[sp,#4*8]
stp x6,x7,[sp,#6*8]
stp x8,x9,[sp,#8*8]
stp x10,x11,[sp,#10*8]
stp x12,x13,[sp,#12*8]
stp x14,x15,[sp,#14*8]
stp x16,x17,[sp,#16*8]
stp x18,x19,[sp,#18*8]
stp x20,x21,[sp,#20*8]
stp x22,x23,[sp,#22*8]
stp x24,x25,[sp,#24*8]
stp x26,x27,[sp,#26*8]
stp x28,x29,[sp,#28*8]
bl main
L20:
f_decompress:
section NRV_HEAD
// empty
section NRV2E
#include "arch/arm64/v8/nrv2e_d8.S"
section NRV2D
#include "arch/arm64/v8/nrv2d_d8.S"
section NRV2B
#include "arch/arm64/v8/nrv2b_d8.S"
section NRV_TAIL
// empty
#include "arch/arm64/v8/lzma_d.S"
section MACHMAINY
end_decompress: .globl end_decompress
/* IDENTSTR goes here */
section MACHMAINZ
#define lsrc w1
#define ldst w3
#define ldstx x3
unfold: // lr= &L100
ldr ldst,[lr,#sz_unc]
ldr lsrc,[lr,#sz_cpr]
add dst,lr,lsrc,uxtw; add dst,dst,#sz_b_info
add src,lr,ldst,uxtw; add src,src,#GAP+NO_LAP // defend against prefetch and overlap
mov w4,lsrc // loop count
#define t0 w9
movup: // descending copy folded_loader to higher address
ldr t0,[dst,#-4]!; sub w4,w4,#4
str t0,[src,#-4]!; cbnz w4,movup
ldr w4, [lr,#b_method] // 5th param to decompressor
add lr,lr,#GAP
PUSH1(ldst); mov ldstx,sp // LZMA needs for EOF
mov dst,lr // unfolded result
sub x11,x5,#4+ L20 - _start // &sz_pack2 param to unfolded loader
mov x10,lr // DEBUG ONLY
blr x5 // br r5
br x10 // DEBUG ONLY
main:
mov x5,lr // &f_decompress
bl unfold
L100:
/* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */
GAP= 128 // > farthest prefetch; must match ../../p_mach.cpp
NO_LAP= 64 // avoid overlap for folded loader; must match ../../p_mach.cpp
#undef ldstx
#undef ldst
/*
vi:ts=8:et:nowrap
*/