5 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.

5 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.

5 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>
5 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

5 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.

5 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.

5 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:


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.

5 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

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).

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

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

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

5 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.

5 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).

5 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:


5 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.

5 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

5 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

5 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().

5 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

5 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).

5 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

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

5 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

5 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).

5 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

5 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.

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

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

5 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

5 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

5 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

5 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

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

5 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

5 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

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

5 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.

5 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.

5 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

5 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

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

5 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

5 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

5 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

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

5 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.

5 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.

5 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)

5 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!

5 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

5 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

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.

5 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.

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>
5 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>
5 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>
5 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.

5 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.

5 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.

5 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.

5 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.

5 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.

6 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

6 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.

6 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).

6 years agoAttempts to fix uth_disable_notif()
Barret Rhoden [Wed, 19 Nov 2014 00:43:43 +0000 (16:43 -0800)]
Attempts to fix uth_disable_notif()

There were two problems with disabling notifs.  First, using the uthread's TLS
is a bad idea.  The uthread might not have it, and then it's using the vcore's
TLS.  That alone might be okay, since the uthread pins itself to the vcore
(we'd have to do the check after disabling migrations and other shit).

The bigger issue is with locks grabbed in uth context and unlocked in vcore
context.  When we reenable, we would not reenable notifs, nor even adjust the
depth counter.  Vcore context just blows past those checks.  Likewise, uthread
code will never unlock it, since the unlock calls typically happen in the
uthread_yield() callbacks.  We could try and have the vcore code figure out who
was locking and adjust the depth, but that's just a pain in the ass (and
doesn't work well with locks help by both vcore context and uth code (e.g. the
pthread runqueue lock)).

This commit changes three things: uses the uthread struct for the depth, has
vcore code reset the depth during yield, and does some cleanup/debugging.

The rule for uthread code that grabs locks (or otherwise disables notifs) is
that vcore context will reset the disabled depth to 0, and uthread code should
not try to reenable notifs past the yield point.  Vcore code will enable notifs
when it relaunches the uthread.  There might be issues with this, where some
uthread disables notifs, makes some call that yields (or blocks on a syscall!)
and then reenables notifs.  Note that PDR locks count as enable/disable sites.

For cleanup, I don't see why there would not be a current_uthread, and put in
an assert to catch things (for now).

6 years agoIncreases the op backtrace buffer
Barret Rhoden [Tue, 11 Nov 2014 22:42:25 +0000 (14:42 -0800)]
Increases the op backtrace buffer

Our callgraphs are often deeper than 8, which leads to not properly attributing
deep functions to their older ancestors.  The downside is the buffers (on the
stack) are bigger, increasing our chances of running off the stack, and
increasing the overhead of the backtrace.  If the stack is a problem, we can
malloc the buffer or something.

6 years agoFixes IRQ enabling when kthreads unblock
Barret Rhoden [Tue, 11 Nov 2014 21:32:34 +0000 (13:32 -0800)]
Fixes IRQ enabling when kthreads unblock

When kthreads unblocked, IRQs would be disabled, regardless of whether or not
they were on when the thread tried to down a semaphore.  (With the exception of
the sem_down_irqsave, which already managed that).

6 years agocs avoidance
Ron Minnich [Thu, 6 Nov 2014 20:53:25 +0000 (12:53 -0800)]
cs avoidance

if it's a numeric address don't bother with CS.

Does it work? I don't know.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
6 years agoFixes devmnt syscall aborts
Barret Rhoden [Tue, 4 Nov 2014 23:25:09 +0000 (15:25 -0800)]
Fixes devmnt syscall aborts

Aborts are like Eintr.  Other than the one usage of Eintr in mountrpc(), we
could get rid of Eintr.  For now, we'll just treat them both the same way:
don't actually error out, just try to flush whatever you were doing.

6 years agoDon't blast out of mountio on a timeout
Ronald G. Minnich [Tue, 4 Nov 2014 22:13:24 +0000 (22:13 +0000)]
Don't blast out of mountio on a timeout

On timeout, we need to just continue.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
6 years agoFixes multiboot flag check
Barret Rhoden [Tue, 4 Nov 2014 22:11:57 +0000 (14:11 -0800)]
Fixes multiboot flag check

This check was using the wrong flag, as in Ron's 6deacfb0d commit.  The code
should have been using the helper anyway.

