4 years agocrypto: move includes to kern/include
Ronald G. Minnich [Thu, 13 Oct 2016 20:39:03 +0000 (13:39 -0700)]
crypto: move includes to kern/include

Change-Id: Id9e62496bb6595a7f282dfa26bd1fa1cbdac8bb4
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agocrypto: initial import of the chromeos vboot libraries
Ronald G. Minnich [Thu, 13 Oct 2016 20:39:02 +0000 (13:39 -0700)]
crypto: initial import of the chromeos vboot libraries

This code is needed to support the capability device, imported
in a separate commit. This is recommended as a 'best' version
of these algorithms by a security expert at Google.

This is from  https://chromium.googlesource.com/chromiumos/platform/vboot_reference
ref 3b55afa94e84c91874fcdad352b4053036886aa7

Change-Id: Ie3d90f183df990fd5bde6dfd83efbbd1e9b6009b
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoifconfig: invoke ipconfig with `-P` when configuring loopback.
Dan Cross [Fri, 7 Oct 2016 20:18:30 +0000 (16:18 -0400)]
ifconfig: invoke ipconfig with `-P` when configuring loopback.

Don't overwrite cached data from the DHCP server.

Change-Id: Ie7d3ad4be5d9cf6aeb4def7d8c47ffefe522c80d
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix a minor bug in `ipfconfig` and clean up some logic.
Dan Cross [Fri, 7 Oct 2016 20:13:20 +0000 (16:13 -0400)]
Fix a minor bug in `ipfconfig` and clean up some logic.

If the lease time is 1, then we wouldn't wait; that's a bug.
Clean up an obnoxious conditional.

Change-Id: I25ad3c5ac3510d56a0dc3d37b464ca002236875b
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove our glibc poll implementation (XCC)
Barret Rhoden [Fri, 1 Jul 2016 20:25:29 +0000 (16:25 -0400)]
Remove our glibc poll implementation (XCC)

The old one just immediately returned.  Now that we have a version of
poll() in iplib, that one would have overridden glibc's.  However, if we
messed up and didn't link with iplib, then we'd silently be using the old
broken glibc version again.  This way, we'll catch it with a stub warning.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoLink busybox with iplib
Barret Rhoden [Thu, 7 Jul 2016 16:37:57 +0000 (12:37 -0400)]
Link busybox with iplib

It needs it to use our poll, instead of glibc's - which will soon be a

Rebuild busybox.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd nonblocking reads and FD taps to #cons/stdin
Barret Rhoden [Wed, 5 Oct 2016 21:02:04 +0000 (17:02 -0400)]
Add nonblocking reads and FD taps to #cons/stdin

This allows select/poll/epoll of stdin, which a few apps want to do.  The
change to consstat is so that select() can detect if the console is

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd a devstat helper
Barret Rhoden [Thu, 6 Oct 2016 18:44:37 +0000 (14:44 -0400)]
Add a devstat helper

Devices can use this if they want to do build their own stat functions,
given a dir.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoMove VFS /dev/ -> /dev_vfs/
Barret Rhoden [Wed, 5 Oct 2016 20:22:41 +0000 (16:22 -0400)]
Move VFS /dev/ -> /dev_vfs/

Now that stdin/out/err are not in the VFS, we can move the VFS device
directory and get rid of that nasty sys_open() hack.

Code that uses devices, such as the mlx4 user-driver, need to look in
dev_vfs now.  mlx4 and blockdev still use devfs.c.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoMove stdin/stdout/stderr to #cons
Barret Rhoden [Wed, 5 Oct 2016 19:47:24 +0000 (15:47 -0400)]
Move stdin/stdout/stderr to #cons

It's the same logic, just accessible via 9ns instead of VFS.  #cons/null
already existed.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove the old console input code; use qio
Barret Rhoden [Wed, 5 Oct 2016 16:16:41 +0000 (12:16 -0400)]
Remove the old console input code; use qio

This removes all of console.{c,h}, replacing its functionality with a
basic qio queue in devcons.

Other than using qio instead of the homebrewed rings and sems, this
also uses qiwrite directly from interrupt context.  This avoids an
excessive kernel message.

There were also a couple monitor-related commands sitting around in
console.{c.h}, which I moved to monitor files.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix a few debugging tools
Barret Rhoden [Tue, 4 Oct 2016 19:35:18 +0000 (15:35 -0400)]
Fix a few debugging tools

These are minor changes that helped with debugging.  The asserts in qio are
an attempt to debug I panic I got only once.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoqio: Only fire writable taps on edge transitions
Barret Rhoden [Thu, 6 Oct 2016 15:56:58 +0000 (11:56 -0400)]
qio: Only fire writable taps on edge transitions

We were firing writable taps (via the qwake_cb()) any time someone read
from a queue.  The effect of this was that applications that tapped their
Qdata FD would see a lot of writable taps firing, even though there wasn't
an edge transition.

For instance, say a conversation's write queue (outbound, TX) is no where
near full.  The app puts a packet in the queue.  When the network stack
drains the block from the queue with __qbread(), that will trigger a
writable tap.  So the app gets an FD tap / epoll every time it writes a
packet.  Incidentally, that behavior helped me track down a bug, but it
isn't what we're looking for.

Like the read side, we only fire on edge transitions, as done in commit
dbaaf4a3029e ("qio: Fire read taps on actual edges").  Back then, I had us
firing writable taps all the time, which was a bit much.

Note that we still fire the readable/writable taps regardless of
Qstarve/Qflow.  Those queue state flags only get set when someone tries to
read/write a queue and fails.  The taps we fire occur independently, which
is why their logic (e.g. was_empty / was_unwritable) are separate from the
rendez control variables (e.g. dowakeup).  This is probably right, since
it's possible for an application to know a queue would block without trying
(perhaps through stat()).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoqio: Add a check to pullupblock
Barret Rhoden [Tue, 4 Oct 2016 19:32:58 +0000 (15:32 -0400)]
qio: Add a check to pullupblock

This delays the impending doom associated with BLOCK_EXTRA_DATA.  It's
relatively easy to trigger the problem if the block len (and block list
len) is < n.  Just write gibberish into a UDP data FD!

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoClose alarm FDs on fork()
Barret Rhoden [Fri, 30 Sep 2016 20:11:51 +0000 (16:11 -0400)]
Close alarm FDs on fork()

