akaros.git
3 years agoperf: Fix the perf.data file output
Barret Rhoden [Tue, 24 May 2016 20:20:03 +0000 (16:20 -0400)]
perf: Fix the perf.data file output

The main problem was that the features headers (e.g. HEADER_HOSTNAME) just
didn't work at all.  The headers are supposed to have a perf_file_section
for each header, which they were missing.  The other header issue was that
the feature header section is supposed to be after the data section.  The
three big sections (attrs, data, event_types) all have file sections in the
main header, but the features are just assumed to be after the data
section (based on linux perf's code).

The latter bit implies that the data section is last among the three
sections.  Who knows what the order for them really is, but since they all
have perf_file_sections, then we should be good with just keeping data
last.

The other major thing that seemed messed up was the rel_offset.  The old
code was just looking at it once and using it for all of the three big
sections.  Each section has its own peculiar relocations.  The trickiest
is that the attr MF's relocs are all relative to the attr_id MF.  Yikes.
I think we were getting away with it since attrs was the only one with
relocations.

Other than that, there's just some cleanup.  For instance, when setting a
feat header, we should set the PH bit then instead of deferring it.  And
when building the perf_file_sections for the three big sections, we should
always do it, not condition on size > 0.  Just set the damn values.  That
clarifies and simplifies the code a lot, instead of having some mysterious
'rel_offset' sitting around.  'rel' to what?

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Build with warnings and -Werror
Barret Rhoden [Mon, 23 May 2016 21:58:47 +0000 (17:58 -0400)]
perf: Build with warnings and -Werror

And fixes a few warnings.  I noticed this when the compiler didn't complain
about obviously wrong debug code...

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Clean up attr production
Barret Rhoden [Tue, 24 May 2016 16:15:36 +0000 (12:15 -0400)]
perf: Clean up attr production

We had been using just the raw_info from the kernel to generate the attrs.
That meant that we'd need to keep track of which events we had seen before
(hash table, though since we only ever had one or two events, that might
have been overkill), and we lost information from the original event
selection.

Now we use the perf_eventsel pointer as the raw_info / user_data, and we
can just emit an attr based on what was originally submitted.  That will
also allow us to support some of the generic hardware events in the future.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Use a user_data blob for perf_event (XCC)
Barret Rhoden [Mon, 23 May 2016 18:37:26 +0000 (14:37 -0400)]
perf: Use a user_data blob for perf_event (XCC)

Previously, the kernel had to emit something that perfconv could interpret
as-is to build a perf_event stream.  That was limiting.  Now, the user can
pass a blob with a perf_event that the kernel will send whenever the event
fires.  Basically user_data becomes the info field in any perfmon sample.

The user can do whatever they want with this - it can even be the original
event code if they choose.

Right now, perfconv doesn't know how to handle this new format.  That'll be
sorted out next patch.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Track the perf_context when converting
Barret Rhoden [Mon, 23 May 2016 16:48:45 +0000 (12:48 -0400)]
perf: Track the perf_context when converting

perfconv.c was originally its own program, completely decoupled from the
rest of perf.  It got its info from the kernel only, which limits the
things we can do with it.  For instance, any accounting info or parameters
for a perf event would need to be communicated to the kernel and then
shipped back out to userspace to be reported.  This design is rather
lacking.

Now we'll keep track of the perf_context, so that we can look up the
original perf_event during conversion time.  This is similar to tracking
the perf_event_attr throughout the life of the perf run.  That's something
Linux does internally, so it makes sense for us to do it in our perf.

For an example of where the old system failed, we don't know the
sample_period for any given event.  The kernel only gives us 64 bits per
event, and that doesn't include pev->trigger_count.  That was submitted to
the kernel, but subsequently lost.  Userspace still knows what it asked
for, and the kernel also knows, but it disappears as we flow through the
system.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Enable and disable counters in one step
Barret Rhoden [Fri, 20 May 2016 18:40:56 +0000 (14:40 -0400)]
perf: Enable and disable counters in one step

Perf counters needs to be enabled in two MSRs: the global and the specific
(fixed or eventsel).  We had been clumsily splitting these calls.  Instead,
we can just do it in one move, which clears up the code itself.

For now, we track whether a counter is available/in-use by the specific
MSR.  Because of that, we need to clear both registers when disabling the
counter.  If we do something else in the future, we can disable by only
setting the global MSR, which is one of the benefits of intel's version 2.

Also, this commit makes better use of helpers to check if a counter is
available.  Doing the bit shifts in place was unclear and the source of
multiple bugs.  I caught one of them during Davide's first code submission,
but missed the other (which I fixed a few commits back).  Had we used a
helper the whole time, we only would have needed to fix it once.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Fix event enabling logic
Barret Rhoden [Fri, 20 May 2016 16:25:21 +0000 (12:25 -0400)]
perf: Fix event enabling logic

There were a bunch of subtle problems here.

First, we should never write 'pa' in perfmon_do_cores_alloc(), or anywhere
that is shared and racy.  But you'll notice that technically we weren't:

PMEV_SET_EN(cctx->fixed_counters[i].event, 1);

That's the local copy.  But, when we called the function that would have
used the Enable bit, we actually used the old shared one again!

tmp = perfmon_get_fixevent_mask(&pa->ev, i, fxctrl_value);

So now we just copy in and use a local variable, and to keep things clear,
we don't make changes to the event on a per-core basis.  If we have to in
the future, we'll operate on the local copy.

Second, the meaning of the Enable bit was wrong for fixed counters - it was
setting the interrupt (PMI).  We have a separate bit for that.

Third, it wasn't clear why we needed to enforce that Enable was on.  It's a
nice thing to do, but it looks like we need at least one bit set so the
kernel doesn't get confused about whether a counter is being used or not.

Next (fourthly?), we weren't clearing the overflow when we wanted an
interrupt.  If we ever had a situation where the counter had an old
overflow (say, it wasn't in sampling mode and just happened to overflow),
then we wouldn't get our interrupt.  We were doing this when we received an
actual interrupt - just not when we first set it up.  While we're at it, we
should be clearing overflow regardless of whether or not we want an
interrupt.  The regular counting style counter should track that too.

While we're at it, we shouldn't set trigger_count to whatever the user
asked for if the interrupt isn't on.  They probably said 0, but we might as
well make sure it is 0.

Finally, the perf counters need to be enabled twice.  We were doing it, but
for some reason we'd enable it in one place, then set some values, then set
it in the other place.  Technically the counter isn't enabled until this
last setting, but it's pretty ugly.  Now we just set the counter settings,
then turn it on.

It's also just nasty to have:

perfmon_enable_fix_event((int) ccno, FALSE);

Enable?  No, actually disable!  There are now two functions for that.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Fix GPF when writing fixed trigger counters
Barret Rhoden [Fri, 20 May 2016 15:34:02 +0000 (11:34 -0400)]
perf: Fix GPF when writing fixed trigger counters

There are a bunch of bits reserved in fixed counters.  We must set the
upper ones to 0.  We'll still overflow properly; the register is just
smaller.

The unfixed perf counters also have a width, but I didn't get a GPF when
setting the upper bits.  Still - we should do the right thing and not set
those upper bits.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Fix fixed counter busy detection
Barret Rhoden [Thu, 19 May 2016 22:36:24 +0000 (18:36 -0400)]
perf: Fix fixed counter busy detection

We're supposed to shift the mask to the right spot, which is the index
times the width of the mask.  E.g. for fixed counter 1, we want to look at
the 4 bits shifted in by 4.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Use tracked event info for output
Barret Rhoden [Thu, 19 May 2016 22:03:28 +0000 (18:03 -0400)]
perf: Use tracked event info for output

The event selector knows all about an event: its name, flags, raw code,
etc.  We can use that when we're outputting the event later on.  We had
been getting some info from the kernel and copying into sel, but that's
actually lies - AFAIK, those values are all just 0.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Use libpfm4 and Linux style event strings
Barret Rhoden [Thu, 19 May 2016 20:04:18 +0000 (16:04 -0400)]
perf: Use libpfm4 and Linux style event strings

We had been using a custom event string, which was incompatible with both
Linux's perf and libpfm4.

Now, we accept any libpfm4 string, and barring that, we'll use perf-style
raw codes.  We accept pfm4-like modifiers, such as :u and :k.  Unlike perf,
we require that each modifier/token is separated by :.

So this works:

-e inst_retired:u:k

But this doesn't:
-e inst_retired:uk

That's actually libpfm4, not us.  I do the same thing for the raw codes
though, since we might as well be consistent (and simple).

In the process, I also fixed a couple issues with event specification.

Many events from libpfm4 are more than 8 bits long.  The old code assumed
that the event was 8 bits and the mask was 8 bits.  That meant that we
could submit events like 0x13c properly (you'd have to write it as
0x3c:0x01, even though perf list told your 0x13c).  Surprise!  Now we allow
longer event selectors, where the upper bits are the mask.  That's just
what libpfm4 expects, and really it is how the hardware (and OS interface)
are programmed.

The other issue is pseudo-encoded events.  On most Intel machines, libpfm4
returns the event 0x300 for unhalted_reference_cycles.  That's not a real
code, and will silently fail.  It needs to be the fixed counter 2.  Linux
knows this, but we weren't interpreting it.  Without these changes,
attempts to use unhalted_reference_cycles would simply return 0 for the
perf counters.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove the BUILD_INFO_FILE variable
Barret Rhoden [Fri, 13 May 2016 18:31:38 +0000 (14:31 -0400)]
Remove the BUILD_INFO_FILE variable

This allowed developers to specify their own .c file for the build info,
instead of using whatever is generated by make/kbuild.  That seems like a
potential mess, since there's nothing keeping those make files in sync
with build_info.{c,h}.  And it doesn't seem particularly useful.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove kernel path and hostname from #version
Barret Rhoden [Fri, 13 May 2016 18:16:55 +0000 (14:16 -0400)]
Remove kernel path and hostname from #version

Perf had been using the kernel path so that it could emit it in
perf.data.  We no longer need that.  The kernel path was the path on the
machine on which the kernel was built, which assumes the perf report would
be analyzed on that same machine.

Likewise, this removes the hostname from #version.  This hostname wasn't
the name of the Akaros machine; it was the name of the machine on which
Akaros was built.  I don't see a good reason to keep this around.

If we need either of these in the future, we can probably replace it with
build-id (from the linker).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove snc
Barret Rhoden [Fri, 13 May 2016 16:51:17 +0000 (12:51 -0400)]
Remove snc

Now that we have ssh, we don't need snc.  If we ever do, we can revert this
commit.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Remove the perf_patch
Barret Rhoden [Fri, 13 May 2016 16:44:40 +0000 (12:44 -0400)]
perf: Remove the perf_patch

We no longer need to patch Linux's perf.  We should be ABI compliant with
PERFILE2.  If not, it's a bug.

This also updates Documentation, at least where it is related to setup.
There's a lot more TODO here.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Treat the kernel like [kernel.kallsyms]
Barret Rhoden [Fri, 13 May 2016 16:08:35 +0000 (12:08 -0400)]
perf: Treat the kernel like [kernel.kallsyms]

The perf ABI knows about the kernel, and there are bits in the data format
for kernel mmaps and traces.  When we run Linux's perf report, we can point
it at our symbol table and it can resolve the symbols.

Previously, we were treating the kernel like it was a user binary and had
to hack up Linux's perf to handle it accordingly.  Now we're just emitting
the right thing.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Set sample_period
Barret Rhoden [Fri, 13 May 2016 15:42:20 +0000 (11:42 -0400)]
perf: Set sample_period

Newer versions of perf need the sample_period.  Without it, all the
percentages in perf report are 0.

The sample period should be how many samples it takes to trigger an event
(e.g. overflow IRQ on a perf counter).  Perhaps we should always have been
saying at least sample_period = 1 (i.e. an event notif for every event).

We don't keep track of the actual period from perf's invocation.  We could
if we wanted to, but since percentages are relative, it's not a big deal at
this point.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Fix memory leak in the profiler
Barret Rhoden [Thu, 5 May 2016 16:14:24 +0000 (12:14 -0400)]
perf: Fix memory leak in the profiler

qclose() just closes it.  qfree() does a qclose() and a kfree().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Use tools/Makefrag for building perf
Barret Rhoden [Thu, 5 May 2016 15:38:18 +0000 (11:38 -0400)]
perf: Use tools/Makefrag for building perf

This allows us to cd into tools/profile/perf and build it directly.
Previously, it only was buildable from the top-level Makefile and only when
building all apps.

You can still build it from the top-level (apps-install).

Also, the usage of CFLAGS_USER is a little sketchy.  Those cflags were
originally for parlib and related libraries.  We use them for tests, though
that might be unnecessary.  Apps should use their own cflags.  If there is
some critical flag that every userspace app should have, then it should be
set in the toolchain in gcc (e.g. -mno-red-zone, RIP).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoperf: Fix perf's argv[] usage
Barret Rhoden [Thu, 5 May 2016 15:37:20 +0000 (11:37 -0400)]
perf: Fix perf's argv[] usage

Conflicting with sys_proc_create(), and driven by using excessive consts in
the signature for main().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Only map as much data as you read in.
Ronald G. Minnich [Wed, 8 Jun 2016 22:01:57 +0000 (15:01 -0700)]
vmm: Only map as much data as you read in.

The current vmrunkernel sets up 1 Gbyte of 2M pages.
It is best if we can start the kernel with the minimum amount
of page tables set up. That way, if some very bad addressing happens
in early assembly, we'll see it right away as a triple fault.

We now only set up enough 2M pages to cover the size of the file
we read in.

We had thought we might want to dial it back to 4k pages,
but it turns out guests are pretty careful not to turn off
paging attributes that are enabled; rather, they carefully set up
page tables and then enable what they need, not disabling
anything that might have been set up.

Change-Id: I1c9f458f6147e81cd7bf0c51745167a6ff17db79
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[minor formatting]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Make 60K of low 1M available in e820map.
Ronald G. Minnich [Wed, 8 Jun 2016 22:01:56 +0000 (15:01 -0700)]
vmm: Make 60K of low 1M available in e820map.

Linux needs to be able to allocate several pages in low memory.
We had hoped to get around this limit, but it's not possible.

The range 0 to 16M was formerly marked as E820_RESERVED.
Set up 60K of memory (4K->64K) as E820_RAM for guest use.
Continue to leave the 0-4k region as E820_RESERVED, as well
as 64K to 16M.

Change-Id: Icd48bb8b7d6501269d3edb6a8e5b1d7899826a50
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agovmm: Properly set CR4 SHADOW and GUEST_HOST_MASK registers.
Ronald G. Minnich [Wed, 8 Jun 2016 22:01:55 +0000 (15:01 -0700)]
vmm: Properly set CR4 SHADOW and GUEST_HOST_MASK registers.

Set the SHADOW register to 0, and set the GUEST_HOST_MASK
to CR4_VMXE. This ensures that the guest can set the
CR4_VMXE in its CR4 copy to 0, which Linux wants to do.
This eliminates the patch we used to need in Linux
in the early startup assembly code (head_64.S).

Change-Id: I8ee64a5485abef1b5c1d8b07a705f0642335a038
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agouser/vmm: add translation helpers for guest kernel va to pa.
Ronald G. Minnich [Mon, 6 Jun 2016 17:36:40 +0000 (10:36 -0700)]
user/vmm: add translation helpers for guest kernel va to pa.

These are two simple translation helpers, one for converting
an arbitrary guest kernel virtual address to a physical
address (and hence host process virtual address); and one
to return the guest kernel RIP as a physical address (and hence
host virtual address).

Currently, they just blow the upper 34 bits of the guest
VA to zero, since the high part of the negative address
space is low physical memory.

Longer term, we may need to walk page tables, but so
far there has been no need.

Change-Id: I6f3875b03b7b33edd223615bd4678e6f2641d90a
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agouser/vmm: print RIP and hexdump of RIP[0:16] on failed vmexit handling.
Ronald G. Minnich [Fri, 3 Jun 2016 20:45:32 +0000 (13:45 -0700)]
user/vmm: print RIP and hexdump of RIP[0:16] on failed vmexit handling.

Sometimes the current status dump is not quite enough for debugging.
One example is when the RIP somehow ends up with a weird value,
e.g. the middle of allocated memory, and that code is hence
not visible in the disassembled kernel.

The exit now prints a bit more information, and a hex dump of
the 16 bytes starting at RIP. This little extra bit of information
allowed me to figure out a strange problem I was having.

Change-Id: Ic37396d48bfe8934d7943e9ac6729540468badfa
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: clean up IO emulation.
Ronald G. Minnich [Fri, 3 Jun 2016 20:45:31 +0000 (13:45 -0700)]
VMM: clean up IO emulation.

The io emulation code was written early in the game and was not correct
in several ways.

The big change is that we DO note that an IO address is not supported
but DO NOT consider it an error. The hardware does not, and we should
not. We do log a message to stderr that there was IO to an unsupported
address, but people commonly do such IO operations to implement, e.g.,
timing loops. It's perfectly legal to do IO to nonexistant config space
registers, as well, so it makes no sense to check those either. We can't
assume that an IO to a bogus address or config space register is not
intended or mistaken.

There is only one error return from the io() function: IO instructions
we did not handle because we could not interpret them. In that case, the
function really has no option but to return false. In all other cases,
it should return true.

As a result, all the configread/write functions become void, io() itself
now returns a bool, and handle_io returns what io returns.

We should consider changing regp() so that writes "to air" go to a
different place than reads "from air", as one might argue that reads
"from air" should return all 1s. In real hardware, not even this
reasonable rule always applies, so it's hard to make a strong argument
either way.

Change-Id: Ifec56655528f748183a35663c8ef20b8bc486b35
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoIncorporate new functions into glibc and expose to userland (XCC)
Dan Cross [Thu, 2 Jun 2016 22:28:20 +0000 (18:28 -0400)]
Incorporate new functions into glibc and expose to userland (XCC)

Add an Akaros-only sysdeps/akaros/bits/{stdlib,string}-akaros.h
with prototypes for reallocarray and strlcpy and strlcat respectively.
Modify sysdeps/stdlib.h and sysdeps/string.h to include those headers,
respectively.  Modify Makefile and Versions to export these functions.

Rebuild glibc.

Tested: Wrote, compiled and ran a C program that used all three functions.
Change-Id: Ie1c86c261c398f2db67b1968d51e446b84e42293
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPristine versions of headers added to sysdeps/akaros/bits.
Dan Cross [Thu, 2 Jun 2016 22:23:50 +0000 (18:23 -0400)]
Pristine versions of headers added to sysdeps/akaros/bits.

Import unmodified versions the stdlib/stdlib.h and string/string.h
from the upstream glibc-2.19 tree.  These will be modified to include
'bits' files; this commit is intended to keep the diff short.

Change-Id: I31454d577dd1172f054eeedc74273925a11fa8c1
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImport from OpenBSD: clang-format, naming and symbols, checkpatch clean
Dan Cross [Thu, 2 Jun 2016 22:23:49 +0000 (18:23 -0400)]
Import from OpenBSD: clang-format, naming and symbols, checkpatch clean

Run clang-format on new sources from OpenBSD and make them
'checkpatch clean': this involved one small change in strlcpy.c
to move an assignment outside of a conditional.

Replace the OpenBSD 'DEF_WEAK' macro invocations with 'weak_alias',
as per other library code.

Change-Id: Ifc3520f5f486a144de26329b4fe45c700b755047
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImport from OpenBSD: strlcat, strlcpy, reallocarray.
Dan Cross [Thu, 2 Jun 2016 21:30:44 +0000 (17:30 -0400)]
Import from OpenBSD: strlcat, strlcpy, reallocarray.

We have these utilities in the kernel.  Import them into
the userland.  This is the initial import; these are
unmodified original copies taken directly from the OpenBSD
CVS repository.  Each file has a specific version number
in it.

Change-Id: I812c74f7e5101059f719e0eb002dbed11a732660
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoIntercept CPUID calls to act like KVM
Gan Shun [Wed, 1 Jun 2016 22:31:21 +0000 (15:31 -0700)]
Intercept CPUID calls to act like KVM

Intercept the CPUID vmexit to possibly either set the hypervisor bit or to
return the KVM signature depending on the value in RAX.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ic27e05eafa22b0a20a888397c8bae37ff0ea3267
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove hardcoded virtio mmio base address and reduce device size
Gan Shun [Wed, 1 Jun 2016 20:22:34 +0000 (13:22 -0700)]
Remove hardcoded virtio mmio base address and reduce device size

Each virtio mmio device page is only 0x100 in size, not counting the
config space. The config space is pretty small and I've seen other
examples use either 1K or 0x200, which should be more than enough.
Also made the commandline parameter take in its address from the device
struct instead of a fixed string value. The virtio_devices start from
the next 512 GB boundary to shortcut the page table walk and fault
faster.

Bug: 29003537
Fixes: #5, b/29003537
Tested: Ran and booted a linux guest.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: I8391efe930fe5b3f7bd29fd37ff7ae572778d25c
[minor formatting]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoModify `ifconfig` to use full pathname to 'bind' command.
Dan Cross [Tue, 31 May 2016 22:01:26 +0000 (18:01 -0400)]
Modify `ifconfig` to use full pathname to 'bind' command.

As I work on getting bash integreated into Akaros, modify
`ifconfig` so that it uses the full path to the `bind` command
instead of relying on $PATH: this prevents conflicting with
the builtin `bind` in bash.

Change-Id: I5ab1d57a3d4d5f500a2d989ad0b7c6e8d632f3de
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoGet rid of ersatz ARRAY_SIZE macros in code we control.
Dan Cross [Tue, 31 May 2016 21:20:12 +0000 (17:20 -0400)]
Get rid of ersatz ARRAY_SIZE macros in code we control.

These are defined in third_party code, but in code that we control,
replace these with calls to our COUNT_OF macro.

Change-Id: I862e7a6b240b085b205fd881ce3c0789baadc649
Tested: Built user and tests.
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove x permissions on a data file.
Dan Cross [Tue, 31 May 2016 20:39:45 +0000 (16:39 -0400)]
Remove x permissions on a data file.

The `default` file was executable, but it's really
meant to be sourced into another script, and so
executability has no real meaning for it.  Remove
the 'x' bits.

Eventually this file should probably be retired.

Change-Id: Ifd0f7908004bb44af37e22783cdbd984a33c1042
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix an off-by-one error in `perror()`.
Dan Cross [Wed, 25 May 2016 16:09:45 +0000 (12:09 -0400)]
Fix an off-by-one error in `perror()`.

The `perror` function returns a printable string corresonding
to the current error.  Ours had an off-by-one bug due to an
incorrect use of `strncpy`.

Change-Id: I54a4314c723aa69480b4ef77da39973a4bbc58a2
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd `ipconfig` from Plan 9.
Dan Cross [Mon, 23 May 2016 17:39:13 +0000 (13:39 -0400)]
Add `ipconfig` from Plan 9.

ipconfig is an IP stack configuration tool.  It acts
as both a frontend to the filesystem-based configuration
dance one does when configuring a Plan 9-derived IP
stack, as well as a DHCP client and IPv6 autoconfiguration
agent.

This change is a port of `ipconfig` to Akaros.  Changes
include reformatting the code to match Akaros kernel style,
replacing `alarm` with Akaros system calls, removing
Plan 9- and GNU-specific code and replacing with more
portable idioms, and generally cleaning up.  This has been
tested on hardware for static and DHCP configuration of IPv4
and static configuration of IPv6.  It will be called by
`/ifconfig` if present in the KFS.  Fixes #4.

Change-Id: I233969a8d8efca429a773c7a8667f0bb7e88e552
Signed-off-by: Dan Cross <crossd@gmail.com>
Issue: 4
Bug: 28668810
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoHandle multiple virtio mmio devices.
Gan Shun [Tue, 17 May 2016 22:58:33 +0000 (15:58 -0700)]
Handle multiple virtio mmio devices.

This change removes current assumptions of a single mmio device, and
allows us to handle multiple devices naturally. Removed legacy
virtio_mmio_base and virtio_irq fields.

Issue: 3
Bug: 28824279
Change-Id: I62640634d98290e6328948ec9fe071cf4632fd1b
Signed-off-by: Gan Shun <ganshun@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCLEANUP: Remove trailing whitespace throughout the kernel.
Dan Cross [Thu, 19 May 2016 18:06:26 +0000 (14:06 -0400)]
CLEANUP: Remove trailing whitespace throughout the kernel.

This isn't a "trivial change for testing Git" change so much
as continuation of work due to observations made when making
those (earlier) changes: We may as well remove trailing
whitespace wherever it appears in the kernel in one go.

This change was generated by:

    : spitfire; sed -i '' 's/[  ]*$//' **/*.[chsS]

Change-Id: I9f8361f120eec25985e7d12b2bf9909d802cffdf
Tested: N/A (Whitespace only)
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMore it's to its and whitespaces.
Dan Cross [Wed, 18 May 2016 22:18:46 +0000 (18:18 -0400)]
More it's to its and whitespaces.

Minor cleanup.

Change-Id: Ia8961a48600923dc08dc6abadcfcce9e49ce8ce2
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoIt's to its in VFS comments and remove trailing whitespace.
Dan Cross [Wed, 18 May 2016 21:32:09 +0000 (17:32 -0400)]
It's to its in VFS comments and remove trailing whitespace.

Find a number of places in vfs.c where it's should be its
and fix them.  Also clean up instances of trailing whitespace.

Change-Id: I633331f81b21a0fa2f41632b209cee5d0b99cd71
Tested: N/A
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMinor whitespace cleanups in arp.c.
Dan Cross [Tue, 17 May 2016 19:01:27 +0000 (15:01 -0400)]
Minor whitespace cleanups in arp.c.

When I was in this file earlier, I noticed these: minor
cleanups with indenting communication lines and cleaning
up some spatch output that adds an extra space after the
'*' when changing 'uchar *' to 'uint8_t *'.

Change-Id: Iea36a062f3882c53ed426e0bef18161738104003
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReplace '//' comments with '/* */' to be
Dan Cross [Tue, 17 May 2016 18:03:06 +0000 (14:03 -0400)]
Replace '//' comments with '/* */' to be

Remove several long-commented debugging statements and change
a couple of '//' comments into '/* */' style in order to more
closely match a) the overall style of the file, and b) the Akaros
style guide.

