akaros.git
2 years ago9ns: Align struct dirtab to 64 bytes
Barret Rhoden [Fri, 31 Mar 2017 00:08:11 +0000 (20:08 -0400)]
9ns: Align struct dirtab to 64 bytes

devvars puts struct dirtabs into a linker table.  Those tables are all
64 byte aligned, and the objects within the table will be laid out with
64 byte alignment.

This was probably the cause of the intermittent startup assertion
failure in vars_init() (couldn't find ".").  "." is at the end of the
vars table, and any confusion regarding the length, size, or alignment
of the tables and objects could result in not memcpying that item.

I noticed this when changing the KNAMELEN, which increased the size of
the dirtab to 0x120 bytes.  That's 32-byte aligned, not 64.  However,
the objects within the table were laid out (by the linker) in 0x140 byte
strides: 0x120 rounded up to 64.  Additionally, before I fixed this
alignment, vars_init() had a hard time doing pointer arithmetic on the
struct dirtab *s, and would come up with a really large number.  Doing
the math manually worked.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years ago9ns: Catch errors thrown by devtab.{reset,init}
Barret Rhoden [Thu, 30 Mar 2017 21:01:24 +0000 (17:01 -0400)]
9ns: Catch errors thrown by devtab.{reset,init}

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years ago9ns: Use strlcpy() for various devices
Barret Rhoden [Thu, 30 Mar 2017 20:26:26 +0000 (16:26 -0400)]
9ns: Use strlcpy() for various devices

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years ago9ns: Use an int for perm and mode
Barret Rhoden [Thu, 30 Mar 2017 18:04:12 +0000 (14:04 -0400)]
9ns: Use an int for perm and mode

-1 means "don't change the mode."  That was 0x00000000ffffffff, which is
not ~0UL (0xffffffffffffffff).  Just use an int and don't play games with
the sizeof longs and whatnot.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agodevroot: Fix stat and clean up rootgen.
Barret Rhoden [Thu, 30 Mar 2017 18:01:28 +0000 (14:01 -0400)]
devroot: Fix stat and clean up rootgen.

Stat on directories didn't work.  It was doing the usual devstat() thing
where devstat() makes a fake entry.  But we can actually do better, by
implementing rootstat directly.  Since we're trying to be a filesystem, we
shouldn't be using the synthetic solutions (e.g. devstat), which get the
timestamps and usernames wrong.

Likewise, I cleaned up rootgen() a little.  We had been taking a dirtab
pointer, but not actually using it (except in one odd case), which was
confusing.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agodevroot: Use dirtab's length instead of rootdata's size
Barret Rhoden [Wed, 29 Mar 2017 18:38:29 +0000 (14:38 -0400)]
devroot: Use dirtab's length instead of rootdata's size

There were two mechanisms tracking the size of an object in #root - the
dirtab's length and the rootdata's size fields.  We didn't always keep them
in sync, and we really only need one.

I also removed the sizep field - it wasn't clear that it was used for
anything other than the rootinit() attempt to keep the length and size in
sync.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoqio: Clean up q.*full()
Barret Rhoden [Wed, 29 Mar 2017 15:14:06 +0000 (11:14 -0400)]
qio: Clean up q.*full()

The old qfull() and qwritable() should be opposites.  qfull() was actually
wrong in that if we had set no limit, qfull() would always return TRUE
instead of always returning FALSE.  I guess in Plan 9 it was on the caller
to know if there was a limit or not.

qnotfull() was a rendez condition, not a generic function.  It also wasn't
just about being full or not, it included being closed.  Renaming the
function makes that more clear.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoqio: Remove q->len
Barret Rhoden [Wed, 29 Mar 2017 14:54:44 +0000 (10:54 -0400)]
qio: Remove q->len

q->dlen is the amount of data bytes in the queue: the bytes that our
clients are adding and removing.

q->len was the amount of total bytes in the queue, including metadata,
block structs, and anything else.  If you had a block with 0 data bytes in
the queue, the size of the block itself counted against q->len.

Note that the qlen() function actually returns q->dlen.  The only time we
really used q->len was for flow control, and that's where it caused
problems.  I had a pipe where the reader didn't wake a writer.  The reader
saw 'was_unwritable', then popped a block of length 0, and did a retry
(this was the Qcoalesce case).  However, popping that block made the queue
writable again, which was unexpected since the reader got nothing.

Instead of mucking around with q->len and q->dlen any further, I just
yanked q->len completely.  It's not clear that we even wanted q->len, and
it's been the source of bugs and confusion for a while now.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoucq: Fix print_ucq()
Barret Rhoden [Tue, 21 Mar 2017 18:25:19 +0000 (14:25 -0400)]
ucq: Fix print_ucq()

Two things: one was a u64 vs u32 (the slot is often > 4 GB), and the comma
operator in the for loop's check was wrong.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agorandom: Support epoll() and select()
Barret Rhoden [Tue, 21 Mar 2017 18:10:37 +0000 (14:10 -0400)]
random: Support epoll() and select()

The taps are for epoll().  select() doesn't actually need the taps, since
it will see (u)random as readable, always (fstat).  If we ever make Qrandom
block, then we can add edge detection to it (and thus a real tap function).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocons: Support epolling /dev/null
Barret Rhoden [Mon, 20 Mar 2017 22:37:31 +0000 (18:37 -0400)]
cons: Support epolling /dev/null

Some apps want to epoll on their output streams.  If that's redirected to
/dev/null (#cons/null), then they will try to epoll/select/poll on it.

We don't have actual edges, but we can fake it.  And we'll also need to
support stat reporting writable.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Handle variable-width timestamps
Barret Rhoden [Mon, 20 Mar 2017 22:19:10 +0000 (18:19 -0400)]
strace: Handle variable-width timestamps

If a machine has an uptime of over 10 million seconds (about 4 months),
then the timestamp field grows.  Strace couldn't handle this, since it
assumed the field was 40 bytes.

Incidentally, the machine wasn't up for 120 days, but it might have not
been turned off in that long.  Sometimes (often?) soft reboots don't reset
the TSC, which is where that timestamp comes from.  This occurence is the
same reason I found the bug from commit fd20de73987b ("Fixes TCP drops due
to ARP timeouts").

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Allow local.d configs to specify HOST / FQDN
Barret Rhoden [Fri, 17 Mar 2017 20:28:22 +0000 (16:28 -0400)]
net: Allow local.d configs to specify HOST / FQDN

If you set HOST, ifconfig will create a line in /etc/hosts for the primary
NIC's IP (ipifc/0).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: slab: Fix ancient ctor off-by-one
Barret Rhoden [Thu, 16 Mar 2017 22:43:08 +0000 (18:43 -0400)]
parlib: slab: Fix ancient ctor off-by-one

The original purpose for that list was to build the chain of small slab
objects.  But we only ran the ctor on the first n - 1 of them.

This bug is ancient - it's from the kernel's original slab implementation.
We hadn't really used slab ctors a lot.  Same goes for userspace, until my
recent epoll changes.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Align the stack when saving FP state
Barret Rhoden [Thu, 16 Mar 2017 19:06:42 +0000 (15:06 -0400)]
parlib: Align the stack when saving FP state

We need the sigdata struct to be aligned properly for the FPU save/restore.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix potential races with DTLS
Barret Rhoden [Thu, 2 Mar 2017 17:56:21 +0000 (12:56 -0500)]
parlib: Fix potential races with DTLS

I didn't see these happen, but stumbled on them as possibilities during
other bug hunts.

The DTLS one sounds a lot like a problem with glibc's version.  For the
pthread code, I'm being a little paranoid.  pthread_cleanup_pop() will call
free(), which also might want to use the DTLS.  free() should be able to
handle things if the key is deleted, but who knows.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Fix assertion in cpu_relax_vc()
Barret Rhoden [Thu, 2 Mar 2017 17:45:47 +0000 (12:45 -0500)]
parlib: Fix assertion in cpu_relax_vc()

It's okay for a uthread to do this, but they must have notifications
disabled, such that the rest of the system (kernel and user code on other
cores) thinks this vcore is running in vcore context.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Remove get_user_ctx_stack()
Barret Rhoden [Mon, 27 Feb 2017 19:14:48 +0000 (14:14 -0500)]
parlib: Remove get_user_ctx_stack()

This was an older function whose functionality is now handled by
get_user_ctx_sp().

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: socket: Implement accept4() (XCC)
Barret Rhoden [Fri, 24 Feb 2017 21:44:58 +0000 (16:44 -0500)]
net: socket: Implement accept4() (XCC)

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: socket: Support SOCK_CLOEXEC (XCC)
Barret Rhoden [Fri, 24 Feb 2017 20:56:22 +0000 (15:56 -0500)]
net: socket: Support SOCK_CLOEXEC (XCC)

If a socket is marked SOCK_CLOEXEC, then the intention is that none of that
socket's FDs (the socket itself, any listen files, ctls, etc) will get
passed on to its child after exec().

Note that accept() does not pass on CLOEXEC, yet.  The NONBLOCK was for the
attempt, which was when we were the parent socket.  The actual ctl that we
get in return is the child socket, which is controlled by accept4() (TBD).

Although I want to get rid of exec(), in the meantime, we should attempt to
support it.

While I was here, I added a helper for opening a Rock's ctlfd (a common
pattern), and supported NONBLOCK for pipes.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Report listen files with incalls as readable
Barret Rhoden [Fri, 24 Feb 2017 19:49:40 +0000 (14:49 -0500)]
net: Report listen files with incalls as readable

When a conversation has inbound calls, userspace can now see that by doing
a stat on the listen file (e.g. /net/tcp/1/listen).  This is necessary for
libraries that use stat() to detect the 'level' of an event.  select() and
epoll() both do this (select() for its own behavior, epoll() to synthesize
events).

And you can now see whether or not there are incalls in 'pip.'  If you
happen to see it, either you got lucky or there's probably a bug.  Which is
probably why you're running 'pip' in the first place.  =)

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoceq: Add a dump function
Barret Rhoden [Fri, 24 Feb 2017 19:48:39 +0000 (14:48 -0500)]
ceq: Add a dump function

Call this from kfunc.  I used this in debugging the epoll problem.  It
turns out that the CEQ wasn't the problem, but I imagine I'll need this in
the future for another bug.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoepoll: Error out if someone asks for one-shot
Barret Rhoden [Thu, 2 Mar 2017 17:50:24 +0000 (12:50 -0500)]
epoll: Error out if someone asks for one-shot

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoepoll: Give every waiter their own event queue
Barret Rhoden [Fri, 24 Feb 2017 19:40:14 +0000 (14:40 -0500)]
epoll: Give every waiter their own event queue

This was a brutal bug.  Basically, multiple epoll_wait() calls with
timeouts could consume each other's events.  They had independent async
syscs, but the notifications all went to the same evq (the old
ep->alarm_evq).

As a result, when uthreads blocked on the alarm evq, either for the main
blockon(ceq_evq, alarm_evq) or the dummy alarm_evq, they could wake up due
to another uthread's call.  Eventually, some uthread would get a real
event, then would try to cancel their alarm.  But someone else would get
the event_queue message (the one from the aborted syscall 'completing').
Then the original uthread would sleep for a long, undetermined amount of
time, based on when our uth happened to extract someone *else's* message,
since ours was gone.

The fix is to have separate event queues for each waiter (that has a
timeout), just like how they have their own syscall structures.

This is actually a nice opportunity to use a slab allocator, since we want
a bunch of constructed alarm objects sitting around.  Due to the INDIR/RCU
problem (can't safely reuse memory until all INDIRs are done), we don't
want to reuse the memory - keeping the objects around in a kmem_cache is
ideal.  The other benefit of the slab allocator is that we can use the same
pool of these for all epoll controllers, which means we'll never have more
of these than we have threads, instead of threads * nr_epoll_ctlrs.  (Round
up to the nearest slab size, btw).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAllow filtering by PID for "db sem"
Barret Rhoden [Thu, 23 Feb 2017 16:21:47 +0000 (11:21 -0500)]
Allow filtering by PID for "db sem"

The PID argument to "db sem" is optional.  Without it, it shows all
semaphores.  With it, it will only show sems with kthreads of a particular
process.  Use PID == 0 for "no process" (e.g., ktasks).

bash-4.3$ m db sem 272
All sems with waiters:
Semaphore 0xffff8000096db630 has -1 signals (neg = waiters)
        Kthread 0xffff800007dfd620 (open /net/tcp/0/listen at fd -100),
            proc 272, sysc 0x00007f7fff9fe840,
            pc/frame 0xffffffffc201948a 0xfffffff000017ad8

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix FD leak in pipe (XCC)
Barret Rhoden [Thu, 23 Feb 2017 15:56:43 +0000 (10:56 -0500)]
Fix FD leak in pipe (XCC)

We weren't closing the dirfd.  You'd notice this after a lot of ssh
connections, since the pipes would build up.  They weren't closed and were
getting passed to dropbear's children.  After a dozen scps, if you looked
at the open files for a new ssh + shell connection, you'd see a dozen pipe
Qdirs.

Rebuild glibc, eventually.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUpdate bt-akaros.sh
Barret Rhoden [Wed, 22 Feb 2017 19:13:55 +0000 (14:13 -0500)]
Update bt-akaros.sh

Two changes:
- It uses nm with demangling, so we get better backtraces from C++ programs
- It caches symbol tables for binaries, such that we run nm only once per
  object.  Between that and grep, it speeds up the backtrace for large
binaries.

You'll need Bash version 4 or later, though you probably have it already.
If not, use the old script on your own.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoepoll: Fire existing events during EPOLL_CTL_ADD
Barret Rhoden [Fri, 17 Feb 2017 19:08:38 +0000 (14:08 -0500)]
epoll: Fire existing events during EPOLL_CTL_ADD

On Linux, if you ask for an edge-triggered epoll, the kernel happens to
send you an event based on the current status when you sign up,
level-triggered-style.

Specifically, this will return with an EPOLLOUT event:
- epoll_create()
- socket(SOCK_DGRAM)
- epoll_ctl_add(EPOLLOUT | EPOLLET)
- epoll_wait()

Even though you're only supposed to epoll_wait() on an edge-triggered event
*after* you've attempted I/O and got EAGAIN.

However, our epoll() tries to act like Linux's, and some buggy programs
may expect Linux's epoll's behavior.

Note that this change may result in spurious notifications.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd sys_send_event() (XCC)
Barret Rhoden [Fri, 17 Feb 2017 19:04:53 +0000 (14:04 -0500)]
Add sys_send_event() (XCC)

This syscall sends an event message to a specific event queue.  Given that
it's all in the user's shared memory, I didn't make a version of this that
works between processes.  Without a way for the target process to specify
the ev_q pointer, (such as the the kernel_events array), it seems extremely
dangerous to do IPC with this.

It's actually possible for userspace to post messages to its mboxes, under
certain circumstances.  In the future, I might have a parlib function that
tries that and falls back to the kernel for the cases where the user could
not do it.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoqio: Queues with no limit are always writable
Barret Rhoden [Thu, 16 Feb 2017 19:34:07 +0000 (14:34 -0500)]
qio: Queues with no limit are always writable

For instance, any queues made with qbypass() (which calls a kick method)
have no q->limit.  You can always try to write to them, and the kick
function pointer will deal with the result, such as dropping a packet.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Allow connectionless convs to auto bind
Barret Rhoden [Thu, 16 Feb 2017 16:20:01 +0000 (11:20 -0500)]
net: Allow connectionless convs to auto bind

Conversations/sockets from connectionless protocols can immediately write
to Qdata, without a bind.  We'll automatically bind to a local port before
sending.  SOCK_DGRAM supports this, but instead of doing it in glibc,
it seemed like something Plan-9-networking apps could use too.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Fix UDP bind commands
Barret Rhoden [Thu, 16 Feb 2017 18:33:48 +0000 (13:33 -0500)]
net: Fix UDP bind commands

Previously, UDP would just use the standard bind, which assigns a local
port.  However, it wouldn't add an entry to the hash table, so any inbound
connections would be rejected.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoExport CONFIG_ options via #version/kconfig
Barret Rhoden [Wed, 15 Feb 2017 18:44:54 +0000 (13:44 -0500)]
Export CONFIG_ options via #version/kconfig

Raw text, one line per CONFIG option, taken directly from your .config
file.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoUse const for readstr() and readmem() source args
Barret Rhoden [Wed, 15 Feb 2017 19:03:16 +0000 (14:03 -0500)]
Use const for readstr() and readmem() source args

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Set DONT_FRAGMENT for unfragmented packets
Barret Rhoden [Wed, 15 Feb 2017 17:36:01 +0000 (12:36 -0500)]
net: Set DONT_FRAGMENT for unfragmented packets

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: serial: Don't print a \n with \r
Barret Rhoden [Tue, 14 Feb 2017 18:45:09 +0000 (13:45 -0500)]
x86: serial: Don't print a \n with \r

My old minicom seemed to need this, but it pops up as a problem with the
Linux guest over serial/minicom.  Every line would have two \ns, one for
the \n and one for the \r.

My current minicom and qemu work fine with the new settings, which also
works well with a Linux guest over minicom.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Squelch noisy prints
Barret Rhoden [Tue, 14 Feb 2017 17:34:58 +0000 (12:34 -0500)]
vmm: Squelch noisy prints

Developers can turn those on, on their own, for debugging.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Use NULL to signal lack of promisc/multicast
Barret Rhoden [Tue, 14 Feb 2017 17:28:27 +0000 (12:28 -0500)]
net: Use NULL to signal lack of promisc/multicast

The network stack is designed such that the absence of a function pointer
for promisc or multicast means "unsupported."  We should do that instead of
adding functions that just throw errors.

This is necessary for snoopy and promisc mode.  Promisc for devether is
both "give me all packets" (aka, actually promiscuous) and "give me packets
I sent."  snoopy requires the latter, even if the NIC can't support the
former.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agomlx4/bnx2x: Throw error() for promiscuous mode
Barret Rhoden [Fri, 10 Feb 2017 15:12:48 +0000 (10:12 -0500)]
mlx4/bnx2x: Throw error() for promiscuous mode

Instead of panicking or silently failing.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Support all sorts of crazy things!
Barret Rhoden [Fri, 27 Jan 2017 15:01:06 +0000 (10:01 -0500)]
strace: Support all sorts of crazy things!

This will act similarly to strace on Linux.  Start with:

$ strace --help

One interesting note is that once a process has started to be traced, it
will always have a struct strace.  (It's been like that forever,
actually).  You can still change the traceset on the fly and reuse it.
This also means that if you use -f, children will use their parent's
struct strace forever, and you won't be able to separate them.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agodevproc: Remove unused or dangerous commands
Barret Rhoden [Thu, 9 Feb 2017 17:20:21 +0000 (12:20 -0500)]
devproc: Remove unused or dangerous commands

Most of those commands had no implementation.  CMkill looked extremely
dangerous.

Regarding the nr_args change for hang and closefiles, saying '1' is
confusing.  0 means 'don't check.'  Otherwise, make sure they have N
args.  However, this includes the ctl command.  So all commands have
nr_args >= 1.  I screwed that up with CMstrace_drop at first.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoDon't use MEM_WAIT in alloc_sysc_str()
Barret Rhoden [Thu, 9 Feb 2017 17:12:52 +0000 (12:12 -0500)]
Don't use MEM_WAIT in alloc_sysc_str()

MEM_WAIT can block, but we can't block for arbitrary syscalls.  If the
allocation fails, we'll just skip saving the string for those syscalls.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Use the kpage allocator for traces
Barret Rhoden [Thu, 9 Feb 2017 17:09:00 +0000 (12:09 -0500)]
strace: Use the kpage allocator for traces

We're allocating 4096 from kmalloc, which is actually a two-page
allocation (due to the tag).  We might as well just grab a single page,
and call it a day.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Use Qmsg for the trace log (XCC)
Barret Rhoden [Wed, 8 Feb 2017 23:22:33 +0000 (18:22 -0500)]
strace: Use Qmsg for the trace log (XCC)

This lets us read a record at a time.  Although the entries are separated
by newlines and we could use getline(), that results in one-byte-at-a-time
reads, which are slow.  We can read one record at a time, thanks to Qmsg.
So long as we read the max size of a systrace record.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Block the target when the strace q is full
Barret Rhoden [Sun, 29 Jan 2017 22:42:54 +0000 (17:42 -0500)]
strace: Block the target when the strace q is full

Unless drop_overflow is set, the *target* will block instead of dropping
a systrace record, for most syscalls.

Syscalls that cannot block are blacklisted.  The main reason for not
blocking is due to accessing per-core state of the calling core.  Once
we block, we could migrate or that state could otherwise be invalid.

This strace option triggered a bunch of bugs, so be careful.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agopth: Use barriers in pthread tests
Barret Rhoden [Fri, 27 Jan 2017 23:38:08 +0000 (18:38 -0500)]
pth: Use barriers in pthread tests

The use of 'ready' like that assumes that the creator will not block in
between the time it creates the last thread and it hits ready.  It could
block, for instance, on an mmap/malloc.  At that point, the other N threads
would run on the N vcores.  Since pthreads is non-preemptive currently,
thread0 would never run to set 'ready'.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agopth: Remove fun debugging comment
Barret Rhoden [Tue, 24 Jan 2017 16:35:48 +0000 (11:35 -0500)]
pth: Remove fun debugging comment

You actually might see this, if ipconfig's output isn't redirected.  (Saw
this during a bug hunt).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Don't run ctors in "fake parlib"
Barret Rhoden [Sun, 29 Jan 2017 22:36:41 +0000 (17:36 -0500)]
parlib: Don't run ctors in "fake parlib"

Due to how we force gcc to link parlib with every binary, our shared
objects (e.g. libelf.so) have a copy of parlib and its ctors.  These
ctors run when the shared obj is loaded.  Additionally, the ctors run
again when the binary is loaded.  This means we've been running the
ctors multiple times (for perf and vmrunkernel), and haven't been
noticing it.  Yikes!

We can check the _start symbol to see if we're in the actual program or a
shared library (the fake parlib).  We need to run only one of them, and it
must be the programs.  Briefly, I tried letting the library's version run.
That registers the fake parlib's vcore_entry with the kernel.  So the
kernel would call into fake parlib, with its copy of data structures like
2LS ops and __in_vcore_context.  And the program would call into its copy.
Those structures would differ, and madness ensued.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAtomically initialize parts of the 2LS (XCC)
Barret Rhoden [Fri, 27 Jan 2017 23:28:39 +0000 (18:28 -0500)]
Atomically initialize parts of the 2LS (XCC)

The issue is that certain parts of the 2LS must be changed atomically
with respect to syscalls, meaning no syscalls happen between the
operations.

For instance, if you change the syscall event handler, you need to switch
over to using the correct 2LS ops first.  Otherwise, the handler will go
crazy.

Likewise, we need to register for INDIRs, in case the 2LS uses INDIRs for
its syscall handling (all of them do).  Otherwise, you'd get the INDIR, but
that would get ignored (since there's no handler).

Finally, this fully removes thread0's syscall handler.  We actually had
always been running thread0's handler - the event handers chain.  It just
so happened to not be harmful.

Rebuild all apps and libraries, though maybe not glibc.  Specifically, I
needed to rebuild elfutils, since libelf.so has copies of parlib stuff in
it.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRename SYS_yield -> SYS_proc_yield (XCC)
Barret Rhoden [Fri, 27 Jan 2017 14:06:17 +0000 (09:06 -0500)]
Rename SYS_yield -> SYS_proc_yield (XCC)

To be more like the other proc syscalls.  It's even called "proc_yield"
in the strace output.

Reinstall your kernel headers now.  Rebuild glibc at your leisure.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Add a syscall lookup table (XCC)
Barret Rhoden [Fri, 27 Jan 2017 06:39:13 +0000 (01:39 -0500)]
parlib: Add a syscall lookup table (XCC)

This is a simple lookup table of strings, indexed by syscall number.
For instance:
[ 102 ] = "openat",

The table will rebuild whenever the kernel headers change, based on the
*repo's* header, not the one in your toolchain.  libparlib.a also
depends on this file, so basically everything will rebuild when we muck
with the syscall numbers.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Filter syscalls (XCC)
Barret Rhoden [Thu, 26 Jan 2017 20:35:58 +0000 (15:35 -0500)]
strace: Filter syscalls (XCC)

The default is that all syscalls are traced.  The user can write its own
version of the traceset bitmap to specify which syscalls to trace.  The
user can access this at #proc/PID/strace_traceset.

You can actually modify this on the fly and in the #proc directory of any
PID undergoing a shared strace.

Reinstall your kernel headers

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Qstrace controls whether tracing is on
Barret Rhoden [Thu, 26 Jan 2017 17:14:42 +0000 (12:14 -0500)]
strace: Qstrace controls whether tracing is on

The ctl commands straceme and straceall set up tracing.  straceme turns off
inheritance; straceall turns it on.  The actual tracing only happens when
you open #proc/PID/strace (a.k.a. Qstrace).  There can be only one open
chan of this file.

Previously, there was a ctl message to turn off tracing, and tracing would
be turned on as soon as you sent the straceme ctl message.  There are a few
problems with this:

1) If the tracer exits or crashes, the tracee might continue to be traced.
If we start blocking the tracee when the queue is full, it'll just stop
forever.  This way, when the FD of the tracer is closed, tracing will stop.

2) If we want to filter syscalls, we'll want the strace struct to exist
first, and then later set the filter, and the later turn on tracing.

3) Having multiple readers is a mess.  Who knows who is getting the right
output?  That just seemed prone to bugs.

I had to move strace_on and strace_inherit back to the strace struct.  This
means that all processes sharing a struct strace (via inherit) are
controlled as a group.  The open FD for the struct strace is what controls
the tracing - you can't control it for individual processes.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agostrace: Remove the ability to write to Qstrace
Barret Rhoden [Thu, 26 Jan 2017 16:36:33 +0000 (11:36 -0500)]
strace: Remove the ability to write to Qstrace

This was for injecting comments and whatnot into the stream.  It's a little
bit of a mess, since it is only useful for other processes to do the
injecting.  If the process being traced uses it, then we'd have a bunch of
syscalls. (open, write, close, or at least the write)

If you wanted that, we might as well just do SYS_null as the signal, or
write to /dev/null.

The main thing is that the 'strace' file will soon be single-open too,
which would make writing it all but unusable.  If we need that
functionality, we can add another variable.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd bash completion for perf and strace
Barret Rhoden [Fri, 27 Jan 2017 23:55:21 +0000 (18:55 -0500)]
Add bash completion for perf and strace

It's a simple completion for finding programs in your path.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd a helper for a bitmap's size
Barret Rhoden [Thu, 26 Jan 2017 20:35:18 +0000 (15:35 -0500)]
Add a helper for a bitmap's size

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Remove the POLL_CONSOLE hack
Barret Rhoden [Wed, 25 Jan 2017 19:26:52 +0000 (14:26 -0500)]
x86: Remove the POLL_CONSOLE hack

We had this for Ron's AMD boards, which never seemed to send IRQs.  Now
that we fixed a bug in that area, I think this is unnecessary.  We can't
check, since those machines might not be around anymore.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agox86: Poll and discard console devices during setup
Barret Rhoden [Wed, 25 Jan 2017 19:18:27 +0000 (14:18 -0500)]
x86: Poll and discard console devices during setup

The problem, which has been around forever, manifests itself as the console
not responding, and it was triggered by hitting keys during boot.  It's
always happened every so often.

The specific race is that the console devices are initialized very early
on so we can print (top of kernel_init()).  After this, if you hit keys,
then an interrupt would be generated by the device.  But if the IRQ
handlers hadn't been registered yet, then the input would be ignored.  The
device would then not generate interrupts for future keystrokes/events.

By polling the device after we register the IRQ, we reset the device.

Interestingly enough, during the debug of this (which happened concurrent
with other qemu hanging bugs), I was able to SSH in when the console was
locked up.  Then I ran "m monitor 1", to spawn the monitor on core 1.  As
soon as that happened, core 1 polled the console, which enabled the
interrupt and core 0 started to get IRQs.  After that, things worked fine.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocons: Fix initialization bug
Barret Rhoden [Tue, 24 Jan 2017 16:48:30 +0000 (11:48 -0500)]
cons: Fix initialization bug

We could receive an IRQ early during boot: after arch_init(), but before
cons_init().  That would attempt to write to an uninitialized queue.  This
would happen periodically in QEMU, and maybe it was more likely when I was
hitting keys during boot.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoqio: Fix race with multiple blockers
Barret Rhoden [Wed, 8 Feb 2017 21:17:54 +0000 (16:17 -0500)]
qio: Fix race with multiple blockers

It was possible for multiple readers (or writers) to block on an empty (or
full) queue, but for one of them to never wake up.  This was broken in
commit 9ec41115cb83 ("qio: Clean up locking").

The qlock that used to be there made it so that there was only one
*blocking* reader (or writer) at a time.  That made the usage of Qstarve
(and Qflow) safe as a signal for the other writer (or reader) to wake any
sleepers.  However, with more concurrency due to the lack of the qlock,
that flag isn't sufficient anymore.  You could have two threads both set
Qstarve, then try to sleep.  A waker could come in, see the flag, wake one
of them, but not the other.  Then the other's rendez condition fails (e.g.
the queue is still empty), but Qstarve isn't set.

