about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-11-26 01:21:57 -0800
committerKartik Agaram <vc@akkartik.com>2018-11-26 01:22:50 -0800
commit063741b4a2edfd64cd639ebc108d051af269ef5c (patch)
tree8c958dda1a22e5c5f93622a65afede7571b5d8f4
parentd1c9392a5461e0d33e226375a8f7986a97d2d66b (diff)
downloadmu-063741b4a2edfd64cd639ebc108d051af269ef5c.tar.gz
4783
-rw-r--r--subx/Readme.md46
1 files changed, 46 insertions, 0 deletions
diff --git a/subx/Readme.md b/subx/Readme.md
index cfc7a3fb..e58cd9f3 100644
--- a/subx/Readme.md
+++ b/subx/Readme.md
@@ -337,6 +337,52 @@ Running `subx` will transparently compile it as necessary.
   building general infrastructure here for all of the x86 instruction set.
   SubX is about programming with a small, regular subset of 32-bit x86.
 
+## SubX library
+
+A major goal of SubX is testable wrappers for operating system syscalls.
+Here's what I've built so far:
+
+* `write`: takes two arguments, `f` and `s`.
+  - `s` is an address to an _array_. Arrays in SubX are always assumed to
+    start with a 4-byte length.
+  - `f` is either a file descriptor to write `s` to, or (in tests) a _stream_.
+    Streams are in-memory buffers that can be read or written. They consist of
+    a `data` array of bytes as well as `read` and `write` indexes into the
+    array, showing how far we've read and written so far.
+
+  Comparing this interface with the Unix `write()` syscall shows two benefits:
+
+  1. SubX can handle 'fake' file descriptors in tests.
+
+  1. `write()` accepts buffer and its length in separate arguments, which
+     requires callers to manage the two separately and so can be error-prone.
+     SubX's wrapper keeps the two together to increase the chances that we
+     never accidentally go out of array bounds.
+
+* `read`: takes two arguments, `f` and `s`.
+  - `s` is an address to a _stream_ to save the read data to. We read as much
+    data as can fit in `s`, and no more.
+  - `f` is either a file descriptor to write `s` to, or (in tests) a _stream_.
+
+  Like with `write()`, this wrapper around the Unix `read()` syscall adds the
+  ability to handle 'fake' file descriptors in tests, and reduces the chances
+  of clobbering outside array bounds.
+
+  One bit of weirdness here: in tests we do a redundant copy from one stream
+  to another. See [the comments before the implementation](http://akkartik.github.io/mu/html/subx/058read.subx.html)
+  for a discussion of alternative interfaces.
+
+* `stop`: takes two arguments:
+  - `ed` is an address to an _exit descriptor_. Exit descriptors allow us to
+    `exit()` the program normally, but return to the test harness within
+    tests. That allows tests to make assertions about when `exit()` is called.
+  - `value` is the status code to `exit()` with.
+
+  For more details on exit descriptors and how to create one, see [the
+  comments before the implementation](http://akkartik.github.io/mu/html/subx/057stop.subx.html).
+
+* ... _(to be continued)_
+
 ## Resources
 
 * [Single-page cheatsheet for the x86 ISA](https://net.cs.uni-bonn.de/fileadmin/user_upload/plohmann/x86_opcode_structure_and_instruction_overview.pdf)