6 years agoFix incorrect test for whether multiboot info has a memory map.
Ron Minnich [Mon, 3 Nov 2014 16:50:14 +0000 (08:50 -0800)]
Fix incorrect test for whether multiboot info has a memory map.

It was testing the wrong flag.

Signed-off-by: Ron Minnich <rminnich@gmail.com>
6 years agoTrack program names better for ps
Barret Rhoden [Thu, 16 Oct 2014 19:32:27 +0000 (12:32 -0700)]
Track program names better for ps

Using the file's true name doesn't capture the use of symlinks, used
heavily by busybox.  Alternatively, we could save all the args.

6 years agoLock_test analysis: lock_test.R
Barret Rhoden [Mon, 13 Oct 2014 19:45:13 +0000 (12:45 -0700)]
Lock_test analysis: lock_test.R

R script for parsing the data files outputted from lock_test.

Also fixed a bug with the __mcs_pdro.  When I changed the threadids to
0, that messed up the "guessed" vcoreid, such that someone was -1
(eventual fault when ensuring vc -1 runs).

6 years agouth_disable_notifs() nests
Barret Rhoden [Mon, 13 Oct 2014 04:12:35 +0000 (21:12 -0700)]
uth_disable_notifs() nests

I'm not aware of any uthread context callers that nest these currently,
but if they did, they would be broken.

Of course, one easy way to nest would be to nest spinlocks from uthread

6 years agoFixes bug with EVENT_VCORE_MUST_RUN
Barret Rhoden [Fri, 10 Oct 2014 21:10:00 +0000 (14:10 -0700)]

Spamming list members would succeed for offline vcores, which breaks if
MUST_RUN was set.  The race was that a VC could have been on the online
list, but by the time we messaged it, it was preempted (and it still
can_rcv).  Likewise, checking the bulk-preempt and inactive lists could
be racy as well.

Four bugs found while writing a dissertation.  Not too bad.  =)

6 years agoFixes handle_indirs issue
Barret Rhoden [Fri, 10 Oct 2014 19:07:17 +0000 (12:07 -0700)]
Fixes handle_indirs issue

handle_indirs() can only proceed if the target vcore is guaranteed to
not be online.  VC_PREEMPTED is the commonly used flag for that, with
the added benefit of that flag turning off the first time a VC comes
back online - meaning we can skip handling their messages if its a moot

This change sets PREEMPTED for all cases of change_to_vcore, since the
"I don't plan to return" case needs to have its messages checked

6 years agohandle_events() unconditionally
Barret Rhoden [Fri, 10 Oct 2014 18:38:43 +0000 (11:38 -0700)]
handle_events() unconditionally

If we condition on notif_pending and we don't drain the event queue
completely (due to a handler not returning perhaps), then the next time
we try to handle_events, we would have bailed out - even if the mboxes
weren't empty.

Another concern is that if we handle_events, clear notif_pending, and
then we run a handler that doesn't return, that we someone slip out of
vcore context in the future without checking messages.  Any case
involving a handler that doesn't return should result in a fresh vcore
context starting up, which checks events.  This means that event
handlers cannot pop directly into uthreads.  ev_might_not_return() won't
help you with that, since it covers cases where we handle another vcores
mbox, not our own mbox.

6 years agoAdd test for verifying xmm state is preserved
Kevin Klues [Thu, 9 Oct 2014 17:13:38 +0000 (10:13 -0700)]
Add test for verifying xmm state is preserved

6 years agoFixes bug in cpu_relax_vc()
Barret Rhoden [Fri, 3 Oct 2014 01:09:38 +0000 (18:09 -0700)]
Fixes bug in cpu_relax_vc()

It would never ensure the other vcores run, since spun would be reset on
every invocation.

Note that since it is a TLS variable, it gets reused each time and never
get reset.  So if a spinner calls cpu_relax_vc() 100 times before
grabbing its lock (or whatever), then the next time that vcore relaxes,
it'll start at 100.  Only 900 to go!

I'm okay with this - it's a little easier to deal with than having the
caller pass in the spin variable.

6 years agoAdd TAGS to .gitignore
Ronald G. Minnich [Wed, 8 Oct 2014 01:04:41 +0000 (01:04 +0000)]
Add TAGS to .gitignore

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
6 years agoIfconfig uses the MAC for machine identification
Ronald G. Minnich [Tue, 7 Oct 2014 21:26:06 +0000 (21:26 +0000)]
Ifconfig uses the MAC for machine identification

