5 years agoVFS: only lookup once
Barret Rhoden [Wed, 17 Sep 2014 23:06:19 +0000 (16:06 -0700)]
VFS: only lookup once

Path lookups were looking up twice on failure, optimisticly assuming we'd want
to O_CREAT(E) too.

This isn't a huge deal.  It was more of a problem when our path lookups were
buggy and took 20usec.  Then the extra lookup was expensive.

5 years agoVFS: use a proper hash function
Barret Rhoden [Wed, 17 Sep 2014 22:58:39 +0000 (15:58 -0700)]
VFS: use a proper hash function

Every dentry was getting 0xcafebabe for its hash value.  That put them all in
the same bucket in the dentry cache.  That made dcache lookups cost
O(nr_files_in_vfs), which was making opens (or any path lookup) take a long
time once we put the Go tree in KFS.  This even affected 9ns lookups, since
those check the VFS before trying 9ns.

5 years agoVFS: superblock init can handle d_ops
Barret Rhoden [Wed, 17 Sep 2014 22:55:52 +0000 (15:55 -0700)]
VFS: superblock init can handle d_ops

Passing 0 for the parent won't work if we actually want to use dentry ops for
the qstr building (d_hash).

5 years agoprint_func helpers cleanup
Barret Rhoden [Wed, 17 Sep 2014 19:55:52 +0000 (12:55 -0700)]
print_func helpers cleanup

The trace_printk doesn't work well with the existing helpers for the poor-mans
ftrace, but this change makes it a little easier to use.

If you want to use trace_printk, change the main print line to trace_, remove
the trailing \n, and comment out __print_hdr.

5 years agotrace_printk()
Barret Rhoden [Wed, 17 Sep 2014 17:53:52 +0000 (10:53 -0700)]

trace_printk() will drop lines of formatted text into the trace buffer,
up to a limited size.

A couple things to note.
- The trace buffer prints syscalls as the complete, not when they start.
  If you have some trace prints from a syscalls execution, they will
  show up before the syscall entry
- If you have a trace print, it will always kmalloc and build the trace.
  We don't have controls (yet) for globally disabling any prints.  I
  didn't bother coupling it to the "trace" monitor commands, opting to
  wait to control it via #K.  Might not even be necessary, since these
  are for debugging.
- If kprof is not attached, the traces aren't saved (or accessible).
- I'd like it if we could use all traces as extra_data blobs, so we just
  pass the pointer to a block in the queue, instead of copying
  everything.  Not a big deal though.

5 years agosnprintf() return value changes
Barret Rhoden [Wed, 17 Sep 2014 07:28:32 +0000 (00:28 -0700)]
snprintf() return value changes

It's helpful for snprintf() to return 0, instead of an error code, when
it does no work.  A common pattern is something like:

len = 0;
len += snprintf(buf + len, bufsz - len, "whatever");
len += snprintf(buf + len, bufsz - len, "overflowed buf");
len += snprintf(buf + len, bufsz - len, "used to error");
len += snprintf(buf + len, bufsz - len, "and more text");

Once bufsz - len == 0, such as after the "overflow" print, future
snprintfs now return 0, and are basically nops.  Previously, the
snprintfs that error out would return a negative value, actually setting
length back slightly, allowing "and more text" to clobber a bit.

Additionally, the usual snprintf returns how many characters we
processed, regardless of whether or not we wrote them.  This is
unsuitable for marking progress through a buffer.  Now, we return how
many characters we wrote.

The current semantics: snprintf forces a null termination of the string,
but does not count that in the return value (similar to strlen()).  The
return value is the number of characters written.  If a buf has n bytes,
n-1 is the max return value, with the nth byte being set to 0.

This is a little different than normal snprintf, but is more useful for
our series-of-snprintfs pattern.  If we change it back, we'll need to be
careful of the signs of bufsz and len to make sure we don't pass in
large unsigned values and accidentally trigger a huge printf.

5 years agoRemove ifconfig from root script
Kevin Klues [Wed, 17 Sep 2014 18:05:56 +0000 (11:05 -0700)]
Remove ifconfig from root script

This was moslty in there for me, and I don't want it there anymore.

5 years agoCleans up devip state functions
Barret Rhoden [Wed, 7 May 2014 23:25:05 +0000 (16:25 -0700)]
Cleans up devip state functions

The protocols (tcp, udp, ipifc, etc) have state functions that print out
state info about a conversation.  There are a few things wrong.
- The main thing is that the size of the print buffers can change from
  one syscall to another.  When cat reads it, it reads twice so that it
  can detect EOF.  If the filesize changed, it could get more info the
  next time.
- TCP was printing %lu instead of %u for u32s.  This was popping up as
  as very large numbers due to seeing gibberish on the stack thinking it
  was a 64 bit int.  This also changed the size of the state buffer
- The devices were not uniformly doing the \n or not.

5 years agogrow_fd() sets errno/errstr
Barret Rhoden [Thu, 11 Sep 2014 19:41:44 +0000 (12:41 -0700)]
grow_fd() sets errno/errstr

Note the use of error(current_errstr()).  grow_fd() already set errstr,
but we still wanted to do the error longjmp.  Using current_errstr()
should maintain the previous errstr.  It's a format print, again, from
current_errstr into current_errstr again.

Since this commit messed with one of the Ebadf's, I knocked out the
other too.  The long term goal is to not use any of the hardcoded
errstrs (preferring errno for that).  This's one more hardcoded errstr
string removed, with 67 to go!

5 years agogrowfd() grows enough for the desired fd
Barret Rhoden [Wed, 10 Sep 2014 21:54:15 +0000 (14:54 -0700)]
growfd() grows enough for the desired fd

Removing the hacky while loop, too.

