akaros.git
4 years agoFixes pcpu lock tracer
Barret Rhoden [Fri, 30 Jan 2015 02:25:42 +0000 (21:25 -0500)]
Fixes pcpu lock tracer

Core 0 was saying it was ready to trace locks before it allocated the
buffer.  That's probably been broken for a while!

Thanks to Godfrey for his commit, which made me test the lock tracer.

4 years agoFix void* arithmetic bug. Add dassert facility.
Godfrey van der Linden [Thu, 29 Jan 2015 17:17:32 +0000 (09:17 -0800)]
Fix void* arithmetic bug. Add dassert facility.

In C the behaviour of arthmatic on void * pointers is undefined. GCC has
a language extension that equates it with a uint8_t, but other compilers
don't. Change the tr_buf to a unsigned char to define byte arithmatic.

Split the __get_tr_slot into two adding __get_tr_slot_overwrite for the
version that masks the slot down to a limited range.

Add dassert() for assertions that are only optionally compiled in. Used
at the moment to check index is in range in __get_tr_slot.

4 years agoAdds a test for the u16 pool
Barret Rhoden [Thu, 29 Jan 2015 02:38:47 +0000 (21:38 -0500)]
Adds a test for the u16 pool

Misc complaints about the testing framework:

- ASSERT_M only lets you have a string, not a format string.
- put doesn't return, so we have a "loud" test for that.  alternatively,
  we could have put panic, but then we couldn't test it at all.  and i
  don't particularly want it to have a return value.
- ASSERT_M just blindly returns.  we're leaking memory.

4 years agoCleans up smallpool, adds locking
Barret Rhoden [Wed, 28 Jan 2015 18:22:09 +0000 (13:22 -0500)]
Cleans up smallpool, adds locking

I tried various CAS schemes, but they don't work very well.  Using a
history counter, I was able to make get/pop lock-free, but not put/push.
The issue was that the pusher needs to have 'v' written by the time it
decrements, but it can't be sure of its slot when until decrement
succeeds.  It would work with only one pusher, or with an additional
'ready' flag per slot, similar to BCQs.

4 years agoLindent + comments
Barret Rhoden [Tue, 27 Jan 2015 18:03:24 +0000 (13:03 -0500)]
Lindent + comments

We should be able to do something atomically, but it'll require some
rewriting and using a history counter.  Maybe.

4 years agoAdds some programs to busybox's default
Barret Rhoden [Wed, 28 Jan 2015 23:59:39 +0000 (18:59 -0500)]
Adds some programs to busybox's default

Hexdump etc.  All courtesy of Drew.

Rebuild BB for it to take effect.

4 years agoBusybox will rebuild when defconfig changes
Barret Rhoden [Wed, 28 Jan 2015 23:58:34 +0000 (18:58 -0500)]
Busybox will rebuild when defconfig changes

Previously, you'd have to make clean, then make.

4 years agoRemoves debugging code
Barret Rhoden [Tue, 27 Jan 2015 16:27:22 +0000 (11:27 -0500)]
Removes debugging code

Accidentally added in aaa7e62.

4 years agoFor your inspection: small id pool
Ron Minnich [Mon, 26 Jan 2015 23:40:55 +0000 (15:40 -0800)]
For your inspection: small id pool

This is a stack and it's about 30 times faster than the current
tag allocator used in devmnt (yes, 30).

It could be used for any id pool that's less than 64K, including
VPID and the 16-bit tags used in VMID.

I doubt I need to use the first element of the array as a top of
stack, that's a little too cute maybe, but not returning element
0 is a good idea, that is reserved in many situation SUCH AS
vpid and so on.

Can we do some sort of ACAS on the TOS in such a way that it never
increments beyond 0xfffe?

Comments appreciated.

Signed-off-by: Ron Minnich <rminnich@google.com>
4 years agoBusybox build infrastructure (BB)
Barret Rhoden [Fri, 23 Jan 2015 14:37:48 +0000 (09:37 -0500)]
Busybox build infrastructure (BB)

You can now build and install busybox from within the kernel repo.

$ cd tools/apps/busybox
$ make [x86_64 | riscv]  // default x86_64
$ profit

As new patches are added, you'll just need to make.  Busybox is small
enough that I just trash the old one and rebuild whenever there is a
change.  If there is a new CC, you may need to make clean.

4 years agoRemoves KFS symlinks
Barret Rhoden [Fri, 23 Jan 2015 02:08:03 +0000 (21:08 -0500)]
Removes KFS symlinks

They will be installed by a busybox install target shortly.

4 years agoSlightly more useful error() in validname()
Barret Rhoden [Thu, 22 Jan 2015 23:58:01 +0000 (18:58 -0500)]
Slightly more useful error() in validname()

This is popping up with some memory corruptions, and %q doesn't do anything.

4 years agoClean up the debug printing
Ron Minnich [Thu, 22 Jan 2015 01:41:51 +0000 (17:41 -0800)]
Clean up the debug printing

change %ud to %u, add a trailing space so it's easier to read.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
4 years agoRemove a moron error in test/cs.c
Ron Minnich [Thu, 22 Jan 2015 01:20:35 +0000 (17:20 -0800)]
Remove a moron error in test/cs.c

in my anxiety to get better error messages I made an unholy mess
of rwalk and managed to introduce a free bug.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
4 years agoEnable __builtin_clz for all architectures.
Godfrey van der Linden [Tue, 20 Jan 2015 22:16:19 +0000 (14:16 -0800)]
Enable __builtin_clz for all architectures.

According to Andrew Waterman, gcc provides a default implementation that
is efficient for any RTL that does not support support the command
directly.  I suspect that LLVM/clang is similar, though we can worry
about that in the future.

4 years agoRemoves the option ENABLE_MP_TABLES
Barret Rhoden [Tue, 20 Jan 2015 20:50:53 +0000 (15:50 -0500)]
Removes the option ENABLE_MP_TABLES

Everyone should be saying 'Y' at this point, so much so that I don't want to
support the old style.  ENABLE_MP_TABLES was also a catch-all for anything
related to mptables, acpi, msi-x, etc.

4 years agoUse builtin_clz log2 for x86 architectures.
Godfrey van der Linden [Thu, 15 Jan 2015 18:42:34 +0000 (10:42 -0800)]
Use builtin_clz log2 for x86 architectures.

Also fix LOG2_UP which would fail if n > 2^32.  (1 << (uintptr_t) 33) ==
0 unfortunately, the << operator does not promote the one to uint64_t.

Then I booted the kernel using both old and new versions and paniced if
they didn't agree. This code has also been tested using a clang compiler
on x86_64 using the following loop in a standalone app.

for (i = 0; i < 64; i++) {
uintptr_t v = (uintptr_t) 1 << i;
assert(new_log2_up(v) == old_log2_up(v));
assert(new_log2_up(v-1) == old_log2_up(v-1));
assert(new_log2_up(v+1) == old_log2_up(v+1));
assert(new_log2_down(v) == old_log2_down(v));
assert(new_log2_down(v-1) == old_log2_down(v-1));
assert(new_log2_down(v+1) == old_log2_down(v+1));
}

4 years agoFixes busybox perror patch (BB)
Barret Rhoden [Tue, 20 Jan 2015 02:26:47 +0000 (21:26 -0500)]
Fixes busybox perror patch (BB)

The old patch to BB was buggy.  fputs() now sets errno internally in
some cases, which is legal.  I shouldn't have checked errno blindly
without checking the ret of fputs().

You'll need to repatch and build busybox.  The 'easiest' way is to
download the tarball, extract the old echo.c, and reapply the patch.

From the directory containing busybox-1.17.3:

$ wget http://www.busybox.net/downloads/busybox-1.17.3.tar.bz2
$ tar -xjf busybox-1.17.3.tar.bz2 busybox-1.17.3/coreutils/echo.c
$ patch -p1 < $AKAROS_REPO/tools/patches/busybox/bb-echo-perror.patch
$ cd busybox-1.17.3 ; make
$ cp busybox_unstripped $AKAROS_REPO/kern/kfs/bin/busybox

4 years agoFixes O_CLOEXEC
Barret Rhoden [Mon, 19 Jan 2015 23:38:01 +0000 (18:38 -0500)]
Fixes O_CLOEXEC

O_CLOEXEC, the open flag from glibc (sometimes called the mode in 9ns)
was being saved as a struct file f_flag, instead of on the file
descriptor.  Likewise, fcntl() was doing the same.

To deal with the races that O_CLOEXEC was made for (and which make the
fcntl SETFD option arguably useless) we need to set FD_CLOEXEC
atomically when the FD is inserted into the FD table.  This required
work with both VFS and 9ns.

I'm not sure how inferno/9ns actually handled CLOEXEC, since newfd()
doesn't take any flags.

4 years agoFixes kernel argument checking in "m"
Barret Rhoden [Mon, 19 Jan 2015 23:36:07 +0000 (18:36 -0500)]
Fixes kernel argument checking in "m"

Need at least one argument before dereferencing.

Also, debugcmd is pretty handy.

4 years agoFixes "m"
Barret Rhoden [Mon, 19 Jan 2015 22:09:34 +0000 (17:09 -0500)]
Fixes "m"

Need to pass all of the args as one argument to echo, otherwise they
could be sent one at a time to the kernel.  I've had this happen when
calling m from a script.

4 years ago__nlink_t is 64 bits in stat struct, not 32
Kevin Klues [Sat, 17 Jan 2015 18:28:56 +0000 (10:28 -0800)]
__nlink_t is 64 bits in stat struct, not 32

Looking at the changelog, it's been this way since 2000.

From glibc-2.19/Changelog.11
2000-06-16  Jes Sorensen  <jes@linuxcare.com>
    ...
    * sysdeps/unix/sysv/linux/ia64/bits/types.h: Make __ino_t,
    __nlink_t and __blkcnt_t 64 bit to accomodate new kernel stat data
    structure.
    ...

My hunch is that things got reorganized such that previously the
default typedef for __nlink_t was 32 bits, while a linux specific one
was 64 bit.  It appears they have now made the default one 64 bit as
well.

4 years agoUpdate ifconfig for c99 at berkeley
Kevin Klues [Fri, 16 Jan 2015 23:22:35 +0000 (15:22 -0800)]
Update ifconfig for c99 at berkeley

c99 is a 32 core ivybridge machine accessible the same way as c89

