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:
John Reiser 2018-10-09 19:24:50 -07:00
parent bb8239ccda
commit 78b1da5c00
2 changed files with 10 additions and 12 deletions

View File

@ -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 /*}*/

View File

@ -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 /*{*/