This was bugging out if we asked for an FD > nfd + delta.  The
allocation wasn't big enough, and we'd fail.  9ns opens would fail if
there were too many VFS opens between 9ns opens (the VFS and 9ns share
an FD pool).

5 years agoTraces syscalls with nsec precision
Barret Rhoden [Wed, 10 Sep 2014 03:58:43 +0000 (20:58 -0700)]
Traces syscalls with nsec precision

And also formats the trace for a terminal, with the 'data' contents
appearing on the next line.

Here's a trace of reading the letter 'h' from the console (with one
extra wrap due to the width of this commit message):

[     37.776775555]-[     37.776776330] Syscall  13 (  proc_yield):(0x0,
0x0, 0x0, 0x0, 0x0, 0x0) ret: 0x0 proc: 2 core: 0 vcore: 0 data:
[     37.776770403]-[     37.981424392] Syscall 100 (        read):(0x0,
0xffbfdf51, 0x1, 0x0, 0x0, 0x0) ret: 0x1 proc: 2 core: 0 vcore: 0 data:

Note the 'h' on its own after the read command, lined up after the :
after the syscall name.

If there is an empty line in the trace, that is because there was a
trace data length, but printdump didn't print anything.  I noticed this
when the input was a carriage return.

More importantly, notice the timestamps.  The read started first, but
the yield finished first.  First to finish is the first into the trace

5 years agoFixes SCP wakeup latency
Barret Rhoden [Wed, 10 Sep 2014 03:38:17 +0000 (20:38 -0700)]
Fixes SCP wakeup latency

When an SCP syscall completes on a CG core, which ultimately wakes up
the process, the SCP was not running until the next ksched timer tick.

This scenario could happen if an SCP blocks on a read on a pipe that
gets written to by an MCP.  The pipe write wakes the reader, and since
the kthread code is primitive, it just finishes the bottom half of the
syscall on the MCPs core (a CG core).  Core 0 could have been halted the
entire time, and had no reason to wake up.  It may have called
cpu_bored() a long time ago and has not woken up yet.

Btw, note that syscalls in the trace are written in the order of
*completion*, not submission.  This is more clear from the TSC
timestamp, but the pretty output only has msec granularity.

5 years agoDisables the HPET
Barret Rhoden [Tue, 9 Sep 2014 21:26:09 +0000 (14:26 -0700)]
Disables the HPET

If the system has an HPET, ACPI will tell us.  In lieu of properly setting it
up, I just make sure it is disabled.

Long range plan is for a #T timer device or something, which would use the HPET
if available.

The HPET is pretty straightforward btw, just not a priority.

5 years agoCleans up vmap()
Barret Rhoden [Tue, 9 Sep 2014 20:55:52 +0000 (13:55 -0700)]
Cleans up vmap()

Uses KADDR directly, without the physaddr sanity check.  If you run with
less than 1 GB RAM, the check will fail.  I'll probably remove that
check eventually.

5 years agoMoves 9ns endian helpers
Barret Rhoden [Tue, 9 Sep 2014 20:23:27 +0000 (13:23 -0700)]
Moves 9ns endian helpers

Keep them in a single spot.

5 years agox86: initializes the LPC
Barret Rhoden [Tue, 2 Sep 2014 18:48:58 +0000 (11:48 -0700)]
x86: initializes the LPC

If your machine has an LPC, part of the PCH or maybe the southbridge, then this
will do very basic initialization.  It'll just disable one of the timers that
triggers SMIs on one of my machines.

5 years agox86: disables USB legacy stack
Barret Rhoden [Tue, 2 Sep 2014 18:47:59 +0000 (11:47 -0700)]
x86: disables USB legacy stack

Only for EHCI and UHCI.  You'll get a warning on OHCI.

5 years agoChanges default init script to just run bash
Barret Rhoden [Tue, 2 Sep 2014 17:43:54 +0000 (10:43 -0700)]
Changes default init script to just run bash

You need to make menuconfig to use this option.

5 years agoAdd the trex ethermedium.
Ronald G. Minnich [Wed, 10 Sep 2014 02:44:55 +0000 (02:44 +0000)]
Add the trex ethermedium.

The intent is that for bleeding edge devices, we want our own medium
to hack on as we please. Anticipating some weird usage, I've added
the trexconfig script, which you can hack as you wish.

If you want to change basic functions in the medium, copy them and convert
them. I'm still not sure we don't want trexmedium.c but for now we decided not
to create a new file.

comment out the ethermedium struct (i.e. leave only the trexmedium available)
boot, run trexconfig, note network works.

uncomment out ethermedium, boot, run /trexconfig, it all works.
reboot, run ifconfig, it all still works.

I decided to skip the branch because this change is pretty harmless.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoSyscall tracing formatting touchups
Barret Rhoden [Wed, 3 Sep 2014 05:06:36 +0000 (22:06 -0700)]
Syscall tracing formatting touchups

The main thing is that we print the real time (since boot) in seconds,
instead of TSC ticks.

