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