Keys on MAC address.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Git-fu-d-by: brho
6 years agoAdds script to build bootable USB drives
Barret Rhoden [Tue, 7 Oct 2014 21:00:08 +0000 (14:00 -0700)]
Adds script to build bootable USB drives

Requires extlinux.  See the script for more info.

6 years agoFixes kernel state tracking for 32 bit x86
Barret Rhoden [Tue, 7 Oct 2014 20:57:00 +0000 (13:57 -0700)]
Fixes kernel state tracking for 32 bit x86

In case we ever use that again.

6 years agoIncreases the maximum number of FDs
Barret Rhoden [Tue, 7 Oct 2014 02:29:33 +0000 (19:29 -0700)]
Increases the maximum number of FDs

I didn't bother syncing this with glibc.  We can, if its an issue.  I'd rather
just not use the struct fd_set in userspace.  It's a huge pain in the ass on

6 years agoFixes deadlock on growing the FD set
Barret Rhoden [Tue, 7 Oct 2014 02:01:27 +0000 (19:01 -0700)]
Fixes deadlock on growing the FD set

If we tried to grow beyond the max number of FDs, we'd set n == max and
kmalloc, memset, and memmove without making progress.  The loops would retry.

6 years agoAvoids deadlock in pip
Barret Rhoden [Tue, 7 Oct 2014 01:50:28 +0000 (18:50 -0700)]
Avoids deadlock in pip

If another core has the files lock and is stuck, we'll deadlock the kernel
spinning on the lock.

6 years agoFixes FD set freeing
Barret Rhoden [Mon, 6 Oct 2014 21:21:58 +0000 (14:21 -0700)]
Fixes FD set freeing

If a process is DYING and the number of FDs was greater than the default, we
would free the blobs, but keep pointers to the blobs.  Later, a pip would try
to read those and would be looking at re-alloced, garbage memory.

6 years agoks: monitor command for mucking with the ksched
Barret Rhoden [Mon, 6 Oct 2014 21:20:26 +0000 (14:20 -0700)]
ks: monitor command for mucking with the ksched

The only new functionality is the "sort" command, which will sort the idle core
list from 1..n.  "nc" is a hook to avoid calling kfunc next_core, which is a
minor pain.

6 years agoHelpful program, added by popular request
Barret Rhoden [Thu, 2 Oct 2014 01:49:38 +0000 (18:49 -0700)]
Helpful program, added by popular request

If you want to make your own, use jp2a, cut and paste into vi, and add
the printf(" and \n"); from block mode.

6 years agoPorts lock_test to Linux
Barret Rhoden [Thu, 2 Oct 2014 01:43:47 +0000 (18:43 -0700)]
Ports lock_test to Linux

Build from your AKAROS_ROOT directory with:

$ gcc -O2 -std=gnu99 -fno-stack-protector -g tests/lock_test.c \
  -lpthread -lm -o linux_lock_test

Linux only has the spin and mcs/mcscas available, so the others are
stubs.  It will attempt to pin the worker threads to physical cores
0..n.  If you do your own tasksetting after the program is running, you
can override that.  That might be useful if you want to fake preemption.

The ugliest thing is #including the lock source code in a .h file.
Doing it with measure.c is only slightly less nastry.  Maybe we can get
some linux make targets or something, and put this compat stuff in one

6 years agoUser spinlock speedups
Barret Rhoden [Thu, 2 Oct 2014 01:41:08 +0000 (18:41 -0700)]
User spinlock speedups

Test, then test-and-set avoids everyone writing EBUSY to the cacheline
when it is already locked.  This cuts down on cache line contention.

6 years agoVarious userspace Linux compat hacks
Barret Rhoden [Thu, 2 Oct 2014 00:47:27 +0000 (17:47 -0700)]
Various userspace Linux compat hacks

I'd like to build some of the tests for Linux without a lot of fuss.  We
can do it for pthread_test already.  Lock_test is next.

There are a variety of hacks for compatability all over the place: the
TSC stuff, a OS-independent parts of benchutil (measure.c), and more
coming soon.  If we're going to make microbenchmarks that mostly work on
both, then we should consolidate these hacks a bit.

6 years agolock_test: output results to a file
Barret Rhoden [Wed, 1 Oct 2014 20:45:59 +0000 (13:45 -0700)]
lock_test: output results to a file

Also tracks the number of loops performed.  Once one thread finishes,
the test is done.  On a VM with a small number of loops, some threads
won't perform any loops - in which case you're not really contending for
the lock.

