akaros.git
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>
3 years agoVMM: Remove the stack
Barret Rhoden [Tue, 26 Apr 2016 16:25:20 +0000 (12:25 -0400)]
VMM: Remove the stack

The guest OS is responsible for the stack.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Fix gpa address lookup
Barret Rhoden [Mon, 25 Apr 2016 20:28:34 +0000 (16:28 -0400)]
VMM: Fix gpa address lookup

First, use a helper instead of assuming 0xfff is the PGOFF mask.  Second,
those checks against e.g. 0xfec would also hit if the address was
0xfff00000, since 0xfff00000 & 0xfec00000 == 0xfec00000.  Finally, the 4096
check is really about emulating the first page, PG_ADDR == 0.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoVMM: Add struct virtual_machine, use it in MMIO
Barret Rhoden [Mon, 25 Apr 2016 19:49:59 +0000 (15:49 -0400)]
VMM: Add struct virtual_machine, use it in MMIO

As a whole, we'll need to track the overall state of the virtual machine.
That's what the struct virtual_machine is for.  Over time, we'll add more
bits to it, such as the memory mapping.

All VMM threads will know about their VM.  We'll need to track that
throughout the VMM.  MMIO creates threads, so it'll need to pass that
along.  (We might be able to infer it from current_uthread, but we're
already passing a guest_thread *).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake user/vmm depend on benchutil
Barret Rhoden [Mon, 25 Apr 2016 19:46:31 +0000 (15:46 -0400)]
Make user/vmm depend on benchutil

We'll need this for vcore ticks.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a helper to sleep a uthread forever
Barret Rhoden [Thu, 21 Apr 2016 20:50:35 +0000 (13:50 -0700)]
Add a helper to sleep a uthread forever

Just a double-lock on a mutex.  Thread0 for some apps might want to do
this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a helper to get a context's SP
Barret Rhoden [Wed, 20 Apr 2016 22:16:39 +0000 (15:16 -0700)]
Add a helper to get a context's SP

Used in debugging.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a notif_pending comment to proc_notify()
Barret Rhoden [Wed, 20 Apr 2016 23:12:19 +0000 (16:12 -0700)]
Add a notif_pending comment to proc_notify()

I thought that we could check notif_pending and bail out early, but on
closer inspection, that might be wrong.  Better let everyone know.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCheck notif_pending early in pop_user_ctx()
Barret Rhoden [Wed, 20 Apr 2016 22:03:14 +0000 (15:03 -0700)]
Check notif_pending early in pop_user_ctx()

If notif_pending was set any time after being cleared (handle_events())
and before we fully popped the context, the pop would fail and we'd inch
our way down the uthread's stack.  If that happened every time (perhaps
due to a buggy 2LS, or a 2LS that receives regular events and does a
decent amount of processing during that window), then we'd eventually
run off the end of the stack in proc_pop_ctx.

The vulnerable window still exists, but it is shrunk down a lot.  You'd
have to get notif_pending set after the check *and* not before the
check.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMove pop_user_ctx implementations to a .c file
Barret Rhoden [Wed, 20 Apr 2016 21:29:09 +0000 (14:29 -0700)]
Move pop_user_ctx implementations to a .c file

We need the save_user_ctx() functions to be inlined, but we don't need
that for popping the contexts.

I have a fix in a later commit that will be simpler if these functions
are not in a header.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove vcore32.h
Barret Rhoden [Wed, 20 Apr 2016 21:24:28 +0000 (14:24 -0700)]
Remove vcore32.h

Moved vcore64.h to vcore.h.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove the return value from vcore_request_more()
Barret Rhoden [Thu, 25 Feb 2016 16:17:48 +0000 (11:17 -0500)]
Remove the return value from vcore_request_more()

For a long time now the return value was of dubious value - you were never
really guaranteed that you were the one who executed the poke, so it was
possible for you to get a 0 back (success) but the call actually failed
under the hood.

Of course, none of the tests really had that issue.  vcore_request_* will
just panic internally on any error.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReplace uses of the "ghetto incremental interface"
Barret Rhoden [Thu, 25 Feb 2016 16:10:39 +0000 (11:10 -0500)]
Replace uses of the "ghetto incremental interface"

Many places that were using vcore_request_more() really wanted to use
vcore_request_total().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow requesting a total number of vcores
Barret Rhoden [Wed, 24 Feb 2016 23:32:32 +0000 (18:32 -0500)]
Allow requesting a total number of vcores

