Files
upx/src/stub/src/arch/arm64/v8/macros.S
T
John Reiser 504839951a arm64 clear_cache at end of de-compress
https://github.com/upx/upx/issues/441
	modified:   stub/src/arch/arm64/v8/macros.S

	modified:   stub/src/arch/arm64/v8/lzma_d.S
	modified:   stub/src/arch/arm64/v8/nrv2b_d32.S
	modified:   stub/src/arch/arm64/v8/nrv2d_d32.S
	modified:   stub/src/arch/arm64/v8/nrv2e_d32.S

	modified:   stub/arm64-darwin.macho-entry.h
	modified:   stub/arm64-linux.elf-entry.h
	modified:   stub/arm64-linux.shlib-init.h
	modified:   stub/tmp/arm64-darwin.macho-entry.bin.dump
	modified:   stub/tmp/arm64-linux.elf-entry.bin.dump
	modified:   stub/tmp/arm64-linux.shlib-init.bin.dump
2021-05-16 09:53:03 -07:00

100 lines
3.1 KiB
ArmAsm

/*
; macros.S --
;
; This file is part of the UPX executable compressor.
;
; Copyright (C) 1996-2021 Markus Franz Xaver Johannes Oberhumer
; Copyright (C) 1996-2021 Laszlo Molnar
; 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> <ezerotven+github@gmail.com>
;
*/
#ifndef __MACROS_S__ // {
#define __MACROS_S__ 1
.altmacro
lr .req x30
fp .req x29
// ARM64 (AARCH64) REQUIRES 16-BYTE ALIGNED STACK POINTER (SP)
// Therefore PUSH of an odd number of registers, inserts an 8-byte hole.
#define PUSH1(r1) str r1, [sp,#-2*8]! /* HOLE */
#define PUSH2(r1,r2) stp r1,r2,[sp,#-2*8]!
#define PUSH3(r1,r2,r3) stp r1,r2,[sp,#-4*8]!;\
str r3, [sp,# 2*8] /* HOLE */
#define PUSH4(r1,r2,r3,r4) stp r1,r2,[sp,#-4*8]!; \
stp r3,r4,[sp,# 2*8]
#define PUSH5(r1,r2,r3,r4,r5) stp r1,r2,[sp,#-6*8]!;\
stp r3,r4,[sp,# 2*8];\
str r5, [sp,# 4*8] /* HOLE */
#define POP1(r1) ldr r1, [sp],#2*8
#define POP2(r1,r2) ldp r1,r2,[sp],#2*8
#define POP3(r1,r2,r3) ldr r3, [sp,#2*8]; ldp r1,r2,[sp],#4*8
#define POP4(r1,r2,r3,r4) ldp r3,r4,[sp,#2*8]; ldp r1,r2,[sp],#4*8
.macro section name
.section \name
.endm
.macro do_sys N
mov w8,#\N
svc #0 // sets Carry iff error
// orrcs r0,r0,#(1<<31) // force negative on error; FIXME: needed?
.endm
.macro clear_cache // In: x0= lo; x1= hi; uses x2,x3,x4
mrs x3, ctr_el0
tbnz w3, #28, 1f // not needed
ubfx x2, x3, #16, #4
mov x4, -4 // word mask (why not 8?)
lsl x4, x4, x2 // Dline_mask
and x2, x0, x4 // round down
cmp x2, x1
bhs 1f // empty range
0:
dc cvau, x2
sub x2, x2, x4
cmp x1, x2
bhi 0b
1:
dsb ish
tbnz w3, #29, 3f // not needed
and x3, x3, #0xf
mov x2, -4 // word mask (why not 8?)
lsl x2, x2, x3 // Iline_mask
and x0, x0, x2 // round down
cmp x1, x0
bls 3f // empty range
2:
ic ivau, x0
sub x0, x0, x2
cmp x1, x0
bhi 2b
3:
dsb ish
isb
.endm
#endif //}
// vi:ts=8:et:nowrap