7 years agoUpdate cross compiler instructions to build for i686
Kevin Klues [Sat, 22 Jun 2013 00:52:54 +0000 (17:52 -0700)]
Update cross compiler instructions to build for i686

7 years agoExports CFLAGS from Makelocal
Barret Rhoden [Fri, 21 Jun 2013 20:52:10 +0000 (13:52 -0700)]
Exports CFLAGS from Makelocal

Otherwise, your user/test CFLAGs won't get propagated to the sub-makes.

7 years agoFixes user debugfmt printfs
Barret Rhoden [Fri, 21 Jun 2013 20:21:03 +0000 (13:21 -0700)]
Fixes user debugfmt printfs

Applies the same va_args printf patch as in the kernel from d5ec386d.

7 years agoMakefile changes to support the new XCC
Barret Rhoden [Fri, 21 Jun 2013 20:03:04 +0000 (13:03 -0700)]
Makefile changes to support the new XCC

The 'which' part of XCC command in the main makefile was complaining if
there was no cross compiler installed during a make clean.

7 years agoClean up some tabs in the Makefile
Ronald G. Minnich [Fri, 21 Jun 2013 18:30:09 +0000 (11:30 -0700)]
Clean up some tabs in the Makefile

It's called whitespace, but first people and now tools seem to
obssess over it. Which is odd, as the whole point of white space
is that it doesn't matter. Whatever. Emacs whines, let's make
Emacs happy :-)

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
7 years agoAdd "first draft" glibc support for x86_64 xcc (XCC)
Kevin Klues [Fri, 21 Jun 2013 17:50:24 +0000 (10:50 -0700)]
Add "first draft" glibc support for x86_64 xcc (XCC)

Need to actually make things work for this xcc, but at least everything is

7 years agoFix search order for sysnames dirs for ros
Kevin Klues [Fri, 21 Jun 2013 17:43:35 +0000 (10:43 -0700)]
Fix search order for sysnames dirs for ros

This is fixed in a "hacky" way, but the problem lies in the fact that the
current configure script assumes that all OSs have at least one base OS (which
is true for the OSs in the main tree). Since the ROS sysdeps dir sits at the
top of the sysdeps directory hierarchy, the sysnames order is calculated
improperly because it sees an "empty" base name as a valid basename and ends up
including architecture specific folders for that empty base name before OS
specific sysdeps, which breaks things if those are actually directories that
should exist in the sysnames search path, albeit further down the search path,
not at the beginning.

e.g., without this fix, we get our sysnames search path as:
sysdeps/x86_64/elf sysdeps/x86_64 sysdeps/ros/x86_64 sysdeps/ros \
sysdeps/x86_64/elf sysdeps/x86_64

Notice how "sysdeps/x86_64/*" appearis twice? Thats because the first time around
they are included as: "sysdeps/x86_64/<base_os>", where base_os is the empty
string. Not good.  Thus this hacky workaround.

7 years agoGCC modifications for x86_64 xcc (XCC)
Kevin Klues [Fri, 21 Jun 2013 17:42:39 +0000 (10:42 -0700)]
GCC modifications for x86_64 xcc (XCC)

7 years agoBinutils patch for x86_64 xcc (XCC)
Kevin Klues [Fri, 21 Jun 2013 17:41:02 +0000 (10:41 -0700)]
Binutils patch for x86_64 xcc (XCC)

7 years agoModify Makefiles to prepare for x86_64 cross compiler (XCC)
Kevin Klues [Fri, 21 Jun 2013 17:39:52 +0000 (10:39 -0700)]
Modify Makefiles to prepare for x86_64 cross compiler (XCC)

7 years agoRemove superfluous files (XCC)
Kevin Klues [Fri, 21 Jun 2013 17:38:01 +0000 (10:38 -0700)]
Remove superfluous files (XCC)

7 years agox86: objdump 64 bit kernel properly
Barret Rhoden [Thu, 13 Jun 2013 05:31:29 +0000 (22:31 -0700)]
x86: objdump 64 bit kernel properly

The kernel image's format is a 32 bit elf to trick grub into loading it.
This also tricks objdump into interpreting the asm as if it was 32 bit.
The -M tells objdump what the real format is.

Incidentally, now that I can see the asm, I can see the compiler does
generate xmm code in some places, and we do in fact need the extra

7 years agoSplits x86 into 32 and 64 bit (XCC)
Barret Rhoden [Wed, 12 Jun 2013 00:38:00 +0000 (17:38 -0700)]
Splits x86 into 32 and 64 bit (XCC)

No real change in functionality, just separating out the bit-specific items
within the arch directory and build process.

This builds and links in 64 bit mode, but doesn't actually do anything (like
jump into longmode, etc).

7 years agoAdjusts printfmt's va_list code for amd64
Barret Rhoden [Mon, 10 Jun 2013 00:35:23 +0000 (17:35 -0700)]
Adjusts printfmt's va_list code for amd64

We can't pass a pointer to a va_list on amd64.  There is a mismatch
between a va_list** and a va_list*[1].

We also don't want to use va_copy, since we want the original va_list to
be modified by getint().

For more info:

