akaros.git
3 years agoAvoid locking in sbrk during early SCP (XCC)
Barret Rhoden [Mon, 19 Sep 2016 16:39:31 +0000 (12:39 -0400)]
Avoid locking in sbrk during early SCP (XCC)

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

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

For future reference, here was the backtrace:

uth_disable_notifs+0x4
spin_pdr_lock+0x11
sbrk+0x3a
__libc_setup_tls+0xa9
__libc_start_main+0x11e
_start+0x29

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

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

Rebuild glibc.

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

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

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

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

sys_foo():
if (some_condition && printx_on) {
px_lock();
backtrace_user_ctx(current, current_ctx);
px_unlock();
}

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

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

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

Rebuild glibc.

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

That first assignment to sin_port in recvfrom was overwritten and
confusing.

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

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

Rebuild glibc.

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

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

Rebuild glibc.

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

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

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

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

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

Rebuild glibc.

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

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

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

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

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

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

Rebuild glibc.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Rebuild glibc, if you want.

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

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

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

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

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

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

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

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

Reinstall your kernel headers.

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

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

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

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

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

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

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

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

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

Which will force guests that halt to exit.

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

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

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

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

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

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

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

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

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

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

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

Here's a usage example:

struct virtual_machine vm[1];

static volatile int count;

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

int main(int argc, char **argv)
{

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

while(count < 2) {
}

return 0;
}

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

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

Rebuild glibc.

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

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

Rebuild glibc.

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

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

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

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

Rebuild glibc.

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

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

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

closeconv() ->
  ipifcremmulti() ->
    remselfcache() ->
      etherremmulit() ->
        devtab[x].write()

The latter call can throw.

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

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

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

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

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

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

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

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

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

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

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

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

And, finally, clang-format it.

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

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

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

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

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

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

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

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

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

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

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

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

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

Rebuild glibc.

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

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

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

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

Rebuild glibc.

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

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

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

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

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

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

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

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

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

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

Fixes: b/30568132

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

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

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

This failed to index for keys greater than 32 bits.

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

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

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

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

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

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

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

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

There's some info on this stuff here:

http://www.airs.com/blog/archives/166

Rebuild your toolchain.

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

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

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

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

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

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

Change-Id: I9627c9c1d6b21282cd07b24b30c097f4d3726748
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSpecify nic via commmand line
Kyle Milka [Tue, 16 Aug 2016 21:21:04 +0000 (14:21 -0700)]
Specify nic via commmand line

You can now specifiy the nic to use with the -n option.

Change-Id: I39c4384953798f4f9eb43057300037c4934d7f4f
Signed-off-by: Kyle Milka <kmilka@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDisallow one-liner functions in clang-format.
Christopher Koch [Mon, 15 Aug 2016 23:54:54 +0000 (16:54 -0700)]
Disallow one-liner functions in clang-format.

Change-Id: I3e9884b3eaf05c4a7fdb718e76697f28f15d40b9

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPrint PID in segfault default signal handler. (XCC)
Christopher Koch [Mon, 15 Aug 2016 20:35:42 +0000 (13:35 -0700)]
Print PID in segfault default signal handler. (XCC)

Rebuild glibc.

Change-Id: I5cb6a833b9f8b5a2409607e795834e18a34a0758
Signed-off-by: Christopher Koch <chrisko@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReduce mmap calls in vfprintf.c (XCC)
Barret Rhoden [Fri, 12 Aug 2016 22:07:46 +0000 (18:07 -0400)]
Reduce mmap calls in vfprintf.c (XCC)

It turns out that the work_buffer path gets called a lot, including by
bash.  I saw a lot of mmaps in a few traces.  I think we can put that 1k on
the stack, since it's right near the magic number of 1/4 of a minimum
stack size.  We'll see.

This also fixes the other mmap, which should have been asking for
MAP_ANONYMOUS.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse a constructor in benchutil/alarm
Barret Rhoden [Fri, 12 Aug 2016 20:50:39 +0000 (16:50 -0400)]
Use a constructor in benchutil/alarm

