Enhancement of elf generation

Now addresses are absolutre from the elf code start => JIT do not
work anymore
This commit is contained in:
Yann Weber 2019-01-05 22:32:12 +01:00
commit a9ac2eeff9

194
bfc.asm
View file

@ -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: