summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md12
-rw-r--r--lib/libgfx/include/libgfx/gfx.h2
-rw-r--r--share/docs/kernel/ctlfs.md125
3 files changed, 135 insertions, 4 deletions
diff --git a/README.md b/README.md
index ca9e235..a8a31fe 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,9 @@ The Hyra Operating System
=========================
Welcome to the Hyra Operating System project! Hyra is an experimental
-operating system inspired by BSD and Plan 9 while being entirely written
-entirely from scratch. Hyra aims to rethink core fundamentals in modern operating system design
-in order to create new and improved architectural ideas.
+operating system inspired by BSD and Plan 9 while being entirely written from scratch.
+Hyra aims to rethink core fundamentals in modern operating system design in order to
+create new and improved architectural ideas.
Project Goal:
@@ -72,7 +72,11 @@ And more! See ``lib/*``
Documentation:
--------------
-Documentation will be in the form of comments throughout the codebase and can also be found in the share/ directory within the project root.
+Documentation will be in the form of comments throughout the codebase and can also be found in:
+
+- ``share/man/*``: Man pages
+- ``share/contrib``: Information on contributing
+- ``share/docs/kernel``: Kernel documentation
Hyra running on bare metal:
--------------
diff --git a/lib/libgfx/include/libgfx/gfx.h b/lib/libgfx/include/libgfx/gfx.h
index 3468571..8ff48b4 100644
--- a/lib/libgfx/include/libgfx/gfx.h
+++ b/lib/libgfx/include/libgfx/gfx.h
@@ -57,6 +57,8 @@ typedef pixel_t color_t;
#define GFX_WHITE 0xFFFFFF
#define GFX_PURPLE 0x800080
#define GFX_YELLOW 0xFFFF00
+#define GFX_DARK 0x1D2021
+#define GFX_AQUA 0x427B58
/*
* Represents cartesian x/y values
diff --git a/share/docs/kernel/ctlfs.md b/share/docs/kernel/ctlfs.md
new file mode 100644
index 0000000..3087f60
--- /dev/null
+++ b/share/docs/kernel/ctlfs.md
@@ -0,0 +1,125 @@
+# The Hyra control filesystem (ctlfs)
+
+Written by Ian M. Moffett
+
+## Rationale
+
+Historically, Operating Systems of the Unix family typically relied
+on syscalls like ``ioctl()`` or similar to perform operations (e.g., making calls through a driver)
+via some file descriptor. Let's say for example, one wanted to acquire the framebuffer
+dimensions of a given framebuffer device. To start, they'd acquire a file descriptor
+by calling ``open()`` or similar on it. Then they'd make their ``ioctl()`` call.
+
+```c
+int fd = ...;
+
+ioctl(fd, IOCTL_FBINFO, &fb_info);
+...
+```
+
+While this works fine and is relatively simple to use from the user's
+perspective, it is very clunky when you pop the hood and peer into the
+inner-workings of it within the kernel. The number of possible requests
+that can be passed through a file descriptor can grow quite rapidly which
+can require really large switch statements within the drivers that implement
+an ``ioctl()`` interface.
+
+## Replacing ``ioctl()``
+
+Hyra provides ctlfs, an abstract in-memory filesystem designed for
+setting/getting various kernel / driver parameters and state via
+the filesystem API. The control filesystem consists of several
+instances of two fundamentals: "control nodes" and "control entries".
+
+### Control nodes
+
+Control nodes are simply directories within the ``/ctl`` root. For example,
+console specific control files are in the ``/ctl/console`` node.
+
+### Control entries
+
+Control entries are simply files within specific control nodes. For example
+console features may be find in the ``consfeat`` entry of the ``console`` node
+(i.e., ``/ctl/console/consfeat``).
+
+See ``sys/include/sys/console.h`` and ``sys/fs/ctlfs.h`` for more
+information.
+
+## The ctlfs API
+
+The Hyra kernel provides an API for subsystems and drivers
+to create their own ctlfs entries and nodes. This may be found
+in sys/include/fs/ctlfs.h
+
+### Control operations
+
+Each control entry must define their own set of
+"control operations" described by the ``ctlops`` structure:
+
+```c
+struct ctlops {
+ int(*read)(struct ctlfs_dev *cdp, struct sio_txn *sio);
+ int(*write)(struct ctlfs_dev *cdp, struct sio_txn *sio);
+ ...
+};
+```
+
+NOTE: Callbacks defined as ``NULL`` will be
+ignored and unused.
+
+## "Meow World": Creating a ctlfs entry
+
+```c
+#include <sys/types.h>
+#include <sys/sio.h>
+#include <fs/ctlfs.h>
+
+static const struct ctlops meow_ctl;
+
+/*
+ * Ctlfs read callback - this will be called
+ * when "/ctl/meow/hii" is read.
+ */
+static int
+ctl_meow_read(struct ctlfs_dev *cdp, struct sio_txn *sio)
+{
+ char data[] = "Meow World!""
+
+ /* Clamp the input length */
+ if (sio->len > sizeof(data)) {
+ sio->len = sizeof(data)
+ }
+
+ /* End of the data? */
+ if ((sio->offset + sio->len) > sizeof(data)) {
+ return 0;
+ }
+
+ /* Copy the data and return the length */
+ memcpy(sio->buf, &data[sio->offset], sio->len);
+ return sio->len;
+}
+
+static int
+foo_init(void)
+{
+ char ctlname[] = "meow";
+ struct ctlfs_dev ctl;
+
+ /*
+ * Here we create the "/ctl/meow" node.
+ */
+ ctl.mode = 0444;
+ ctl.devname = devname;
+ ctlfs_create_node(devname, &ctl);
+
+ ctl.ops = &fb_size_ctl;
+ ctlfs_create_entry("attr", &ctl);
+ return 0;
+}
+
+static const struct ctlops meow_ctl = {
+ .read = ctl_meow_read,
+ .write = NULL,
+};
+```