If a parent has alarm FDs, forks, but doesn't exec, then its child will
inherit its alarm FDs.  Other than the child being able to mess with the
parent's alarms, which is bad, the parent is unable to fully be freed (as
in __proc_free()) until the child closes the FD - usually by exiting.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix potential overflow error in CEQs (XCC)
Barret Rhoden [Tue, 4 Oct 2016 18:06:06 +0000 (14:06 -0400)]
Fix potential overflow error in CEQs (XCC)

The issue was that a consumer that came in during overflow recovery could
see that there was no overflow and return FALSE, meaning the CEQ was empty,
even though there were older messages.

Consider, the kernel already posted two messages, set overflow, and the
ring is empty:

Thread 1                      Thread 2
--------                      --------
see empty ring                see empty ring
see overflow is on
grab lock
clear overflow
extract a message
                              sees overflow is off
                              returns FALSE
sets overflow
returns TRUE

And there's still a message in the CEQ that thread 2 should have grabbed.

While doing this change, I also changed nr_events to an unsigned.  That was
my original intent (based on the usage in epoll), and making the change now
keeps this commit from changing the size of the CEQ, which keeps everyone
from having to rebuild every application.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAvoid needless TLB flush when restarting kthreads
Barret Rhoden [Mon, 3 Oct 2016 19:27:10 +0000 (15:27 -0400)]
Avoid needless TLB flush when restarting kthreads

If we're about to run on a core where our address space was arleady loaded,
we don't need to reload it.  Doing so actually triggers a TLB flush.

Regarding changing this comment:

/* In the future, we could check owning_proc. If it isn't set, we
 * could clear current and transfer the refcnt to kthread->proc. */

Although that is true, it's a bit dangerous and we'd need to measure to
know if its worth the hassle.  The intent was that if owning_proc !=
current, then this kthread is running 'detached' from its process.  This
could be a syscall that briefly woke up and went back to sleep.  We could
avoid the incref and another decref shortly (when current gets cleared in
smp_idle()->abandon_core()) by transferring the ref.

The issue is that when we clear current, we also need to load a different
page table, since it's possible that the process will be freed before this
core ends up running another page table.  So we could do this optimization,
but then we'd need to load a page table, which is a TLB flush.  Then maybe
we'd be switching back to the process again, since we don't know that the
*next* kthread to run isn't also for this process.  So it's not clear that
avoiding the atomic ops (incref/decref) and moving up the TLB flush was
worth the hassle.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix clobber of current in kthread.c
Barret Rhoden [Mon, 3 Oct 2016 19:03:50 +0000 (15:03 -0400)]
Fix clobber of current in kthread.c

