5 years agoRemoves unneeded userland headers
Barret Rhoden [Wed, 17 Jun 2015 21:26:11 +0000 (17:26 -0400)]
Removes unneeded userland headers

parlib/pthread.h was around in case you build parlib but not pthreads.
No one does this anymore.

The tests headers were the most useless of a large batch of cruft.

5 years agoToolchain target: make inst-clean
Barret Rhoden [Thu, 18 Jun 2015 15:05:24 +0000 (11:05 -0400)]
Toolchain target: make inst-clean

Convenience target, it will clean and remove the contents of all
installed toolchains (riscv, x86_64, etc).

If you want finer-grained uninstallation, there are still the specific
uninstall targets, e.g. make x86_64-uninstall.

5 years agoImplements getaddrinfo() (XCC)
Barret Rhoden [Thu, 11 Jun 2015 22:18:10 +0000 (18:18 -0400)]
Implements getaddrinfo() (XCC)

Rough version of getaddrinfo.  It only works for IPv4 and has limited support
for various socktypes and protocols.  It calls out to cs for name resolution,
but cs currently deadlocks at runtime.

Rebuild glibc.

5 years agoAdd level of indirection for signal funcs in 2LS
Kevin Klues [Sat, 6 Jun 2015 00:31:50 +0000 (17:31 -0700)]
Add level of indirection for signal funcs in 2LS

Some signal functions (like sigprocmask()) are 2LS specific and need to
be implemented as such. We use a level of indirection similar to the
sched_ops for this.

5 years agoUse local "*.h" instead of installed <*.h>
Kevin Klues [Sat, 6 Jun 2015 00:30:22 +0000 (17:30 -0700)]
Use local "*.h" instead of installed <*.h>

This is necessary in case the API or something has changed between the
installed version and the one currenlty being built.

5 years agoDrop _NSIG to 42 instead of 65 (XCC)
Kevin Klues [Fri, 5 Jun 2015 23:14:54 +0000 (16:14 -0700)]
Drop _NSIG to 42 instead of 65 (XCC)

