Browse Source

Enhancement of elf generation

Now addresses are absolutre from the elf code start => JIT do not
work anymore
Yann Weber 5 years ago
parent
commit
a9ac2eeff9
1 changed files with 127 additions and 67 deletions
  1. 127
    67
      bfc.asm

+ 127
- 67
bfc.asm View File

@@ -34,22 +34,33 @@ ALIGNMODE k8
34 34
 %define MAP_INC_MASK 0x0FFF
35 35
 %define BFMEM_INIT_SZ MAP_INC_SIZE
36 36
 
37
+%define ELF_CODE_OFFSET 0x00400080
38
+
37 39
 section .data
38 40
 
39
-	bf_start_head:
40
-		push 0x00400085
41
-		;dw 0x6885004000
42
-	bf_start_head_sz: equ $ - bf_start_head
43 41
 	bf_start:
44 42
 		jmp .start
45
-		.mremap: ; rbx is resize size
46
-			cmp rbx, MAP_INC_SIZE
47
-			jg .remap_cont
48
-			xor rbx, rbx
49
-			.remap_cont:
50
-			xor rbx, MAP_INC_MASK
51
-			add rbx, MAP_INC_SIZE
52
-			add r14, rbx
43
+		.mremap:
44
+			; Resize the mmap
45
+			;   rbx is resize min size
46
+			;   rdi is map ptr offset
47
+			;   r14 is map_len
48
+			;   r15 is map_addr
49
+			; Returns :
50
+			;   r15 new map_addr
51
+			;   r14 new map_len
52
+			;   rdi map ptr offset
53
+			;   rsi map ptr
54
+			push rdi
55
+
56
+			; set min resize
57
+			xor rdx, rdx
58
+			.loop_min_remap:
59
+				add rdx, MAP_INC_SIZE
60
+				cmp rdx, rbx
61
+				jl .loop_min_remap
62
+			add r14, rdx ; newlen
63
+
53 64
 			mov rax, 0x19	; mremap
54 65
 			mov rdi, r15	; addr
55 66
 			mov rsi, r14 	; oldlen
@@ -61,6 +72,10 @@ section .data
61 72
 			cmp rax, 0
62 73
 			jle .erremap
63 74
 			mov r15, rax
75
+			; restore rsi & rdi
76
+			pop rdi
77
+			mov rsi, r15
78
+			add rsi, rdi
64 79
 			ret
65 80
 			.erremap:
66 81
 				mov rax, 0x3c
@@ -68,23 +83,55 @@ section .data
68 83
 				syscall
69 84
 			align 8
70 85
 		.lbl_incresize: equ $ - bf_start
71
-		.incresize: ; rbx is resize size
86
+
87
+		.incresize:
88
+			; Resize the map on ptr increment
89
+			;   rbx is increment count
90
+			;   rdi is map ptr offset
91
+			;   r14 is map_len
92
+			;   r15 is map_addr
72 93
 			call .mremap
73 94
 			ret
74 95
 			align 8
75 96
 		.lbl_decresize: equ $ - bf_start
76
-		.decresize: ; rbx is decrement
77
-			push rsi
78
-			push r14
97
+
98
+		.decresize:
99
+			; Resize the map on ptr decrement
100
+			;   rbx is decrement count
101
+			;   rdi is map ptr offset
102
+			;   r14 is map_len
103
+			;   r15 is map_addr
104
+			; Note : data has to be shifted
105
+			push r14 ; old map len
79 106
 			call .incresize
80
-			pop rcx ; old size
107
+			; shift datas
108
+			pop rcx ; old len
109
+			mov rbx, r14 ; new_len
110
+			push rsi
111
+			push rdi
112
+			mov rsi, r15
81 113
 			mov rdi, rsi
82
-			inc rdi
83
-			.decresize_cpy:
114
+			add rsi, rcx ; add old_len to map_ptr
115
+			add rdi, rbx ; add new_len to map_ptr
116
+			sub rbx, rcx ; new_len - old_len : resize
117
+			std ; set DF to dec rsi & rdi
118
+			.decresize_shift:
84 119
 				movsb
