akaros.git
3 years agoAdd user support for VM contexts
Barret Rhoden [Wed, 20 Jan 2016 22:34:44 +0000 (17:34 -0500)]
Add user support for VM contexts

VM contexts are a lot like HW contexts.  The FP state may be dirty, and it
is in the processor's FP registers (or VCPD, if the kernel saved it).  The
FP state is independent of the general purpose registers as far as VMX
goes, which works out well: the VM ctx is just another general purpose
context, albeit one that needs kernel support to enter or exit.

And of course, a VMM needs to build a VM context and try to run it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoStub out kernel support for VM contexts (XCC)
Barret Rhoden [Wed, 20 Jan 2016 22:22:53 +0000 (17:22 -0500)]
Stub out kernel support for VM contexts (XCC)

The places that need implemented are marked with TODO: (VMCTX).  This just
provides the framework for the actual kernel support and a first cut at
what a VM context looks like.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Use a common lock for printing all trapframes
Barret Rhoden [Thu, 21 Jan 2016 16:57:15 +0000 (11:57 -0500)]
x86: Use a common lock for printing all trapframes

The lock is just there for sanity reasons.  What happens on occasion is
that the kernel faults on multiple cores at the same time and tries to
print trapframes at the same time.  Those get interleaved, which is a minor
pain.  Using different locks for different TF types doesn't actually help,
so this just uses the one lock.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoProvide a syscall to pop a user context (XCC)
Barret Rhoden [Wed, 20 Jan 2016 16:47:00 +0000 (11:47 -0500)]
Provide a syscall to pop a user context (XCC)

x86 will need help running VM contexts, which is the only intended use for
this syscall.

The syscall works for any type of context, but be careful actually using
it.  As noted in the comments, Parlib manages TLS separately from
pop_user_ctx(), but this syscall will set the TLS.  When testing, I had
parlib 0 FS base in the the ctx, then had proc_pop_ctx only change the FS
base if it wasn't 0.  Technically, they could want us to set a FS base of
0, so it's not really a fix.  Another solution would be to have parlib read
fsbase, then fill that into the context.  Considering there's no real need
for the kernel to pop HW or SW contexts, none of it is worth doing.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow copy_*_user to be included from umem.h
Barret Rhoden [Wed, 20 Jan 2016 16:44:04 +0000 (11:44 -0500)]
Allow copy_*_user to be included from umem.h

Previously, we needed to include arch/uaccess.h to get access to the
copy_*_user helpers.  This way, we have just one header for all functions
related to user memory, which was the original intent.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPass in file offset into mmap() handlers.
Kanoj Sarcar' via Akaros [Sat, 30 Jan 2016 00:25:32 +0000 (16:25 -0800)]
Pass in file offset into mmap() handlers.

Signed-off-by: Kanoj Sarcar <kanoj@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSlices: A growable list of pointers.
Dan Cross [Fri, 22 Jan 2016 19:26:11 +0000 (14:26 -0500)]
Slices: A growable list of pointers.

Introduce the slice library; a growable list of pointers.
Loosely modeled after the 'slice' abstraction in the Go
programming language.

Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoerror: return usable error strings, not nothing.
Ronald G. Minnich [Fri, 22 Jan 2016 18:47:20 +0000 (10:47 -0800)]
error: return usable error strings, not nothing.

This is a way to get us to clean up our act on errstrs.
Bare errnos are frequently unusable, as were the Plan 9
canned error strings. At the very least, this will
show the file that produced the error. It should show
the line number but does not (why?).

But it's way better than nothing.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[fixed the macro to show the line number]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRe-enabled event injection via vmctl during vmx RESUME
Michael Taufen [Fri, 22 Jan 2016 18:28:41 +0000 (10:28 -0800)]
Re-enabled event injection via vmctl during vmx RESUME

We need to use event injection to get certain interrupts, like #GP, to the
VM. It turns out that due to the way Intel designed the virtual interrupt
delivery mechanism, we cannot use it to send interrupts 0x00 through 0x0f.
This is because the interrupt will only be processed if the high 4 bits
(7:4) of the Requesting Virtual Interrupt (RVI) portion (this is where we
put the interrupt id) of the Guest Interrupt Status field (which is part
of the Virtual Machine Control Structure) are STRICTLY greater than bits
7:4 of the Virtual Processor-Priority Register (VPPR). The VPPR has a
minimum value of 0. So bits 7:4 of RVI can never be strictly greater than
those of the VPPR for the first 16 interrupts.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd taps for pipes.
Ronald G. Minnich [Tue, 5 Jan 2016 01:31:35 +0000 (17:31 -0800)]
Add taps for pipes.

Almost certainly wrong!

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[minor fixes, almost certainly right!]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoProvide select() on top of epoll()
Barret Rhoden [Wed, 6 Jan 2016 16:30:50 +0000 (11:30 -0500)]
Provide select() on top of epoll()

Our version of select will spuriously return, so your applications need
to handle being told an FD is ready even if it isn't.  If your operation
needs to not block, then use O_NONBLOCK.  This is somewhat similar to
Linux, where the man pages says:

Under Linux, select() may report a socket file descriptor as "ready
for reading", while nevertheless a subsequent read blocks.

