5 years agoAccept more types of FD Taps in #ip
Barret Rhoden [Mon, 26 Oct 2015 19:16:05 +0000 (15:16 -0400)]
Accept more types of FD Taps in #ip

As discussed in commit cfb02bd7818d ("Accept more types of FD Taps in
 #eventfd"), we need to allow some "unimportant" taps, such as PRIORITY
and ERROR.  #ip currently will not trigger any events for these, since
they do not occur in the networking stack (yet), but the user can at
least ask for them.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoImplement recvmsg() (XCC)
Barret Rhoden [Mon, 26 Oct 2015 19:12:07 +0000 (15:12 -0400)]
Implement recvmsg() (XCC)

It's about as standards compliant as recvfrom().

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFix UDP socket bug (XCC)
Barret Rhoden [Fri, 23 Oct 2015 18:26:07 +0000 (14:26 -0400)]
Fix UDP socket bug (XCC)

All UDP sockets were pointing at conversation 0.  We would successfully
clone a new UDP conversation, but when we attempted to read the ctl
file, we'd get an empty string back instead of the conversation ID.
That worked if our conversation happened to be 0, but otherwise would

The root cause was that we advanced the offset by 7 when we wrote the
"headers" command for UDP sockets.  We need to reset the chan back to 0
before reading.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoWeak alias getsockopt() (XCC)
Barret Rhoden [Wed, 21 Oct 2015 15:29:29 +0000 (11:29 -0400)]
Weak alias getsockopt() (XCC)

This allows us to override it in a user library or application, which
tends to be the standard for glibc.  We already do this for
setsockopt(), for instance.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRemove (un)likely from the kernel interface (XCC)
Barret Rhoden [Tue, 20 Oct 2015 19:53:55 +0000 (15:53 -0400)]
Remove (un)likely from the kernel interface (XCC)

Unfortunately, some user libraries out there also #define likely and
unlikely, and those include both ros/common.h and parlib/common.h.
Since we're not using likely/unlikely as part of the kernel interface, I
don't mind moving it out of ros/.  But it's more unfortunate that we
can't put it in a parlib header too.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFix Rock sizeof sockaddr bug (XCC)
Barret Rhoden [Tue, 20 Oct 2015 19:25:55 +0000 (15:25 -0400)]
Fix Rock sizeof sockaddr bug (XCC)

Whenever we consider the size of a Rock's sockaddr, we need to use the
sizeof a struct sockaddr_storage.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoCall printf() instead of fprintf in signal.c
Barret Rhoden [Mon, 26 Oct 2015 21:56:24 +0000 (17:56 -0400)]
Call printf() instead of fprintf in signal.c

Signal handlers run in vcore context.  We could page fault on the glibc
printf calls.  Our printf() is vcore-context safe.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoOverride glibc's printf for vcore context
Barret Rhoden [Mon, 26 Oct 2015 21:55:39 +0000 (17:55 -0400)]
Override glibc's printf for vcore context

Our printf is safe from vcore context.  Otherwise, glibc's printf may
run off the end of the vcore stack, depending on whether or not the
output stream is in buffered mode.

This only overrides printf, not functions like fprintf, vprintf, or any
of the other printf functions.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agopthread: Panic if there is a bad thread state
Barret Rhoden [Mon, 26 Oct 2015 21:44:31 +0000 (17:44 -0400)]
pthread: Panic if there is a bad thread state

There's no reason to merely print here.  If the type is wrong, there is
a critical bug in the 2LS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoEnsure vcore context code includes parlib/assert.h
Barret Rhoden [Mon, 26 Oct 2015 21:13:15 +0000 (17:13 -0400)]
Ensure vcore context code includes parlib/assert.h

Code that runs in vcore context should call parlib's assert.  Otherwise,
there is a chance glibc's assert will call glibc's printf, which may run
off the end of the stack and page fault.

By putting parlib/assert.h in common.h, any downstream headers, such as
vcore.h, event.t, and parlib.h, will pick up our assert().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoDo not breakpoint() on parlib's assert
Barret Rhoden [Mon, 26 Oct 2015 20:46:33 +0000 (16:46 -0400)]
Do not breakpoint() on parlib's assert

The breakpoint is very useful for debugging, and people can add it back
in to their local repos when needed, but it's not needed for the usual
assertion failure.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRemove #include <assert.h> from parlib
Barret Rhoden [Wed, 21 Oct 2015 21:52:40 +0000 (17:52 -0400)]
Remove #include <assert.h> from parlib

Other than the #include <assert.h> in parlib/assert.h, the other assert
includes actually do nothing, other than confuse people.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRename parlib/rassert.h -> parlib/assert.h
Barret Rhoden [Wed, 21 Oct 2015 21:47:34 +0000 (17:47 -0400)]
Rename parlib/rassert.h -> parlib/assert.h

Slight change to the #includes in parlib/assert.h, since we are no
longer including Glibc's assert.h when we build parlib.  Other libraries
and tests do include glibc's assert.h.  This is due to the search path
of the user library Makefrag.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoMove parlib's assert guts into a C file
Barret Rhoden [Wed, 21 Oct 2015 17:31:40 +0000 (13:31 -0400)]
Move parlib's assert guts into a C file

Having the machinery of the print and abort in the header file is
problematic for #include loops.  First, we need stdlib included, which
isn't a big deal.  Second, and more troublesome, is we need vcore.h.
That will cause problems with a later commit, where I have all parlib
code use parlib's assert.

ucq.c was relying on a transitive #include for printd.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUndefine static_assert() in parlib/rassert.h
Barret Rhoden [Wed, 21 Oct 2015 17:31:40 +0000 (13:31 -0400)]
Undefine static_assert() in parlib/rassert.h

static_assert() is #defined in glibc's assert.h under certain
circumstances.  We'll just use our own in parlib code.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUse a -D when building parlib
Barret Rhoden [Tue, 27 Oct 2015 18:59:48 +0000 (14:59 -0400)]
Use a -D when building parlib

The -D will be defined so that a parlib header can determine how to
 #include a file.

The search order for user libraries is to first check its include
directory in the source code, and then check the system headers.  This
is important so that we build with the latest headers, i.e. the ones we
just changed.

The problem comes when we want to include a system/glibc header that
happens to have the same name as a parlib header, e.g. assert.h in an
upcoming patch.  From within parlib, we could do an #include_next.  But
for external libraries and apps, that fails since user/parlib/include is
not on their search path.

With this -D, we can tell which situation we're in and #include

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agopthread: Properly change state for running threads
Barret Rhoden [Tue, 20 Oct 2015 18:56:49 +0000 (14:56 -0400)]
pthread: Properly change state for running threads

We were only setting PTH_RUNNING for thread 0 early on.  After that, it
was all PTH_RUNNABLES.  We should now be able to assert that if a thread
is on the active list, it is marked PTH_RUNNING.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agopthread: Account for pth stopping in has_blocked
Barret Rhoden [Tue, 20 Oct 2015 18:16:19 +0000 (14:16 -0400)]
pthread: Account for pth stopping in has_blocked

This popped up as

uthread.c:621: run_uthread: Assertion `uthread->state == 2' failed.


pthread.c:246: pth_sched_entry: Assertion `new_thread->state == 2'

for an epoll/eventfd app.

The ready and active queues were corrupted, due to adding a pthread to
the ready queue in pth_thread_runnable() that was still on the active

Anytime a pthread stops and will eventually have pth_thread_runnable()
called, as is the case with blocking a uthread on an event queue (which
epoll does), then the pthread code needs to yank it off the active
queue.  Modifications of pthread->state are a good sign that list
management needs to be done.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agopthread: Factor out common active_queue code
Barret Rhoden [Tue, 20 Oct 2015 18:47:49 +0000 (14:47 -0400)]
pthread: Factor out common active_queue code

__pthread_generic_yield() isn't the greatest name for this, since it's
used in non-yield paths, but it beats reusing code, and it's not clear
if we'll want other accounting in there.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agopthread: Fix sem_timedwait() bug
Barret Rhoden [Mon, 19 Oct 2015 15:36:54 +0000 (11:36 -0400)]
pthread: Fix sem_timedwait() bug

__sem_timedblock() takes a sem_queue_element *, not a semaphore *.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoCheck system headers for warnings for userspace
Barret Rhoden [Mon, 19 Oct 2015 15:34:35 +0000 (11:34 -0400)]
Check system headers for warnings for userspace

-Wsystem-headers checks the headers for warnings.  The lack of this flag
was masking a minor bug with TAILQs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agopthread: Fix semaphore's TAILQ type
Barret Rhoden [Mon, 19 Oct 2015 15:25:56 +0000 (11:25 -0400)]
pthread: Fix semaphore's TAILQ type

The semaphore's TAILQ isn't of pthreads, it's of sem_queue_elements.  I
spotted this while trying to debug something else in the area.  The
warning was hidden because the bad assignment was in a system header.

Specifically, when the TAILQ macros attempt to do some form of
assignment, they should generate an incompatible pointer type warning.
However, sys/queue.h is a system header, and those warnings are ignored
by default.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoPrint the vcoreid for unhandled faults in VC ctx
Barret Rhoden [Mon, 19 Oct 2015 15:21:50 +0000 (11:21 -0400)]
Print the vcoreid for unhandled faults in VC ctx

This is a little more useful when diagnosing bugs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoProperly include syscall.h in parlib/event.h
Barret Rhoden [Mon, 19 Oct 2015 15:10:45 +0000 (11:10 -0400)]
Properly include syscall.h in parlib/event.h

When building with -Wsystem-headers, we get a warning like:

... /usr/include/parlib/event.h:37:48:
warning: 'struct syscall' declared inside parameter list
 bool register_evq(struct syscall *sysc, struct event_queue *ev_q);

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd the Inferno license to files we got from Inferno
Ronald G. Minnich [Tue, 27 Oct 2015 15:31:50 +0000 (08:31 -0700)]
Add the Inferno license to files we got from Inferno

This is long overdue. We just kept forgetting. But somebody in
Harvey wanted one of our files and at that point it's essential
to get this right.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[minor touchups, added UCB and Google modifications]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd scripts/spelling.txt
Barret Rhoden [Tue, 27 Oct 2015 17:38:52 +0000 (13:38 -0400)]
Add scripts/spelling.txt

This is used by checkpatch, and copied from Linux's commit 69984b644407
("Merge tag 'arm64-fixes' of

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdjust checkpatch.pl for Akaros's style
Barret Rhoden [Tue, 13 Oct 2015 14:34:04 +0000 (10:34 -0400)]
Adjust checkpatch.pl for Akaros's style

We do a few things differently than Linux.  All are bike-shedable, but
for now, this will allow most of our differences.

Note that checkpatch is a guideline, not a legal document.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoChange checkpatch tab length to 4
Barret Rhoden [Tue, 13 Oct 2015 02:06:13 +0000 (22:06 -0400)]
Change checkpatch tab length to 4

For better or worse, we use 4-space-wide tabs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd checkpatch.pl
Barret Rhoden [Fri, 9 Oct 2015 19:11:43 +0000 (15:11 -0400)]
Add checkpatch.pl

Imported from Linux, commit c6fa8e6de3dc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFix listener / echo servers to handle char mode
Barret Rhoden [Fri, 9 Oct 2015 15:02:10 +0000 (11:02 -0400)]
Fix listener / echo servers to handle char mode

If you telnet in character mode, the server wouldn't output the input,
though it would correctly echo the input back to the client.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoClose Qlisten FDs
Barret Rhoden [Fri, 9 Oct 2015 13:34:33 +0000 (09:34 -0400)]
Close Qlisten FDs

The original ipclose() wasn't built to close Qlistens, which can now be
opened via an O_PATH open.  Prior to O_PATH, if you did an open on
Qlisten, the chan you got back was a Qctl, so we did not need a special
case in ipclose().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUpdate file-posix.c utest
Kevin Klues [Thu, 15 Oct 2015 05:21:06 +0000 (22:21 -0700)]
Update file-posix.c utest

Update this test to reflect some cahnges in the previous commit. This
utest is failing, however, because the vfs doesn't currently support
openat. Once this is fixed, this test should pass again.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUpdate utest infrastructure
Kevin Klues [Thu, 15 Oct 2015 05:19:57 +0000 (22:19 -0700)]
Update utest infrastructure

Updated to allow passing of continuation to run in the case of an assert
failure. Also, we now print the actual test performed in an assert in
the case when no message is passed in.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoSet ENOENT for failed 9ns lookups
Barret Rhoden [Thu, 15 Oct 2015 15:21:53 +0000 (11:21 -0400)]
Set ENOENT for failed 9ns lookups

In the changes from error() taking just an errstr to also taking errno,
some of the times we set_errno(ENOENT) were getting clobbered with

This commit fixed any recent changes to ENOENT that I could find.  There
might be more, but there are no set_errno(ENOENT)s remaining in the 9ns

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFixed error() reporting when error codes are reported by called functions as negative...
Davide Libenzi [Thu, 15 Oct 2015 14:53:46 +0000 (07:53 -0700)]
Fixed error() reporting when error codes are reported by called functions as negative errno codes.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoCheck for ctx in default_core_handler()
Barret Rhoden [Thu, 8 Oct 2015 20:15:58 +0000 (16:15 -0400)]
Check for ctx in default_core_handler()

It's possible for a process to receive an event via sys_notify(), which
will not have a ctx.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoDo not free epoll event queues
Barret Rhoden [Thu, 8 Oct 2015 16:09:46 +0000 (12:09 -0400)]
Do not free epoll event queues

As with many race conditions, something that can happen ends up being
quite likely.  With a little parallelism, I'm able to trigger bugs where
an outstanding INDIR pointing to an epoll event queue gets handled after
the ev_q gets cleaned up.

The long term solution is some form of user-deferred cleanup.  For now,
we can throw away a little RAM.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoHandle 0 usec in rendez_sleep_timeout()
Barret Rhoden [Thu, 8 Oct 2015 15:03:23 +0000 (11:03 -0400)]
Handle 0 usec in rendez_sleep_timeout()

Userspace can ask for 0 sec, so an assert is wrong.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAllow freeaddrinfo(NULL) (XCC)
Xiao Jia [Tue, 13 Oct 2015 23:57:00 +0000 (16:57 -0700)]
Allow freeaddrinfo(NULL) (XCC)

On both glibc and uclibc, freeaddrinfo(NULL) is safe, though there is no
explicit requirement for that in the spec:

So let's change freeaddrinfo() to handle that case.

Rebuild glibc.

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFix get_num_numa() loop in x86 topology.c
Kevin Klues [Wed, 7 Oct 2015 15:57:21 +0000 (08:57 -0700)]
Fix get_num_numa() loop in x86 topology.c

The old loop assumed sorted, monotonically increasing numa domains in
the SRlapic tables.  This loop does not.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoSync fork/exec() with updates to procinfo/procdata
Kevin Klues [Tue, 13 Oct 2015 04:40:26 +0000 (21:40 -0700)]
Sync fork/exec() with updates to procinfo/procdata

The pipetest added in the previous commit exposes a bug with not copying
enough data from procinfo/procdata into a forked process in cases where
we don't exec after the fork. This commit updates the fork and exec code
to make sure that the relevant fields in procinfo/procdata are copied
over properly on a fork. If we do end up execing, these fields are
reinitialized to their initial values.

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoSimple pipe test with fork()
Kevin Klues [Mon, 12 Oct 2015 20:49:26 +0000 (13:49 -0700)]
Simple pipe test with fork()

This test forks off a child process and sets up pipes for communication
with it. It tests both pipes and forks of SCPs with blocking system

Signed-off-by: Kevin Klues <klueska@cs.berkeley.edu>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdded set_error() API to have a single point of entry for setting for errno and errstr.
Davide Libenzi [Wed, 7 Oct 2015 20:09:23 +0000 (13:09 -0700)]
Added set_error() API to have a single point of entry for setting for errno and errstr.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAvoid an extra function call on the error frame handling.
Davide Libenzi [Wed, 7 Oct 2015 19:19:41 +0000 (12:19 -0700)]
Avoid an extra function call on the error frame handling.

[Removed extra line at EOF in err.h]

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoChanged a few EFAIL to proper errno codes.
Davide Libenzi [Wed, 7 Oct 2015 17:37:24 +0000 (10:37 -0700)]
Changed a few EFAIL to proper errno codes.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoDropped char* error file to unify common error strings handling.
Davide Libenzi [Wed, 7 Oct 2015 14:30:14 +0000 (07:30 -0700)]
Dropped char* error file to unify common error strings handling.

[Touched up an off-by-one with error <= MAX_ERRNO]

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdded explicit errno reporting from error() API.
Davide Libenzi [Wed, 7 Oct 2015 02:46:23 +0000 (19:46 -0700)]
Added explicit errno reporting from error() API.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRemove errstrings.h, in favor of error.c
Kevin Klues [Wed, 7 Oct 2015 21:40:01 +0000 (14:40 -0700)]
Remove errstrings.h, in favor of error.c

The errstrings.h file was only used to generate an error_strings[] table
in error.h.  Instead, we now generate an error.c file which defines a
table similar to this (called errno_strings[]), but is part of a .c file
instead of a .h file. We then extern this table in through error.h. The
error.c file is automatically generated if we ever change ros/errno.h.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoReplaced dummy likely/unlikely definitions with the ones coming from compiler.h.
Davide Libenzi [Thu, 8 Oct 2015 19:35:13 +0000 (12:35 -0700)]
Replaced dummy likely/unlikely definitions with the ones coming from compiler.h.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdded support for static branch hinting (XCC)
Davide Libenzi [Thu, 8 Oct 2015 18:39:56 +0000 (11:39 -0700)]
Added support for static branch hinting (XCC)

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[Reinstall your kernel headers]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUse process struct flag to indicate tracing instead of scanning an array.
Davide Libenzi [Thu, 8 Oct 2015 19:28:07 +0000 (12:28 -0700)]
Use process struct flag to indicate tracing instead of scanning an array.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRestore flags interrupts on the error path.
Davide Libenzi [Wed, 7 Oct 2015 23:49:51 +0000 (16:49 -0700)]
Restore flags interrupts on the error path.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAvoid void* error buffer declaration
Davide Libenzi [Thu, 8 Oct 2015 21:23:05 +0000 (14:23 -0700)]
Avoid void* error buffer declaration

Place errbuf declaration so that it can be explicitly declared, instead
as void pointer.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[Touched up commit formatting / typos]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agomlx4: Support transmitting block extra data
Xiao Jia [Wed, 30 Sep 2015 22:06:23 +0000 (15:06 -0700)]
mlx4: Support transmitting block extra data

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoSupport block extra data in adjustblock
Xiao Jia [Tue, 22 Sep 2015 23:45:53 +0000 (16:45 -0700)]
Support block extra data in adjustblock

I tested this change by running

    ping <host>
    ping -s 5000 <host>

and verified both ping executions succeeded.

For the above testing, I also patched en_tx.c temporarily with

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd helper function block_append_extra
Xiao Jia [Tue, 22 Sep 2015 23:44:39 +0000 (16:44 -0700)]
Add helper function block_append_extra

It will be used by block extra data fixes.

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUse block_add_extd retval to detect success or error
Xiao Jia [Wed, 7 Oct 2015 21:29:30 +0000 (14:29 -0700)]
Use block_add_extd retval to detect success or error

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoChange block_add_extd to return success or error
Xiao Jia [Tue, 29 Sep 2015 21:58:35 +0000 (14:58 -0700)]
Change block_add_extd to return success or error

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRefactor freeb to separate out free_block_extra
Xiao Jia [Tue, 22 Sep 2015 23:43:25 +0000 (16:43 -0700)]
Refactor freeb to separate out free_block_extra

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoPrint block content and backtrace in PANIC_EXTRA
Xiao Jia [Fri, 18 Sep 2015 01:22:23 +0000 (18:22 -0700)]
Print block content and backtrace in PANIC_EXTRA

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoMove network config blocks out of ifconfig
Xiao Jia [Tue, 29 Sep 2015 19:48:48 +0000 (12:48 -0700)]
Move network config blocks out of ifconfig

Existing "known good" sections and qemu default are moved to
/etc/network/default.  Users can write their own config blocks in
/etc/network/local which is not under version control.  Users can
also put individual custom stuff under /etc/network/local.d/ which
will be picked up by the ifconfig script.

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAllow fcntl() to toggle O_NONBLOCK
Barret Rhoden [Thu, 1 Oct 2015 14:12:56 +0000 (10:12 -0400)]
Allow fcntl() to toggle O_NONBLOCK

There isn't a good answer yet for whether O_NONBLOCK should be a chan
flag, a device file flag, or both.  For now, I'll let people toggle
O_NONBLOCK.  In the future, we might send a wstat() too and set a file
mode bit (similar to DMAPPEND).

For some devices, like #ip, this will set the chan flag but will have no
effect on the device.  It's not a huge deal, since the sockets shims
intercept fcntl on Rocks and issue the device command.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoCheck MMAP_LOWEST_VA in __is_user_addr()
Barret Rhoden [Thu, 1 Oct 2015 15:14:20 +0000 (11:14 -0400)]
Check MMAP_LOWEST_VA in __is_user_addr()

The main utility for this is in debugging.  We'll be more likely to
distinguish between a kernel page fault due to a buggy kernel from a
page fault due to a bad user.  The latter we'll eventually deal with.
The former requires a bug fix.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRefactor is_user_r{w,}addr()
Barret Rhoden [Tue, 29 Sep 2015 16:22:33 +0000 (12:22 -0400)]
Refactor is_user_r{w,}addr()

Use a helper for the common code.  I used this briefly when I wanted to
catch null pointers for debugging.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd a diagnostic to print info about a core
Barret Rhoden [Thu, 1 Oct 2015 15:00:09 +0000 (11:00 -0400)]
Add a diagnostic to print info about a core

This popped up as a "would be nice to have" feature while tracking down
a bug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoInitialize the rwlock in struct pgrp
Barret Rhoden [Thu, 1 Oct 2015 01:20:17 +0000 (21:20 -0400)]
Initialize the rwlock in struct pgrp

This escaped our notice for a while, since the reader CV is only used
when there is a writer.  That requires some R/W contention on the lock.

The way this popped up was if you did two ifconfigs back to back.
ifconfig does some mounting and cs removes old #srv/cs files.  Some
combination of these led to a writer mucking with the NS while another
thread was calling findmount.  The concurrent threads was a critical
part, and things like printks could throw it all off.  Good times.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAccept more types of FD Taps in #eventfd
Barret Rhoden [Tue, 29 Sep 2015 19:09:33 +0000 (15:09 -0400)]
Accept more types of FD Taps in #eventfd

The taps will never fire, but people can at least ask for them.  Asking
for ERROR is actually legitimate in Linux.

In general, being strict with what taps people ask for might be too
harsh, though in general if someone asks for something, they might
actually care if it happens or not.  For instance, we don't want to have
a device that can't do a READABLE tap and then have an app that thinks
it is waiting for READABLE to fire.  It never will, and the application
will hang.  So perhaps being strict on the more *important* taps is the
way to go.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd #cons/urandom
Barret Rhoden [Tue, 29 Sep 2015 15:55:47 +0000 (11:55 -0400)]
Add #cons/urandom

Under the hood, it's the same as #cons/random.  We can look into what we
really need for random and urandom when we overhaul all of the random
generating code.  If anything, it's all urandom, and we'll need a
stronger real 'random.'

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoMake syscall trace records for all copy_path calls
Barret Rhoden [Mon, 28 Sep 2015 20:50:49 +0000 (16:50 -0400)]
Make syscall trace records for all copy_path calls

When we traced an open call, we'd save the path.  There are a lot of
other syscalls that have paths, and we weren't tracing them.  By tracing
during copy_path(), we deal with 90% of those cases.  The other cases
are ones in which there are multiple copy_path() calls per syscall.  In
those cases, the specific syscall can change the t->data string
afterwards, as is done in the case of sys_rename().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFix bugs with syscall trace record data copies
Barret Rhoden [Mon, 28 Sep 2015 20:50:49 +0000 (16:50 -0400)]
Fix bugs with syscall trace record data copies

openat()'s trace was using path_l, instead of the MIN of path_l and the
buffer size.  Whoops - you'd overflow the buffer and cause all sorts of
problems (and only when tracing!).

write()'s trace was using ret, which could be -1.  We want to capture
what was attempted to be written, regardless of failure.  That's 'len',
not ret.

There's also no reason to use memmove.  We know the buffer for the trace
is distinct from its input.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoChange len from int -> size_t for sys_{read,write}
Barret Rhoden [Mon, 28 Sep 2015 21:01:15 +0000 (17:01 -0400)]
Change len from int -> size_t for sys_{read,write}

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoChange sysname to Akaros
Barret Rhoden [Mon, 28 Sep 2015 20:42:47 +0000 (16:42 -0400)]
Change sysname to Akaros

I like how the old default was Windows 95.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoFix benchutil alarm open to use #alarm
Barret Rhoden [Mon, 28 Sep 2015 22:30:03 +0000 (18:30 -0400)]
Fix benchutil alarm open to use #alarm

Fixes: 7fb6e2110113 ("Modify userspace to use device names [2/3]")

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoTrack startup kthreads as ktasks
Barret Rhoden [Mon, 28 Sep 2015 22:11:27 +0000 (18:11 -0400)]
Track startup kthreads as ktasks

The ktask flag marks whether or not we are a kernel task or a
user-backing kthread (meaning we're executing a syscall or the user is
running).  Parts of the codebase assume you are one or the other, as in
rendez_sleep().  That's probably a correct assumption.

If you call kthread_usleep() before smp_idle(), we'd get in a situation
where we had a kthread (the startup kthread) that was not a ktask (prior
to this commit) and the code that handles aborting syscalls would think
there should be a user syscall associated with the kthread.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoAdd support for pthread_cleanup() routines
Kevin Klues [Fri, 4 Sep 2015 01:21:50 +0000 (18:21 -0700)]
Add support for pthread_cleanup() routines

We still don't support pthread_cancel(), but at least now any cleanup
routines will be executed properly upon pthread_exit().
Also, we could consider turning these into macros and removing the
malloc/free calls because these functions are guaranteed by the POSIX
standard to be called in the same lexical scope:


Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoMove decl of pthread_once() out of unsupported
Kevin Klues [Thu, 3 Sep 2015 21:07:26 +0000 (14:07 -0700)]
Move decl of pthread_once() out of unsupported

We already had pthread_once() declared higher up in the header file, so
it shouldn't be declared down in the "unsupported" section. Also, there
is an erroneous declaration for uthread_once_t, which is now removed.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoUpdate mailing list refs
Kevin Klues [Tue, 6 Oct 2015 16:43:02 +0000 (09:43 -0700)]
Update mailing list refs

We no longer maintain the berkeley hosted mailing list. This commits
removes all references to the old mailing list in favor of the new on on
google groups.

5 years agotopology: handle cases where acpi is incomplete
Ronald G. Minnich [Mon, 5 Oct 2015 17:07:46 +0000 (10:07 -0700)]
topology: handle cases where acpi is incomplete

Sometimes, ACPI is there but there are not enough tables to correctly work
out the NUMA domains. In this case, we want to assume a flat topology.

This patch changes the topology init code to check for an incomplete
table as well as the cpu bits test.

This is tested and resolves the boot problems with chromebooks.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoUntangling the glibc header rat's nest (P.2) (XCC)
Barret Rhoden [Fri, 2 Oct 2015 14:14:04 +0000 (10:14 -0400)]
Untangling the glibc header rat's nest (P.2) (XCC)

This time around, we'll try and fix up the time headers.  Ideally,
anything that is part of the kernel interface is exposed via the kernel
headers.  For instance, struct timespec and maybe struct timeval (which
is just mentioned in a comment).

It's relatively easy to override timeval - that's what bits/time.h is
for (it gets included by sys/time.h).  However, timespec is a little
trickier, since it's defined directly in time.h, not bits/time.h that is
made to be sysdep-overrode.  (Note that timespec is available to
programs via #include time.h.  Timeval comes from sys/time.h...).
Overriding time.h required the same file twice:
sysdeps/akaros/time/time.h and sysdeps/akaros/time.h.

With this dive into the rats nest, our kernel header no longer needs the
mysterious #define __timespec_defined.

Rats' nest ref: 5b5cc8856

Rebuild glibc.

5 years agoRemove itimerspec from <ros/time.h> (XCC)
Kevin Klues [Wed, 30 Sep 2015 21:57:02 +0000 (14:57 -0700)]
Remove itimerspec from <ros/time.h> (XCC)

Its existence causes conflicts when both <ros/time.h> and <time.h> are
\#included in the same file. We will likely want to add support for an
itimer at some point in the future, but this will never be a kernel
construct, so it's fine to pull its definition straight from <time.h>
when we go to build it. Any implementation we build will sit on the
\#alarm device and just expose the itimer interface in userspace.

We already support something "sortof" like the itimer, except its on a
per-vcore basis, rather than a per-thread basis. We can think about
actually supporting the itimer interface similarly.

[brho: make timer_deps include <ros/time.h> to check for the conflict]

Reinstall your kernel headers.

5 years agoRemove dependency for {unistd,stdlib}.h in vcore.h (XCC)
Kevin Klues [Thu, 1 Oct 2015 02:24:22 +0000 (19:24 -0700)]
Remove dependency for {unistd,stdlib}.h in vcore.h (XCC)

We only had this dependency to include the prototype for _exit() so we
could override our exit() call with it.  We still need to do this
override, but there is no need to pollute the namespace of everything
that #includes vcore.h with all of the stuff from unistd.h and stdlib.h.
Just extern in the _exit() and exit() prototypes.

Removing this dependency meant that some of our .c files needed to
explicitly #include these files.  They are patched up accordingly.

Requires a rebuild of the cross compiler (XCC)

5 years agoFix warning in glibc-2.19/sysdeps/akaros/user_fd.c (XCC)
Kevin Klues [Thu, 1 Oct 2015 04:28:34 +0000 (21:28 -0700)]
Fix warning in glibc-2.19/sysdeps/akaros/user_fd.c (XCC)

We should explicitly return 0 at the end of this function.

Kevin Klues [Thu, 1 Oct 2015 02:50:17 +0000 (19:50 -0700)]

We currently just implement our rwlocks using a standard pthread_mutex.
For these locks to be usable, we also need to have an INITIALIZER that
matches the normal PTHREAD_MUTEX_INITIALIZER.  We should revisit this
soon and provide true rwlocks.

5 years agoMake --no-print-directory optional in MAKERULES
Kevin Klues [Thu, 1 Oct 2015 00:12:05 +0000 (17:12 -0700)]
Make --no-print-directory optional in MAKERULES

Allow people to override our setting of the --no-print-directory option
in their Makelocal. This is useful, for example, to allow emacs to find
the correct file when errors are encountered using its builtin 'M-x
compile' command. This also requires us to "cd' with our recursive makes
using the '-C' option rather than actually calling 'cd' before invoking
our recursive make.

5 years agoAdd user interface to #eventfd (XCC) [2/2]
Barret Rhoden [Tue, 22 Sep 2015 15:28:18 +0000 (11:28 -0400)]
Add user interface to #eventfd (XCC) [2/2]

The glibc eventfd headers are from the Linux port.

Rebuild glibc.

5 years agoAdd #eventfd [1/2]
Barret Rhoden [Tue, 22 Sep 2015 15:23:40 +0000 (11:23 -0400)]
Add #eventfd [1/2]

This is a kernel device for eventfd().  It differs slightly from Linux
in that the kernel interface is a string instead of a host-endian u64.

You can play with the raw interface by attaching an instance of #eventfd
to the namespace (just like #pipe).  For example:

/ $ bind \#eventfd /prog
bind #eventfd -> /prog flag 0
( attach an eventfd in counter mode )
/ $ echo 33 > /prog/efd
/ $ read_once /prog/efd
33/ $
( put in and extract 33 (decimal) )
/ $ read_once /prog/efd &
( read in the background.  will exit after one read syscall. )
/ $
/ $ echo 33 > /prog/efd
33/ $
( woke up the blocked read_once )

5 years agoAdd a helper: read_once
Barret Rhoden [Tue, 22 Sep 2015 15:40:49 +0000 (11:40 -0400)]
Add a helper: read_once

When dealing with devices, sometimes it's nice to be able to do exactly
one read syscall.

5 years agoFix minor u64 read-in issue in devalarm
Barret Rhoden [Tue, 22 Sep 2015 15:17:23 +0000 (11:17 -0400)]
Fix minor u64 read-in issue in devalarm

32 bits for buf is more than they should ever send in, but NUMSIZE64 is
more appropriate, now that it can handle leading "0x"es.  Also, we
should error out when n > sizeof, not >= sizeof.  This didn't matter
before we used NUMSIZE64.

These aren't a big deal, but since device code gets copied around, it's
worth fixing.

5 years agoAccount for 0x in NUMSIZE{32,64}
Barret Rhoden [Tue, 22 Sep 2015 15:12:04 +0000 (11:12 -0400)]
Account for 0x in NUMSIZE{32,64}

This makes it easier for us to use NUMSIZE for buffer sizes, without
worrying whether or not the format string is in decimal, hex, or hex
with a "0x" in front.

5 years agoProvide a more useful devpermcheck error
Barret Rhoden [Mon, 21 Sep 2015 22:48:02 +0000 (18:48 -0400)]
Provide a more useful devpermcheck error

Perms and rwxes are easier to read in octal.

5 years agoAllow openat() from any file type (XCC)
Barret Rhoden [Wed, 16 Sep 2015 17:36:15 +0000 (13:36 -0400)]
Allow openat() from any file type (XCC)

The kernel doesn't restrict openat()'s "dirfd" to be a directory, which
is why I call it fromfd.  That may be a bad idea; we'll see.

Since the kernel doesn't stop it, there's little reason to have glibc
stop it too.  Perhaps programs that expect to fail will now succeed, but
that's not worth the extra fstat for every file-relative openat().

Rebuild glibc if you want.

5 years agoReplaces SYS_open with SYS_openat (XCC)
Barret Rhoden [Tue, 15 Sep 2015 20:21:59 +0000 (16:21 -0400)]
Replaces SYS_open with SYS_openat (XCC)

openat() is now available as a syscall and through glibc's shims.

Rebuild glibc and anything that may have called open().  Go probably
needs changed too, since SYS_open is gone.

5 years agoImplement sys_open() with sys_openat() (XCC)
Barret Rhoden [Tue, 15 Sep 2015 20:00:13 +0000 (16:00 -0400)]
Implement sys_open() with sys_openat() (XCC)

With namec_from(), we can now build openat() for 9ns.  This commit
builds sys_openat (and the 9ns version), and uses that as a wrapper for
sys_open.  Userspace cannot access this call yet.  Our VFS does not have
support for openat at all.

Also, unlike Linux, we allow an openat from any type of chan, not just a
directory - at least that's the case within the kernel.  What userspace
does (like glibc) is its own thing.

This changes a kernel header, though it shouldn't affect you.

5 years agoSplit namec() into a start point and __namec_from
Barret Rhoden [Tue, 15 Sep 2015 19:10:56 +0000 (15:10 -0400)]
Split namec() into a start point and __namec_from

The first half of namec() figures out which chan we should start from,
whether that's a #device attach point, /, or DOT.  Then the rest does
the actual walk and other stuff.

This splits namec() such that we can eventually call the namec_from for
an implementation of openat().

AFAIK, things like prefix and the difference between name and aname is
mostly for debugging.  In namec(), aname was the original name asked for
(e.g. #root/foo/bar), and name gets advanced up to the path relative to
the starting point (e.g. /foo/bar).

namec_from() is a helper that just calls __namec_from, as if you already
had a real chan and were walking farther down the line (hence the
can_mount).  This should be the essence of an openat.

5 years agoChange namec() and walk()'s nomount to can_mount
Barret Rhoden [Tue, 15 Sep 2015 18:35:11 +0000 (14:35 -0400)]
Change namec() and walk()'s nomount to can_mount

The double-negative was ugly.  This changes the variable to a bool and
switches its value.

Note that the walk() changed here is 9ns's walk, not to be confused with
devtab's walk(), or any other walks.

5 years agoAllow 9ns clones of chans opened with O_PATH
Barret Rhoden [Wed, 16 Sep 2015 16:19:54 +0000 (12:19 -0400)]
Allow 9ns clones of chans opened with O_PATH

I've heard it's a bad idea to allow clones of opened chans.  I'd like to
do it for O_PATH (no I/O allowed) chans.

I don't know the reasons for not allowing the clone.  One thing is that
it appears that devices up their refcnts or otherwise keep objects
around based on an open - which stands to reason: even after you unlink,
open objects stay around.  When we devclone, we might be messing up
something where the device does not know about the cloned chan.
However, the new chan is not COPEN, so it's like one of what I call the
"kernel internal" chans.

This relates to the decision to have O_PATH actually call a device's
open.  The choices seem to be:

1) Don't call open.  The user has an FD that points to a chan that may
or may not point to an actual object (not super comfortable with that,
but it might be fine.  This is my original SYS_walk).  Devclone doesn't
allow any opened chans to be cloned (and therefore walked from), and no
O_PATHs are actually opened.  You can only openat() from one of these
O_PATHs.  FD taps (e.g. ipfdtap) will need to grab references to keep
the conversation alive (and there may be races/issues of tapping old

2) Call open.  The user will only ever have FDs that point to opened,
possibly-refcnted objects (this might be unnecessary).  The device is
involved in an O_PATH open.  openat() can be called on any FD (we may
allow from non-dirs).  The downside is that we're cloning an open chan,
which may have bad side effects.

For now, I'll go with option 2.

5 years agoRemove unused error strings
Barret Rhoden [Tue, 15 Sep 2015 17:25:48 +0000 (13:25 -0400)]
Remove unused error strings

I noticed Ebadsharp wasn't used anymore, as of a couple commits ago, and
figured it was time to prune the list a little.

In general, if we're using a constant for an errstring, then we should
just be using errno.  If it's worth using errstr, then it's worth having
a custom, printf-style message.

5 years agoRemove old scripts from KFS
Barret Rhoden [Wed, 16 Sep 2015 16:09:43 +0000 (12:09 -0400)]
Remove old scripts from KFS

Both are unused, and in lieu of patching their device names, we're
removing them.  Trex is an unfinished ethermedium, and Ron doesn't use
runvm anymore.

5 years agoRemove struct dev's dc [3/3]
Barret Rhoden [Tue, 15 Sep 2015 15:47:51 +0000 (11:47 -0400)]
Remove struct dev's dc [3/3]

This was the field that identified the device with one char.

For the most part, this change was just removing dc and using name in
its place for some debugging.

The tricky stuff is that devmnt and devdir were putting the dc into the
struct dir (a D), I think.  We'll see if there are any harmful effects
of that.

5 years agoModify userspace to use device names [2/3]
Barret Rhoden [Tue, 15 Sep 2015 15:17:29 +0000 (11:17 -0400)]
Modify userspace to use device names [2/3]

This involved changing any #device from #DC to #name.

Anything outside the repo that accesses #devices, such as the Go port,
personal ifconfig scripts, etc, will need to be updated.