As a reminder to anyone using c89, the TSC only resets on a cold boot.
Perhaps that has something to do with its service processor locking up
every so often!  (we'll see if it is every 49 days)

5 years agoSyscall tracing handles dropped traces
Barret Rhoden [Wed, 3 Sep 2014 00:20:48 +0000 (17:20 -0700)]
Syscall tracing handles dropped traces

If a trace is getting dropped, we'll output the trace instead.

This should rarely happen (OOM), unless we change the queue code.

5 years agoWe can now trace various system calls
Ronald G. Minnich [Fri, 29 Aug 2014 19:51:15 +0000 (19:51 +0000)]
We can now trace various system calls

And see return values, and see file open names and read/write data

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Git-fu'd by brho

5 years agoMove to a queue-based system call tracing
Ronald G. Minnich [Tue, 2 Sep 2014 18:09:29 +0000 (18:09 +0000)]
Move to a queue-based system call tracing

Now, we allocate a trace record in the system call and, when we exit, write it
to a queue for the kptrace qid.

Read reads from the queue.

Records are text, delimited by a newline.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Git-fu'd by brho

5 years agoprintdump(), used for tracing
Ronald G. Minnich [Fri, 29 Aug 2014 06:36:05 +0000 (06:36 +0000)]
printdump(), used for tracing

Git-fu'd by brho.

5 years agochdir and fchdir need to return a 'long'
Kevin Klues [Wed, 27 Aug 2014 03:19:28 +0000 (20:19 -0700)]
chdir and fchdir need to return a 'long'

I made them return an intreg_t because other syscalls use this type
(which is a little weird), but no matter what we use, we need to make
sure the value returned is sign extended properly to the size of a long.

This is necessary because Go has a generic syscall wrapper that examines
the return value and checks to see if it is "-1" before allocating a new
AkaError struct and returning errno and errrstr up the stack. On amd64,
when a syscall just returns an 'int', the upper bits are 0'd out and we
interpret the value as 2^32, not -1 (which indicates a success). We also
cannot simply donwcast the return value to 32 bits before doing the
comparison because some system calls (e.g. mmap) can have valid values
that have all lower 32 bits set to 1.

This isn't a problem for glibc because it doesn't have a generic wrapper
around all syscall. It can down cast the return value to the proper type
in the libc wrapper before doing the check of whether or not to return
an error.

5 years agoFixes chdir retval
Barret Rhoden [Wed, 27 Aug 2014 01:22:21 +0000 (18:22 -0700)]
Fixes chdir retval

Was returning -errno on errors, instead of -1.  Also, this cleans up the
discrepancy betweren how do_chdir() and do_fchdir() handle errno and return

5 years agoRemoves old documentation
Barret Rhoden [Tue, 26 Aug 2014 23:42:24 +0000 (16:42 -0700)]
Removes old documentation

More up-to-date stuff at:

5 years agoFaulting pthread signal handlers abort
Barret Rhoden [Tue, 26 Aug 2014 23:32:01 +0000 (16:32 -0700)]
Faulting pthread signal handlers abort

If the handler faults and tries to signal itself, we print the debug info and
abort the process.

Note the sighandler or the process in general can mask or override certain
handlers (like the PF handler) to not do anything.  In which case, the thread
will restart and refault, forever.  That's the process's fault.

5 years agosys_chdir() / fchdir() take a pid (XCC)
Barret Rhoden [Tue, 26 Aug 2014 22:02:33 +0000 (15:02 -0700)]
sys_chdir() / fchdir() take a pid (XCC)

This is so parents (or any process that controls another) can change the
working directory (PWD, DOT, etc) of another process, including itself.

This does slow down chdir a little, due to the sync on pid lookup and decref,
but scalable chdir() isn't a big deal at this point.

Copy over chdir.c and fchdir.c and rebuild glibc.  Or just make clean it.

5 years agoFixes sys_dup_fds_to
Barret Rhoden [Tue, 26 Aug 2014 21:58:01 +0000 (14:58 -0700)]
Fixes sys_dup_fds_to

Had a gaping hole where we didn't make sure that p controls the target (even
though proc_controls() is mostly a noop now).