Except in Akaros, this happens all the time.

For more caveats, see select.c.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove _sock_get_listen_fd() [3/3] (XCC)
Barret Rhoden [Wed, 6 Jan 2016 15:43:36 +0000 (10:43 -0500)]
Remove _sock_get_listen_fd() [3/3] (XCC)

I kept it around briefly so epoll could compile.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove epoll's listen_fd acrobatics [2/3]
Barret Rhoden [Wed, 6 Jan 2016 15:40:44 +0000 (10:40 -0500)]
Remove epoll's listen_fd acrobatics [2/3]

The Rock code maintains an always-open listen_fd, so epoll no longer
needs to do get and close the FD.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoTrack listen FDs in socket rocks [1/3] (XCC)
Barret Rhoden [Wed, 6 Jan 2016 15:14:52 +0000 (10:14 -0500)]
Track listen FDs in socket rocks [1/3] (XCC)

Instead of only opening the listen file on demand and having our user
close it (which is a huge mess), we just open it right away and close it
when the socket / Rock is closed.

This will help out epoll, which currently will deadlock if it attempts
to close a listen_fd while holding its own locks, since epoll itself has
a close callback.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a close callback for socket Rocks (XCC)
Barret Rhoden [Tue, 22 Dec 2015 21:26:44 +0000 (16:26 -0500)]
Add a close callback for socket Rocks (XCC)

These FDs are the return value from socket().  Under the hood, they are
data FDs.  There are a bunch of things that can be cleaned up now that
we get a callback when the app closes the FD.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImplement run_once() without atomic_t (XCC)
Barret Rhoden [Wed, 6 Jan 2016 15:01:59 +0000 (10:01 -0500)]
Implement run_once() without atomic_t (XCC)

Using the atomic_t created a dependency on an atomic header.  It's not a
huge deal, since most every place that uses run_once() was already
including the header, but it was a minor annoyance.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoclose() will trigger a epoll_ctl_del()
Barret Rhoden [Fri, 18 Dec 2015 23:01:25 +0000 (18:01 -0500)]
close() will trigger a epoll_ctl_del()

Epoll on Linux will remove an FD from all sets when it is closed.  Now we
do the same.

Once you create an epoll instance, every call to close() will call the
epoll callback.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd callbacks to close() (XCC)
Barret Rhoden [Fri, 18 Dec 2015 22:59:09 +0000 (17:59 -0500)]
Add callbacks to close() (XCC)

Akaros has various utilities in userspace that operate on FDs, but those
facilities are in the kernel in other OSs.  These facilities would like to
know when the FD is closed.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoTrack the FD assigned to a user FD (XCC)
Barret Rhoden [Fri, 18 Dec 2015 22:52:22 +0000 (17:52 -0500)]
Track the FD assigned to a user FD (XCC)

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoTrack all epoll controllers on a global list
Barret Rhoden [Fri, 18 Dec 2015 21:04:56 +0000 (16:04 -0500)]
Track all epoll controllers on a global list

This is needed to handle close() of FDs that are members of epoll sets.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse mutexes in epoll instead of spinlocks
Barret Rhoden [Tue, 5 Jan 2016 16:08:52 +0000 (11:08 -0500)]
Use mutexes in epoll instead of spinlocks

Many of the calls technically could block, so we ought to use mutexes
instead.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoProvide a fake mutexes for the thread0 2LS
Barret Rhoden [Tue, 5 Jan 2016 15:34:38 +0000 (10:34 -0500)]
Provide a fake mutexes for the thread0 2LS

Programs with a single thread do not need mutexes.  The default
implementations would probably be safe, since the mutex should be
unlocked, unless a program recursively locked the same mutex.  In that
case, they are in trouble anyways (deadlock, usually).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a 2LS-independent mutex interface
Barret Rhoden [Tue, 5 Jan 2016 15:14:56 +0000 (10:14 -0500)]
Add a 2LS-independent mutex interface

We need a way to wait on a mutex from 2LS-independent code.  Unlike
spinlocks, mutexes might need a custom implementation for a given 2LS.

We now provide a generic mutex code that most 2LSs can use.  Others can
override these methods if they desire.

Note that the current pthread mutex implementation is a glorified
busy-wait.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove typedef for struct uthread
Barret Rhoden [Tue, 5 Jan 2016 12:14:06 +0000 (07:14 -0500)]
Remove typedef for struct uthread

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix the lack of a return in sigreturn (XCC)
Barret Rhoden [Fri, 18 Dec 2015 21:43:49 +0000 (16:43 -0500)]
Fix the lack of a return in sigreturn (XCC)

Rebuild glibc, if you happen to need sigreturn to actually return a value.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllows IRQs to be disabled while proc_destroy()ing
Barret Rhoden [Wed, 6 Jan 2016 17:36:38 +0000 (12:36 -0500)]
Allows IRQs to be disabled while proc_destroy()ing

While cleaning up the various places in trap handling code where IRQs
are enabled, I noticed we were enabling it before calling
proc_destroy().