7 years agoAdds 64 bit option
Barret Rhoden [Sat, 8 Jun 2013 00:25:37 +0000 (17:25 -0700)]
Adds 64 bit option

Had to move the CROSS_COMPILE detection section to after including auto.conf,
so that we get up-to-date values for it.  Otherwise, when switching bitness, we
could get the same cross compiler as the previous run.

This also gets rid of the old $(error) when we can't find the cross compiler.
Instead, we detect it when we bulid.  The clean targets shouldn't rely on those
XCC related values anyways, but we'll see.

This also auto-includes common.h (and also ros/common.h) into every kernel

7 years agoFixes makefile bug
Barret Rhoden [Fri, 7 Jun 2013 21:50:19 +0000 (14:50 -0700)]
Fixes makefile bug

Need to optionally include the arch makefile in case we are making a clean

7 years agoCleanup the fill-kfs make target so usable by all
Kevin Klues [Fri, 7 Jun 2013 21:49:44 +0000 (14:49 -0700)]
Cleanup the fill-kfs make target so usable by all

Properly makes sure that all stuff is cleanup and that calling fill-kfs works
properly even if you change architectures between builds. It also only really
copies stuff over if it has to (via cpu -u).
Closes #001

7 years agoChanges ARCH i686 -> x86 (XCC)
Barret Rhoden [Fri, 7 Jun 2013 21:40:38 +0000 (14:40 -0700)]
Changes ARCH i686 -> x86 (XCC)

Remove the installation XCC content, and rebuild your cross compiler.

7 years agoChanges XCC_ROOT->XCC_TARGET_ROOT
Barret Rhoden [Fri, 7 Jun 2013 20:39:24 +0000 (13:39 -0700)]

And makes it not depend on $ARCH.

7 years agoRemoves sparc; it's hard to believe (XCC)
Barret Rhoden [Fri, 7 Jun 2013 00:30:58 +0000 (17:30 -0700)]
Removes sparc; it's hard to believe (XCC)

Rebuild the cross-compiler, if you want to help check for bugs.

7 years agoRemoves c3po
Barret Rhoden [Thu, 6 Jun 2013 21:23:33 +0000 (14:23 -0700)]
Removes c3po

Anything c3po-specific (and not uthread-specific) can be reintroduced later as
a specific 2LS that inherits from uthreads, instead of being built on vcores.

7 years agoCross compiler is now set by the arch
Barret Rhoden [Thu, 6 Jun 2013 21:19:25 +0000 (14:19 -0700)]
Cross compiler is now set by the arch

Also removes old -I path, which probably hasn't been used since before the

7 years agoMoves network drivers out of arch code
Barret Rhoden [Thu, 6 Jun 2013 18:37:10 +0000 (11:37 -0700)]
Moves network drivers out of arch code

In addition to simplifying arch code, this is an example of how to use
Kbuild/Kconfig's hierarchy.

7 years agoNetwork drivers are built based on CONFIGs
Barret Rhoden [Thu, 6 Jun 2013 01:14:09 +0000 (18:14 -0700)]
Network drivers are built based on CONFIGs

Also realigns the obj-X entries in Kbuild so we have room for most CONFIG_FOO

7 years agoUpdated GETTING_STARTED and corresponsing scripts
Kevin Klues [Thu, 6 Jun 2013 01:53:14 +0000 (18:53 -0700)]
Updated GETTING_STARTED and corresponsing scripts

Done as a result of walking through the entire installation procedure from

7 years agoPatches objdump (XCC)
Barret Rhoden [Mon, 3 Jun 2013 16:33:10 +0000 (09:33 -0700)]
Patches objdump (XCC)

Backports an objdump patch, allowing it to be called with -S from a
Makefile that reincludes one of its parts (such as auto.conf).

Rebuild binutils (rm the builddir, config file, and binutils-2.21.1/
directory, then remake).

7 years agoKernel configuration uses Kconfig
Barret Rhoden [Mon, 3 Jun 2013 07:30:54 +0000 (00:30 -0700)]
Kernel configuration uses Kconfig

To get started, $ make ARCH=<your_arch> defconfig.
To change things, $ make [config | menuconfig].

Rebuild the kernel and test applications.

7 years agoModified the build system to use Kconfig
Barret Rhoden [Sat, 1 Jun 2013 18:34:51 +0000 (11:34 -0700)]
Modified the build system to use Kconfig

Once we have entries in the Kconfig, the build system will pass any
CONFIG_FOO=y into the C files as #define CONFIG_FOO 1.  Whenever any
config variable changes, any file using that #define will be rebuilt.

Also, we support the silentoldconfig recursive target, which detects
changed .config files and regenerates the kconfig outputs, so that
kbuild will detect the changes.

The downside to the silent rebuild of auto.conf is that it exposed some
bug in objdump where we can't use a -S when we also updated and included
auto.conf.  That was a pain to figure out.  If you really want -S, you
can do it, so long as you don't rely on the silentoldconfig recursive
call.  You can do something like:

$ touch .config
$ make silentoldconfig
$ make (with -S in your objdump args)

7 years agoUpdates Kconfig
Barret Rhoden [Fri, 31 May 2013 19:08:05 +0000 (12:08 -0700)]
Updates Kconfig

