5 years agoPthread scheduling hooks
Barret Rhoden [Mon, 4 May 2015 16:14:39 +0000 (12:14 -0400)]
Pthread scheduling hooks

There are a bunch of ways to set scheduling priorities, policies, and
scope.  We'll allow programs to try to set these values, but they won't
do much.

Our current scheduler is a SCOPE_PROCESS, SCHED_FIFO, with only one
priority level: 0.

5 years agoUpdated contribution policies
Barret Rhoden [Mon, 27 Apr 2015 20:12:21 +0000 (16:12 -0400)]
Updated contribution policies

Updates and clarifies Akaros's contribution policies, some of which have
been in writing, some of which haven't.  This also provides a bunch of
git commands for common scenarios that pop up.

One new thing is that all committers must agree to the
Developer Certificate of Origin.

5 years agoFixes unmount
Barret Rhoden [Tue, 21 Apr 2015 15:48:57 +0000 (11:48 -0400)]
Fixes unmount

On the kernel side, there are two changes.  Functionally, we can handle
a null src_path.  Code-wise, I renamed the variables to clarify what is
going on.  Plan 9's 'old' and 'new' weren't very helpful.  Additionally,
what the man pages call old and new were actually reversed when you get
to sysfile.c!

On the user side, cs wasn't calling the syscall properly, so it would
always fail.  cs unmounts #s/cs from /net before it starts up, to make
sure that previous cs runs don't leave any lingering mounts.  You
actually can restart cs &, then mount -a \#s/cs /net and be back in

5 years agoSyscall tests for PATH_MAX
Barret Rhoden [Mon, 20 Apr 2015 22:38:40 +0000 (18:38 -0400)]
Syscall tests for PATH_MAX