Thanks to git-blame and a good commit message, it turns out that we
don't need this any more (and haven't for quite a while).  This was
originally done in commit 850e1a46dbe8 ("Ensures IRQs are enabled when
proc_destroy()ing"), and this commit mostly undoes that commit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoProperly finalize contexts when reflecting traps
Barret Rhoden [Wed, 6 Jan 2016 17:18:31 +0000 (12:18 -0500)]
Properly finalize contexts when reflecting traps

I missed this when doing the partial context work.  We were still doing
a manual copy of the context, which wasn't also calling
arch_finalize_ctx().  This means the core was in a potentially unstable
state.

I noticed this because a page faulting SCP was rebooting my VM.  I'm
surprised it didn't pop up earlier, since all it took was a null pointer
dereference.  Might be something weird with my VM.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix ipv6 icmp bugs in locking and freeing in icmphostunr() per current Plan 9.
Geoff Collyer [Tue, 12 Jan 2016 01:05:19 +0000 (17:05 -0800)]
Fix ipv6 icmp bugs in locking and freeing in icmphostunr() per current Plan 9.

Signed-off-by: Geoff Collyer <geoff@collyer.net>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoClean up 'devgen()' a bit.
Dan Cross [Fri, 8 Jan 2016 19:42:01 +0000 (14:42 -0500)]
Clean up 'devgen()' a bit.

Try to make this a tad cleaner and clearer, and be a bit more
defensive in the implementation. In particular, we try to check
the validity of table the table index and associated entry before
dereferencing, thus ensuring the function's preconditions hold.

Clean up the comments a bit, to make it less ambiguous whether
they refer to '.' or '..'. Also fix a (presumed?) grammar error.

Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCreated a new Makefrag-user-app helper for building binaries
Davide Libenzi [Tue, 15 Dec 2015 23:46:36 +0000 (15:46 -0800)]
Created a new Makefrag-user-app helper for building binaries

Created a new Makefrag-user-app helper for building binaries.
It works on a similar line of Makefrag-user-lib, allowing apps to
specify a minimal makefile, and providing clean stdout output.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[touched up some comments leftover from Makefrag-user-lib]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow for certain device APIs to be NULL
Davide Libenzi [Tue, 15 Dec 2015 22:42:17 +0000 (14:42 -0800)]
Allow for certain device APIs to be NULL

Allow for certain device APIs to be NULL, to avoid simple devices to
have to declare them empty, and populate the devtab with them.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMade Akaros perf to use the new #version device for kernel path
Davide Libenzi [Tue, 15 Dec 2015 14:07:23 +0000 (06:07 -0800)]
Made Akaros perf to use the new #version device for kernel path

Made Akaros perf to use the new #version device for kernel path.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded #version device
Davide Libenzi [Tue, 15 Dec 2015 04:23:39 +0000 (20:23 -0800)]
Added #version device

Added #version device to host the Akaros build version information.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemoved from source control auto generated file
Davide Libenzi [Tue, 15 Dec 2015 21:47:16 +0000 (13:47 -0800)]
Removed from source control auto generated file

Removed from source control auto generated file.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded makefile machinary to generate the build information data
Davide Libenzi [Tue, 15 Dec 2015 03:15:35 +0000 (19:15 -0800)]
Added makefile machinary to generate the build information data

Added makefile machinary to generate the build information data.
A kern/src/build_info.c is automatically generated, exporting build
information.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded weak attribute definition
Davide Libenzi [Tue, 15 Dec 2015 13:37:41 +0000 (05:37 -0800)]
Added weak attribute definition

Added weak attribute definition.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded new kmalloc flag KMALLOC_ERROR
Davide Libenzi [Tue, 8 Dec 2015 19:58:57 +0000 (11:58 -0800)]
Added new kmalloc flag KMALLOC_ERROR

Added new kmalloc flag KMALLOC_ERROR, to allow kernel allocation APIs to
throw error() in case of memory allocation failures.
This in turn allow code not to check for kmalloc return code, even in
case where KMALLOC_WAIT would not fit the model.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoShould be index 2, not index 3
Kevin Klues [Thu, 8 May 2014 03:58:32 +0000 (20:58 -0700)]
Should be index 2, not index 3

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoClean up the PTE() macro (XCC)
Barret Rhoden [Thu, 17 Dec 2015 19:31:19 +0000 (14:31 -0500)]
Clean up the PTE() macro (XCC)

The PTE macro was a bit of a mess.  Every user of it had the PA handy.  But
they always converted to the PPN.  Plus, x86's kpte_write() wasn't even
using it.

It also didn't need to be in a kernel header, which was causing some
collisions for some applications.  The mmu header is so that userspace can
be aware of their address space and walk their own page tables.  PTE() was
something that could build a page table entry, which they don't need.

I didn't compile the RISC-V stuff.  It's slowly rotting.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove unused helpers from mmu.h (XCC)
Barret Rhoden [Thu, 17 Dec 2015 19:14:50 +0000 (14:14 -0500)]
Remove unused helpers from mmu.h (XCC)

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd correct headers to parlib-compat.c (XCC)
Barret Rhoden [Thu, 17 Dec 2015 18:44:53 +0000 (13:44 -0500)]
Add correct headers to parlib-compat.c (XCC)

Rebuild glibc.  A full make xcc-upgrade-from-scratch should work.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake glibc's printf with a vcore-ctx aware (XCC)
Barret Rhoden [Mon, 14 Dec 2015 20:04:47 +0000 (15:04 -0500)]
Make glibc's printf with a vcore-ctx aware (XCC)

This is a follow-up to commit 36acdc59f895 ("Override glibc's printf for
vcore context").

Using a #define for printf turned into a mess.  This approach accomplishes
the same goals (printf can be safely called from vcore context), but
without preprocessor magic.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoClean up ros_vdebug* interfaces
Barret Rhoden [Mon, 14 Dec 2015 19:55:29 +0000 (14:55 -0500)]
Clean up ros_vdebug* interfaces

Mostly just a rename and removing some of the unused parts of the
interface.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove ros_debug()
Barret Rhoden [Mon, 14 Dec 2015 19:53:55 +0000 (14:53 -0500)]
Remove ros_debug()

Right now, it's a wrapper for akaros_printf().  Shortly, glibc's printf
will do the same thing that akaros_printf() does, so we can just call it
directly.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDo not call printf from sigaction (XCC)
Barret Rhoden [Mon, 14 Dec 2015 19:44:46 +0000 (14:44 -0500)]
Do not call printf from sigaction (XCC)

Right now, it's okay, since parlib redefines printf to akaros_printf.  That
tricks whatever dark magic that triggers the 'multiple libcs' problem.  But
when we fix printf to not use a macro-based solution, this breaks.

Until we understand more, we need to continue to be careful about where we
call printf or similar functions within glibc.  Normally, we'll find out
when the toolchain build fails, but with the #undef printf in
parlib/stdio.h, we were hiding those failures.  That will be fixed shortly.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMove print_user_context out of a header
Barret Rhoden [Mon, 14 Dec 2015 19:39:28 +0000 (14:39 -0500)]
Move print_user_context out of a header

The printf's are problematic in a header.  Specifically when we include and
use those functions from within parts of glibc, we can trigger the dreaded
'multiple libc' problem when building glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix comments in vcore.h
Barret Rhoden [Mon, 14 Dec 2015 19:14:28 +0000 (14:14 -0500)]
Fix comments in vcore.h

The definition of these variables and functions has moved over the years.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Detect and handle missing perf support
Barret Rhoden [Wed, 16 Dec 2015 22:14:36 +0000 (17:14 -0500)]
x86: Detect and handle missing perf support

If a machine has perf version 0, which is the case for my Qemu, we'll get a
GPF during initialization.  The per core initialization and any accesses to
the Qperf file will abort if we don't have the right version.

This assumes that if open of a Qperf fails, that there is no other way for
the user to trigger access to the perf MSRs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMove Linux perf format conversion into perf tool, drop kprof2perf
Davide Libenzi [Sun, 13 Dec 2015 17:02:21 +0000 (09:02 -0800)]
Move Linux perf format conversion into perf tool, drop kprof2perf

Move Linux perf format conversion into perf tool, drop kprof2perf.
Adding a new info field to the Akaros perf traces, and translating it to
the Linux perf format, requires access to the libpfm4 library.
At that point it is better to drop the kprof2perf tool, and have Akaros
perf directly emit the Linux perf format.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoEmit build information file into KFS /etc/build.info
Davide Libenzi [Sun, 13 Dec 2015 21:58:20 +0000 (13:58 -0800)]
Emit build information file into KFS /etc/build.info

Emit build information file into KFS /etc/build.info

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImplement flush capability for the profiler tracing data
Davide Libenzi [Sun, 13 Dec 2015 21:38:42 +0000 (13:38 -0800)]
Implement flush capability for the profiler tracing data

Implement flush capability for the profiler tracing data, to allows the
per CPU buffers to be writing into the main queue, so that data is
visible from the user POV.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoEnable the PFM sampling to pass an 64bit info value
Davide Libenzi [Sat, 12 Dec 2015 21:35:31 +0000 (13:35 -0800)]
Enable the PFM sampling to pass an 64bit info value

Enable the PFM sampling to pass an 64bit info value to allow userspace
to distinguish among samples.
As part of this CL, the enabling and disabling of the profiler has been
improved by using call-in-all-cores APIs.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded new perf utility to access CPU counters from userspace
Davide Libenzi [Mon, 16 Nov 2015 15:05:47 +0000 (07:05 -0800)]
Added new perf utility to access CPU counters from userspace

Added new perf utility to access CPU counters from userspace.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCreated the new devarch perf file using the perfmon infrastructure
Davide Libenzi [Sun, 29 Nov 2015 02:35:57 +0000 (18:35 -0800)]
Created the new devarch perf file using the perfmon infrastructure

Created the new devarch perf file using the perfmon infrastructure.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded perfmon interrupt handling to allow overflow based profiling
Davide Libenzi [Mon, 16 Nov 2015 15:13:13 +0000 (07:13 -0800)]
Added perfmon interrupt handling to allow overflow based profiling

Added perfmon interrupt handling to allow overflow based profiling.
This allow to set the INT bit in the Intel perfmon counter
configuration, and, by setting an initial counter value close to
the overflow, to sample code which triggers overflowing the most.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[checkpatch complaints]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded bitfield manipulation machinery (XCC)
Davide Libenzi [Mon, 14 Dec 2015 21:46:12 +0000 (13:46 -0800)]
Added bitfield manipulation machinery (XCC)

Added bitfield manipulation machinery, in order to make it easier to
manipulate them.

Reinstall your kernel headers

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[XCC / reinstall notice]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMigrated devarch MSR access to new MSR API
Davide Libenzi [Fri, 27 Nov 2015 18:57:19 +0000 (10:57 -0800)]
Migrated devarch MSR access to new MSR API

Migrated devarch MSR access to new MSR API.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReverted /prof/kpctl interface to split start and timer
Davide Libenzi [Tue, 1 Dec 2015 02:14:03 +0000 (18:14 -0800)]
Reverted /prof/kpctl interface to split start and timer

Reverted /prof/kpctl interface to split start and timer.
Given that now tracing can be enabled besides from timers, the start of
the timers has been brought back to be a separate operation.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSTFU useless printk messages
Davide Libenzi [Tue, 1 Dec 2015 02:15:28 +0000 (18:15 -0800)]
STFU useless printk messages

STFU useless printk messages.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMoved MSR read/write APIs out of devarch and into a dedicated file
Davide Libenzi [Tue, 24 Nov 2015 23:56:48 +0000 (15:56 -0800)]
Moved MSR read/write APIs out of devarch and into a dedicated file

Moved MSR read/write APIs out of devarch and into a dedicated file.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded API for read/write common integer sizes from/to memory
Davide Libenzi [Sat, 28 Nov 2015 16:32:11 +0000 (08:32 -0800)]
Added API for read/write common integer sizes from/to memory

Added API for read/write common integer sizes from/to memory.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded error_assert() macro and used branch hinting
Davide Libenzi [Mon, 30 Nov 2015 04:04:17 +0000 (20:04 -0800)]
Added error_assert() macro and used branch hinting

Added error_assert() macro and used branch hinting. The error assert
macro issues and error() in case of failed assertion, instead of a panic().

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDrop the fake exception tables entries and use weak symbols
Davide Libenzi [Tue, 1 Dec 2015 16:17:51 +0000 (08:17 -0800)]
Drop the fake exception tables entries and use weak symbols

Drop the fake exception tables entries and use weak symbols.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded ability to declare local per CPU variables
Davide Libenzi [Mon, 16 Nov 2015 22:53:23 +0000 (14:53 -0800)]
Added ability to declare local per CPU variables

Added ability to declare local per CPU variables.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded libpfm4 library support
Davide Libenzi [Mon, 16 Nov 2015 15:03:55 +0000 (07:03 -0800)]
Added libpfm4 library support

Added libpfm4 library support. The libpfm4 library provides a database
of counters available on different Intel platforms.
The library source was fetched from its home page:

http://perfmon2.sourceforge.net/

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFixed the sys_proc_create API to use const pointers (XCC)
Davide Libenzi [Wed, 2 Dec 2015 17:20:41 +0000 (09:20 -0800)]
Fixed the sys_proc_create API to use const pointers (XCC)

Fixed the sys_proc_create API to use const pointers.

Rebuild glibc.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[XCC / rebuild notice]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake some macros correct when used within IF clauses without brackets
Davide Libenzi [Fri, 11 Dec 2015 20:02:25 +0000 (12:02 -0800)]
Make some macros correct when used within IF clauses without brackets

Make some macros correct when used within IF clauses without brackets.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded ZERO_DATA() and COUNT_OF() macros to common.h (XCC)
Davide Libenzi [Fri, 27 Nov 2015 17:16:07 +0000 (09:16 -0800)]
Added ZERO_DATA() and COUNT_OF() macros to common.h (XCC)

Added ZERO_DATA() and COUNT_OF() macros to common.h.
The ARRAY_SIZE(), when exported from ros/common.h, fights with other
userspace code redefining it.
So export it using COUNT_OF(), and make ARRAY_SIZE() use COUNT_OF().

Reinstall your kernel headers.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
[XCC / reinstall notice]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake disable MTRRs the defaul configuration option
Davide Libenzi [Tue, 24 Nov 2015 20:48:05 +0000 (12:48 -0800)]
Make disable MTRRs the defaul configuration option

Make disable MTRRs the defaul configuration option.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded intptr_t definition and made error pointer code use them
Davide Libenzi [Fri, 27 Nov 2015 15:33:34 +0000 (07:33 -0800)]
Added intptr_t definition and made error pointer code use them

Added intptr_t definition and made error pointer code use them.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix test_uaccess
Barret Rhoden [Tue, 15 Dec 2015 17:26:51 +0000 (12:26 -0500)]
Fix test_uaccess

It needed a switch_to(tmp).  I also reorganized it so that we can clean up
after a failure.  For instance, we need to switch_back and decref tmp.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRename backtrace_kframe -> backtrace_hwtf [2/2]
Barret Rhoden [Thu, 10 Dec 2015 16:01:13 +0000 (11:01 -0500)]
Rename backtrace_kframe -> backtrace_hwtf [2/2]

Everywhere that we were backtracing a kernel HW TF, we can now just
backtrace_hwtf, which can tell the difference between the user and kernel
TFs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRefactors backtrace functions [1/2]
Barret Rhoden [Thu, 10 Dec 2015 15:56:08 +0000 (10:56 -0500)]
Refactors backtrace functions [1/2]

We had a mess of functionality with repeated code in various spots, which
made it difficult to add new features.

As part of this, we have backtrace_hwtf(), which can print out the
appropriate BT based on whether the TF is the kernel's or the user's.  This
means that CTRL-B will work on user TFs, and it will spit out text (via
printk) that can be processed with scripts/bt-akaros.sh.

So now the answer to "how do I backtrace a deadlocked user SCP" is
"CTRL-B", instead of a long discussion.  =)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPut a 1ms delay in kfs_readpage()
Barret Rhoden [Tue, 8 Dec 2015 20:52:06 +0000 (15:52 -0500)]
Put a 1ms delay in kfs_readpage()

The slight slowdown for our infrastructure work is worth the debugging,
enough so that I don't even want this to be a config option.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow syscall-less abortable CLEs
Barret Rhoden [Tue, 8 Dec 2015 20:44:41 +0000 (15:44 -0500)]
Allow syscall-less abortable CLEs

That assert was for safety, but I think we are fine without it.  Later on,
we branch on cle->sysc anyways.

Here's a scenario that could trigger this.  I tend to put:

kthread_usleep(1000);

in kfs_readpage() to simulate having a filesystem that could actually
block.  We take a page fault and attempt to load the page.  kfs_readpage
eventually gets called and blocks.

Recently I changed kthread_usleep() to use rendezes, which are abortable.
Now we hit this assert.

The thing is that we don't have a syscall since the user never issued one.
The page fault is an implicit syscall.

Right now, the only time this happens is when an SCP faults on a
file-backed VMR.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix up user memory accesses during syscall aborts
Barret Rhoden [Tue, 8 Dec 2015 20:40:05 +0000 (15:40 -0500)]
Fix up user memory accesses during syscall aborts

Syscall aborting peaks at the syscall, which is usually in user memory.
There are a couple different ways we can deal with it.  In some cases, such
as the atomic_or of the sysc->flag, we need to use waserror to catch it.

For other situations, we can do whatever we want.  I used copy_from_user(),
somewhat for the heck of it, and in part because I didn't want
__abort_all_sysc() to throw, yet.

I stumbled on this issue when looking at switch_to and which locks are held
when accessing user memory.  A few other panics led me here as well.  =)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: clean up __handle_page_fault()
Barret Rhoden [Tue, 8 Dec 2015 19:48:04 +0000 (14:48 -0500)]
x86: clean up __handle_page_fault()

