akaros.git
2 years agovmm: Attempt to backtrace the guest on error
Barret Rhoden [Thu, 5 Oct 2017 15:49:03 +0000 (11:49 -0400)]
vmm: Attempt to backtrace the guest on error

Build the guest with CONFIG_FRAME_POINTER.

You can backtrace it with the usual bt-akaros.sh.  You'll need to point
bt-akaros's BIN_PATH to your vmlinux.  Here's what I do:

BIN_PREFIX=PATH_TO_THE_REPO/linux-guest/ ~/scripts/bt-akaros.sh

e.g.

echo '#01 Addr 0xffffffff81480cda is in vmlinux at offset 0xffffffff81480cda
 #02 Addr 0xffffffff81480d0f is in vmlinux at offset 0xffffffff81480d0f
 #03 Addr 0xffffffff813f8e37 is in vmlinux at offset 0xffffffff813f8e37'
 | BIN_PREFIX=../linux-guest/ ~/scripts/bt-akaros.sh

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd backtrace_current_ctx()
Barret Rhoden [Fri, 29 Sep 2017 14:36:31 +0000 (10:36 -0400)]
Add backtrace_current_ctx()

This is a convenience helper.  I'll use it for one-off tracing attempts.
For instance, in sys_openat(), you can do this:

if (!strcmp(path, "hello.txt"))
backtrace_current_ctx();

And then at runtime when catting hello.txt you'll see:

Backtrace of user context on Core 0:
Offsets only matter for shared libraries
 #01 Addr 0x00003000000d2cee is in libc-2.19.so at offset 0x00000000000d0cee
 #02 Addr 0x00003000000ca200 is in libc-2.19.so at offset 0x00000000000c8200
 #03 Addr 0x0000000000415f47 is in busybox at offset 0x0000000000015f47
 #04 Addr 0x002f3d4457500074 has no VMR

which you can pipe through scripts/bt-akaros.sh.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoTrack errno and errstr in the kthread
Barret Rhoden [Thu, 28 Sep 2017 21:50:23 +0000 (17:50 -0400)]
Track errno and errstr in the kthread

Using user memory was slightly dangerous.

First, there are some places in the kernel where we'd read errno/errstr
and make decisions based on it.  Userspace could influence those
decisions - often to their detriment, but perhaps to the kernel's.

The other issue is that the kernel could PF setting errno or errstr,
perhaps if userspace unmaps their syscall struct.  Now, the only places
where that can happen are controlled.  Since we'll want to call error()
(setting errno/errstr) from kernel PF contexts, we don't want to
possibly PF again.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRefactor uses of finish_{current_,}syscall
Barret Rhoden [Thu, 28 Sep 2017 21:50:08 +0000 (17:50 -0400)]
Refactor uses of finish_{current_,}syscall

There are a few things that get done for every syscall, and the list is
growing: delete the save_str, finish the trace, finish the sysc, etc.
It gets a little nasty due to exec() and fork(), as always.  Yield is
pretty simple, by comparison.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix devalarms on forks without exec
Barret Rhoden [Thu, 28 Sep 2017 14:54:06 +0000 (10:54 -0400)]
parlib: Fix devalarms on forks without exec

After the fork, the child would close the alarm FDs, which are the
parent's alarm FDs.  However, it wouldn't get its own alarms until exec,
during the ctor.  For processes that forked but never execed, they
wouldn't have the alarm service available.

I noticed this when the process's child was trying to close those -42
FDs when the process forked. (e.g. db -> db -> sh).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoepoll: Fix leaked listen bug (XCC)
Barret Rhoden [Thu, 28 Sep 2017 01:40:03 +0000 (21:40 -0400)]
epoll: Fix leaked listen bug (XCC)

During the close callbacks for a data FD, the rock CB was called first.
That would close the listen FD (if it was open).  Then we'd call the
epoll CB, which would do an __epoll_ctl_del().  That would open the
listen FD.  However, at that point, the callback that would make sure
the listen FD was closed wouldn't run (it already ran).

The end result for dropbear was that listen FDs were getting leaked.
The DB parent would have the child's listen line open (e.g.
/net/tcp/1/listen, while the child had 1/data).  The child also had the
parent's 0/listen.  The latter had the effect of us never being able to
restart sshd while a client was connected, since someone would always be
listening on port 22.

Rebuild glibc and dropbear.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd strace info for SYS_tap_fds
Barret Rhoden [Thu, 28 Sep 2017 01:03:52 +0000 (21:03 -0400)]
Add strace info for SYS_tap_fds

Now we can tell what sort of taps the user is attempting.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUse the better hash multiplier for __generic_hash
Barret Rhoden [Wed, 27 Sep 2017 21:20:57 +0000 (17:20 -0400)]
Use the better hash multiplier for __generic_hash

I added Linux's hash.h a while back, but didn't update __generic_hash,
which was using the hardcoded GOLDEN_RATIO_PRIME_32.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove old PER_CPU_THING
Barret Rhoden [Wed, 27 Sep 2017 21:03:38 +0000 (17:03 -0400)]
Remove old PER_CPU_THING

This might have been from Ivy.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoDiscard leading 'm ' from monitor commands
Barret Rhoden [Wed, 27 Sep 2017 20:59:45 +0000 (16:59 -0400)]
Discard leading 'm ' from monitor commands

If you use 'm' a lot, when you are actually in the kernel monitor, you
may type 'm COMMAND' out of habit.  This will ignore the 'm' and execute
the command.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd monitor helpers for hexdump and pahexdump
Barret Rhoden [Wed, 27 Sep 2017 20:40:20 +0000 (16:40 -0400)]
Add monitor helpers for hexdump and pahexdump

Hexdump takes a PID.  Use 0 for the kernel or "don't care."

There are shortcuts too: 'hd' for hexdump and 'phd' for pahexdump.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix leaked proc refcnt in showmapping
Barret Rhoden [Wed, 27 Sep 2017 20:38:10 +0000 (16:38 -0400)]
Fix leaked proc refcnt in showmapping

You'd only trigger this if you were using monitor functions.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovfs: Update atime/mtime/ctime
Barret Rhoden [Wed, 27 Sep 2017 20:13:47 +0000 (16:13 -0400)]
vfs: Update atime/mtime/ctime

