PowerPC register mixups
modified: stub/src/powerpc-linux.elf-entry.S modified: stub/src/powerpc-linux.elf-fold.S
This commit is contained in:
@@ -210,7 +210,7 @@ SYS_mmap= __NR_mmap
|
|||||||
|
|
||||||
mr a0,r_fd
|
mr a0,r_fd
|
||||||
SYS_close= 6
|
SYS_close= 6
|
||||||
li a0,SYS_close; sc
|
li r0,SYS_close; sc
|
||||||
|
|
||||||
// Use the unfolded code
|
// Use the unfolded code
|
||||||
addi r0,r_ADRU,2*NBPW // skip page_mask, other word
|
addi r0,r_ADRU,2*NBPW // skip page_mask, other word
|
||||||
@@ -232,14 +232,6 @@ SYS_close= 6
|
|||||||
// addi sp,sp,96 # de-allocate local frame
|
// addi sp,sp,96 # de-allocate local frame
|
||||||
// blr # goto return address
|
// blr # goto return address
|
||||||
|
|
||||||
mmapRW0:
|
|
||||||
li a5,0 // offset
|
|
||||||
mmapRW:
|
|
||||||
li a2,PROT_READ|PROT_WRITE
|
|
||||||
mmap:
|
|
||||||
li r0,__NR_mmap; sc; bns+ 0f; teq r0,r0; 0:
|
|
||||||
ret
|
|
||||||
|
|
||||||
zfind:
|
zfind:
|
||||||
lwz r0,0(a0); addi a0,a0,NBPW
|
lwz r0,0(a0); addi a0,a0,NBPW
|
||||||
cmpi cr7,r0,0; bne+ cr7,zfind
|
cmpi cr7,r0,0; bne+ cr7,zfind
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ SZ_FRAME= SZ_LINKA
|
|||||||
|
|
||||||
// In:
|
// In:
|
||||||
r_exp= 31 // f_exp == &decompress
|
r_exp= 31 // f_exp == &decompress
|
||||||
r_PMASK= 30 // PAGE_MASK
|
r_buf= 30
|
||||||
r_ADRU= 29 // &base to unmap
|
r_ADRU= 29 // &base to unmap
|
||||||
r_LENU= 28 // length to unmap
|
r_LENU= 28 // length to unmap
|
||||||
r_fd= 27 // open fd of /proc/self/exe
|
r_fd= 27 // open fd of /proc/self/exe
|
||||||
@@ -71,11 +71,11 @@ r_ADRX= 24 // compressed input
|
|||||||
r_LENX= 23 // total size
|
r_LENX= 23 // total size
|
||||||
r_FLD= 22
|
r_FLD= 22
|
||||||
// Local:
|
// Local:
|
||||||
r_90b= 22
|
cblk= 21
|
||||||
av_hi= 21
|
r_90b= r_FLD
|
||||||
av_len= 20
|
r_PMASK= 20 // (in) PAGE_MASK
|
||||||
cblk= 19
|
av_hi= 19
|
||||||
r_buf= 18
|
av_len= 18
|
||||||
|
|
||||||
page_mask:
|
page_mask:
|
||||||
.int -0x1000 // default page mask (4KiB)
|
.int -0x1000 // default page mask (4KiB)
|
||||||
@@ -102,7 +102,6 @@ mprotect: .globl mprotect
|
|||||||
b sysgo
|
b sysgo
|
||||||
|
|
||||||
fold_begin:
|
fold_begin:
|
||||||
teq r0,r0 // DEBUG
|
|
||||||
mtctr r0 // # words before argc FIXME: fragile
|
mtctr r0 // # words before argc FIXME: fragile
|
||||||
lwz r0,0(r_FLD) // O_BINFO | is_ptinterp | unmap_all_pages
|
lwz r0,0(r_FLD) // O_BINFO | is_ptinterp | unmap_all_pages
|
||||||
slwi r0,r0,3*4
|
slwi r0,r0,3*4
|
||||||
@@ -200,7 +199,6 @@ no_pse_env:
|
|||||||
mr a2,r_elfa // elfaddr
|
mr a2,r_elfa // elfaddr
|
||||||
mr a3,r_auxv // &Elf32_auxv_t
|
mr a3,r_auxv // &Elf32_auxv_t
|
||||||
la a4,SZ_FRAME(sp) // &Elf32_Ehdr temporary space
|
la a4,SZ_FRAME(sp) // &Elf32_Ehdr temporary space
|
||||||
teq r0,r0 //DEBUG
|
|
||||||
call upx_main // Out: a0= entry
|
call upx_main // Out: a0= entry
|
||||||
// entry= upx_main(b_info *a0, total_size a1, Elf32_Ehdr *a2, ELf32_auxv_t *a3,
|
// entry= upx_main(b_info *a0, total_size a1, Elf32_Ehdr *a2, ELf32_auxv_t *a3,
|
||||||
// tmp_ehdr[])
|
// tmp_ehdr[])
|
||||||
@@ -275,6 +273,26 @@ SYS_ftruncate= 93
|
|||||||
SYS_mprotect= 125
|
SYS_mprotect= 125
|
||||||
SYS_memfd_create= 360
|
SYS_memfd_create= 360
|
||||||
|
|
||||||
|
exit: .globl exit
|
||||||
|
li r0,SYS_exit; 5: b 5f
|
||||||
|
brk: .globl brk
|
||||||
|
li r0,SYS_brk; 5: b 5f
|
||||||
|
readlink: .globl readlink
|
||||||
|
li r0,SYS_readlink; 5: b 5f
|
||||||
|
memfd_create: .globl memfd_create
|
||||||
|
li r0,SYS_memfd_create; b 5f
|
||||||
|
ftruncate: .globl ftruncate
|
||||||
|
li r0,SYS_ftruncate;5: b 5f
|
||||||
|
close: .globl close
|
||||||
|
li r0,SYS_close; 5: b 5f
|
||||||
|
write: .globl write
|
||||||
|
li r0,SYS_write; 5: b 5f
|
||||||
|
read: .globl read
|
||||||
|
li r0,SYS_read; 5: b 5f
|
||||||
|
open: .globl open
|
||||||
|
li r0,SYS_open; 5: b 5f
|
||||||
|
munmap: .globl munmap
|
||||||
|
li r0,SYS_munmap; 5: b sysgo
|
||||||
mmap: .globl mmap
|
mmap: .globl mmap
|
||||||
li r0,SYS_mmap
|
li r0,SYS_mmap
|
||||||
sysgo:
|
sysgo:
|
||||||
@@ -284,27 +302,6 @@ sysgo:
|
|||||||
no_fail:
|
no_fail:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
memfd_create: .globl memfd_create
|
|
||||||
li r0,SYS_memfd_create; b 5f
|
|
||||||
ftruncate: .globl ftruncate
|
|
||||||
li r0,SYS_ftruncate;5: b 5f
|
|
||||||
exit: .globl exit
|
|
||||||
li r0,SYS_exit; b 5f
|
|
||||||
brk: .globl brk
|
|
||||||
li r0,SYS_brk; 5: b 5f
|
|
||||||
readlink: .globl readlink
|
|
||||||
li r0,SYS_readlink; 5: b 5f
|
|
||||||
write: .globl write
|
|
||||||
li r0,SYS_write; 5: b 5f
|
|
||||||
read: .globl read
|
|
||||||
li r0,SYS_read; 5: b 5f
|
|
||||||
open: .globl open
|
|
||||||
li r0,SYS_open; 5: b 5f
|
|
||||||
close: .globl close
|
|
||||||
li r0,SYS_close; 5: b 5f
|
|
||||||
munmap: .globl munmap
|
|
||||||
li r0,SYS_munmap; 5: b sysgo
|
|
||||||
|
|
||||||
memcpy: .globl memcpy // (dst, src, n)
|
memcpy: .globl memcpy // (dst, src, n)
|
||||||
cmpwi a2,0; beq- 9f
|
cmpwi a2,0; beq- 9f
|
||||||
mtctr a2
|
mtctr a2
|
||||||
|
|||||||
Reference in New Issue
Block a user