Other than being a mess, there were a couple issues.  One change is that
IRQs are disabled for the entire trap handling.  We're in a kernel trap
handler - turning on IRQs could lead to a mess.  The other change is that
we call handle_page_fault_nofile().  If a user asks the *kernel* to operate
on an mmaped file addr, the kernel will not do this, and we'll end up
killing the process.  If there's a compelling case for handling this, then
we can add it back in later.  For now, I'm opting for safety.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoProvide handle_page_fault_nofile()
Barret Rhoden [Tue, 8 Dec 2015 19:44:58 +0000 (14:44 -0500)]
Provide handle_page_fault_nofile()

This allows us to specify whether we want file operations (page cache,
mostly) when we handle a page fault or not.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: remove misconceptions about "sti" and halting
Barret Rhoden [Tue, 8 Dec 2015 16:41:32 +0000 (11:41 -0500)]
x86: remove misconceptions about "sti" and halting

We need to atomically enable interrupts and halt.  Unbeknownst to
past-barret, sti doesn't take effect until after the *next* instruction.
The Good Book definitely says it too.

On a similar note, enabling and disabling IRQs in proc_restartcore() did
nothing.  It had a TODO to remove it anyways.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: pair disable_irqs with enable_irqs
Barret Rhoden [Tue, 8 Dec 2015 16:32:53 +0000 (11:32 -0500)]
x86: pair disable_irqs with enable_irqs