This is a way to ask for a total / absolute number of vcores.

The old vcore_request_more() still works, and is implemented with the new
vcore_request_total.  2LSs can use whichever method they want.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRefactor vcore_request_more()
Barret Rhoden [Wed, 24 Feb 2016 22:50:44 +0000 (17:50 -0500)]
Refactor vcore_request_more()

This separates out the prepping of the new vcores from vcore_request.  It
also uses the helper prep_new_vcores() for the initialization of vcore 0,
which helps us consolidate all of the initialization that needs to be done
for a vcore.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRename vcore_request() -> vcore_request_more()
Barret Rhoden [Wed, 24 Feb 2016 22:00:19 +0000 (17:00 -0500)]
Rename vcore_request() -> vcore_request_more()

vcore_request() takes an incremental number of vcores.  That is a little
confusing, when compared to an interface that takes an absolute number of
cores.

The rename of most of the usages was done with this spatch:

@@
expression NR;
@@
-vcore_request(NR)
+vcore_request_more(NR)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoProvide vcore timer ticks for 2LSs
Barret Rhoden [Tue, 23 Feb 2016 20:34:21 +0000 (15:34 -0500)]
Provide vcore timer ticks for 2LSs

2LSs can now run their own timer ticks, which run in virtual time (the time
a vcore is online).  Each vcore can have its own independent tick.  The 2LS
needs to poll the tick in its sched_entry() 2LS op.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDemacro-ify the user BITMASK helpers
Barret Rhoden [Mon, 22 Feb 2016 22:13:45 +0000 (17:13 -0500)]
Demacro-ify the user BITMASK helpers

If you passed in e.g. bit 7 to CLR_BITMASK_ATOMIC(), the compiler would
give you a warning.  The joy of macros.

This implements most of the macros as inline functions.  Other than fixing
the bug with _size, the code should be the same as before - just as
functions, not macros.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix bitmask last-byte accounting
Barret Rhoden [Mon, 22 Feb 2016 22:11:51 +0000 (17:11 -0500)]
Fix bitmask last-byte accounting

This bug was hidden by bad formatting.  It looks like the _size-- is part
of the for loop, but it isn't.

The ancient bitmask code is pretty lousy.  The long-term fix is to just use
the Linux bitops, and throw away our old macros.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a helper for stopping current_uthread
Barret Rhoden [Mon, 22 Feb 2016 17:01:53 +0000 (12:01 -0500)]
Add a helper for stopping current_uthread

A 2LS could use this to swap threads in response to an event, e.g. a timer
tick.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a helper for yielding from 2LSs
Barret Rhoden [Thu, 18 Feb 2016 22:51:24 +0000 (17:51 -0500)]
Add a helper for yielding from 2LSs

vcore_yield() does not always succeed.  Some 2LSs can just use this in a
loop (e.g. pthreads).  Other 2LSs might want to just either yield or start
over with a fresh vcore context.  This helper will do that.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMark parlib 2LS functions as noreturn
Barret Rhoden [Thu, 18 Feb 2016 22:45:59 +0000 (17:45 -0500)]
Mark parlib 2LS functions as noreturn

There are a bunch of functions in the 2LS that do not return.
run_.*uthread(), vcore_entry(), etc.  Marking them as noreturn will allow
us use the compiler to enforce that functions in specific 2LSs are noreturn
as well.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a helper for tracing exec.
Ronald G. Minnich [Fri, 29 Apr 2016 20:44:11 +0000 (13:44 -0700)]
Add a helper for tracing exec.

It's been a major pain not to have this,
and for dropbear it's not possible to debug
until we get it.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[return "Invalid exec path", instead of printk("fail")]
[removed extra user_memdup_free()]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoInitial clean up of gettimeofday and timekeeping
Michael Davidson [Fri, 29 Apr 2016 00:11:30 +0000 (17:11 -0700)]
Initial clean up of gettimeofday and timekeeping

Add the date command to busybox

Use scaled integer arithmetic for TSC cycles to nanoseconds conversions.

Add inline conversion functions from nanoseconds to timespec and timeval
and update existing tsc2timespec() interface to return its result.

Add a get_persistent_clock() interface to get the initial date and time
when the system is initialized. (Not yet implemented)

Add very rudimentary timekeeping data to keep track of both initial
walltime in nsecs and initial TSC value.

Use epoch_nsec() to implement gettimeofday() system call.

Note: these changes should not cause any differences in system behavior.

Signed-off-by: Michael Davidson <md@google.com>
[minor checkpatch touchup]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoDon't look at the block after calling qbypass
Ronald G. Minnich [Thu, 28 Apr 2016 06:10:41 +0000 (23:10 -0700)]
Don't look at the block after calling qbypass

The bypass functions call bpfree. There's no guarantee
about the block pointer after calling the function.

This is probably why, in the original, the bypass functions
returned the data consumed. For now, realistically, it's all
consumed.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMove ifaddrs to glibc (XCC)
Barret Rhoden [Wed, 20 Apr 2016 23:37:26 +0000 (16:37 -0700)]
Move ifaddrs to glibc (XCC)

Note that the file is ifaddrs.c in glibc, as compared to ifaddr.c.  The
sysdep has to match exactly what glibc expects.

We also need the libc_hidden_def for some reason.  Basically whatever
glibc does in other versions of ifaddrs.c needs to be done in our.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd getifaddrs support and a test.
Ronald G. Minnich [Wed, 20 Apr 2016 18:09:26 +0000 (11:09 -0700)]
Add getifaddrs support and a test.

Per the man page, we don't have to fill out addr, mask, and
broadaddr, and this is such a dump API that we don't.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[closed net and addr on error]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake /dev open in the 9 space, not the vfs.
Ronald G. Minnich [Wed, 20 Apr 2016 14:48:58 +0000 (07:48 -0700)]
Make /dev open in the 9 space, not the vfs.

Another stopgap. Let's hope we kill this one in < 2 3/4 years :-)

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoIncrease the size of seq_ctr_t to 32 bits (XCC)
Barret Rhoden [Tue, 19 Apr 2016 20:33:56 +0000 (13:33 -0700)]
Increase the size of seq_ctr_t to 32 bits (XCC)

8 bits was too small - we could have 256 writes that could be
interpreted as "nothing changed."

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove the last vestiges of the old syscall tracer
Barret Rhoden [Fri, 15 Apr 2016 20:12:38 +0000 (16:12 -0400)]
Remove the last vestiges of the old syscall tracer

RIP, nearly six years old: 0fabbd46e285 ("Syscall tracing")

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoConsolidate the two syscall tracers
Barret Rhoden [Fri, 15 Apr 2016 19:57:49 +0000 (15:57 -0400)]
Consolidate the two syscall tracers

The old syscall tracer is gone.  Now it all uses the same infrastructure.
You can still "trace syscall start" from the monitor, but that's it - it'll
trace everything.

This also fixes a couple minor things, which prompted the change.  First,
we were reporting a gibberish value for the retval on Entry records.  This
could be confusing in the traces.  Now they are just ---.  This required
separate format strings for entry and exit.

Also, on exit, we were setting the extra data to 0.  Say we came in on a
write; we'd capture the data then.  On exit, we'd lose it.  This might have
been intentional, and if so, I can change it back.  I found it a little
confusing when I was looking at Exit records.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoremove spurious optimization in udelay_pit()
Michael Davidson [Fri, 15 Apr 2016 20:30:44 +0000 (13:30 -0700)]
remove spurious optimization in udelay_pit()

gcc has been optimizing division by a constant into a multiply
and shift for at least 10 years now so there is no need to do
this by hand as a special case - especially in a function that
is going to delay for at least 1 microsecond anyway.

Also remove unnecessary casts - usec is a uint64_t so everything
else in the expression is going to get promoted appropriately.

Signed-off-by: Michael Davidson <md@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPort tests/timerfd.c
Barret Rhoden [Fri, 8 Apr 2016 15:59:34 +0000 (11:59 -0400)]
Port tests/timerfd.c

Removes the LTP integration, uses select instead of poll, adds more
thorough tests, and fixes some checkpatch complaints.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImport timerfd test from Linux
Barret Rhoden [Fri, 8 Apr 2016 15:51:51 +0000 (11:51 -0400)]
Import timerfd test from Linux

From the Linux Test Project https://github.com/linux-test-project/ltp
commit b9b230e.

I named it .orig so we don't try to build it for Akaros with make tests.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImplement timerfd on top of #alarm (XCC)
Barret Rhoden [Fri, 8 Apr 2016 16:38:47 +0000 (12:38 -0400)]
Implement timerfd on top of #alarm (XCC)

It mostly matches.  It is a little unfortunate that read() expects
host-endian format for the u64.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd period and count to #alarm
Barret Rhoden [Wed, 13 Apr 2016 20:23:16 +0000 (16:23 -0400)]
Add period and count to #alarm

This adds two features:
- period: the alarm will repeat with interval 'period'
- count: track the amount of times the alarm fired.  You can read with
  EAGAIN and select/epoll this.

I also added some protection to various races on the proc_alarm's state.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd the helper strtoul_from_ubuf()
Barret Rhoden [Wed, 13 Apr 2016 15:46:49 +0000 (11:46 -0400)]
Add the helper strtoul_from_ubuf()

This comes up a lot: we want to read a number from a user buffer.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoChange #alarm cancel method
Barret Rhoden [Tue, 12 Apr 2016 22:13:42 +0000 (18:13 -0400)]
Change #alarm cancel method

Writing into a ctl is convenient, but its hard to get the status back out.
When you read ctl, you get the directory ID, not actual status.  We could
have a status variable that you parse, but that's a pain.

It's simpler to just have 0 > Qtimer mean "turn off the alarm".  That's
what this commit does, as well as removing the "cancel" command from Qctl.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd helpers for common 9ns functions (XCC)
Barret Rhoden [Tue, 12 Apr 2016 22:10:23 +0000 (18:10 -0400)]
Add helpers for common 9ns functions (XCC)

Careful with get_sibling_fd(); don't call it on a cloned FD yet.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoExport sys/plan9_helpers.h from glibc (XCC)
Barret Rhoden [Tue, 12 Apr 2016 22:00:16 +0000 (18:00 -0400)]
Export sys/plan9_helpers.h from glibc (XCC)

This way, we don't need to magically extern in symbols: there's a proper
header for it.

I also renamed it from 'sockets' to 'helpers', which is a little more
general, and put it in sys/.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImplement pipes in userspace (XCC)
Barret Rhoden [Mon, 11 Apr 2016 20:56:14 +0000 (16:56 -0400)]
Implement pipes in userspace (XCC)

With openat(), we don't need SYS_pipe.  Userspace can do this on their own.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd user helpers save_err and restore_err (XCC)
Barret Rhoden [Mon, 11 Apr 2016 20:53:37 +0000 (16:53 -0400)]
Add user helpers save_err and restore_err (XCC)

These save and restore errno and errstr.  Programs will want to use these
when they need to perform syscalls and want to preserve the original error.
Normally this is easy with errno, but you should save/restore errstr too.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoUse FD taps for event delivery for #alarm
Barret Rhoden [Mon, 11 Apr 2016 17:57:54 +0000 (13:57 -0400)]
Use FD taps for event delivery for #alarm

It turns out that FD taps work for #alarm, and they do a better job than
the old ev_q.  Now the user can tell us what it wants to hear for a
particular tap (e.g. the alarmid) instead of the kernel having to imply
that.  Plus, now we use just the one mechanism for asking the kernel to
send to an event when something happens (FD tap).

This required a few changes to userspace.  The subtlest is that
devalarm_set_evq takes timerfd instead of ctlfd.  That's actually a sign
that the API might be too coupled to the implementation.  The nicer
cleanups in userspace are:

- tests/alarm.c and PVC alarms use the devalarm interfaces (those functions
  predated that interface)
- devalarm provides a way to extract the ID, instead of functions checking
  ev_msg->ev_arg2

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd two time conversion helpers to glibc (XCC)
Barret Rhoden [Wed, 13 Apr 2016 20:26:54 +0000 (16:26 -0400)]
Add two time conversion helpers to glibc (XCC)

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoImplement clock_gettime() (XCC)
Barret Rhoden [Mon, 11 Apr 2016 18:36:10 +0000 (14:36 -0400)]
Implement clock_gettime() (XCC)

It's half baked; we don't have multiple clocks - it is just "time since
boot" + Nanwan's 0th birthday.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoModify glibc's printf for use from VC ctx (XCC)
Barret Rhoden [Mon, 11 Apr 2016 16:27:05 +0000 (12:27 -0400)]
Modify glibc's printf for use from VC ctx (XCC)

The existing hack for calling to vcore context doesn't work for snprintf.
Glibc uses the same backend for printing to files as well as buffers, which
makes sense since you only want to do format string handling once.  Our
hack only worked for files; if you did an snprintf from vcore context,
you'd fail (write to fd -1, incidentally).