Change-Id: I55aed697c3b7e4ba589260ed14002dd3d44028bf
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoExtract busybox's make helpers
Barret Rhoden [Thu, 5 May 2016 15:14:09 +0000 (11:14 -0400)]
Extract busybox's make helpers

Parts of busybox's Makefile are generic to all apps that we'll build.
Instead of just copying bits and pieces, we can have all of the apps
include a Makefrag.

It's far from perfect.  We could detect the cross compiler instead of being
told what it is, and if AKAROS_ROOT (e.g. from .bashrc) doesn't point to
the repo we're in, then weird things could happen.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix circular issues with event headers (XCC)
Barret Rhoden [Tue, 17 May 2016 14:59:49 +0000 (10:59 -0400)]
Fix circular issues with event headers (XCC)

The mailbox headers (e.g. ucq.h) needed parts of event.h, but later parts
of event.h needed the mailbox headers.  Previously we dealt with this by
being careful with where we #included.  Commit df786ca456cb ("Replace
 #include guards with #pragma once.") broke that for evbitmap.h.

The right fix is to split out the parts of the header that the mailboxes
need into it's own header.  This should help avoid future issues with other
mailboxes.  FWIW, I don't know if we could keep the old style (even if I
wanted to) with the #pragma once, which is probably why that one was left
as an ifndef.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReplace #include guards with #pragma once.
Dan Cross [Mon, 16 May 2016 20:32:41 +0000 (16:32 -0400)]
Replace #include guards with #pragma once.

This was done some time ago, but apparently didn't make it
to all files.  This change picks up a few of the stragglers:
the rest that remain seem to be mostly generated code.

Change-Id: I5d551efcd80513ffbe6a16dc89ed1e931312ac2e
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoTrivial wording change in comment.
Dan Cross [Fri, 13 May 2016 18:39:44 +0000 (14:39 -0400)]
Trivial wording change in comment.

This is mostly so I can test some Git behavior.
It's fine to incorporate, but it's not a particularly
useful change in itself.

Change-Id: Ib95ee3079341d30120102ced1d5fb5cabbaadd4f
Tested: N/A
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a test for uthread CVs
Barret Rhoden [Wed, 11 May 2016 22:59:34 +0000 (18:59 -0400)]
Add a test for uthread CVs

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd generic uthread condition variables
Barret Rhoden [Wed, 11 May 2016 22:48:48 +0000 (18:48 -0400)]
Add generic uthread condition variables

Like with mutexes, apps will want a 2LS-independent way to perform
synchronization.  Although a 2LS can be closely coupled with an
application, it's conceivable that some apps and libraries don't care
which 2LS they link with.

Further, some 2LSs probably don't care about how exactly their mutexes
and CVs work.  In that case, having the generic implementation saves
the 2LS writers from the hassle of rolling their own CVs.

In the future, we might change things up a bit.  When a 2LS wants to
control its mutex and CV implementations, it's probably so that they can
pick which thread runs from the queue.  In that case, perhaps we only
call out to the 2LS for the structure and the decision.

For instance, the generic uthread implementation uses a TAILQ and a FIFO
policy.  The 2LS could have a different structure and a different
policy, where the operations are "here's a Sync object (cv/mtx) and a
uth, block on it" and "wake on from this sync object" and "wake all."
The sync object would likely be embedded in a larger object, which means
it is allocated by the 2LS (so there are two more ops).  There are a few
other details; we'll hold off until we actually have a use case.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRewrite /ifconfig
Dan Cross [Wed, 11 May 2016 21:13:49 +0000 (17:13 -0400)]
Rewrite /ifconfig

Change /ifconfig so that it uses the ipconfig binary.
If /bin/ipconfig exists and the IP address of the machine
is known, use ipconfig to configure the interface with
the given IP address, gateway and netmask.

If /bin/ipconfig exists and the IP address of the machine
is NOT known, then run ipconfig and try to get a DHCP
lease.

If /bin/ipconfig does NOT exist and the IP address is known,
then configure the interface manually.

If /bin/ipconfig does not exist and the IP address is not known,
use a default configuration suitable for QEMU.

Use ipconfig for the loopback interface if it exists,
otherwise configure the loopback interface manually.

Also clean up the script in several ways:

1. Be consisent with quotes: use single quotes pretty
   uniformly throughout as opposed to a mixture of quotes
   and \-escaping #'s. Use double quotes when interpolating
   a variable into a string, of course.
2. Remove some old cruft and outdated comments.  It appeared
   that some of the comments dated from e.g. inferno or an
   earlier version of the system.
3. Move the 'default' configuration for network directly
   into /ifconfig.

Tested: Booting in various configurations.
Change-Id: I11aadb6f571c04c692d46a4794957245feb23d20

Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Make new virtio implementation work with new vmm 2LS
GanShun [Mon, 9 May 2016 23:40:16 +0000 (16:40 -0700)]
VMM: Make new virtio implementation work with new vmm 2LS

Changed pthread implementation to use the vmm task_threads.

Signed-off-by: GanShun <ganshun@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Change vmm_run_task return values
GanShun [Mon, 9 May 2016 23:35:19 +0000 (16:35 -0700)]
VMM: Change vmm_run_task return values

Make vmm_run_task return 0 on a failure and return the pointer to the
task thread on success

Signed-off-by: GanShun <ganshun@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Replace the old virtio in vmrunkernel with the new virtio
Michael Taufen [Wed, 4 May 2016 22:30:35 +0000 (15:30 -0700)]
VMM: Replace the old virtio in vmrunkernel with the new virtio

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
[formatting change]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added header for virtio_lguest_console functions
Michael Taufen [Wed, 4 May 2016 22:55:39 +0000 (15:55 -0700)]
VMM: Added header for virtio_lguest_console functions

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Modified console queue service functions for our virtio
Michael Taufen [Wed, 4 May 2016 22:52:25 +0000 (15:52 -0700)]
VMM: Modified console queue service functions for our virtio

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added console queue service functions from lguest
Michael Taufen [Wed, 4 May 2016 22:45:03 +0000 (15:45 -0700)]
VMM: Added console queue service functions from lguest