Also fixes up the error reporting (set_errno and -1, instead of returning

5 years agoHelper for syscalls getting pid2proc
Barret Rhoden [Tue, 26 Aug 2014 21:56:29 +0000 (14:56 -0700)]
Helper for syscalls getting pid2proc

Given a pid, I often want to get a proc only if p controls it.  Some uses for
pid2proc, like in wait and poke, want to do their own thing.

5 years agoRevert "Add support for the childfdmap for Go"
Kevin Klues [Tue, 26 Aug 2014 20:01:39 +0000 (13:01 -0700)]
Revert "Add support for the childfdmap for Go"

This reverts commit 1f6c9b6de45e868d0dffd3415825273dac459695.

5 years agoAdd support for the childfdmap for Go
Ronald G. Minnich [Mon, 25 Aug 2014 17:51:20 +0000 (17:51 +0000)]
Add support for the childfdmap for Go

Sorry for this mess, but I'm hoping someone can fix the include mess.
We need a gerrit or something where we can post draft patches.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoVFS O_APPEND
Barret Rhoden [Sun, 24 Aug 2014 17:39:57 +0000 (10:39 -0700)]

Might actually be race-free!

5 years ago__pthread_handle_pending_posix_signals() changes
Kevin Klues [Sat, 23 Aug 2014 21:00:16 +0000 (14:00 -0700)]
__pthread_handle_pending_posix_signals() changes

Don't call run_uthread() directly iniside
__pthread_handle_pending_posix_signals().  Actually don't even call this
function 'handle_pending_posix_signals' at all.  Instead call it
'prep_for_pending_posix_signal', and just prep the pthread so it will be
restarted inside its signal handler context next time it is run.
It's semantically identical to what we had before, but it's a better
abstraction since (in the future) we may wish to do something between
this prep and actually restarting the thread.

The previous implementation also forced us to always restore the signal
handler context from pthread->uthread.u_ctx (even if the pthread's
saved context was currently sitting in the vcpd uthread_ctx slot).
This implementation now updates the pthread's current context in place,
allowing it to be restarted the same way whether there were pending
posix signals or not.

5 years agoPosix signals in uthread context not vcore context
Kevin Klues [Fri, 22 Aug 2014 18:12:45 +0000 (11:12 -0700)]
Posix signals in uthread context not vcore context

This patch set makes is so that posix signals are run from uthread
context instead of vcore context when triggered from the pthread

Whenever a pthread has a signal pending and it is about to be restarted,
a temprary signal context and stack is swapped in to run the signal
handlers for those pending signals, and the pthread is restored into
that context.  When the signal handlers have compelted, the original
context and stack are restored, and the pthread is rsumed.

A new 'sigdata' struct has been introduced to encapsulate the data
structures necessary to handle all this swapping back and forth.  These
'sigdata' structs are served as part of the parlib signal library, and
reused across different pthreads whenever they have a signal handler to
run. The rest of the changes live entirely in the pthread library,
though we may be able to move parts of it out to parlib once we
generalize it a bit more.

5 years agoAdd implementation of wait-free unordered list.
Kevin Klues [Fri, 22 Aug 2014 18:02:58 +0000 (11:02 -0700)]
Add implementation of wait-free unordered list.

The list is ever-increasing in size, in that once space is created to
accomodate an item in the list, that space is never freed until the
entire list is destroyed. Items are inserted in the list such that
ordering on removal is not guaranteed.

This structure is useful in situations when you want to maintain a
small pool of objects that are shared amongst a larger set of
objects, but only get used for a short period of time (e.g. futext
element structs, sigdata structs, etc.).

5 years agoVFS truncate
Barret Rhoden [Thu, 21 Aug 2014 17:53:44 +0000 (10:53 -0700)]
VFS truncate

Also flushes the PM on O_TRUNC and touches up some sync on the file
size, since it just needed a spinlock.  Too bad the VFS was built before
we had semaphores, though it probably still would be rather racy.

Note that KFS won't write pages back, so any modifications to a file
won't exist outside of the page cache.  This isn't particularly related
to truncates extending a file, since the same thing happens with

5 years agoVFS rename
Barret Rhoden [Wed, 20 Aug 2014 18:22:31 +0000 (11:22 -0700)]
VFS rename

Works, but it's ridiculously racy, as is most all of the VFS.  If you
have renames concurrent with other renames or much of anything, you
could bust the dentry tree or who knows what else.

The VFS (and anything that does a similar task, like a 9ns device) needs
a serious overhaul for both concurrency protection and scalability.

I also don't bother checking if new_path contains old_path.  A check
would help, but we're still in "serious redesign" territory.  Check out
my comments for more info.

That being said, you can mv files and directories around with busybox.

I didn't use testrename much, mv worked quite well.  But I'll leave it
around for now for debugging with 9ns (which needs work).  Also, glibc's
rename work, and there is no need for a separate rename() for the test
program.  Calling the syscall directly means you had an old glibc
(either not compiled right, or not loaded in KFS).

5 years agox86: avoids bad frame pointers in backtrace
Barret Rhoden [Wed, 20 Aug 2014 02:06:56 +0000 (19:06 -0700)]
x86: avoids bad frame pointers in backtrace

Backtrace will stop backtracing if it hits a non-canonical, non-kernel address.
It'll still record the PC, so we can see some evidence of the corruption.

Thanks to Drew for pointing this out and providing a fix.

5 years agoFixes some 32 bit usages of NOW
Barret Rhoden [Tue, 19 Aug 2014 22:53:34 +0000 (15:53 -0700)]
Fixes some 32 bit usages of NOW

I looked for any place storing NOW in a 32 bit int, but I might have missed a
few or otherwise broke things.

5 years agoSYS_dup_fds_to (XCC)
Barret Rhoden [Tue, 19 Aug 2014 22:14:16 +0000 (15:14 -0700)]
SYS_dup_fds_to (XCC)

Finishes Ron's sys_mapchildfds.

Reinstall your kernel headers.

5 years agoFixes insert_file()
Barret Rhoden [Tue, 19 Aug 2014 22:13:11 +0000 (15:13 -0700)]
Fixes insert_file()

__claim_fd() returns a status, not a value.

5 years agoFixes buggy assert in __claim_fd()
Barret Rhoden [Tue, 19 Aug 2014 17:42:15 +0000 (10:42 -0700)]
Fixes buggy assert in __claim_fd()

Was checking FD 0, instead of the FD we claimed.

5 years agoAllow a parent to set up a child's fd's via a new system call
Ronald G. Minnich [Tue, 19 Aug 2014 17:15:29 +0000 (17:15 +0000)]
Allow a parent to set up a child's fd's via a new system call

Needed for Go. The parent sets up an array of
structs, with parent and childfds, then calls system call 65536,
which we might want to consider naming ;-)

Not working.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoKFS allows seeks beyond the file size
Barret Rhoden [Thu, 14 Aug 2014 16:46:25 +0000 (09:46 -0700)]
KFS allows seeks beyond the file size

It looks like the VFS writes, page cache, and KFS readpage() can all handle the
offset being higher than the file size, and it should create a hole.

5 years agoNo longer require LD_LIBRARY_PATH to be set (XCC)
Kevin Klues [Thu, 14 Aug 2014 03:51:50 +0000 (20:51 -0700)]
No longer require LD_LIBRARY_PATH to be set (XCC)

Previously we had to have LD_LIBRARY_PATH =/lib set in the environment
for all binaries to be able to find their shared libraries.  This was
because we had the wrong set of default paths specified in our ld.so
dynamic loader library.  This patch fixes that.

I had to manually set the variable "default-rpath" in
glibc-2.14.1/Makeconfig to make this work.  By default this value is set
to the lib path in our cross compiler (i.e.
x86_64-ros-gcc/x86_64-ros/lib/).  This default path is sufficient if you
only ever use the resulting ld.so file on the host machine.  The problem
is, we manually copy this file over to run natively on akaros, and at
this point, the default-rpath that got set is bogus.  There's really no
way around it, but to manually set it because of the weird way we are
moving this library around.