85
-				loop .decresize_cpy
86
-			mov byte [r15], 0
120
+				loop .decresize_shift
121
+			; set first map bytes to 0
122
+			mov rdi, r15
123
+			add rdi, rbx
124
+			dec rdi
125
+			mov rcx, rbx
126
+			.decresize_zeros:
127
+				mov byte [rdi], 0x0
128
+				dec rdi
129
+				loop .decresize_zeros
130
+			pop rdi
87 131
 			pop rsi
132
+			; update map_ptr & offset given the shift
133
+			add rdi, rbx
134
+			add rsi, rbx
88 135
 			ret
89 136
 		.errmap:
90 137
 			mov rax, 0x3c
@@ -103,67 +150,74 @@ section .data
103 150
 		syscall
104 151
 		cmp rax, 0
105 152
 		jle .errmap
106
-		mov r15, rax
153
+
154
+		; Sets BF runtime :
155
+		; r14 is map len
156
+		mov r15, rax ; r15 is map addr
157
+		mov rdi, (BFMEM_INIT_SZ / 2) ; rdi is ptr idx
107 158
 		mov rsi, r15
108
-		add rsi, (BFMEM_INIT_SZ / 2) ; BF ptr
159
+		add rsi, rdi ; rsi is bf ptr
109 160
 		align 8
110 161
 	bf_start_sz: equ $ - bf_start
111 162
 
112 163
 	
113
-	; In piece of code call jump is achieved by adding
114
-	; an offset to the JIT map base addr
115
-	; this base address has to be on top of the stack
116
-	; when executing this small piece of code
117
-	;
118
-	; the first instruction has to be a mov of a byte
119
-	; in a register. This operation will be updated to
120
-	; "pass" a parameter
164
+	; In piece of code the first instruction has to be a mov of
165
+	; a quadword in a register. This operation will be updated
166
+	; to "pass" a parameter
167
+	;   rsi is map_ptr
168
+	;   rdi is map ptr offset
169
+	;   r14 is map_len
170
+	;   r15 is map_addr
171
+
121 172
 	bf_decptr:
173
+		; dec map ptr
174
+		;	rbx is dec count
122 175
 		mov rbx, strict qword 0x1
123 176
 		push rbx
124
-		cmp rsi, rbx
177
+		cmp rdi, rbx
125 178
 		jge .end
126
-		mov rax, [rsp+8]
127
-		add rax, bf_start.lbl_decresize
179
+		mov rax, ELF_CODE_OFFSET + bf_start.lbl_decresize
128 180
 		call rax
181
+		;call (ELF_CODE_OFFSET + bf_start.lbl_decresize)
129 182
 		.end:
130 183
 		pop rbx
131 184
 		sub rsi, rbx
185
+		sub rdi, rbx
132 186
 	bf_decptr_sz: equ $ - bf_decptr
133 187
 
134 188
 	bf_incptr:
135 189
 		mov rbx, strict qword 0x1
136 190
 		push rbx
137
-		mov rax, rsi
138
-		sub rax, r15
139
-		cmp rax, r14
140
-		jl .end
141
-		mov rax, [rsp+8]
142
-		add rax, bf_start.lbl_incresize
191
+		add rbx, rdi
192
+		cmp rdi, r14
193
+		jge .end
194
+		mov rbx, [rsp]
195
+		mov rax, ELF_CODE_OFFSET + bf_start.lbl_incresize
143 196
 		call rax
197
+		;call (ELF_CODE_OFFSET + bf_start.lbl_incresize)
144 198
 		.end:
145 199
 		pop rbx
146 200
 		add rsi, rbx
201
+		add rdi, rbx
147 202
 	bf_incptr_sz: equ $ - bf_incptr
148 203
 
149 204
 	bf_incval:
150 205
 		mov rbx, strict qword 0x1
151
-		xor rax, rax
152 206
 		mov al,[rsi]
153
-		add rax, rbx
207
+		add al, bl
154 208
 		mov [rsi], al
155 209
 	bf_incval_sz: equ $ - bf_incval
156 210
 
157 211
 	bf_decval:
158 212
 		mov rbx, strict qword 0x1
159
-		xor rax, rax
160 213
 		mov al, [rsi]
161
-		sub rax, rbx
214
+		sub al, bl
162 215
 		mov [rsi], al
163 216
 	bf_decval_sz: equ $ - bf_decval
164 217
 