It's possible to race with multiple threads (or vcore context) setting up
awaiters at the same time.  The nicer approach, and one that avoids a lot
of work in vcore context, is to use a constructor.

Programs that *might* call the alarm code (thus link and trigger the
constructor) will pay the setup tax (opening FDs, etc), instead of delaying
that setup cost until when we *know* they will use the alarms.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoIncrease the alloca cutoff (XCC)
Barret Rhoden [Fri, 12 Aug 2016 20:41:39 +0000 (16:41 -0400)]
Increase the alloca cutoff (XCC)

Turns out that 128 is too small, and some programs can trigger it quite
easily.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove set_awaiter_abs() from the user interface
Barret Rhoden [Thu, 11 Aug 2016 18:24:55 +0000 (14:24 -0400)]
Remove set_awaiter_abs() from the user interface

To avoid future confusion.  Long term, we'll probably use nsec since boot
globally.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix timeout bug in semaphores
Barret Rhoden [Thu, 11 Aug 2016 18:19:39 +0000 (14:19 -0400)]
Fix timeout bug in semaphores

set_awaiter_abs() takes TSC ticks, not microseconds.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAHCI: reformat with clang-format, fix with spatch.
Ronald G. Minnich [Thu, 11 Aug 2016 17:08:45 +0000 (10:08 -0700)]
AHCI: reformat with clang-format, fix with spatch.

This did require changes to typedef.cocci but that will
come in a different patch.

Change-Id: I30f64d91c9bdc789a620db08b10fce384c6843fe
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCoreutils for Akaros.
Dan Cross [Thu, 11 Aug 2016 16:41:35 +0000 (12:41 -0400)]
Coreutils for Akaros.

Add a Makefile and patchset to build coreutils for Akaros.

Note that we hack the Makefile to fake manpage generation,
as this requires running the output of the freshly-built
commands through 'help2man'. But since those commands target
Akaros, they won't run on the build machine (which will
typically run some sort of POSIXy operating system like
Linux).

