about summary refs log tree commit diff stats
path: root/html/subx
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-12-03 16:38:44 -0800
committerKartik Agaram <vc@akkartik.com>2018-12-03 16:44:16 -0800
commit5e27c7f13e6a888484ccf144579ed2d3b676da89 (patch)
tree7763e7d04c2c0e1c374750777b0361b826401fdd /html/subx
parent5082923e81d331c2be12d6ec0be098bbd7ecf1c2 (diff)
downloadmu-5e27c7f13e6a888484ccf144579ed2d3b676da89.tar.gz
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.
Diffstat (limited to 'html/subx')
-rw-r--r--html/subx/056write.subx.html98
1 files changed, 49 insertions, 49 deletions
diff --git a/html/subx/056write.subx.html b/html/subx/056write.subx.html
index 7ada1e78..727bda6b 100644
--- a/html/subx/056write.subx.html
+++ b/html/subx/056write.subx.html
@@ -92,55 +92,55 @@ if ('onhashchange' in window) {
 <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="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) -&gt; bytes_written/EAX</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="L32" class="LineNr"> 32 </span>    <span class="subxComment"># the number of bytes *not* written. Success would then be signaled by</span>
-<span id="L33" class="LineNr"> 33 </span>    <span class="subxComment"># returning 0.)</span>
-<span id="L34" class="LineNr"> 34 </span>    <span class="subxS1Comment"># . prolog</span>
-<span id="L35" class="LineNr"> 35 </span>    55/push-EBP
-<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="L37" class="LineNr"> 37 </span>    <span class="subxComment"># if (f &lt; 0x08000000) _write(f, s), return  # f can't be a user-mode address, so treat it as a kernel file descriptor</span>
-<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="L39" class="LineNr"> 39 </span>    7d/jump-if-greater-or-equal  $write:fake/disp8
-<span id="L40" class="LineNr"> 40 </span>    <span class="subxS2Comment"># . . push args</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="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="L43" class="LineNr"> 43 </span>    <span class="subxS2Comment"># . . call</span>
-<span id="L44" class="LineNr"> 44 </span>    e8/call  _write/disp32
-<span id="L45" class="LineNr"> 45 </span>    <span class="subxS2Comment"># . . discard args</span>
-<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="L47" class="LineNr"> 47 </span>    eb/jump  $write:end/disp8
-<span id="L48" class="LineNr"> 48 </span><span class="Constant">$write:fake</span>:
-<span id="L49" class="LineNr"> 49 </span>    <span class="subxComment"># otherwise, treat 'f' as a stream to append to</span>
-<span id="L50" class="LineNr"> 50 </span>    <span class="subxS1Comment"># . save registers</span>
-<span id="L51" class="LineNr"> 51 </span>    51/push-ECX
-<span id="L52" class="LineNr"> 52 </span>    52/push-EDX
-<span id="L53" class="LineNr"> 53 </span>    53/push-EBX
-<span id="L54" class="LineNr"> 54 </span>    <span class="subxComment"># ECX = f</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="L56" class="LineNr"> 56 </span>    <span class="subxComment"># EDX = f-&gt;write</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="L58" class="LineNr"> 58 </span>    <span class="subxComment"># EBX = f-&gt;length</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="L60" class="LineNr"> 60 </span>    <span class="subxComment"># EAX = _append-3(&amp;f-&gt;data[f-&gt;write], &amp;f-&gt;data[f-&gt;length], s)</span>
-<span id="L61" class="LineNr"> 61 </span>    <span class="subxS2Comment"># . . push s</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="L63" class="LineNr"> 63 </span>    <span class="subxS2Comment"># . . push &amp;f-&gt;data[f-&gt;length]</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="L65" class="LineNr"> 65 </span>    53/push-EBX
-<span id="L66" class="LineNr"> 66 </span>    <span class="subxS2Comment"># . . push &amp;f-&gt;data[f-&gt;write]</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="L68" class="LineNr"> 68 </span>    53/push-EBX
-<span id="L69" class="LineNr"> 69 </span>    <span class="subxS2Comment"># . . call</span>
-<span id="L70" class="LineNr"> 70 </span>    e8/call  _append-3/disp32
-<span id="L71" class="LineNr"> 71 </span>    <span class="subxS2Comment"># . . discard args</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="L73" class="LineNr"> 73 </span>    <span class="subxComment"># f-&gt;write += EAX</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="L75" class="LineNr"> 75 </span>    <span class="subxS1Comment"># . restore registers</span>
-<span id="L76" class="LineNr"> 76 </span>    5b/pop-to-EBX
-<span id="L77" class="LineNr"> 77 </span>    5a/pop-to-EDX
-<span id="L78" class="LineNr"> 78 </span>    59/pop-to-ECX
+<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="subxFunction">write</span>:  <span class="subxComment"># f : fd or (address stream), s : (address array byte) -&gt; &lt;void&gt;</span>
+<span id="L32" class="LineNr"> 32 </span>    <span class="subxS1Comment"># . prolog</span>
+<span id="L33" class="LineNr"> 33 </span>    55/push-EBP
+<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>    <span class="subxComment"># if (f &lt; 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>    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>    7d/jump-if-greater-or-equal  $write:fake/disp8
+<span id="L38" class="LineNr"> 38 </span>    <span class="subxS2Comment"># . . push args</span>
+<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>    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>    <span class="subxS2Comment"># . . call</span>
+<span id="L42" class="LineNr"> 42 </span>    e8/call  _write/disp32
+<span id="L43" class="LineNr"> 43 </span>    <span class="subxS2Comment"># . . discard args</span>
+<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>    eb/jump  $write:end/disp8
+<span id="L46" class="LineNr"> 46 </span><span class="Constant">$write:fake</span>:
+<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="subxS1Comment"># . save registers</span>
+<span id="L49" class="LineNr"> 49 </span>    50/push-EAX
+<span id="L50" class="LineNr"> 50 </span>    51/push-ECX
+<span id="L51" class="LineNr"> 51 </span>    52/push-EDX
+<span id="L52" class="LineNr"> 52 </span>    53/push-EBX
+<span id="L53" class="LineNr"> 53 </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>    <span class="subxComment"># EDX = f-&gt;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>    <span class="subxComment"># EBX = f-&gt;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>    <span class="subxComment"># EAX = _append-3(&amp;f-&gt;data[f-&gt;write], &amp;f-&gt;data[f-&gt;length], s)</span>
+<span id="L60" class="LineNr"> 60 </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>    <span class="subxS2Comment"># . . push &amp;f-&gt;data[f-&gt;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>    53/push-EBX
+<span id="L65" class="LineNr"> 65 </span>    <span class="subxS2Comment"># . . push &amp;f-&gt;data[f-&gt;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>    53/push-EBX
+<span id="L68" class="LineNr"> 68 </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>    <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>    <span class="subxComment"># f-&gt;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>    <span class="subxS1Comment"># . restore registers</span>
+<span id="L75" class="LineNr"> 75 </span>    5b/pop-to-EBX
+<span id="L76" class="LineNr"> 76 </span>    5a/pop-to-EDX
+<span id="L77" class="LineNr"> 77 </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="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>