Instead of hacking glibc to use our printf, we'll just hack out the major
stack gobblers from glibc's vprintf.  We'll see if this works or not.

As a side effect, we don't need our parlib version of printfmt.  I'm glad
to see it go, since it wasn't compatible with glibc's - including printf
format specifiers we registered with glibc.  You could have a format string
that was processed differently in vcore ctx than in uthread ctx, which
would be confusing.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoClear x86_default_fpu STX/MMX register state at boot
Michael Taufen [Tue, 12 Apr 2016 16:22:17 +0000 (09:22 -0700)]
Clear x86_default_fpu STX/MMX register state at boot

Also improved some comments

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoGCC patch r233572 added to makefile. (XCC)
Bob [Thu, 7 Apr 2016 20:55:53 +0000 (13:55 -0700)]
GCC patch r233572 added to makefile. (XCC)

Signed-off-by: Bobby Housley <broketech@users.noreply.github.com>
Rebuild the toolchain from scratch.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdded gcc r233572 patch
Bob [Thu, 7 Apr 2016 20:52:17 +0000 (13:52 -0700)]
Added gcc r233572 patch

To help enable building gcc 4.9.2 via gcc 6.

Signed-off-by: Bobby Housley <broketech@users.noreply.github.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoSet qemu's port-forwarding to port 22
Barret Rhoden [Wed, 6 Apr 2016 20:30:38 +0000 (16:30 -0400)]
Set qemu's port-forwarding to port 22

If you'd like to use ssh with qemu and user-mode networking, forward some
port (e.g. 5555) to 22.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a default sshd host key
Barret Rhoden [Wed, 6 Apr 2016 19:32:42 +0000 (15:32 -0400)]
Add a default sshd host key

Override this on your servers if you want to avoid MITM attacks.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoFix userspace's FP restore
Barret Rhoden [Thu, 7 Apr 2016 17:34:46 +0000 (13:34 -0400)]
Fix userspace's FP restore

We weren't passing the right xcr0.  Who knows what we were passing.  This
caused FP state to be partially restored.

Whenever we migrated pcores, we wouldn't get all of the new FP state, such
as having bad xmms.  We often would see parts of the correct FP state from
previous residents of the core, and the xmms were probably clobbered by
another thread calling into glibc for e.g. memset().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoACPI Table Fixes for vmrunkernel
Michael Taufen [Tue, 29 Mar 2016 20:25:54 +0000 (13:25 -0700)]
ACPI Table Fixes for vmrunkernel

Please note: Our ACPI tables are still quite hacky, and should probably
revised at some point in the future.

Upgraded table revision numbers as per the ACPI 5.0a spec

Used macros from actbl.h for ACPI table signatures
  One issue was that we had used "FADT" as the signature
  for the FADT table, when the ACPI spec says to use
  "FACP." Using the macros from the header should help
  avoid this in the future.

Provided a pre-compiled (from asl to c) DSDT in a new header file.
ACPI requires the DSDT table be present, and Linux makes the
reasonable assumption that you will provide it.

Puts the FADT address in the first entry of the XSDT, as Linux expects.

Background:

Linux used to place tables at fixed indices in an internal array
when reading in ACPI. It would look for the DSDT in a specific place
in that array later on, even when it hadn't managed to install it,
and would bail out and continue booting when it found bogus data.

We noticed the issue when we upgraded our Linux fork to v4.5, in which
they use a default value of 0xffffffff for the FADT and DSDT indices,
and set these indices as the tables are installed rather than using
fixed positions.

It would look for the address of the DSDT at this index, and the use of the
retrieved, bogus address would cause a page fault in the kernel during boot.

Linux commit 8ec3f459073e67e5c6d78507dec693064b3040a2 contains the relevant
change to ACPI code.