Anyway, we no longer have to have an LD_LIBRARY_PATH set for every
executable, ld.so knows to look in /lib by default.

5 years agoTypo in variable name.
Kevin Klues [Thu, 14 Aug 2014 01:16:38 +0000 (18:16 -0700)]
Typo in variable name.

I tested before pushing, so I'm not sure why it compiled and ran for me,
but this was clearly a typo and should have been oflag from the

5 years agoAdd more restrictive oflag checks to sys_open
Kevin Klues [Thu, 14 Aug 2014 00:56:22 +0000 (17:56 -0700)]
Add more restrictive oflag checks to sys_open

Also make sure and error out with EISDIR if the named file is a
directory and oflag includes O_WRONLY or O_RDWR. This has only been
added to the vfs.

5 years agofchdir() (XCC)
Barret Rhoden [Wed, 13 Aug 2014 20:26:29 +0000 (13:26 -0700)]
fchdir() (XCC)

Implements sys_fchdir, and touches up the raciness on pwd.  The 9ns side does a
better job, IIRC, of dealing with races on lookups (any of which can start at
pwd (DOT)).  Right now, a VFS lookup from pwd concurrent with a chdir could
fail to grab a ref.

Rebuild glibc.

5 years agoRevert "Add /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH...
Ronald G. Minnich [Tue, 12 Aug 2014 23:55:03 +0000 (23:55 +0000)]
Revert "Add /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH is not set"

This reverts commit dca513882cec49ae570605f3eace49fc63dfc357.

Because that did not do it either. We have to fix ld-linux

5 years agoAdd /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH is not set
Ronald G. Minnich [Tue, 12 Aug 2014 23:50:09 +0000 (23:50 +0000)]
Add /etc/ld.so.conf so the dynamic loader has a path even if LD_LIBRARY_PATH is not set

In Akaros, if LD_LIBRARY_PATH is not set, then no .so's will be found. This breaks
a Go test which resets the environment.

Or if you
you can never run another dynamically linked command.

So put /lib into /etc/ld.so.conf; this gets us past one part of the
os/exec benchmark.

This is ugly but workable. It's disappointing to bring this kind of ugliness into
Akaros but so it goes.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoRevert "CS multi-threaded and locking."
Ronald G. Minnich [Mon, 11 Aug 2014 22:45:43 +0000 (22:45 +0000)]
Revert "CS multi-threaded and locking."

This reverts commit 9f77d75980ef4ab3a7e5bf516c383c916beed877.

THis borked it big time.

5 years agoMake etherread4() safe for LRO.
Andrew Gallatin [Mon, 11 Aug 2014 14:30:19 +0000 (07:30 -0700)]
Make etherread4() safe for LRO.

This patch allows etherread4() read up to 128K, rather than just an MTU
size.  This is required because qbread() is used to read, and
the semantics of qbread() are to give you one block of at most len bytes.
If a block is > len (which will be the case for LRO, when len == MTU), then
it will split the block.   When the block is split  when feeding packets from
dev/ether to ethermedium, you wind up looking in the middle of the
payload for headers, and it is a total mess.  Ideally, there would
be some sort of qbreadall() that would not take a length argument
that would just return the next block on the queue (eg, a blocking

128K was chosen because it is roughly 2x the size of the largest
imaginable MTU and/or LRO packet size (due to both IPv4 and
IPv6 being limited to roughly 64K + headers per packet).

Discussed with: Barret Rhoden, Ronald Minnich

Signed-off-by: Andrew Gallatin <gallatin@google.com>
5 years agoprintfmt: print cur_errbuf as part of %e
Ronald G. Minnich [Sat, 9 Aug 2014 03:27:57 +0000 (03:27 +0000)]
printfmt: print cur_errbuf as part of %e

Of course, now we should start initializing first element to 0 when we
do a system call, I guess, as it's printing garbage sometimes.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoqio.c: don't just warn when we have problems, panic.
Ronald G. Minnich [Sat, 9 Aug 2014 03:25:33 +0000 (03:25 +0000)]
qio.c: don't just warn when we have problems, panic.

You're going to hate me for this one. But I'm seeing real problems
from the extra stuff that I think is breaking some Go tests.

I think we need to fix it, not just warn, so I've made it a panic for

I'm willing to be convinced this is a mistake, but it just seems very bad

In one case, packblock, I just return the bp if there is extra data, which
should at least preserve correctness.

I am hoping this forces us to get this right. It seems really hokey
as is. But maybe I'm just wrong.

6 years agoFixes TCP drops due to ARP timeouts
Barret Rhoden [Wed, 6 Aug 2014 02:00:32 +0000 (19:00 -0700)]
Fixes TCP drops due to ARP timeouts

The root of the problem is that arpents were using u32s to store the
msec since boot.  Machines that run for over 50 days will wrap around.

Since NOW was a u64, the arpent ctimes were getting set to weird
numbers, and ultimately the arpents all appeared to be stale.

Stale arps get their blocklists pruned to one block (which is a
questionable bit of code).  These blocks were TCP packets.

So if a machine was running for more than 50 days, and if multiple TCP
packets were sent to the same arpent quickly, one of them could be
dropped, which throws off the entire TCP stream.

c89 happens to be a machine with a TSC that doesn't reset when
soft-rebooting (via our reboot()), so it acted like a machine that had
been up for about 3 months.

Arguably, we could have NOW (and the others, like seconds() and
milliseconds()) be cast to a u32, so that at least both NOW and ctime
are the same width, but that seems really shoddy.

6 years agoCS multi-threaded and locking.
David Zhu [Tue, 29 Jul 2014 05:12:42 +0000 (22:12 -0700)]
CS multi-threaded and locking.

Note this is a basic version. Locking is not optimal and uses large
locks over large areas. Fine grained locking should improve the
performance of the CS server significantly. Holding off further
optimization if we are going to write it in GO.

6 years agoFix simple warnings that did not include the right files.
David Zhu [Mon, 28 Jul 2014 23:14:08 +0000 (16:14 -0700)]
Fix simple warnings that did not include the right files.

6 years agoAdd uthread_usleep which sleeps in microseconds.
David Zhu [Mon, 28 Jul 2014 06:38:16 +0000 (23:38 -0700)]
Add uthread_usleep which sleeps in microseconds.

Fixing a previous bug where rounding was causing inaccurate waiting.

6 years agokern: mmap: make the lowest mmap address MiB; mmap ld.so at MiB
Ronald G. Minnich [Wed, 30 Jul 2014 19:37:38 +0000 (19:37 +0000)]
kern: mmap: make the lowest mmap address MiB; mmap ld.so at MiB

We spent a day debugging a bad pointer that was the wrong bad pointer;
it was actually a data corruption of a null pointer that changed it to
ff00, which was valid memory since we load ld.so at 4k. As it turns out,
it's easier nowadays to get a deref via a NULL pointer struct to not take a fault
if you have anything mapped at anything less than 1M; structs are big.

Map ld.so at MiB; don't allow mappings lower than MiB. This doesn't fix
the go runtime problem, but it would have let us find the issue
several days earlier. And, since this is a common issue, might as well
avoid it in this instance.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agotests: peek.c
Ronald G. Minnich [Wed, 30 Jul 2014 00:43:36 +0000 (00:43 +0000)]
tests: peek.c

peek will peek at bytes, as many as you specify in the command line, e.g.
peek 0xff00 0x400000
will peek at those addresses as a byte pointer.

It succeeds on 0xff00 and it should not.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoPrinting chan's also prints the #device
Barret Rhoden [Tue, 29 Jul 2014 23:39:43 +0000 (16:39 -0700)]
Printing chan's also prints the #device

The chan->type number is arbitrary and determined by the link order.

6 years agoMinor debugging fixes
Barret Rhoden [Tue, 29 Jul 2014 01:26:10 +0000 (18:26 -0700)]
Minor debugging fixes

pip for a DYING process would panic the kernel since the file's in the
file table were garbage.  At a minimum, we should be checking the bit
before checking the pointer.

6 years agochan: init mountpoint to NULL
Ronald G. Minnich [Sun, 27 Jul 2014 20:39:10 +0000 (20:39 +0000)]
chan: init mountpoint to NULL

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosys_rename: allow arbitrary rename
Ronald G. Minnich [Sat, 26 Jul 2014 18:00:18 +0000 (18:00 +0000)]
sys_rename: allow arbitrary rename

This got a little tricky as we have to strip the mountpoint
base of the target file, and it was essentially impossible
to find the mountpoint after the fact. Don't know if this is the prettiest
way to do it but it works.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agorename: fix a stupid typo, so frees work. Rename still doesn't work however.
Ronald G. Minnich [Fri, 25 Jul 2014 21:10:41 +0000 (21:10 +0000)]
rename: fix a stupid typo, so frees work. Rename still doesn't work however.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosysrename: fix to take full paths. Currently not quite there
Ronald G. Minnich [Fri, 25 Jul 2014 19:50:47 +0000 (19:50 +0000)]
sysrename: fix to take full paths. Currently not quite there

This includes the changes to make sys_rename work for arbitrary paths.
There's also a bit of prototype cleanup.

Doesn't quite work yet but that may be a go9p bug. The wstat is correct
when sent now.

I'm fairly sure the chan tests are right, I talked to the guys at BL
about them.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoconvM2S: bring in the init_empty_dir function.
Ronald G. Minnich [Fri, 25 Jul 2014 19:19:38 +0000 (19:19 +0000)]
convM2S: bring in the init_empty_dir function.

Some ops will have to create functions for wstat, so bring this in.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoPrint. Add printing for qids, cnams, and chans
Ronald G. Minnich [Fri, 25 Jul 2014 19:17:35 +0000 (19:17 +0000)]
Print. Add printing for qids, cnams, and chans

We don't have standard formatted prints for qids, chans, and cnames.
Add printqid, printcname, and printchan.
Set up such that %C will print a chan and %Q will print a qid.
What happens when we run out? We shift to utf-8 of course.
I can't wait to use the infinity symbol format!
You only think I'm joking.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd a test for the rename system call.
Ronald G. Minnich [Fri, 25 Jul 2014 18:40:17 +0000 (18:40 +0000)]
Add a test for the rename system call.

Maybe we can fix it to use the constant. The build system keeps defeating me.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoMake pullblock() and trimblock() aware of extra data
Andrew Gallatin [Thu, 24 Jul 2014 13:50:57 +0000 (06:50 -0700)]
Make pullblock() and trimblock() aware of extra data

Note that there is an odd semantic used by TCP, where it
expects to be able to call trimblock() on a pure ack (thus
leaving 0 valid bytes in the block), and yet not have the
block freed.  That meant that it wasn't as simple as just
using pullblock() to prune the leading space & is the
reason for the _pullblock() helper which retains an empty
block when free != 0.

Thanks to Barret for catching some bugs in the first version
of the patch.

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agohydra vm network configuration
David Zhu [Wed, 23 Jul 2014 22:22:26 +0000 (15:22 -0700)]
hydra vm network configuration

Tired of this not being in the master branch. Although perhaps this
should be ifconfig.local

6 years agoAdds touch to busybox
Barret Rhoden [Wed, 23 Jul 2014 01:31:55 +0000 (18:31 -0700)]
Adds touch to busybox

Feel free to touch your files!

Rebuild busybox with the new config, etc.

6 years agoKernel support for WSTAT_{ATIME,MTIME} for the VFS
Barret Rhoden [Wed, 23 Jul 2014 01:15:12 +0000 (18:15 -0700)]
Kernel support for WSTAT_{ATIME,MTIME} for the VFS

9ns devices need to handle this on their own, directly dealing with
wstat.  It works over devmnt for instance, though none of our other
devices support it (#r, #I, #s were tested briefly).

6 years agoNew VFS files have the 'correct' ctime
Barret Rhoden [Wed, 23 Jul 2014 01:08:05 +0000 (18:08 -0700)]
New VFS files have the 'correct' ctime

The kernel doesn't know what the real time is, so it always thinks it
booted at May 12, 2009 (Nanwan's birthday, though it's actually the day
we found the picture of him (or her)).

I had to change the order of some initialization, since the VFS now
wants the TSC timing to be set up for epoch_seconds() to work.

6 years agoStubs and parsing for rename and timestamps (XCC)
Barret Rhoden [Tue, 22 Jul 2014 23:45:21 +0000 (16:45 -0700)]
Stubs and parsing for rename and timestamps (XCC)

Glibc calls for utime, utimes, futimens, and whatever all call wstat
underneath.  The kernel just prints out the request and fails.

Any of the "at" calls will error out if you give them a directory fd.
We'll eventually support those.

We don't support the symlink flags for utimensat either.  Those are just
ignored, since wstat doesn't follow links (at least not explicitly, and
it might for the VFS).  Will probably need to handle that for all wstat
too (either a flag or lwstat).  Can address that when we sort out the

6 years agoAdd divby0 fault handler and abstract things better
Kevin Klues [Tue, 22 Jul 2014 23:43:13 +0000 (16:43 -0700)]
Add divby0 fault handler and abstract things better

We will eventually want an architecture dependant way of switching on
our fault numbers instead of the highly x86 specific way we are doing it
now.  That said, the way in which faults are handled should be the same
across architectures for a given scheduler and a given 'type' of trap.
I started abstracting things a little bit, with this in mind, but there
is still a long way to go. We can cross that bridge when necessary.

6 years agoTracks process's program name
Barret Rhoden [Tue, 22 Jul 2014 19:09:13 +0000 (12:09 -0700)]
Tracks process's program name

Useful for debugging with ps.  I don't track arguments yet, so scripts
all show up as busybox.

Also fixes a leak in an error case of sys_fork().

6 years agoDecreases harm from races on VFS file offsets
Barret Rhoden [Tue, 22 Jul 2014 05:55:09 +0000 (22:55 -0700)]
Decreases harm from races on VFS file offsets

Two syscalls could read, write, seek, or whatever on the same struct
file at a time.  In doing so, they race on the state of the file pointer
(offset).  The kernel could get confused slightly when figuring out
things like the page indices or the offsets.

Other parts of the kernel might catch the problem, like the page cache
or the memcpy, but better safe than sorry.

6 years agoFixes init script loading
Barret Rhoden [Tue, 22 Jul 2014 05:32:35 +0000 (22:32 -0700)]
Fixes init script loading

We were starting with the script string, which is a kernel address, and
then running off the end of it, replaces spaces with \0s for a while.
With crazy results.  The monitor prompt was missing some letters,
probably because we clobbered them, etc.  Also, if you return -1 before
calling mon_bin_run, the kernel would just PF, and then GPF on its BT.
yikes!  We might have been clobbering more stuff too, like running off
the end of largv.

This newer version still works, and doesn't have those bugs.  But it
might have more.  We should consider rewriting it with parsecmd() or
something.  That'd also get rid of the need for the two loops of

6 years agoFixes excessive closes in accept()
Barret Rhoden [Tue, 22 Jul 2014 04:55:21 +0000 (21:55 -0700)]
Fixes excessive closes in accept()

The extra close brought in at 1a7a2a40, when fixing up the sockets code.
_sock_data() closes whatever ctlfd it is passed.

Incidentally, that was closing it too many times, though that bug wasn't
the one causing all of our problems.

The kernel now spits out a warning if close fails, since nobody checks
its retval.  If you see that somewhere, it's time to start asserting
your closes succeed.

6 years agoAllows concurrent dcache_put() calls
Barret Rhoden [Tue, 22 Jul 2014 04:49:56 +0000 (21:49 -0700)]
Allows concurrent dcache_put() calls

Two openers could fail to find a dentry in the dcache, then get the
dentry from the FS, and then both try to insert into the dcache.  The
second one would find a non-NEGATIVE item present.  This is fine, it's
just not something dcache_put was built for at the time, hence the

6 years agoFixes VFS generic_file_read with too large offsets
Barret Rhoden [Tue, 22 Jul 2014 04:47:50 +0000 (21:47 -0700)]
Fixes VFS generic_file_read with too large offsets

If offset is greater than the file size, we should return 0.

We had another bug causing large offsets, and when offset was greater
than the filesize, count would be < 0.  Definite trouble.

6 years agoFixes large dirreads on 9ns
Barret Rhoden [Sun, 20 Jul 2014 22:07:44 +0000 (15:07 -0700)]
Fixes large dirreads on 9ns

When reading from large dirs, we would fill the c->buf with lots of Ms,
such that we couldn't fit any more in there, and then we'd error out.
We get lots of Ms because we'd read more than one M per read call, but
extract only one M per read (M2kdirent).

The fix is to attempt to extract an M2kdirent before even performing
the underlying read, to keep the c->bufused size down.  Also avoids
unnecessary reads.

Also, successful dirreads return the sizeof(struct kdirent), which is
the actual amount of memory we are writing back to userspace, instead of
the size of an M.

6 years agoSimple test so we can try to find out what's wrong with directory reading
Ronald G. Minnich [Sat, 19 Jul 2014 02:26:07 +0000 (02:26 +0000)]
Simple test so we can try to find out what's wrong with directory reading

Opens 1000 files in /net/tcp by opening clone,

<arg1 files> in /net/tcp
<arg1 files> in <arg2>

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosys_readlink: return the length of the string NOT including NULL
Ronald G. Minnich [Wed, 16 Jul 2014 15:23:25 +0000 (08:23 -0700)]
sys_readlink: return the length of the string NOT including NULL

For consistency with things like getcwd. Note that we should not be
able to return a negative number as the retlen is strlen(...) + 1.

This makes path/filepath go testing work.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agochmod() and fchmod(), implemented with wstat (XCC)
Barret Rhoden [Wed, 16 Jul 2014 05:21:34 +0000 (22:21 -0700)]
chmod() and fchmod(), implemented with wstat (XCC)

Removes SYS_chmod, using SYS_wstat for it instead.  While I was at it,
wstat and fwstat work for 9ns completely.  For the VFS, it only supports
changing the mode.

Rebuild glibc.  Either copy over the two new files or just make clean.
If you chmod and get "invalid" or something similar, either you didn't
rebuild glibc properly or you didn't fill kfs again.

6 years agoFixes the VFS chmod
Barret Rhoden [Wed, 16 Jul 2014 04:14:43 +0000 (21:14 -0700)]
Fixes the VFS chmod

Permissions could not be removed, due to the |=.  We also can't just set
the mode directly, since the file type is squeezed into the top part of
the inode's mode.

6 years agoFixes uninitialized mhead
Barret Rhoden [Wed, 16 Jul 2014 03:22:31 +0000 (20:22 -0700)]
Fixes uninitialized mhead

PFs later on when it tries to rwlock.

6 years agoFixes VFS getcwd
Barret Rhoden [Wed, 16 Jul 2014 01:42:35 +0000 (18:42 -0700)]
Fixes VFS getcwd

Off by 1, it was leaving an extra space in each link slot.  This was adding an
extra letter, or sometimes gibberish or 0, to each part of the path.

6 years agoSYS_wstat, fwstat, rename, and fchdir stubs (XCC)
Barret Rhoden [Wed, 16 Jul 2014 00:28:14 +0000 (17:28 -0700)]
SYS_wstat, fwstat, rename, and fchdir stubs (XCC)

Reinstall your kernel headers.

6 years agoMoves the 9ns conv functions to glibc (XCC)
Barret Rhoden [Tue, 15 Jul 2014 23:34:40 +0000 (16:34 -0700)]
Moves the 9ns conv functions to glibc (XCC)

Glibc will need to use these to implement functions like chmod.

Reinstall your cross compiler.  Either copy over the changed -ros files, or
just make clean the whole thing.

6 years agogetcwd: return the length of the string instead of just 0
Ronald G. Minnich [Wed, 16 Jul 2014 00:13:35 +0000 (17:13 -0700)]
getcwd: return the length of the string instead of just 0

Useful for Go.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agorelax permissions on devarch
Andrew Gallatin [Tue, 15 Jul 2014 20:39:25 +0000 (13:39 -0700)]
relax permissions on devarch

Until we have permissions sorted out in general,
make devarch functionality usable.

Discussed with Barret Rhoden & Ronald Minnich

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoImplement TSO
Andrew Gallatin [Tue, 15 Jul 2014 16:00:22 +0000 (09:00 -0700)]
Implement TSO

Implement TCP Segmentation Offload.  Part of this patch
involves adding a feat field to the output of the ether
stats so that etherbind can parse that, and set a flag
in the ipifc that can be used by TCP to check for TSO
support.  It is also nice to be able to see what offloads
a device supports:

feat: udpck tcppck padmin sg tso

I did it this way rather than just enabling TSO
everywhere & segmenting in software at the edge
for devices which don't support TSO (like I did for
checksum offload) because TSO may be inappropriate
for low bandwidth links.