_NSIG represents the biggest signal number + 1 (including real-time signals).
We choose 42 in homage to h2g2, but also to show that it's not a magic number,
like 32 or 64.  It just happens to be the number of rt signals that we may
(probably won't support in the future).  At any rate, this number must ALWAYS
be <= 64 because we are using a long to represent a sigset.  In Akaros we will
likely impelment all necessary real-time stuff (if we need it) using events
directly, so this point is moot.  Leaving it at 65 was problematic though
because you can't represent all signals (based 1) in a single long, adding to
weird bugs that we would like to avoid in the future.

This helped to fix a bug whee I was previously trying to optimize my
signhandler array to only create (_NSIG - 1) entries because I knew
there were only 64 signals (0 is invalid), but I messed up my mappings
when reuqired to subtract 1 when indexing into this array
to get my signal.  Better to just create one extra entry and call it a
day. However, we need to make sure that all signals can be represented
in our sigmasks (Go cares about this for example, as it installs
handlers for all of its signals up to _NSIG).  If something is off here,
we are (and have been) screwed.

5 years agoReentrant versions of get{prt,srv}name (XCC)
Barret Rhoden [Fri, 5 Jun 2015 20:10:04 +0000 (16:10 -0400)]
Reentrant versions of get{prt,srv}name (XCC)

Similar to the gethostbyname* versions.  They each have slight differences.
The get-service-by-protocol uses srvbynm under the hood, since it's all the
same to CS.

As with gethostbyname*, these haven't been tested and may have the same old
bugs from the original plan 9 shims.

Rebuild glibc.

5 years agoReentrant version of gethostbyname (XCC)
Barret Rhoden [Fri, 5 Jun 2015 19:11:06 +0000 (15:11 -0400)]
Reentrant version of gethostbyname (XCC)

Ports the plan 9 version of gethostbyname to gethostbyname2_r, and implements
the others with it.  Hard to know if this actually works, since we don't use CS
much.  So it may be just as buggy as it was before, but now is reentrant, and
possibly with new bugs (I had several during this commit).

Also, the old version didn't close the fd in all error cases, so at least
that's fixed now.

Rebuild glibc.

5 years agoEnable fortran support in gcc
Kevin Klues [Thu, 11 Jun 2015 23:22:50 +0000 (16:22 -0700)]
Enable fortran support in gcc

Also, we need to enable c++ and gfortran at stage2 of gcc build, not
stage3, otherwise our specs file is messed up and we can't invoke
g++ or gfortran from a straight gcc call.

5 years agoUse the e1000 in kvm since it can use big addresses
Ronald G. Minnich [Thu, 11 Jun 2015 20:26:06 +0000 (13:26 -0700)]
Use the e1000 in kvm since it can use big addresses

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
5 years agoRemoves libbsd (XCC)
Barret Rhoden [Thu, 4 Jun 2015 20:14:28 +0000 (16:14 -0400)]
Removes libbsd (XCC)

All the functionality should be in glibc or is not needed.

To be safe, remove your toolchain installation and rebuild.  Just removing
libbsd.a is probably enough.

5 years agoPushes the Plan 9 BSD shims into glibc (XCC)
Barret Rhoden [Thu, 4 Jun 2015 19:55:17 +0000 (15:55 -0400)]
Pushes the Plan 9 BSD shims into glibc (XCC)

Glibc had stubs that we were overriding in libbsd.  Those shims ought to be in
glibc, since that's Akaros's way of implementing various socket calls.  This is
also somewhat necessary for some -Werror situations where glibc links with its
versions (which were throwing stub_warnings).

Most functions from libbsd are now in glibc.  nptohl() was removed; no one was
using it.  {get,set}sockopt() were stubs in libbsd that did nothing.  I went
with modified glibc stubs for those.  They won't throw compiler warnings, but
they will fail at runtime.  And with a more appropriate errno.  We can add in
various socket options if they are important.

The bulk of the functions were brought over "as is", with the existing races and
non-reentrancy.  A few of them needed work, since the SOCKADDR_ARG has a
different type within glibc (transparent union).  I did pass the files through
lindent, since they have a fresh git history and needed some formatting.

Rebuild glibc.

5 years agoAdds sunrpc (XCC)
Barret Rhoden [Thu, 4 Jun 2015 04:46:31 +0000 (00:46 -0400)]
Adds sunrpc (XCC)

Some applications (e.g. lmbench) seem to want sunrpc.  It wasn't too hard to
add it back in.  Most of sunrpc should work (we'll see!) but the authentication
stuff relies on NSS.  I've stubbed out a couple of those functions.

Note that netname.c needed to be changed in the sunrpc directory, and a sysdep
was insufficient.  Check out my notes in Documentation/glibc.txt for more info.

Also, we needed to --enable-obsolete-rpc to get any rpc/ headers, other than
netdb.h.  That's a recent change (2012).

Rebuild glibc.

5 years agoAdds a backtrace helper for user backtraces
Barret Rhoden [Tue, 2 Jun 2015 18:26:25 +0000 (14:26 -0400)]
Adds a backtrace helper for user backtraces

You need to echo the Akaros backtrace (e.g. #1 Addr f00 is in BAR) into the
script.  You'll also need to customize the script for your system.  I recommend
copying it out of scripts/ and onto your own system somewhere.

You can also source the script, then ctrl-d it, and manually invoke

$ print_glb_func kern/kfs/bin/hello 0xADDR

Make sure the ADDR is in hex, with a leading 0x.  If all goes well, it'll print
out the function containing ADDR.

5 years agoAllows calls to pthread_sigmask before init
Barret Rhoden [Fri, 29 May 2015 16:20:51 +0000 (12:20 -0400)]
Allows calls to pthread_sigmask before init

Some libraries that ld loads make pthread calls in their initialization.  This
patch tracks the changes made to the sigmask, and applies it when the 2LS is up
and running.

One issue is that the sigmask is for the pthread only, and not the entire
process.  Hopefully that's what these libraries wanted.  Maybe it isn't.

Another approach would be to find a safe spot in ld and run vcore_event_init()
from there, such that we get the slim 2LS init done very early.  Then we add a
2LS op for the slim-init (e.g. pth_slim_init), which does the basics to track
the pthread as thread0, but doesn't turn us into an MCP.  This is doable in
part since the specific 2LS is determined statically, for instance when you
link against -lpthread.

If we do the latter approach, we will still need to call out from the
application's _start for staticly linked applications.

5 years agoAdds __h_errno_loc to glibc's ABI (XCC)
Barret Rhoden [Wed, 27 May 2015 19:23:31 +0000 (15:23 -0400)]
Adds __h_errno_loc to glibc's ABI (XCC)

A little background:  I was getting a link error compiling something that was
using h_errno.  As an example, in tests/hello.c:

#include <netdb.h>


printf("XME %p\n", h_errno);

Building that gives a link error like:
ros-kernel/tests/hello.c:19: undefined reference to `__h_errno_location'

h_errno is a macro that expands to deref __h_errno_location().

__h_errno_location() is declared in netdb.h and defined in inet/herrno-loc.c.
The symbol is even in libc-2.19.so, so why can't we link against it?

We can see it in an objdump of libc:
    00000000000dab30 l     F .text0000000000000016              __h_errno_location
    00000000000dab30 l     F .text00000000000000160000000000000016              __GI___h_errno_location

But notice the 'l'.  Now look at some other func we have in glibc:
    00000000000c7db0 g     F .text000000000000001600000000000001f9              utimensat

That has a 'g', for global.  For functions to be linkable, they need to be part
of glibc's ABI (check out my old Documentation/glibc.txt for some info).  Now,
normally __h_errno_location is part of the ABI, but we're not building resolv
anymore.  In resolv's Versions file, we have:

libc {
      GLIBC_2.0 {

        # helper functions

Since we don't build resolv, we don't have that as part of the abi.  Thus, we
need to do it manually in Akaros's Versions.  We'll have to do the same things
for other functions that pop up that were part of resolv (or other Subdir's)
Versions that we implement separately.  Hopefully no one is trying to access

Rebuild glibc.

5 years agoUser interface for fsync and posix_fadvise (XCC)
Barret Rhoden [Tue, 26 May 2015 15:45:08 +0000 (11:45 -0400)]
User interface for fsync and posix_fadvise (XCC)

Using fcntl() for fsync and fadvise.  Not sure why POSIX/glibc didn't do
this already.

Part of it might be that fcntl, despite the ... declaration, supposedly
always takes one va_arg of type int, and it's ignored for certain
commands (e.g. F_GETFD).  That's pretty silly, so I extended it to take
up to four args.

Rebuild glibc.

5 years agoImplements readdir64{,_t} (XCC)
Barret Rhoden [Thu, 21 May 2015 22:23:38 +0000 (18:23 -0400)]
Implements readdir64{,_t} (XCC)

Since our dirent is a dirent64, these are just wrappers.

Our glibc dirent is still in our sysdep dirent.h header, instead of just
using the kernel's kdirent.  There might be some minor issues with
having a lot in fs.h.

Rebuild glibc.

5 years agox86: changes backtrace to not subtract 1
Barret Rhoden [Thu, 21 May 2015 20:53:08 +0000 (16:53 -0400)]
x86: changes backtrace to not subtract 1

That -1 was there for a long time, due to weird issues with our earliest
bts in some corner cases in the kernel.  The tradeoff is that the
addresses given aren't accurate (off by 1!), and that make manual symbol
lookup a little annoying.  For instance, using a user-backtrace, you
can't grep an objdump for a particular PC, since the -1 means the
address probably doesn't exist.

5 years agoHelper to backtrace a user context
Barret Rhoden [Thu, 21 May 2015 20:41:27 +0000 (16:41 -0400)]
Helper to backtrace a user context

You can backtrace a context, but only if you have one!  And if the
context is somehow messed up or if the stackframe is not using the frame
pointer, then it'll probably die in a horrendous kernel page fault.

Note that when processing as syscall, if the syscall has already
blocked, then current_ctx is not the context that originally issued the
syscall.  *That* context has long-since restarted, due to our async

You can attempt to backtrace the current context like so:
backtrace_user_ctx(p, current_ctx);

Try putting one of these in sys_block() on either side of the
kthread_usleep().  The latter will fail, and if it doesn't, it's
probably grabbing some arbitrary context.

5 years agoBuild userspace with -fno-omit-frame-pointer (XCC)
Barret Rhoden [Thu, 21 May 2015 20:37:46 +0000 (16:37 -0400)]
Build userspace with -fno-omit-frame-pointer (XCC)

Until we have a decent debugger, we need to rely on the frame pointer to
create backtraces for user contexts.

Rebuild your toolchain.

5 years agoMoves backtrace_kframe()
Barret Rhoden [Thu, 21 May 2015 20:08:58 +0000 (16:08 -0400)]
Moves backtrace_kframe()

It wasn't arch-dependent, so no need to keep it in x86.

5 years ago[PATCH 2/2] Adds some resolv functionality (XCC)
Barret Rhoden [Mon, 18 May 2015 21:40:37 +0000 (17:40 -0400)]
[PATCH 2/2] Adds some resolv functionality (XCC)

Despite removing resolv, we still need some parts of it.  Things like
inet_addr() seem fine.  Likewise, we need a netdb.h header.  resolv was
providing it; now we provide a modified version manually.  resolv was
also providing resolv.h and the arpa nameser headers.  We'll see if
resolv.h ends up being a problem, since we don't implement any of the
various functions.  Long term, we'll probably need 9ns shims that use CS
or something.

Fully rebuild your toolchain.  I suggest removing the contents of the
installation directory first, since so much stuff was removed.

5 years ago[PATCH 1/2] Removes NSS and resolv (XCC)
Barret Rhoden [Mon, 18 May 2015 20:01:32 +0000 (16:01 -0400)]
[PATCH 1/2] Removes NSS and resolv (XCC)

Glibc has a bunch of subdirs, such as nss, nis, inet, and resolv.  Some
of these won't actually work at runtime.  For instance, resolv uses
ioctl, which will always fail.

As a deeper problem, many of these subdirs might "work", but they
actually would fail or otherwise not work on Akaros.  They open files
that do not exist or attempt operations we do not support.  We've been
faking support for these operations since f2ed80b10a.

Beyond the subdirs brought in by f2ed80b10a, there are a bunch of
"mandatory" subdirs, such as pwd, shadow, grp, and gshadow.  These
provide interfaces for reading entries from files like /etc/passwd.
These all use NSS to generate the code for their functions by including
a file like nss/getXXbyYY.c.

Anyway, this commit removes resolv and nss, and anything (minus inet)
that depends on nss.  In lieu of actually removing all of pwd/grp/etc, I
replaced them all with stubs.  Since gshadow doesn't have a man page, I
just stopped building it for now.  We can stub it out later, if

Of special note is inet.  We want most of inet - that's in part what the
BSD shims do: things like gethostbyname.  And gethostbyname2.  And
gethostbyname2_r.  Inet also includes a lot of headers in netinet/.  So
we keep inet as a Subdir (like pwd), and just stub out anything that
uses nss.

There isn't anything wrong with nss internally (some people disagree),
but the idea here is that anything using nss was probably not right for
Akaros, and we should do something else.

An alternative approach is to remove resolv and keep nss around.
Functions from e.g. pwd will fail at runtime, unless we create
/etc/passwd files.  Though nss relies on resolv functions, so it is not
particularly simple.  This commit's stub approach may be easier.

And yet another approach would be to keep resolv around too, and hack it
up to try and work.  But I think interposing on the glibc interface is a
better place to work than at some internal function.

This won't compile without the next patch.

5 years agoFixes user Makefile "finds"
Barret Rhoden [Tue, 19 May 2015 14:02:54 +0000 (10:02 -0400)]
Fixes user Makefile "finds"

Need to quote the *, otherwise shell expands it before passing it to

5 years agoget_tlsvar_linaddr() and uthread notes
Barret Rhoden [Fri, 15 May 2015 01:30:53 +0000 (21:30 -0400)]
get_tlsvar_linaddr() and uthread notes

While debugging "Allows pthread_yield() before lib_init()", I noticed
the issues with __vcore_context noted in uthread_manage_thread0().

I made get_tlsvar_linaddr() to debug it.  It's just what we were doing
for get_cur_uth_addr(), but for any TLS variable.

5 years agoFixes IO lock initialization bug (XCC)
Barret Rhoden [Thu, 14 May 2015 23:35:44 +0000 (19:35 -0400)]
Fixes IO lock initialization bug (XCC)

Glibc IO locks were not initialized, but we were using IO locks.  This
showed up as page faults with lock_test or prov when trying to invoke
the argp_usage(), which internally calls _IO_flockfile.

The root issue was that some code was using the locks and some code
wasn't initializing, based on the inconsistent setting of _IO_MTSAFE_IO.

For a bit of Akaros history, check out commit e28dbef7c.  That commit
wasn't the correct fix at the time, but you can see how it's muddling in
the area.  It's likely that setting LIBC_REENTRANT was enough back then,
but now that we're on glibc-2.19, that was insufficient.  If you check
glibc's ChangeLog, there were a few things related to _IO_MTSAFE_IO
changed back in 2012, which was probably between our glibc versions.

Rebuild your toolchain (at least glibc) from scratch.

5 years agoAllows pthread_yield() before lib_init()
Barret Rhoden [Thu, 14 May 2015 16:29:58 +0000 (12:29 -0400)]
Allows pthread_yield() before lib_init()

If we call uthread_yield, we'll eventually pop up in vcore context
expecting to run the 2LS.  We need to initialize pthreads (and uthreads)
before that happens.

One option here was to do a run_once on pthread_lib_init for the yield
entry point, but we don't need to become an MCP just because someone
wanted to briefly yield the processor.  sched_yield() is a better fit.

5 years agoImplements getlogin{,_r} (XCC)
Barret Rhoden [Thu, 14 May 2015 12:25:15 +0000 (08:25 -0400)]
Implements getlogin{,_r} (XCC)

We don't have multiple users.  If we ever do, we can grab that name out
of /proc or something.

Rebuild your toolchain.

5 years agoRemoves BSD shims that are (better) in glibc
Barret Rhoden [Wed, 13 May 2015 22:26:15 +0000 (18:26 -0400)]
Removes BSD shims that are (better) in glibc

We have a problem with our BSD shims.  Many of them implement functions
that are already in glibc, and we can have link errors.  The functions
removed in this commit appear to do the same thing as their glibc
counterparts, so removing them is not a problem.

Putenv is a little different.  It's not the same functionality as
glibc's, but we're using glibc-style environments and whatnot already,
so we might as well use that.

The bigger issue is the other functions:


These appear to have a different implementation.  Gethostby all use cs
under the hood, which is different than glibc.  The long term plan is to
probably push those functions into glibc.

The other set of issues is that functions like listen and accept have
different meanings between glibc and plan 9.  Good times.

5 years agoBuilds the NSS in staticly (XCC)
Barret Rhoden [Wed, 13 May 2015 21:36:35 +0000 (17:36 -0400)]
Builds the NSS in staticly (XCC)

NSS has issues when used in statically linked applications.  This seems
to get rid of some of those errors.  It's a horror show.

Rebuild your toolchain.

5 years agoCleans up userspace headers
Barret Rhoden [Wed, 13 May 2015 19:51:40 +0000 (15:51 -0400)]
Cleans up userspace headers

They all have a consistent naming for their #defines:

They all protect their declarations with __{BEGIN,END}_DECLS, which does
the c++ extern C wrapping needed for C++ functions to link against these

5 years agoPthread conds and broadcasts use SLISTS
Barret Rhoden [Tue, 12 May 2015 14:35:14 +0000 (10:35 -0400)]
Pthread conds and broadcasts use SLISTS

This fixes PTHREAD_COND_INITIALIZER.  The issue was that we can't use
TAILQs, because then the static initializer would need a parameter.

Now, there's an SLIST and a TAILQ.  The 2LS lists are TAILQs.  The
cond/barrier/mutex (eventually) are SLISTs.  A thread should only be on
one at a time.

This commit also cleans up things a bit, since broadcast and barrier had
similar, repeated code.

5 years agoAdds pthread_attr_{set,get}guardsize
Barret Rhoden [Tue, 12 May 2015 20:41:02 +0000 (16:41 -0400)]
Adds pthread_attr_{set,get}guardsize

We don't actually implement guard pages, but we might one day.  Until
then, we have the interface.  Actual guard pages could be implemented
after we bring in various uthread performance improvements.

5 years agoSets unistd flags in posix_opt.h (XCC)
Barret Rhoden [Tue, 12 May 2015 15:02:25 +0000 (11:02 -0400)]
Sets unistd flags in posix_opt.h (XCC)

We're supposed to advertise the features we support via unistd.h, which
ultimately includes posix_opt.h.  I used Linux's options as a base, and
removed some that we probably will never support.   The list contains
features we'd like to support.  Some do not work yet.

Rebuild your toolchain.

5 years agoMoves KiB and friends from common.h (XCC)
Barret Rhoden [Wed, 6 May 2015 17:32:31 +0000 (13:32 -0400)]
Moves KiB and friends from common.h (XCC)

These #defines mess with any app that tries to use those names for
something else.  And the sizes are not part of the kernel interface.

Arguably, we could get rid of them too, but we use a couple of them in a
few places.

You could rebuild your toolchain, or just copy the modified header file
(ros/common.h) into your toolchain installation sysroot.

5 years agoUntangling the glibc header rat's nest (P.1) (XCC)
Barret Rhoden [Mon, 4 May 2015 19:06:37 +0000 (15:06 -0400)]
Untangling the glibc header rat's nest (P.1) (XCC)

The problem we have is that there are various kernel headers and various
header files in glibc that cover the same thing, and sometimes they

For instance, there are the O_ flags for open.  Glibc had them in fcntl.
Akaros had them in fs.h.  It'd be nice if we used the same files and
structures!  This came up as a problem when the files start to diverge.
For instance, O_NOFOLLOW was in fs.h, but not in bits/fcntl.h.

Unfortunately, the headers are a rat's nest.  (Rats' nest?)  Making the
simple changes caused time.h to get pulled in early, and there's also a
macro for st_atime and friends (to st_atim.tv_sec).  Good times.  In the
end, handling time.h seems to work, but with a rename of st_atim{e,}.

bits/stat.h has similar issues.  In this commit, I took care of the
fcntl stuff, hence the P.1 (stands for Part 1).  One of these days we
can try to dig a bit further with other headers.  At least we're a
little better off now.

Rebuild your toolchain.

5 years agoRemoves unused functions from Parlib's arch.h
Barret Rhoden [Mon, 4 May 2015 16:40:04 +0000 (12:40 -0400)]
Removes unused functions from Parlib's arch.h

If we need any of these in userspace, we can bring them back one-by-one.
Otherwise, we potentially have issues with applications that define
different versions of these functions.

5 years agoPthread cleanup stubs
Barret Rhoden [Mon, 4 May 2015 16:21:48 +0000 (12:21 -0400)]
Pthread cleanup stubs

These cleanup stubs are similar to our waserror/poperror.  They interact
with pthread_cancel and exit.  If a thread exits or is cancelled, it's
cleanup functions are called.  Additionally, cleanup_pop takes a bool,
and when it's TRUE, it'll run the handler even when returning normally.

If someone wants to implement these and pthread_cancel, be my guest.

5 years agoPthread scheduling hooks
Barret Rhoden [Mon, 4 May 2015 16:14:39 +0000 (12:14 -0400)]
Pthread scheduling hooks

There are a bunch of ways to set scheduling priorities, policies, and
scope.  We'll allow programs to try to set these values, but they won't
do much.

Our current scheduler is a SCOPE_PROCESS, SCHED_FIFO, with only one
priority level: 0.

5 years agoUpdated contribution policies
Barret Rhoden [Mon, 27 Apr 2015 20:12:21 +0000 (16:12 -0400)]
Updated contribution policies

Updates and clarifies Akaros's contribution policies, some of which have
been in writing, some of which haven't.  This also provides a bunch of
git commands for common scenarios that pop up.

One new thing is that all committers must agree to the
Developer Certificate of Origin.

5 years agoFixes unmount
Barret Rhoden [Tue, 21 Apr 2015 15:48:57 +0000 (11:48 -0400)]
Fixes unmount

On the kernel side, there are two changes.  Functionally, we can handle
a null src_path.  Code-wise, I renamed the variables to clarify what is
going on.  Plan 9's 'old' and 'new' weren't very helpful.  Additionally,
what the man pages call old and new were actually reversed when you get
to sysfile.c!

On the user side, cs wasn't calling the syscall properly, so it would
always fail.  cs unmounts #s/cs from /net before it starts up, to make
sure that previous cs runs don't leave any lingering mounts.  You
actually can restart cs &, then mount -a \#s/cs /net and be back in

5 years agoSyscall tests for PATH_MAX
Barret Rhoden [Mon, 20 Apr 2015 22:38:40 +0000 (18:38 -0400)]
Syscall tests for PATH_MAX

Even though it's possible for the user to build a path longer than
PATH_MAX (e.g. 16 NAME_MAX filenames), we still need a limit.  If
anything 4096 seems ridiculously large (and will trigger 2-contig page

5 years agoUse GMP, MPFR and MPC directly in gcc build. (XCC)
Dan Cross [Mon, 20 Apr 2015 18:36:49 +0000 (14:36 -0400)]
Use GMP, MPFR and MPC directly in gcc build. (XCC)

Note: rebuild your toolchain after pulling this. Use the
versions of gmp, mpfr and mpc that we pull down when building
gcc, instead of relying on pre-build/pre-installed versions.

5 years agoAdds PATH_MAX and NAME_MAX (XCC)
Barret Rhoden [Mon, 20 Apr 2015 15:44:29 +0000 (11:44 -0400)]

For POSIX compatibility.

Rebuild your toolchain.  Or just copy all of the .h files around.

5 years agoRemoves libgcc_eh hack (XCC)
Barret Rhoden [Fri, 17 Apr 2015 21:19:45 +0000 (17:19 -0400)]
Removes libgcc_eh hack (XCC)

For some reason, we used to need to have a fake .a file sitting around.
Either because of recent changes, or maybe the crosstool-like changes
from last year, we no longer need the hack.


You probably don't need to rebuild the toolchain.

5 years agoFixes shared library linking (XCC)
Barret Rhoden [Fri, 17 Apr 2015 20:49:58 +0000 (16:49 -0400)]
Fixes shared library linking (XCC)

If you try to make a hello-world c++ library:

$ x86_64-ucb-akaros-gcc -fPIC -o lib.o -c lib.cc
$ x86_64-ucb-akaros-gcc -shared -o lib.so lib.o

You'll get the error:

... 4.9.2/crtendS.o(.eh_frame); no .eh_frame_hdr table will be created.

Some sites suggested a problem with config.gcc, such as
http://forum.osdev.org/viewtopic.php?t=25489 , though the problem was
n't crtstuff.  Or at least that didn't help me.  Though it did make me
look at the config.gcc, and I attempted to make ours more like Linux's.

The main change was   tmake_file="t-slibgcc"  , which is needed to make
a shared version of libgcc_s.so.  That in turn needed some fixups in
config.host, the most important being the softfloat business where we
didn't include x86_64 akaros.

Rebuild your toolchain.

5 years agoParlib and other user libs are built with -fPIC
Barret Rhoden [Fri, 17 Apr 2015 14:50:10 +0000 (10:50 -0400)]
Parlib and other user libs are built with -fPIC

Also, this collects the common user library flags into the top-level

5 years agoParlib is no PIC-capable
Barret Rhoden [Fri, 17 Apr 2015 14:46:15 +0000 (10:46 -0400)]
Parlib is no PIC-capable

We needed some minor changes, mostly to uthread, to be able to build
parlib with -fPIC (and as a .so).

Thanks to the lack of TLS-clobbers, anytime we set_tls_desc and then
access TLS variables in the same function, we need to wrap those
accesses with 'begin_safe_access'.  Otherwise, the compiler will cache
the address of TLS variables and not discard and recompute the address
after a TLS change.

The other big change is that leaq needed to do PC-relative addressing.
Otherwise the asm emits a _32S relocation, which fails when we make a
shared library with parlib.  For a nice review of relocations, check
out: http://www.mindfruit.co.uk/2012/06/relocations-relocations.html

5 years agoBuilds libstdc++.so (XCC)
Barret Rhoden [Fri, 17 Apr 2015 13:41:20 +0000 (09:41 -0400)]
Builds libstdc++.so (XCC)

Changed up the configure for libstdc++ to match Linux's config.  If
you're porting the configure script to a newer version of gcc,
double-check all of the places where 'linux' appears in the config.
It's probably easier to just recreate the configure script from scratch.

There are a few places in the configure script where it's probably not
important for Akaros to mirror Linux, such as when testing for certain
Linux features.  Since those tests just fail, it seems saner just to put
an 'akaros' wherever there is a 'linux.'

Also, I had to update fill-kfs to find the libstdc++.so, and this also
adds about 6MB to KFS (and the resulting kernel binary) due to the size
of libstdc++.so.

Rebuild your toolchain.

5 years agoFix the way we set up vmcs
Ron Minnich [Thu, 26 Mar 2015 20:33:04 +0000 (13:33 -0700)]
Fix the way we set up vmcs

The Dune code we started with, which started with KVM code, has always been hard to parse.
Clean it up and make sure we know each and every bit we claim to set or clear

Signed-off-by: Ron Minnich <rminnich@gmail.com>
Amended-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRemoves mon_setmapperm
Barret Rhoden [Mon, 6 Apr 2015 18:51:56 +0000 (14:51 -0400)]
Removes mon_setmapperm

Unused, and just cluttering up my git grep.

5 years agoPmap ops: perm->settings
Barret Rhoden [Mon, 6 Apr 2015 18:46:12 +0000 (14:46 -0400)]
Pmap ops: perm->settings

This clarifies some aspects of pte_get_perms and pte_write.  In reality,
write takes all sorts of non-permission based flags.  What we really
wanted (I think) was the pte settings: the non-paddr lower 12 bits, in
an arch-indep format (based on the #defines).

Still, pte_replace_perm() is very useful as is.  pte_get_perm paired
with pte_write and wasn't really related to pte_replace_perm (in usage).

5 years agox86: pmap cleanup
Barret Rhoden [Mon, 6 Apr 2015 18:02:28 +0000 (14:02 -0400)]
x86: pmap cleanup

Uses more helpers.

5 years agoVMM: debug helper for checking KPT == EPT invariant
Barret Rhoden [Mon, 6 Apr 2015 17:51:22 +0000 (13:51 -0400)]
VMM: debug helper for checking KPT == EPT invariant

Not called from anywhere, but you can kfunc it or drop it wherever you
want (like EPT HPF, proc_free, etc).

5 years agoVMM: handle EPT page faults
Barret Rhoden [Thu, 2 Apr 2015 14:37:26 +0000 (10:37 -0400)]
VMM: handle EPT page faults

Pretty damn simple - just use the real page fault handler, and the EPT
is filled in under the hood by all the epte_ ops.

5 years agoFixes VMR creating off-by-one
Barret Rhoden [Thu, 2 Apr 2015 14:15:44 +0000 (10:15 -0400)]
Fixes VMR creating off-by-one

If a VMR would just barely fit before the first VMR, we would fail to
use that slot.

Practically, this only happens if you decide to do a MAP_FIXED at a low
address, which will unmap a chunk of ld.so - not recommended!

5 years agoVMM: Removes the epte_t from pte_t
Barret Rhoden [Thu, 2 Apr 2015 12:24:08 +0000 (08:24 -0400)]
VMM: Removes the epte_t from pte_t

A pte is just a kpte_t* - still different than a month ago, where pte ==
kpte.  Now pte == kpte*.  But we don't need to track the epte with the
kpte, since we can find the epte from the kpte.

I kept the eptp as part of the pgdir.  Arguably, the cr3 belongs there
too.  Often the cr3 and eptp have extra bits in them, other than just
the PADDR of the PML4, so it's handy to keep them around.

5 years agoVMM: Call EPT ops for every KPT op
Barret Rhoden [Thu, 2 Apr 2015 01:47:03 +0000 (21:47 -0400)]
VMM: Call EPT ops for every KPT op

At this point, the EPT should equal the KPT, up to UVPT.

I disconnected the EPT fault handler for now.  tests/vmmcp still works,
since everything is pre-faulted in.  We'll need to change it to do the
initial faults from the VM.

5 years agoRedefines PTE present vs mapped
Barret Rhoden [Mon, 6 Apr 2015 16:23:43 +0000 (12:23 -0400)]
Redefines PTE present vs mapped

Mapped now means it points to a physical page in all cases.  Present is
mapped and with bits set for some valid PTE walk.  For instance, a user
read works on x86 with PTE_U and PTE_P.

PTE_P shouldn't be used from the arch-indep code now.

I might have missed something with this commit, like leaking memory or
dirty bits.  Feel free to check out the usages of is_present, is_mapped,
and is_unmapped.

5 years agox86: EPT and KPT are contiguous
Barret Rhoden [Wed, 1 Apr 2015 23:55:53 +0000 (19:55 -0400)]
x86: EPT and KPT are contiguous

Ron had a great idea: alloc two contig pages for every KPT intermediate
page table, and have the corresponding EPT page be the adjacent physical
page.  The downside is the memory waste for non-VMM processes and the
pressure on the memory allocator.  The upside is the code is much
simpler and memwalks are faster, since we can easily find an EPTE given

This commit does the two-page alloc for the intermediate pages.  The
existing EPT code won't actually work right now, esp since the pm ops
don't do EPT work.

There's some ugliness with the boot page directories.  I can't put and
align 8192 in entry64.S and have grub boot the damn thing.  So I put in
some dirty hacks to special case the boottime kernel mappings.

5 years agoVMM: moves various helpers to vmx.h
Barret Rhoden [Mon, 30 Mar 2015 17:33:29 +0000 (13:33 -0400)]
VMM: moves various helpers to vmx.h

I'll want some of these from ept.c, and maybe some others from vmm or
debug code.

Removes the compat.h business too, and just drops everything we'll need
in vmx.h.

5 years agoVMM: removes the dune <-> proc
Barret Rhoden [Fri, 27 Mar 2015 18:03:46 +0000 (14:03 -0400)]
VMM: removes the dune <-> proc

Connecting to the proc is the wrong approach for Akaros (the p->virtinfo
or whatever).   Also removed the dune_config while I was at it.

5 years agoVMM: removes the VPID
Barret Rhoden [Fri, 27 Mar 2015 17:51:07 +0000 (13:51 -0400)]
VMM: removes the VPID

AFAIK, the VPID is only useful if you aren't using EPT.  Since we're
using the EPT, the VPID code is just a waste.  But I did leave in the
helpers, since they may be useful and it's also a good practice to flush
the VPID caches in case a previous user of VMX messed with them.

5 years agoVMM: EPT checks, init, and basic usage
Barret Rhoden [Thu, 26 Mar 2015 19:43:09 +0000 (15:43 -0400)]
VMM: EPT checks, init, and basic usage

Does a bunch of checks in EPT initialization, so we don't have to
dynamically check as much (or program to handle older HW).

This will use one EPT per process, instead of one global, but this EPT
is still not fully integrated into the pmap ops.

5 years agoVMM: init and cleanup take the proc *
Barret Rhoden [Thu, 26 Mar 2015 20:22:46 +0000 (16:22 -0400)]
VMM: init and cleanup take the proc *

And do some minor connections between the guest pcore and its proc.

Might need to think a bit about the weak vs strong refs.  I'm pretty
sure the cur_proc ref will always be active whenever we have a
guest_pcore (vmx_vcpu).  We'll see.

5 years agoHelpers for the PGSHIFT of the largest jumbo page
Barret Rhoden [Thu, 26 Mar 2015 19:26:38 +0000 (15:26 -0400)]
Helpers for the PGSHIFT of the largest jumbo page

Other parts of the kernel, including EPT/VMX, will want to know this.

5 years agoVMM: Make put_cpu actually put the cpu
Ron Minnich [Mon, 16 Mar 2015 23:31:41 +0000 (16:31 -0700)]
VMM: Make put_cpu actually put the cpu

And various fixes / temp hacks.

(git-fu'd by brho)

5 years agoVMM: Fixes vmmcp freezes
Barret Rhoden [Fri, 20 Mar 2015 21:20:30 +0000 (17:20 -0400)]
VMM: Fixes vmmcp freezes

The Host's TSS was set wrong.  Not sure why exactly 8* works for Linux.

The TSS and GS probably should be set in the per-cpu area.

5 years agoVMM: fixes VMCS order computation
Barret Rhoden [Fri, 20 Mar 2015 21:22:23 +0000 (17:22 -0400)]
VMM: fixes VMCS order computation

Shifting gives us 0 for nr pages, though we want 1.  And the LOG2 of
that spits out 1 for the order.  We wanted order 0 (1 page).

5 years agoVMM: helper for VMPTRST
Barret Rhoden [Fri, 20 Mar 2015 20:03:43 +0000 (16:03 -0400)]
VMM: helper for VMPTRST

Extracts the calling core's VMCS pointer.

5 years agoAdd a few more pthread compilant definitions
Kevin Klues [Tue, 24 Mar 2015 16:52:00 +0000 (09:52 -0700)]
Add a few more pthread compilant definitions

5 years agoIf the pgdir in debug_print_pgdir is not set, assume rcr3()
Ron Minnich [Mon, 23 Mar 2015 20:02:29 +0000 (13:02 -0700)]
If the pgdir in debug_print_pgdir is not set, assume rcr3()

This is a convenience when using the monitor

Signed-off-by: Ron Minnich <rminnich@gmail.com>
5 years agox86: Fixes cpuid_ecx()
Barret Rhoden [Mon, 23 Mar 2015 16:34:34 +0000 (12:34 -0400)]
x86: Fixes cpuid_ecx()

Was assuming the op was 1.  Currently it was harmless, since the only
caller was passing 1.  I'd be up for a better runtime way to check
things, since this pops up a lot.

5 years agoFixes vmm_struct_cleanup
Barret Rhoden [Mon, 23 Mar 2015 16:24:26 +0000 (12:24 -0400)]
Fixes vmm_struct_cleanup

Cleanup is called from __proc_free, and I don't want to sleep in there.

Running the existing code with the lock debugger will flip out.  Even
attempting to qlock while holding a spinlock will panic, rightly so.
The lock held happens to be the parent's child lock, which it holds when
it decrefs the child.  Regardless, proc_decref is called all over the
place, and I'd rather not sleep in the release method.

I considered removing the qlock and having a multi-state atomic_t that
we CAS on, solving the issue of multiple potential initializers and
cleanup not checking the lock.  But that's a bit of overkill.

5 years agox86: Initialized contexts are SW contexts
Barret Rhoden [Mon, 23 Mar 2015 18:54:11 +0000 (14:54 -0400)]
x86: Initialized contexts are SW contexts

It's a little faster to pop a SW context than a HW context.

5 years agox86: Uses rbx for the initial vcoreid (XCC)
Barret Rhoden [Mon, 23 Mar 2015 18:42:55 +0000 (14:42 -0400)]
x86: Uses rbx for the initial vcoreid (XCC)

Using rax prevents us from using SW contexts.

Rebuild your toolchain.  You don't need to make clean.

5 years agox86: Fixes context security
Barret Rhoden [Mon, 23 Mar 2015 18:28:01 +0000 (14:28 -0400)]
x86: Fixes context security

The big thing is that SW contexts are popped with sysret.  On Intel
machines, a non-canonical RIP will trigger a GP in kernel mode.
A user could have manged the RIP of a VC ctx in the VCPD of a preempted
vcore, then done a sys_change_to() to get the kernel to pop the ctx.

For more info, check out:

While I was here, I also had init_ctx always call secure_ctx.  This
removed some redundant code.  It also enforces gsbase for HW ctxs,
though it was just zeroed a moment before.

Finally, we memset the entire structure for new contexts.  If we used a
smaller context for the init ctx, we could leak some information when we
eventually copy the ctx to procdata.

5 years agoRemoves extra Ivy annotation
Barret Rhoden [Mon, 23 Mar 2015 18:48:14 +0000 (14:48 -0400)]
Removes extra Ivy annotation

Missed this during d9e49fae, probably because of a lingering copy of
no-ivy.h in the toolchain headers.

5 years agoInitial import of virtio rings structures.
Ron Minnich [Mon, 23 Mar 2015 17:44:53 +0000 (10:44 -0700)]
Initial import of virtio rings structures.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
5 years agox86: Fixes init for machines that do not have VMX
Barret Rhoden [Thu, 19 Mar 2015 21:13:35 +0000 (17:13 -0400)]
x86: Fixes init for machines that do not have VMX

On machines (or at least qemu) that don't have VMX, we'd still try and
do the pcpu init, which attempts some VMX instructions.

5 years agoUpdates bootable USB tools
Barret Rhoden [Thu, 19 Mar 2015 21:02:28 +0000 (17:02 -0400)]
Updates bootable USB tools

Added some sanity checks to the script and put mboot.c32, mbr.bin, and a
basic conf in the repo so people don't have to hunt around for them.

5 years agoBNX2X: hacks around the MC assert problem
Barret Rhoden [Thu, 19 Mar 2015 18:38:50 +0000 (14:38 -0400)]
BNX2X: hacks around the MC assert problem

Our get_cont_pages() does not return pages aligned to the *order* of the
allocation.  This means higher order allocs, like 2^3 pages might not
come on an 8*PGSIZE boundary.  Apparently, this was enough to trigger
the MC assert for some high-order alloc.

The dirtiness comes in where we don't free the contig region.  Hopefully
we're not leaking too much.  (only once per NIC, so far).

This is mostly a stopgap til we fix our shitty memory allocator.

5 years agoBNX2X: fixes cont_page allocation
Barret Rhoden [Wed, 18 Mar 2015 16:06:32 +0000 (12:06 -0400)]
BNX2X: fixes cont_page allocation

Linux's alloc_pages returns a struct page*.  Our get_cont_pages returns
a KVA.  The mapping would be screwed up, since we were taking the
page2pa() of the KVA, not the page.

Of course, we weren't calling this, since TPA was disabled, and it
wasn't the problem triggering the MC Assert.  Well damn.

5 years agoBNX2X: fixes include problem
Barret Rhoden [Tue, 17 Mar 2015 18:14:00 +0000 (14:14 -0400)]
BNX2X: fixes include problem

With the recent changes to master, list.h wasn't included anymore.  It
was included previously via one of the vm.h headers.

5 years agoRemoves Ivy annotations (XCC)
Barret Rhoden [Tue, 17 Mar 2015 17:59:12 +0000 (13:59 -0400)]
Removes Ivy annotations (XCC)

Some of the #defines  were interfering with other user-level libraries.
Not sad to see it go, but a little sad that it didn't work out.

Rebuild your toolchain and everything else.

5 years agoMoves ARRAY_SIZE into the kernel only (XCC)
Barret Rhoden [Tue, 17 Mar 2015 16:08:05 +0000 (12:08 -0400)]
Moves ARRAY_SIZE into the kernel only (XCC)

Everyone wants to #define it, so we conflict with some user libraries.

Reinstall your kernel headers.

5 years agoEnables plugins in binutils for gold linker (XCC)
Barret Rhoden [Tue, 17 Mar 2015 16:02:08 +0000 (12:02 -0400)]
Enables plugins in binutils for gold linker (XCC)

To use gold for Akaros (e.g. -fuse-ld=gold in tests/Makefile), we also
need to enable plugins.

Blow away the config and workdir, and rebuild binutils (or just make
clean, etc).

5 years agoEnable gold linker. (XCC)
Dan Cross [Sat, 14 Mar 2015 01:35:32 +0000 (21:35 -0400)]
Enable gold linker. (XCC)

5 years agox86: pgdir_t handles both KPT and EPT
Barret Rhoden [Tue, 17 Mar 2015 14:09:08 +0000 (10:09 -0400)]
x86: pgdir_t handles both KPT and EPT

We still don't make EPTs, but all of the infrastructure is in place.

5 years agox86: changes pte_t to be a KPTE and an EPTE
Barret Rhoden [Tue, 17 Mar 2015 13:38:57 +0000 (09:38 -0400)]
x86: changes pte_t to be a KPTE and an EPTE

Ideally, a PTE would always have a KPTE, and optionally have an EPTE.
Now, for all ops other than walk_okay, we have at least one of KPTE or
EPTE (and possibly both).  pgdir_walk() will return both.  memwalks will
have only one or the other.

The alternative is to come up with a way to walk both tables in
lockstep, jumping back and forth and building a full PTE for the
memcallback at each point.  We might do that later, if necessary.

5 years agoSplits pmap ops up for each arch
Barret Rhoden [Mon, 16 Mar 2015 20:00:39 +0000 (16:00 -0400)]
Splits pmap ops up for each arch

The helpers are the same for now, but this lets x86's ops change to
support EPTs.

5 years agoRemove PDX and NPDENTRIES
Barret Rhoden [Mon, 16 Mar 2015 19:48:26 +0000 (15:48 -0400)]

Old macros, not needed any more.

5 years agoChanges pde_t* -> pgdir_t
Barret Rhoden [Mon, 16 Mar 2015 19:35:23 +0000 (15:35 -0400)]
Changes pde_t* -> pgdir_t

Just like pte_t, the nature of the pgdir is arch-dependent.  For now,
it's all the same under the hood, thanks to various casts.

5 years agoMakes pte_t an opaque type
Barret Rhoden [Mon, 16 Mar 2015 18:16:48 +0000 (14:16 -0400)]
Makes pte_t an opaque type

The nature of pte_t will be arch-dependent.  It could be a struct or the
old pte_t (kpte_t) and have its own tricks for modification.  This patch
changes all of the accesses that implicitly treated pte_t as something
that could be read or written in a certain manner.

It also catches a bug in the unused (and warned) unmap_vmap_segment().

5 years agox86: adds a kpte_t for the pte_t
Barret Rhoden [Mon, 16 Mar 2015 18:14:39 +0000 (14:14 -0400)]
x86: adds a kpte_t for the pte_t

pte_t as a directly-manipulatable object is going away for x86.
Internally, we want something to do the old pte_t's job for the kernel
page table: the kpte_t.

5 years agoDemo code to set up a VMMCP, including #c access
Ron Minnich [Thu, 12 Mar 2015 20:55:12 +0000 (13:55 -0700)]
Demo code to set up a VMMCP, including #c access

This correctly starts a VMMCP as an 'unrestricted guest'.

Next step is to handle the resulting EPT page fault, which exits the vm with
error 0x21.

(git-fu'd by brho)

5 years agoVMM: Hook the VMM to the process (XCC)
Barret Rhoden [Thu, 12 Mar 2015 17:06:31 +0000 (13:06 -0400)]
VMM: Hook the VMM to the process (XCC)

Syscall for turning any proc, including SCPs, into VMMs.  We'll see if
we need to limit to MCPs later. (reflected faults and stuff).

This changes the kernel header, so you'll need to reinstall your headers
if you want to access the new syscall by name.  Either copy
bits/syscall.h manually or rebuild your toolchain.

5 years agoVarious minor debugging changes
Ron Minnich [Wed, 11 Mar 2015 13:37:34 +0000 (06:37 -0700)]
Various minor debugging changes

At least give a HINT when things go wrong. Just a teensy weensy one.

(git-fu'd by brho, and changed the arg order in kmalloc's print)

5 years agoVMMCP: initialization
Barret Rhoden [Wed, 11 Mar 2015 16:28:39 +0000 (12:28 -0400)]
VMMCP: initialization

vmm_init() happens before smp boot, and the per-cpu bits are done in
pcpu init.