Originally, there wasn't a KTH_SAVE_ADDR_SPACE flag.  When I added that, I
didn't update this code.  The resulting bug was that if we had to undo a
kthread swap, that kthread was for a ktask (which doesn't have a proc), and
we had a process's address space loaded, then we'd clobber current
(clearing it).  That would result in a reference counting problem, since we
effectively deleted a counted reference to whatever process was current.
I'd see this on occasion under heavy networking and process load.

This also clears kthread->proc whenever the kthread is not blocked.
Previously, we were leaving the value of the uncounted proc reference.  The
code was okay, but it was surprising when debugging and was a source for
potential bugs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoDelay clearing owning proc in sys_exec
Barret Rhoden [Fri, 30 Sep 2016 20:30:07 +0000 (16:30 -0400)]
Delay clearing owning proc in sys_exec

If we do it before any of the return calls, we could end up returning to
userspace while owning_proc isn't set.  I think the rest of the kernel is
able to handle this, but there's no sense messing around.  The old comment
makes it sound like we can block in that state too, which is probably true,
but returning by anything other than the error path ways seems like a bad

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoChange syscall usec timeouts to unsigned longs
Barret Rhoden [Fri, 30 Sep 2016 20:20:46 +0000 (16:20 -0400)]
Change syscall usec timeouts to unsigned longs

I noticed this due to some sys_block calls having a 'negative' argument in
the printout (due to the %d in the saved string).

While I was here, I also changed halt_core, though note that that timeout
was more of a 'future plan', I think.  The code doesn't use it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse proc_decref() in #proc
Barret Rhoden [Fri, 30 Sep 2016 18:04:27 +0000 (14:04 -0400)]
Use proc_decref() in #proc

Use the helper instead of accessing the kref directly.  That helps with

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd trace_printf()
Barret Rhoden [Fri, 30 Sep 2016 16:34:57 +0000 (12:34 -0400)]
Add trace_printf()

This is a helper for userspace to print into the kernel's trace_printk()
log.  It's extremely useful for fast print debugging.

The trace_printk() log currently just maintains the last N entries, with
older entries replaced by newer ones.  You can cat it or tail it
repeatedly.  The log file is usually at /prof/kptrace.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoepoll: Set up the alarm_evq at init time
Barret Rhoden [Wed, 28 Sep 2016 16:21:01 +0000 (12:21 -0400)]
epoll: Set up the alarm_evq at init time

This way we don't need to alloc and free it repeatedly for timeouts.  The
main benefit for this now is that we actually leak memory when we free the
evqs in epoll.c (grep TODO.*INDIR).  This prevents long-running processes
from eventually running out of memory.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd a helper for async syscalls
Barret Rhoden [Wed, 28 Sep 2016 16:18:52 +0000 (12:18 -0400)]
Add a helper for async syscalls

This helper makes an async syscall that will trigger the event queue upon
completion.  The caller doesn't check for completion manually - wait for
the ev_q.  This helps a few async syscall use cases, and avoids the need to
register the evq (CAS and whatnot) after submitting the syscall.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoepoll: Clean up epoll_wait and stop excess polling
Barret Rhoden [Tue, 27 Sep 2016 18:23:05 +0000 (14:23 -0400)]
epoll: Clean up epoll_wait and stop excess polling

The old for loop would keep polling up to maxevents.  As soon as it fails
once, we should stop.  At that moment, the CEQ was empty and we should
either block or return.

Also, this fixes a subtle issue.  If we extracted a message but it didn't
have an epoll event, we were still advancing 'i', which means we'd have a
hole in our events (so, a gibberish event) and we'd skip the last event.
Alas, this was *a* bug, but not the bug I was looking for.

This also cleans up a bit of the logic for after we block, thanks to the
__epoll_wait_poll helper.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoepoll: Fix event clobber
Barret Rhoden [Tue, 27 Sep 2016 15:48:51 +0000 (11:48 -0400)]
epoll: Fix event clobber

It was possible, though I never saw it, for an event entry to be clobbered.
Say we extracted a CEQ message for a particular FD.  That set the events
field in the epoll_event.  Then we attempt to extract another CEQ message,
possibly intending for another FD in the epoll set.  Instead, we get
another message for that same FD that we already set an event for.  When we
set that event, we clobber the original one.

The fix is to accumulate events for a given FD for all CEQ messages.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoifconfig: use daemonize for cs, remove busy-waiting loop
Dan Cross [Thu, 6 Oct 2016 19:12:21 +0000 (15:12 -0400)]
ifconfig: use daemonize for cs, remove busy-waiting loop

Now that `cs` understands the daemonize protocol, use it in
the `ifconfig` script.  Remove the busy-waiting loop waiting
for the /srv/cs file to appear.

Change-Id: I06db794b38ad50957c56668f7a8cef807d54101c
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agocs.c: Add an option to participate in the daemonize protocol.
Dan Cross [Thu, 6 Oct 2016 19:12:20 +0000 (15:12 -0400)]
cs.c: Add an option to participate in the daemonize protocol.

Add an option to make cs.c participate in the `daemonize` protocol:
it will signal completion by sending an event to it's parent; this
instead of busy-waiting on the creation of a srv file.

Change-Id: Ibd44c7352ca3e71621255db0dac9069178b1f845
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agocs.c: Use strlcpy to copy strings.
Dan Cross [Thu, 6 Oct 2016 19:12:19 +0000 (15:12 -0400)]
cs.c: Use strlcpy to copy strings.

Change-Id: I310486e539c9f587efc381d7f5a78d7fd5d9a3de
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agocs.c: Fix all checkpatch warnings and errors.
Dan Cross [Thu, 6 Oct 2016 19:12:18 +0000 (15:12 -0400)]
cs.c: Fix all checkpatch warnings and errors.

The changes in this commit are all removal of checkpatch
warnings and errors.

Change-Id: I5ca1c72ce34bfb2087ad948846b8af9732fe9c6c
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agocs.c: `main` returns `int`, use getopt().
Dan Cross [Thu, 6 Oct 2016 19:12:17 +0000 (15:12 -0400)]
cs.c: `main` returns `int`, use getopt().

Change-Id: If1da944eac61c762ce16ac9f1df755439250406c
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agocs.c: Run clang-format on this file.
Dan Cross [Thu, 6 Oct 2016 19:12:16 +0000 (15:12 -0400)]
cs.c: Run clang-format on this file.

Change-Id: I82fc00318101fb321112361dadda497f48861e8c
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoModify 'ipconfig' to send an event to 'daemonize'.
Dan Cross [Thu, 6 Oct 2016 19:12:15 +0000 (15:12 -0400)]
Modify 'ipconfig' to send an event to 'daemonize'.

As per the previous commit, modify `ipconfig` to participate
in the new `daemonize` protocol: use pthreads for the ipv6 router
advertisement/solitication and ipv6 DHCP loop maintenance threads.
Send an event to our parent when we exit or go into the background.

Change `ifconfig` to use daemonize and the new ipconfig facility.

Change-Id: I60735d0427c5ad580522cd7e5ac210f8d2d5ae4b
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd 'daemonize': a program that spawns a process and waits for an event
Dan Cross [Thu, 6 Oct 2016 19:25:09 +0000 (15:25 -0400)]
Add 'daemonize': a program that spawns a process and waits for an event

Consider the typical 'fork-without-exec' pattern: often, a program
wants to do some initialization, acquire some resources, etc, and
then background itself by forking and exiting in the parent.  We
don't have great support for this, as e.g. reference counts on resources
created by the parent can keep processes alive when they should die.
(cf, `ipconfig` currently, where we acquire a DHCP lease in the
foreground before going into a loop in the background to maintain
the lease, but the parent process stays in the "DYING" state forever.)

Barret and I discussed this at length.  A possible solution is to have
a program that invokes the target process in the background and then
waits for an event from that process and then itself exits.  Note that
this requires a protocol between the two: any place where we exit in
the child needs to send an event, and the parent needs to get an event
or it blocks.

I think a generalization of 'wait' where we can send arbitrary messages
with payloads, more along the lines of our existing event support but
specialized to process control, would be nice but it's more work than
what we've got right now.  Think of something analogous to 'wait' but
that accepts a payload, paired with a 'background' call of some kind
that signals to a possibly-waiting parent that we're going off on our

Change-Id: I531f1be3076786a638d57db1c660f9b768f5545e
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove `SYS_getpid` system call. (XCC)
Dan Cross [Wed, 5 Oct 2016 18:01:44 +0000 (14:01 -0400)]
Remove `SYS_getpid` system call. (XCC)

Remove the redundant and now-unused `getpid` system call:
the replacement is a function in the C library that simply
retrieves the process ID form __procinfo.

Reinstall your kernel headers.

Change-Id: Ib0649a17c2a7daf1f01194545d4122daf25f9e25
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove `sys_getpid` stubs from parlib.
Dan Cross [Wed, 5 Oct 2016 17:44:49 +0000 (13:44 -0400)]
Remove `sys_getpid` stubs from parlib.

This system call is going away in favor of `getpid` from the
C library, which simply retrieves the PID from __procinfo.
Remove the stubs that call into the kernel from parlib.

Rebuild and reinstall parlib.

Change-Id: Id498e5f63c8d75302410444a0d8dd4f259cf5b34
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove references to sys_getpid from a variety of tests.
Dan Cross [Wed, 5 Oct 2016 17:43:08 +0000 (13:43 -0400)]
Remove references to sys_getpid from a variety of tests.

This system call is going away in favor of `getpid` from the C
library, which just retrieves the PID from the __procinfo region.
Remove references to it.

Change-Id: I25e5ea28647bc25a726985c01511e00d2d816285
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove call to 'getpid' system call from tls.h. (XCC)
Dan Cross [Wed, 5 Oct 2016 17:33:45 +0000 (13:33 -0400)]
Remove call to 'getpid' system call from tls.h. (XCC)

This call was only made to cross the user/kernel boundary
when mucking about with TLSes.  If we really still have to do
that, then use SYS_null instead.

Rebuild glibc.

Change-Id: I465d958f0a837da62096aa3a8d1054bdc0b99d94
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd 'getppid()' to glibc to grub the ppid out of __procinfo (XCC)
Dan Cross [Wed, 5 Oct 2016 16:44:23 +0000 (12:44 -0400)]
Add 'getppid()' to glibc to grub the ppid out of __procinfo (XCC)

Add the `getppid()` function to glibc to retrieve a process's
parent process ID.  See POSIX:

Rebuild and reinstall glibc.

Change-Id: I116129292da56bfd53cc2e6a23d9c9bb7c6246d1
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoExport epoch time via proc_global_info (XCC)
Barret Rhoden [Thu, 22 Sep 2016 18:15:50 +0000 (14:15 -0400)]
Export epoch time via proc_global_info (XCC)

The kernel was internally maintaining basically the same structure that
benchutil/alarm was maintaining: a mapping from epoch time to TSC ticks.
Now that info is exported to userspace.

This allows us to implement gettimeofday() and clock_gettime() in
userspace, which means we can remove SYS_gettimeofday.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse a "one block at a time" policy for snoop queues
Barret Rhoden [Wed, 21 Sep 2016 19:49:21 +0000 (15:49 -0400)]
Use a "one block at a time" policy for snoop queues

This fixes snoopy's packet loss.

Snoopy expects to receive a packet at a time.  If you send more than one
packet in a read, the later packets get dropped.  We could change snoopy,
but it is a little easier to tell the kernel to just return one block
(packet) at a time when we do a qread.

In part, I went with this approach since we'll probably want more kernel
support for packet tracing, not less.  For instance, right now, snoopy's
time stamps are taken in userspace when the queue is read, not when the
packet is received or sent.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoqio: Add helpers to toggle state
Barret Rhoden [Wed, 21 Sep 2016 18:12:50 +0000 (14:12 -0400)]
qio: Add helpers to toggle state

I have a use case where I want to toggle Qmsg | Qcoalesce on at runtime,
specifically for using snoopy.  This is probably safe to do, though if you
have code that expects Qmsg, then suddenly it is turned off/on, it might
get confused by a short read.  So be careful.

With these two flags, I can turn a queue into "one non-zero block at a
time" mode.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAllow snooping of the loopback medium
Barret Rhoden [Wed, 21 Sep 2016 19:58:41 +0000 (15:58 -0400)]
Allow snooping of the loopback medium

Snoopy either directly tries to clone a devether conversation or opens a
 #ip/ipifc/snoop file.  The only medium that supported that snoop was
pktmedium.  This commit adds support for loopback.

Incidentally, I'm not sure why devether doesn't use the ethermedium snoop.
Maybe it has something to do with setting promiscuous.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse a helper for tracing an interface
Barret Rhoden [Wed, 21 Sep 2016 19:40:06 +0000 (15:40 -0400)]
Use a helper for tracing an interface

I'll use this shortly for loopback.  This also keeps track of dropped
traces, which will help when wondering if snoopy isn't reporting

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix etheriq()'s extra-data problems
Barret Rhoden [Wed, 21 Sep 2016 19:10:52 +0000 (15:10 -0400)]
Fix etheriq()'s extra-data problems

Or at least try to fix them.  The old code was clearly broken if you passed
in a block with extra data during tracing or any other snooping (including

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoqio: Fix copyblock()
Barret Rhoden [Wed, 21 Sep 2016 18:48:36 +0000 (14:48 -0400)]
qio: Fix copyblock()

Previously, copyblock() couldn't handle extra data.

The only caller was passing the full block length, so let's just always do
the full amount.  At this point, it's basically the same as
linearizeblock(), minus the block swapping.  So we can implement
linearizeblock() with copyblock().

Note that Qsnoop uses copyblock(), making a copy of the block to pass up
to a snooping process (e.g. snoopy).  I considered making something like
qclone, where we clone the block instead - using pointers to the original
block's memory.  This would probably work with our current setup, but if we
ever use user memory for the block extra data segments, then we'd have a
problem.  The issue is one of immutability of data, and if we are using
user memory, then we have no guarantee of immutability (unless it's
read-only or something).  For now, we can just make a copy.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoqio: Fix minor bugs
Barret Rhoden [Wed, 21 Sep 2016 17:59:19 +0000 (13:59 -0400)]
qio: Fix minor bugs

Changing the state is racy, since it could muck with the receive path code
that also toggles flags.  If you made a qnonblock() call at the same time
as a qbread/qbwrite that changed the state flags, you could corrupt the

n -> len wouldn't even compile.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd a hexdump printf specifier for userspace
Barret Rhoden [Mon, 19 Sep 2016 18:57:40 +0000 (14:57 -0400)]
Add a hexdump printf specifier for userspace

You need to register it, then your program can use it, like so:

printf("foo %p: %.*H", foo, sizeof(*foo), foo);

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd a useful errstr in dev.c
Barret Rhoden [Mon, 19 Sep 2016 16:51:40 +0000 (12:51 -0400)]
Add a useful errstr in dev.c

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAvoid locking in sbrk during early SCP (XCC)
Barret Rhoden [Mon, 19 Sep 2016 16:39:31 +0000 (12:39 -0400)]
Avoid locking in sbrk during early SCP (XCC)

This is related to replacing glibc's LLLs with PDR locks.

If, for whatever reason I don't fully understand, a binary links against
the real PDR locks (and not the internal ones in glibc for ld.so), then it
might try to use them before TLS is initialized.  Then it'll die when
checking in_vcore_context(), since the TLS descriptor is 0.

For future reference, here was the backtrace:


Perhaps setup_tls doesn't always sbrk?  Or the linkage with parlib caused
the spin_pdr_symbol to be overridden?

Either way, we can ignore locking during early SCP context, so this change
should be safe.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd a printx lock
Barret Rhoden [Mon, 19 Sep 2016 15:38:31 +0000 (11:38 -0400)]
Add a printx lock

When debugging and relying on printed output, if you have a process that is
spamming the console, it can be hard to see what the kernel is printing

This lock is meant to be used in debugging.  If you have printx turned on,
(px from the monitor), then the console prints will be synchronized with
other uses of px_lock().

For instance, if you want to drop a backtrace at some point, you could do:

if (some_condition && printx_on) {
backtrace_user_ctx(current, current_ctx);

You'd never commit that blob of code, but it's useful when tracking down a

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix non-UDP 'from' in recvfrom() (XCC)
Barret Rhoden [Mon, 19 Sep 2016 15:30:39 +0000 (11:30 -0400)]
Fix non-UDP 'from' in recvfrom() (XCC)

getsockname() gets *our* name, not the peer's name.  We wanted the peer's

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix minor endian issue (XCC)
Barret Rhoden [Mon, 19 Sep 2016 15:29:33 +0000 (11:29 -0400)]
Fix minor endian issue (XCC)

That first assignment to sin_port in recvfrom was overwritten and

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse Linux's network headers in glibc (XCC)
Barret Rhoden [Fri, 16 Sep 2016 20:38:53 +0000 (16:38 -0400)]
Use Linux's network headers in glibc (XCC)

A bunch of programs use these headers for things like socket options.
We hardly support any of them, but over time we can add those that make
sense to our socket shims.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoSet the socket family in recvfrom() (XCC)
Barret Rhoden [Wed, 14 Sep 2016 18:32:03 +0000 (14:32 -0400)]
Set the socket family in recvfrom() (XCC)

We were setting the port and address, but not the family.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove netinet.h from the kernel
Barret Rhoden [Fri, 16 Sep 2016 21:00:48 +0000 (17:00 -0400)]
Remove netinet.h from the kernel

That was an ancient, unused header file that cluttered up the space.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoClean up x86_64 sysdeps (XCC)
Barret Rhoden [Mon, 12 Sep 2016 20:15:08 +0000 (16:15 -0400)]
Clean up x86_64 sysdeps (XCC)

Our sysdep.h was just including Linux's, which was a mild surprise when
trying to debug the PTR_MANGLE / atexit() bug.  We don't need a lot of the
stuff that is Linux dependent.

Our sysdep.h now just contains a few things copy-and-pasted from the Linux
header, and it doesn't include things like __NR_pread, LOAD_REGS, and other
syscall-ABI specific things.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoSet the glibc thread's pointer_guard (XCC)
Barret Rhoden [Mon, 12 Sep 2016 20:09:33 +0000 (16:09 -0400)]
Set the glibc thread's pointer_guard (XCC)

Every thread needs to have the same pointer_guard.  We inherit it from the
creating parent (TLS, really).  And while we're here, set the stack_guard
too.  This is what glibc does when it creates a pthread.

All threads must have the same pointer_guard.  The issue is that if a
thread other than thread0 sets an atexit() function pointer, then the
pointer gets mangled with the wrong pointer_guard value.  Then when thread0
exits, it will improperly demangle the value.

I considered just turning off pointer mangling, but this is fine as is.

Note that we set the pointer_guard on every TLS, not on every thread.  This
is fine.  Basically this is a global value that every context should see,
so it's fine for it to be in every TLS.  I think glibc doesn't really make
a distinction between TLS and threads; every TLS region has the glibc
thread struct sitting at fs:0, for instance.

I'm not sure why glibc didn't use a global.  Maybe it'd be easier for an
attacker to find the global than the TLS value (to do their own
demangling).  Though fs:0x30 is probably just as easy to find, and you
don't have to do any linking to find the global.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse PDR locks for glibc's internal locks (XCC)
Barret Rhoden [Fri, 9 Sep 2016 18:49:06 +0000 (14:49 -0400)]
Use PDR locks for glibc's internal locks (XCC)

Our glibc port was using a simple spinlock for its LLL (low-level lock).
The problem with this is that the lock could be grabbed by vcore context
code, and in general is not safe from preemption.

The fix is to use PDR locks.  There are a couple nasty details.

One is that glibc mostly assumes a lock is an int.  We could hack up the
sysdeps completely (note that the INITIALIZER is compared to 0 directly),
but that's a mess.  Instead, we rely on the fact that spin PDR locks are 32

The other detail is that ld.so uses the locks, and it doesn't link with
parlib.  Even if it did, or if we moved the PDR locks to glibc directly,
it'd possibly be a mess, since ld grabs the locks before any of our parlib
constructors (I think).  The way it works now is that ld.so uses the
internal versions of the locks, and anything that links against parlib
(i.e. a binary that ld loads) should get the parlib version.  This might
not be working exactly as I think: see my notes in parlib-compat.c for

A minor point to note is the removal of parlib/common.h from x86/atomic.h.
The common.h header pulls in way too much, and now that glibc's LLL needs
parlib/spinlock.h, we run into build issues.  So don't add things to
low-level parlib header files unnecessarily.

Rebuild the world.  AFAIK, even dynamically linked apps need to be rebuilt,
otherwise they may use the version of the locks that ld.so uses.  For
single-threaded apps, this is probably okay.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd spin_pdr_trylock
Barret Rhoden [Thu, 8 Sep 2016 17:52:44 +0000 (13:52 -0400)]
Add spin_pdr_trylock

Note I didn't use trylock for the spin_pdr_lock implementation.  If we know
we want to lock, no matter what, then we don't want to bother disabling and
enabling notifs repeatedly.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix spinlock_trylock's return value
Barret Rhoden [Thu, 8 Sep 2016 17:49:27 +0000 (13:49 -0400)]
Fix spinlock_trylock's return value

We should be returning TRUE when we successfully lock the lock, not EBUSY.
This is saner, and more in line with other locking APIs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoRemove the NO_CAS version of spin_pdr locks
Barret Rhoden [Thu, 8 Sep 2016 16:38:16 +0000 (12:38 -0400)]
Remove the NO_CAS version of spin_pdr locks

If we ever update the RISC-V port, we can either build CAS out of their
LL/SC or do something else.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAllow uth_disable_notifs without current_uthread
Barret Rhoden [Thu, 8 Sep 2016 19:31:29 +0000 (15:31 -0400)]
Allow uth_disable_notifs without current_uthread

Upcoming changes to glibc's low-level locks will allow disable notifs to be
called before current_uthread is set up.

An unforunate side-effect of allowing this is that we lose the ability to
catch certain bugs (i.e. no long have an assert).  Also, if current_uthread
gets set in the middle of a disable/enable pair, then the
notif_disabled_depth and the associated logic will go crazy.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix sbrk's lock initialization (XCC)
Barret Rhoden [Thu, 8 Sep 2016 19:18:35 +0000 (15:18 -0400)]
Fix sbrk's lock initialization (XCC)

We were getting away with the uninitialized lock since a value of 0 was OK
for the current LLL locks.

I spotted this when trying to use PDR locks, and LD was flipping out on a
bare-bones replacement for spin_pdr_locks.  A while loop and a CTRL-B
backtrace idenfitied sbrk() as the culprit.

Rebuild glibc, if you want.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix include paths in lock_test
Barret Rhoden [Thu, 8 Sep 2016 17:46:28 +0000 (13:46 -0400)]
Fix include paths in lock_test

This is for building lock_test on Linux.  I missed these paths when we
changed the way user library headers are organized.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAlways provide a user context to signal handlers
Barret Rhoden [Thu, 8 Sep 2016 15:51:01 +0000 (11:51 -0400)]
Always provide a user context to signal handlers

Signal handlers expect some context.  They actually expect a struct
ucontext, which is defined in Glibc.  Further, some programs make
assumptions about the contents of ucontext (and mcontext).  We'll provide
them with a user_context for now.  It's one thing to want a ucontext.  It's
a bit nastier for handlers to demand that it matches the format of whatever
glibc they are using (where the individual fields of an x86_64 mcontext are

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd a helper for finding current_uthread's context
Barret Rhoden [Thu, 8 Sep 2016 15:47:03 +0000 (11:47 -0400)]
Add a helper for finding current_uthread's context

It's a very easy bug to look into current_uthread to see its context, but
you might be looking at an old context.  Use this helper to find the
correct user context for current_uthread.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoMove the get_user_ctx_* helpers to ros/ (XCC)
Barret Rhoden [Thu, 8 Sep 2016 15:45:08 +0000 (11:45 -0400)]
Move the get_user_ctx_* helpers to ros/ (XCC)

Userspace can use these helpers too, they are fundamentally based on the
structs that are already in the kernel headers, and we might as well have
one copy of them.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoMake signal handler functions vcore-ctx-safe
Barret Rhoden [Wed, 7 Sep 2016 21:02:31 +0000 (17:02 -0400)]
Make signal handler functions vcore-ctx-safe

Akaros makes a distinction between inter-process signals (think kill from
the shell) and intra-process signals (think pthread_kill()).  Intra-process
signals go to uthreads.  Inter-process signals are sent to the entire
process, are global, and are handled by a vcore event handler.

It is possible for signal handlers to call various sig-functions from
signal handlers.  This commit makes those calls safe when called from vcore

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse a helper for determining if a uth handles sigs
Barret Rhoden [Wed, 7 Sep 2016 20:59:23 +0000 (16:59 -0400)]
Use a helper for determining if a uth handles sigs

I had to look around the .c file to figure out that the existence of data
meant the uthread was handling signals.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoIn dev_stdout_write, user_strdup_errno should be user_memdup_errno.
Dan Cross [Tue, 13 Sep 2016 19:26:52 +0000 (15:26 -0400)]
In dev_stdout_write, user_strdup_errno should be user_memdup_errno.

We don't use the NUL terminator (presumably) copied by the strdup
variant, and it may not be valid anyway.

Change-Id: Ibce75aaaa8684f2ea5282c53ed8a546c7ff9b724
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agovthread: allow programs to have threads exit on halt.
Ronald G. Minnich [Thu, 8 Sep 2016 16:51:26 +0000 (09:51 -0700)]
vthread: allow programs to have threads exit on halt.

For example, a benchmark declares the vm as follows:
struct virtual_machine vm = {.halt_exit = true,};

Which will force guests that halt to exit.

Change-Id: Ie6368093072f324c86c9ace1807075cd073d540c
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoSet a default sysname in #cons
Barret Rhoden [Tue, 6 Sep 2016 20:39:07 +0000 (16:39 -0400)]
Set a default sysname in #cons

gethostname() reads this.  We want something for machines that didn't set
up their hostname/sysname.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd 'maps' to #proc
Barret Rhoden [Tue, 6 Sep 2016 20:18:04 +0000 (16:18 -0400)]
Add 'maps' to #proc

You can now cat /proc/self/maps, or that of any other process in #proc.
The format of each line is the same as Linux's.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd 'self' to #proc
Barret Rhoden [Tue, 6 Sep 2016 17:50:41 +0000 (13:50 -0400)]
Add 'self' to #proc

Devproc needs an overhaul.  This is a little hokey, but it seems to work.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd sized_kzmalloc()
Barret Rhoden [Wed, 7 Sep 2016 16:27:15 +0000 (12:27 -0400)]
Add sized_kzmalloc()

Synthetic drivers often need to generate some text, based on some command,
and then let read()s copy parts of that buffer out.  Those drivers know the
size too, and would like an easy way to manage their memory.  Enter the

It's just a buffer and a size, which is sufficient for drivers.  Free the
whole thing with kfree.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoVMM: add two vthread functions.
Ronald G. Minnich [Wed, 7 Sep 2016 16:15:53 +0000 (09:15 -0700)]
VMM: add two vthread functions.

The intent of these functions it to give users a familiar
API (pthreads).  I just had the experience of running the
naming by a non-Akaros person and the reaction was really
positive to the pthreads similarity.

Here's a usage example:

struct virtual_machine vm[1];

static volatile int count;

static void vmcall(void *a)
while (count < 1000000) {
__asm__ __volatile__("vmcall\n\t");
while (1);

int main(int argc, char **argv)

vthread_attr_init(vm, 0);
vthread_create(vm, 0, (uint64_t) vmcall, NULL);

while(count < 2) {

return 0;

Change-Id: I3e72d8a0efd89482d2f9856daccb7945f7ae1c92
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[minor formatting]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoImplement sendmsg() (XCC)
Barret Rhoden [Fri, 2 Sep 2016 18:58:05 +0000 (14:58 -0400)]
Implement sendmsg() (XCC)

This doesn't do any fancy control operations - just the iovec sendto().

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse iovecs for sendto() (XCC)
Barret Rhoden [Fri, 2 Sep 2016 18:05:45 +0000 (14:05 -0400)]
Use iovecs for sendto() (XCC)

This is a prereq for handling sendmsg() nicely.  Callers of sendmsg() are
likely to actually use iovecs, so we should attempt to support that.  Note
that readv()/writev() are not vectored yet.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse iovecs for recvmsg() (XCC)
Barret Rhoden [Fri, 2 Sep 2016 17:37:11 +0000 (13:37 -0400)]
Use iovecs for recvmsg() (XCC)

recvmsg() takes an iovec.  The old behavior was legal, since we can just
read into the first vector.  However, if we have a decent readv, then this
layer gets in the way of utilizing readv's performance benefits.

This change is less important for recvmsg() than it will be for sendmsg(),
where the user might have provided more than one iovec.

Using readv() also helps with UDP, since we can just prepend an iovec for
the UDP headers, which is much nicer than the old malloc and memcpy style.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoProtect closeconv() with waserror()
Barret Rhoden [Fri, 2 Sep 2016 17:25:40 +0000 (13:25 -0400)]
Protect closeconv() with waserror()

If closeconv() calls something that throws, it wouldn't unlock.

I didn't see closeconv get jumped over without unlocking, but it was a
potential source of deadlock.  From looking at the code, this is possible:

closeconv() ->
  ipifcremmulti() ->
    remselfcache() ->
      etherremmulit() ->

The latter call can throw.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoqio: Do not kick when calling qdiscard()
Barret Rhoden [Fri, 2 Sep 2016 17:20:42 +0000 (13:20 -0400)]
qio: Do not kick when calling qdiscard()

The TCP stack will deadlock if you kick from a qdiscard.  This was probably
an unwritten assumption from Plan 9's original qio code.  Here's the

#01 [<0xffffffffc20193b5>] in sem_down
#02 [<0xffffffffc203829c>] in tcpkick  locks
#03 [<0xffffffffc2043cf5>] in __qbread
#04 [<0xffffffffc20452f2>] in qdiscard
#05 [<0xffffffffc2038b57>] in update
#06 [<0xffffffffc203a652>] in tcpiput  locks
#07 [<0xffffffffc202b372>] in ipiput4
#08 [<0xffffffffc202781c>] in etherread4
#09 [<0xffffffffc2018880>] in __ktask_wrapper
#10 [<0xffffffffc205e71f>] in process_routine_kmsg
#11 [<0xffffffffc2052875>] in proc_restartcore
#12 [<0xffffffffc2126d3c>] in sysenter_spin

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoTrack pc/fp per kthread for semaphore debugging
Barret Rhoden [Fri, 2 Sep 2016 16:22:04 +0000 (12:22 -0400)]
Track pc/fp per kthread for semaphore debugging

If you have a bunch of kthreads sleeping on the same semaphore, previously
you could only see the last one to down the sem.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix epoll-before-listen bug (XCC)
Barret Rhoden [Thu, 1 Sep 2016 19:09:04 +0000 (15:09 -0400)]
Fix epoll-before-listen bug (XCC)

Previously, if you added a socket FD (a.k.a. a rock) to an epoll set before
you called listen(), then we'd tap the data FD instead of the listen FD.

Rebuild glibc and any apps using epoll/select (e.g. dropbear).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoparlib: have delay functions return end time; add nsec call.
Ronald G. Minnich [Wed, 31 Aug 2016 22:28:07 +0000 (15:28 -0700)]
parlib: have delay functions return end time; add nsec call.

Delay functions don't necessarily end right at the exact time
asked. Change udelay and ndelay to return the last read time in
microseconds and nanoseconds, respectively. A side effect is that
udelay(0) and ndelay(0) return approximate current time.

Add an nsec() call to return the current nanoseconds as a uint64_t.

While we're at it, have timing.c including timing.h so we can
be sure the prototypes match the function definitions.

And, finally, clang-format it.

Change-Id: I22b855ac055314a1846dc45f93378675104f13a4
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[checkpatch touchup]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix DOTDOT for #root
Barret Rhoden [Wed, 31 Aug 2016 10:43:59 +0000 (06:43 -0400)]
Fix DOTDOT for #root

devroot is a mess.  I think it can't grow dynamically very well.  There
are already well-known issues (in the TODO section).

For now, this allows us to do something like "ls /env/..".  Previously
that would crash.  I took it a step farther and added subdirectories to
env, just to make sure DOTDOT worked for non-root DOTDOTs.  That was a
huge pain.

Now you can do things like this without crashing the kernel:

/ $ ls /nvfs/../
chan     env      mnt      net.alt  proc     prog     srv
dev      fd       net      nvfs     prof     root
/ $ ls /env/
env_dir1  env_dir2
/ $ ls /env/../
chan     env      mnt      net.alt  proc     prog     srv
dev      fd       net      nvfs     prof     root
/ $ ls /env/env_dir2/../
env_dir1  env_dir2

We used to have some code that would, for when we weren't at the
top-of-device entry (e.g. ""), appear to walk all siblings of
roottab[p], until we found the one whose qid.path matched whatever we
found via rootdata[].dotdot.  That seemed busted.

Ultimately, we need a dynamically changeable ramfs.  #root might not be

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoStop using snprintf in write_hex_to_fd (XCC)
Barret Rhoden [Tue, 23 Aug 2016 21:28:56 +0000 (17:28 -0400)]
Stop using snprintf in write_hex_to_fd (XCC)

This is somewhat of a stopgap to deal with a brutal bug.  VM guests were
seeing XMM corruption.  Eventually, we boiled down to a simple test that
even showed the host task thread's xmm state was getting corrupted.  We
noticed that printf calls (used in debugging) were clobbering the xmm
state, which stands to reason: most any glibc string or memory operation
uses xmms.  Check out strrchr, strlen, and memcmp.

It's quite legal for any function to use xmm state - we're supposed to save
it before clobbering it.  The problem comes with vcore context.  If vcore
context calls any of these functions, including snprintf, it can clobber FP
state.  Unlike other functions, vcore context is not supposed to do that.

The specific scenario was that the VMM 2LS's vcore timer tick would fire.
When we reenabled the vcore tick, we'd ultimately call write_hex_to_fd,
which would use snprintf.  That would clobber the FPU state, which was the
guest's state.

The long term fix is to either aggressively save and restore FP state in
vcore context or ensure that no glibc helpers use xmms when we're in vcore
context.  The choice will probably depend on how expensive the FP
save/restores are on x86.  Fixing the glibc helpers would be a minor pain;
we'd need our own sysdep, but we'd still want to call the xmm version
during non-vcore-context.  That also doesn't protect us from any other apps
that might try to call an xmm op during an event handler.

So in that regard, it's a stopgap.  I also like not relying on glibc in
general from vcore context, so the less snprintfs for simple things, the

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix num_to_nibble()
Barret Rhoden [Tue, 23 Aug 2016 21:12:05 +0000 (17:12 -0400)]
Fix num_to_nibble()

If you passed it a negative number, the mod wouldn't take the lower 4 bits.
I originally went with % 16 so it'd be clear we're dealing with 16
characters in the array.  That needed to be unsigned.  While I'm here, I'll
just do the masking too, in case this code gets copied and morphed a bit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd basic SO_ERROR support (XCC)
Barret Rhoden [Tue, 30 Aug 2016 18:20:30 +0000 (14:20 -0400)]
Add basic SO_ERROR support (XCC)

Dropbear checks SO_ERROR to see if there was a problem.  We currently don't
track errors at the socket layer, but we can at least say there was no
issue.  In the future, we can extend the Rock/socket shims to track recent
errors if we want.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAHCI: re enable the PCI device.
Ronald G. Minnich [Tue, 23 Aug 2016 22:05:34 +0000 (15:05 -0700)]
AHCI: re enable the PCI device.

This is not strictly an AHCI thing but I needed it for
AHCI debugging. It's been in our tree for a long time and
it was time to turn it on.

/bin/bind -a '#pci' /dev

bash-4.3$ ls /dev/pci
0.0.0ctl   0.2.0ctl   0.25.0ctl  0.29.0ctl  0.5.0ctl   1.0.0ctl   6.0.0ctl
0.0.0raw   0.2.0raw   0.25.0raw  0.29.0raw  0.5.0raw   1.0.0raw   6.0.0raw
0.1.0ctl   0.20.0ctl  0.26.0ctl  0.3.0ctl   0.5.1ctl   1.0.1ctl
0.1.0raw   0.20.0raw  0.26.0raw  0.3.0raw   0.5.1raw   1.0.1raw
0.17.0ctl  0.22.0ctl  0.28.0ctl  0.31.0ctl  0.5.2ctl   5.0.0ctl
0.17.0raw  0.22.0raw  0.28.0raw  0.31.0raw  0.5.2raw   5.0.0raw

The raw file is the config space; the ctl file is operations.

This is inherently safer than what we've done to date using
direct IO to the 0xcf8/cfc addresses, as they are shared
resources and multiple users can interfere with each other
(which has been seen in the nature).

Change-Id: I54e2f0e9af1361bfd8aebf0d7094d2a749f6065b
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[checkpatch fixes]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoUse getopt_long and add help option to vmrunkernel
Kyle Milka [Wed, 24 Aug 2016 23:35:43 +0000 (16:35 -0700)]
Use getopt_long and add help option to vmrunkernel

Added getopt_long to vmrunkernel, now there are less cryptic names for
some of the available option. Also, no longer have to go inspect the source
to figure out which options you need.

Change-Id: I305a075e9c49a7412b706f767cde6ad29dd235fb
Signed-off-by: Kyle Milka <kmilka@google.com>
[checkpatch touchups]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoVMM: Add commandline parameter to force use of TSC
Gan Shun [Wed, 24 Aug 2016 23:34:38 +0000 (16:34 -0700)]
VMM: Add commandline parameter to force use of TSC

The VM guest was turning off the TSC after using watchdog.
We tell it to use the tsc regardless. This is due to us not handling
the lapic timer properly.

Fixes: b/30568132

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: I7640ee2578ac7fb1c63b60b46fc279f78172fa2d
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoMMIO: make mmio operators type safe.
Ronald G. Minnich [Mon, 22 Aug 2016 15:12:29 +0000 (08:12 -0700)]
MMIO: make mmio operators type safe.

The operators took void *, which made it extremely
hard to debug incorrect usage, which I had a lot of
in the ahci driver. They are now type safe, e.g.
a write to a byte requires a uint8_t*, not a void *.

Change-Id: I089a8f3c5d71fcbc3250535e47e998ee3c15f08e
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[mlx4 recast, checkpatch fixups]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix shifting bug in radix_insert()
Barret Rhoden [Fri, 19 Aug 2016 19:57:18 +0000 (15:57 -0400)]
Fix shifting bug in radix_insert()

This failed to index for keys greater than 32 bits.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoFix offset calculation in populate_va
Barret Rhoden [Fri, 19 Aug 2016 19:55:05 +0000 (15:55 -0400)]
Fix offset calculation in populate_va

That should clearly be a +, not a -, since we're figuring out how far into
the VMR to map.

This would trigger if you had a file mmapped that wasn't MAP_POPULATE, then
had a uthread fault on accessing that file, and it wasn't on the first page
of the file.

While we're here, we can also catch any integer overflows with offset and

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoBuild gcc with USE_PT_GNU_EH_FRAME (XCC)
Barret Rhoden [Fri, 19 Aug 2016 17:40:52 +0000 (13:40 -0400)]
Build gcc with USE_PT_GNU_EH_FRAME (XCC)

If we don't build with PT_GNU_EN_FRAME set, our shared libraries (e.g.
libm.so) will have a dependency on unwinding, which can get erronously
linked with libgcc_eh.a's hidden __register_frame_info.

Those references would come from frame_dummy(), called from _init.  On
Linux, this doesn't happen, and we attempt to be as similar to Linux as
possible, at least regarding the toolchain.

Note that USE_PT_GNU_EH_FRAME is not set when CRTSTUFFT_0 is set.  That is
explicitly set when building with -static.  That makes some sense, since
static apps will link against libgcc_eh.a (and not libgcc_s.so), and the
dynamic apps will use the PT_GNU_EH_FRAME.

There's some info on this stuff here:


Rebuild your toolchain.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdded GNU `tar` to Akaros.
Dan Cross [Wed, 17 Aug 2016 15:22:18 +0000 (11:22 -0400)]
Added GNU `tar` to Akaros.

Change-Id: I04a71cffdfac2eea2f424616a5bcfbd7f0b34956
Signed-off-by: Dan Cross <crossd@gmail.com>
[moved to app-arch]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd GNU `cpio` to Akaros.
Dan Cross [Wed, 17 Aug 2016 15:22:11 +0000 (11:22 -0400)]
Add GNU `cpio` to Akaros.

Change-Id: I2710a25a4e48604a8c44a90734447d22ec0e95c6
Signed-off-by: Dan Cross <crossd@gmail.com>
[moved to app-arch]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoAdd GNU `diffutils` for Akaros.
Dan Cross [Wed, 17 Aug 2016 15:21:48 +0000 (11:21 -0400)]
Add GNU `diffutils` for Akaros.

Change-Id: I292616827359fde95fde313034794e040eb72ad4
Signed-off-by: Dan Cross <crossd@gmail.com>
[typo in gitignore]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
4 years agoSched_getcpu should return vcoreid. (XCC)
Dan Cross [Thu, 18 Aug 2016 19:30:23 +0000 (15:30 -0400)]
Sched_getcpu should return vcoreid. (XCC)

sched_getcpu implements a Unixy interface; to a first order
approximation, Unix would only know about what we would think
of as a 'vcore': Unix and Linux view the world as if they
provide a virtual layer around the *entire* computer, but
Akaros's MCP is not like that: it's a subset of the machine.

Anyway, hide the pcore ID from the legacy interface: if someone
wants to do something esoteric where they need to know the pcore
ID they can use parlib directly.

Change-Id: I9627c9c1d6b21282cd07b24b30c097f4d3726748
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>