4827
I was 'returning' a phantom value from 'write' when the underlying '_write' returns nothing. In general, returning counts of bytes written is not so useful for error checking when my primitives abstract away from that. We'll come back to error signalling later.
This commit is contained in:
parent
5082923e81
commit
5e27c7f13e
|
@ -92,55 +92,55 @@ if ('onhashchange' in window) {
|
||||||
<span id="L27" class="LineNr"> 27 </span> b8/copy-to-EAX 1/imm32
|
<span id="L27" class="LineNr"> 27 </span> b8/copy-to-EAX 1/imm32
|
||||||
<span id="L28" class="LineNr"> 28 </span> cd/syscall 0x80/imm8
|
<span id="L28" class="LineNr"> 28 </span> cd/syscall 0x80/imm8
|
||||||
<span id="L29" class="LineNr"> 29 </span>
|
<span id="L29" class="LineNr"> 29 </span>
|
||||||
<span id="L30" class="LineNr"> 30 </span><span class="subxFunction">write</span>: <span class="subxComment"># f : fd or (address stream), s : (address array byte) -> bytes_written/EAX</span>
|
<span id="L30" class="LineNr"> 30 </span><span class="subxComment"># TODO: come up with a way to signal when a write to disk fails</span>
|
||||||
<span id="L31" class="LineNr"> 31 </span> <span class="subxComment"># (If we ever leave the Linux kernel behind, it may be better to return</span>
|
<span id="L31" class="LineNr"> 31 </span><span class="subxFunction">write</span>: <span class="subxComment"># f : fd or (address stream), s : (address array byte) -> <void></span>
|
||||||
<span id="L32" class="LineNr"> 32 </span> <span class="subxComment"># the number of bytes *not* written. Success would then be signaled by</span>
|
<span id="L32" class="LineNr"> 32 </span> <span class="subxS1Comment"># . prolog</span>
|
||||||
<span id="L33" class="LineNr"> 33 </span> <span class="subxComment"># returning 0.)</span>
|
<span id="L33" class="LineNr"> 33 </span> 55/push-EBP
|
||||||
<span id="L34" class="LineNr"> 34 </span> <span class="subxS1Comment"># . prolog</span>
|
<span id="L34" class="LineNr"> 34 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 4/r32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># copy ESP to EBP</span>
|
||||||
<span id="L35" class="LineNr"> 35 </span> 55/push-EBP
|
<span id="L35" class="LineNr"> 35 </span> <span class="subxComment"># if (f < 0x08000000) _write(f, s), return # f can't be a user-mode address, so treat it as a kernel file descriptor</span>
|
||||||
<span id="L36" class="LineNr"> 36 </span> 89/copy 3/mod/direct 5/rm32/EBP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 4/r32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># copy ESP to EBP</span>
|
<span id="L36" class="LineNr"> 36 </span> 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 8/disp8 0x08000000/imm32 <span class="subxComment"># compare *(EBP+8)</span>
|
||||||
<span id="L37" class="LineNr"> 37 </span> <span class="subxComment"># if (f < 0x08000000) _write(f, s), return # f can't be a user-mode address, so treat it as a kernel file descriptor</span>
|
<span id="L37" class="LineNr"> 37 </span> 7d/jump-if-greater-or-equal $write:fake/disp8
|
||||||
<span id="L38" class="LineNr"> 38 </span> 81 7/subop/compare 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 8/disp8 0x08000000/imm32 <span class="subxComment"># compare *(EBP+8)</span>
|
<span id="L38" class="LineNr"> 38 </span> <span class="subxS2Comment"># . . push args</span>
|
||||||
<span id="L39" class="LineNr"> 39 </span> 7d/jump-if-greater-or-equal $write:fake/disp8
|
<span id="L39" class="LineNr"> 39 </span> ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># push *(EBP+12)</span>
|
||||||
<span id="L40" class="LineNr"> 40 </span> <span class="subxS2Comment"># . . push args</span>
|
<span id="L40" class="LineNr"> 40 </span> ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 8/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># push *(EBP+8)</span>
|
||||||
<span id="L41" class="LineNr"> 41 </span> ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># push *(EBP+12)</span>
|
<span id="L41" class="LineNr"> 41 </span> <span class="subxS2Comment"># . . call</span>
|
||||||
<span id="L42" class="LineNr"> 42 </span> ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 8/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># push *(EBP+8)</span>
|
<span id="L42" class="LineNr"> 42 </span> e8/call _write/disp32
|
||||||
<span id="L43" class="LineNr"> 43 </span> <span class="subxS2Comment"># . . call</span>
|
<span id="L43" class="LineNr"> 43 </span> <span class="subxS2Comment"># . . discard args</span>
|
||||||
<span id="L44" class="LineNr"> 44 </span> e8/call _write/disp32
|
<span id="L44" class="LineNr"> 44 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
|
||||||
<span id="L45" class="LineNr"> 45 </span> <span class="subxS2Comment"># . . discard args</span>
|
<span id="L45" class="LineNr"> 45 </span> eb/jump $write:end/disp8
|
||||||
<span id="L46" class="LineNr"> 46 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 8/imm32 <span class="subxComment"># add to ESP</span>
|
<span id="L46" class="LineNr"> 46 </span><span class="Constant">$write:fake</span>:
|
||||||
<span id="L47" class="LineNr"> 47 </span> eb/jump $write:end/disp8
|
<span id="L47" class="LineNr"> 47 </span> <span class="subxComment"># otherwise, treat 'f' as a stream to append to</span>
|
||||||
<span id="L48" class="LineNr"> 48 </span><span class="Constant">$write:fake</span>:
|
<span id="L48" class="LineNr"> 48 </span> <span class="subxS1Comment"># . save registers</span>
|
||||||
<span id="L49" class="LineNr"> 49 </span> <span class="subxComment"># otherwise, treat 'f' as a stream to append to</span>
|
<span id="L49" class="LineNr"> 49 </span> 50/push-EAX
|
||||||
<span id="L50" class="LineNr"> 50 </span> <span class="subxS1Comment"># . save registers</span>
|
<span id="L50" class="LineNr"> 50 </span> 51/push-ECX
|
||||||
<span id="L51" class="LineNr"> 51 </span> 51/push-ECX
|
<span id="L51" class="LineNr"> 51 </span> 52/push-EDX
|
||||||
<span id="L52" class="LineNr"> 52 </span> 52/push-EDX
|
<span id="L52" class="LineNr"> 52 </span> 53/push-EBX
|
||||||
<span id="L53" class="LineNr"> 53 </span> 53/push-EBX
|
<span id="L53" class="LineNr"> 53 </span> <span class="subxComment"># ECX = f</span>
|
||||||
<span id="L54" class="LineNr"> 54 </span> <span class="subxComment"># ECX = f</span>
|
<span id="L54" class="LineNr"> 54 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 1/r32/ECX 8/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
|
||||||
<span id="L55" class="LineNr"> 55 </span> 8b/copy 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none 1/r32/ECX 8/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy *(EBP+8) to ECX</span>
|
<span id="L55" class="LineNr"> 55 </span> <span class="subxComment"># EDX = f->write</span>
|
||||||
<span id="L56" class="LineNr"> 56 </span> <span class="subxComment"># EDX = f->write</span>
|
<span id="L56" class="LineNr"> 56 </span> 8b/copy 0/mod/indirect 1/rm32/ECX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 2/r32/EDX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># copy *ECX to EDX</span>
|
||||||
<span id="L57" class="LineNr"> 57 </span> 8b/copy 0/mod/indirect 1/rm32/ECX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 2/r32/EDX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># copy *ECX to EDX</span>
|
<span id="L57" class="LineNr"> 57 </span> <span class="subxComment"># EBX = f->length</span>
|
||||||
<span id="L58" class="LineNr"> 58 </span> <span class="subxComment"># EBX = f->length</span>
|
<span id="L58" class="LineNr"> 58 </span> 8b/copy 1/mod/*+disp8 1/rm32/ECX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 3/r32/EBX 8/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy *(ECX+8) to EBX</span>
|
||||||
<span id="L59" class="LineNr"> 59 </span> 8b/copy 1/mod/*+disp8 1/rm32/ECX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 3/r32/EBX 8/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy *(ECX+8) to EBX</span>
|
<span id="L59" class="LineNr"> 59 </span> <span class="subxComment"># EAX = _append-3(&f->data[f->write], &f->data[f->length], s)</span>
|
||||||
<span id="L60" class="LineNr"> 60 </span> <span class="subxComment"># EAX = _append-3(&f->data[f->write], &f->data[f->length], s)</span>
|
<span id="L60" class="LineNr"> 60 </span> <span class="subxS2Comment"># . . push s</span>
|
||||||
<span id="L61" class="LineNr"> 61 </span> <span class="subxS2Comment"># . . push s</span>
|
<span id="L61" class="LineNr"> 61 </span> ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># push *(EBP+12)</span>
|
||||||
<span id="L62" class="LineNr"> 62 </span> ff 6/subop/push 1/mod/*+disp8 4/rm32/sib 5/base/EBP 4/index/none <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># push *(EBP+12)</span>
|
<span id="L62" class="LineNr"> 62 </span> <span class="subxS2Comment"># . . push &f->data[f->length]</span>
|
||||||
<span id="L63" class="LineNr"> 63 </span> <span class="subxS2Comment"># . . push &f->data[f->length]</span>
|
<span id="L63" class="LineNr"> 63 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 3/index/EBX <span class="CommentedCode"> . </span> 3/r32/EBX 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy ECX+EBX+12 to EBX</span>
|
||||||
<span id="L64" class="LineNr"> 64 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 3/index/EBX <span class="CommentedCode"> . </span> 3/r32/EBX 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy ECX+EBX+12 to EBX</span>
|
<span id="L64" class="LineNr"> 64 </span> 53/push-EBX
|
||||||
<span id="L65" class="LineNr"> 65 </span> 53/push-EBX
|
<span id="L65" class="LineNr"> 65 </span> <span class="subxS2Comment"># . . push &f->data[f->write]</span>
|
||||||
<span id="L66" class="LineNr"> 66 </span> <span class="subxS2Comment"># . . push &f->data[f->write]</span>
|
<span id="L66" class="LineNr"> 66 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX <span class="CommentedCode"> . </span> 3/r32/EBX 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy ECX+EDX+12 to EBX</span>
|
||||||
<span id="L67" class="LineNr"> 67 </span> 8d/copy-address 1/mod/*+disp8 4/rm32/sib 1/base/ECX 2/index/EDX <span class="CommentedCode"> . </span> 3/r32/EBX 0xc/disp8 <span class="CommentedCode"> . </span> <span class="subxComment"># copy ECX+EDX+12 to EBX</span>
|
<span id="L67" class="LineNr"> 67 </span> 53/push-EBX
|
||||||
<span id="L68" class="LineNr"> 68 </span> 53/push-EBX
|
<span id="L68" class="LineNr"> 68 </span> <span class="subxS2Comment"># . . call</span>
|
||||||
<span id="L69" class="LineNr"> 69 </span> <span class="subxS2Comment"># . . call</span>
|
<span id="L69" class="LineNr"> 69 </span> e8/call _append-3/disp32
|
||||||
<span id="L70" class="LineNr"> 70 </span> e8/call _append-3/disp32
|
<span id="L70" class="LineNr"> 70 </span> <span class="subxS2Comment"># . . discard args</span>
|
||||||
<span id="L71" class="LineNr"> 71 </span> <span class="subxS2Comment"># . . discard args</span>
|
<span id="L71" class="LineNr"> 71 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
|
||||||
<span id="L72" class="LineNr"> 72 </span> 81 0/subop/add 3/mod/direct 4/rm32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0xc/imm32 <span class="subxComment"># add to ESP</span>
|
<span id="L72" class="LineNr"> 72 </span> <span class="subxComment"># f->write += EAX</span>
|
||||||
<span id="L73" class="LineNr"> 73 </span> <span class="subxComment"># f->write += EAX</span>
|
<span id="L73" class="LineNr"> 73 </span> 01/add 0/mod/indirect 1/rm32/ECX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0/r32/EAX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># add EAX to *ECX</span>
|
||||||
<span id="L74" class="LineNr"> 74 </span> 01/add 0/mod/indirect 1/rm32/ECX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 0/r32/EAX <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># add EAX to *ECX</span>
|
<span id="L74" class="LineNr"> 74 </span> <span class="subxS1Comment"># . restore registers</span>
|
||||||
<span id="L75" class="LineNr"> 75 </span> <span class="subxS1Comment"># . restore registers</span>
|
<span id="L75" class="LineNr"> 75 </span> 5b/pop-to-EBX
|
||||||
<span id="L76" class="LineNr"> 76 </span> 5b/pop-to-EBX
|
<span id="L76" class="LineNr"> 76 </span> 5a/pop-to-EDX
|
||||||
<span id="L77" class="LineNr"> 77 </span> 5a/pop-to-EDX
|
<span id="L77" class="LineNr"> 77 </span> 59/pop-to-ECX
|
||||||
<span id="L78" class="LineNr"> 78 </span> 59/pop-to-ECX
|
<span id="L78" class="LineNr"> 78 </span> 58/pop-to-EAX
|
||||||
<span id="L79" class="LineNr"> 79 </span><span class="Constant">$write:end</span>:
|
<span id="L79" class="LineNr"> 79 </span><span class="Constant">$write:end</span>:
|
||||||
<span id="L80" class="LineNr"> 80 </span> <span class="subxS1Comment"># . epilog</span>
|
<span id="L80" class="LineNr"> 80 </span> <span class="subxS1Comment"># . epilog</span>
|
||||||
<span id="L81" class="LineNr"> 81 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 5/r32/EBP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># copy EBP to ESP</span>
|
<span id="L81" class="LineNr"> 81 </span> 89/copy 3/mod/direct 4/rm32/ESP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> 5/r32/EBP <span class="CommentedCode"> . </span> <span class="CommentedCode"> . </span> <span class="subxComment"># copy EBP to ESP</span>
|
||||||
|
|
|
@ -27,10 +27,8 @@
|
||||||
b8/copy-to-EAX 1/imm32
|
b8/copy-to-EAX 1/imm32
|
||||||
cd/syscall 0x80/imm8
|
cd/syscall 0x80/imm8
|
||||||
|
|
||||||
write: # f : fd or (address stream), s : (address array byte) -> bytes_written/EAX
|
# TODO: come up with a way to signal when a write to disk fails
|
||||||
# (If we ever leave the Linux kernel behind, it may be better to return
|
write: # f : fd or (address stream), s : (address array byte) -> <void>
|
||||||
# the number of bytes *not* written. Success would then be signaled by
|
|
||||||
# returning 0.)
|
|
||||||
# . prolog
|
# . prolog
|
||||||
55/push-EBP
|
55/push-EBP
|
||||||
89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP
|
89/copy 3/mod/direct 5/rm32/EBP . . . 4/r32/ESP . . # copy ESP to EBP
|
||||||
|
@ -48,6 +46,7 @@ write: # f : fd or (address stream), s : (address array byte) -> bytes_written/
|
||||||
$write:fake:
|
$write:fake:
|
||||||
# otherwise, treat 'f' as a stream to append to
|
# otherwise, treat 'f' as a stream to append to
|
||||||
# . save registers
|
# . save registers
|
||||||
|
50/push-EAX
|
||||||
51/push-ECX
|
51/push-ECX
|
||||||
52/push-EDX
|
52/push-EDX
|
||||||
53/push-EBX
|
53/push-EBX
|
||||||
|
@ -76,6 +75,7 @@ $write:fake:
|
||||||
5b/pop-to-EBX
|
5b/pop-to-EBX
|
||||||
5a/pop-to-EDX
|
5a/pop-to-EDX
|
||||||
59/pop-to-ECX
|
59/pop-to-ECX
|
||||||
|
58/pop-to-EAX
|
||||||
$write:end:
|
$write:end:
|
||||||
# . epilog
|
# . epilog
|
||||||
89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP
|
89/copy 3/mod/direct 4/rm32/ESP . . . 5/r32/EBP . . # copy EBP to ESP
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue