summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/cicd.yml2
-rw-r--r--configure.ac2
-rw-r--r--sys/dev/ic/ahci.c1
-rw-r--r--sys/include/vm/vm_pager.h5
-rw-r--r--sys/vm/vm_anon.c115
-rw-r--r--sys/vm/vm_map.c4
-rw-r--r--sys/vm/vm_vnode.c2
-rw-r--r--tools/checknl.pl85
8 files changed, 209 insertions, 7 deletions
diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml
index 17d202f..ad6d236 100644
--- a/.github/workflows/cicd.yml
+++ b/.github/workflows/cicd.yml
@@ -22,5 +22,3 @@ jobs:
run: ./bootstrap && ./configure
- name: Build world with clang
run: make
- - name: Build toolchain
- run: make cross
diff --git a/configure.ac b/configure.ac
index aab15b7..08cf4dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([Hyra], [1.4], [ian@osmora.org])
+AC_INIT([Hyra], [1.5], [ian@osmora.org])
KERN_CFLAGS_AMD64="-fexceptions --std=gnu11 -ffreestanding -fno-stack-protector -fno-pic \\
-Werror=implicit -Werror=implicit-function-declaration \\
diff --git a/sys/dev/ic/ahci.c b/sys/dev/ic/ahci.c
index 5c85013..b483e7a 100644
--- a/sys/dev/ic/ahci.c
+++ b/sys/dev/ic/ahci.c
@@ -193,6 +193,7 @@ ahci_init(void)
* ahci_dev struct, so that we can perform MMIO and then issue
* a hard reset.
*/
+
if ((status = pci_map_bar(ahci_dev, 5, &abar_vap)) != 0) {
return status;
}
diff --git a/sys/include/vm/vm_pager.h b/sys/include/vm/vm_pager.h
index 1ba06d9..e0503e0 100644
--- a/sys/include/vm/vm_pager.h
+++ b/sys/include/vm/vm_pager.h
@@ -35,6 +35,11 @@
#include <vm/vm_obj.h>
struct vm_object;
+struct vm_pagerops;
+
+extern const struct vm_pagerops vm_vnops;
+extern const struct vm_pagerops vm_anonops;
+
/*
* Pager operations.
diff --git a/sys/vm/vm_anon.c b/sys/vm/vm_anon.c
new file mode 100644
index 0000000..2110ecd
--- /dev/null
+++ b/sys/vm/vm_anon.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Hyra nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/spinlock.h>
+#include <sys/syslog.h>
+#include <sys/errno.h>
+#include <sys/param.h>
+#include <vm/physmem.h>
+#include <vm/vm_pager.h>
+#include <vm/vm_page.h>
+#include <vm/vm.h>
+
+#define pr_trace(fmt, ...) kprintf("vm_anon: " fmt, ##__VA_ARGS__)
+#define pr_error(...) pr_trace(__VA_ARGS__)
+
+#define ANON_TIMEOUT_USEC 200000
+
+/*
+ * Get pages from physical memory.
+ *
+ * @obp: Object representing the backing store (in memory).
+ * @pgs: Page descriptors to be filled.
+ * @off: Offset to read from in backing store.
+ * @len: Length to read in bytes.
+ */
+static int
+anon_get(struct vm_object *obp, struct vm_page **pgs, off_t off, size_t len)
+{
+ struct vm_page *pgtmp, *pgres;
+ int retval = 0;
+ size_t j, npgs;
+
+ len = ALIGN_DOWN(len, DEFAULT_PAGESIZE);
+ if (obp == NULL || pgs == NULL) {
+ return -EINVAL;
+ }
+
+ /* Zero bytes is invalid */
+ if (len == 0) {
+ len = 4096;
+ }
+
+ spinlock_acquire(&obp->lock);
+ npgs = len >> 12;
+
+ for (int i = 0; i < npgs; ++i) {
+ j = i / DEFAULT_PAGESIZE;
+ pgtmp = vm_pagelookup(obp, i);
+ pgres = pgs[j];
+
+ /* Do we need to create our own entry? */
+ if (pgtmp == NULL) {
+ pgtmp = vm_pagealloc(obp, PALLOC_ZERO);
+ }
+
+ if (pgtmp == NULL) {
+ pr_trace("anon_get: failed to add page %d, marking invalid\n", j);
+ pgres->flags &= ~PG_VALID;
+ continue;
+ }
+
+ *pgres = *pgtmp;
+
+ /*
+ * We are *just* populating `pgs' and therefore nobody
+ * should even attempt to acquire this lock... Shit
+ * happens though, so just make sure we can grab it
+ * without assuming success.
+ */
+ if (spinlock_usleep(&pgres->lock, ANON_TIMEOUT_USEC) < 0) {
+ vm_pagefree(obp, pgtmp, 0);
+ pr_error("anon_get: pgres spin timeout\n");
+ return -ETIMEDOUT;
+ }
+
+ pgres->flags |= (PG_VALID | PG_CLEAN);
+ spinlock_release(&pgres->lock);
+
+ }
+
+ spinlock_release(&obp->lock);
+ return retval;
+}
+
+const struct vm_pagerops vm_anonops = {
+ .get = anon_get
+};
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 6627865..7b0656b 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -94,8 +94,8 @@ vm_map_modify(struct vas vas, vaddr_t va, paddr_t pa, vm_prot_t prot, bool unmap
* @prot: Protection flags.
* @count: Count of bytes to be mapped (aligned to page granularity).
*
- * Returns 0 on success, and a less than zero errno
- * on failure.
+ * Returns 0 on success, and a less than zero errno
+ * on failure.
*/
int
vm_map(struct vas vas, vaddr_t va, paddr_t pa, vm_prot_t prot, size_t count)
diff --git a/sys/vm/vm_vnode.c b/sys/vm/vm_vnode.c
index 519d877..2457c97 100644
--- a/sys/vm/vm_vnode.c
+++ b/sys/vm/vm_vnode.c
@@ -50,8 +50,6 @@
#define pr_debug(...) __nothing
#endif /* PR_DEBUG */
-const struct vm_pagerops vm_vnops;
-
/*
* Perform read/write operation on vnode to/from pages.
*
diff --git a/tools/checknl.pl b/tools/checknl.pl
new file mode 100644
index 0000000..dab81ba
--- /dev/null
+++ b/tools/checknl.pl
@@ -0,0 +1,85 @@
+#!/bin/perl
+#
+# Copyright (c) 2023-2025 Ian Marco Moffett and the Osmora Team.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. Neither the name of Hyra nor the names of its contributors may be used
+# to endorse or promote products derived from this software without
+# specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+use strict;
+use warnings;
+
+#
+# Fetch a single line from a file, returns eof when there
+# are no more lines to fetch.
+#
+# Arg0: File handle
+#
+sub get_line {
+ my $fhand = shift;
+ return <$fhand> || die "Failed to read file...";
+}
+
+my $argc = 0+@ARGV;
+
+if ($argc < 1) {
+ die "Usage: $0 <filename>";
+}
+
+# Grab the file
+my $clean = 1;
+my $lineno = 1;
+my $RS = undef;
+my $file = shift;
+open my $fhand, '<', $file || die "Failed to open $file: $^E";
+my $tmp = get_line($fhand);
+
+# Is there a newline at the start of the file?
+if ($tmp =~ /^\n/) {
+ print "Found redundant newline at start of file\n";
+ $clean = 0;
+}
+
+while (!eof($fhand)) {
+ my $cur = get_line($fhand);
+
+ if ($cur =~ /^\n$/ && $tmp =~ /^\n$/) {
+ print "Found redundant newline @ $lineno\n";
+ $clean = 0;
+ }
+
+ ++$lineno;
+ $tmp = $cur;
+}
+
+# What about at the end?
+if ($tmp =~ /^\n/) {
+ print "Found redundant newline at end of file\n";
+ $clean = 0;
+}
+
+if ($clean) {
+ print "File is clean\n"
+}