mirror of https://github.com/upx/upx.git
Avoid dcache==>icache trouble with mflg_data; heuristic cache_flush for 32-bit ARM
modified: arm.v4a-linux.elf-entry.S modified: arm.v4a-linux.elf-fold.S
This commit is contained in:
parent
bb8239ccda
commit
78b1da5c00
|
@ -172,9 +172,7 @@ unfold: // in: r3= mflg; r6= elfaddr; lr= &O_BINFO
|
|||
ldr r3,[sp],#4 @ P_01 sz_unc
|
||||
|
||||
ldr r1,[sp,#F_mflg] @ mflg
|
||||
ldr r0,[r4] @ "orr r3,r3,#0" at mflg_subr
|
||||
orr r0,r0,r1 @ change the 8-bit immediate
|
||||
str r0,[r4]
|
||||
str r1,[r4] @ pass mflg to folded code
|
||||
|
||||
// PROT_EXEC
|
||||
ldr r0,[sp,#F_f_exp]
|
||||
|
@ -193,7 +191,7 @@ unfold: // in: r3= mflg; r6= elfaddr; lr= &O_BINFO
|
|||
ldr r0,[sp,#F_ADRU]
|
||||
sub r4,r9,r1 @ LENX= sz_pack2 - O_BINFO
|
||||
add r5,r0,r1 @ ADRX= new Elf32_Ehdr + O_BINFO
|
||||
add r6,r6,#2*4 @ past mflg_subr
|
||||
add r6,r6,#4 @ past the forwarded data
|
||||
#if DEBUG /*{*/
|
||||
stmdb sp!,{TRACE_REGS}; mov r0,#3; bl trace
|
||||
#endif /*}*/
|
||||
|
|
|
@ -40,6 +40,7 @@ sz_b_info = 12
|
|||
sz_cpr= 4
|
||||
b_method= 8
|
||||
|
||||
MAP_ANONYMOUS= 0x20
|
||||
MAP_PRIVATE= 0x02
|
||||
MAP_FIXED= 0x10
|
||||
|
||||
|
@ -61,9 +62,7 @@ PATH_MAX= 4096
|
|||
#define OVERHEAD 2048
|
||||
#define MAX_ELF_HDR 512
|
||||
|
||||
mflg_subr: @ for handling QNX vs Linux
|
||||
orr r3,r3,#0 @ re-written to MAP_PRIVATE|MAP_ANONYMOUS
|
||||
ret
|
||||
mflg_data: .int MAP_PRIVATE|MAP_ANONYMOUS @ overwritten for QNX vs Linux
|
||||
|
||||
SP_fd= 3*4
|
||||
/* In:
|
||||
|
@ -215,16 +214,16 @@ F_delta= 3*4
|
|||
mov r10,#0
|
||||
mov r11,#0
|
||||
|
||||
#if DEBUG //{
|
||||
#if 1|DEBUG //{
|
||||
/* Heuristic cache flush: sweep contiguous range to force collisions and evictions. */
|
||||
sub r12,sp,#(1<<19) @ limit: 1/2 MB more
|
||||
sub r12,sp,#(1<<18) @ limit: 1/4 MB more
|
||||
sweep:
|
||||
ldr r7,[sp],#-(1<<5) @ extend stack; read allocate 32 bytes
|
||||
str r7,[sp] @ make it dirty
|
||||
ldr r7,[sp] @ read alocate again in case dirtying caused COW split
|
||||
cmp r12,sp; blo sweep
|
||||
|
||||
add sp,sp,#(1<<19) @ pop stack
|
||||
add sp,sp,#(1<<18) @ pop stack
|
||||
#endif //}
|
||||
|
||||
#if defined(ARMEL_DARWIN) /*{*/
|
||||
|
@ -432,10 +431,11 @@ get_sys_munmap: .globl get_sys_munmap // r0= system call instruction
|
|||
|
||||
mmap_privanon: .globl mmap_privanon
|
||||
stmdb sp!,{r4,r5,lr}
|
||||
ldr r4,mflg_data @ Map_PRIVATE|MAP_ANON for Linux; MAP_PRIVANON for QNX
|
||||
mov r5,#0 @ offset= 0
|
||||
orr r3,r3,r4 @ combine with input (such as MAP_FIXED)
|
||||
mvn r4,#0 @ fd= -1
|
||||
adr lr, mmap_do
|
||||
b mflg_subr // fix r3 for QNX vs Linux
|
||||
b mmap_do
|
||||
|
||||
#if 1|DEBUG /*{*/
|
||||
|
||||
|
|
Loading…
Reference in New Issue