The right fix for this is to not use Qflow and Qstarve - just check the
rendez if we transitioned an edge.  After all, that's the rendez condition
(e.g., is_empty), not 'is Qflow still set.'  After doing so, it actually
cleans up things a little, since we're firing taps based on the edge
condition too.  Perhaps the old Qstarve/Qflow byte check saved us the
hassle of checking the rendez if we didn't know someone was there, but that
overhead isn't worth the qlock-all-blocking-readers policy.  Yes, the qlock
only applied to *blocking* threads.

Note that kicks may fire more frequently now, since they fire on edge
transitions instead of edge transitions that also had a sleeper.  If this
breaks anything, that thing needs to be changed to handle spurious kicks.
It'd be a bad design otherwise.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoDon't miss events for early SCPs (XCC)
Barret Rhoden [Wed, 25 Jan 2017 19:04:46 +0000 (14:04 -0500)]
Don't miss events for early SCPs (XCC)

On occasion (esp in qemu), processes would hang.  They'd appear to be
waiting, but would have no syscalls pending.

It turns out that they were missing the "syscall complete" event.  You'd
need a blocking syscall that completed at a specific time:
- after we returned to userspace
- after they check for completion and register for an event
- before they yield
In that case, the process would expect notif_pending to prevent the yield.
notif_pending on vcore 0 was expected to get set by the event.

However, we only asked for a wakeup.  Under the current rules, we need to
actually specify an action related to a vcore to get that vcore to have
notif_pending set.  e.g. INDIR, SPAM, IPI - those all relate to specific
vcores.

I might change all this in the future - specifically so that EVENT_WAKEUP
is considered a 'SPAM' for notif_pending, but not for an actual message.
It's a bit complicated.

Rebuild glibc at your leisure.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoRemove another alloca from glibc printf (XCC)
Barret Rhoden [Wed, 8 Feb 2017 21:09:16 +0000 (16:09 -0500)]
Remove another alloca from glibc printf (XCC)

This alloca() was conditionally called and not protected by any checks.  It
consumed about 2300 bytes, blowing us off the end of a vcore's stack.

I left the stack-based work_buffer allocation.  We'll see if I regret that.
I left it off to avoid mmaps for every printf, which can clutter straces.
Longer term, maybe we need a different snprintf for vcore context.

Rebuild glibc at your convenience.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAllow backtrace_user_ctx() on remote cores
Barret Rhoden [Sun, 29 Jan 2017 22:16:21 +0000 (17:16 -0500)]
Allow backtrace_user_ctx() on remote cores

Previously, it assumed you were accessing the address space of the
process on the calling core.  Now, it switches to the right address
space.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd a verbosity parameter to "pip"
Barret Rhoden [Sun, 29 Jan 2017 22:25:04 +0000 (17:25 -0500)]
Add a verbosity parameter to "pip"

Default is 0.  At verbosity >= 1, you'll also see the backtrace of
whatever SCP context was last saved (which might be dangerous or wrong)
and the amount of time spent on each vcore.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoPrint out whether a process is VC ctx ready
Barret Rhoden [Wed, 25 Jan 2017 19:15:51 +0000 (14:15 -0500)]
Print out whether a process is VC ctx ready

Early in a process's life, it is not capable of managing itself.  Once it
is ready, it tells the kernel.  Notably, it also changes the syscall
blockon function pointer, which changes how it responds to blocking
syscalls.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd a dump function for trace_printk()
Barret Rhoden [Wed, 25 Jan 2017 18:59:38 +0000 (13:59 -0500)]
Add a dump function for trace_printk()

trace_printk() fills a buffer that you can normally access from userspace
by reading #kprof/kptrace.  This will do a full printk() of the contents to
the raw console.

You can call this via kfunc from the monitor - perfect for those nasty
debugging sessions!

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocap: Fix openmode issue
Barret Rhoden [Fri, 27 Jan 2017 21:14:00 +0000 (16:14 -0500)]
cap: Fix openmode issue

You couldn't ls \#capability.  Plan 9 had a bunch of different rules about
omode than we have.  Incidentally, O_READ is not 0.  And O_RDONLY isn't a
good check - it's just there for compatibility.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoClean bash during make apps-clean
Barret Rhoden [Tue, 7 Feb 2017 18:56:43 +0000 (13:56 -0500)]
Clean bash during make apps-clean

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoCompile with -Wreturn-type
Barret Rhoden [Thu, 26 Jan 2017 22:47:04 +0000 (17:47 -0500)]
Compile with -Wreturn-type

I can't believe we've been going without this for so long.  I finally ran
into a problem that was because of a missing "return 0."  At least the
kernel was in good shape.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoVMM: SMP guest (XCC)
Gan Shun [Fri, 3 Feb 2017 18:44:36 +0000 (10:44 -0800)]
VMM: SMP guest (XCC)

This commit allows us to boot SMP guest kernels. It requires that the
guest VM to start up AP cores using vmcall instead of the usual method.

Reinstall your kernel headers

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Ie37a77eb1fb553893fa4cf89e20fe4b2e4a18516
[made retval a bool]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agomnt: Turn on a debugging print
Barret Rhoden [Fri, 3 Feb 2017 18:29:56 +0000 (13:29 -0500)]
mnt: Turn on a debugging print

I saw the error() at line 842, triggered by a guest/VM cloning a
conversation.  There are a few related failures with devmnt and cs.
Hopefully this will help us track them down.

For background, cs is involved in the NAT's bypass, due to the nettrans()
call.  Maybe that'll get changed too.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Don't clobber the TTL for TCPv4 rx
Barret Rhoden [Thu, 2 Feb 2017 20:08:30 +0000 (15:08 -0500)]
net: Don't clobber the TTL for TCPv4 rx

We need to set it to 0 briefly for the xsum.  When we're done, change it
back.  Interestly enough, TCPv6 and UDP did this already.

You'd see this as packets with a TTL of 0 arriving at the guest VM.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Fix double-free snoop bug
Barret Rhoden [Wed, 1 Feb 2017 21:26:14 +0000 (16:26 -0500)]
net: Fix double-free snoop bug

When the snoopy queue overflows, qpass() returns failure.  We had been
freeing the block in that case.  However, qpass() is actually the one
that frees the block.  All we should do is take note of its failure.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Increase the vmthread stack size
Barret Rhoden [Tue, 31 Jan 2017 15:04:00 +0000 (10:04 -0500)]
vmm: Increase the vmthread stack size

I think the bypass codepaths (virtio->nat->bypass->iplib->nettrans)
consumed too much stack, and a thread went off the bottom of the page.  I
had a user PF at RIP = 8 and RSP right at the top of a page.  Increasing
the stack size removed the symptom.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: Nastily set the max number of convs to 4096
Barret Rhoden [Mon, 30 Jan 2017 22:59:14 +0000 (17:59 -0500)]
net: Nastily set the max number of convs to 4096

The IP stack severely limits the number of conversations available to a
protocol.  The max is 4096 (due to how the qid.path is used for indexing
into the conv array).  This means that we can have at most 4096
conversations at a time, which also limits the guest and its port-forwards.

This raises that limit to 4096 (from 1024 for TCP and 256 for UDP), until
we can redesign #ip.  At that time, we can also look at the horrendous O(n)
operations when we make conversations and whatnot.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agomnt: Fix mntflush "rpc tags" error
Barret Rhoden [Mon, 30 Jan 2017 22:56:09 +0000 (17:56 -0500)]
mnt: Fix mntflush "rpc tags" error

This might be the third time we tried to fix this.  In this case, if a
process has a syscall in progress that is blocked in mntio(), then when
that process dies, its syscall will get aborted.  When this loop retried,
it would block and immediately fail again (rendez aborts when DYING).

Since this loop didn't allow aborts to happen (abort == retry, here), we
needed to special case when the process is actually dying and *really*
abort.

Ugh.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoahci: drop debug and reformat ahciidentify dump
Fergus Simpson [Fri, 27 Jan 2017 23:34:28 +0000 (15:34 -0800)]
ahci: drop debug and reformat ahciidentify dump

Disables debug prints and shortens the ahciidentfy0 hex dump. Reduces
clutter in the terminal. Also required a bugfix in the call to the
printd macro where a semicolon in a call had to be dropped.

Change-Id: I08a2823c5c16ff70e796678b809e36763aa7f390
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoahci: add bind of ahci device to ifconfig
Fergus Simpson [Fri, 27 Jan 2017 20:16:27 +0000 (12:16 -0800)]
ahci: add bind of ahci device to ifconfig

Adds the bind of the ahci device to ifconfig so it will be bound by
default for everyone.

Change-Id: I0d693cf7edcc40e19219992268f028bb8edd1035
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocapdev: make hashstr(...) helper static
Fergus Simpson [Fri, 27 Jan 2017 23:45:41 +0000 (15:45 -0800)]
capdev: make hashstr(...) helper static

This helper function should not be called from elsewhere do to
assumptions made about its inputs. It is already undeclared in the
capability device header, but making it static further makes it clear
that it is only for use by the capability device itself.

Change-Id: Id7034c3b0ab325a3ed39c9fa8511f77592cf3828
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocapdev: add bind of cap device to ifconfig
Fergus Simpson [Fri, 27 Jan 2017 18:22:27 +0000 (10:22 -0800)]
capdev: add bind of cap device to ifconfig

Adds the bind of the cap device to ifconfig so it will be bound by
default for everyone.

Change-Id: I0057722a04c59c72853f6179ceef237f6be61201
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add noht to vmimage_cmdline
Barret Rhoden [Mon, 30 Jan 2017 16:53:09 +0000 (11:53 -0500)]
vmm: Add noht to vmimage_cmdline

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: net: Don't kill the VM when failing to bypass
Barret Rhoden [Mon, 30 Jan 2017 15:24:56 +0000 (10:24 -0500)]
vmm: net: Don't kill the VM when failing to bypass

Previously, if we failed to set up a bypass, we'd kill the VM.
Unfortunately, it's very easy to run out of conversations in Plan 9.  UDP
has 256, TCP has 1024, and the max for a protocol is 4096 - far less than
65K.

Now, instead of dying, we'll print out a warning, but otherwise let the VM
exist.  Once we fix Plan 9's stack, we can consider reverting this.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agonet: replace some FIXME errors with more useful strings
Ronald G. Minnich [Thu, 26 Jan 2017 22:13:31 +0000 (14:13 -0800)]
net: replace some FIXME errors with more useful strings

Change-Id: I3c6318d99a32e99482d6f64ff8419ba662568e7e
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[typo]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoVMM: Change to vmrunkernel to support multicore
Gan Shun [Tue, 24 Jan 2017 23:17:55 +0000 (15:17 -0800)]
VMM: Change to vmrunkernel to support multicore

This commit changes vmrunkernel to support multicore smp guests, however
it does not actually launch the secondary cores. This sets up the
multiple vapic pages and pir pages, as well as the command line
parameters that accompany smp.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: I8fa158401fdea97481a1ea411fe91d1df2f3a898
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoVMX: modify CPUID emulation to return APIC ID in ebx
Gan Shun [Tue, 24 Jan 2017 18:12:44 +0000 (10:12 -0800)]
VMX: modify CPUID emulation to return APIC ID in ebx

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: I90b9a22d351080957b37b38320b4096bbcecd221
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmrunkernel: just pull the whole 128K smbios in at e0000
Ronald G. Minnich [Mon, 23 Jan 2017 21:59:58 +0000 (13:59 -0800)]
vmrunkernel: just pull the whole 128K smbios in at e0000

I love PCs. The SMBIOS spec certainly seems clear that it
lives at Fxxxx. But some have pointers to Exxxx. Now, we can
get all smart and try to read and rewrite SMBIOS tables and all
but ....

For now, let's be dumb. To get a flash image, on a working machine,
dd if=/dev/mem of=smbios bs=65536 count=2 skip=14

To run it:
vmrunkernel -t smbios etc. etc.etc

vmrunkernel will, given a -t argument, read the whole thing in
starting at e0000. We do not check for it being short: maybe
you have an SMBIOS that's just fine being 0x14000 bytes in size.
We should not presume to consider that an error.

Change-Id: I0626389b5f2f0bf407433c2dd0ccd5fa65888a43
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoMake daemonize wait on children
Barret Rhoden [Sat, 21 Jan 2017 17:05:06 +0000 (12:05 -0500)]
Make daemonize wait on children

Otherwise, if a child exits or is killed before it can signal the
parent, daemonize will never return and propagate the error.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoSet exitcodes when killing from the monitor
Barret Rhoden [Sat, 21 Jan 2017 17:02:42 +0000 (12:02 -0500)]
Set exitcodes when killing from the monitor

Otherwise, processes that wait will get gibberish, and possibly 0, for
return codes from processes killed from the monitor.  If we had to kill
a process manually, we should return some code.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd DNS info to ifconfig and /net/ndb
Barret Rhoden [Fri, 20 Jan 2017 22:14:32 +0000 (17:14 -0500)]
Add DNS info to ifconfig and /net/ndb

Some apps try to do their own DNS, and they look for an /etc/resolv.conf
file.  While we're at it, we might as well put in an /etc/hosts too.

With a little work, we can get all this info from /net/ndb.  ipconfig +
DHCP will put that info in place.  However, static configs didn't have DNS.
Now they do, and it'll get placed in /net/ndb.  That's what all the Plan 9
programs will expect.

Thus all static configs in the custom /etc/network/local.d/ files ought to
set a DNS entry for their hosts.

We don't really need the old kern/kfs/etc/network/default either - those
machines are long gone, and if anyone wants to use them, put those in
local.d instead.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAdd more utilities to busybox
Barret Rhoden [Sat, 21 Jan 2017 16:47:16 +0000 (11:47 -0500)]
Add more utilities to busybox

Rebuild busybox.  Either cd tools/apps/busybox; make, or make
apps-install.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Use better fake mutexes for thread0
Barret Rhoden [Fri, 20 Jan 2017 22:12:30 +0000 (17:12 -0500)]
parlib: Use better fake mutexes for thread0

The thread0 scheduler has only one thread, but we should have at least a
little blob for mutexes so that we can catch problems.  Any code in a
thread0 scheduler that tries to lock the same mutex twice ought to be a
deadlock bug (or VC ctx trying to sleep).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Don't double-lock a mutex to sleep
Barret Rhoden [Fri, 20 Jan 2017 22:08:46 +0000 (17:08 -0500)]
parlib: Don't double-lock a mutex to sleep

Yes, double-locking mutexes will normally sleep forever, but it's a little
hacky.  Especially considering how the thread0 scheduler doesn't currently
use mutexes!  Other schedulers / frameworks might treat locking a locked
mutex as a bug too.

Yes!  This means that any app using uthread_sleep_forever() that was using
the thread0 scheduler (e.g. daemonize) would always return immediately.  In
fact, daemonize probably never worked, unless it happened to have pthreads
or something linked in.  That's responsible for two things: /net/ndb wasn't
written before we moved past ipconfig in the ifconfig script, and
occasionally you'd get an "Unable to open cs" complaint from srv.
daemonize was returning early.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoparlib: Make I_AM_HERE more verbose
Barret Rhoden [Fri, 20 Jan 2017 22:08:00 +0000 (17:08 -0500)]
parlib: Make I_AM_HERE more verbose

It's nice to know the PID, and also to rely less on glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoAllow devpermcheck() to check perms
Barret Rhoden [Fri, 20 Jan 2017 18:34:50 +0000 (13:34 -0500)]
Allow devpermcheck() to check perms

Looks like we were avoiding checks, perhaps due to paranoia or old config
issues.  I checked a few things (VMs, snoopy), and this check didn't break
them.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix permission checks for devether
Barret Rhoden [Fri, 20 Jan 2017 17:21:05 +0000 (12:21 -0500)]
Fix permission checks for devether

Snoopy on /net/ether0 (the default) was broken if you had a
username/hostowner that wasn't "".  The root cause is Plan 9's nasty
conversion from open modes to rwx with the access[] array.  I happened to
have solved this one before (devpermcheck()), though it took a little to dig
it up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agovmm: Add vnet_opts_example
Barret Rhoden [Thu, 19 Jan 2017 16:40:01 +0000 (11:40 -0500)]
vmm: Add vnet_opts_example

This got dropped from an older commit, probably due to a git reset and
kern/kfs/ being .gitignored.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix adt
Gan Shun [Thu, 19 Jan 2017 00:54:14 +0000 (16:54 -0800)]
Fix adt

Add quotes around GERRIT_TOPIC to correctly handle the case where it's
not defined, and fix parsing for branch name.

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Icc3e159b73a4a8371a7c4d096345b7ef72f528d1
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoFix pci script
Gan Shun [Thu, 19 Jan 2017 00:51:59 +0000 (16:51 -0800)]
Fix pci script

The grep command incorrectly looks for '#pci' when it should be looking
for '#pci/pci'

Signed-off-by: Gan Shun <ganshun@gmail.com>
Change-Id: Idbebaf3064a0a74c60e90684058d93b1dc3f44b0
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agocapdev: fix capuse hashing, remove 'todo' panic
Fergus Simpson [Fri, 13 Jan 2017 19:13:28 +0000 (11:13 -0800)]
capdev: fix capuse hashing, remove 'todo' panic

Brings the capability device into a working state by fixing two hashing
bugs and removing a todo panic.

The first bug was in the call to capuse - the SHA256 member from a
different enum than was expected by the function was used. The same
index (1) in the expected enum was for SHA1 hashing. This meant the
produced hash was always the wrong type.

The second bug was in the usage of the return of the hashing function -
it returns a 32-byte binary representation, but it was used as a 64-byte
ASCII representation. This patch implements code to change the binary
representation into ASCII - 1 byte per nibble.

There was a todo panic that was triggered when both "from" and "to"
parameters were provided. It has been removed since it works now.

Change-Id: I24a0c546176db6d2347bf824f3803c60d4f5b0b1
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
2 years agoproc_alloc: make new process inherit parent's user
Fergus Simpson [Thu, 5 Jan 2017 23:44:38 +0000 (15:44 -0800)]
proc_alloc: make new process inherit parent's user

Fixes proc_alloc() to copy the new process's parent's user, or set the
user to "" if there is no parent.

If the username "" is assigned and the hostowner is not "", a warning is
printed that the process does not have hostowner privileges.

Change-Id: Ie6dfa7a5b1c13583fa0475758044f5a7121d6bbe
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>