Even though it's possible for the user to build a path longer than
PATH_MAX (e.g. 16 NAME_MAX filenames), we still need a limit.  If
anything 4096 seems ridiculously large (and will trigger 2-contig page

5 years agoUse GMP, MPFR and MPC directly in gcc build. (XCC)
Dan Cross [Mon, 20 Apr 2015 18:36:49 +0000 (14:36 -0400)]
Use GMP, MPFR and MPC directly in gcc build. (XCC)

Note: rebuild your toolchain after pulling this. Use the
versions of gmp, mpfr and mpc that we pull down when building
gcc, instead of relying on pre-build/pre-installed versions.

5 years agoAdds PATH_MAX and NAME_MAX (XCC)
Barret Rhoden [Mon, 20 Apr 2015 15:44:29 +0000 (11:44 -0400)]

For POSIX compatibility.

Rebuild your toolchain.  Or just copy all of the .h files around.

5 years agoRemoves libgcc_eh hack (XCC)
Barret Rhoden [Fri, 17 Apr 2015 21:19:45 +0000 (17:19 -0400)]
Removes libgcc_eh hack (XCC)

For some reason, we used to need to have a fake .a file sitting around.
Either because of recent changes, or maybe the crosstool-like changes
from last year, we no longer need the hack.


You probably don't need to rebuild the toolchain.

5 years agoFixes shared library linking (XCC)
Barret Rhoden [Fri, 17 Apr 2015 20:49:58 +0000 (16:49 -0400)]
Fixes shared library linking (XCC)

If you try to make a hello-world c++ library:

$ x86_64-ucb-akaros-gcc -fPIC -o lib.o -c lib.cc
$ x86_64-ucb-akaros-gcc -shared -o lib.so lib.o

You'll get the error:

... 4.9.2/crtendS.o(.eh_frame); no .eh_frame_hdr table will be created.

Some sites suggested a problem with config.gcc, such as
http://forum.osdev.org/viewtopic.php?t=25489 , though the problem was
n't crtstuff.  Or at least that didn't help me.  Though it did make me
look at the config.gcc, and I attempted to make ours more like Linux's.

The main change was   tmake_file="t-slibgcc"  , which is needed to make
a shared version of libgcc_s.so.  That in turn needed some fixups in
config.host, the most important being the softfloat business where we
didn't include x86_64 akaros.

Rebuild your toolchain.

5 years agoParlib and other user libs are built with -fPIC
Barret Rhoden [Fri, 17 Apr 2015 14:50:10 +0000 (10:50 -0400)]
Parlib and other user libs are built with -fPIC

Also, this collects the common user library flags into the top-level

5 years agoParlib is no PIC-capable
Barret Rhoden [Fri, 17 Apr 2015 14:46:15 +0000 (10:46 -0400)]
Parlib is no PIC-capable

We needed some minor changes, mostly to uthread, to be able to build
parlib with -fPIC (and as a .so).

Thanks to the lack of TLS-clobbers, anytime we set_tls_desc and then
access TLS variables in the same function, we need to wrap those
accesses with 'begin_safe_access'.  Otherwise, the compiler will cache
the address of TLS variables and not discard and recompute the address
after a TLS change.

The other big change is that leaq needed to do PC-relative addressing.
Otherwise the asm emits a _32S relocation, which fails when we make a
shared library with parlib.  For a nice review of relocations, check
out: http://www.mindfruit.co.uk/2012/06/relocations-relocations.html

5 years agoBuilds libstdc++.so (XCC)
Barret Rhoden [Fri, 17 Apr 2015 13:41:20 +0000 (09:41 -0400)]
Builds libstdc++.so (XCC)

Changed up the configure for libstdc++ to match Linux's config.  If
you're porting the configure script to a newer version of gcc,
double-check all of the places where 'linux' appears in the config.
It's probably easier to just recreate the configure script from scratch.

There are a few places in the configure script where it's probably not
important for Akaros to mirror Linux, such as when testing for certain
Linux features.  Since those tests just fail, it seems saner just to put
an 'akaros' wherever there is a 'linux.'

Also, I had to update fill-kfs to find the libstdc++.so, and this also
adds about 6MB to KFS (and the resulting kernel binary) due to the size
of libstdc++.so.

Rebuild your toolchain.

5 years agoFix the way we set up vmcs
Ron Minnich [Thu, 26 Mar 2015 20:33:04 +0000 (13:33 -0700)]
Fix the way we set up vmcs

The Dune code we started with, which started with KVM code, has always been hard to parse.
Clean it up and make sure we know each and every bit we claim to set or clear

Signed-off-by: Ron Minnich <rminnich@gmail.com>
Amended-by: Barret Rhoden <brho@cs.berkeley.edu>
5 years agoRemoves mon_setmapperm
Barret Rhoden [Mon, 6 Apr 2015 18:51:56 +0000 (14:51 -0400)]
Removes mon_setmapperm

Unused, and just cluttering up my git grep.

5 years agoPmap ops: perm->settings
Barret Rhoden [Mon, 6 Apr 2015 18:46:12 +0000 (14:46 -0400)]
Pmap ops: perm->settings

This clarifies some aspects of pte_get_perms and pte_write.  In reality,
write takes all sorts of non-permission based flags.  What we really
wanted (I think) was the pte settings: the non-paddr lower 12 bits, in
an arch-indep format (based on the #defines).

Still, pte_replace_perm() is very useful as is.  pte_get_perm paired
with pte_write and wasn't really related to pte_replace_perm (in usage).

5 years agox86: pmap cleanup
Barret Rhoden [Mon, 6 Apr 2015 18:02:28 +0000 (14:02 -0400)]
x86: pmap cleanup

Uses more helpers.

5 years agoVMM: debug helper for checking KPT == EPT invariant
Barret Rhoden [Mon, 6 Apr 2015 17:51:22 +0000 (13:51 -0400)]
VMM: debug helper for checking KPT == EPT invariant

Not called from anywhere, but you can kfunc it or drop it wherever you
want (like EPT HPF, proc_free, etc).

5 years agoVMM: handle EPT page faults
Barret Rhoden [Thu, 2 Apr 2015 14:37:26 +0000 (10:37 -0400)]
VMM: handle EPT page faults

Pretty damn simple - just use the real page fault handler, and the EPT
is filled in under the hood by all the epte_ ops.

5 years agoFixes VMR creating off-by-one
Barret Rhoden [Thu, 2 Apr 2015 14:15:44 +0000 (10:15 -0400)]
Fixes VMR creating off-by-one

If a VMR would just barely fit before the first VMR, we would fail to
use that slot.

Practically, this only happens if you decide to do a MAP_FIXED at a low
address, which will unmap a chunk of ld.so - not recommended!

5 years agoVMM: Removes the epte_t from pte_t
Barret Rhoden [Thu, 2 Apr 2015 12:24:08 +0000 (08:24 -0400)]
VMM: Removes the epte_t from pte_t

A pte is just a kpte_t* - still different than a month ago, where pte ==
kpte.  Now pte == kpte*.  But we don't need to track the epte with the
kpte, since we can find the epte from the kpte.

I kept the eptp as part of the pgdir.  Arguably, the cr3 belongs there
too.  Often the cr3 and eptp have extra bits in them, other than just
the PADDR of the PML4, so it's handy to keep them around.

5 years agoVMM: Call EPT ops for every KPT op
Barret Rhoden [Thu, 2 Apr 2015 01:47:03 +0000 (21:47 -0400)]
VMM: Call EPT ops for every KPT op

At this point, the EPT should equal the KPT, up to UVPT.

I disconnected the EPT fault handler for now.  tests/vmmcp still works,
since everything is pre-faulted in.  We'll need to change it to do the
initial faults from the VM.

5 years agoRedefines PTE present vs mapped
Barret Rhoden [Mon, 6 Apr 2015 16:23:43 +0000 (12:23 -0400)]
Redefines PTE present vs mapped

Mapped now means it points to a physical page in all cases.  Present is
mapped and with bits set for some valid PTE walk.  For instance, a user
read works on x86 with PTE_U and PTE_P.

PTE_P shouldn't be used from the arch-indep code now.

I might have missed something with this commit, like leaking memory or
dirty bits.  Feel free to check out the usages of is_present, is_mapped,
and is_unmapped.

5 years agox86: EPT and KPT are contiguous
Barret Rhoden [Wed, 1 Apr 2015 23:55:53 +0000 (19:55 -0400)]
x86: EPT and KPT are contiguous

Ron had a great idea: alloc two contig pages for every KPT intermediate
page table, and have the corresponding EPT page be the adjacent physical
page.  The downside is the memory waste for non-VMM processes and the
pressure on the memory allocator.  The upside is the code is much
simpler and memwalks are faster, since we can easily find an EPTE given

This commit does the two-page alloc for the intermediate pages.  The
existing EPT code won't actually work right now, esp since the pm ops
don't do EPT work.

There's some ugliness with the boot page directories.  I can't put and
align 8192 in entry64.S and have grub boot the damn thing.  So I put in
some dirty hacks to special case the boottime kernel mappings.

5 years agoVMM: moves various helpers to vmx.h
Barret Rhoden [Mon, 30 Mar 2015 17:33:29 +0000 (13:33 -0400)]
VMM: moves various helpers to vmx.h

I'll want some of these from ept.c, and maybe some others from vmm or
debug code.

Removes the compat.h business too, and just drops everything we'll need
in vmx.h.

5 years agoVMM: removes the dune <-> proc
Barret Rhoden [Fri, 27 Mar 2015 18:03:46 +0000 (14:03 -0400)]
VMM: removes the dune <-> proc

Connecting to the proc is the wrong approach for Akaros (the p->virtinfo
or whatever).   Also removed the dune_config while I was at it.

5 years agoVMM: removes the VPID
Barret Rhoden [Fri, 27 Mar 2015 17:51:07 +0000 (13:51 -0400)]
VMM: removes the VPID

AFAIK, the VPID is only useful if you aren't using EPT.  Since we're
using the EPT, the VPID code is just a waste.  But I did leave in the
helpers, since they may be useful and it's also a good practice to flush
the VPID caches in case a previous user of VMX messed with them.

5 years agoVMM: EPT checks, init, and basic usage
Barret Rhoden [Thu, 26 Mar 2015 19:43:09 +0000 (15:43 -0400)]
VMM: EPT checks, init, and basic usage

Does a bunch of checks in EPT initialization, so we don't have to
dynamically check as much (or program to handle older HW).

This will use one EPT per process, instead of one global, but this EPT
is still not fully integrated into the pmap ops.

5 years agoVMM: init and cleanup take the proc *
Barret Rhoden [Thu, 26 Mar 2015 20:22:46 +0000 (16:22 -0400)]
VMM: init and cleanup take the proc *

And do some minor connections between the guest pcore and its proc.

Might need to think a bit about the weak vs strong refs.  I'm pretty
sure the cur_proc ref will always be active whenever we have a
guest_pcore (vmx_vcpu).  We'll see.

5 years agoHelpers for the PGSHIFT of the largest jumbo page
Barret Rhoden [Thu, 26 Mar 2015 19:26:38 +0000 (15:26 -0400)]
Helpers for the PGSHIFT of the largest jumbo page

Other parts of the kernel, including EPT/VMX, will want to know this.

5 years agoVMM: Make put_cpu actually put the cpu
Ron Minnich [Mon, 16 Mar 2015 23:31:41 +0000 (16:31 -0700)]
VMM: Make put_cpu actually put the cpu

And various fixes / temp hacks.

(git-fu'd by brho)

5 years agoVMM: Fixes vmmcp freezes
Barret Rhoden [Fri, 20 Mar 2015 21:20:30 +0000 (17:20 -0400)]
VMM: Fixes vmmcp freezes

The Host's TSS was set wrong.  Not sure why exactly 8* works for Linux.

The TSS and GS probably should be set in the per-cpu area.

5 years agoVMM: fixes VMCS order computation
Barret Rhoden [Fri, 20 Mar 2015 21:22:23 +0000 (17:22 -0400)]
VMM: fixes VMCS order computation

Shifting gives us 0 for nr pages, though we want 1.  And the LOG2 of
that spits out 1 for the order.  We wanted order 0 (1 page).

5 years agoVMM: helper for VMPTRST
Barret Rhoden [Fri, 20 Mar 2015 20:03:43 +0000 (16:03 -0400)]
VMM: helper for VMPTRST

Extracts the calling core's VMCS pointer.

5 years agoAdd a few more pthread compilant definitions
Kevin Klues [Tue, 24 Mar 2015 16:52:00 +0000 (09:52 -0700)]
Add a few more pthread compilant definitions

5 years agoIf the pgdir in debug_print_pgdir is not set, assume rcr3()
Ron Minnich [Mon, 23 Mar 2015 20:02:29 +0000 (13:02 -0700)]
If the pgdir in debug_print_pgdir is not set, assume rcr3()

This is a convenience when using the monitor

Signed-off-by: Ron Minnich <rminnich@gmail.com>
5 years agox86: Fixes cpuid_ecx()
Barret Rhoden [Mon, 23 Mar 2015 16:34:34 +0000 (12:34 -0400)]
x86: Fixes cpuid_ecx()

Was assuming the op was 1.  Currently it was harmless, since the only
caller was passing 1.  I'd be up for a better runtime way to check
things, since this pops up a lot.

5 years agoFixes vmm_struct_cleanup
Barret Rhoden [Mon, 23 Mar 2015 16:24:26 +0000 (12:24 -0400)]
Fixes vmm_struct_cleanup

Cleanup is called from __proc_free, and I don't want to sleep in there.

Running the existing code with the lock debugger will flip out.  Even
attempting to qlock while holding a spinlock will panic, rightly so.
The lock held happens to be the parent's child lock, which it holds when
it decrefs the child.  Regardless, proc_decref is called all over the
place, and I'd rather not sleep in the release method.

I considered removing the qlock and having a multi-state atomic_t that
we CAS on, solving the issue of multiple potential initializers and
cleanup not checking the lock.  But that's a bit of overkill.

5 years agox86: Initialized contexts are SW contexts
Barret Rhoden [Mon, 23 Mar 2015 18:54:11 +0000 (14:54 -0400)]
x86: Initialized contexts are SW contexts

It's a little faster to pop a SW context than a HW context.

5 years agox86: Uses rbx for the initial vcoreid (XCC)
Barret Rhoden [Mon, 23 Mar 2015 18:42:55 +0000 (14:42 -0400)]
x86: Uses rbx for the initial vcoreid (XCC)

Using rax prevents us from using SW contexts.

Rebuild your toolchain.  You don't need to make clean.

5 years agox86: Fixes context security
Barret Rhoden [Mon, 23 Mar 2015 18:28:01 +0000 (14:28 -0400)]
x86: Fixes context security

The big thing is that SW contexts are popped with sysret.  On Intel
machines, a non-canonical RIP will trigger a GP in kernel mode.
A user could have manged the RIP of a VC ctx in the VCPD of a preempted
vcore, then done a sys_change_to() to get the kernel to pop the ctx.

For more info, check out:

While I was here, I also had init_ctx always call secure_ctx.  This
removed some redundant code.  It also enforces gsbase for HW ctxs,
though it was just zeroed a moment before.

Finally, we memset the entire structure for new contexts.  If we used a
smaller context for the init ctx, we could leak some information when we
eventually copy the ctx to procdata.

5 years agoRemoves extra Ivy annotation
Barret Rhoden [Mon, 23 Mar 2015 18:48:14 +0000 (14:48 -0400)]
Removes extra Ivy annotation

Missed this during d9e49fae, probably because of a lingering copy of
no-ivy.h in the toolchain headers.

5 years agoInitial import of virtio rings structures.
Ron Minnich [Mon, 23 Mar 2015 17:44:53 +0000 (10:44 -0700)]
Initial import of virtio rings structures.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
5 years agox86: Fixes init for machines that do not have VMX
Barret Rhoden [Thu, 19 Mar 2015 21:13:35 +0000 (17:13 -0400)]
x86: Fixes init for machines that do not have VMX

On machines (or at least qemu) that don't have VMX, we'd still try and
do the pcpu init, which attempts some VMX instructions.

5 years agoUpdates bootable USB tools
Barret Rhoden [Thu, 19 Mar 2015 21:02:28 +0000 (17:02 -0400)]
Updates bootable USB tools

Added some sanity checks to the script and put mboot.c32, mbr.bin, and a
basic conf in the repo so people don't have to hunt around for them.

5 years agoBNX2X: hacks around the MC assert problem
Barret Rhoden [Thu, 19 Mar 2015 18:38:50 +0000 (14:38 -0400)]
BNX2X: hacks around the MC assert problem

Our get_cont_pages() does not return pages aligned to the *order* of the
allocation.  This means higher order allocs, like 2^3 pages might not
come on an 8*PGSIZE boundary.  Apparently, this was enough to trigger
the MC assert for some high-order alloc.

The dirtiness comes in where we don't free the contig region.  Hopefully
we're not leaking too much.  (only once per NIC, so far).

This is mostly a stopgap til we fix our shitty memory allocator.

5 years agoBNX2X: fixes cont_page allocation
Barret Rhoden [Wed, 18 Mar 2015 16:06:32 +0000 (12:06 -0400)]
BNX2X: fixes cont_page allocation

Linux's alloc_pages returns a struct page*.  Our get_cont_pages returns
a KVA.  The mapping would be screwed up, since we were taking the
page2pa() of the KVA, not the page.

Of course, we weren't calling this, since TPA was disabled, and it
wasn't the problem triggering the MC Assert.  Well damn.

5 years agoBNX2X: fixes include problem
Barret Rhoden [Tue, 17 Mar 2015 18:14:00 +0000 (14:14 -0400)]
BNX2X: fixes include problem

With the recent changes to master, list.h wasn't included anymore.  It
was included previously via one of the vm.h headers.

5 years agoRemoves Ivy annotations (XCC)
Barret Rhoden [Tue, 17 Mar 2015 17:59:12 +0000 (13:59 -0400)]
Removes Ivy annotations (XCC)

Some of the #defines  were interfering with other user-level libraries.
Not sad to see it go, but a little sad that it didn't work out.

Rebuild your toolchain and everything else.

5 years agoMoves ARRAY_SIZE into the kernel only (XCC)
Barret Rhoden [Tue, 17 Mar 2015 16:08:05 +0000 (12:08 -0400)]
Moves ARRAY_SIZE into the kernel only (XCC)

Everyone wants to #define it, so we conflict with some user libraries.

Reinstall your kernel headers.

5 years agoEnables plugins in binutils for gold linker (XCC)
Barret Rhoden [Tue, 17 Mar 2015 16:02:08 +0000 (12:02 -0400)]
Enables plugins in binutils for gold linker (XCC)

To use gold for Akaros (e.g. -fuse-ld=gold in tests/Makefile), we also
need to enable plugins.

Blow away the config and workdir, and rebuild binutils (or just make
clean, etc).

5 years agoEnable gold linker. (XCC)
Dan Cross [Sat, 14 Mar 2015 01:35:32 +0000 (21:35 -0400)]
Enable gold linker. (XCC)

5 years agox86: pgdir_t handles both KPT and EPT
Barret Rhoden [Tue, 17 Mar 2015 14:09:08 +0000 (10:09 -0400)]
x86: pgdir_t handles both KPT and EPT

We still don't make EPTs, but all of the infrastructure is in place.

5 years agox86: changes pte_t to be a KPTE and an EPTE
Barret Rhoden [Tue, 17 Mar 2015 13:38:57 +0000 (09:38 -0400)]
x86: changes pte_t to be a KPTE and an EPTE

Ideally, a PTE would always have a KPTE, and optionally have an EPTE.
Now, for all ops other than walk_okay, we have at least one of KPTE or
EPTE (and possibly both).  pgdir_walk() will return both.  memwalks will
have only one or the other.

The alternative is to come up with a way to walk both tables in
lockstep, jumping back and forth and building a full PTE for the
memcallback at each point.  We might do that later, if necessary.

5 years agoSplits pmap ops up for each arch
Barret Rhoden [Mon, 16 Mar 2015 20:00:39 +0000 (16:00 -0400)]
Splits pmap ops up for each arch

The helpers are the same for now, but this lets x86's ops change to
support EPTs.

5 years agoRemove PDX and NPDENTRIES
Barret Rhoden [Mon, 16 Mar 2015 19:48:26 +0000 (15:48 -0400)]

Old macros, not needed any more.

5 years agoChanges pde_t* -> pgdir_t
Barret Rhoden [Mon, 16 Mar 2015 19:35:23 +0000 (15:35 -0400)]
Changes pde_t* -> pgdir_t

Just like pte_t, the nature of the pgdir is arch-dependent.  For now,
it's all the same under the hood, thanks to various casts.

5 years agoMakes pte_t an opaque type
Barret Rhoden [Mon, 16 Mar 2015 18:16:48 +0000 (14:16 -0400)]
Makes pte_t an opaque type

The nature of pte_t will be arch-dependent.  It could be a struct or the
old pte_t (kpte_t) and have its own tricks for modification.  This patch
changes all of the accesses that implicitly treated pte_t as something
that could be read or written in a certain manner.

It also catches a bug in the unused (and warned) unmap_vmap_segment().

5 years agox86: adds a kpte_t for the pte_t
Barret Rhoden [Mon, 16 Mar 2015 18:14:39 +0000 (14:14 -0400)]
x86: adds a kpte_t for the pte_t

pte_t as a directly-manipulatable object is going away for x86.
Internally, we want something to do the old pte_t's job for the kernel
page table: the kpte_t.

5 years agoDemo code to set up a VMMCP, including #c access
Ron Minnich [Thu, 12 Mar 2015 20:55:12 +0000 (13:55 -0700)]
Demo code to set up a VMMCP, including #c access

This correctly starts a VMMCP as an 'unrestricted guest'.

Next step is to handle the resulting EPT page fault, which exits the vm with
error 0x21.

(git-fu'd by brho)

5 years agoVMM: Hook the VMM to the process (XCC)
Barret Rhoden [Thu, 12 Mar 2015 17:06:31 +0000 (13:06 -0400)]
VMM: Hook the VMM to the process (XCC)

Syscall for turning any proc, including SCPs, into VMMs.  We'll see if
we need to limit to MCPs later. (reflected faults and stuff).

This changes the kernel header, so you'll need to reinstall your headers
if you want to access the new syscall by name.  Either copy
bits/syscall.h manually or rebuild your toolchain.

5 years agoVarious minor debugging changes
Ron Minnich [Wed, 11 Mar 2015 13:37:34 +0000 (06:37 -0700)]
Various minor debugging changes

At least give a HINT when things go wrong. Just a teensy weensy one.

(git-fu'd by brho, and changed the arg order in kmalloc's print)

5 years agoVMMCP: initialization
Barret Rhoden [Wed, 11 Mar 2015 16:28:39 +0000 (12:28 -0400)]
VMMCP: initialization

vmm_init() happens before smp boot, and the per-cpu bits are done in
pcpu init.


5 years agoTry out Dune vmm stuff.
Ron Minnich [Sat, 7 Mar 2015 03:03:49 +0000 (19:03 -0800)]
Try out Dune vmm stuff.

This has been frustrating, finding a reasonably compact yet not awful bit of code
to use for akaros. They're either gigantic, featureful with stuff we don't want,
buggy as can be, or all three.

The Dune stuff seems a reasonably pared down subset of kvm and it's actually
pretty clean. Also, unlike every other bit of vmx code we've tried lately,
it actually seems to work, which is a bonus. And it will never run as a 1978 8086.

We actually start a VM at this point. And, it fails, and exits, *but akaros is not hurt*.
We just keep going.

This was imported, heavily edited, and retroactively committed.
(git-fu'd by brho)

5 years agoMore pruning of files we don't need.
Ron Minnich [Mon, 16 Mar 2015 17:43:48 +0000 (10:43 -0700)]
More pruning of files we don't need.

(git-fu'd by brho)

5 years agox86: helpers for accessing symbols from asm
Barret Rhoden [Tue, 10 Mar 2015 20:49:17 +0000 (16:49 -0400)]
x86: helpers for accessing symbols from asm

5 years agoRun a NIX guest.
Ron Minnich [Thu, 5 Mar 2015 22:29:03 +0000 (14:29 -0800)]
Run a NIX guest.

This works. Basically, when a NIX is cloned, we put a simple program in it to test.

When that NIX is started, it puts a
on 3f8, and return.

We've seen this work.

In this case, I did this:
cat '#t/clone'
echo reserve 5 > '#t/nix0/ctl'
echo run 5 0xffff800040000000 > '#t/nix0/ctl'

Signed-off-by: Ron Minnich <rminnich@gmail.com>
5 years agoBB: manually writes echo's buffer
Barret Rhoden [Fri, 6 Mar 2015 17:43:51 +0000 (12:43 -0500)]
BB: manually writes echo's buffer

So setvbuf() may or may not have worked, since we don't get *any* error
feedback from echo!  When we set to linebuffering, fflush() does not
return any errors.  The kernel sets errno and returns -1.  fflush clears
errno at some point and returns 0, instead of EOF.

I spent too much time wading through glibc's 10 levels of indirection
and don't know why this happens.  If we use block buffering instead of
line, fflush works fine.

This limits echo's to 4096 chars.  Whatever.  We're more likely to find
another issue than to have an echo that long.

Make clean and make busybox.

5 years agoFixes unchecked results from parsecmd
Barret Rhoden [Fri, 6 Mar 2015 15:00:20 +0000 (10:00 -0500)]
Fixes unchecked results from parsecmd

Before accessing the strings of a parsecmd, we must check the nf (num
fields).  Many devices were not checking, so something like
echo "" > /net/ether0/stats
Would trigger a PF.

Using lookupcmd() is safe, since it check the nf internally.  But any
naked access to the fields (like with strcmp) requires a check.

5 years agoFixes devnix's V lookup
Barret Rhoden [Thu, 5 Mar 2015 19:48:58 +0000 (14:48 -0500)]
Fixes devnix's V lookup

The issue was that the QID for chans that were genned from a Qnixdir had
a bad nixid.  We were passing either 0 (for ctl) or 1 (for image) (which
is what you get when you take (s - Qctl).  This happened to work okay
for ctl, since we usually have a nix0.  But image thought its struct v
was for nix1.

I think we only need to do this for "state machine genned" entries,
meaning the entries under Qnixdir.  The "directly genned" entries should
come in to gen with a properly filled out QID (which came from a
previous gen).

5 years agoRemoves old linux networking bits
Barret Rhoden [Thu, 5 Mar 2015 15:50:43 +0000 (10:50 -0500)]
Removes old linux networking bits

We weren't using or working on the e1000 or rtl8169 drivers, nor do we
need them ever.

The mii stuff was also uncompiled and unused.  If we ever need it, we
can pull it from more recent versions of Linux, or adapt Jim's ethermii

5 years agoBNX2X: usability fixups
Barret Rhoden [Wed, 4 Mar 2015 19:12:26 +0000 (14:12 -0500)]
BNX2X: usability fixups

For whatever reason, we can run with the max number of queues on ether0,
but not on ether1.  From poking around, this happened once we started
attaching after resetting both NIC functions (ether0 and ether1).  I had
tried this at one point, but it didn't work.  For whateve reason, it
does now.

But ether1 will still die with the same old MC assert - unless both NICs
are limited to 1 queue.  Then they both work fine.  Note that if the
NICs have different values for NQ (say, 15 for ether0 and 1 for ether1),
*ether0* will get the MC assert.

Other changes include making sure init only happens when we actually
have a bnx2x NIC (by contrast, pnp always happens), and cleaning up the
print debugging.

Unfortunately, we don't have a way to send parameters to attach yet, so
you'll have to manually toggle the debug level if you want to debug
while attaching.

5 years agoChanges devether's Max Trans Unit to 1500
Barret Rhoden [Tue, 3 Mar 2015 20:59:04 +0000 (15:59 -0500)]
Changes devether's Max Trans Unit to 1500

From 1514.  Linux drivers track it as 1500, and add on the header as
needed.  Plan 9 uses 1514, and includes the header.

I don't particularly care one way or another.  This way is a little
easier for porting, but have no problem with changing it back (given a
port to bnx2x's MTU code).

5 years agoBNX2X: disables TPA
Barret Rhoden [Mon, 2 Mar 2015 21:25:09 +0000 (16:25 -0500)]
BNX2X: disables TPA

TPA is the large-receive offload, which needs to hook in to the block
extra data business.  Disabling it for now, to make sure we can even
send packets.

Careful if you decide to turn on extra data, especially about how the
memory is allocated.  The current extra data code just kfrees
everything, but the bnx2x frag alloc gets a kpage.

To work on the extra data, grep for "AKAROS_PORT.*extra".

5 years agoBNX2X: Transmit synchronization
Barret Rhoden [Fri, 27 Feb 2015 23:05:11 +0000 (18:05 -0500)]
BNX2X: Transmit synchronization

The transmit function is called serially, per txdata, meaning there is only
ever one caller of it.  Instead of a netif lock, we use the poker, which
guarantees mutual exclusion (per poke_tracker).

The transmitter stops when the device is full.  Concurrently, the tx_int
could have freed up space in the tx ring.  When tx_int calls poke, poke
will make sure the transmit function runs at least once after poke is
called.  This ensures we don't stall on transmits.

If you're concerned about the network stack calling transmit over and
over while the TX ring is full, we can optimize slightly.  See the notes
above __bnx2x_tx_queue() for details.  In short, poke() is powerful, but
it won't solve all of your problems.

5 years agoBNX2X: Transmit
Barret Rhoden [Fri, 27 Feb 2015 20:05:17 +0000 (15:05 -0500)]
BNX2X: Transmit

Currently, there is no sync protection for multiple transmitters, it uses FP 0
(hard coded), and there is no feedback between tx_int and transmit.  If the tx
buffers are full, transmit will still drain the entire queue and keep failing.
tx_int does nothing when the tx ring has room.

5 years agoBNX2X: hacked up receive
Barret Rhoden [Thu, 26 Feb 2015 21:49:36 +0000 (16:49 -0500)]
BNX2X: hacked up receive

Can receive ARPs and forwards them to devether.  Will panic on tx_int.

5 years agoDebug helpers for BNX2X
Barret Rhoden [Thu, 26 Feb 2015 17:22:33 +0000 (12:22 -0500)]
Debug helpers for BNX2X

Poor-ftrace is too noisy without some blacklisted functions, at least for

The FP / PC print is useful if you're concerned about running off the stack.

5 years agoBNX2X: loads the NIC at attach time
Barret Rhoden [Thu, 26 Feb 2015 17:21:01 +0000 (12:21 -0500)]
BNX2X: loads the NIC at attach time

Other than being the "right way", it'll be necessary to have the edev attached
when we start receiving IRQs.

5 years agoBNX2X: Init of one NIC complete
Barret Rhoden [Tue, 24 Feb 2015 15:52:26 +0000 (10:52 -0500)]
BNX2X: Init of one NIC complete

The second one freezes the machine at:

bnx2x:[bnx2x_fw_command:3013()]wrote command (20010001) to FW MB param 0x00000000
bnx2x:[bnx2x_stats_handle:1434(ether0)]state 0 -> event 2 -> state 0

5 years agoBNX2X: Fixes atomic_cmpxchg spatch
Barret Rhoden [Tue, 24 Feb 2015 17:24:03 +0000 (12:24 -0500)]
BNX2X: Fixes atomic_cmpxchg spatch

The spatch was wrong.  Linux returns the old value on success and appears to
return the current value on failure.  No sense spatching that.

5 years agoBNX2X: limit queues to 2
Barret Rhoden [Mon, 23 Feb 2015 21:24:49 +0000 (16:24 -0500)]
BNX2X: limit queues to 2

Linux does not need to do this.  Something we're doing is wrong still.  If we
run with 8 queues, we get the dreaded MC assert.  With 4 total, we're okay (for

For now, we're limiting to four queues.  I tried looking for other diffs
between Linux and Akaros with 8 queues, but haven't found the problem yet.

But that total includes both functions, so we have only two per controller.

5 years agoBNX2X: poll and enough rx_int to do an sp_event
Barret Rhoden [Mon, 23 Feb 2015 21:11:13 +0000 (16:11 -0500)]
BNX2X: poll and enough rx_int to do an sp_event

Will do the rest of rx_int and tx_int as needed.

For now, we can handle the next events in the init process, but only if
num_queues is 4.  Even though the Linux driver can handle 8.

5 years agoBNX2X: Debug helper for queue setup command
Barret Rhoden [Mon, 23 Feb 2015 15:30:16 +0000 (10:30 -0500)]
BNX2X: Debug helper for queue setup command

Can run this same bit on Linux and see what all we're sending to the

5 years agoBNX2X: MTU conversion
Barret Rhoden [Mon, 23 Feb 2015 15:19:02 +0000 (10:19 -0500)]
BNX2X: MTU conversion

Plan 9's MTU includes the header (e.g. 1514, instead of 1500).  Linux
drivers expect just the payload and not the header, and will add in the
14 whenever it is needed.

There might be issues when plan 9 code accesses maxmtu, now that it's
1500 instead of 1514.  Keep a lookout for Etoobig in etherwrite.  What a

5 years agoBNX2X: IRQs implemented
Barret Rhoden [Thu, 19 Feb 2015 22:10:37 +0000 (17:10 -0500)]
BNX2X: IRQs implemented

IRQs are registered okay, but we were hanging here:

[bnx2x]:[bnx2x_state_wait:285()]waiting for state to become 1
[bnx2x]:[bnx2x_sp_task:5648()]sp task invoked
[bnx2x]:[bnx2x_sp_task:5657()]status 0
[bnx2x]:[bnx2x_sp_task:5658()]setting interrupt_occurred to 0
[bnx2x]:[bnx2x_state_wait:303()]timeout waiting for state 1

The issue is that we should be receiving an FP IRQ at this point, and we
needed to be consistent with whether or not we have CNIC_SUPPORT.  If we
do, then the code needs to reserve an extra MSIX vector in the
pci_devices table for the CNIC.  The actual card will know about it
(since we tell it elsewhere), and then the FP's won't begin until MSIX
vector 2 (the third one).

Also, since we do various hackery, we need to make sure the driver knows
we're using MSIX.  We'll tell it later, based on the flag.

Btw, the current pr_fmt seems a bit obnoxious.  Damned if you do, damned if you

5 years agoBNX2X: spatch atomics
Barret Rhoden [Thu, 19 Feb 2015 21:15:56 +0000 (16:15 -0500)]
BNX2X: spatch atomics

Gotta love the little things, like how the atomic_add()s differ in the order of
the arguments.

Manually uncommented the two functions, of course.

5 years agoBNX2X: nic_load progress
Barret Rhoden [Wed, 18 Feb 2015 23:13:12 +0000 (18:13 -0500)]
BNX2X: nic_load progress

Including vmalloc, gunzip, and others.  Grep XME for issues.

Up to setting up IRQs.

5 years agoBNX2X: loads and checks firmware
Barret Rhoden [Thu, 19 Feb 2015 16:44:01 +0000 (11:44 -0500)]
BNX2X: loads and checks firmware

From KFS.

5 years agoBNX2X: spatch changes for BUG and WARN
Barret Rhoden [Wed, 18 Feb 2015 19:52:28 +0000 (14:52 -0500)]
BNX2X: spatch changes for BUG and WARN

Spatching, vs #defining.  It'll be easier for other Linux code.

One slight pain is that BUG_ON's logic is the reverse of assert.  Not a huge

5 years agoBNX2X: open
Barret Rhoden [Wed, 18 Feb 2015 03:55:58 +0000 (22:55 -0500)]
BNX2X: open

nic_load still panics.

5 years agoBNX2X: initialization
Barret Rhoden [Mon, 16 Feb 2015 21:51:11 +0000 (16:51 -0500)]
BNX2X: initialization

bnx2x_init_one() seems to be called by the PCI code.  Most of the stuff
should work; grep for XME for what's known-busted:
- the MII/MDIO is commented out.  We'll probably need to do that.
- the queues aren't set up yet.  Linux did that when setting up the
  net_device.  We'll see what all we need to do later.

5 years agoBNX2X: timer->alarm
Barret Rhoden [Tue, 17 Feb 2015 23:05:01 +0000 (18:05 -0500)]
BNX2X: timer->alarm

RKM alarm, for now.

5 years agoBNX2X: Spatch dev_addr->ea
Barret Rhoden [Tue, 17 Feb 2015 21:01:37 +0000 (16:01 -0500)]
BNX2X: Spatch dev_addr->ea

Applied manually, due to so much being commented out.

5 years agoBNX2X: 9ns device infrastructure
Barret Rhoden [Thu, 12 Feb 2015 22:05:43 +0000 (17:05 -0500)]
BNX2X: 9ns device infrastructure

Starts to call the Linux init routines.  There's a PCI table parser, which
might end up in akaros_compat.c or something.

Everything is quite hacky.  PNP is called first, which triggers PCI.  PCI does
the discovery (and knows pci_id) and the ctlr/sb alloc.  Then it saves some
things for later (like pci_id).  Later, in reset, the edev is created and
stitched up with the ctlr/sb.  Good times.

5 years agoBNX2X: the nightmare compiles
Barret Rhoden [Thu, 12 Feb 2015 16:16:58 +0000 (11:16 -0500)]
BNX2X: the nightmare compiles

Anything that threw an error or warning of any sort was commented out.  And
then some extra things were probably commented out too.

You'll note that most everything is commented out, though its not all that bad.
Some things might convert easily.

5 years agoBNX2X: fake RCU and socket structs
Barret Rhoden [Wed, 11 Feb 2015 16:18:17 +0000 (11:18 -0500)]
BNX2X: fake RCU and socket structs

Also includes something spatch missed in cmn.c.

5 years agoBNX2X: spatch roundup/rounddown
Barret Rhoden [Wed, 11 Feb 2015 16:06:26 +0000 (11:06 -0500)]
BNX2X: spatch roundup/rounddown

5 years agoBNX2X: brings in cnic_if.h
Barret Rhoden [Wed, 11 Feb 2015 15:34:55 +0000 (10:34 -0500)]
BNX2X: brings in cnic_if.h

We probably don't need the CNIC.  The BSD driver didn't use it, and I've used
the bnx2x driver on linux with CONFIG_CNIC off.  But having the header around
might make things easier.

Copied from linux bc208e0ee0f and spatched.

5 years agoBNX2X: manually removes the PTP code
Barret Rhoden [Tue, 10 Feb 2015 23:01:34 +0000 (18:01 -0500)]
BNX2X: manually removes the PTP code

Peer Time Protocol.  Not particularly interested in supporting it right
now, and there's no kernel support.

5 years agoBNX2X: spatch IRQ handlers
Barret Rhoden [Wed, 11 Feb 2015 02:23:48 +0000 (21:23 -0500)]
BNX2X: spatch IRQ handlers

This doesn't deal with all types of IRQ handlers.  Some return values
indicating that a thread should finish the IRQ.  For these, I don't
transform the output.  I want there to be a compiler error so that
someone manually makes sure the handler is completed.

5 years agoBNX2X: various akaros-compat changes, esp ETH_
Barret Rhoden [Tue, 10 Feb 2015 18:02:18 +0000 (13:02 -0500)]
BNX2X: various akaros-compat changes, esp ETH_

Includes some ethtool headers, PCI stuff, and a few other minor tidbits.

Also, notice that we don't synchronize irqs.