The older version was missing a few things, like silentoldconfig.
Probably due to starting with that version from Aug 2011.

7 years agoReplaces all __CONFIG_*__ with CONFIG_*
Barret Rhoden [Fri, 31 May 2013 17:26:44 +0000 (10:26 -0700)]
Replaces all __CONFIG_*__ with CONFIG_*

For those curious:

$ git grep --color=never --name-only '__CONFIG.*__' | \
  xargs sed -i 's/__\(CONFIG.*\)__/\1/g'

Also, SEQLOCK debugging was never on in the first place (had one _
instead of two __).

7 years agoFixes CPIO creation for non-i386 machines
Barret Rhoden [Fri, 31 May 2013 04:20:52 +0000 (21:20 -0700)]
Fixes CPIO creation for non-i386 machines

Need to use the cross-compiler's utils, not the local machine.

7 years agoBuild system overhauled to use Kbuild (XCC)
Barret Rhoden [Fri, 31 May 2013 03:51:43 +0000 (20:51 -0700)]
Build system overhauled to use Kbuild (XCC)

The kernel uses Kbuild, and the old userspace targets were reworked to
fit with the new system.  They are still fairly similar to their old

Users will need to set up an ARCH and config before doing anything,
including building the cross compiler.  Do something like this:

$ make ARCH=i686 config

I cleaned out a bit of old cruft (and some bugs) in the userspace
targets, though a lot of it can do with a rewrite.

Being a fairly substantial change, you're encouraged to rebuild
everything, including the cross-compiler, to make sure there aren't any

7 years agoInitial Kbuild / Kconfig commit
Barret Rhoden [Wed, 29 May 2013 06:57:52 +0000 (23:57 -0700)]
Initial Kbuild / Kconfig commit

This is just the contents of git://github.com/lacombar/kconfig.git,
which was made back in Aug 2011.  It should be a slimmed down version of
the Kbuild essentials.

The one modification I made was to move Makefile -> Makefil-KB for now.

In case we ever update it, I'll keep my changes in a separate commit.

7 years agox86: linker script uses sections, not names
Barret Rhoden [Tue, 28 May 2013 22:02:25 +0000 (15:02 -0700)]
x86: linker script uses sections, not names

It's a bit cleaner, and I'll need this for the upcoming Kbuild patches.

As a side note, the boot section is three pages.  One for the code, and
one for the page table, but also one for the GDT data.  I'd like to
include that in the same page as the code, but I guess the linker
doesn't like that.  I guess we could ultimately free up those three
pages once we've fully booted, if we're hurting for 12KB.

7 years agoFixes gcc stage 1 build (XCC)
Barret Rhoden [Thu, 30 May 2013 19:20:56 +0000 (12:20 -0700)]
Fixes gcc stage 1 build (XCC)

We were ignoring stage1 errors, since it had made it far enough to
build glibc.  This hid other issues, like with commit ee027b (texinfo).

The temporary solution to fake libgcc_eh.a isn't much better, but at
least it doesn't hide errors.  AFAIK, stage 1 doesn't build libgcc_eh:

Other cross-compile setups will install glibc headers first; it appears
that we're doing the cheap 'shortcut' method:

Rebuild your cross compiler.  Remove the installation directories first,
just to be sure.

7 years agoReverts -lm error (XCC)
Barret Rhoden [Thu, 30 May 2013 05:56:31 +0000 (22:56 -0700)]
Reverts -lm error (XCC)

This fixes the change from 6f3a1535f7, where all applications linked
with -lm.  In lieu of libm, parlib won't use any math, and whatever
utilities I come up with will just get dumped in benchutil.

The problem was that the cross-compiler can't bootstrap itself if there
was not an existing installation with -lm.  It would work only after
everything was installed, and it took a reinstall with no existing
toolchain to detect it.

The make process for benchutil was just a copy of parlib's.  We probably
ought to take a better look at all of userspace's makes, including where
we drop files in the toolchain directories.

If you have compilation issues, make clean and rm your toolchain

7 years agoFixes XCC texinfo dependency
Barret Rhoden [Thu, 30 May 2013 01:30:20 +0000 (18:30 -0700)]
Fixes XCC texinfo dependency

Gcc stage 1 also needed the change.  This was hard to see since the
build keeps going if stage 1 errors out.  You'd only notice it on a
fresh install.

7 years agox86: use a flat segmentation model
Barret Rhoden [Mon, 27 May 2013 22:39:04 +0000 (15:39 -0700)]
x86: use a flat segmentation model

This no longer uses the -KERNBASE segmentation model to fake the mapping
of KERNBASE -> 0.  Instead, we construct a single page directory with
jumbo entries to use as the KERNBASE mapping (and one for the identity
mapping of 0 -> 0).  Previously, we were using this segmentation through
the early stages of kern/src/init.c.

We also link the bootstrap code for its original location in unpaged
memory, getting rid of the confusing RELOC business.

Finally, this assumes the ability to support jumbo pages.  Previously,
the kernel would just panic during start up.  Now, those ancient x86
machines will probably just reboot.  (page fault on the second level
page table with no idt).

7 years agoReplaces %08p with %p
Barret Rhoden [Mon, 27 May 2013 18:21:53 +0000 (11:21 -0700)]
Replaces %08p with %p

I also changed %ps to %x when dealing with ints (flag vars).  In
general, I still use %p on things that techincally aren't pointers (like

7 years agoAutomatically zero-pads %p
Barret Rhoden [Mon, 27 May 2013 18:20:30 +0000 (11:20 -0700)]
Automatically zero-pads %p

I tend to use this as a "print a 0x, zero pad out to sizeof void* bits,
and print in hex".  This change will get rid of the need for me to %08,
and will adjust to %016 for 64 bit pointers.

7 years agoLocking infrastructure helpers
Barret Rhoden [Sat, 25 May 2013 22:05:07 +0000 (15:05 -0700)]
Locking infrastructure helpers

This stuff was just used when testing preemption scenarios.  Ideally,
all of it would be in its own C program.  Check out the TODOs at the top
of lockprov.sh for details.

7 years agoReworks MCS-PDR locks to avoid preempt storms
Barret Rhoden [Sat, 25 May 2013 21:55:56 +0000 (14:55 -0700)]
Reworks MCS-PDR locks to avoid preempt storms

The old style would aggressively switch to its pred, which made it
extremely unlikely to ever have a vcore outside the MCS chain recover
one of the vcores in the chain.  This means that we would always have a
vcore in the chain that was preempted, leading to at least one syscall
per lock acquisition.  This causes a massive amount of
preemption/change-tos that last until all vcores are given back.

The new style tries to restart the lockholder, instead of pred, only
relying on pred when there is no other way out.  This style recovers
quickly from a preemption, even if the vcores are never given back.

While it might be a little slower than the old PDR locks, it is
significantly safer, and is now the default.

The old style PDR locks are now called mcs_pdro_locks (o for

Note there are a few optimizations that the first version of PDR locks
didn't have that were important.  (First version being the one from over
a year ago).  The lockholder handoff is handed off when we unlock our
qnode->next, which saves a lot on cache line contention.  We use the
qnodes address for pointer arithmetic to determine vcoreid.  And we
properly memalign the qnode storage, ensuring cache line alignment.

As far as cache lines go, some prefetching ruins our "independent" cache
lines.  For now, I turn off things like Adjacent Cacheline Prefetching,
or whatever it's called these days.  Would be nice if we had an
instruction that explicitly didn't trigger a prefetch on a load or

7 years agoUCQs use spin-pdr instead of mcs-pdr locks
Barret Rhoden [Sat, 25 May 2013 19:06:11 +0000 (12:06 -0700)]
UCQs use spin-pdr instead of mcs-pdr locks

7 years agoFixes bug with gcc 4.8 (XCC)
Barret Rhoden [Sat, 25 May 2013 16:46:19 +0000 (09:46 -0700)]
Fixes bug with gcc 4.8 (XCC)

Gcc 4.8 can't build 4.6.3 without this patch.  Check out:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54638 for more info.  This
commit is just the backport of the 4.6.4 patch, put in the -ros
directory (instead of an actual .patch).

Rebuild gcc fully.  Make clean, if you are unsure of what to do.

7 years agoForces all applications to link with -lm (XCC)
Barret Rhoden [Sat, 25 May 2013 16:40:37 +0000 (09:40 -0700)]
Forces all applications to link with -lm (XCC)

Since parlib's measure has math functions in it, anyone linking against
parlib will need -lm.  Since we're forcing -lparlib, we might as well do
-lm too.  The alternative would be to not allow math functions in
parlib.  While I can get by with that for now (move measure somewhere
else or rewrite sqrt()), I can imagine us using math in parlib in the

If it becomes a big deal, we can revert this.  Though libm.so is less
than 10% of the size of libc.so (660K vs 7.5M).

Rebuild gcc fully.  Make clean, if you are unsure of what to do.

7 years agoEnsure multiboot is in the beginning of .text
Barret Rhoden [Fri, 24 May 2013 22:11:54 +0000 (15:11 -0700)]
Ensure multiboot is in the beginning of .text

The multiboot header needs to be in the first 8K.  It is currently,
since we placed it in the beginning of entry.S, and that is the first
thing passed to ld.  This change ensures it will always remain in the
beginning (regardless of future changes or ld tricks).

7 years agoMinor change to user measurements
Barret Rhoden [Mon, 13 May 2013 02:44:17 +0000 (19:44 -0700)]
Minor change to user measurements

This allows the throughput to handle a break in the samples.  This is
useful if you only want to report some samples.  For example, you can
set a timestamp field bool valid = (num_vcores() == max_vcores()) to
only record samples that happen when we have all the vcores.

7 years agoAdds lock_test
Barret Rhoden [Fri, 10 May 2013 01:56:55 +0000 (18:56 -0700)]
Adds lock_test

Microbenchmark for testing different lock types.  If you want to preempt
it, run it via $ ash lockprov.sh.

For info:
$ lock_test --help

For locking discussion, check out the comments at the top of lock_test.