These will act as the basis for our console queue service functions.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
[minor formatting changes]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added the VIRTIO_CONFIG_S_NEEDS_RESET bit to virtio_config.h
Michael Taufen [Wed, 4 May 2016 18:40:46 +0000 (11:40 -0700)]
VMM: Added the VIRTIO_CONFIG_S_NEEDS_RESET bit to virtio_config.h

We don't use the bit in our device implementation yet, and in fact the
drivers in Linux do not appear to use it either (searching the Linux
sourse only turns up the macro in virtio_config.h).

Notably, the bit definition was only added to Linux about a month ago.
See commit c00bbcf86289 ("virtio: add VIRTIO_CONFIG_S_NEEDS_RESET device
status bit") to https://github.com/torvalds/linux.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Decoder hack
Michael Taufen [Wed, 4 May 2016 18:01:08 +0000 (11:01 -0700)]
VMM: Decoder hack

This dirty hack makes the decoder return 4 bytes as the target size for
certain mov instructions, so that virtio mmio device doesn't think the
guest is using the wrong access width when reading/writing the
memory-mapped region.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Add virtio_mmio.c which contains our implementation of the virtio mmio transport
Michael Taufen [Wed, 4 May 2016 17:54:00 +0000 (10:54 -0700)]
VMM: Add virtio_mmio.c which contains our implementation of the virtio mmio transport

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Add our virtio_mmio_dev struct and specify its interface functions
Michael Taufen [Wed, 4 May 2016 03:50:52 +0000 (20:50 -0700)]
VMM: Add our virtio_mmio_dev struct and specify its interface functions

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added a helper function for validating device features
Michael Taufen [Wed, 4 May 2016 03:40:34 +0000 (20:40 -0700)]
VMM: Added a helper function for validating device features

As we add more devices (e.g. network), we can add more cases for
device-specific feature validation to this function.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
[formatting]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added virtio_lguest_helpers.h for helper functions derived from lguest
Michael Taufen [Wed, 4 May 2016 03:31:33 +0000 (20:31 -0700)]
VMM: Added virtio_lguest_helpers.h for helper functions derived from lguest

This is included in virtio.h so that people can just include virtio.h and
access the common virtio utility functions, but we still maintain a clean
separation between our code and code derived from lguest.

Users should not include virtio_lguest_helpers.h directly.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Change wmb to ACCESS_ONCE in next_desc in virtio_lguest_helpers.c
Michael Taufen [Sat, 7 May 2016 22:40:16 +0000 (15:40 -0700)]
VMM: Change wmb to ACCESS_ONCE in next_desc in virtio_lguest_helpers.c

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Modify lguest helpers for our virtio
Michael Taufen [Wed, 4 May 2016 03:18:29 +0000 (20:18 -0700)]
VMM: Modify lguest helpers for our virtio

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
[typo]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added includes to virtio_lguest_helpers.c for our implementation of virtio-mmio
Michael Taufen [Wed, 4 May 2016 03:17:54 +0000 (20:17 -0700)]
VMM: Added includes to virtio_lguest_helpers.c for our implementation of virtio-mmio

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Added virtio_lguest_helpers.c with utility functions
Michael Taufen [Tue, 3 May 2016 23:05:54 +0000 (16:05 -0700)]
VMM: Added virtio_lguest_helpers.c with utility functions

From linux/tools/lguest/lguest.c

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Add virtio.h, which contains our error macros and core virtio structures
Michael Taufen [Tue, 3 May 2016 22:57:02 +0000 (15:57 -0700)]
VMM: Add virtio.h, which contains our error macros and core virtio structures

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Converted virtio headers to rely on types from stdint
Michael Taufen [Tue, 3 May 2016 22:38:32 +0000 (15:38 -0700)]
VMM: Converted virtio headers to rely on types from stdint

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Removed virtio_types.h and includes for that file
Michael Taufen [Tue, 3 May 2016 22:29:59 +0000 (15:29 -0700)]
VMM: Removed virtio_types.h and includes for that file

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Change virtio header include paths from linux to vmm
Michael Taufen [Tue, 3 May 2016 22:28:12 +0000 (15:28 -0700)]
VMM: Change virtio header include paths from linux to vmm

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Converted headers to use pragma once
Michael Taufen [Tue, 3 May 2016 22:25:15 +0000 (15:25 -0700)]
VMM: Converted headers to use pragma once

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Brought virtio headers in from Linux v4.5
Michael Taufen [Tue, 3 May 2016 22:20:08 +0000 (15:20 -0700)]
VMM: Brought virtio headers in from Linux v4.5

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Remove the old virtio (XCC)
Michael Taufen [Tue, 3 May 2016 22:06:34 +0000 (15:06 -0700)]
VMM: Remove the old virtio (XCC)

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCheck that bus freq is not zero
Christopher Koch [Wed, 11 May 2016 19:39:00 +0000 (12:39 -0700)]
Check that bus freq is not zero

Change-Id: Ib1e8986c4d1a41b87d854d9b47c301bd585f89ca
Signed-off-by: Christopher Koch <chrisko@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix route deletion.
Dan Cross [Mon, 9 May 2016 18:32:56 +0000 (14:32 -0400)]
Fix route deletion.

This is hokey in the way we use krefs, due to racey code
inherited from Plan 9.  But it works well enough now that
ipconfig runs and gets us a DHCP lease.

Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix off-by-one error in the page allocator
Barret Rhoden [Wed, 4 May 2016 21:39:17 +0000 (17:39 -0400)]
Fix off-by-one error in the page allocator

Trace through the code with order = 0 to convince yourself.  Basically,
anytime we found a non-free page in our scan, we'd run the next loop on the
page *two* pages forward.  If the page we skipped was already busy, then we
got lucky.

If it wasn't, we fragmented our memory slightly.  That could be a problem
if you're doing a lot of higher-order allocations (CONFIG_LARGE_KSTACKS).

There could also be a pathological case where there are many free pages,
you only want a single free page, but we can't find them since we happen to
skip over them.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Allow gcc to use the red zone (XCC)
Barret Rhoden [Wed, 4 May 2016 19:42:50 +0000 (15:42 -0400)]
x86: Allow gcc to use the red zone (XCC)

Now that pop_user_ctx() can handle the red zone, we don't need to tell
gcc to never use it.

Rebuild your toolchain.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Support the red-zone for popping HW TFs
Barret Rhoden [Wed, 4 May 2016 19:37:04 +0000 (15:37 -0400)]
x86: Support the red-zone for popping HW TFs

We need this since glibc uses ASM that uses the red-zone.  Simply compiling
with -mno-red-zone is insufficient.

"And tell me, Mr. Anderson, what good is a compiler flag if you are
unable to compile?"

The plus side is we can use glibc's ASM and we can get slightly better perf
by using the red-zone.  The downside is that every attempt to pop a HW TF
burns 128 bytes more of the uthread's stack.  That decreases the number of
contiguous failures we can handle before running of the end of the user's
stack.  It's a good thing we just did commit 7506964a4e71 ("Check
notif_pending early in pop_user_ctx()"), which decreases the chance of
those errors.  We'll see...

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPrevent 2LSs from asking for too many vcores
Barret Rhoden [Wed, 4 May 2016 20:11:59 +0000 (16:11 -0400)]
Prevent 2LSs from asking for too many vcores

Some 2LSs just ask for more, regardless of how many the platform will take.
The kernel will ignore you, but no sense poking the beast.  Right now, the
kernel actually prints a debug message, since setting amt_wanted wrong is a
sign of a buggy program/library.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix write()'s sigpipe case (XCC)
Barret Rhoden [Tue, 3 May 2016 21:00:59 +0000 (17:00 -0400)]
Fix write()'s sigpipe case (XCC)

We were checking errno for every non-zero return, instead of every negative
return.  It's possible that the kernel spuriously sets errno but doesn't
return -1, in which case the user should not look at errno.  Likewise, an
application could have set errno = EPIPE.

And thanks to mtaufen for spotting the typo in read.c.

Rebuild glibc, but it's not urgent.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPush control over vcores into parlib variables
Barret Rhoden [Tue, 3 May 2016 20:42:20 +0000 (16:42 -0400)]
Push control over vcores into parlib variables

We had an extension to pthreads: pthread_can_vcore_request().  It was a way
for an application to tell the 2LS to not request vcores or to yield
vcores.  The problem with making it a pthread extension is that it is 2LS
specific: an app needs to know/care about it's 2LS, and every 2LS needed to
reimplement the same logic.

By pushing it into parlib, we avoid all of that.  The app also gets
finer-grained control over what it needs (i.e., there's a minor difference
between not yielding and not requesting more cores).

Be careful using this new variable.  It'll prevent *any* vcores from being
requested, so you want to use it after the app requests whatever vcores it
wants (not including the one VC you get from being an MCP).  This variable
is a minor pain, and might not be worth keeping around.  We'll see.

This is actually a problem of having 2LSs that aren't app-specific enough.
The app knows what it wants, but the 2LS doesn't.  We're trying to find a
way to deal with that in a way that doesn't duplicate too much code.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSupport select() on FDs that are already writable
Barret Rhoden [Tue, 3 May 2016 19:52:41 +0000 (15:52 -0400)]
Support select() on FDs that are already writable

This is an extension of commit 6cb2d8c1ce77 ("Allow select() calls on FDs
that are already ready").  There, we were dealing with reads.  The same
problem happens with writes.

Now, reads or writes will be detected, given that the underlying device
reports DMREADABLE/DMWRITABLE in its stat message.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoExport readable/writable bits via POSIX stat (XCC)
Barret Rhoden [Tue, 3 May 2016 19:50:31 +0000 (15:50 -0400)]
Export readable/writable bits via POSIX stat (XCC)

The devices report their stat in 9p's format.  This meant nothing to the
POSIX/glibc world.  Now we have access to those bits (in a different
location in the mode) in usermode.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReport readablity/writablility via 9p stat
Barret Rhoden [Tue, 3 May 2016 19:46:51 +0000 (15:46 -0400)]
Report readablity/writablility via 9p stat

This extends 9p to have bits for readable and writable, in the O_NONBLOCK
sense.  This is required for select().

Pipes and #ip use qio helpers to set the bit.  Other devices will need to
do something similar, if they use queues.  If not, they'll have to do
something else.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoHave stat print a mode in octal
Barret Rhoden [Tue, 3 May 2016 19:43:34 +0000 (15:43 -0400)]
Have stat print a mode in octal

I can't stand octal.  We can remove it all once we start using ros/fs.h in
glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agodevpipe: on write/writeb, have devpipe return the error from qio
Ronald G. Minnich [Mon, 2 May 2016 23:05:09 +0000 (16:05 -0700)]
devpipe: on write/writeb, have devpipe return the error from qio

This fixes the 'lost connection' problem on scp. Plus, it makes way
more sense.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix VFS clone_fdt bug
Barret Rhoden [Fri, 29 Apr 2016 20:31:14 +0000 (16:31 -0400)]
Fix VFS clone_fdt bug

If we attempted to clone an FDT that had grown beyond its initial limit
(32) and still had open files for the high FDs, then we'd trip an assert.
The fix is to grow the destination's FDT to correspond to the source's.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAttempt to merge VMRs during mprotect
Barret Rhoden [Fri, 29 Apr 2016 18:26:57 +0000 (14:26 -0400)]
Attempt to merge VMRs during mprotect

If you do a bunch of mprotects on parts of an mmaped region with different
settings, you'd break it up.  But if we mprotected to make a collection of
regions the same, then we wouldn't merge the VMRs back.

You'd notice this with vmrunkernel - we'd have O(100) VMRs, many of the
adjacent VMRs had the same settings.  Now those ones are merged.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Add command switches to control the 2LS
Barret Rhoden [Fri, 29 Apr 2016 18:49:10 +0000 (14:49 -0400)]
VMM: Add command switches to control the 2LS

-g: greedy - never yield your vcores
-s: scp - run as an SCP

Be sure to put the -s switches *before* the vm image.  That's why we
shouldn't roll our own arg parser.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Use safe MSR accessors
Barret Rhoden [Thu, 28 Apr 2016 20:24:23 +0000 (16:24 -0400)]
VMM: Use safe MSR accessors

We clearly need write_msr_safe.  The guest could give us an unacceptable
value that could trigger a GPF.  For read, better safe than sorry.  It's
possible we add an MSR that we allow the guest to read, but that isn't on
every piece of hardware.  In that case, we could also trigger a GPF.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRename safe_read_msr() -> read_msr_safe()
Barret Rhoden [Thu, 28 Apr 2016 20:08:20 +0000 (16:08 -0400)]
Rename safe_read_msr() -> read_msr_safe()

And the same for write().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Fix MSR emulation (XCC)
Barret Rhoden [Thu, 28 Apr 2016 19:39:21 +0000 (15:39 -0400)]
VMM: Fix MSR emulation (XCC)

emsr_ok() was busted.

First, it was swapping rax and rdx.  The functions take rdx first, but
rdmsr takes rax first.  This was the proximate cause of a bug where if you
ran a guest pcore that did Linux initialization on the same pcore that had
a previous VM do the same, then the kernel would GPF on wrmsr 0x1c9 <-
0x300000003.  Good times.

The rdmsr() macro also wasn't zeroing the upper part of rax.  So we'd have
old stuff floating around.  That would be okay if you only ever use it with
u32s, but since it's a macro, we didn't know that from its signature.
Great.

Finally, we were passing the upper 32 of rax through to write_msr or-ed
with rdx.  That's not supposed to happen either.

Reinstall your kernel header if you care.  Though that crappy macro
shouldn't be in a kernel header...

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agox86: Fix write_msr() casting
Barret Rhoden [Thu, 28 Apr 2016 16:42:24 +0000 (12:42 -0400)]
x86: Fix write_msr() casting

The hardware is supposed to ignore the upper 32 bits of rdx and rax, which
it does.  But we shouldn't pass in garbage.

Here's the asm before, with the input value in rax:

# ecx previously loaded
mov    %rax,%rdx  # u64 rax has the val, putting the upper 32 in rdx
shr    $0x20,%rdx  # upper 32 in rdx
wrmsr  # rax still has the upper bits

Here's the new asm:

mov    %rax,%rdx
mov    %edi,%ecx
mov    %eax,%eax  # zeroes the upper part of rax
shr    $0x20,%rdx  # upper 32 in rdx
wrmsr

When the compiler saw the u32 cast, it just ignores the masking.  However,
the inline asm actually takes rax, not eax.  So it's wrong to cast to a u32
there.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove struct vmctl (XCC)
Barret Rhoden [Thu, 28 Apr 2016 20:28:55 +0000 (16:28 -0400)]
Remove struct vmctl (XCC)

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a 2LS for VMMs
Barret Rhoden [Wed, 27 Apr 2016 22:14:24 +0000 (18:14 -0400)]
Add a 2LS for VMMs

We now have a basic 2LS for VMMs.  It doesn't handle preemption or other
serious issues, but it does the basics.  Specifically, it supports
vmrunkernel, which is no longer a pthread-based app.

You can control whether vmrunkernel is an SCP or an MCP, as well as whether
or not it yields, with the parlib_ control variables.  We can provide
arguments to vmrunkernel for that later.

Ancillary changes:
- virtio uses the VMM 2LS, instead of pthreads
- renamed the apic() function (too generic)
- the vmexit switch code was moved out of vmrunkernel and refactored.  It
  should be easier to follow.  In the process, I removed the empty apic()
case and the unused interrupt-window case.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a helper for blocking a uthread from VC ctx
Barret Rhoden [Wed, 27 Apr 2016 21:35:32 +0000 (17:35 -0400)]
Add a helper for blocking a uthread from VC ctx

All 2LSs perform the same basic thing for page faults: issue an async call,
then block on it.  The blocking process is like a stripped down version of
the normal blockon, since it picks up while the 2LS is already in vcore
context.

This commit adds the helper and uses it for the two exiting 2LSs.  This
actually fixes a minor issue: pthread code that was DONT_MIGRATE would have
had an issue.  Likewise, we weren't handling the PFs for the thread0 sched.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a test for file-backed mmap page faults
Barret Rhoden [Wed, 27 Apr 2016 21:28:01 +0000 (17:28 -0400)]
Add a test for file-backed mmap page faults

If you run it, then reboot if you care about KFS performance.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a parlib control variable for yielding
Barret Rhoden [Wed, 27 Apr 2016 18:04:13 +0000 (14:04 -0400)]
Add a parlib control variable for yielding

This allows applications to control whether or not their 2LS yields.  You
might want to never yield for greedy performance or testing.

Note that the 2LS can ask for more vcores, if it wants/needs it.  It just
won't yield them.  This should be fine.  Apps can always ask for vcores
directly, which the 2LS won't yield.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse a lock when printing trap info
Barret Rhoden [Wed, 27 Apr 2016 16:35:14 +0000 (12:35 -0400)]
Use a lock when printing trap info

In case of errors in parallel.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a parlib debug_print helper
Barret Rhoden [Tue, 26 Apr 2016 20:28:31 +0000 (16:28 -0400)]
Add a parlib debug_print helper

Calling printf from vcore context is currently dangerous.  Both call into
glibc, which is what we want, but glibc's locking isn't PDR.  If a uthread
is doing a lot of printing, then we try to print from that vcore in a
handler, then we'll deadlock.  That needs to get fixed.  Until then, we
have this helper.  It also might be useful for other debugging.

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