Change-Id: Icf3e17107184a4b024582e41063e251fe1b07880
Signed-off-by: Dan Cross <crossd@gmail.com>
[ added a gitignore ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAHCI initial commit.
Ronald G. Minnich [Tue, 9 Aug 2016 22:24:31 +0000 (15:24 -0700)]
AHCI initial commit.

From github.com:harvey-os/harvey 5be5d9cc0a1da28339c61e974c31b1915d2a1b03

Change-Id: I5cd052ce7bde5f6eb6de9557dfe6151174d1ef5f
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCheck for size==1 before rounding to power of two in epoll init.
Dan Cross [Wed, 10 Aug 2016 17:43:15 +0000 (13:43 -0400)]
Check for size==1 before rounding to power of two in epoll init.

While technically 1==2^0 is a power of two, the ROUNDUPPWR2
was changing the size of the epoll set to 2 before we tested
for two; since this set does not grow, we were getting errors
trying to add low-value FDs to the set, causing errors.

Slightly rearranging the order in which we do these operations
fixes this.

Change-Id: I2d068416941e8e1e9d7cfa98d56f5ea5b159802b
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoKick the VMM 2LS when enqueueing a thread
Barret Rhoden [Fri, 5 Aug 2016 00:39:11 +0000 (17:39 -0700)]
Kick the VMM 2LS when enqueueing a thread

Previously, we'd only run the 2LS logic on sched_entry().  If you
created threads and didn't do something triggering sched_entry(), such
as uthread_sleep_forever(), any system call, take a notify/IPI, etc,
then we'd never run that logic and you could deadlock.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow vcore_tick_* to be called from uthreads
Barret Rhoden [Fri, 5 Aug 2016 00:34:19 +0000 (17:34 -0700)]
Allow vcore_tick_* to be called from uthreads

Previously, they were designed for use from sched_entry(), and thus
vcore context.  There are cases where scheduler functions that aren't in
vcore context might want to mess with the *current vcore's* timer tick.

To do this, I had to stop using the TLS variable, and use a constructor
instead.  Otherwise, the uthread would use its own __vc_tick.  When a
uthread disabled notifs, it appears to be in vcore context to other
vcores and the kernel.  However, it is not actually in vcore context, at
least when it comes to TLS and stacks.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCouldn't actually wrap around the vring.
Kyle Milka [Mon, 8 Aug 2016 18:28:38 +0000 (11:28 -0700)]
Couldn't actually wrap around the vring.

This check didn't allow the vring to actually wrap around, if the next
available index was less than the last index, it caused the error to be
triggered.

Change-Id: I90c26cfd894a9b729e44937e1894ce5bfbf1d144
Signed-off-by: Kyle Milka <kmilka@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImport patch to fix shell script/exit status bug.
Dan Cross [Fri, 5 Aug 2016 20:09:58 +0000 (16:09 -0400)]
Import patch to fix shell script/exit status bug.

Import patch from the bash maintainers: Chet Ramey provided
this fix for the bug we observed some time ago.

Change-Id: I412151e27436fe88adf9507700dd488bd6334d7b
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRewrite /bin/pci into bash.
Dan Cross [Thu, 4 Aug 2016 21:42:48 +0000 (17:42 -0400)]
Rewrite /bin/pci into bash.

As per Ron's request, this is Harvey's /rc/bin/pci recast as a
'bash' script and made to work with Akaros's '#pci' device.

Change-Id: I46a66155014acaf486270f504ee2e559c8fe33c9
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImport /rc/bin/pci from Harvey.
Dan Cross [Thu, 4 Aug 2016 21:42:47 +0000 (17:42 -0400)]
Import /rc/bin/pci from Harvey.

As per Dr. Minnich's request. This is the original from Harvey; it
is an 'rc' script.

Change-Id: If7e4014c87bbd5a9d7a7fc9989c23394ee2743c3
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix-up command line files
Kyle Milka [Thu, 4 Aug 2016 18:42:14 +0000 (11:42 -0700)]
Fix-up command line files

There were a few errors in these files, it will be easier to
just have the correct version upstream.

Change-Id: I3ecb6bec4837d92d58cc7230d0afd1c7a5bde34a
Signed-off-by: Kyle Milka <kmilka@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix multiple setting in DTLS
Barret Rhoden [Wed, 3 Aug 2016 23:14:30 +0000 (16:14 -0700)]
Fix multiple setting in DTLS

The bug was that __get_dtls was returning a v->dtls, not a v.  Thus if
we set twice, we'd dereference the *value*, instead of v.  In essence,
we'd set v->dtls->dtls = dtls.  That's a wild write.

Incidentally, our DTLS handles set/get calls from within the destructor
without resorting to infinite loops, PTHREAD_DESTRUCTOR_ITERATIONS (4)
retries, or other nasty shit.  Nicely done, Kevin.  =)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReformat DTLS
Barret Rhoden [Wed, 3 Aug 2016 22:52:14 +0000 (15:52 -0700)]
Reformat DTLS

Did clang format, plus a bunch of things it didn't handle:

- block comments weren't wrapped
- functions with no arguments were not of the "void foo(void)" style
- no empty lines after local parameter declarations
- some trailing whitespace

It also moved around the include order.  Hopefully that didn't break
anything.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a couple features to .clang_format
Barret Rhoden [Wed, 3 Aug 2016 22:51:21 +0000 (15:51 -0700)]
Add a couple features to .clang_format

This should do the "tabs for indentation, spaces for alignment"
formatting and should detect common for-loop macros.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix the license on certain Parlib files
Barret Rhoden [Wed, 3 Aug 2016 21:49:27 +0000 (14:49 -0700)]
Fix the license on certain Parlib files

These came from the Linux version of Parlib.  Technically, this changes
them from v3 to v2, since Linux-Parlib was v3.  I checked with Kevin and
he said this was fine.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix inb when linux tests for the PIC
Gan Shun [Thu, 4 Aug 2016 17:45:18 +0000 (10:45 -0700)]
Fix inb when linux tests for the PIC