6 years agoigbe: removes the receive buffer pool
Barret Rhoden [Tue, 30 Sep 2014 19:49:24 +0000 (12:49 -0700)]
igbe: removes the receive buffer pool

6 years ago82536: removes receive buffer pools
Barret Rhoden [Tue, 30 Sep 2014 19:24:40 +0000 (12:24 -0700)]
82536: removes receive buffer pools

There weren't enough receive buffers.  If we get a large burst of traffic, all
of the NICs RBs could be pushed into the network stack (TCP conv rqs).  Then
we're unable to receive new packets.  If the app (kweb) doesn't read, we never
receive packets.  Kweb would have all of its threads blocked on a write, and
that write was unable to receive an ACK.

Instead of just increasing the number, or even growing the pool, I just opted
to remove the pools completely.  If we need/want NIC pools in the future, we
can add them back (preferably with a helper subsystem, so not all NICs reinvent
the wheel).

6 years agoSyscall debugging touchups
Barret Rhoden [Tue, 30 Sep 2014 18:51:36 +0000 (11:51 -0700)]
Syscall debugging touchups

Syscall string saving was saving old strings, and the output of arguments was
imited to 32 bits.

6 years agomon_kpfret(): return from a kernel page fault
Barret Rhoden [Tue, 30 Sep 2014 18:41:16 +0000 (11:41 -0700)]
mon_kpfret(): return from a kernel page fault

In the off chance the kernel faults and you want to try to recover, pass kpfret
the HW tf pointer.  It'll try to smp_idle, abandoning the kernel context.  This
means that any locks that were held are still locked, so you might deadlock.

This can't handle a nested fault (like if you fault while trying to run

6 years ago82536: catch null blocks from qbread
Barret Rhoden [Mon, 29 Sep 2014 04:35:18 +0000 (21:35 -0700)]
82536: catch null blocks from qbread

This shouldn't happen, since we don't tear down interfaces or anything
like that.

6 years agoFixes #K open
Barret Rhoden [Mon, 29 Sep 2014 04:27:42 +0000 (21:27 -0700)]
Fixes #K open

You need to process omode with openmode() before doing an equality check
with OREAD/O_RDONLY (which == 0, btw...).

This was breaking the ability to bind #K or bind -b.  bind -a worked.
Similarly, ls \#K failed, but cat \#K worked.  The ls-cat check is the
usual way to detect this stuff (it's come up before).

6 years agoCleaned up some printking
Barret Rhoden [Mon, 29 Sep 2014 04:06:46 +0000 (21:06 -0700)]
Cleaned up some printking

The ifconfig is a bit tricky.  Somewhere we set errno in the kernel,
probably during the various bind internal calls.  It's probably fine,
but my BB echo hacks thinks it is an error.

The kprof extra printk isn't needed since echo now prints errors.

6 years agoBusybox echo prints error messages
Barret Rhoden [Mon, 29 Sep 2014 03:52:04 +0000 (20:52 -0700)]
Busybox echo prints error messages

It was ignoring any errors, depending on which version of echo_main was
being built.  It's a minor pain to detect errors too, due to how glibc
implements fputs, I think.  Clearing and checking errno suffices.

Now, when you echo garbage > /some/9ns/ctlfile, you'll hear about what
went wrong.

If we start building with writev, or whatever, then we may need another

You'll need to patch busybox, etc.

6 years agompstat - accounts for time in CPU states
Barret Rhoden [Mon, 29 Sep 2014 01:32:53 +0000 (18:32 -0700)]
mpstat - accounts for time in CPU states

For the pretty version, cat \#K/mpstat.

If you want to read the data with a program, you probably want
mpstat-raw.  All the lines are fixed size, so you should be able to seek
to a particular offset for a particular CPU.

You can reset the values by echoing reset into either mpstat or

Since the CG cores might be sitting idle, they won't update their state
unless they get an IPI.  By default, when you execute mpstat, it'll send
this IPI.  You can turn that off in the ctl message, which is probably
only useful if there is a program that is polling mpstat-raw.

I haven't implemented the for disabling the rdtsc yet.  I'll do that if
it turns out that there is a noticeable overhead, or maybe if it helps
with debugging.

6 years agoRISC-V broadcast IPI
Barret Rhoden [Mon, 29 Sep 2014 01:30:53 +0000 (18:30 -0700)]
RISC-V broadcast IPI

Needs a look, etc.  The RISC-V port needs a bit of work.