5 years agoUpdate singals with proper default handlers and exit codes old_9ns origin/old_9ns
Kevin Klues [Sat, 1 Feb 2014 05:42:38 +0000 (21:42 -0800)]
Update singals with proper default handlers and exit codes

5 years agoUpdate pthread futex_waiti() to unlock after yield
Kevin Klues [Fri, 31 Jan 2014 22:00:35 +0000 (14:00 -0800)]
Update pthread futex_waiti() to unlock after yield

The previous version of the futex code was adopted from the linux parlib
code, which doesn't have to worry about uthreads spuriously dropping
into vcore context while not holding a pdr lock.  Without this change,
it was possible for a vcore to spin indefinitely on a futex_wait() while
the uthread it was trying to wake had not actually yielded yet (and
couldn't because it was trying to yield on the very same vcore that was
spinning trying to wake it).

With this change we now have to hold the futex lock a little longer, but
it is necessary for correctness.  In the future, we will probably want
to use some sort of hashtable to maintain one lock per futex, rather
than a global futex lock, and this will help alleviate some of these

5 years agoAdd more return info
Ronald G. Minnich [Wed, 15 Jan 2014 22:58:04 +0000 (14:58 -0800)]
Add more return info

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoProperly refcnt child processes
Barret Rhoden [Sat, 18 Jan 2014 01:08:12 +0000 (17:08 -0800)]
Properly refcnt child processes

Parents hold a ref on their children.  We didn't incref for this.  For
forked processes, this was working, since we failed to decref.  Spawn,
which decreffed properly, blew up.