Previously we clobbered bits 63:8 of RAX when responding to this inb.
This is not technically correct. We now only change the low 8 bits.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Iacb0c72cbbb0b4dfa229824c19ba4b000177e567
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd instruction decode for a few more specific instructions
Gan Shun [Thu, 4 Aug 2016 17:45:17 +0000 (10:45 -0700)]
Add instruction decode for a few more specific instructions

We don't want to turn this into a full instruction decoder, so there are
just a few hardcoded added cases to handle certain move instructions
that we see.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: I0c51251232b27e2d33ffe2c0a30bacafe233f6af
[minor formatting]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd page table walk for guest va to pa translation
Gan Shun [Thu, 4 Aug 2016 17:45:16 +0000 (10:45 -0700)]
Add page table walk for guest va to pa translation

We used to assume that the gpa would be the same as the gva minus the
high order bits. That is not the case for some kernels. This actually
walks the page table that the guest sets up to find the correct gpa.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ieed65f23476dc2c5e9e882ef5599870b3758565b
[minor formatting]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix MSR emulation to hide Intel functionality that we don't support
Gan Shun [Thu, 4 Aug 2016 17:45:15 +0000 (10:45 -0700)]
Fix MSR emulation to hide Intel functionality that we don't support

We report 0 for perf capabilities because we don't want to support perf
tools yet, and we report 0 for MCG to prevent linux from trying to setup
machine checks.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ieef80e16536a8448a570b69342e4a58ef82b15f0
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix VM Guest CPUID emulation to hide VMX
Gan Shun [Thu, 4 Aug 2016 17:45:14 +0000 (10:45 -0700)]
Fix VM Guest CPUID emulation to hide VMX

We report no VMX capabilities to the VM guest we're running as we don't
currently support nested VMs.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ie90bea3c255a95df0dad6c9f5b58055431029b02
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix wonky tail queue swap in condition variables code.
Christopher Koch [Wed, 3 Aug 2016 21:36:36 +0000 (14:36 -0700)]
Fix wonky tail queue swap in condition variables code.

TAILQs happen to refer to themselves (double pointer), so just swapping the
contents of the struct is not enough.

Change-Id: Id06cdbda8dcc3f77812e943c4f8d38354cc2cb1f
Signed-off-by: Christopher Koch <chrisko@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix proc_is_dying() bug
Barret Rhoden [Wed, 3 Aug 2016 17:27:20 +0000 (10:27 -0700)]
Fix proc_is_dying() bug

