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