I think the ksched still had a copy of the proc, in this case, and it
tried to run it.  The kref check (can't incref when 0) caught this.

5 years agoFixes VFS /dev/null
Barret Rhoden [Fri, 17 Jan 2014 02:03:13 +0000 (18:03 -0800)]
Fixes VFS /dev/null

5 years agoBetter debugging support
Barret Rhoden [Wed, 15 Jan 2014 22:49:15 +0000 (14:49 -0800)]
Better debugging support

Now builds 64b with debugging support, and on x86, it retains the original 64b
object.  Once we objcopy, we lose the ability to use some debugging tools, such
as addr2line.

This retains the 64bit original version of the kernel, which will be large if
you use a big KFS.  But no one should be doing that anymore.  If you do, you
can comment out the cp in k/a/x/Makefile (but don't commit it).

With this change, you can do things such as:

$ x86_64-ros-addr2line -e obj/kern/akaros-kernel-64b

$ gdb obj/kern/akaros-kernel-64b
Reading symbols
from akaros-kernel-64b...done.
(gdb) list *0xffffffffc200d030
0xffffffffc200d030 is in abort_all_sysc (kern/src/kthread.c:739).
734/* This will abort any abortabls at the time the call was started.  New
735 * abortables could be registered concurrently.  The main caller I see for this
736 * is proc_destroy(), so DYING will be set, and new abortables will quickly
737 * abort and dereg when they see their proc is DYING. */
738void abort_all_sysc(struct proc *p)
740    struct cv_lookup_elm *cle;
741    int8_t irq_state = 0;
742    struct cv_lookup_tailq abortall_list;
743    struct proc *old_proc = switch_to(p);

Note that you need to call this on the akaros-kernel-64b version (for amd64).

5 years agoAbort vminit for now
Barret Rhoden [Tue, 14 Jan 2014 21:28:26 +0000 (13:28 -0800)]
Abort vminit for now

Minor hack, sorry.

5 years agoVMRs that map page_maps are tracked
Barret Rhoden [Tue, 14 Jan 2014 00:52:33 +0000 (16:52 -0800)]
VMRs that map page_maps are tracked

Needed so we can remove pages or otherwise see which processes are using
which parts of a PM.

5 years agoSplits the mm_lock
Barret Rhoden [Mon, 13 Jan 2014 22:29:53 +0000 (14:29 -0800)]
Splits the mm_lock

Split into VMR (protects VMR tree properties) and PTE (protects page
table structures and properties).

Needed so that we can have the PM lock holders change the PTEs.
Ordering is now: vmr -> pte, vmr -> pm -> pte.

5 years agoPage map interface and munmap changes
Barret Rhoden [Mon, 13 Jan 2014 18:24:12 +0000 (10:24 -0800)]
Page map interface and munmap changes

The PM interface was slimmed a bit.  We still will need to change the
usages of pm_put_page for mmap a little.

munmap is a bit more efficient, and the VMRs are explicitly unmapped.
We'll need to do this instead of just blindly decreffing an entire
address space, since we need to handle PM pages differently.

5 years agoFixes memory leak in namec()
Barret Rhoden [Sun, 12 Jan 2014 23:39:35 +0000 (15:39 -0800)]
Fixes memory leak in namec()

I neglected to free e.off when skipping the namelenerror.

5 years agoFixes waserror() memory leak in devwalk
Barret Rhoden [Sun, 12 Jan 2014 22:55:02 +0000 (14:55 -0800)]
Fixes waserror() memory leak in devwalk

The alloc was being ignored by the compiler.  As far as it was
concerned, at the waserror point (where error jumps back to), there was
no way for alloc to not be 0.  So we never freed the chan wq->clone.

We'll definitely have issues like this in the future.  We need some way
to tell the compiler to forget anything it might have known before a
certain point; otherwise we'll need to drop lots of volatiles around.
Not sure why we need this but plan9 didn't.

5 years agoFixed memory leak in namec()
Barret Rhoden [Sun, 12 Jan 2014 22:51:49 +0000 (14:51 -0800)]
Fixed memory leak in namec()

Calling nexterror() instead of error() popped off the second waserror,
skipping over a bunch of cleanup.  Careful with nexterror()!

5 years agoFixes memory leak in dev stdout
Barret Rhoden [Sun, 12 Jan 2014 22:50:38 +0000 (14:50 -0800)]
Fixes memory leak in dev stdout

Failed to free the strdup buffer.

5 years agoPage flags are now atomic
Barret Rhoden [Fri, 10 Jan 2014 20:58:14 +0000 (12:58 -0800)]
Page flags are now atomic

I don't want to lock pages just to mark it dirty or something.  This
will also help the PM removal.

5 years agox86: Fixes bug in pml callbacks
Barret Rhoden [Fri, 10 Jan 2014 20:12:00 +0000 (12:12 -0800)]
x86: Fixes bug in pml callbacks

Was leaking internal page tables for every process.

5 years agoMemwalks run CBs on all PTEs, not just PTE_Ps
Barret Rhoden [Fri, 10 Jan 2014 20:02:50 +0000 (12:02 -0800)]
Memwalks run CBs on all PTEs, not just PTE_Ps

The PTE states need a lot of work, and something is likely to be screwed
up here.

I needed to make a distinction between !PTE_P and completely empty,
since the upcoming page map removals will have PTEs !P, but still
'readable'.  And I'll need to memwalk those.

5 years agoThis now enables vmx via vmxon and vmclear works too
Ronald G. Minnich [Tue, 14 Jan 2014 17:57:39 +0000 (09:57 -0800)]
This now enables vmx via vmxon and vmclear works too

Wow, that was a pain. The kvm code did not check error returns
from vmxon; we now do that.

Way too much printing in here but we can fix that later.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd a kernel log buffer
Ronald G. Minnich [Mon, 13 Jan 2014 21:56:47 +0000 (13:56 -0800)]
Add a kernel log buffer

This is handy when your laptop keeps overrunning your screen.

cat '#c/kmesg' > '#r/xyz' to put it somewhere.

If you just cat it, it never ends. Sorry. I tried.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd run support.
Ronald G. Minnich [Mon, 13 Jan 2014 01:50:05 +0000 (17:50 -0800)]
Add run support.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoCopying out the image sort of works
Ronald G. Minnich [Fri, 10 Jan 2014 23:57:36 +0000 (15:57 -0800)]
Copying out the image sort of works

I know I can copy out one page, anyway.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoPart-way to writing memory
Ronald G. Minnich [Fri, 10 Jan 2014 22:45:38 +0000 (14:45 -0800)]
Part-way to writing memory

We're getting a NULL pointer in vm_set_memory_region,
but part of it is working.

I have moved some of the infrastructure over to error()/waserror(), and
I'm now remembering why I like getting useful error messages
instead of the conventional UNIX bring-me-another-rock
behavior of EINVAL.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoRemove a file committed by mistake apparently.
Ronald G. Minnich [Fri, 10 Jan 2014 21:43:34 +0000 (13:43 -0800)]
Remove a file committed by mistake apparently.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agosdata.c: remove a warning and put informational printk back
Ronald G. Minnich [Fri, 10 Jan 2014 21:42:49 +0000 (13:42 -0800)]
sdata.c: remove a warning and put informational printk back

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoWe can now set kvm at boot time
Ronald G. Minnich [Fri, 10 Jan 2014 21:41:21 +0000 (13:41 -0800)]
We can now set kvm at boot time

Attach the device, and create vms.

We can not run them yet.

This is an interim commit, but important.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agox86: move the kernel up to 0x2000000
Barret Rhoden [Thu, 9 Jan 2014 23:14:29 +0000 (15:14 -0800)]
x86: move the kernel up to 0x2000000

Needed this for syslinux.  We 'waste' about 32MB or so, but we actually
can reclaim that after booting if we want.  We would need to track the
end of the boot area (which still starts at 0x10000), and then could
just free the pages up to 0x2000000.

5 years agoFixes off-by-one in readmem()
Barret Rhoden [Thu, 9 Jan 2014 22:44:05 +0000 (14:44 -0800)]
Fixes off-by-one in readmem()

Missed this when it went from __readstr -> readmem.

5 years agoFixes multiboot parsing bug
Barret Rhoden [Thu, 9 Jan 2014 22:41:35 +0000 (14:41 -0800)]
Fixes multiboot parsing bug

sizeof was the end point, instead of the length.

5 years agoMake the panic just a wee bit more informative.
Ronald G. Minnich [Thu, 9 Jan 2014 20:09:13 +0000 (12:09 -0800)]
Make the panic just a wee bit more informative.

I know I'm a fool, but you need to tell me why :-)

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoMove vm.c and vm_mmu.c to vmx.c and vmx_mmu.c
Ronald G. Minnich [Thu, 9 Jan 2014 20:08:34 +0000 (12:08 -0800)]
Move vm.c and vm_mmu.c to vmx.c and vmx_mmu.c

They are sub-arch specific.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAlways compile in litevm and make sure it won't crash the kernel
Ronald G. Minnich [Wed, 8 Jan 2014 17:48:17 +0000 (09:48 -0800)]
Always compile in litevm and make sure it won't crash the kernel

litevm is always built in now, it builds and you can boot.

We don't call litevm_init until you attach '#V'. At that point,
if you don't have a working vmxon instruction, you'll get a
panic. This makes #V very useful for crashing all the cores
at once. Unfortunately, once this bug is fixed, you will no longer
have this option for crashing the kernel.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoThings now compile and link.
Ronald G. Minnich [Wed, 8 Jan 2014 01:09:50 +0000 (17:09 -0800)]
Things now compile and link.

Time to start testing. It won't work.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agosnapshot: Things now build, with warnings, but don't link.
Ronald G. Minnich [Tue, 7 Jan 2014 18:28:27 +0000 (10:28 -0800)]
snapshot: Things now build, with warnings, but don't link.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agovm mmu support
Ronald G. Minnich [Mon, 6 Jan 2014 23:52:32 +0000 (15:52 -0800)]
vm mmu support

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoGet the vm support to compile
Ronald G. Minnich [Mon, 6 Jan 2014 21:00:42 +0000 (13:00 -0800)]
Get the vm support to compile

Lots of warnings, and will not link. But it's closer.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd function prototype for NUMA-style allocation
Ronald G. Minnich [Sat, 4 Jan 2014 01:36:12 +0000 (17:36 -0800)]
Add function prototype for NUMA-style allocation

In Linux, there is an allocator for pages which allows one
to specify the node. This is a good idea. We're not ready
to do it, but we should reserve a placeholder for it and,
when we bring code over, make sure that we don't lost track
of code that wants NUMA-specific allocation.

Add get_cont_pages_node, which takes node as the first parameter.
The function is equivalent to get_cont_pages, but that will
change if we ever get real NUMA-style allocation.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd flags that VMs need. But many other things do as well.
Ronald G. Minnich [Sat, 4 Jan 2014 01:34:35 +0000 (17:34 -0800)]
Add flags that VMs need. But many other things do as well.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoSimplify things and put VM info into per-cpu struct
Ronald G. Minnich [Sat, 4 Jan 2014 00:37:18 +0000 (16:37 -0800)]
Simplify things and put VM info into per-cpu struct

Rename litevm.h to vm.h, that's what it is on

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoPlaceholder for vm support
Ronald G. Minnich [Sat, 4 Jan 2014 00:07:16 +0000 (16:07 -0800)]
Placeholder for vm support

vm.c gets lots of errors, but I think they're going to prove
to be pretty simple.

One thing we can do cleanly in akaros, since we know we want
a vm and we know we're only going to go with one, is put the
per-cpu stuff in the actual akaros per-cpu structs. That gets
rid of some fiddling around.

We should figure out if msr-index.h just should go in x86.h.
Personally, I vote yes; I don't like lots of little includes and
cpp is fast enough for it not to matter.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd the emulate support code
Ronald G. Minnich [Fri, 3 Jan 2014 22:39:17 +0000 (14:39 -0800)]
Add the emulate support code

This is missing some processor manipulation functions, as the build will show.
We'll add them next week.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd the skeleton for vm support
Ronald G. Minnich [Fri, 3 Jan 2014 22:17:38 +0000 (14:17 -0800)]
Add the skeleton for vm support

This code is from my litevm project, which is a redo of the early
kvm stuff as driver-only. That makes it easy to pull into akaros.
No need to driver-ize all of akaros for VMs. I'm not sure
we'd ever want to go that far anyway, it opens up the door to all
kinds of nasty attacks (as it has in Linux) that we don't want.

kern/drivers/dev/vm.c is an architecture-independent vm driver. Note that the
include files do not have an architecture type in the name (different
from linux) such that they can be included as arch/file and it will
work on any arch (which we need to keep in mind). This is
in the Plan 9 model of making things build in the architecture-independent
code when you build for an arch, by making the include file names

Next steps are to keep bringing code over, which will live in

All this is open to change once everyone is back from vacation
of course.

Suggestions on efficiently pulling in the vm image are welcome.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoBasic layout of the driver is sorta done.
Ronald G. Minnich [Fri, 3 Jan 2014 01:02:03 +0000 (17:02 -0800)]
Basic layout of the driver is sorta done.

Top level

VMs at
in the vm directories

Now to wrap up the writing of the image and to start hooking in
the vm code itself.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoFix krealloc
Ronald G. Minnich [Thu, 2 Jan 2014 17:16:02 +0000 (09:16 -0800)]
Fix krealloc

It was fairly badly broken.

It's legal to call with a NULL pointer.

It's required to save the old contents to new :-), else it's not much of a RE-allocator.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoWire it in.
Ronald G. Minnich [Thu, 2 Jan 2014 16:51:43 +0000 (08:51 -0800)]
Wire it in.

You can
ls '#V'
and see

but you can't cat clone yet. I'm still getting
up to speed on our new driver style :-)

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd in minimal code for freeing a vm
Ronald G. Minnich [Thu, 2 Jan 2014 15:16:08 +0000 (07:16 -0800)]
Add in minimal code for freeing a vm

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd a simple driver for vms.
Ronald G. Minnich [Thu, 2 Jan 2014 04:55:45 +0000 (20:55 -0800)]
Add a simple driver for vms.

Not being called yet, compiles. Waiting for comments from Barret et. al.
Please note I don't use TAILQ because I expect far higher read
than change traffic on the vm array and a simple array is a lot more
cache friendly.

If this is ok, then I'll add in the support code from the litevm project
and, voila, we have VMs maybe.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdds some features to 'root' script
Barret Rhoden [Tue, 10 Dec 2013 02:45:45 +0000 (18:45 -0800)]
Adds some features to 'root' script

It'll still work as before for qemu users: ash root will ifconfig and
mount the same as before (now with a new srv name).

If you want to mount a UFS for one of the other machines that regularly
(but not always) run UFS, ifconfig first, then call for them by name:

$ ash ifconfig c89
$ ash root c75
$ ash root s141


Feel free to add your own entries to ifconfig and root.

5 years agortl8169 uses aligned kmallocs
Barret Rhoden [Tue, 10 Dec 2013 02:45:24 +0000 (18:45 -0800)]
rtl8169 uses aligned kmallocs

5 years agokmalloc_align()
Barret Rhoden [Tue, 10 Dec 2013 02:30:30 +0000 (18:30 -0800)]

Can be freed with kfree().  Same goes for kzmalloc_align().  Alignment
must be a multiple of sizeof long.

Did some basic tests on 32 and 64 bit.  32 bit complains at compile time
(ROUNDUP).  Feel free to fix that, if someone has a nice way.  Or make
the compiler smarter to not complain about casts in branches it'll never

5 years agoClarifies minor PIT comments
Barret Rhoden [Mon, 9 Dec 2013 17:55:01 +0000 (09:55 -0800)]
Clarifies minor PIT comments

We only ever use PIT timer 1, which has 0, 1, and 2 counters.  Some of
the comments made it harder to verify that.

5 years agoRTL8169 driver fixes
Barret Rhoden [Mon, 9 Dec 2013 03:44:46 +0000 (19:44 -0800)]
RTL8169 driver fixes

Some things still need looked at, but this has most of the changes
needed.  Aligned kmallocs are really ugly.

5 years agoMask PIT timer IRQ by default
Barret Rhoden [Mon, 9 Dec 2013 03:43:44 +0000 (19:43 -0800)]
Mask PIT timer IRQ by default

Needed for Ron's machine.

5 years agolore file.
Ronald G. Minnich [Mon, 9 Dec 2013 02:49:52 +0000 (18:49 -0800)]
lore file.

Stuff we must never forget.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoDirty hack for serial I/O on Ron's AMD
Barret Rhoden [Sun, 8 Dec 2013 23:29:08 +0000 (15:29 -0800)]
Dirty hack for serial I/O on Ron's AMD

Hopefully this will go away very soon.  We're not getting serial IRQs,
so we poll whenever another IRQ (timer) goes off.

5 years agoFix race with x86 boot
Barret Rhoden [Sun, 8 Dec 2013 22:35:45 +0000 (14:35 -0800)]
Fix race with x86 boot

It's possible that some IRQ could break the AP cores out of their halt
before core 0 set up things for the final core init.

5 years agoAdd a line of info to the Go docs
Ronald G. Minnich [Sun, 8 Dec 2013 20:49:00 +0000 (12:49 -0800)]
Add a line of info to the Go docs

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAdd /tmp to /dev/root
Ronald G. Minnich [Sun, 8 Dec 2013 20:48:27 +0000 (12:48 -0800)]
Add /tmp to /dev/root

Makes go test happier

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoNIX 8169 driver
Ronald G. Minnich [Sun, 8 Dec 2013 20:47:10 +0000 (12:47 -0800)]
NIX 8169 driver

PCI is wrong.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoFixes AMD cpuinfo MSR problem
Barret Rhoden [Sat, 7 Dec 2013 00:08:20 +0000 (16:08 -0800)]
Fixes AMD cpuinfo MSR problem

Broader problem: some MSRs are Intel specific, some aren't.  We call all
of them IA32_.  This patch only access two known-bad MSRs if we think we
are Intel.  The MISC_ENABLE was crashing AMD boxes.  FEATURE_CONTROL
hasn't crashed anything yet, but I don't see it in the AMD manual.

5 years agoCleans up tests/
Barret Rhoden [Fri, 6 Dec 2013 22:20:09 +0000 (14:20 -0800)]
Cleans up tests/

We're making a lot of old tests that we don't need, and they all
bloat the size of the initramfs.  This cuts it from 48MB to 26MB or so,
for me.  Glibc still takes up 13MB.

Part of the reason each test is large (200KB+) is that they all
statically link parlib.

All of the tests still live in an old/ directory.  Feel free to add more
tests, in general.  Anything we'll regularly use can be in the main
tests/ directory.  I'm just tired of building (and copying across the
network) huge kernel images.

You might need to make userclean.

You'll also want to clean out binaries from kern/kfs/bin, since those
won't get automatically cleaned.  To do this, I mv'd busybox out of KFS
temporarily, then did:

$ find kern/kfs/bin -type f -exec rm '{}' \+

(or something similar) to remove the binaries, but not the symlinks for
busybox.  Then I mv'd busybox back.

5 years agoBring convert files in from Inferno
Ronald G. Minnich [Wed, 4 Dec 2013 15:16:56 +0000 (07:16 -0800)]
Bring convert files in from Inferno

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoA few tweaks for new code from Interno
Ronald G. Minnich [Wed, 4 Dec 2013 04:56:10 +0000 (20:56 -0800)]
A few tweaks for new code from Interno

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoInferno convs2m.c
Ronald G. Minnich [Wed, 4 Dec 2013 04:55:43 +0000 (20:55 -0800)]
Inferno convs2m.c

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agochange RUN script to not need mnt/hdd/kernel
Ronald G. Minnich [Tue, 3 Dec 2013 17:55:03 +0000 (09:55 -0800)]
change RUN script to not need mnt/hdd/kernel

we're not using the hdd image any more, so don't bother
using it.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoMakefile can detect changes in alternate KFS dirs
Barret Rhoden [Tue, 3 Dec 2013 07:55:07 +0000 (23:55 -0800)]
Makefile can detect changes in alternate KFS dirs

If we don't have kfs-paths as the source of kern_initramfs_files, make
probably won't notice the change to files in any directory other than
FIRST_KFS_PATH, and thus it won't rebuild KFS with the updated files.

This change can detect missing directories too, though you'll need to
run make a couple times if you recently had a bad KFS paths list, due to
how we don't process the .config right away.

5 years agoHack for qemu's missed LAPIC timers
Barret Rhoden [Tue, 3 Dec 2013 06:50:33 +0000 (22:50 -0800)]
Hack for qemu's missed LAPIC timers

If your system hangs and needs keyboard input (or network packets) to
wake up, try turning on LOUSY_APIC_TIMER, and report your results to the
mailing list.  We've seen this on qemu with KVM disabled.

Here's part of the email with details from debugging this:

> still, the question is whether or not __trigger was sitting there as
> an RKM while we halted the core, or if the timer IRQ didn't fire
> until we hit the KB.  i'll poke around a bit - i should be able to
> check the RKM queue from qemu.

turns out that we don't have any pending RKMs when everything is
halted (looked at the memory from qemu), which means the timer interrupt
isn't going off (since it should enqueue an RKM).  then once we hit a
key (like CTRL-Q), the timer interrupt does fire before the KB/serial
IRQ; we see the RKM __trigger_tchain queued (via the monitor/kfunc).

so it looks like the timer IRQ should fire, but doesn't.  and then when
we fire some other IRQ, like serial/KB, the timer IRQ does fire.  i
haven't been able to inspect the LAPIC from qemu - that's not the sort
of thing they'd emulate in physical memory for the monitor, i guess.

anyway, perhaps qemu with-no-kvm doesn't like something about our local
apic timer IRQs?  since qemu doesn't report an always running APIC, it's
possible for the timer to stop in deep C states or speedstep
transitions (SDM 3a 10.5.4).  though even when we -enable-kvm, qemu
also reports no "always running APIC."  maybe qemu is getting confused
and turning something off, or i screwed up some initialization?  Or
perhaps qemu doesn't like our use of "hlt", and has some race of it's
own where halt and alarms happen concurrently.

whenever we do break it out (via KB, for instance), we actually get two
IRQs delivered (handle_irq() runs twice from the moment i hit ctrl-q
til we get into the monitor (which happens directly from ctrl-q's IRQ
handler)).  so probably the first IRQ is the LAPIC timer, and the second
is the keyboard.

incidentally, any IRQ, not just a keyboard/serial IRQ, is enough to
break qemu out of its funk.  so instead of holding down the space bar
with a power supply, you can keep trying to telnet to localhost:5555.

5 years agoFix ron's little script so it no longer uses the kfs
Ronald G. Minnich [Wed, 27 Nov 2013 17:42:44 +0000 (09:42 -0800)]
Fix ron's little script so it no longer uses the kfs

Long term, it might be going away, so it makes sense to stop using it

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoFix the top level makefile
Ronald G. Minnich [Wed, 27 Nov 2013 17:41:23 +0000 (09:41 -0800)]
Fix the top level makefile

If your .config included more than on kfs path, and any of those
paths did not exist, empty directories were created. Fix that.

Fix the logic up a bit on creating the image such that
you have some idea that a directory in your paths does
not exist.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoFixes tcpackproc's kname
Barret Rhoden [Wed, 27 Nov 2013 01:18:50 +0000 (17:18 -0800)]
Fixes tcpackproc's kname

Can't use the space on the stack, since the ktask is async.

We could start having ktask() kstrdup the string.  Though either way, the ktask
will need to free when it's done.

5 years agoConfig scripts take a machine name for c89
Barret Rhoden [Wed, 27 Nov 2013 01:00:59 +0000 (17:00 -0800)]
Config scripts take a machine name for c89

Without arguments, both scripts will continue to config for qemu.

When you're on c89 will config for that machine.  It'll only config c89's first
NIC to appear as c96.  We also have c97 available for the second NIC, if we

$ ash ifconfig c89
$ ash root c89

5 years agoFixes mount bug
Barret Rhoden [Wed, 27 Nov 2013 00:19:51 +0000 (16:19 -0800)]
Fixes mount bug

If the 9p server reset, future ls /mnt would crash due to unbalanced

5 years agoFixes ktask aborting
Barret Rhoden [Tue, 26 Nov 2013 19:50:21 +0000 (11:50 -0800)]
Fixes ktask aborting

For some reason, my original testing machine didn't catch this.  proc can be
non-zero, but still gibberish, causing a PF.

5 years agoKernel alarms pass the alarm ID
Barret Rhoden [Tue, 26 Nov 2013 02:06:20 +0000 (18:06 -0800)]
Kernel alarms pass the alarm ID