Bug was added in f10bf40001fe ("Split PROC_DYING into DYING and
DYING_ABORT"), where I missed a "!".

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Free VMCSs when appropriate
Barret Rhoden [Wed, 3 Aug 2016 17:16:03 +0000 (10:16 -0700)]
VMM: Free VMCSs when appropriate

Previously we weren't freeing them at all.  Additionally, if we failed
part of the way through a create_guest_pcore, we'd leak the VMCS we
allocated.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Fix vmm_struct_init() off-by-one
Barret Rhoden [Wed, 3 Aug 2016 17:13:57 +0000 (10:13 -0700)]
VMM: Fix vmm_struct_init() off-by-one

We were returning and setting nr_guest_pcores to one less than the
number of cores we set up.

I also got rid of using 'i' outside the loop, which was slightly
confusing due to the other loop using its own 'i'.  I also cleaned up
some old comments that referred to the pre-waserror error handling
style.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: move to waserror/error style.
Ronald G. Minnich [Mon, 1 Aug 2016 22:29:23 +0000 (15:29 -0700)]
VMM: move to waserror/error style.

This simplifies the code and improves error diagnostics.

I've tested some of the error handling paths by trying to
set up a VM with bad parameters and also inserting some
calls to error() in a few places.

Change-Id: I5437f559f618c132be751897785aee6da3b771be
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: support use of waserror()/error() style.
Ronald G. Minnich [Thu, 21 Jul 2016 00:57:21 +0000 (17:57 -0700)]
VMM: support use of waserror()/error() style.

The vm startup is complicated and has lots of room for error.
In practice using the 'test return value' model has been
hard to use because the call order and functions are changing
-in the most recent case we're getting back
ENOMEM when the error is not ENOMEM at all.

Set up the sys_vmm_setup so that it can call functions
which use error(). I've talked to Barret and we're
good with this change.

Change-Id: I5260814cda2207eb8c698d5b8e9a27c5fb38fbf5
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[ note that the retval is now -1 for failure.  this is fine.]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse PROC_DYING_ABORT for aborting syscalls
Barret Rhoden [Sun, 31 Jul 2016 20:47:59 +0000 (16:47 -0400)]
Use PROC_DYING_ABORT for aborting syscalls

The reason for all this is that some devices (#mnt) issue syscalls when
closing the FD, and those syscalls could block.  If we were DYING, those
syscalls would immediately abort.  #mnt didn't handle this well, and
went into an infinite loop.

The root of the problem is that we want the process to be dying, but we
don't want its syscalls to abort immediately.  We *do* want them to
abort at some point (I think).

We previously split the DYING state into DYING and DYING_ABORT.  All
code that cared about DYING also cared about DYING and DYING_ABORT.  Now
the actual abort code only checks DYING_ABORT, and not DYING.

One subtle change is that we close the FDT *after* aborting syscalls.
Previously we aborted syscalls first.  Devices should have no problem
with closes with outstanding syscalls - for instance, a close while
someone is blocked on an FD.  The user shouldn't do that, but they
could, so devices should be ready.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSplit PROC_DYING into DYING and DYING_ABORT
Barret Rhoden [Sun, 31 Jul 2016 20:38:01 +0000 (16:38 -0400)]
Split PROC_DYING into DYING and DYING_ABORT

This commit just splits out the state into two different states, but
does not differentiate between them yet.  Everywhere that was checking
DYING before now checks DYING and DYING_ABORT equally.

We will need this split to deal with issues closing FDs when processes
are DYING.  In short, if the chan release methods attempt to block on a
rendez, the syscalls will abort immediately, since DYING is set.

We DYING_ABORT is a DYING state, but specifically one where we want all
syscalls to abort.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Don't backtrace from trampoline asm
Barret Rhoden [Thu, 28 Jul 2016 22:11:25 +0000 (18:11 -0400)]
x86: Don't backtrace from trampoline asm

Imagine this.  Userspace happens to load %rbp with a value that the kernel
cannot dereference.  Then it enters the kernel.  In the brief period before
the kernel sets rbp = 0 and starts its day, a profiling NMI arrives.  The
backtrace would flip out.

We could use something like a safe copy_from sort of call (copy_from_user()
won't work as is, incidentally, since it has built-in checks for user
addresses).  However, even if we set the address correctly, the user just
gained the ability to read kernel memory.  Set rbp, then do a bunch of null
syscalls in a loop with perf running.  Eventually you'll hit the bug.
Yeah, that's really rare.  Luckily, this did not come up - I just noticed
it in passing.

The nice thing about this approach is that the kernel should not be
backtracing beyond its entry point, regardless of the value of rbp.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Secure eflags when securing contexts
Barret Rhoden [Thu, 28 Jul 2016 20:42:21 +0000 (16:42 -0400)]
x86: Secure eflags when securing contexts

We had been making sure interrupts was on, but we weren't enforcing some of
the other flags.  I don't know if this is all of them, but it's the list of
ones that sounded dangerous from the SDM.

The IOPL one was probably a security hole.  A process could have asked the
kernel to pop a HWTF that had IOPL set to 3, and then started mucking with
devices.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Add protection from NMI contexts that trap
Barret Rhoden [Thu, 28 Jul 2016 19:29:38 +0000 (15:29 -0400)]
x86: Add protection from NMI contexts that trap

Remember the rules.  Among other things, NMI context code must be careful
when writing.  They can never grab locks.  These rules apply to faults
triggered by NMI context code.  This includes faults for things like
copy_from_user().

To limit the potential code of a faulting NMI's fault handler, I limited
the PF handler to just trying fixups.  The only code there is lock-free and
write-free.

To fix this up, I needed to clean up trap_dispatch a little.  Now we are
very explicit about what faults we handle (we had been handing T_GPF, which
wasn't on the list through the "default" handler).  Not a fan of that old
style.

I considered not adjusting the ktrap_depth during fault handlers from NMI
context.  The NMI could have interrupted another fault handler right when
it was in the read-modify-write process.  However, since the fault handler
returns the depth variable to its previous value, this interruption is
harmless.  I think.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove backtraces from trace_printk()
Barret Rhoden [Wed, 27 Jul 2016 23:44:05 +0000 (19:44 -0400)]
Remove backtraces from trace_printk()

This reverts previous changes and restores trace_printk() to its
previous behavior: just printk into the trace log.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove SEM_TRACE_BLOCKERS and TRACEME
Barret Rhoden [Wed, 27 Jul 2016 23:34:02 +0000 (19:34 -0400)]
Remove SEM_TRACE_BLOCKERS and TRACEME

Those are leftovers from the old op2 style tracing.  I noticed this
because trace_printk popped up in an NMI-enabled trace of block_test.
Gotta love the NMI sampling.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoClear excess parts of contexts when finalizing
Barret Rhoden [Wed, 27 Jul 2016 23:28:28 +0000 (19:28 -0400)]
Clear excess parts of contexts when finalizing

When we copy out the context from pcpui, we copy the entire struct
user_context.  However, when we fill the context, the amount we copy in
depends on the type.  Hypothetically, if a user has a smaller TF than
the previous resident, such as a SW TF running where a VM TF recently
existed, then the user could see some of the fields of the previous
resident.

By doing this during finalization, we limit the impact of the memset to
when we could give the context back to the user, i.e. after
finalization.

In the process, I moved the finalize routines from trap64.h to trap.c.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Use NMIs for sampling HW and VM TFs
Barret Rhoden [Wed, 27 Jul 2016 22:25:08 +0000 (18:25 -0400)]
perf: Use NMIs for sampling HW and VM TFs

Using NMIs allows us to sampling when interrupts are disabled.  It's
extremely useful.

To limit the amount of code we run from NMI context, we only record the
sample into a pre-allocated, per-cpu buffer.  Keep in mind the NMI rules
about writing and reading at the top of handle_nmi().

So NMIs record the backtrace, but don't emit the sample.  We self_ipi()
to trigger emitting the sample as soon as IRQs are reenabled.  If IRQs
were not disabled, this IRQ will hit as soon as the NMI returns.

vmexits for an NMI will also record the PC of the guest, but not attempt
a backtrace.  Previously, we were probably trying to backtrace.  Due to
the x86 NMI blocking issues, we don't attempt to do anything that might
fault from the vmexit NMI handler.

NMIs are now used for both perf monitoring and the monitor "trace
coretf".  The monitor's trace command is still a little dangerous.  This
commit also just moves all of that mess into monitor.c.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Prevent NMIs from nesting
Barret Rhoden [Tue, 19 Jul 2016 19:38:38 +0000 (15:38 -0400)]
x86: Prevent NMIs from nesting

If an NMI faults for any reason and then does an iret, the iret will clear
whatever protection hardware offers that prevents another NMI from nesting.
Basically, hardware will delay future NMIs until an iret.  The fault
handler's iret counts.

We get around this by having two stacks for NMIs.  One is for the real NMI
entry.  The second (the one in pcpui) is for the work done in NMI context.
This is the work that could get interrupted.  In that case, the NMI handler
makes sure the worker will do_nmi_work() again.

The main NMI handler and the bottom half work together such that a
concurrent NMI triggers a repeat of do_nmi_work().  The trickiness comes
when the bottom half tries to exit (by popping back to the original TF) and
an NMI happens at the same time.

The most error-prone and least-used part of this is how we handle that
scenario: the NMI handler notices the bottom half was trying to exit and
moves it to an alternate section of code that will return instead of
popping.  We can get away with this because there is a single instruction
that commits the "pop" of the TF and leaves the worker stack: iret.  It's
sort of like a restartable sequence, but instead of restarting, we undo the
operation.  That was relatively simple.  The harder part is writing the
nmi_try_to_pop, which is basically another NMI entry and exit under
slightly different circumstances.

I tested this a little.  I put a few direct jumps from within the OK case
to within the FAIL case.  I also put a "1: jmp 1b" loop in the OK case and
two nops in the FAIL case, added a breakpoint to do_nmi_work, and sent
another NMI to trigger the TF-hacking code.  Seems to work, for now.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Use a separate stack and handler for NMIs
Barret Rhoden [Mon, 25 Jul 2016 16:23:50 +0000 (12:23 -0400)]
x86: Use a separate stack and handler for NMIs

It turns out that on x86_64, you *must* use a separate stack for
NMIs.  On i386, this was an option.  Why, you ask?  Because SYSCALL (64
bit) differs from SYSENTER (32 bit) in that SYSCALL does *not* set the
stack pointer for the kernel on entry.  It's up to the SYSCALL/SYSENTER
entry point software to figure out and set the stack pointer.

The problem is that if you receive an NMI before the kernel can set the
stack pointer.  If your NMI handler doesn't use a separate, pre-determined
stack, the interrupt hardware pushes the basic interrupt info onto the
*current* stack, which happens to be a user-controlled pointer at this
point.  Good times.

For more fun times, we also need to return to user TFs directly, and not
call proc_restartcore().  See the notes on handle_nmi() for more info.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoJump stacks before unlocking semaphores
Barret Rhoden [Fri, 22 Jul 2016 19:07:17 +0000 (15:07 -0400)]
Jump stacks before unlocking semaphores

This popped up as a potential problem with NMIs, where a poorly timed
NMI could cause corruption.  It turns out that this was *a* problem, not
*the* problem.

As the comments note, this is only a problem for NMIs on architectures
that don't use the same stack.  x86_64 mostly requires a different stack
for NMIs (for other reasons), but other architectures might not have the
same requirements.  Better safe than sorry.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoClean up smp_idle's stack jumping
Barret Rhoden [Fri, 22 Jul 2016 18:41:55 +0000 (14:41 -0400)]
Clean up smp_idle's stack jumping

First off, RESET_STACKS is no longer an option.  There are weird cases
where you want to backtrace beyond smp_idle.  You can comment that out
manually if you want, but there's no need to make it a regular thing.
If you don't RESET_STACKS, you'll potentially run off the stack.

Other things:
- that disable_irq in smp_idle() wasn't really protecting anything.  No
  sense in doing it there.  We might need it to protect parts of the
KMSG subsystem, so I moved it to __smp_idle() for now.
- that cmb() did nothing.  The compiler won't reorder those asm
  operations.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Have arches handle the backtrace
Barret Rhoden [Tue, 19 Jul 2016 23:26:24 +0000 (19:26 -0400)]
perf: Have arches handle the backtrace

Instead of having arch-independent perf do the backtraces, let the arch
generate the BT and pass it to the arch-independent part.

This will matter for NMI tracing, where the actual pc_list will be saved
somewhere temporarily and then emitted.  Only x86 needs to know about that.

This also removes the add_trace() option.  It's a bad thing to do.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Upgrade backtrace
Barret Rhoden [Tue, 19 Jul 2016 23:02:23 +0000 (19:02 -0400)]
x86: Upgrade backtrace

Previously, we would report zero PCs if the FP was 0.  Now we'll at least
report the PC we were given.

Now that we're using two different functions for the kernel and user, we
can be more careful in the kernel's function when backtracing.

Finally, this is more clear with regards to the end conditions for the
loop.

But wait, you say, isn't that fp check in the kernel's BT unnecessarily
slow?  fp < KERNBASE, so we don't need to write the far more
understandable:

if (!fp || fp < KERNBASE)
break;

and we can write this instead!

if (fp < KERNBASE)
break;

Those generate the same code.  Don't be too clever, the compiler might
outsmart you.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>