Signed-off-by: Michael Taufen <mtaufen@gmail.com>
[fixed checkpatch complaints, rm extraneous //comment]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMove the "home" directory to /
Barret Rhoden [Wed, 6 Apr 2016 16:06:13 +0000 (12:06 -0400)]
Move the "home" directory to /

Everyone works out of here, and we don't really have users.  Be sure to
change any scripts that were putting things in /root, e.g. ssh keys.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoCheck block extra_len in checkb()
Barret Rhoden [Tue, 5 Apr 2016 19:36:13 +0000 (15:36 -0400)]
Check block extra_len in checkb()

This helped catch a bug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoReturn 0 for a timed-out select()
Barret Rhoden [Mon, 4 Apr 2016 21:02:53 +0000 (17:02 -0400)]
Return 0 for a timed-out select()

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow select() calls on FDs that are already ready
Barret Rhoden [Fri, 1 Apr 2016 19:46:31 +0000 (15:46 -0400)]
Allow select() calls on FDs that are already ready

The super-spurious select() required programs to drain an FD completely
(i.e. read until you get an EAGAIN), though it is legal to just keep
asking.  Unfortunately, we have an app that does that (dropbear), so we
need to check if an FD is readable manually.

The bug was:

- packet arrives
- tap fires
- user wakes up
- user reads some of it, but not all of it
- user selects

Then we never way up, since a tap will not fire again.

If the user checks the FD (as we do here) and it has no data, then we can
sleep safely, knowing that an edge-triggered event will occur (since we
know the underlying queue was empty at some point).

Hopefully we don't need to do this for write().

Note that this doesn't work for "normal" disk files.  We don't have a way
to tell if a file is readable.  That's basically kernel support for select.

Also note that this 'fix' could mask errors related to changing the FD set
between successive calls to select().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAllow a thread to have multiple select() sets
Barret Rhoden [Fri, 1 Apr 2016 19:42:57 +0000 (15:42 -0400)]
Allow a thread to have multiple select() sets

The bug was that a single thread selected in multiple locations in the
code.  One select() call would consume the events from another call.  Then
the latter call would sleep, since it's event was gone.

We might still have issues where the same {thread, callsite} combo consumes
events for other invocations from that same location.  This could happen if
a program changes its fdsets.  Once something is selected, the event can be
consumed anywhere.  Here's the scenario:

- select on FD 1
- select on FD 2 (can return for FD 1 or 2)
- assume it was FD 2, and don't check FD 1.  your fd_set from the select
  call will only show FD 2, since we just return whatever you passed us.
- select on FD 1 (the event was consumed, so we're going to wait forever).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd a get_stack_pointer() helper to parlib
Barret Rhoden [Fri, 1 Apr 2016 19:42:03 +0000 (15:42 -0400)]
Add a get_stack_pointer() helper to parlib

I went with the same naming convention as set_stack_pointer.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Add the RQ and WQ len to ipchaninfo
Barret Rhoden [Fri, 1 Apr 2016 19:30:10 +0000 (15:30 -0400)]
net: Add the RQ and WQ len to ipchaninfo

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoRemove the special casing of #pipe in lseek
Barret Rhoden [Fri, 1 Apr 2016 19:26:18 +0000 (15:26 -0400)]
Remove the special casing of #pipe in lseek

If we want to disallow seeks on a per-device basis, then we need a device
op (probably use chan_ctl).  None of this crappy special casing.
Incidentally, we'd probably want to do it for #ip too, and who knows what
is running on the other end of a server (or across a mount point!).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoqio: Remove the old qnonblock()
Barret Rhoden [Thu, 31 Mar 2016 18:53:16 +0000 (14:53 -0400)]
qio: Remove the old qnonblock()

This was the old interface used to set both ends of a queue to
non-blocking.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoAdd O_NONBLOCK support to pipes
Barret Rhoden [Thu, 31 Mar 2016 18:35:21 +0000 (14:35 -0400)]
Add O_NONBLOCK support to pipes

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Fixup socket shims use of O_NONBLOCK (XCC)
Barret Rhoden [Thu, 31 Mar 2016 17:09:19 +0000 (13:09 -0400)]
net: Fixup socket shims use of O_NONBLOCK (XCC)

Chans are now nonblocking, not conversations.  We find out about the desire
for SOCK_NONBLOCK from socket()'s type argument.  We save that in the
Rock's sopts, and we check it whenever we open a chan *for that socket*
(but not for new accepts).

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Fixup iplib based on the O_NONBLOCK rules
Barret Rhoden [Wed, 30 Mar 2016 22:42:19 +0000 (18:42 -0400)]
net: Fixup iplib based on the O_NONBLOCK rules

Previously, we could open the CTL with O_NONBLOCK, and that would set the
entire conversation non-blocking.  O_NONBLOCK is now a per-chan thing.  Now
there's no reason to open the CTLs non-blocking when making a conversation,
but we do need to open the DATAs O_NONBLOCK.  We still need to open the
LISTENs O_NONBLOCK (which returns a CTL fd...).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Use chan flag O_NONBLOCK for nonblocking
Barret Rhoden [Wed, 30 Mar 2016 22:37:42 +0000 (18:37 -0400)]
net: Use chan flag O_NONBLOCK for nonblocking

Instead of setting the entire conversation (and thus the queues underneath)
to nonblocking, we now use the chan flag.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agonet: Add a helper chan2conv()
Barret Rhoden [Wed, 30 Mar 2016 21:03:47 +0000 (17:03 -0400)]
net: Add a helper chan2conv()

Cleans up a few places.  There still are some places that walk the
inscrutable pointer chain from FS to CV, but whatever.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoqio: Provide helpers for O_NONBLOCK operations
Barret Rhoden [Wed, 30 Mar 2016 20:49:29 +0000 (16:49 -0400)]
qio: Provide helpers for O_NONBLOCK operations

We can now q{b,}{read,write}() in a non-blocking manner, such that each
operation is non-blocking, independently of the rest of the queue.

The old qnonblock style was setting the entire queue to be non-blocking.
This would be a big surprise to the distant end of the queue.  We didn't
notice it with #ip, since the other end of the queue was usually doing a
non-blocking op anyways (or was just buggy!).  We definitely noticed with
pipe, especially when busybox suddenly had its read of stdin throw EAGAIN.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoqio: Consolidate readers into __qbread()
Barret Rhoden [Wed, 30 Mar 2016 18:08:45 +0000 (14:08 -0400)]
qio: Consolidate readers into __qbread()

There are a bunch of different functions that read from a queue:
- qread()
- qbread()
- qget()
- qdiscard()

And I'll be adding more soon.

They all had slightly different semantics, but mostly did the same thing.
I consolidated them into one __qbread(), which returns a blocklist.  The
functions do whatever they want with the list.

To some extent, this will be a little slower than before.  Other than just
stuff like branching, qdiscard was able to just free as it went, instead of
transferring them to a new list (meaning it never needed the 'spare' block
for allocations).  Same goes for qread().

OTOH, qread was holding a spinlock and writing to user memory.  Not
anymore!  So that will save us from a source of complexity later.

We do have slightly different semantics now.  __qbread() will *attempt* to
get up to len, but might return early (with amt > 0) while there is more
data in the queue.  Some of the functions, like qdiscard(), can't handle
this.  I used a somewhat racy loop around __qbread() in that case.

There's now only one source of producer wakeup, where I preserved
Presotto's comment and change to the heuristic.  Who knows if that was
supposed to apply in other places, or if it was just added to the place
that popped up during profiling.  Now there's just one site.

A lot of QIO is an unclear mess.  Why does qbread return only one block?
(Note in #mnt that a dev.bread expects to get a blocklist back).  Why is a
blocklist different than a block in many places?   Good thing we have
blocklen() (length of a block list) and BLEN() (length of a block).   Why
are so many functions mucking with queues without locks?  (e.g. qaddlist())
Good times.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMake freeb() and freeblist() return the old size
Barret Rhoden [Wed, 30 Mar 2016 03:08:58 +0000 (23:08 -0400)]
Make freeb() and freeblist() return the old size

A few functions like to know this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoMove SIZE_MAX into common.h
Barret Rhoden [Wed, 30 Mar 2016 02:56:31 +0000 (22:56 -0400)]
Move SIZE_MAX into common.h

Note that this is the *kernel's* common.h, not the kernel header
ros/common.h.

Also note that all C files in the kernel are built with common.h
included automatically.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoPass the buf to block_append_extra()
Barret Rhoden [Mon, 28 Mar 2016 19:34:08 +0000 (15:34 -0400)]
Pass the buf to block_append_extra()

Instead of assuming that they want us to allocate the block, we just take
any old buffer of kmalloc'd memory.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
3 years agoqio: Remove qconsume()
Barret Rhoden [Mon, 28 Mar 2016 18:00:56 +0000 (14:00 -0400)]
qio: Remove qconsume()

It's nasty and no one uses it (in Akaros).  It looks like the uart code
from Plan 9 used it.  This is the same deal as qproduce(), I think.

Specifically, qconsume() consumes up to len from the queue, but only from
the first non-empty block.

If we ever need this, we can bring it back or reimplement it with qget() or
something.

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