We were being a little sloppy and should be more explicit about our use of
enabling/disabling IRQs.  If we enable irqs at a certain point, we should
turn them back off later instead of assuming someone downstream will do it.
It's more of a whitelist approach to when IRQs are on.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDo not disable IRQs to protect cur_ctx
Barret Rhoden [Mon, 7 Dec 2015 23:36:28 +0000 (18:36 -0500)]
Do not disable IRQs to protect cur_ctx

Back in the day, current_ctx needed to be protected against interrupts.
That was when the process management kernel messages were IMMEDIATE.
Nowadays, they are ROUTINE, and you don't need IRQ protections.

I think.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDo not switch_to in plan9setup()
Barret Rhoden [Mon, 7 Dec 2015 23:32:19 +0000 (18:32 -0500)]
Do not switch_to in plan9setup()

We needed that back when the genbuf was attached to current.  genbuf is now
per-kthread (and it has been for the majority of its existence).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMark kthreads as ktasks for kernel I/O [2/2]
Barret Rhoden [Mon, 7 Dec 2015 22:23:32 +0000 (17:23 -0500)]
Mark kthreads as ktasks for kernel I/O [2/2]

We had been just doing a switch_to(0).  That's pretty nasty.  Previously,
it'd just blow up if we blocked in KFS (which is how I've been running into
these problems).  That was because we'd switch_to 0, have no current,
block, restart, then not reset current (or decref), as in the switch_to
ktask case.