This patch lets me send at line rate on my out-of-tree
10GbE NIC for message sizes larger than 8K
(an improvement from 6.9Gb/s -> 9.47Gb/s)

Signed-off-by: Andrew Gallatin <gallatin@google.com>
6 years agoFixes memory leak with syscall strings
Barret Rhoden [Tue, 15 Jul 2014 02:21:16 +0000 (19:21 -0700)]
Fixes memory leak with syscall strings

Yield and exec don't return, so we would never free those blobs.

6 years agoDefault signal handlers are sigactions
Barret Rhoden [Tue, 15 Jul 2014 00:02:20 +0000 (17:02 -0700)]
Default signal handlers are sigactions

Instead of the weaker sighandlers.  This is useful so we have access to
the faulting context, such as in default_core_handler.

Incidentally, you may want to point a breakpoint in that handler if you
want to kfunc print_vmrs to debug the page fault.

6 years agoMinor touchup for tsc-compat
Barret Rhoden [Mon, 14 Jul 2014 23:59:43 +0000 (16:59 -0700)]
Minor touchup for tsc-compat

It wasn't compiling with some Linux programs.  Slightly odd, since I've
used this with gcc on Linux in the past.  Perhaps those programs also
defined FALSE.

6 years agoAdds signal(), wrapping sigaction()
Barret Rhoden [Mon, 14 Jul 2014 19:34:37 +0000 (12:34 -0700)]
Adds signal(), wrapping sigaction()

Needed for older programs that still use signal().