4 years agoFixes glibc stage 2 pthread errors (XCC)
Barret Rhoden [Thu, 15 Jan 2015 18:03:13 +0000 (10:03 -0800)]
Fixes glibc stage 2 pthread errors (XCC)

On many, but not all, Akaros installations, the toolchain build would fail in
stage 2 of glibc, during the nss build.

The failure was due to the make system clobbering Parlib's pthread.h with the
one from glibc-2.19/include/pthread.h.  Not all systems would do the install,
which is rather mystifying.  It looks like the build system would see pthread.h
was needed, and then generate dependencies on both ../include/pthread.h and on
$TOOLCHAIN_SYSROOT/usr/include/pthread.h (the latter is Akaros's).  Some
systems would install include/pthread.h into the toolchain sysroot.  Others
would not.

By removing include/pthread.h, the dependency on that file was never created,
and thus never attempted to be installed.

Old dependency info:
$ grep -r pthread.h x86_64-ucb-akaros-glibc-stage2-builddir/
...
x86_64-ucb-akaros-glibc-stage2-builddir/nss/db-init.os.d: ../nscd/nscd.h ../include/pthread.h \
x86_64-ucb-akaros-glibc-stage2-builddir/nss/db-init.os.d: $TOOLCHAIN_INSTALL/x86_64-ucb-akaros/sysroot/usr/include/pthread.h
...

Old dependency info:
$ grep -r pthread.h x86_64-ucb-akaros-glibc-stage2-builddir/
...
x86_64-ucb-akaros-glibc-stage2-builddir/nss/db-init.os.d: $TOOLCHAIN_INSTALL/x86_64-ucb-akaros/sysroot/usr/include/pthread.h
...

You'll need to make clean your toolchain and rebuild.

4 years agoIgnore all cscope files.
Godfrey van der Linden [Wed, 14 Jan 2015 21:36:15 +0000 (13:36 -0800)]
Ignore all cscope files.

4 years agoFixes x86 spinlocks with new gcc
Barret Rhoden [Wed, 14 Jan 2015 21:21:26 +0000 (13:21 -0800)]
Fixes x86 spinlocks with new gcc

Newer versions of GCC screw up our ancient spinlocks.

The issue was that "m" can include (%rax) implicitly, and GCC does not give us
a way to tell it to not use that register.  Previously, putting "eax" in the
clobber list was enough (maybe!) to tell GCC to not mess with it.  But it
really only tells GCC not to use it afterwards.  There is no way to tell it to
not use it during.  And we don't know which register they picked.  The fix is
to use a dummy variable, to force GCC to give us a register to play with.

To make things fun to track down, the location of the KMSG immediate lock in
pcpui mattered for this, since the clobber of rax's lower byte made a
diffference with how this would show up.

If we have any other inline asm with "m" in the input:output, we'll need to
take a look.

For a similar horror story, check out:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58758

Note the answer was basically "don't use inline asm."

4 years agoFixes smp_call_function (again)
Barret Rhoden [Mon, 12 Jan 2015 17:13:45 +0000 (12:13 -0500)]
Fixes smp_call_function (again)

2e856c58 was wrong; past-barret was right.  It's a checklist, so you tick off
items as they are done.  The confusing part when debugging was that the IRQ
handlers were firing, but were not downing the checklist.

The root of the problem was that the SMP_CALL IRQ numbers didn't line up with
the "clever" initialization routine used for the handler wrappers.  A while
back I reorganized the x86 IRQ vectors and moved SMP_CALL0 to 224 from 240.
The initialization didn't change, so the smp_call vectors were still 240.  240
happened to be the timer IRQ, which means an smp_call_function would run on the
timer tick too.  The main thing was that the check for downing the checklist
didn't happen, since it expected 224-228, so the checklist would never clear.
That appeared like the waiting code was wrong, which it was not.

4 years agoFixes waiton_checklist()
Barret Rhoden [Wed, 7 Jan 2015 22:43:33 +0000 (17:43 -0500)]
Fixes waiton_checklist()

Geez, this bug was around since nearly the dawn of time (2009-04-17).

If someone actually did an smp_call with a wait wrapper, they might get lucky
and have core 0 blow through the check before anyone set a bit.

I'd love to get rid of the smp_call_function business, and replace it with
broadcast kernel messages (at least do so internally) or something.  It is a
somewhat cheap version of a broadcast message, albeit with a limited number of
slots.

4 years agonix: slightly better memory allocation
Barret Rhoden [Wed, 7 Jan 2015 19:33:09 +0000 (14:33 -0500)]
nix: slightly better memory allocation

The paddr and size of the nix image is controlled by CONFIG_s.  There's still
only one image for the entire system.

4 years agoget_cont_phys_pages_at()
Barret Rhoden [Wed, 7 Jan 2015 19:25:59 +0000 (14:25 -0500)]
get_cont_phys_pages_at()

Allocates a chunk of physical memory at a particular paddr.  We might have
rules in the future regarding the alloc size and the alignment

4 years agoHelper: nr_pages()
Barret Rhoden [Wed, 7 Jan 2015 19:22:30 +0000 (14:22 -0500)]
Helper: nr_pages()

It felt familiar writing this again in pmap.h.  I named it the same as the mm
helper and the compiler helped me out.  At least I didn't write it with new
bugs this time around.

4 years agonix: allow only one nix and comment cleanup
Barret Rhoden [Wed, 7 Jan 2015 16:19:06 +0000 (11:19 -0500)]
nix: allow only one nix and comment cleanup

We can only handle one nix - enforced on clone attempts.

I've left various comments around for whenever we want to have more than one
nix or stop a nix (short of rebooting).

4 years agoread_exactly_n()
Barret Rhoden [Wed, 7 Jan 2015 16:00:23 +0000 (11:00 -0500)]
read_exactly_n()

Yanked from nix.c.  We aren't using it yet, but looks useful in the future.
Note my comment about clobbering underlying errors with our Eshort.

4 years agonix: Fixes QID2NIX
Barret Rhoden [Wed, 7 Jan 2015 15:53:36 +0000 (10:53 -0500)]
nix: Fixes QID2NIX

Using q.vers was just lucky, since our index was already 0.

4 years agonix: removes debug printing
Barret Rhoden [Wed, 7 Jan 2015 15:36:03 +0000 (10:36 -0500)]
nix: removes debug printing

4 years agonix: Fixes lock and atomic_t initialization
Barret Rhoden [Wed, 7 Jan 2015 15:10:24 +0000 (10:10 -0500)]
nix: Fixes lock and atomic_t initialization

Apparently you can attempt to spinlock_init an atomic_t, since the atomic_t is
a void*.  You'll get a nasty PF though.

4 years agocleanup in response to some good comments.
Ron Minnich [Tue, 6 Jan 2015 23:19:38 +0000 (15:19 -0800)]
cleanup in response to some good comments.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
4 years agoNix work assignments use RKMs
Barret Rhoden [Tue, 6 Jan 2015 21:01:45 +0000 (16:01 -0500)]
Nix work assignments use RKMs

Instead of one RKM to mwait a host on the core, we send RKMs with the specific
assignments to the core.  These cores need to be assigned to particular nixes.

The user-visible change is that each nix (e.g. #t/nix0) needs to reserve the
CPUs it will use.

$ echo reserve COREID|-1 > \#t/nix0/ctl

-1 reserves any core, in case you don't care which gets used.

4 years agoAdds missing include
Barret Rhoden [Tue, 6 Jan 2015 20:59:58 +0000 (15:59 -0500)]
Adds missing include

DECLARE_BITMAP needs it.

4 years agoPorts uses of get_any_idle_core()
Barret Rhoden [Tue, 6 Jan 2015 20:06:56 +0000 (15:06 -0500)]
Ports uses of get_any_idle_core()

ARSCs and NIX use the new way to get a CG core.

4 years agoAdds interfaces to get/put CG cores for the kernel
Barret Rhoden [Tue, 6 Jan 2015 17:55:38 +0000 (12:55 -0500)]
Adds interfaces to get/put CG cores for the kernel

For things like the ARSCs, NIX mode, or whatever else you want.  This takes a
core out of the idle list, meaning MCPs will not receive them.

If a core was idle (unallocated) but provisioned, these interfaces will not
choose those cores.  It would mess up other parts of the ksched.

4 years agoMwait cleanup
Barret Rhoden [Fri, 2 Jan 2015 19:36:01 +0000 (14:36 -0500)]
Mwait cleanup

"rax" isn't the input specifier; it is "a".  That loads void* eax into rax, and
we don't need the movq to rax.

Also, we were leaving the monitor value in rax instead of using an appropriate
hint.  I don't know what passing gibberish does to mwait.  Incidentally,
nothing I pass here matters in qemu - the VM still hogs CPU time.

Finally, any real use of monitor/mwait needs to deal with the race on the
monitored address.  After we monitor, we should check and see if the address
has been changed, similar to how futexes and CAS work.  We'll probably need a
couple helpers and a nice top-level function for this.

4 years agoNIX mode.
Ron Minnich [Fri, 14 Nov 2014 02:22:08 +0000 (18:22 -0800)]
NIX mode.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
4 years agoMonitor interface for debug_addr_pid
Barret Rhoden [Mon, 5 Jan 2015 21:20:18 +0000 (16:20 -0500)]
Monitor interface for debug_addr_pid

db addr PID 0xADDR

It'll print out info for that process's address.  Specifically, if the addr
belongs to a file-backed VMR, it'll print the filename and offset of that
address within the file.

Don't forget you can access the monitor from userspace with the script "m".

$ m db addr 1 0xWHATEVER

4 years agoAdds stub for gethostname (XCC)
Barret Rhoden [Mon, 5 Jan 2015 21:09:29 +0000 (16:09 -0500)]
Adds stub for gethostname (XCC)

One of the changes in glibc from 2.14 to 2.19 was the inclusion of
sysdeps/posix/gethostname.c, which overrides the old misc/gethostname.c.  The
new one calls uname() (from posix/uname.c), which calls gethostname.c.  That
infinite loop eventually runs out off the end of the stack, causing a page
fault in netperf.

In lieu of building in gethostname (which I imagine could be a file in devmisc
or something), we just error out like we did in glibc 2.14.

Copy the new file into glibc-2.19 and rebuild, or just make clean.

4 years agoMore useful debug info for unhandled faults
Barret Rhoden [Fri, 2 Jan 2015 17:00:21 +0000 (12:00 -0500)]
More useful debug info for unhandled faults

It's almost always a PF, and in those cases the VMRs and error interpretation
is very useful.

4 years agoFixes busybox compilation failure
Barret Rhoden [Fri, 2 Jan 2015 16:22:58 +0000 (11:22 -0500)]
Fixes busybox compilation failure

Looks like older busyboxes have trouble with newer glibcs.  I've ported this
patch from:

http://lists.busybox.net/pipermail/busybox/2013-January/078833.html

Apply this patch with p1 in your bb directory.  Incidentally, I didn't need to
do this one one computer.  Perhaps I had old headers sitting around that were
getting included magically.

4 years agoImplements werrstr in glibc (XCC)
Barret Rhoden [Thu, 1 Jan 2015 23:40:42 +0000 (18:40 -0500)]
Implements werrstr in glibc (XCC)

Userspace needs a helper to write errstr.  The kernel's version is
set_errstr().  I left the user's as werrstr, which is the Plan 9 name for the
function.

I put it in glibc, since that manages the errstr code and also uses it (e.g.
openat()).  Finding a place for it was a pain.  Don't try to #include stdio.h
from within errno.c.

Incidentally, the #warning to do this was around a while, but it was a bit of
motivation to get it done (esp as part of the new toolchain).

4 years agoWarning clean up
Barret Rhoden [Wed, 31 Dec 2014 18:02:37 +0000 (13:02 -0500)]
Warning clean up

4 years agoAdds __ALIGN_MASK (XCC)
Barret Rhoden [Wed, 31 Dec 2014 15:51:36 +0000 (10:51 -0500)]
Adds __ALIGN_MASK (XCC)

Helper used in bitmap code.  We could use it in kmalloc_align if we want.  To
keep that option open, I've asserted kmalloc aligns are a power of 2.  The
current code (ROUNDUP) can handle non-powers of 2.

Technically, ros/common.h is a kernel header, but don't worry about it in this
case.

4 years agoFixes barrier() and LOCK_PREFIX
Barret Rhoden [Wed, 31 Dec 2014 04:10:22 +0000 (23:10 -0500)]
Fixes barrier() and LOCK_PREFIX

Linux has barrier(), which is a cmb() on Akaros.  LOCK_PREFIX is just "lock ".
Maybe when compiling for uniprocessors we would #define that to be "" to avoid
the instruction overhead.

4 years agoDisable -Wmaybe-uninitialized for setjmp
Barret Rhoden [Wed, 31 Dec 2014 03:47:24 +0000 (22:47 -0500)]
Disable -Wmaybe-uninitialized for setjmp

Gcc 4.9.2 complains.

Setting bool err = 0 or something doesn't matter btw; the actual complaint is
for an anonymous variable.  The returns twice might be confusing, or maybe that
the compiler can't see the code for slim_setjmp.  The usages of slim_setjmp in
ASM looks fine (immediately tests eax).

4 years ago__always_inline now includes inline
Barret Rhoden [Wed, 31 Dec 2014 03:29:12 +0000 (22:29 -0500)]
__always_inline now includes inline

Newer gcc's complain about always_inline attribs without inline.  See the
comments on this bug for some info:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49614

4 years agoSlightly refactors kthread sleeping
Barret Rhoden [Wed, 31 Dec 2014 03:17:38 +0000 (22:17 -0500)]
Slightly refactors kthread sleeping

This is a little clearer and doesn't need the goto.

4 years agoKthread sleeping uses setjmp
Barret Rhoden [Tue, 30 Dec 2014 21:19:59 +0000 (16:19 -0500)]
Kthread sleeping uses setjmp

The old save_kernel_ctx was doing the same thing as setjmp, but with more
overhead and possible some other issues that were triggering
-Wmaybe-uninitialized.

4 years agoAdds openat() stubs (XCC)
Barret Rhoden [Fri, 26 Dec 2014 22:17:05 +0000 (14:17 -0800)]
Adds openat() stubs (XCC)

Glibc now implements the POSIX/UNIX opendir() with openat().  The kernel
doesn't support openat() yet, but we can still use the interface for absolute
or AT_FDCWD as a wrapper around open().  When we do support it, the utest ought
to pass.

This fixes things like 'ls' and tab completion in busybox (which needs to do an
ls).

4 years ago__ctype_init() every new TLS (XCC)
Barret Rhoden [Tue, 23 Dec 2014 20:48:45 +0000 (12:48 -0800)]
__ctype_init() every new TLS (XCC)

Functions like isspace() look in TLS for a pointer to an array used in the
ctype ops.  If you PF near there, then that pointer might not be set.
__ctype_init() initializes that pointer.

Every TLS needs this done once.  We do it a little more often than necessary
(right before vcore_entry, for example).  Thread0 also had a few issues with
this.  The new init-array business in glibc doesn't call _init (hence the
override of elf-init.c), and our custom init method didn't catch the update to
call __ctype_init().

4 years agoCompile c++ programs with -std=gnu++11 by default
Kevin Klues [Tue, 23 Dec 2014 20:49:21 +0000 (12:49 -0800)]
Compile c++ programs with -std=gnu++11 by default

4 years agoAdd define for _GLIBCXX_NO_IOCTL
Kevin Klues [Tue, 23 Dec 2014 20:46:14 +0000 (12:46 -0800)]
Add define for _GLIBCXX_NO_IOCTL

The implementation of std::streambuf::showmanyc in
libstdc++-v3/src/c++98/basic_file.cc, uses various methods to estimate
on the number of characters available in the associated input sequence.
Using ioctls is one of them.  We don't support ioctls on Akaros, though,
so we resort to one of the other methods (of which reutning 0 is OK).

4 years agoBetter debugging for user faults
Barret Rhoden [Tue, 23 Dec 2014 18:34:57 +0000 (10:34 -0800)]
Better debugging for user faults

Whenever userspace has an unhandled fault, we print out more
information, including the 'physical' location of the faulting
instruction pointer (meaning the relative location in a file-backed
VMR).

For example:

Unhandled SCP trap
HW TRAP frame at 0xffffffffc58777b8 on core 0
  rax  0x00007f7fffbfdc38
  rbx  0x0000400000353dc0
  rcx  0x00000000fbad240c
  rdx  0x0000000000000063
  rbp  0x0000400000121348
  rsi  0x0000000000000000
  rdi  0x0000400000121348
  r8   0x0000000000000000
  r9   0x0000000000000000
  r10  0x0000000000320888
  r11  0x0000400000075990
  r12  0x0000000000000000
  r13  0x0000000000000000
  r14  0x0000000000000000
  r15  0x0000000000000000
  trap 0x0000000e Page Fault
  gsbs 0x0000000000000000
  fsbs 0x0000400000354fc0
  err  0x--------00000004
  rip  0x00004000000e0105
  cs   0x------------0023
  flag 0x0000000000010202
  rsp  0x00007f7fffbfdc20
  ss   0x------------001b
err 0x4, aux 0x00000000000000c7
Addr 0x00004000000e0105 is in libc-2.19.so at offset 0x00000000000df105

4 years agoInstall dummy lparlib and lgcc_eh to /usr/lib
Kevin Klues [Mon, 22 Dec 2014 23:21:15 +0000 (15:21 -0800)]
Install dummy lparlib and lgcc_eh to /usr/lib

Previously we were installing to just /lib, but we are now moving all
libs into /usr/lib, so these dummy one's need to be placed there as
well.

4 years agoFixes user makefiles
Barret Rhoden [Mon, 22 Dec 2014 23:03:48 +0000 (15:03 -0800)]
Fixes user makefiles

The dependency libraries were using the old install location (/lib)
instead of the new one (/usr/lib).

4 years agoAdd new patch to busybox for including a header
Kevin Klues [Wed, 17 Dec 2014 22:54:37 +0000 (14:54 -0800)]
Add new patch to busybox for including a header

4 years agoAdjust alignment for the devtab and linker funcs
Kevin Klues [Wed, 17 Dec 2014 21:59:38 +0000 (13:59 -0800)]
Adjust alignment for the devtab and linker funcs

The new gcc apparently wants us to have 64 bit alignment for the devtab.
We oblige accordingly.  Also changed the alignment for the linker
function sections preemptively.  Not as clear whether we needed to do
this or not, but the change was necessary for the devtab.

4 years agoUpgrade to glibc-2.19
Kevin Klues [Wed, 17 Dec 2014 10:42:57 +0000 (02:42 -0800)]
Upgrade to glibc-2.19

4 years agofill-kfs from XCC_TARGET_LIB, not XCC_TARGET_ROOT
Kevin Klues [Wed, 17 Dec 2014 09:47:15 +0000 (01:47 -0800)]
fill-kfs from XCC_TARGET_LIB, not XCC_TARGET_ROOT

4 years agoOnly set internal_function to "stdcall" on i386
Kevin Klues [Wed, 10 Dec 2014 14:53:46 +0000 (06:53 -0800)]
Only set internal_function to "stdcall" on i386

4 years agoRename patches to -akaros instead of -ros
Kevin Klues [Wed, 3 Dec 2014 14:20:37 +0000 (06:20 -0800)]
Rename patches to -akaros instead of -ros

4 years agoUpgrade to gcc-4.9.2
Kevin Klues [Wed, 3 Dec 2014 14:17:58 +0000 (06:17 -0800)]
Upgrade to gcc-4.9.2

4 years agoNo longer require patch to libgo for akaros
Kevin Klues [Wed, 3 Dec 2014 02:00:04 +0000 (18:00 -0800)]
No longer require patch to libgo for akaros

4 years agoUpgrade to binutils 2.24
Kevin Klues [Wed, 3 Dec 2014 00:36:07 +0000 (16:36 -0800)]
Upgrade to binutils 2.24

4 years agoOnly one way of building the XCC now
Kevin Klues [Tue, 2 Dec 2014 22:10:37 +0000 (14:10 -0800)]
Only one way of building the XCC now

4 years agoBackport XCC makefile to match crosstools build
Kevin Klues [Tue, 2 Dec 2014 22:01:10 +0000 (14:01 -0800)]
Backport XCC makefile to match crosstools build

4 years agoAdd working crosstools config
Kevin Klues [Wed, 19 Nov 2014 02:41:30 +0000 (18:41 -0800)]
Add working crosstools config

4 years agoCommit generated file to remove error/warning
Kevin Klues [Tue, 11 Nov 2014 22:00:39 +0000 (14:00 -0800)]
Commit generated file to remove error/warning

This file eventually gets generated and the CXX build process completes,
but during the build we see a bunch of errors because it gets generated
too late (or something).  Its all black magic in the corss compiler
build....  We should probably revisit this at some point though.

4 years agoFigure out where to install-libs
Kevin Klues [Tue, 11 Nov 2014 19:38:38 +0000 (11:38 -0800)]
Figure out where to install-libs

Working towards getting crosstools working to build our cross compiler,
they use the sysroot-style installation.  We need to install our libs in
a different place depending on which style we are using.

4 years agoMake the CXX be called ucb-akaros
Kevin Klues [Wed, 5 Nov 2014 00:35:23 +0000 (16:35 -0800)]
Make the CXX be called ucb-akaros

4 years agoUpdate CROSS_COMPILE for ros->akaros
Kevin Klues [Fri, 17 Oct 2014 06:16:14 +0000 (23:16 -0700)]
Update CROSS_COMPILE for ros->akaros

4 years agoUpdate patches for ros->akaros
Kevin Klues [Fri, 17 Oct 2014 06:15:56 +0000 (23:15 -0700)]
Update patches for ros->akaros

4 years agoUpdate the Makefile renaming ros->akaros
Kevin Klues [Fri, 17 Oct 2014 05:27:43 +0000 (22:27 -0700)]
Update the Makefile renaming ros->akaros

4 years agoMigrate glibc stuff to 'akaros' as well
Kevin Klues [Fri, 17 Oct 2014 05:21:52 +0000 (22:21 -0700)]
Migrate glibc stuff to 'akaros' as well

4 years agoRename all relevant stuff in gcc to akaros
Kevin Klues [Fri, 17 Oct 2014 03:12:23 +0000 (20:12 -0700)]
Rename all relevant stuff in gcc to akaros

This is the first step in migrating our cross compiler over to cross
tools.

For default compiler defines, I left __ros__ and friends in there for
the moment.  We should probably phase this out over time.

4 years agoFix icmp reception with CONFIG_BLOCK_EXTRAS
Andrew Gallatin [Fri, 19 Dec 2014 14:31:06 +0000 (06:31 -0800)]
Fix icmp reception with CONFIG_BLOCK_EXTRAS

When block extras are used by a NIC driver, the icmp input
path needs to pull up the headers it intends to access, else
it will just read garbage.

This fixes a problem with large pings failing on an out-of-tree
NIC driver with CONFIG_BLOCK_EXTRAS enabled.

4 years agoSemaphore blocking optracer
Barret Rhoden [Wed, 10 Dec 2014 06:52:34 +0000 (22:52 -0800)]
Semaphore blocking optracer

Generates an oprof backtrace whenever a semaphore is downed and will
likely block.  There's a slight chance it won't block and a trace will
still be taken.

To enable tracing, you need to:

$ echo opstart > /prof/kpctl

It is not necessary (or maybe even desirable) to run the optimer sampler
at the same time.

4 years agoPer-cpu timer control for oprofile sampling
Barret Rhoden [Wed, 10 Dec 2014 06:44:37 +0000 (22:44 -0800)]
Per-cpu timer control for oprofile sampling

To use oprof now, you need to set the timer, then enable the profiling.
If/when we add other tracers that can be turned on and off, we'll
continue to use this model: set the collection of things to trace, then
start them all at once.

If you don't have the timers turned on, but you run opstart, other
traces, such as TRACE_ME and whatnot (like perhaps writing traces from
userspace via kpoprofile) will still be collected.

I don't have a control for various TRACE_MEs yet.  Maybe we can add one
(like printx).

Some examples:

To turn on the timer on core 0.  This turns on an alarm/IRQ:

$ echo optimer 0 on > /prof/kpctl

Then start the actual profiling/collection:

$ echo opstart > /prof/kpctl

To stop collecting:

$ echo opstop > /prof/kpctl

To turn off all the timers:

$ echo optimer all off > /prof/kpctl

Oh, and you can adjust the timer period if you like.  Default is 1ms.

$ echo optimer period 1000 > /prof/kpctl (period is in usec)

4 years agoKernel alarm helpers
Barret Rhoden [Wed, 10 Dec 2014 06:24:04 +0000 (22:24 -0800)]
Kernel alarm helpers

Reset and unset are idempotent, making them much more useful than just
set_alarm.  I might get rid of set_alarm and just have them all be reset
or something.

And if there's an ABS version, you probably want a REL version too.

And the __ locked versions are for use in IRQ handlers (though not for
RKM handlers).  Be careful!

4 years agoHelper program 'm'
Barret Rhoden [Wed, 10 Dec 2014 06:16:58 +0000 (22:16 -0800)]
Helper program 'm'

Accesses the monitor from userspace, via Ron's #Z.

/ $ m kfunc whatever
/ $ m help
/ $ m nanwan

4 years agoClunky adaptive mutexes
Barret Rhoden [Tue, 9 Dec 2014 23:04:13 +0000 (15:04 -0800)]
Clunky adaptive mutexes

Semaphores will spin a bit before sleeping.  The amount of time is up to you
(CONFIG).

Note that you can't always profile the time spent spinning, since we can't
enable IRQs blindly in sem_down().  Even if we still have IRQs disabled when we
trydown(), we'd still deadlock since CVs are implemented with semaphores.

On a similar note, CVs and thus rendezes are implemented under the hood with
semaphores.  It's not clear to me that spinning is the right approach here.

Additionally, Akaros is a non-preemptive kernel, in that kernel code won't be
preempted for other routine kernel code.  If a sem is upped in a routine kernel
message (RKM), then spinning will be harmful if the unblocking RKM is sent to
the spinning core.

4 years agoImplement ctl command for ktest
Ronald G. Minnich [Wed, 10 Dec 2014 01:05:03 +0000 (01:05 +0000)]
Implement ctl command for ktest

echo ktest > '#Z/monctl'
will run any ktests that are built in.
See Documentation/testing.txt

A note on the files:
read monctl will get you all valid commands
write monctl will pass a command and args to monctl,
which are then interpreted and then call functions directly, with
none, some, or all the args depending on what the function is.

read mondata, right now, gets bupkus
write mondata converts the string into an argv[] array and calls
a function called onecmd directly. onecmd runs one monitor command.
Output appears on the console, not in mondata as we might like.

So,
write (e.g. ktest) to monctl -> interpretation -> (e.g.) run_registered_ktest_suites

write to mondata -> convert to argv[] -> onecmd -> command[argv[0]]

So 'mondata' can be read as 'uninterpreted'. This may change if it
is clearly inconvenient.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
4 years agoRemove historical file.
Ronald G. Minnich [Wed, 10 Dec 2014 00:24:18 +0000 (00:24 +0000)]
Remove historical file.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
4 years agoAdd a regression device.
Ronald G. Minnich [Tue, 9 Dec 2014 22:20:12 +0000 (22:20 +0000)]
Add a regression device.

The regression device is used for regression tests. It is '#Z'
and provides mondata and monctl.

monctl is currently not useful.

mondata on the write side takes monitor commands.

Currently on the read side it returns nothing, but soon
it will return the output of the monitor for that command.

Sample usage:
/ $ echo ps > '#Z/mondata'
     PID Name                 State      Parent
-------------------------------------------------
       1 busybox              WAITING         0
       2 echo                 RUNNING_S       1

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
4 years agovcore_idle(): halts a core
Barret Rhoden [Tue, 2 Dec 2014 22:49:21 +0000 (14:49 -0800)]
vcore_idle(): halts a core

MCPs can halt their cores, waiting on an interrupt.  An event sent to an
event queue with EVENT_IPI is sufficient to wake a vcore.  Other IRQs or
races can result in wakeups, either from a fresh vcore context or by
having vcore_idle() return.

4 years agoHelper, check for the existence of local RKMS
Barret Rhoden [Tue, 2 Dec 2014 22:43:03 +0000 (14:43 -0800)]
Helper, check for the existence of local RKMS

For the local core only.

4 years agoFixes loopback checksums
Barret Rhoden [Wed, 26 Nov 2014 00:14:15 +0000 (16:14 -0800)]
Fixes loopback checksums

The packet checksum finalization wasn't being performed for loopbacks,
preventing us from making any loopback connections.

4 years agoUpdates get_html
Barret Rhoden [Wed, 26 Nov 2014 00:11:35 +0000 (16:11 -0800)]
Updates get_html

Can handle non-port-80 ports and will request a connection close after
the one request.

4 years agoBCQ touch-ups (XCC)
Barret Rhoden [Thu, 23 Oct 2014 19:42:43 +0000 (12:42 -0700)]
BCQ touch-ups (XCC)

Weren't memsetting the entire structure, and I wasted an hour or so
debugging a BCQ with a non-power-of-2 number of elements.

Reinstall your kernel headers.

4 years agoHelper program: notify
Barret Rhoden [Thu, 23 Oct 2014 00:50:24 +0000 (17:50 -0700)]
Helper program: notify

Sends an event to a process.  You must control the process to be able to
send an event (everyone controls everything, for the most part), and the
process must have an event handler registered.  Similar to 'kill.'

This is similar to the kernel monitor command 'notify', except this has
payloads and that can bypass the event registration table.

4 years agos141 has been decommisioned. Development on a8 now
Kevin Klues [Tue, 25 Nov 2014 23:58:39 +0000 (15:58 -0800)]
s141 has been decommisioned. Development on a8 now

4 years agoFixes user makefiles
Barret Rhoden [Tue, 25 Nov 2014 23:35:39 +0000 (15:35 -0800)]
Fixes user makefiles

Previously, we had the library linking depend on a changed dependency.  That's
not enough if a header (like uthread.h) changes.  So the .o file creation needs
to depend on the headers, in some manner.  In lieu of depending directly on the
headers, we depend on the lib, which we know depends on the headers.

Additionally, the install target was triggering all the time, which kept
recopying (and updating the timestamp on) the installed libs.

4 years agoUser libraries depend on their dependencies .a's
Barret Rhoden [Wed, 19 Nov 2014 02:31:36 +0000 (18:31 -0800)]
User libraries depend on their dependencies .a's

The previous commit exposed an issue where libraries would not rebuild if their
dependency was newer.  The old style just made sure the dependencies rebuilt
first, but not that the libraries would actually rebuild.  Their linking needs
to depend on the dependencies output archive (e.g. libparlib.a).