Now, we aren't using current to tell if we should save the addr space or
not, but we still shouldn't be switch_to(0).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDetermine bufs with is_ktask in the VFS [1/2]
Barret Rhoden [Mon, 7 Dec 2015 23:27:55 +0000 (18:27 -0500)]
Determine bufs with is_ktask in the VFS [1/2]

We had been using the existence of current to signal whether or not we want
to operate on the kernel's behalf.  Use is_ktask() instead.

This doesn't solve the overall issue with KFOP (kernel file operation).  We
should either just use waserror() protected memcpy() calls or take out the
is_user_r{w,}addr() calls from copy_to_user.  The checks on the validity of
a user's address must be done on entry (e.g. syscall.c).  It's not clear
that we need to do the checks later on, especially if it requires the
is_ktask() hassle (especially since these only pop up when there's a bug).

This will build, but all of the kernel ops will fail until the next patch.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow ktasks to switch_to()
Barret Rhoden [Mon, 7 Dec 2015 21:40:00 +0000 (16:40 -0500)]
Allow ktasks to switch_to()

We had been doing this for a while, but it was buggy.

Ktasks that did a switch_to and then blocked could come back and be in a
different address space, since sem_down()/restart_kthread() didn't know
that suddenly a ktask cared about its address space.  One possibility is
that the kernel would wildly write into the wrong process's address space.

This also may have been a source of bugs where processes wouldn't die
(which is something I found while debugging it).  It sounds familiar; SCPs
not dying under heavy network load to MCPs (IIRC).

Here's the scenario as of a few patches ago:
- A ktask does a switch_to.  old_proc = 0, current = new_proc.  There's no
  refcnting involved.
- The ktask blocks.  Since it was a ktask, in sem_down() kth->proc = 0
- Something else runs, say process 6.  That takes an IRQ that restarts the
  ktask.  That process is still current, and restart_kthread is fine with
that (since ktasks usually ignore whatever process they are in).  Still no
changes to refcnts, and PID 6 is still current.
- The ktask calls switch_back(new_proc, old_proc).  This sets current =
  old_proc, clobbering PID 6's current.  That was a ref counted pointer,
which means we now have an extra ref on PID 6 that will never go away.
That means PID 6 will be stuck DYING forever.

switch_back() had an assumption that new == old, which wasn't playing well
with sem_down's decision to save a ref on current, and restart_kthread's
decision about when to replace current.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoHave switch_{to,back} use an opaque uintptr_t
Barret Rhoden [Mon, 7 Dec 2015 21:31:40 +0000 (16:31 -0500)]
Have switch_{to,back} use an opaque uintptr_t

The value happens to include a struct proc *, but users of switch_{to,back}
should not assume that.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse a temp process for test_uaccess
Barret Rhoden [Thu, 10 Dec 2015 16:19:30 +0000 (11:19 -0500)]
Use a temp process for test_uaccess

The usage of switch_to(0) is a little problematic.  This way, we just have
a temp process and can control its address space for the tests.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse a kthread flag to save the address space
Barret Rhoden [Mon, 7 Dec 2015 20:46:42 +0000 (15:46 -0500)]
Use a kthread flag to save the address space

Previously, it was assumed that ktasks never care about their address
space.  This is not true - some ktasks (full ktasks with names, RKMs,
things executing in the kernel on their own, etc) may want to send an
event.

Now, with this flag, we can fix switch_to for ktasks.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDefine a set of default flags for kthreads
Barret Rhoden [Mon, 7 Dec 2015 20:28:27 +0000 (15:28 -0500)]
Define a set of default flags for kthreads

The default flags are those for general purpose kthreads: they handle user
space syscalls and IRQs while processes are running.  In contrast, a ktask
is a special case of a kthread.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoTrack ktasks with a flag instead of a bool
Barret Rhoden [Mon, 7 Dec 2015 15:59:50 +0000 (10:59 -0500)]
Track ktasks with a flag instead of a bool

I'll have more flags shortly.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix lock debugging issue with page faults and IRQs
Barret Rhoden [Fri, 4 Dec 2015 20:48:02 +0000 (15:48 -0500)]
Fix lock debugging issue with page faults and IRQs

There was a brief window between enabling IRQs and disabling lock checking.
If you receive an IRQ in here and that IRQ grabs a lock (e.g. timer IRQ),
you'll panic.

If you build with spinlock debugging and execute something like:

/ $ ash looper.sh prov -p1 -tc -m > /dev/null

and wait a minute or two, you'll catch a bug.  What's going on is that
looper and prov eventually get the kernel to trigger a soft page fault.
Then we get an IRQ during the window after enable_irq.  The lock debugger
flips out since we grab a lock with a kernel trap depth, which is
dangerous.  The old code was trying to work around this by disabling the
debugger, but it should have done so before enabling interrupts.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFlags RSI, RDI, ECX as RW operands so that GCC does not assume const
Davide Libenzi [Thu, 10 Dec 2015 03:55:47 +0000 (19:55 -0800)]
Flags RSI, RDI, ECX as RW operands so that GCC does not assume const

Flags RSI, RDI, ECX as RW operands so that GCC does not assume const.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse core_id_early() in kprof trace buffer print code
Davide Libenzi [Tue, 8 Dec 2015 01:42:25 +0000 (17:42 -0800)]
Use core_id_early() in kprof trace buffer print code

Use core_id_early() in kprof trace buffer print code.

Signed-off-by: Davide Libenzi <dlibenzi@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a test program for reproducing bugs related to too many block extra data slots
Xiao Jia [Thu, 3 Dec 2015 23:20:01 +0000 (15:20 -0800)]
Add a test program for reproducing bugs related to too many block extra data slots

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agomlx4: Enable TX checksum offload
Xiao Jia [Thu, 3 Dec 2015 23:20:00 +0000 (15:20 -0800)]
mlx4: Enable TX checksum offload

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agomlx4: Fix cq by using irqsave spin lock
Xiao Jia [Thu, 3 Dec 2015 23:19:59 +0000 (15:19 -0800)]
mlx4: Fix cq by using irqsave spin lock

Signed-off-by: Xiao Jia <stfairy@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix a deadlock bug in MCS-PDR locks
Barret Rhoden [Fri, 4 Dec 2015 20:31:03 +0000 (15:31 -0500)]
Fix a deadlock bug in MCS-PDR locks

The MCS-PDR locks have an optimization built in where most vcores ensure the
lockholder runs.  The other style is to ensure whoever is directly ahead in
line (the predecessor) runs, which we fall back to in some tricky corner
cases.  That all is fine.

In the unlock case, the lockholder needs to ensure whoever is next in line
runs (the lockholder's successor).  Waiting on a_tail requires that
everyone in line is ensuring their predecessor runs, which is not what
happens by default.  By clearing the lockholder_vcoreid, we can fall back
to this "get out of corner cases by following the chain" approach.

I've been chasing this one off and on for a couple years.  I managed to
recreate it once or twice and was able to peak at the userspace contexts.
I could see all but one of them were calling ensure_vcore_runs(2), and VC 2
was calling ensure_vcore_runs(1).  Two other vcores were preempted.  I
could see VC 2 was in an unlock.  There were no syscalls coming from that
process.

It was actually simple after that.  What happened was that a vcore signed
up for the lock (L391), but hadn't set pred->next yet (L396).  Then it gets
preempted.  VC 2 was its pred, and it acquired the lock with no issues.
When it went to unlock, it needed to ensure it's successor was running.  VC
2 was the lockholder_vcoreid.  Everyone in the chain behind the preempted
VC kept ensuring 2 ran.  No one ensured the preempted VC ran.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Use partial contexts for all entries [2/2]
Barret Rhoden [Wed, 2 Dec 2015 18:39:28 +0000 (13:39 -0500)]
x86: Use partial contexts for all entries [2/2]

Syscalls, traps, and IRQs all use partial contexts when entering from
userspace.  Note that the traps and IRQs that occur while a kernel context
is running does not mess with swapgs or partial contexts.  Partial contexts
(and pcpui current_ctx in general) has nothing to do with the kernel's
context / HW TF.  They are for user contexts.

This change takes about 260ns off of a sys_null() call, and we're down to
about 220ns (on my devbox).  Quite an improvement.  The expensive bit was
messing with the TLS MSRs, since those operations are unfortunately slow.
This isn't true on more recent x86 machines, which have support for fast
instructions to change the GS and FS base.  However, many machines,
(notable Qemu) do not support those instructions, and we'd need the kernel
and userland to decide which method of changing GS/FS to use, either during
compilation or at runtime.

In the long run, with support for quickly changing the TLS, the hardware
and software partial contexts savings won't be as important.  But partial
contexts are likely to be important for the upcoming virtual machine
context type.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Add support for partial contexts [1/2]
Barret Rhoden [Wed, 2 Dec 2015 17:20:01 +0000 (12:20 -0500)]
x86: Add support for partial contexts [1/2]

This adds the arch-specific handling for partial contexts within the
kernel's C code.  As of this commit, there are no partial contexts;
everything that comes in from trapentry62.S is a full context.

For hardware and software contexts, the distinction in x86 is whether or
not TLS MSRs are dealt with.  For partial contexts, GS is the kernel's
desired GS, MSR_KERNEL_GS_BASE is the user's old GS, and FS is the user's
FS.  The TF's GS and FS are 0.  After finalization, the GS is still the
kernel's GS.  MSR_KERNEL_GS_BASE is the kernel's GS, and the TF has the
user's GS and FS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSupport partial contexts
Barret Rhoden [Fri, 20 Nov 2015 00:22:08 +0000 (16:22 -0800)]
Support partial contexts

Partial contexts are those where the full context is split between the
parts in the struct and the parts still loaded in hardware.

When entering the kernel, the kernel only needs to save enough of the
context so that it can perform its work.  The hardware may have other
bits of context that remain, and we'll copy out that state once we think
we are not going to return to the (previously) current context.

The rule is that if we ever either:
1) run the context somewhere else, or
2) run another context here

then we need to finalize the context, by ripping it off the core
completely.

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