I noticed we weren't tracking these in the VFS when trying to see if
ssh+scp was working.  Even though that code is old and destined for the
dumpster, I'd rather fix it a little and not waste time wondering if I
actually changed a file or not.

This is far from perfect, especially in that we don't tell the
filesystem that we updated an inode, but that goes for all of the VFS.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUse AKAROS_ROOT in bt-akaros.sh
Barret Rhoden [Wed, 27 Sep 2017 19:16:16 +0000 (15:16 -0400)]
Use AKAROS_ROOT in bt-akaros.sh

This way people can use the script without modification or adding extra
variables to their environment.

You can still override SOLIBS and BIN, either in your own script or in
your environment if you want to point at a different collection of
binaries (i.e. large ones that you don't want to put in KFS).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Squelch 'Unsupported IPI' for INIT/SIPI
Barret Rhoden [Wed, 27 Sep 2017 18:50:46 +0000 (14:50 -0400)]
vmm: Squelch 'Unsupported IPI' for INIT/SIPI

We let them attempt those IPIs, so it's not something to worry about.
These were noticeable if you launched a VM with a lot of cores.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Update the check for BRK_END
Barret Rhoden [Wed, 27 Sep 2017 18:42:47 +0000 (14:42 -0400)]
x86: Update the check for BRK_END

This was printing out warnings since the change to BRK_END.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Clarify cpuid 64 bit check
Barret Rhoden [Wed, 27 Sep 2017 18:37:15 +0000 (14:37 -0400)]
x86: Clarify cpuid 64 bit check

That bit wasn't checking FS/GS MSRs, it was checking for long mode
capability.  Long mode has those MSRs, so the check was working, but it
was confusing.  Since we only run on 64 bit x86, we can be more explicit
about what we're checking and why it failed.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix sleep 99999999
Barret Rhoden [Wed, 27 Sep 2017 18:30:57 +0000 (14:30 -0400)]
Fix sleep 99999999

Due to various int-vs-long issues, if you slept for 99999999, you'd
sleep for 275000000 usec (275 sec).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAllow INVPCID from the guest.
Gan Shun [Thu, 28 Sep 2017 19:25:01 +0000 (12:25 -0700)]
Allow INVPCID from the guest.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ib8226f5b936d15644a5d35b86f26488aa9696b47
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdded new Hypervisor signature for Akaros.
Gan Shun [Thu, 28 Sep 2017 18:03:53 +0000 (11:03 -0700)]
Added new Hypervisor signature for Akaros.

With this we can tell the guest that they are paravirt under akaros. We
also tell them we're KVM for now so it calls the requisite KVM
initialization functions.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ia420f8776887e7cd6a5adf8737d7ccd5639899ba
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Aggressively save and restore the FPU
Barret Rhoden [Tue, 26 Sep 2017 21:06:30 +0000 (17:06 -0400)]
parlib: Aggressively save and restore the FPU

Whenever we enter vcore context and the uthread's FP state might be
dirty (HW, VM ctxs, but not SW ctxs, which are cooperative), we
preemptively save the FP state, to include XMMs (on x86).

The rest of the patch is dealing with the consequences of that early
saving, notably that when we restart current_uthread, we'll have to
restore its FPU state.  There are also a few assertions that needed
flipped around.

The driver for this is that vcore context code continues to muck with
the XMM registers.  strlen(), snprintf(), memset(), and the list goes
on.  Until we can change glibc to be vcore-context-aware, this is the
best we can do.

The downside is that save/restore has noticeable costs.  On one machine,
the cost for a notify / software IPI is about 2850 cycles.  It's about
250 more when we do the save/restore too.  This affects every __notify
(event delivery), reflected trap, and vmexit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd tests for interference
Barret Rhoden [Tue, 26 Sep 2017 19:41:44 +0000 (15:41 -0400)]
Add tests for interference

The kernel test runs via kfunc.  The user test runs from userspace.
Both require running 'perf stat -e cycles sleep 99999999' or something
similar to turn on the pmc.

When running either test, you can kfunc ipi_spam to blast the core with
IPIs (spaced by 1 ms).  For userspace, you can notify PID 9 in a bash
for loop.

The userspace test can also be built for Linux, though you won't get the
histogram or other stats for values above the threshold.  If someone
wants to link in benchutil, then that should work.  I tried briefly, but
ld didn't like it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Add a couple helpers
Barret Rhoden [Tue, 26 Sep 2017 19:40:43 +0000 (15:40 -0400)]
parlib: Add a couple helpers

Including to misc-compat.h.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoDocumentation: document running go test with u-root
Ronald G. Minnich [Fri, 15 Sep 2017 16:34:23 +0000 (09:34 -0700)]
Documentation: document running go test with u-root

This documents how to package up an initramfs with u-root
to run go test. You can also use these instructions to package
up anything.

Change-Id: If1c15ed0fa5ee75127686c7c335cad8d3d8847b9
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[ trailing whitespace ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove deprecated/unused define in linuxemu.h
Zach Zimmerman [Fri, 22 Sep 2017 21:55:03 +0000 (14:55 -0700)]
Remove deprecated/unused define in linuxemu.h

We no longer need MAX_GPCs as gpcores are managed
by our vmm.

Change-Id: I0319345caa9620ca42f4e49d0bdc4f66e37ab684
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: tcp: Enforce reasonable 'acked' values
Barret Rhoden [Tue, 19 Sep 2017 18:56:07 +0000 (14:56 -0400)]
net: tcp: Enforce reasonable 'acked' values

If the distant end ACKs something outside the window, specifically an ACK
of 0 or less than una (perhaps out-of-order packets?), then 'acked' would
be negative.  That throws off everything, especially the qdiscard() call.
Then if qdiscard() does discard all of 'acked' (which it won't for negative
or very large 'acked'), it'll decrement flgcnt.  That will lead to us
sending FINs and advancing our seq by MTU, though the packets themselves
will have little data (unless we wanted to send something).

In short, madness.

I noticed this when a Layer 1 problem was causing a lot of packet loss.
It'd be nice to run Akaros on NS or some other simulator and see what
happens.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdded miscellaneous syscalls to linuxemu
Zach Zimmerman [Tue, 19 Sep 2017 00:09:12 +0000 (17:09 -0700)]
Added miscellaneous syscalls to linuxemu

These syscalls are implemented as a baseline
to get minimal functionality. They do not all work
in the general case.

Added rudimentary implementations for the following
additional system calls:

mincore
sigprocmask
sigaltstack
sigaction
epoll_create
epoll_wait
epoll_ctl
fstatfs
getgroups
geteuid
getegid
getuid
getgid
sched_getaffinity

Change-Id: I2f7b7517bda6e95dccab78d433e8bd267071fdc9
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoImplemented additional syscalls in linuxemu
Zach Zimmerman [Mon, 11 Sep 2017 18:54:01 +0000 (11:54 -0700)]
Implemented additional syscalls in linuxemu

Implemented fstat, stat, fallocate.
Implemented sleep functions features for pselect6
Implemented basic features of getrandom

Change-Id: Ia2b2d39f30155ee05c5a10ebdbcf9a053d0f2e7f
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove the frontend appserver code
Barret Rhoden [Sat, 16 Sep 2017 15:03:14 +0000 (11:03 -0400)]
Remove the frontend appserver code

The frontend code was for working with the RISC-V and SPARC boards.
Whenever we ever resurrect the RISC-V port, we can add support for
whatever they are using then.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove unused virtualization code
Barret Rhoden [Sat, 16 Sep 2017 14:56:13 +0000 (10:56 -0400)]
Remove unused virtualization code

I looked for any .c file that wasn't in a Kbuild, excluding the Linux
mlx4 and bnx2x drivers.  I also scanned the header files and checked any
suspcious ones to see if they were #included and used.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Added more syscalls and helpers to linuxemu
Zach Zimmerman [Fri, 8 Sep 2017 18:51:55 +0000 (11:51 -0700)]
vmm: Added more syscalls and helpers to linuxemu

Added the open, openat, unlinkat, readlinkat,
close, and sched_yield syscalls.

Added helpers and structures to manage fds and
file paths opend in linuxemu.

Fixed typing issue: mmap_file memsize and offset
params should be size_t

Change-Id: I7dafb65068189de706f849c41fb628267f558342
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ vmm tag and merge conflict ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add vthread_test
Barret Rhoden [Wed, 13 Sep 2017 21:14:43 +0000 (17:14 -0400)]
vmm: Add vthread_test

This creates and joins on a few threads, basically a 'hello world.'  It
also has examples of vthread apps adding their own vmcalls.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Support basic vthread syscalls
Barret Rhoden [Wed, 13 Sep 2017 18:45:14 +0000 (14:45 -0400)]
vmm: Support basic vthread syscalls

You can extend these if you want (example forthcoming), but most generic
vthread apps will want some basic vmcalls.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add vthread_join()
Barret Rhoden [Wed, 13 Sep 2017 17:31:41 +0000 (13:31 -0400)]
vmm: Add vthread_join()

The main idea is surprisingly easy - the controller needs to call
uth_2ls_thread_exit(), which is what normal threads call when they exit.
This is normally hidden by the 2LS.

A vthread can exit by making a vmcall, then the controller exits on its
behalf.  The joiner actually joins on the controller (which is a uthread),
instead of the guest_thread.

The slightly tricky part was getting the uthreads to be reinitialized
properly, and noting that the join exit callback is called from vcore
context.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow dynamic vthread creation
Barret Rhoden [Tue, 12 Sep 2017 17:31:03 +0000 (13:31 -0400)]
vmm: Allow dynamic vthread creation

Previously, when we first mucked with vthreads, we'd have to create all the
vthreads / GPCs / guest_threads in advance.  Now we can create them on the
fly.

vthread_alloc() also takes the GPCI, which is split out as another step.
The GPCIs are used for each individual GPC, and the guest_thread will
maintain the copy of the GPCI.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Rename root_mtx
Barret Rhoden [Thu, 14 Sep 2017 20:20:49 +0000 (16:20 -0400)]
vmm: Rename root_mtx

I'll need to use it for something else.  If it becomes a problem, we can
split the mutex up, or just not use it at all for the page tables (just map
it all).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Overhaul how vthread_create works
Barret Rhoden [Mon, 11 Sep 2017 21:56:48 +0000 (17:56 -0400)]
vmm: Overhaul how vthread_create works

vthread_attr_init() is gone.  That was a vestige of the "let me create the
threads implicitly and then have them ready later."

This splits vthread_create() into several helpers: allocation, context
initialization, and running.  The important part is splitting the
"creation" (allocation, setup, etc) from actually running it.

Some users, like dune, want to do stuff to the context after creating it,
but before creating the thread.  That's a mess.  You shouldn't access the
vm_tf before the thread was created!  We were getting by because we
declared the max number of vthreads in advance.

The old vthread_create() still works, though it returns a pointer to the
thread instead of success/fail.  It's just a convenience wrapper calling
the helpers.  It still takes the gpcid (guest), but that will change
shortly.  I kept the name intact, since it's similar to what people expect
from e.g. pthread_create.

As a side note, it was a bad sign that we didn't have a vthread struct or
header.  We might end up making vthreads more distinct from VMs in the
future.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Move the vmcall overrides to the VM struct
Barret Rhoden [Mon, 11 Sep 2017 20:49:57 +0000 (16:49 -0400)]
vmm: Move the vmcall overrides to the VM struct

The proximate cause of this is that vthreads is trying to set this before
creating the thread.  That's relying on the internals of vthreads having
actually made all the threads in advance.

Given that there's probably not a need to have the vmcall per vthread, we
can just do it per VM.  This also puts the vmcall hook right next to the
halt_exit hook.

Further, we don't need to copy the halt_exit hook to the gth either.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow dynamic growth of __gths
Barret Rhoden [Mon, 11 Sep 2017 20:23:56 +0000 (16:23 -0400)]
vmm: Allow dynamic growth of __gths

Right now the main vmm code doesn't use this.  There's really no need for
actual virtual machines.  Vthreads will use this later.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Use a helper for all gth lookups
Barret Rhoden [Mon, 11 Sep 2017 19:59:39 +0000 (15:59 -0400)]
vmm: Use a helper for all gth lookups

With one central lookup helper, I can grow the list dynamically.  I used
the compiler to find these cases, hence the name change of gths -> __gths.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Moves gpci into guest_thread
Barret Rhoden [Mon, 11 Sep 2017 19:41:08 +0000 (15:41 -0400)]
vmm: Moves gpci into guest_thread

It's a minor pain.  GPCI's are coupled 1:1 with guest threads.  However,
the info for their contents comes from vmrunkernel, not from libvmm (yet).
So for now, the GPCIs are passed to libvmm, which will make copies.

Overall, I want to cut down on the amount of lookups for structures based
on guest_pcoreid, since we'll soon have dynamically growing GPC lists.
That will require delicate synchronization, and I only want that in a few
places.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Move user_data to struct guest_thread (XCC)
Barret Rhoden [Mon, 11 Sep 2017 19:19:16 +0000 (15:19 -0400)]
vmm: Move user_data to struct guest_thread (XCC)

There's no need for it to be part of the gpci.  Soon, gpci will also hang
off the guest thread, as part of the "dynamic guest thread" changes.

This required a little cleanup for the VM LAPIC timer/alarms.  It's easier
to pass around pointers to the guest threads, since the gth can easily give
you the gpc_id and gpci.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Remove vthread_attr_kernel_init()
Barret Rhoden [Fri, 8 Sep 2017 20:34:11 +0000 (16:34 -0400)]
vmm: Remove vthread_attr_kernel_init()

Unused.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow the user to set GUEST_FS/GS_BASE (XCC)
Barret Rhoden [Fri, 8 Sep 2017 20:31:09 +0000 (16:31 -0400)]
vmm: Allow the user to set GUEST_FS/GS_BASE (XCC)

We'll need this for TLS for vthreads.  It's not particularly useful for
regular VMs.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Rename SYS_vmm_setup -> SYS_vmm_add_gpcs (XCC)
Barret Rhoden [Fri, 8 Sep 2017 20:06:25 +0000 (16:06 -0400)]
vmm: Rename SYS_vmm_setup -> SYS_vmm_add_gpcs (XCC)

You can call it as many times as you want, adding more guest physical cores
as you go.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Split VM creation into init and adding GPCs
Barret Rhoden [Fri, 8 Sep 2017 19:55:21 +0000 (15:55 -0400)]
vmm: Split VM creation into init and adding GPCs

This is part of allowing GPCs to be added on the fly.  Internally, the
kernel can handle *growing* the number at runtime.

One issue is that we can't be fully dynamic yet, and I put a cap of 512 in
place.  Once we have RCU, we can safely realloc the array of guest_pcore
pointers.

There's no change yet to the kernel ABI.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Use VMM_CTL to set VMM flags (XCC)
Barret Rhoden [Fri, 8 Sep 2017 18:20:17 +0000 (14:20 -0400)]
vmm: Use VMM_CTL to set VMM flags (XCC)

We had been setting the flags when we created the VM.  This lets us change
them on the fly - even if it's just a debugging flag.

I mostly wanted to separate out the flags from the initial setup, since
I'll turn the setup into "add guest pcores."

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Refactor vmm_ctl to use error()
Barret Rhoden [Fri, 8 Sep 2017 18:19:14 +0000 (14:19 -0400)]
vmm: Refactor vmm_ctl to use error()

Instead of set_error().  This will make an upcoming commit easier, and it
cleans things up a bit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: vmm: Allow VM uthreads to have no FP state
Barret Rhoden [Wed, 13 Sep 2017 19:56:06 +0000 (15:56 -0400)]
parlib: vmm: Allow VM uthreads to have no FP state

This is for freshly created or reinitialized guest_threads.  They will run
with whatever the current vcore's FP state was.  We were basically doing
that already.

If we really need VM threads to have no FP state, we can add a helper to
zero the FP state (e.g. set the xstate_bv bits to 0 on x86).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Don't require zeroing for uthread_init()
Barret Rhoden [Wed, 13 Sep 2017 19:53:49 +0000 (15:53 -0400)]
parlib: Don't require zeroing for uthread_init()

uthread_init() is meant to be called on a thread so that can be run again.
Instead of memsetting the entire thing to 0 (which is large), we should set
the things we care about to initial values.

Note we were never actually zeroing the threads before - we just would
catch bugs on occasion.  The important stuff is flags and sysc, so that's
what we zero.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix /proc/self/maps MAP_SHARED flag
Barret Rhoden [Fri, 8 Sep 2017 17:52:12 +0000 (13:52 -0400)]
Fix /proc/self/maps MAP_SHARED flag

Shared mappings get a 's', not a '-'.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Added initial pagetable setup code
Gan Shun [Wed, 6 Sep 2017 17:56:37 +0000 (10:56 -0700)]
vmm: Added initial pagetable setup code

This commit changes the way we set up initial pagetables for both
regular VMs and vthreads. We now parse /proc/self/maps to find out
what memory has been mapped in the process' space and create the
pagetables accordingly. Userspace can call add_pte_entries if they
want to add more entries after setup_paging has been called. Also
copied a CPUID helper function from Barret's fputest into parlib.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: I742e9c84e126b6d1688888255deac01b2843786e
[ removed vthread.c debug, unused ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Fix default FPU initialization
Barret Rhoden [Fri, 8 Sep 2017 16:45:40 +0000 (12:45 -0400)]
x86: Fix default FPU initialization

Our old method did not have a clear x87 state, which you could see by
looking at the xstate_bv bits.

I don't know if fxsave needs something similar.  Since I don't have a
machine that doesn't have xsaveopt, I'm not too concerned for now.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Fix cpuid detection
Barret Rhoden [Fri, 8 Sep 2017 16:44:38 +0000 (12:44 -0400)]
x86: Fix cpuid detection

You're only supposed to use the extended family and model under certain
circumstances.  Also, extended model is a concat, not an add.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoperf: Only provision cores if we restrict cores
Barret Rhoden [Fri, 8 Sep 2017 14:54:14 +0000 (10:54 -0400)]
perf: Only provision cores if we restrict cores

If we restrict perf to run on certain cores, then we need the program to
run on those cores.  Otherwise, the provisioning doesn't help and can only
fail / mess with other apps.  It'll also conflict with any provisioning
done by the app itself.

Note that provisioning doesn't follow parents->child, so be careful using
perf -C.  You will end up not reliably sampling your programs children.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoperf: Fix buggy bitops
Barret Rhoden [Fri, 8 Sep 2017 14:51:53 +0000 (10:51 -0400)]
perf: Fix buggy bitops

The moral of the story here is to not rewrite your own bitops.  If you
don't like the existing ones, then fix them.

This:

static inline void ros_set_bit(void *addr, size_t nbit)
{
((uint8_t *) addr)[nbit % CHAR_BIT] |= 1 << (nbit % CHAR_BIT);
}

is just plain wrong.  The first '%' should be a '/'.  Select the byte with
/, then select the bit with %.

Oh, and test the damn thing once or twice.

I noticed this since perf was provisioning extra cores.  For instance, if
you asked for -C 4, you'd get 4 and 12.

As Ron put it: 'Oh fun!!'.  =)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Mark const bitops
Barret Rhoden [Fri, 8 Sep 2017 14:50:41 +0000 (10:50 -0400)]
parlib: Mark const bitops

This will make them more usable for perf.

If someone wants to spatch-rename these functions, go for it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdded more dune syscall implementations and stubs
Zach Zimmerman [Wed, 6 Sep 2017 02:34:00 +0000 (19:34 -0700)]
Added more dune syscall implementations and stubs

Added syscalls that were simple ports from Akaros

Added stubs for some syscalls that need to be implemented
separately in akaros.

Filled in the remaining linux syscalls that were missing from
the syscall table.

Added MAX_GPCs to linuxemu.h, this can be removed once we have
better support for creating guest pcores on the fly

Change-Id: I291bf7abbde324872a3db9718b43f5bbcaa7f97b
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[removed a couple newlines]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Fix leaked mapping
Barret Rhoden [Fri, 8 Sep 2017 17:43:26 +0000 (13:43 -0400)]
vmm: Fix leaked mapping

We merged commit 51ddba8a6354 ("vmm: Added helper functions to
user/vmm/memory.c") right before this was fixed.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Added helper functions to user/vmm/memory.c
Zach Zimmerman [Thu, 7 Sep 2017 23:58:19 +0000 (16:58 -0700)]
vmm: Added helper functions to user/vmm/memory.c

Moved elf_aux struct definition to vmm.h
Moved populate stack from dune.c to memory.c
Added a file mmap helper to memory.c

Change-Id: I729ae1cb621420ee0523dbf017c99a75cbc32150
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ vmm tag, removed a newline at EOF ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoMoving align macros into vm utils header.
Gan Shun [Wed, 6 Sep 2017 22:15:06 +0000 (15:15 -0700)]
Moving align macros into vm utils header.

It's about time we had some helper macros to align stuff, and we can't
put them in ros/common.h so this at least allows the vmms to use this
where there won't likely be conflicts with other programs.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Id1e21df482a5f661d4b0b4f899a98e8dc6d91a6f
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovm io: reset on an outb to cf9
Ronald G. Minnich [Wed, 6 Sep 2017 17:43:06 +0000 (10:43 -0700)]
vm io: reset on an outb to cf9

On an outb of (1 << 2) to cf9, exit the vm, since that is the reset register.

While there are some bits in the control register that affect
the type of reset, they're not important in a VM since they relate
to hardware that doesn't exist. We can just reset if bit 2 is a 1.

Why cf9? Why do IO at all? There are good arguments that this could be
a vmcall, but what's nice about cf9 is that it's standard, and has
been forever. Further, you can cause this reset to happen easily from
user mode. And that's very nice.

This is tested and working for any value with bit 2 clear (no reset)
and any value with bit 2 set (reset). Where was it all my life?

The following simple handy dandy tool is very useful on linux.

int main(int argc, char *argv[])
{
int i = 6;

if (argc > 1)
i = strtoull(argv[1], 0, 0);
iopl(3);
outb(i, 0xcf9);
exit(0)
}

// on linux:
// cc -static -o cf9 cf9.c

Change-Id: I727102a1187859d8c800fcce46b34fb3524f2b0e
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoutil: add the cat function as a utility
Ronald G. Minnich [Wed, 2 Aug 2017 21:00:26 +0000 (14:00 -0700)]
util: add the cat function as a utility

We need it more than one place, and it's just handy
to get it right once.

Change-Id: Ifd9493ae90c4f660d10e6333f62b421b337d6ba5
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[ checkpatch, memsize a size_t, fixed 'int cat' in util.h ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoModified dune syscalls and extensions structures
Zach Zimmerman [Wed, 30 Aug 2017 00:07:44 +0000 (17:07 -0700)]
Modified dune syscalls and extensions structures

Dune syscall table is now statically defined
Extensions (if present) are linked in through a shared library

Change-Id: I76c54abed80f690e511257f42c389d975792cd08
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoe820map: move over to the new size scheme
Ronald G. Minnich [Tue, 22 Aug 2017 23:19:19 +0000 (16:19 -0700)]
e820map: move over to the new size scheme

Change-Id: I6c5358ba741802dee1efcf81e3d4efd6bc3a36a1
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoload_elf now returns the elf64_ehdr if requested.
Zach Zimmerman [Wed, 30 Aug 2017 23:51:48 +0000 (16:51 -0700)]
load_elf now returns the elf64_ehdr if requested.

Added parameter #4 to load_elf, which if not NULL
will contain the ehdr information from the loaded
file upon a successful return from load_elf.

Change-Id: I3429d73ac2f396873e3c02dcf0d6757d02f57716
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ added back in the newline after #includes ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix dlopen() with -rdynamic
Barret Rhoden [Wed, 30 Aug 2017 17:20:48 +0000 (13:20 -0400)]
parlib: Fix dlopen() with -rdynamic

Part 3 of trying to fix shared objects, following up on commit c77d5ade84b7
("parlib: Fix fake parlib detection for dlopen() (XCC)").

If we use -rdynamic, all symbols from the binary (e.g. hello.c) will
override functions in the .so.  For instance, __in_fake_parlib() and
vcore_lib_init() will be from the binary, not the .so, even when we're
running the library's ctors.

The fix is relatively simple: __in_fake_parlib() is a static inline, which
won't give the opportunity for the .so to link against a global version,
since there is no global version.

For the ctors, we actually could leave vcore_lib_init() as a global ctor,
since it can safely be called multiple times.  But that's a little sloppy
and confusing - I wondered for a little while why vcore_lib_init() ran from
hello, while uthread_lib_init() was run from within the .so.  static vs
global.  We still need the guts vcore_lib_init() to be in a header for
uthread.c, so the sanest thing was to just split it up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoThe initrd now works.
Ronald G. Minnich [Thu, 13 Jul 2017 00:08:43 +0000 (17:08 -0700)]
The initrd now works.

We round up to the next 4k. For older kernels, you need to set the
device to 0x100; for newer kernels, set type_of_loader to 0xff.

This is tested with a simple busybox initramfs from u-root.

Change-Id: If14bcf613fdb06ef4147b6f27dc27c691f46bbaa
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdded logging functionality to linuxemu
Zach Zimmerman [Fri, 25 Aug 2017 18:46:47 +0000 (11:46 -0700)]
Added logging functionality to linuxemu

Added logging constructor/destructor functions
Added syscall errorchecking
Added linuxemu print statement
Added global logfile for linuxemu
Modified linuxemu to use the new print format
The vmcall register print in linuxemu() now uses
the correct syscall ABI (r10 instead of rcx)
Changed dune_sys_read, write, and gettimeofday
to match the new syscall paradigm

Change-Id: I7d9ce9ee9d04088e7455da1378ef03ce90fb9d0e
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow VMMs to change vmexit conditions (XCC)
Barret Rhoden [Wed, 23 Aug 2017 18:57:47 +0000 (14:57 -0400)]
vmm: Allow VMMs to change vmexit conditions (XCC)

The 2LS (or any HR3 app) can change certain vmexit conditions.  For VMX,
these are the VMX controls.  For AMD, we'll have to do something similar.

Right now, you can control exit on halt (default yes) and exit on pause
(default no).

The greedy mode scheduler will turn off halt exiting, so that when the
guest wants to halt, the core will actually halt.  This will cut down on
the interference with hyperthreads/caches.  2LSs can actually change this
on the fly, subject to the number of host cores available.

Ideally, we'd allow mwait too, but we need to sort out letting the guest
mwait for power management, but not use it for monitor-mwait.  As is, they
actually could monitor-mwait, but once we tell them that mwait (and implied
monitor) is available, we can't renege.  That means we wouldn't be able to
change the exiting status on the fly without the guest potentially sleeping
forever.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd READ_ONCE and WRITE_ONCE (XCC)
Barret Rhoden [Thu, 24 Aug 2017 15:28:31 +0000 (11:28 -0400)]
Add READ_ONCE and WRITE_ONCE (XCC)

These aren't quite the same as Linux's, in that they don't handle
structs.  Currently we don't need that, especially in a kernel header.
The thing we do need is the atomicity of writes of size up to uintptr_t.

There are places on both the user and kernel sides where we expect
writes to be done atomically, and not torn or otherwise mucked with by
the compiler.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add support for changing VMX controls
Barret Rhoden [Thu, 17 Aug 2017 19:13:41 +0000 (15:13 -0400)]
vmm: Add support for changing VMX controls

This adds internal support for changing pin-based, cpu-based, and secondary
cpu-based VMX controls.  VMMs will want to change some of them on the fly,
such as "vmexit on halt."  It's not enough to set them once at startup
either, since the 2LS's decision may depend on the number of cores
available dynamically.

Later patches will add support for userspace to change the flags in
vmx_vmm.  Once those bits are changed, the next time a GPC reloads, it will
have the new controls.  At a minimum, GPCs reload any time we run a VM and
were previously in userspace.  That should be sufficient for 2LSs.  The
alternative is to set those VMCS fields on every pop, which will slightly
slow down kernel vmexit handling.

The VMCS writes are only a few nsec each - basically the minimum cost of
any similar instruction.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Allow vmm.h to include vmx.h
Barret Rhoden [Fri, 18 Aug 2017 15:23:09 +0000 (11:23 -0400)]
vmm: Allow vmm.h to include vmx.h

The higher-level vmm.h should include the more specific vmx.h.  Eventually,
we'll also include svm.h.  =)  I'll need this for an upcoming change.

Note this makes guest_pcore specific to Intel vs AMD.  I'm not 100% on
that, but we do have a bunch of intel-specific things in it, such as the
VMCS.  We might end up with guest_pcore being more generic and including
vmx and svm structures, like vmx_guest_pcore, and all the vmx.h functions
take that as a parameter.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Move chunks of ros/vmx.h into the kernel (XCC)
Barret Rhoden [Thu, 17 Aug 2017 17:51:36 +0000 (13:51 -0400)]
vmm: Move chunks of ros/vmx.h into the kernel (XCC)

A lot of that stuff isn't needed by userspace.  Even more shouldn't be
exposed at all, such as our internal vmcs_config struct (which I'll need to
change soon).

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Remove nasty rdmsr() macro (XCC)
Barret Rhoden [Thu, 17 Aug 2017 16:25:38 +0000 (12:25 -0400)]
vmm: Remove nasty rdmsr() macro (XCC)

This cleaned up the kernel's MSR code a bit.  The rdmsr() macro actually
cluttered up some of the code, especially in the "just read the host MSRs
and copy to the VMCS" section.

Also, the order of the parameters to rdmsr() was unclear.  In fact, we had
a bug in the user version of the code for emsr_ok (rdx was first, not
second).  Whoops.

We had another user bug in miscenable, where we didn't track PEBS properly.
I just removed that function completely, since it is never called.  Similar
with emsr_mustmatch, both for the kernel and user.

Also note that the user MSR code will panic if you use it.  Previously,
you'd get a GPF if you tried an MSR instruction from userspace.  Instead of
just deleting it all, I left it there with a panic().  Someone else can use
the #arch device to access the MSRs if we feel it is useful.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Remove split_msr_val()
Barret Rhoden [Thu, 17 Aug 2017 16:22:18 +0000 (12:22 -0400)]
x86: Remove split_msr_val()

It was better than a macro, but it was a little confusing when looking at
the code, since you'd have to know that 'high' was first.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Make the greedy 2LS pinning and optimistic
Barret Rhoden [Mon, 14 Aug 2017 20:37:53 +0000 (16:37 -0400)]
vmm: Make the greedy 2LS pinning and optimistic

The greedy flag (-g) now causes the VMM 2LS to do the following:
- Ask for N + 1 vcores, with N == nr_guest_cores.
- Assume all of those vcores are allocated (optimistic)
- Never yield those vcores
- All task threads run on vcore 0, including timer alarms
- All other vcores run their respective guest thread or controller thread.
  E.g. vcore 1 run GPC 0.

With this, guest cores are never rescheduled - they stay on the same vcore,
and thus the same underlying pcore, since we never yield.

Note that this assumes all vcores are allocated and remain that way.  So
any preemptions will screw it up.  Fixing that is a much harder TODO.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Collect and report scheduler stats
Barret Rhoden [Tue, 1 Aug 2017 14:13:17 +0000 (10:13 -0400)]
vmm: Collect and report scheduler stats

You can access these with "notify 9".  e.g.

$ notify PID 9

Pass 1 as the arg to reset the counters.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: vmm: Use a separate vector for posted IRQs
Barret Rhoden [Wed, 23 Aug 2017 14:27:18 +0000 (10:27 -0400)]
x86: vmm: Use a separate vector for posted IRQs

We were using I_POKE_CORE, but we actually need two separate IRQs.
Sometimes we actually want to kick the core into the kernel, but if we use
the posted IRQ vector and the core was running a guest, we wouldn't kick
the core.

I looked into this because of mpstat.  It'll send IPIs to force a cpu state
change / reevaluation.  But if the guest was spinning or halted, the POKE
would have no effect.

This also is just a little clearer in the code where we are trying to do a
posted IRQ and where we are just trying to kick the core.

Note that mpstat is a little racy.  We could make it better, but I'd like
to keep the ability to not interfere with the CG cores.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: vmm: Track state for handling vmexits as KERNEL
Barret Rhoden [Wed, 23 Aug 2017 14:24:01 +0000 (10:24 -0400)]
x86: vmm: Track state for handling vmexits as KERNEL

When we vmexited, we didn't set the cpu state to KERNEL, keeping it as
USER.  This would show up in mpstat as higher USER time.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoEnable EFER NX bit and OSXSAVE bit in cr4
Zach Zimmerman [Thu, 24 Aug 2017 22:07:26 +0000 (15:07 -0700)]
Enable EFER NX bit and OSXSAVE bit in cr4

EFER_NX allows the guest to disable execute perms
on its pages.

OSXSAVE allows guest user applications to execute xsave.

Change-Id: Icb9920564ae07184dc9aa07cad2c79825d2adbad
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ Compilation bug, missing ) on assert() ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoChanged BRK_END to 0x0000300000000000 (XCC)
Zach Zimmerman [Thu, 24 Aug 2017 21:37:28 +0000 (14:37 -0700)]
Changed BRK_END to 0x0000300000000000 (XCC)

Allows mmaps in the high EPT address space

Change-Id: I8f19f755708a8de455582a14964fb17d2751dc62
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ XCC warning - rebuild glibc if you're paranoid ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUpdate to linuxemu syscall structure
Zach Zimmerman [Thu, 17 Aug 2017 23:06:51 +0000 (16:06 -0700)]
Update to linuxemu syscall structure

Changed linuxemu to use array of function pointers
Changed dune test to use linuxemu by default
Modified linuxemu to use a shared library for syscall extensions

Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
Change-Id: Id4b7d86b5f9cc95b224ebe9e282a3973e80b9130
[ checkpatch warning ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix deadlock in __hpf()
Barret Rhoden [Wed, 23 Aug 2017 21:48:29 +0000 (17:48 -0400)]
Fix deadlock in __hpf()

When erroring out, we were not unlocking first.

As a side note, if you give the kernel a virtual address and tell it to use
it for an operation (e.g. read(fd, VIRT_ADDR, amt), that memory should be
anonymous memory.  At the very least, it must be soft-faultable (i.e.  not
a file that isn't in the page cache).  Considering there's limited control
over that, I currently don't allow that either.  So something like this
will fail:

va = mmap(..., fd, 0)
read(another_fd, va, amt);

This restriction is stricter than Linux, and is because of userspace's role
in managing its own memory - it's up to the user to know what is or isn't
resident.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoChange __blksize_t to be 64 bits
Dan Cross [Wed, 23 Aug 2017 21:24:26 +0000 (17:24 -0400)]
Change __blksize_t to be 64 bits

Change-Id: I03360a5e896fc53c16da521391ad1e4fd5d1067c
Signed-off-by: Dan Cross <crossd@gmail.com>
[ make this in sync with glibc ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix "can't print 'ret'" bug
Barret Rhoden [Fri, 18 Aug 2017 20:21:44 +0000 (16:21 -0400)]
parlib: Fix "can't print 'ret'" bug

Thanks to nasty macros, if you tried to do something like:

int ret = 3;
printf("Return value is %d\n", ret);

You'd get "Return value is 0".  The problem was that the 'ret' variable
inside the macro would be the one printed, not the one passed in.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Prevent running ctors twice
Barret Rhoden [Tue, 22 Aug 2017 18:21:23 +0000 (14:21 -0400)]
parlib: Prevent running ctors twice

Previously, we only were protecting vcore_lib_init() and
uthread_lib_init().  However, there are other ctors out there, some of
which have external effects (devalarm).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix fake parlib detection for dlopen() (XCC)
Barret Rhoden [Fri, 18 Aug 2017 19:53:37 +0000 (15:53 -0400)]
parlib: Fix fake parlib detection for dlopen() (XCC)

This goes back to commit 2d0747b5a1f4 ("parlib: Don't run ctors in "fake
parlib"").

That commit worked if the library was loaded first, as is the case with
e.g. libelf.so.  However, if the library was loaded after the binary, it
might see the program binary's _start, and rightly notice it differs from
__fake_start.  To make matters worse, whether or not the library's _start
was overloaded depended on whether or not the binary accessed it.  It's a
mess that I never fully tracked down.

The current version does the trick, at least as long as we keep the binary
mapped below our anonymous mmaps.

If you're paranoid, rebuild the world, though that's probably unnecessary.
At least do this:

$ make install-libs
$ make apps-install

And then build any other shared libs.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoVmm file mmap ept fault fix (XCC)
Zach Zimmerman [Tue, 15 Aug 2017 21:27:39 +0000 (14:27 -0700)]
Vmm file mmap ept fault fix (XCC)

Modified vthreads to also check for EAGAIN (like uthreads) in the ept
fault handler. This allows vthreads that mmap with files to correctly
populate memory on an ept fault. Included a test (mmap_file_vmm) that
will check this condition is satisified.

Reinstall your kernel headers.

Change-Id: I09f7b70de98275ed8b9614f89179a0947ca35584
Signed-off-by: Zach Zimmerman <zpzimmerman@gmail.com>
[ XCC warning ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoChange map_memory and setup_paging to use virtual_machine struct
Ronald G. Minnich [Thu, 17 Aug 2017 23:13:40 +0000 (16:13 -0700)]
Change map_memory and setup_paging to use virtual_machine struct

The virtual machine struct now contains guest minphys and maxphys addresses.
Map_memory can be called multiple times.

Setup_page is called with a pointer to the virtual_machine, which sets up
the early 1:1 mapping for the entire range of minphys to maxphys.

This is essentially what we already did, but now we can call map_memory
more than once.

While it may seem odd to to map the whole range from minphys to maxphys,
it's basically ok:
- you rarely call map_memory more than once
- the real check is done in the EPT, not the GPT
- GPT is replaced by most kernels
- in the vthreads case, we will typically start the thread
  memory at 4G, and there will be no holes in that space

So it's probably fine.

Change-Id: I48311bea6f7ae102959247ccad3234a85665b187
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[ 80 char line fix ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Don't allow both greedy and SCP mode
Barret Rhoden [Mon, 14 Aug 2017 16:20:19 +0000 (12:20 -0400)]
vmm: Don't allow both greedy and SCP mode

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Use relative alarms for periodic LAPIC timers
Barret Rhoden [Mon, 14 Aug 2017 16:06:28 +0000 (12:06 -0400)]
vmm: Use relative alarms for periodic LAPIC timers

With relative alarms, we'll try to inject another IPI in X ticks from now,
instead of X ticks from when we wanted the previous alarm to go off.

If the VMM is descheduled for a long time, perhaps due to being an SCP or
otherwise low-priority, the "incremental" alarms will build up, since we
don't run our alarm handler immediately.

If the guest clocks off the ticks, it'll have problems.  If that happens,
we can come up with something else.  I tested tinycore by giving it the
period it wanted * 2, and it thought time passed correctly (date).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Prioritize task threads over guest threads
Barret Rhoden [Mon, 14 Aug 2017 16:01:09 +0000 (12:01 -0400)]
vmm: Prioritize task threads over guest threads

Originally, we had some task threads that would busy wait, so we had to
alternate between tasks and guests.  Otherwise, the task threads would
starve the guests.

However, with Gan's "thread per timer tick per core" change, multicore VMs
running on an SCP VMMs ran into problems.  The guest cores would starve out
the task threads.  Specifically, every guest LAPIC timer tick we'd create N
task threads.  We'd run one of them, then the next *vcore* tick we'd run a
guest thread - which would spin in Linux in smp_call_function().  The N-1
other alarms would wait.  By the time those threads got their chance to run
(vcore tick), we'd also have N more LAPIC timer threads created.  So we'd
grow the number of threads by N-1 every tick (1 msec).

Anyway, this turned out to be an easy fix: prioritize task threads, like I
originally wanted to.  The old task thread that was busy waiting was
replaced a while ago.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocons: Clamp the amount written to the console
Barret Rhoden [Mon, 14 Aug 2017 13:45:21 +0000 (09:45 -0400)]
cons: Clamp the amount written to the console

Large writes to the console take a long time.  Serial writes of about a
page take O(100ms).  Our kernel is currently non-preemptive, which is
based on a model of syscalls not taking too long.

Limiting the write sizes to 80 (the width of an ancient console, which
Ron will love) cuts the syscall time down to a few ms, which is within
the quantum of a process.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agosched: Use a relative alarm
Barret Rhoden [Mon, 14 Aug 2017 13:42:52 +0000 (09:42 -0400)]
sched: Use a relative alarm

Some syscalls, notably writing to the serial console, take a very long
time.  If you cat a large file to the console, your other SCPs (notably
SSH and shells) get nearly no service.  The ksched backlogs about a
dozen ksched_ticks during the syscalls, which are O(100ms).  With this
change, those other processes get a little more attention.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agomm: Enforce MAP_PRIVATE xor MAP_SHARED (XCC)
Barret Rhoden [Tue, 1 Aug 2017 21:11:45 +0000 (17:11 -0400)]
mm: Enforce MAP_PRIVATE xor MAP_SHARED (XCC)

We're only supposed to accept PRIVATE xor SHARED, but we were allowing
neither, and possibly both.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agomm: Fix VMR merge issues
Barret Rhoden [Tue, 1 Aug 2017 21:01:13 +0000 (17:01 -0400)]
mm: Fix VMR merge issues

First, mprotect wasn't merging at all.  Glibc actually uses this a lot when
we allocate TLSs (grep grow_heap() and ignore that it is static).

Also we were failing to merge some mappings since we were keeping track of
useless flags.  For instance, MAP_POPULATE only matters when we create the
mapping.  We don't need to track that later on.  Flags like that were
preventing mergers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoslab: Properly account for allocs from slabs
Barret Rhoden [Tue, 1 Aug 2017 20:03:20 +0000 (16:03 -0400)]
slab: Properly account for allocs from slabs

Previously, we only counted the magazine allocations.  However, all of the
magazines are built from direct slab allocations, which we weren't
counting.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoperf: Fix off-by-one retval for write()
Barret Rhoden [Tue, 1 Aug 2017 15:48:32 +0000 (11:48 -0400)]
perf: Fix off-by-one retval for write()

kptr should only be advanced when we are reading the input.  We were
incrementing kptr for PERFMON_CMD_CPU_CAPS, resulting in returning '2' for
a write of '1'.

This managed to work for a while since we had another bug masking it, which
was fixed in commit 395ce5721d96 ("Fix Plan 9 partial write() return
values").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoReduce mmaps from vfprintf (XCC)
Barret Rhoden [Mon, 31 Jul 2017 21:20:00 +0000 (17:20 -0400)]
Reduce mmaps from vfprintf (XCC)

It turns out that the do_positional case, which was supposed to be uncommon
and only used for positional arguments, is always used.  That's due to our
use of custom printf functions, which we use for every program.

This change wraps all of the mmaps in a helper function - both the ones for
the specs and for the buffered prints.  The important thing is that we
don't do large allocations from vcore context, so we can just check for it
and branch.  The allocas from an always_inline function seem safe, and the
assembly looks OK.

Rebuild glibc.

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