7 years agoLibrary for measurement statistics
Barret Rhoden [Fri, 10 May 2013 01:15:40 +0000 (18:15 -0700)]
Library for measurement statistics

Contains some functions I use a lot in benchmarking.  Don't rely on the
interfaces too much; I'll change them frequently to suit my needs.

7 years agoAdds ndelay() to parlib
Barret Rhoden [Fri, 10 May 2013 00:54:16 +0000 (17:54 -0700)]
Adds ndelay() to parlib

7 years agoRISCV uses CAS-style MCS-PDR locks
Barret Rhoden [Wed, 8 May 2013 00:44:09 +0000 (17:44 -0700)]
RISCV uses CAS-style MCS-PDR locks

7 years agoMCS-PDR locks take a *qnode
Barret Rhoden [Wed, 8 May 2013 00:11:48 +0000 (17:11 -0700)]
MCS-PDR locks take a *qnode

Futex code can use either spinpdr or mcspdr, up to them.  For the
semaphore code, it was a simpler change to just change the lock style.

7 years agoMCS-PDR locks cache vcoreids
Barret Rhoden [Tue, 7 May 2013 22:25:33 +0000 (15:25 -0700)]
MCS-PDR locks cache vcoreids

We read-in the vcoreid of whoever we may need to spin on before
signalling.  This both cuts down on cache contention (less re-reading of
the pred's qnode to get the vcoreid) and gets rid of the restriction of
having qnode memory be safely accessed, even after unlocking.  Both
changes help with performance.

7 years agoSpeeds up regular MCS locks
Barret Rhoden [Tue, 7 May 2013 18:28:43 +0000 (11:28 -0700)]
Speeds up regular MCS locks

Even when the qnode is allocated on the stack (perhaps especially then),
CL aligning it reduces cache-line contention (false sharing of the CL
with the main thread using its stack).

Also this exposes some lower-level MCS locking functions.

7 years agoprov pokes the ksched after a successful provision
Barret Rhoden [Mon, 6 May 2013 01:49:23 +0000 (18:49 -0700)]
prov pokes the ksched after a successful provision

The ksched will eventually notice, and since provisioning is rare, it
shouldn't matter either way.  However, this is useful for test programs.

This also cleans up the retval work a little.

7 years agosys_poke_ksched() on behalf of other processes
Barret Rhoden [Mon, 6 May 2013 01:42:47 +0000 (18:42 -0700)]
sys_poke_ksched() on behalf of other processes

So something like 'prov' can kick the ksched to make it notice the
changes faster.  It's not a huge deal, since provisions are a
fine-grained choice, but it also doesn't hurt.  And it helps with some
testing code.

No need to rebuild the cross compiler, but you do need to rebuild any
MCP app and all of parlib.

7 years agoRemoves any restrictions on process control
Barret Rhoden [Sun, 5 May 2013 22:59:51 +0000 (15:59 -0700)]
Removes any restrictions on process control

Until we have a real solution, the half-assed "direct parent only" (or
self) control test doesn't really do much.

7 years agoAllow the killing of WAITING processes
Barret Rhoden [Sun, 5 May 2013 22:51:55 +0000 (15:51 -0700)]
Allow the killing of WAITING processes

Children are not inherited or killed or anything.  They get a parent ==
0, which is like processes launched from the monitor.

7 years agoAllow WAITING->RUNNING_S transition
Barret Rhoden [Sun, 5 May 2013 21:25:43 +0000 (14:25 -0700)]
Allow WAITING->RUNNING_S transition

Used by the proc_yield SCP path.  In this case, we're not involving the
ksched in the fake wakeup process.  Also note that the MCP yield code
doesn't need this, since it doesn't synchronize based on the process's
state (it uses the vcore's state).

7 years agoFixes race in SCP yielding (again) (XCC)
Barret Rhoden [Sun, 5 May 2013 20:45:40 +0000 (13:45 -0700)]
Fixes race in SCP yielding (again) (XCC)

979bce86 had the right idea, just the wrong code.  Took a while to
actually have this happen (usleep 1 wasn't sufficient, even in a loop.
Had to have a few other things going on).

7 years agoDefines ACCESS_ONCE(x) macro (XCC)
Barret Rhoden [Sat, 4 May 2013 06:41:57 +0000 (23:41 -0700)]
Defines ACCESS_ONCE(x) macro (XCC)

This forces a one-time read of the value x.   I've been meaning to do
this for a while - we have a lot of synchronization code that assumes
that data is only loaded once, at a specific point in time.  Eventually
I'll go through older code and start using this.

Check out http://lwn.net/Articles/508991/ for more info.

This will also help with code that wants to force a read-in (say, from
global state to thread state) for performance reasons.

Keep in mind that we continue to need memory barriers, like the wmb(),
wrmb(), etc, since this has nothing to do with the processor's ordering
of operations, and also has nothing to do with writing values.

This is fairly similar to a cmb(), in that both tell the compiler that
memory values may have changed.  One slight difference is that a cmb()
(and rmb/wmb on x86) involves an asm volatile, which should prevent the
compiler from reordering the accesses (I think!).  AFAIK, the compiler
could reorder:

local_x = ACCESS_ONCE(x);
local_y = ACCESS_ONCE(y);

and if it is important to actually read x before y, then you want to do:

local_x = ACCESS_ONCE(x);
rmb(); /* on x86, this is just an asm volatile("" ::: "memory") */
local_y = ACCESS_ONCE(y);

The rmb() orders the x and y reads, and the ACCESS_ONCE prevents the
compiler from trying to read in x in the future when using local_x.

Finally, note that any use of an rwmb() (where we want to enforce the
read happens before the write) will probably want to use an ACCESS_ONCE,
unless we are okay with reading the value again after the write.

Reinstall your kernel header.

7 years agoAdds helper program for reading max_vcores
Barret Rhoden [Sat, 4 May 2013 05:51:35 +0000 (22:51 -0700)]
Adds helper program for reading max_vcores

This is used by shell scripts to get max_vcores.  We don't have pipes
working yet, so the answer is passed via the return value.  You can do
something like:

pthread_test $MAXVC 9999999999999999 $MAXVC &

to launch pthread test so that it will run forever and want all of the
cores available.

7 years agoChanges formatting on prov and pthread_test
Barret Rhoden [Sat, 4 May 2013 05:50:42 +0000 (22:50 -0700)]
Changes formatting on prov and pthread_test

7 years agoRemoves redundant event handler, exposes others
Barret Rhoden [Fri, 3 May 2013 23:46:40 +0000 (16:46 -0700)]
Removes redundant event handler, exposes others

The old handler wasn't being used - was overwritten by uthread code.
The main difference is that the uthread handler knows how to deal with
the CAN_RCV_MSG flag.

This also exposes the uthread's preemption/indir handlers, so that
applications can wrap the handlers with their own handlers.

7 years agoChecks addr + len after adjusting addr in mmap()
Barret Rhoden [Fri, 3 May 2013 23:09:23 +0000 (16:09 -0700)]
Checks addr + len after adjusting addr in mmap()

When setting addr to BRK_END for anonymous mappings, we could have an
addr + len that passes UMAPTOP.

7 years agoFixes bug with ksched running while an SCP dies
Barret Rhoden [Wed, 1 May 2013 00:36:52 +0000 (17:36 -0700)]
Fixes bug with ksched running while an SCP dies

The local SCP could be dying (via an exit(), for example), but before
the __death KMSG is sent, and IRQ triggers the ksched tick KMSG, which
will happen before __death.

Notice we can't send a __ksched_tick message, since that would rearm the
(probably) already armed alarm, using the same awaiter.  This would
result in a few problems, one of which was runaway __ksched_tick kmsgs
that exhaust the system's memory...

This is a little clunky, in that the ksched needs to deal with this.  An
alternative would be to make launching an SCP (proc_run_s()) operate
with RKMs, or make SCP death *not* use RKMs.

7 years agoAdds helper program to sleep / block
Barret Rhoden [Tue, 30 Apr 2013 22:25:19 +0000 (15:25 -0700)]
Adds helper program to sleep / block

$ usleep MICROSEC

7 years agoFixes race with vcore_yield()
Barret Rhoden [Mon, 29 Apr 2013 22:22:58 +0000 (15:22 -0700)]
Fixes race with vcore_yield()

In some scenarios, the kernel would think we wanted <= 0 cores
(negatives triggered the > max_vcores() check), if we were yielding
repeatedly while messages arrived.

7 years agoFixes x86 FPU initialization
Barret Rhoden [Fri, 26 Apr 2013 18:54:15 +0000 (11:54 -0700)]
Fixes x86 FPU initialization

Need to clear the FPU header state before saving the default copy.  My
guess is the PXE agent / bootloader used FP and left us with a full,
dirty FP stack.  Though perhaps the CPU just decided to start like that.
Either way, that bad state was bleeding through to the SCPs / thread0s,
which increase the likelihood of errors in apps (CFL errors in
fluidanimate, which can also cause page faults).

7 years agoAllows XCC building with newer texinfo (XCC)
Barret Rhoden [Wed, 24 Apr 2013 23:09:51 +0000 (16:09 -0700)]
Allows XCC building with newer texinfo (XCC)

binutils and stage2 of gcc are building some documentation that has a
few bugs:

We just disable the building, using the method described in

If you've been purposefully using old versions of texinfo, please
upgrade and test this out.  Works on my gentoo box.  You'll need to rm
the builddirs and hidden configure files in tools/compilers/gcc-glibc/.

7 years agoCleans up run_uthread helpers
Barret Rhoden [Wed, 24 Apr 2013 21:49:06 +0000 (14:49 -0700)]
Cleans up run_uthread helpers

Running a current uthread is different enough from running a new uthread
to have separate functions, esp with all of the asserts.  And less

Note I stopped double-checking events - that's a huge pain.

7 years agoFixes saving FP state when copying out uthreads
Barret Rhoden [Wed, 24 Apr 2013 02:11:41 +0000 (19:11 -0700)]
Fixes saving FP state when copying out uthreads

We weren't saving the state from the FPU when we copyout/paused uthreads
on the local/calling core.

7 years agoFixes x86 SW context FP restore
Barret Rhoden [Wed, 24 Apr 2013 01:49:35 +0000 (18:49 -0700)]
Fixes x86 SW context FP restore

The FPU stack could have registers in it, either due to old FP loads, or
due to MMX usage (which marks the entire stack as full).  The ABI
expects an empty stack.  Conveniently enough emms clears it, even though
8.1.7 doesn't mention it.

7 years agox86 FP exception/error parsing
Barret Rhoden [Tue, 23 Apr 2013 23:52:15 +0000 (16:52 -0700)]
x86 FP exception/error parsing

We don't handle any FP errors in software, but we will tell you why we
killed your program!  (These errors are more likely due to system
software not restoring your FPU state properly).

7 years agoKills processes when MAP_POPULATE fails
Barret Rhoden [Mon, 22 Apr 2013 22:03:15 +0000 (15:03 -0700)]
Kills processes when MAP_POPULATE fails

Still have some issues with running out of memory: proc_destroy()
consumes memory (sending kernel messages, possibly blocking in the FS
when closing files), busybox doesn't wait on the dying process right
away, and the rest of the system is still running.

7 years agox86 userspace uses software contexts (XCC)
Barret Rhoden [Sat, 20 Apr 2013 22:12:24 +0000 (15:12 -0700)]
x86 userspace uses software contexts (XCC)

These are for all software-controlled threading/yielding
(uthread_yield()), but not for syscall/sysenter yet.

Reinstall kernel headers / rebuild parlib and applications.

7 years agoAdds syscall for help entering VC context (XCC)
Barret Rhoden [Mon, 22 Apr 2013 19:11:15 +0000 (12:11 -0700)]
Adds syscall for help entering VC context (XCC)

We had been using sys_self_notify for this, but I actually want
something that doesn't require a specific vcoreid and just acts on the
calling pcore.

There are a couple cases with the old style where we could send
(harmless) notifs to the wrong core.  If the uthread were interrupted
and migrated right after it decided to self_notify, when it was repopped
in the future, it would notify its old vcore.

The other nice thing about this is that we don't need to worry about the
storage space for the syscall, simplifying our pop code a bit.  I didn't
bother removing the local_sysc from the restart_helper.  Not worth the
hassle, and I'll do it on the next rewrite of the HW TF stuff.

Reinstall kernel headers, rebuild parlib + apps.

7 years agox86: detect FS/GS MSRs
Barret Rhoden [Mon, 22 Apr 2013 18:30:27 +0000 (11:30 -0700)]
x86: detect FS/GS MSRs

On some machines (like the Nehalem), there are MSRs for the kernel to
access FS and GS base.  Not to be confused with the even newer support
for userspace access to those MSRs via {RD,WR}{FS,GS}BASE instructions.

7 years agox86: initialize XMM registers along with x87
Barret Rhoden [Fri, 19 Apr 2013 18:30:27 +0000 (11:30 -0700)]
x86: initialize XMM registers along with x87

In the future (or in RISCV), someone might have an init_fp_state() that
is super-efficient.  If it turns out that manually zeroing the XMM
registers is faster, then we can change the code.  I haven't
microbenchmarked the new way or compared it to 0'ing the 15 XMM
registers + loading the MXCSR yet.

7 years agoFixes assert typo
Barret Rhoden [Wed, 24 Apr 2013 22:18:17 +0000 (15:18 -0700)]
Fixes assert typo

7 years agoImprove RISC-V cpu_relax
Andrew Waterman [Tue, 23 Apr 2013 12:20:54 +0000 (05:20 -0700)]
Improve RISC-V cpu_relax

Before, it executed a tight loop, which isn't energy efficient.  Now,
it divides 0 by 0 and "uses" the result, which, on our in-order
microarchitectures, results in a long-latency stall that doesn't burn too
much energy.

7 years agoImplement backtrace for RISC-V
Andrew Waterman [Tue, 23 Apr 2013 12:20:11 +0000 (05:20 -0700)]
Implement backtrace for RISC-V

We now have a working frame pointer when -fno-omit-frame-pointer is given.

7 years agoMove read/write_fsr so they're visible to userland
Andrew Waterman [Tue, 23 Apr 2013 12:17:38 +0000 (05:17 -0700)]
Move read/write_fsr so they're visible to userland

7 years agoFormatting/renaming some RISC-V stuff
Andrew Waterman [Tue, 23 Apr 2013 11:37:34 +0000 (04:37 -0700)]
Formatting/renaming some RISC-V stuff

7 years agoAlways keep floating point enabled on RISC-V
Andrew Waterman [Tue, 23 Apr 2013 11:24:24 +0000 (04:24 -0700)]
Always keep floating point enabled on RISC-V

7 years agoUpdate save_kernel_tf_asm to use new calling conv.
Andrew Waterman [Tue, 23 Apr 2013 11:22:28 +0000 (04:22 -0700)]
Update save_kernel_tf_asm to use new calling conv.

7 years agoImplement save/restore_fp_state for RISC-V
Andrew Waterman [Tue, 23 Apr 2013 10:58:02 +0000 (03:58 -0700)]
Implement save/restore_fp_state for RISC-V

7 years agoSuppress warning and fix assert in proc_pop_ctx
Andrew Waterman [Tue, 23 Apr 2013 10:03:03 +0000 (03:03 -0700)]
Suppress warning and fix assert in proc_pop_ctx

7 years agoBypass GOT/PLT for __ros_syscall within libc
Andrew Waterman [Tue, 23 Apr 2013 06:35:18 +0000 (23:35 -0700)]
Bypass GOT/PLT for __ros_syscall within libc

Bypassing the global offset table removes one level of indirection in the
syscall path.  On RISC-V, a call via the GOT is three instructions, including
a load, whereas a direct call is a single instruction with no data memory
access.  The situation in x86 is analogous, though it's the PLT and
instruction cache that are bypassed, rather than the GOT and data cache.
(FWIW, the difference is due to self-modifying code being cheap on x86.)

In general, libc_hidden_proto/libc_hidden_def have this effect, but they
should only be used when interposition isn't necessary (e.g. you can't use
LD_PRELOAD to override function definitions if the PLT is bypassed).

7 years agoReimplement writev to not access errno on success
Andrew Waterman [Mon, 22 Apr 2013 22:24:56 +0000 (15:24 -0700)]
Reimplement writev to not access errno on success

Like the previous commit, this helps when debugging ld.so, since TLS may
not yet be initialized.

7 years agoDon't write/obtain errno unless sysc.err is set
Andrew Waterman [Mon, 22 Apr 2013 22:20:14 +0000 (15:20 -0700)]
Don't write/obtain errno unless sysc.err is set

This is mostly a performance optimization, but it also allows syscalls
to be executed before TLS is set up.  This helps when debugging ld.so.

7 years agoSupport new risc-v calling convention
Andrew Waterman [Mon, 22 Apr 2013 22:05:08 +0000 (15:05 -0700)]
Support new risc-v calling convention

7 years agofill-kfs strips only debug info from libc.so/ld.so
Andrew Waterman [Mon, 22 Apr 2013 22:01:40 +0000 (15:01 -0700)]
fill-kfs strips only debug info from libc.so/ld.so

7 years agoFixes bug with pop_ros_ctx (x86)
Barret Rhoden [Fri, 19 Apr 2013 01:51:37 +0000 (18:51 -0700)]
Fixes bug with pop_ros_ctx (x86)

Again, much like 2612bab3, removing the memset in 0a19848d0 caused
another bug, where we were no longer sending in EV_NONE and a null
message.  Having a gibberish message led to sending very high event
numbers, which was basically a quasi-random function pointer.

Good times!

7 years agoUthreads handle FP save and restore
Barret Rhoden [Thu, 18 Apr 2013 22:50:08 +0000 (15:50 -0700)]
Uthreads handle FP save and restore

RISCV / SPARC, please take a look at your code (TODO).  I didn't just
inline it, in case you want to put the code in C files in your subdirs.

7 years agoUthreads need to be aligned when allocated
Barret Rhoden [Thu, 18 Apr 2013 22:45:24 +0000 (15:45 -0700)]
Uthreads need to be aligned when allocated

All threading libraries need to force alignment with posix_memalign,
since the ancillary state requires greater than 8 byte alignment.

7 years agoRemoves env_push/pop of FPU state
Barret Rhoden [Wed, 17 Apr 2013 23:13:36 +0000 (16:13 -0700)]
Removes env_push/pop of FPU state

RISC and SPARC: please check out your fp_state functions (like save,
restore, init).

7 years agoKernel properly handles floating point (XCC)
Barret Rhoden [Wed, 17 Apr 2013 23:07:44 +0000 (16:07 -0700)]
Kernel properly handles floating point (XCC)

The kernel saves and restores floating point rather aggressively.  There
are a couple corner cases where we can avoid saving state, such as when
a uthread makes a syscall and gets preempted before the call returns.

The use of the TS flag is actually quite problematic.  We'd need to
reflect it to userspace via VCPD, and it would end up acting as a taint
if uthreads migrate between vcores.  Keep in mind that userspace can't
reset TS on its own, and any attempt to save callee-saved FP state (like
on a user-level context switch) will result in a trap, forcing the FPU
to be turned on.

Rebuild parlib and all applications.

7 years agoUthread arch-dependent code uses user_contexts
Barret Rhoden [Mon, 15 Apr 2013 21:28:26 +0000 (14:28 -0700)]
Uthread arch-dependent code uses user_contexts

Still use HW contexts in all architectures, but each arch can make the
change to SW contexts (for uthreads and syscalls) at their leisure.

7 years agoProcdata uses user_contexts (XCC)
Barret Rhoden [Sat, 13 Apr 2013 02:59:45 +0000 (19:59 -0700)]
Procdata uses user_contexts (XCC)

This changes the kernel interface from struct trapframes to struct
user_contexts.  I also found some ancient documentation, though I'm sure
a lot more of it is out of date (esp regarding preemption).

Userspace libraries (and ancient ghetto test programs...) use the new
kernel interface, though the user-level arch-dependent functions still
operate on HW TFs (instead of contexts).

Also, c3po looks like it might not work; not sure what its deal is/was.