So userspace can tell which of it's #A alarms is firing.  With this (and
with multiple event handlers per event), we could have multiple alarm
handlers register and run dynamically.  Alternatively, we could switch
based on the ID, if there was one common handler (can do that

Note that the existing alarm examples can receive multiple events for
the same alarm.  It's up to userspace to handle that (it's easy, and we
do it).  This is a consequence of using SPAM_PUBLIC.  If your alarm
can't handle that, use an INDIR/FALLBACK.  This is part of the reason
why I didn't make a helper to set up all the alarm stuff - people will
want to customize, especially in the realm of the ev_q.  (The other
issue is whether or not CLOEXEC is used.  And there may be other issues
I haven't thought of).

Multiple ev_qs can be registered for different alarms; it's just hard to
share the event handler for them all, hence this patch.  I'll deal with
this more if we ever get someone who wants to use multiple kernel alarms
with different handlers.

5 years agoDestroying procs will abort their syscalls
Barret Rhoden [Tue, 26 Nov 2013 00:58:36 +0000 (16:58 -0800)]
Destroying procs will abort their syscalls

Will only abort the abortable syscalls, not ones blocked on qlocks or
anything other than a rendez_sleep().

5 years agoFix for concurrent syscall aborters
Barret Rhoden [Mon, 25 Nov 2013 23:45:30 +0000 (15:45 -0800)]
Fix for concurrent syscall aborters

And adds some explanation about the issues of aborting syscalls.
Massive amounts of notes paid off; they reminded me of the
multiple-aborter case.

5 years agoNotes on using Go.
Ronald G. Minnich [Fri, 22 Nov 2013 22:35:12 +0000 (14:35 -0800)]
Notes on using Go.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoAlarm to abort syscalls, used in ping
Barret Rhoden [Fri, 22 Nov 2013 18:39:08 +0000 (10:39 -0800)]
Alarm to abort syscalls, used in ping

Will need to reorganize a lot of userspace's libraries.  Stuff like
nsec2tsc() doesn't need to be in a benchmarking library.  Same goes for
the alarm stuff; benchutil is more of a "everything I can't put in
parlib that we want by default."

Also, I cleaned up ping a little, notably the interrupted read code and
the spacing between sends (and now we get reasonable RTTs).

5 years agoFixes tchain corruption
Barret Rhoden [Fri, 22 Nov 2013 01:55:34 +0000 (17:55 -0800)]
Fixes tchain corruption

If you have multiple unsets of the same waiter, you would corrupt the
list.  I actually had this happen, though I'm not sure how.  The ksched
alarm was getting accidentally ripped off this list, causing all
processes to hang.  My hunch is that ping was setting and cancelling
alarms frequently, and perhaps userspace submitted concurrent requests
to unset its main alarm.

5 years agoFixes bug with cross-core kernel alarms
Barret Rhoden [Fri, 22 Nov 2013 01:05:09 +0000 (17:05 -0800)]
Fixes bug with cross-core kernel alarms

Bad pointer arithmetic.

5 years agoSYS_abort_syscall (XCC)
Barret Rhoden [Fri, 22 Nov 2013 00:14:26 +0000 (16:14 -0800)]
SYS_abort_syscall (XCC)

Userspace can request the cancellation of a syscall.  If that sysc is
blocked on a rendez, such as when listening on a network chan, it will
return via error().  If not, nothing will happen.

Reinstall your kernel headers.

5 years agoUserspace alarm service
Barret Rhoden [Wed, 20 Nov 2013 19:35:25 +0000 (11:35 -0800)]
Userspace alarm service

Built off #A, this provides a basic alarm handler service similar to the
kernel's.  The main differences are that there are no semaphores and
only one tchain (interrupt source).

Instead of having to set up a full #A alarm for every little handler,
you can use the user alarm service, which will multiplex them in
userspace off a single kernel alarm.

5 years agoDon't print spurious interrupts
Ronald G. Minnich [Wed, 20 Nov 2013 17:59:01 +0000 (09:59 -0800)]
Don't print spurious interrupts

They happen way more than we thought and we don't care.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoShort doc on using go9p so people don't have to search so much
Ronald G. Minnich [Wed, 20 Nov 2013 17:57:20 +0000 (09:57 -0800)]
Short doc on using go9p so people don't have to search so much

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoFixes PF in sys_exec()
Barret Rhoden [Wed, 20 Nov 2013 02:49:20 +0000 (18:49 -0800)]
Fixes PF in sys_exec()

This could happen if load_elf() tries to set_errno().  This could happen
if we failed to load the requested interpreter (ei.interp).

5 years agoAdds devalarm (#A)
Barret Rhoden [Wed, 20 Nov 2013 00:02:27 +0000 (16:02 -0800)]
Adds devalarm (#A)

It is an alarm service for processes.  Check out the top of
k/d/d/alarm.c and the test for more details.

5 years agoFixes O_EXCL support for 9ns
Barret Rhoden [Tue, 19 Nov 2013 23:58:43 +0000 (15:58 -0800)]
Fixes O_EXCL support for 9ns

I'm pretty sure whenever you create #s files, you want them O_EXCL.
Otherwise, with glibc open/create semantics, you can't tell between
opening an existing srvfile and creating a new one.

5 years agoO_CLOEXEC support for 9ns
Barret Rhoden [Tue, 19 Nov 2013 22:01:53 +0000 (14:01 -0800)]
O_CLOEXEC support for 9ns

Pending an overhaul of process creation.

5 years agoHack for mon_bin_run()
Barret Rhoden [Tue, 19 Nov 2013 21:50:16 +0000 (13:50 -0800)]
Hack for mon_bin_run()

This only matters when you run bin_run (or bb) while another process is
current on the core.  Say you lock up a process and want to get another
shell, prior to this the new shell would inherit certain things from the
active process, due to assumptions in the create paths about the
relationship between the parent and current.

5 years agoFix up of file open flags (XCC)
Barret Rhoden [Tue, 19 Nov 2013 21:21:19 +0000 (13:21 -0800)]
Fix up of file open flags (XCC)

Plan9 and glibc differed in their open flags, as well as semantics on
things like CREATE.  Note there is no OCREAT in plan9, so we've got more
of a mashup of flags and syscalls.

I tried to get the intent of openmode() correct: reduce to the access
mode type, with EXEC => RDONLY, and ignore all the other flags.

devsrv was aborting for TRUNC, though I don't see why.  These fake
devices should be ignoring it anyways; everything is one big write from
the beginning, for all writes.

Reinstall your kernel headers, if you want access to the flags from

5 years agoFixes name len error in #s
Barret Rhoden [Tue, 19 Nov 2013 21:03:07 +0000 (13:03 -0800)]
Fixes name len error in #s

And removes one of the compiler warnings / clarifies dirty hacks.

5 years agoStub sleep in glibc (XCC)
Barret Rhoden [Tue, 19 Nov 2013 00:25:08 +0000 (16:25 -0800)]
Stub sleep in glibc (XCC)

Some plan9 programs are calling sleep, and that links to some old
half-built POSIX sleep in glibc that ends up just busy waiting.

We don't support the regular sleep() directly; specifically, we don't
inrerupt sleep on signal delivery.  2LSs could build this if they want,
though signals are sent to processes, not to threads.  In that sense,
sleep is a bit wrong for what we want to do.

If you want to just put a uthread to sleep for a certain amount of time,
you can call uthread_sleep().  Its dumb and just uses the debugging
sys_block to wait in the kernel (we could do it in userspace, for
instance, with an alarm system).

Anyway, I mostly wanted to see stub warnings when compiling something
that calls sleep(), since that is a sign that the program will have
issues with signal handling / porting.

You need to copy over the sleep file into glibc-2.14.1/ and rebuild, or
do a make clean and rebuild your cross compiler.

5 years agoAdds read-only umem helper
Barret Rhoden [Mon, 18 Nov 2013 23:32:58 +0000 (15:32 -0800)]
Adds read-only umem helper

5 years agoSafety checks in send_event()
Barret Rhoden [Mon, 18 Nov 2013 23:31:02 +0000 (15:31 -0800)]
Safety checks in send_event()

Catch future IRQ calls of send_event().  Also, send_event() might be
able to handle PROC_DYING, but just in case, we abort.  Once again,
we're using "the immutable state of DYING" here (no worry of races once
your DYING when you hold a ref).

5 years agoKernel alarm handling moved to RKM context
Barret Rhoden [Mon, 18 Nov 2013 23:07:32 +0000 (15:07 -0800)]
Kernel alarm handling moved to RKM context

Instead of running handlers from IRQ context, we shift them to RKM
context.  Alternatively, we could only do this for the awaiter handlers
(and not the semaphores), but it's probably not a big deal.

The reason for this so that we can easily send_event from an alarm
handler.  Right now, you can't send_event from IRQ context since it
might trigger a proc wakeup (grab the proclock, scheduler callbacks,
etc), all of which are not irqsave.

While I could change all of those, I'd rather cut down on the amount of
things in IRQ context (both for interrupt latency as well as for code
safety - RKMs can block, etc, though a block will delay all alarms under
the current code).  Keep in mind that send_event() can also trigger an
mmap call.  If we ever want blockable alarms, we can easily put that in
(IRQ handler wakes sems, executes handlers marked "IRQOK", and launched
an RKM otherwise).

5 years agoFixes reset_alarm_abs()
Barret Rhoden [Fri, 15 Nov 2013 04:59:55 +0000 (20:59 -0800)]
Fixes reset_alarm_abs()

It couldn't handle an alarm that had never been set, since has_fired was
initially 0.  Renaming has_fired clarifies its use, fixes the init
problem, and makes the code clearer.

5 years agoDev zeros the dir path before genning
Barret Rhoden [Thu, 14 Nov 2013 20:58:25 +0000 (12:58 -0800)]
Dev zeros the dir path before genning

It's useful for devices to be able to get information about the last run
through their gen function when run in a tight loop.  There's no good
way to do pass an arbitrary value back, but we can use the dir to
communicate the result of the previous run.  So long as we handle the
initial case.

Gens communicate via the dir, and dir->qid.path is the last path used in
the previous run.  This works if we can bootstrap it, and passing in
gibberish (on the stack) or ancient versions of dir will mess things up.
So now any caller of a gen in a loop will make sure dir's path is 0.

Also, it's not sufficient to just check for {s,i} == 0 to detect the
"first run" of a gen.  Sometimes (devdirread()), a device will be asked
to gen starting at a higher value of its iterator.  By zeroing dir's
path, a gen can tell if it is in the middle or not of a series of runs.

5 years agoFixes up readnum() and readstr()
Barret Rhoden [Thu, 14 Nov 2013 20:54:59 +0000 (12:54 -0800)]
Fixes up readnum() and readstr()

They now copy the trailing \0, if there is room in the buffer.

readnum() was doing some funky stuff where it would also copy up to
NUMSIZE bytes of gibberish out (which you could see from cat-ing certain
ctls, though not from #I, which rolls its own readnum for now).

Most everyone picks NUMSIZE (12) when using readnum().  proc has an
interesting usage of it, but otherwise we might want to remove that.

5 years agoAdd sdsci.c
Ronald G. Minnich [Wed, 20 Nov 2013 01:07:37 +0000 (17:07 -0800)]
Add sdsci.c

Needed to build.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoscsi IO routines
Ronald G. Minnich [Mon, 18 Nov 2013 17:58:46 +0000 (09:58 -0800)]
scsi IO routines

From Inferno. At this point, we can start to test the sdata functionality

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
5 years agoCleanup
Ronald G. Minnich [Mon, 18 Nov 2013 17:49:30 +0000 (09:49 -0800)]

Don't need this, don't want it in the tree.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>