165 218
 	bf_readval:
166 219
 		mov rdx, strict qword 0x1
220
+		push rdi
167 221
 		push rsi
168 222
 		xor rax, rax ; read
169 223
 		xor rdi, rdi ; stdin
@@ -173,22 +227,28 @@ section .data
173 227
 		mov byte [rsi], 0
174 228
 		.end:
175 229
 		pop rsi
230
+		pop rdi
176 231
 	bf_readval_sz: equ $ - bf_readval
177 232
 
178 233
 	bf_writeval:
179
-		mov rdx, strict qword 0x1
234
+		mov rcx, strict qword 0x1
235
+		push rdi
180 236
 		push rsi
181
-		xor rax, rax ; write
182
-		inc rax
183
-		mov rdi, rax ; stdout
184
-		syscall
237
+		.loop_write:
238
+			push rcx
239
+			mov rax, 1 ; write
240
+			mov rdi, rax ; stdout
241
+			mov rsi, [rsp+8]
242
+			mov rdx, 1 ; 1 chr
243
+			syscall
244
+			pop rcx
245
+			loop .loop_write
185 246
 		pop rsi
247
+		pop rdi
186 248
 	bf_writeval_sz: equ $ - bf_writeval
187 249
 
188 250
 	bf_loopstart:
189 251
 		mov rbx, strict qword 0x1
190
-		add rbx, [rsp]
191
-		xor rdx, rdx
192 252
 		mov dl, [rsi]
193 253
 		cmp dl, 0
194 254
 		jnz .end
@@ -198,8 +258,6 @@ section .data
198 258
 
199 259
 	bf_loopend:
200 260
 		mov rbx, strict qword 0x1
201
-		add rbx, [rsp]
202
-		xor rdx, rdx
203 261
 		mov dl, [rsi]
204 262
 		cmp dl, 0
205 263
 		jz .end
@@ -403,7 +461,6 @@ _start:
403 461
 
404 462
 	.write_elf: ; writing elf file
405 463
 	mov rax, [rsp] ; map len
406
-	add rax, bf_start_head_sz
407 464
 	mov [elf_section_text_sz], rax
408 465
 	add rax, elf_head_sz ; elf head + map_ptr
409 466
 	mov [elf_head + 0x60], rax
@@ -439,12 +496,6 @@ _start:
439 496
 	mov rdx, elf_head_sz
440 497
 	syscall
441 498
 
442
-	mov rax, 1
443
-	mov rdi, [rsp]
444
-	mov rsi, bf_start_head
445
-	mov rdx, bf_start_head_sz
446
-	syscall
447
-
448 499
 	mov rax, 1
449 500
 	mov rdi, [rsp]
450 501
 	mov rsi, r15 ; map_addr
@@ -769,15 +820,24 @@ compile_bf:
769 820
 			push rdx
770 821
 			call code_cpy
771 822
 			mov map_ptr, rax ; rax is map_ptr
772
-			pop rdx
773
-			sub rax, rdx
774
-			add rax, 2 ;arg addr in code map
823
+			mov rdi, rax
824
+			pop rdx ; bf_loopend_sz
825
+			lea rdi, [rax + 2]
826
+			sub rdi, rdx ; arg addr for loop_end : map_ptr - loopend_sz
827
+
775 828
 			pop rbx ; loop_start code offset
776
-			mov [rax], rbx ; loop end jump to start
829
+
830
+			lea rax, [rbx+ELF_CODE_OFFSET] ; jmp to loop_start in loop_end
831
+			mov [rdi], rax
832
+			.br1:
833
+
777 834
 			mov rax, map_ptr
778
-			sub rax, r15 ; loop end offset in map
779
-			add rbx, r15 ; loop start addr
780
-			mov [rbx+2], rax ; start jump to end
835
+			sub rax, r15 ; map_ptr - map_addr : map_offset of loop_end nxt instr
836
+			lea rdi, [rbx + r15 + 2] ; arg addr for loop_start in map
837
+			lea rax, [rax + ELF_CODE_OFFSET]
838
+			.br2:
839
+			mov [rdi], rax
840
+			.br3:
781 841
 			jmp .nxtinstr
782 842
 
783 843
 		.callcpy:

Loading…
Cancel
Save