Enhancement of elf generation
Now addresses are absolutre from the elf code start => JIT do not work anymore
This commit is contained in:
parent
a93885868c
commit
a9ac2eeff9
1 changed files with 127 additions and 67 deletions
194
bfc.asm
194
bfc.asm
|
|
@ -34,22 +34,33 @@ ALIGNMODE k8
|
|||
%define MAP_INC_MASK 0x0FFF
|
||||
%define BFMEM_INIT_SZ MAP_INC_SIZE
|
||||
|
||||
%define ELF_CODE_OFFSET 0x00400080
|
||||
|
||||
section .data
|
||||
|
||||
bf_start_head:
|
||||
push 0x00400085
|
||||
;dw 0x6885004000
|
||||
bf_start_head_sz: equ $ - bf_start_head
|
||||
bf_start:
|
||||
jmp .start
|
||||
.mremap: ; rbx is resize size
|
||||
cmp rbx, MAP_INC_SIZE
|
||||
jg .remap_cont
|
||||
xor rbx, rbx
|
||||
.remap_cont:
|
||||
xor rbx, MAP_INC_MASK
|
||||
add rbx, MAP_INC_SIZE
|
||||
add r14, rbx
|
||||
.mremap:
|
||||
; Resize the mmap
|
||||
; rbx is resize min size
|
||||
; rdi is map ptr offset
|
||||
; r14 is map_len
|
||||
; r15 is map_addr
|
||||
; Returns :
|
||||
; r15 new map_addr
|
||||
; r14 new map_len
|
||||
; rdi map ptr offset
|
||||
; rsi map ptr
|
||||
push rdi
|
||||
|
||||
; set min resize
|
||||
xor rdx, rdx
|
||||
.loop_min_remap:
|
||||
add rdx, MAP_INC_SIZE
|
||||
cmp rdx, rbx
|
||||
jl .loop_min_remap
|
||||
add r14, rdx ; newlen
|
||||
|
||||
mov rax, 0x19 ; mremap
|
||||
mov rdi, r15 ; addr
|
||||
mov rsi, r14 ; oldlen
|
||||
|
|
@ -61,6 +72,10 @@ section .data
|
|||
cmp rax, 0
|
||||
jle .erremap
|
||||
mov r15, rax
|
||||
; restore rsi & rdi
|
||||
pop rdi
|
||||
mov rsi, r15
|
||||
add rsi, rdi
|
||||
ret
|
||||
.erremap:
|
||||
mov rax, 0x3c
|
||||
|
|
@ -68,23 +83,55 @@ section .data
|
|||
syscall
|
||||
align 8
|
||||
.lbl_incresize: equ $ - bf_start
|
||||
.incresize: ; rbx is resize size
|
||||
|
||||
.incresize:
|
||||
; Resize the map on ptr increment
|
||||
; rbx is increment count
|
||||
; rdi is map ptr offset
|
||||
; r14 is map_len
|
||||
; r15 is map_addr
|
||||
call .mremap
|
||||
ret
|
||||
align 8
|
||||
.lbl_decresize: equ $ - bf_start
|
||||
.decresize: ; rbx is decrement
|
||||
push rsi
|
||||
push r14
|
||||
|
||||
.decresize:
|
||||
; Resize the map on ptr decrement
|
||||
; rbx is decrement count
|
||||
; rdi is map ptr offset
|
||||
; r14 is map_len
|
||||
; r15 is map_addr
|
||||
; Note : data has to be shifted
|
||||
push r14 ; old map len
|
||||
call .incresize
|
||||
pop rcx ; old size
|
||||
; shift datas
|
||||
pop rcx ; old len
|
||||
mov rbx, r14 ; new_len
|
||||
push rsi
|
||||
push rdi
|
||||
mov rsi, r15
|
||||
mov rdi, rsi
|
||||
inc rdi
|
||||
.decresize_cpy:
|
||||
add rsi, rcx ; add old_len to map_ptr
|
||||
add rdi, rbx ; add new_len to map_ptr
|
||||
sub rbx, rcx ; new_len - old_len : resize
|
||||
std ; set DF to dec rsi & rdi
|
||||
.decresize_shift:
|
||||
movsb
|
||||
loop .decresize_cpy
|
||||
mov byte [r15], 0
|
||||
loop .decresize_shift
|
||||
; set first map bytes to 0
|
||||
mov rdi, r15
|
||||
add rdi, rbx
|
||||
dec rdi
|
||||
mov rcx, rbx
|
||||
.decresize_zeros:
|
||||
mov byte [rdi], 0x0
|
||||
dec rdi
|
||||
loop .decresize_zeros
|
||||
pop rdi
|
||||
pop rsi
|
||||
; update map_ptr & offset given the shift
|
||||
add rdi, rbx
|
||||
add rsi, rbx
|
||||
ret
|
||||
.errmap:
|
||||
mov rax, 0x3c
|
||||
|
|
@ -103,67 +150,74 @@ section .data
|
|||
syscall
|
||||
cmp rax, 0
|
||||
jle .errmap
|
||||
mov r15, rax
|
||||
|
||||
; Sets BF runtime :
|
||||
; r14 is map len
|
||||
mov r15, rax ; r15 is map addr
|
||||
mov rdi, (BFMEM_INIT_SZ / 2) ; rdi is ptr idx
|
||||
mov rsi, r15
|
||||
add rsi, (BFMEM_INIT_SZ / 2) ; BF ptr
|
||||
add rsi, rdi ; rsi is bf ptr
|
||||
align 8
|
||||
bf_start_sz: equ $ - bf_start
|
||||
|
||||
|
||||
; In piece of code call jump is achieved by adding
|
||||
; an offset to the JIT map base addr
|
||||
; this base address has to be on top of the stack
|
||||
; when executing this small piece of code
|
||||
;
|
||||
; the first instruction has to be a mov of a byte
|
||||
; in a register. This operation will be updated to
|
||||
; "pass" a parameter
|
||||
; In piece of code the first instruction has to be a mov of
|
||||
; a quadword in a register. This operation will be updated
|
||||
; to "pass" a parameter
|
||||
; rsi is map_ptr
|
||||
; rdi is map ptr offset
|
||||
; r14 is map_len
|
||||
; r15 is map_addr
|
||||
|
||||
bf_decptr:
|
||||
; dec map ptr
|
||||
; rbx is dec count
|
||||
mov rbx, strict qword 0x1
|
||||
push rbx
|
||||
cmp rsi, rbx
|
||||
cmp rdi, rbx
|
||||
jge .end
|
||||
mov rax, [rsp+8]
|
||||
add rax, bf_start.lbl_decresize
|
||||
mov rax, ELF_CODE_OFFSET + bf_start.lbl_decresize
|
||||
call rax
|
||||
;call (ELF_CODE_OFFSET + bf_start.lbl_decresize)
|
||||
.end:
|
||||
pop rbx
|
||||
sub rsi, rbx
|
||||
sub rdi, rbx
|
||||
bf_decptr_sz: equ $ - bf_decptr
|
||||
|
||||
bf_incptr:
|
||||
mov rbx, strict qword 0x1
|
||||
push rbx
|
||||
mov rax, rsi
|
||||
sub rax, r15
|
||||
cmp rax, r14
|
||||
jl .end
|
||||
mov rax, [rsp+8]
|
||||
add rax, bf_start.lbl_incresize
|
||||
add rbx, rdi
|
||||
cmp rdi, r14
|
||||
jge .end
|
||||
mov rbx, [rsp]
|
||||
mov rax, ELF_CODE_OFFSET + bf_start.lbl_incresize
|
||||
call rax
|
||||
;call (ELF_CODE_OFFSET + bf_start.lbl_incresize)
|
||||
.end:
|
||||
pop rbx
|
||||
add rsi, rbx
|
||||
add rdi, rbx
|
||||
bf_incptr_sz: equ $ - bf_incptr
|
||||
|
||||
bf_incval:
|
||||
mov rbx, strict qword 0x1
|
||||
xor rax, rax
|
||||
mov al,[rsi]
|
||||
add rax, rbx
|
||||
add al, bl
|
||||
mov [rsi], al
|
||||
bf_incval_sz: equ $ - bf_incval
|
||||
|
||||
bf_decval:
|
||||
mov rbx, strict qword 0x1
|
||||
xor rax, rax
|
||||
mov al, [rsi]
|
||||
sub rax, rbx
|
||||
sub al, bl
|
||||
mov [rsi], al
|
||||
bf_decval_sz: equ $ - bf_decval
|
||||
|
||||
bf_readval:
|
||||
mov rdx, strict qword 0x1
|
||||
push rdi
|
||||
push rsi
|
||||
xor rax, rax ; read
|
||||
xor rdi, rdi ; stdin
|
||||
|
|
@ -173,22 +227,28 @@ section .data
|
|||
mov byte [rsi], 0
|
||||
.end:
|
||||
pop rsi
|
||||
pop rdi
|
||||
bf_readval_sz: equ $ - bf_readval
|
||||
|
||||
bf_writeval:
|
||||
mov rdx, strict qword 0x1
|
||||
mov rcx, strict qword 0x1
|
||||
push rdi
|
||||
push rsi
|
||||
xor rax, rax ; write
|
||||
inc rax
|
||||
mov rdi, rax ; stdout
|
||||
syscall
|
||||
.loop_write:
|
||||
push rcx
|
||||
mov rax, 1 ; write
|
||||
mov rdi, rax ; stdout
|
||||
mov rsi, [rsp+8]
|
||||
mov rdx, 1 ; 1 chr
|
||||
syscall
|
||||
pop rcx
|
||||
loop .loop_write
|
||||
pop rsi
|
||||
pop rdi
|
||||
bf_writeval_sz: equ $ - bf_writeval
|
||||
|
||||
bf_loopstart:
|
||||
mov rbx, strict qword 0x1
|
||||
add rbx, [rsp]
|
||||
xor rdx, rdx
|
||||
mov dl, [rsi]
|
||||
cmp dl, 0
|
||||
jnz .end
|
||||
|
|
@ -198,8 +258,6 @@ section .data
|
|||
|
||||
bf_loopend:
|
||||
mov rbx, strict qword 0x1
|
||||
add rbx, [rsp]
|
||||
xor rdx, rdx
|
||||
mov dl, [rsi]
|
||||
cmp dl, 0
|
||||
jz .end
|
||||
|
|
@ -403,7 +461,6 @@ _start:
|
|||
|
||||
.write_elf: ; writing elf file
|
||||
mov rax, [rsp] ; map len
|
||||
add rax, bf_start_head_sz
|
||||
mov [elf_section_text_sz], rax
|
||||
add rax, elf_head_sz ; elf head + map_ptr
|
||||
mov [elf_head + 0x60], rax
|
||||
|
|
@ -439,12 +496,6 @@ _start:
|
|||
mov rdx, elf_head_sz
|
||||
syscall
|
||||
|
||||
mov rax, 1
|
||||
mov rdi, [rsp]
|
||||
mov rsi, bf_start_head
|
||||
mov rdx, bf_start_head_sz
|
||||
syscall
|
||||
|
||||
mov rax, 1
|
||||
mov rdi, [rsp]
|
||||
mov rsi, r15 ; map_addr
|
||||
|
|
@ -769,15 +820,24 @@ compile_bf:
|
|||
push rdx
|
||||
call code_cpy
|
||||
mov map_ptr, rax ; rax is map_ptr
|
||||
pop rdx
|
||||
sub rax, rdx
|
||||
add rax, 2 ;arg addr in code map
|
||||
mov rdi, rax
|
||||
pop rdx ; bf_loopend_sz
|
||||
lea rdi, [rax + 2]
|
||||
sub rdi, rdx ; arg addr for loop_end : map_ptr - loopend_sz
|
||||
|
||||
pop rbx ; loop_start code offset
|
||||
mov [rax], rbx ; loop end jump to start
|
||||
|
||||
lea rax, [rbx+ELF_CODE_OFFSET] ; jmp to loop_start in loop_end
|
||||
mov [rdi], rax
|
||||
.br1:
|
||||
|
||||
mov rax, map_ptr
|
||||
sub rax, r15 ; loop end offset in map
|
||||
add rbx, r15 ; loop start addr
|
||||
mov [rbx+2], rax ; start jump to end
|
||||
sub rax, r15 ; map_ptr - map_addr : map_offset of loop_end nxt instr
|
||||
lea rdi, [rbx + r15 + 2] ; arg addr for loop_start in map
|
||||
lea rax, [rax + ELF_CODE_OFFSET]
|
||||
.br2:
|
||||
mov [rdi], rax
|
||||
.br3:
|
||||
jmp .nxtinstr
|
||||
|
||||
.callcpy:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue