8 years agoRemote mbox can deal with recursive calls (XCC)
Barret Rhoden [Tue, 13 Dec 2011 21:33:13 +0000 (13:33 -0800)]
Remote mbox can deal with recursive calls (XCC)

This handles cases where you are handling a remote vcpd mbox, and then
want to handle another remote mbox (which happens if the remote mbox got
a preemption message).  The way we handle all of the cases uses some
form of "tell our future self what to do".

I also moved the relevant code over to event.c, which might make it more
reusable for future event handlers.  Note that any event handler that
doesn't return needs to somehow deal with VCPD mboxes around the
no-return site.  We have a couple handlers for that.

Reinstall your kernel header(s).

8 years agosys_self_notify() now honors ev_type
Barret Rhoden [Sat, 10 Dec 2011 00:09:53 +0000 (16:09 -0800)]
sys_self_notify() now honors ev_type

Previously, if you didn't send a u_msg, we weren't sending the type.
The desired behavior of this half-assed syscall is to send either
ev_type with 0s for arguments, or send u_msg.

8 years agoEvent helper for detecting empty mboxes
Barret Rhoden [Fri, 9 Dec 2011 23:27:08 +0000 (15:27 -0800)]
Event helper for detecting empty mboxes

8 years agoBit messages are now flagged (XCC)
Barret Rhoden [Fri, 9 Dec 2011 23:12:26 +0000 (15:12 -0800)]
Bit messages are now flagged (XCC)

This saves a scan of the bitmap every time we check events or want to
know if an ev_mbox has messages - even if one of the event handlers
didn't return.

Reinstall your kernel headers.

8 years agosys_self_notify() takes a flag for private mboxes
Barret Rhoden [Fri, 9 Dec 2011 01:41:42 +0000 (17:41 -0800)]
sys_self_notify() takes a flag for private mboxes

Sending TRUE will send the message to the VCPD private mbox.  I'm not
100% on sys_self_notify like this - perhaps we'll take an ev_q in the
future.  But for now this works.

8 years agoRenames ridiculous sys_getcpuid call (XCC)
Barret Rhoden [Thu, 8 Dec 2011 00:50:45 +0000 (16:50 -0800)]
Renames ridiculous sys_getcpuid call (XCC)

You don't really need to call that, since you can check the vcoremap,
but we'll keep the call around for now (debugging).  But it's now called
getpcoreid, which is more clearly what it is.

Not like we need a syscall to do a cpuid.  Or to change the stack
pointer...  =P

Reinstall your kernel header (ros/bits/syscall.h).

8 years agox86: Detection for RDFSBASE and friends
Barret Rhoden [Thu, 8 Dec 2011 00:42:46 +0000 (16:42 -0800)]
x86: Detection for RDFSBASE and friends

These are new extensions that we'll eventually use to deal with the TLS
vulnerabilities that we have on x86 from exposing the LDT.

To do the detection, we needed to pass through a second uint32, which
some of the cpuid leaves require.

8 years agoFALLBACK logic -> spam_public_msg() (XCC)
Barret Rhoden [Wed, 7 Dec 2011 22:30:10 +0000 (14:30 -0800)]
FALLBACK logic -> spam_public_msg() (XCC)

The old logic behind the FALLBACK aspects of alert_vcore(), which was
used to make sure INDIRs made it to a (optionall running) vcore is now
more generic, and is callable for arbitrary ev_msgs, not just INDIRs.
INDIRs still benefit from this, and they call it at the bottom of
send_indir().  Other messages (e.g. preemption, in future patches) can
use it to get the same delivery guarantee: your message will get spammed
to vcores until we're sure at least one of them got it and will read it.

The VCORE_MUST_RUN flag is still supported.  It means that when
spamming, we pick vcores that must be running, compared to settling for
a vcore that will eventually get looked at (during preemption recovery).

Note that there is no way in this patch for userspace to access the

Trivial change to the kernel header (ros/event.h) - userspace doesn't
use it yet, and might not ever.

8 years agoUthread support to handle remote public VCPD mbox
Barret Rhoden [Wed, 7 Dec 2011 22:24:22 +0000 (14:24 -0800)]
Uthread support to handle remote public VCPD mbox

Will be used by preemption.  We needed to jump back to vc_entry to avoid
recursing, etc.

8 years agoPublic VCPD mboxes (XCC)
Barret Rhoden [Mon, 5 Dec 2011 23:32:58 +0000 (15:32 -0800)]
Public VCPD mboxes (XCC)

Each vcore has two mboxes, one for public messages (meaning they can be
read by any vcore) and one for private (specific to that vcore only).
Both are checked by handle_events().  We need this because there are
situations where we will need to read another vcores messages
(preemption recovery) to make sure we get certain messages
(specifically, INDIRs and preemption notices) regardless of preemption,
yielding, etc.

Check the Documentation for more info.  We don't use these yet for much
(there's no ev_q flag, for instance), and preemptions still use INDIRs.
That'll change shortly.

Reinstall your kernel headers.

8 years agovcpd_of() helper for userspace
Barret Rhoden [Mon, 5 Dec 2011 19:27:32 +0000 (11:27 -0800)]
vcpd_of() helper for userspace

There are a few places I didn't change it yet; those are getting
concurrently modified in another commit.

Note I don't have a helper for the kernel.  For now, I want to be
explicit about which entry point into procdata we use (the user address
or the kernel address).

8 years agoUthread vc_entry will spin on STEALING
Barret Rhoden [Tue, 29 Nov 2011 23:52:33 +0000 (15:52 -0800)]
Uthread vc_entry will spin on STEALING

If for any reason STEALING is set, a vcore can't touch its
current_uthread.  2LSs don't need to worry about it; uthread code will
deal with it before calling out to a 2LS.  Preemption recovery code will
muck with this.

8 years ago2LS sched op: thread_paused()
Barret Rhoden [Tue, 29 Nov 2011 23:29:28 +0000 (15:29 -0800)]
2LS sched op: thread_paused()

This gets called when a uthread stopped due to some async activity
(unlike yield, which is caused by the uthread in some way).  Check out
the pth example for more details.

8 years agoUthread can handle clear_notif_pending
Barret Rhoden [Wed, 23 Nov 2011 01:31:00 +0000 (17:31 -0800)]
Uthread can handle clear_notif_pending

clear_notif_pending() might not return, and it might return and clear
your current_uthread.  The latter can happen if you service a preemption
of another vcore that was stuck in vc context and fail to change_to that
vcore (which happens if that vcore starts up for any reason).

So if we lose our current_uthread, we just restart the vcore.  We're
also careful to make sure we don't lose a *uthread if clear_notif
doesn't return.

In the process, I also made a little helper, since there's a lot of
common code between run_cur_uth and run_uth.  __run_cur_uth_raw() is
still a bit weird and different: enough so that I'll leave it alone.

8 years agoUthread flag tells us where the context is saved
Barret Rhoden [Sat, 19 Nov 2011 02:00:59 +0000 (18:00 -0800)]
Uthread flag tells us where the context is saved

So we know how to save it during preemption recovery.  The flag means
that the context for the uthread is in the utf.  If it isn't there, it's
in the VCPD notif trapframe (or will be there soon, in such a manner
that we won't steal the thread or handle other vcore's preemptions until
it is in the notif_tf).

8 years agoFixes sys_change_vcore() return path
Barret Rhoden [Mon, 14 Nov 2011 20:39:26 +0000 (12:39 -0800)]
Fixes sys_change_vcore() return path

Once we unlock, we could have the calling vcore start up remotely before
we get a chance to finish the syscall (writing the syscall struct).  If
the vcore had notifs disabled, it'll start up where it left off and wait
on the syscall finishing, which is fine.  However, if the vcore starts
from scratch on a remote core, nothing will ever wait on the sysc, and
we now could be writing into the stack at some random future date.

8 years agoVcore states for preemption recovery (XCC)
Barret Rhoden [Wed, 9 Nov 2011 23:12:01 +0000 (15:12 -0800)]
Vcore states for preemption recovery (XCC)

The kernel writes the states, and userspace will CAS with the kernel
whenever it needs to make decisions / sync on the flags.  I'll use this
more in the future.

Side note: having the kernel set the K_LOCK prevents userspace from
thinking a vcore wasn't preempted.  Ex: it receives a message, but
__preempt hasn't happened yet.  The preempt recovery handler will
(eventually) check/spin on the K_LOCK, which gets cleared once the vcore
is fully preempted.

Reinstall your kernel header(s).

8 years agoVcores always start in vcore context
Barret Rhoden [Wed, 9 Nov 2011 01:37:41 +0000 (17:37 -0800)]
Vcores always start in vcore context

Previously, after a preemption, the vcore would start whatever was
running when it was preempted: specifically, it could start a uthread.
Now, it'll always start in vcore context.  The 2LS will likely restart
the uthread right away.

We'll need this change to be able to steal uthreads from preempted
vcores (in future patches).  While the older style seemed reasonable for
programs written directly on the kernel, the 2LS now handles everything.

8 years agonotif_enabled -> notif_disabled (XCC)
Barret Rhoden [Wed, 9 Nov 2011 00:55:06 +0000 (16:55 -0800)]
notif_enabled -> notif_disabled (XCC)

The default state is now notifs enabled.  Vcores will still come up with
notifs disabled: the kernel will sort that out.  Its just that fresh
vcore preempt data won't need to have notifs manually enabled or
anything for the _S -> _M transition.

Reinstall your kernel header(s).

8 years agoClarifies/fixes some issues with __preempt and MCS
Barret Rhoden [Mon, 24 Oct 2011 18:00:08 +0000 (11:00 -0700)]
Clarifies/fixes some issues with __preempt and MCS

We need the wmb() in __preempt, which is racing with __map_vcore()
(among other things).  Basically, we need to make sure we don't give out
the vcore while cleaning up the vcore.  Once we __unmap_vcore(), we need
to never touch it again til it is mapped.

Likewise, the MCS-PDR code can quite easily see a situation where a core
is preempted but is still mapped.  The old assertion was mostly to catch
bugs, but that wasn't a "safe" check, since the preempting and unmapping
isn't atomic from the perspective of other cores.

8 years agoNo longer uses num_vcores() to determine _M (XCC)
Barret Rhoden [Tue, 18 Oct 2011 00:43:45 +0000 (17:43 -0700)]
No longer uses num_vcores() to determine _M (XCC)

We were using num_vcores() == 0 to determine if we're in _M mode or not.
This won't be true when we start sending bulk preempt messages, since
num_vcores() is 0 for an instant, which could trick some code to think
it is in _S mode and bypass some critical stuff.

Reinstall your kernel headers (procinfo.h).

8 years agovcore_request() no longer uses MCS locks
Barret Rhoden [Tue, 18 Oct 2011 00:21:19 +0000 (17:21 -0700)]
vcore_request() no longer uses MCS locks

All cores update a shared atomic, saying they want that many vcores.
One core will actually handle the process of prepping the vcores and
asking the kernel for them.

Note that the whole request/yield process and its effects on amt_wanted
and whatnot is rather jacked up.  Vcore code needs to be smarter about
how it interacts with amt_wanted, which will require some help from the
kernel, which I'll do in future patches.

8 years agoUthread blockon handles notif_disabled uthreads
Barret Rhoden [Thu, 13 Oct 2011 01:06:56 +0000 (18:06 -0700)]
Uthread blockon handles notif_disabled uthreads

The in_vcore_context() check tests TLS, not whether or not notifs are
disabled.  It is the latter we care about more.  We need to check
DONT_MIGRATE before checking if notifs are disabled (vcoreid), and any
code that does have DONT_MIGRATE set *when making a syscall* needs to
have notifs disabled.  I don't explicitly check for this, since you have
to set DONT_MIGRATE to be sure about your vcoreid.

8 years agoMore thoroughly detect preemptions
Barret Rhoden [Thu, 13 Oct 2011 00:50:23 +0000 (17:50 -0700)]
More thoroughly detect preemptions

MCS-PDR code checks for preemptions via preempt_tf_valid.  If you don't
you can accidentally think a yielded vcore is preempted.  Either way, it
is unmapped.  In the future, it'll be safe to restart them, but right
now we don't handle preemption messages, so processes can run into
issues.  Also, you don't really want to restart a yielded vcore.  Next
time you spin in the MCS code, you will (hopefully!) get a different
vcore (reread lockholder, etc).

Also, we were a bit sloppy about the use of preempt_tf_valid.  It's
actually an ancient seq_ctr instead of a bool.  The 2 year old reason
for that was to help us detect changes to the preempt tf for remote
recovery, but I have a feeling it might not be strong enough.

8 years agoPthreads now uses mcs_pdr locks
Barret Rhoden [Wed, 12 Oct 2011 23:24:20 +0000 (16:24 -0700)]
Pthreads now uses mcs_pdr locks

Instead of the old notif_safe MCS ones.  Note that the MCS-PDR locks are
notif_safe, and can be called from uthread context.

For those curious, pthread code has functions that lock that are called
from uthread context and from vcore context.  Specifically,
uthread_runnable/pth_thread_runnable can come from
uthread_init/pthread_create, which is uthread context, and
restart_thread, which is vcore context.  Plus, the pth_sched_entry
hammers the same runqueue lock in vcore context.

8 years agoproc_change_to_vcore() races fixed
Barret Rhoden [Wed, 12 Oct 2011 23:21:32 +0000 (16:21 -0700)]
proc_change_to_vcore() races fixed

This function had the same sorts of races as proc_yield(), namely that
your calling vcore could have been __preempted, have a preempt_served,
be DYING, etc.

Also saves the FP state and a couple other minor things.

8 years agoFixes race and rewrites proc_yield()
Barret Rhoden [Wed, 12 Oct 2011 21:30:10 +0000 (14:30 -0700)]
Fixes race and rewrites proc_yield()

The race was with concurrent __preempts.  preempt_served would get
turned off and we'd be unmapped.  We needed to check for being unmapped
with irqs disabled.

preempt_served serves as a "preemption is on the way, but hasn't hit
yet".  In this case, we've been removed from the online list and just
need to return and take the preemption.  A process might see this as
yield failing, either immediately or when the vcore gets restarted.

A few notes on proc_yield, and the unfortunate fact that we lock in it
(making it a pain for scalability):

1) Yield needs to leave the core, just like __death.  unmap, abandon,

2) It is safe to do one unmap without the lock, but only if you were
told to by the lockholder (which is what __preempt and __death do).
Granting new ones requires the lock.  Other than in __preempt and
__death, you can't trust reading the vcoremap to get your vcoreid
without the lock, since you could see the result of a take_core then a
give_core to different a vcore.  This is probably true.

3) Adding the pcore to the idlecoremap involves locking too (though not
the proc_lock);

4) Yield needs to not conflict with KMSGs.

5) Yield needs to not miss a notif_pending (playing shmem games with the
lists and __alert_vcore()

6) Lacking any remote __preempt/__death/__myield, yield needs to remove
its vcore from the online_list, which requires locking.

8 years agoUCQs now use mcs_pdr_locks (XCC)
Barret Rhoden [Wed, 12 Oct 2011 01:12:22 +0000 (18:12 -0700)]
UCQs now use mcs_pdr_locks (XCC)

I'm using the memory safe locks for now.  You can get away with unsafe
versions if the storage for them never gets freed (and we'd need some
sanity checks in __ensure_qnode_runs()), though I'm not 100% on whether
or not uthread code will ever call ucq code, and as of right now,
uthread stacks get freed (2LS decision).

The downside to this is that our MCS-PDR locks use more memory, and that
memory was not as likely to be in the cache as the stack.

Reinstall your kernel headers (ucq.h).

8 years agoFixes ext2 RAM block device linking
Barret Rhoden [Thu, 15 Dec 2011 22:32:26 +0000 (14:32 -0800)]
Fixes ext2 RAM block device linking

Same deal as with 5aac42b0631a8, we need to convert it to a .o to link
it in.  It's a bit crappy, since we have to process another large file,
but it works for now.

8 years agoFixes excessive make realcleans
Barret Rhoden [Thu, 15 Dec 2011 21:38:22 +0000 (13:38 -0800)]
Fixes excessive make realcleans

Since b8738ad0, every time you make, you'd do a make realclean (at least
on x86), since the $@ wasn't changed when the target had "real-" added
to it.

8 years agoFixes gcc 4.6.1 incompatibility with old x86 asm
Barret Rhoden [Thu, 15 Dec 2011 21:05:36 +0000 (13:05 -0800)]
Fixes gcc 4.6.1 incompatibility with old x86 asm

4.6.1 didn't like the old version (couldn't handle the possibility of
"m", perhaps rightfully so).

Did anyone actually build the kernel on x86 with the new compiler, or
was it just my system that couldn't handle it?

8 years agoFixes binutils patch: Hammertime!
Barret Rhoden [Thu, 15 Dec 2011 19:11:52 +0000 (11:11 -0800)]
Fixes binutils patch: Hammertime!

Lots of systems have problems building some versions of binutils due to
the weirdness around RPATH_ENVVAR.  No idea why binutils does that crap.
We've adopted the same patch that Gentoo uses for the version of
binutils they distribute.


8 years agoFix xcc's "make patches"
Andrew Waterman [Thu, 15 Dec 2011 02:49:25 +0000 (18:49 -0800)]
Fix xcc's "make patches"

8 years agoadd getrlimit64 stub
Your Name [Sat, 12 Nov 2011 08:05:21 +0000 (00:05 -0800)]
add getrlimit64 stub

Necessary to link busybox on RISC-V.  The problem is
actually that the generic version doesn't libc_hidden_def
itself, so the exported symbol name was mangled.

8 years agoFixed bug in RISC-V env_user_mem_free
Your Name [Sat, 12 Nov 2011 08:04:39 +0000 (00:04 -0800)]
Fixed bug in RISC-V env_user_mem_free

It was rounding up to the largest page size, causing
procinfo/procdata to be freed on sys_exec.

8 years agoRISC-V compiler port configure script changes
Andrew Waterman [Fri, 11 Nov 2011 14:09:26 +0000 (06:09 -0800)]
RISC-V compiler port configure script changes

I had to change the RISC-V compiler port a bit to
maintain backwards compatibility with our generic
Newlib/ELF target.  This actually simplified the
configure script changes for RISC-V on ROS.

The commit is large because I've now put the RISC-V
cross-compiler in its own git repo, and I'm using
git diff to generate the patch files, and the slight
formatting change makes for a large apparent change.

8 years agoFixed RISC-V page fault handling
Andrew Waterman [Fri, 11 Nov 2011 09:14:40 +0000 (01:14 -0800)]
Fixed RISC-V page fault handling

The current tf wasn't being set.

8 years agoChanges to RISC-V supervisor mode
Andrew Waterman [Fri, 11 Nov 2011 08:32:22 +0000 (00:32 -0800)]
Changes to RISC-V supervisor mode

See commit comments in ISA simulator for details

8 years agoMiscellaneous RISC-V compiler updates
Andrew Waterman [Fri, 11 Nov 2011 08:31:50 +0000 (00:31 -0800)]
Miscellaneous RISC-V compiler updates

8 years agoDynamic linking now works on RISC-V
Andrew Waterman [Tue, 8 Nov 2011 09:39:13 +0000 (01:39 -0800)]
Dynamic linking now works on RISC-V

The spurious invalid dynamic relocations within ld.so
were caused by our errno.c using TLS for errno within
the RTLD.  Instead, we should use a global errno then.

8 years agoRISC-V architecture bugfix potpourri
Andrew Waterman [Tue, 8 Nov 2011 09:38:28 +0000 (01:38 -0800)]
RISC-V architecture bugfix potpourri

8 years agoImproved ELF loader
Andrew Waterman [Tue, 8 Nov 2011 09:36:36 +0000 (01:36 -0800)]
Improved ELF loader

- support program headers spanning more than a page
  (this does occur with 64-bit ELFs)

- load program headers without MAP_FIXED, so that they
  don't collide with the dynamic linker.  we now load
  the linker starting at page 1.

- fixed kernel page fault when zeroing a partial BSS
  section with demand paging.  we need to bring the
  fringe page in with MAP_POPULATE before zeroing it.

8 years agoMakefile changes to support RISC-V
Andrew Waterman [Mon, 7 Nov 2011 23:03:36 +0000 (15:03 -0800)]
Makefile changes to support RISC-V

Added riscv target to build for RISC-V
and rvfs target to run the simulator

8 years agoDon't populate core 0's stack, except for SPARC
Andrew Waterman [Mon, 7 Nov 2011 22:58:45 +0000 (14:58 -0800)]
Don't populate core 0's stack, except for SPARC

SPARC needs stacks to be mapped in so that
register window spills always succeed.  Other
ISAs can safely fault on stack accesses.

8 years agoRename c3po ucontext to avoid namespace collision
Andrew Waterman [Sat, 5 Nov 2011 02:06:59 +0000 (19:06 -0700)]
Rename c3po ucontext to avoid namespace collision

... with sys/ucontext.h's struct ucontext.

8 years agoFixed dynamic linking on x86
Andrew Waterman [Sat, 5 Nov 2011 02:05:10 +0000 (19:05 -0700)]
Fixed dynamic linking on x86

Some changes in binutils made ld.so reject
our libraries as having an invalid ABI.
Also, we have to avoid using recursive
spinlocks (which use __thread) while inside
ld.so before __thread is valid.

8 years agoProgress towards dynamic linking on RISC-V
Andrew Waterman [Fri, 4 Nov 2011 21:38:41 +0000 (14:38 -0700)]
Progress towards dynamic linking on RISC-V

This patch changes how command-line args are passed to
the dynamic linker.  Before, it was being done in a way
that required a function call at a time when function
calls are not legal.

8 years agoAdd some more ignores to the gitignore
Kevin Klues [Thu, 3 Nov 2011 04:23:16 +0000 (21:23 -0700)]
Add some more ignores to the gitignore

8 years agoRISC-V and updated cross compiler (XCC)
Kevin Klues [Thu, 3 Nov 2011 01:30:15 +0000 (18:30 -0700)]
RISC-V and updated cross compiler (XCC)

At this point, we now use gcc 4.6.1 and glibc 2.14.1.  If you recently pulled
this commit on an older repo, you'll need to do a few things.

If you don't care about your local changes, just copy out your two Makelocals
(the kernel one and the XCC one), blow away the repo, and reclone.

If you have changes, checkout an older version of the repo and make clean for
both the kernel and the xcc.  Otherwise, you could manually get rid of some old
gcc/glibc/binutils/etc tarballs and directories.

Finally, you'll want to rebase your working branches onto the new master's
HEAD, or somewhere in the past downstream if you want to keep it where it was
in the original master branch.  Most people should just rebase now to the new

Ex: git rebase --onto master UPSTREAM YOUR-OLD-BRANCH , where UPSTREAM is the
commit where you diverged from the upstream/master branch.

8 years agoUpdated .gitignore to reflect new xcc version
Andrew Waterman [Wed, 2 Nov 2011 23:05:48 +0000 (16:05 -0700)]
Updated .gitignore to reflect new xcc version

8 years agoRISC-V userland now works-ish
Andrew Waterman [Wed, 2 Nov 2011 09:34:22 +0000 (02:34 -0700)]
RISC-V userland now works-ish

8 years ago64-bit compatibility fixes in userland/tests
Andrew Waterman [Wed, 2 Nov 2011 09:32:32 +0000 (02:32 -0700)]
64-bit compatibility fixes in userland/tests

8 years agoRISC-V compiler now builds working executables
Andrew Waterman [Wed, 2 Nov 2011 09:29:53 +0000 (02:29 -0700)]
RISC-V compiler now builds working executables

8 years agoSimplified binutils build process
Andrew Waterman [Wed, 2 Nov 2011 09:28:36 +0000 (02:28 -0700)]
Simplified binutils build process

There's no need to make a copy of the source directory then build out of it.
Just build out of an empty directory.

8 years agoRISC-V cross compiler now builds (XCC)
Andrew Waterman [Thu, 3 Nov 2011 01:29:43 +0000 (18:29 -0700)]
RISC-V cross compiler now builds (XCC)

8 years agofixes to RISC-V trap handling
Andrew Waterman [Fri, 28 Oct 2011 12:21:29 +0000 (05:21 -0700)]
fixes to RISC-V trap handling

8 years agohandle sizeof(pid_t) != sizeof(void*) gracefully
Andrew Waterman [Fri, 28 Oct 2011 12:20:27 +0000 (05:20 -0700)]
handle sizeof(pid_t) != sizeof(void*) gracefully

8 years agoupgraded to gcc 4.6.1 and glibc 2.14.1 (XCC)
Andrew Waterman [Thu, 3 Nov 2011 01:20:00 +0000 (18:20 -0700)]
upgraded to gcc 4.6.1 and glibc 2.14.1 (XCC)

This commit includes not only brigning in the new gcc and glibc, but also the
changes to the glibc-*-ros files as well.  We did this so that this commit
will compile and build properly.  To see the diff of the glibc-*-ros files
with the old version, run the following command relative to checking out THIS

git diff HEAD^:tools/compilers/gcc-glibc/glibc-2.11.1-ros \

8 years agoFixed RISC-V trap entry
Andrew Waterman [Thu, 27 Oct 2011 11:04:40 +0000 (04:04 -0700)]
Fixed RISC-V trap entry

IRQs were being enabled in the wrong place, etc.

8 years agoUpdated RISC-V boot sequence; use 8KB pages
Andrew Waterman [Thu, 27 Oct 2011 10:07:43 +0000 (03:07 -0700)]
Updated RISC-V boot sequence; use 8KB pages

8 years agoMMAP_LOWEST_VA must be page-aligned
Andrew Waterman [Thu, 27 Oct 2011 10:04:39 +0000 (03:04 -0700)]
MMAP_LOWEST_VA must be page-aligned

... so I just set equal to PGSIZE, which doesn't change its value on x86.

8 years agoGMP, MPFR, and MPC are external dependences (XCC)
Andrew Waterman [Thu, 27 Oct 2011 07:31:26 +0000 (00:31 -0700)]
GMP, MPFR, and MPC are external dependences (XCC)

The cross-compiler now depends on the GMP, MPFR, and MPC libraries; they
will no longer be built along with the compiler.  These libraries are never
modified, and they complicate and slow the build process.

On Debian systems, this suffices: apt-get libgmp-dev libmpfr-dev libmpc-dev

8 years agoupgraded to binutils 2.21.1
Andrew Waterman [Thu, 3 Nov 2011 01:06:14 +0000 (18:06 -0700)]
upgraded to binutils 2.21.1

8 years agocode changes for new RISC-V GCC toolchain
Andrew Waterman [Sun, 23 Oct 2011 06:42:18 +0000 (23:42 -0700)]
code changes for new RISC-V GCC toolchain

8 years agoSort of hacky way of adding our binary blob for kfs to the kernel image
Andrew Waterman [Wed, 2 Nov 2011 22:44:56 +0000 (15:44 -0700)]
Sort of hacky way of adding our binary blob for kfs to the kernel image

Will become necessary after we add in compiler support for riscv.  Since the
way in which we even interact with KFS is probably temporary, this hack is
probably justified...

8 years agoForce kernel to be built with the static flag
Andrew Waterman [Wed, 2 Nov 2011 22:08:23 +0000 (15:08 -0700)]
Force kernel to be built with the static flag

Default in older gccs, but as we move to a new
one it might not be.  We just want to be prepared.....

8 years agoMCS Preemption-Detection and Recovery locks
Barret Rhoden [Wed, 12 Oct 2011 01:06:54 +0000 (18:06 -0700)]
MCS Preemption-Detection and Recovery locks

The basic idea is that if you are spinning, make sure someone else is
online/running that is on the way to making progress/unblocking you.
Normally, this is the lockholder, but it could also be someone else on a
chain of qnodes.  You make sure they are running, they make sure the
next one up is running, etc.  Even if we have only one pcore, this
should still unjam some preempted vcores involved in MCS locking.

Any MCS lock that is grabbed in vcore context will need to use these.
This includes all cases of notif_safe that needed to be called from
uthread context (though that needs a review, in case we still need

Regardless the mcs_pdr locks can handle being called from uthread
context, and odds are that anyone desiring to use an MCS lock will need
to use these (even regular old uthread code).

8 years agosys_change_vcore() (XCC)
Barret Rhoden [Wed, 12 Oct 2011 00:06:56 +0000 (17:06 -0700)]
sys_change_vcore() (XCC)

Syscall, allowing a process's vcore to change into another unmapped
vcore.  Be sure to only call this on vcores that have a stack set up for
them, and not some random vcore.

__startcore() and proc_change_to_vcore() both have some common
functionality.  __startcore() wasn't changed: its lower half just became
the helper.

Reinstall your kernel headers (bits/syscall.h).

8 years agoSend preemption messages (XCC)
Barret Rhoden [Wed, 12 Oct 2011 00:03:19 +0000 (17:03 -0700)]
Send preemption messages (XCC)

When a vcore is preempted, the kernel will send an event to the
appropriate ev_q.  For all uthread code, the handler and ev_q is set up
in uthread_lib_init().  Note that the handler does nothing yet but give
us some helpful information.

Reinstall your kernel headers (event.h).

8 years agoFixes minor bug
Barret Rhoden [Tue, 11 Oct 2011 23:46:18 +0000 (16:46 -0700)]
Fixes minor bug

Had no effect on pthread code, caught it when I forgot to put in a
FALLBACK and wondered why I wasn't getting the warning.

8 years agoUthread helpers for disabling notifs
Barret Rhoden [Tue, 11 Oct 2011 00:40:36 +0000 (17:40 -0700)]
Uthread helpers for disabling notifs

The DONT_MIGRATE bit is tricky, and that code is about to get repeated a
lot, so it makes sense to have a helper.  Other code might be able to
use this, though I left them as is.  uthread_init() seems clear as is,
and might be getting mucked with in a concurrent patch set.

8 years agoAdds MCS unlock code that uses CAS.
Barret Rhoden [Mon, 10 Oct 2011 23:24:12 +0000 (16:24 -0700)]
Adds MCS unlock code that uses CAS.

We don't use this since SPARC and RISCV don't have a native CAS yet, but
I want the code in place for a couple upcoming commits.

This patch also comments on how the MCS locks work, which helps a bit.

8 years agoQuickly return/pop DONT_MIGRATE uthreads
Barret Rhoden [Thu, 6 Oct 2011 00:20:32 +0000 (17:20 -0700)]
Quickly return/pop DONT_MIGRATE uthreads

Two rules:

1) Don't check messages/handle events when you have a DONT_MIGRATE
uthread.  This will become important in the future.

2) All uses of DONT_MIGRATE must reenable notifs (and check messages) at
some point.  One such case is uthread_yield().  Another is

This patch handles the case where a uthread turns on DONT_MIGRATE and
gets IPI'd before it can disable_notif.  We simply return to it, leaving
notif_pending turned on so that we make sure we will go back into vcore
context and check messages at the next safe opportunity.  That makes
this the one time we can leave vcore context with notif_pending: since
we know we'll get back to it right away.

Another way to look at it is that we lost the race, and got the IPI
before disabling.  This allows us to pretend like we won the race
(barring any bugs...).

8 years agoproc_notify() no longer checks notif_pending
Barret Rhoden [Thu, 6 Oct 2011 00:15:17 +0000 (17:15 -0700)]
proc_notify() no longer checks notif_pending

We were accidentally masking our IPIs when notif_pending was set.  This
was due to a change over time of what notif_pending means.  It used to
only mean "an IPI is on its way", but now it means "there is a reason to
reenter vcore context and/or check messages/events".

8 years agoDONT_MIGRATE set more carefully
Barret Rhoden [Wed, 5 Oct 2011 22:28:00 +0000 (15:28 -0700)]
DONT_MIGRATE set more carefully

It's held the entire time throughout an mcs_notif_safe lock, since it
doesn't make sense to migrate or otherwise try to restart/run that
thread (could be holding the lock, etc).

Also, after turning off DONT_MIGRATE, you need to check messages (which
enable_notifs() does).  This isn't critical right now, but future
patches will require it.  It's harmless to turn them on before
enable_notif(), since the protection it provides is in the process of
disabling notifs.  Once that is done, you won't get migrated anyways.

Finally, this makes sure we only do the DONT_MIGRATE / notif_disabling
business if we're in _M mode.  This wasn't pairing properly, and we were
getting our thread0 set with DONT_MIGRATE the first time it ran.

8 years agoAdds /dev/null
Barret Rhoden [Tue, 4 Oct 2011 23:30:21 +0000 (16:30 -0700)]
Adds /dev/null

To the ghetto devfs.  Needed by BB for some job management for some

8 years agoKthreads from a different process can restart
Barret Rhoden [Tue, 4 Oct 2011 23:28:21 +0000 (16:28 -0700)]
Kthreads from a different process can restart

Whether or not you want to run kthread bottom halves on a core that is
owned by another process is a matter of policy.  The code can handle it
either way.  If you don't want to, then route your interrupts to LL
cores and put some thought into where you send the __launch_kthread

8 years agoProcess refcnt optimizations
Barret Rhoden [Tue, 4 Oct 2011 21:06:08 +0000 (14:06 -0700)]
Process refcnt optimizations

The __startcore optimization is similar to how it was before, but I
separated it from the owning_proc commit to show that it isn't necessary
and to make it more clear.

The kthread optimization is just a comment for now, since it's not clear
to me which way is best (if any).

8 years agoUpdated memory barrier stuff
Barret Rhoden [Mon, 3 Oct 2011 23:26:28 +0000 (16:26 -0700)]
Updated memory barrier stuff

Minor change to the MCS lock (which did not appear to be a problem in
the assembly) and some talk about the Alpha memory model.

Note that I caught a process deadlocked on an MCS lock in a VM (one
vcore, spinning on a locked lock, no preemptions etc outstanding), so
something out there is probably jacked up.

8 years agocur_proc broken up into owning_proc and cur_proc
Barret Rhoden [Mon, 3 Oct 2011 23:18:34 +0000 (16:18 -0700)]
cur_proc broken up into owning_proc and cur_proc

It's important that our interrup/kmsg handlers do not adjust current out
from under regular kthread code (or whatever was running there before).
This led to splitting up cur_proc.

pcpui->cur_proc (current) is now only what context is loaded, and not
what process owns the core (owning_proc).  This distinction wasn't clear
before.  owning_proc tells us which process to run, and cur_tf tells us
what trapframe to pop/run.

All proc mgmt kmsg handlers now work on owning_proc, instead of some
combination of cur_tf or cur_proc.  cur_tf has no meaning without an
owning proc.  Earlier, we used cur_tf as a signal to run things.  now we
use owning_proc.

Read the documentation for more details.

8 years agoswitch_to() and switch_back() disable interrupts
Barret Rhoden [Mon, 3 Oct 2011 23:15:37 +0000 (16:15 -0700)]
switch_to() and switch_back() disable interrupts

Prevents a potential race with an unlucky IPI that cares about cur_proc.

8 years agocore_request() uses current_tf to return
Barret Rhoden [Thu, 29 Sep 2011 22:02:11 +0000 (15:02 -0700)]
core_request() uses current_tf to return

Instead of manually calling smp_idle(), we just zero current_tf to
trigger abandoning the core.

8 years agoproc_destroy() no longer requires edible refs
Barret Rhoden [Thu, 29 Sep 2011 21:30:38 +0000 (14:30 -0700)]
proc_destroy() no longer requires edible refs

proc_destroy() will return, though it does require handling an IMMEDIATE
kmsg (which PRKM currently does, or you can enable interrupts at some
point) before the kernel returns to userspace (in the event of
proc_destroy() being called on the current_tf).

Note that all return paths need to check interrupts (and RKMs) at some

8 years agoRemoves __proc_kmsg_pending()
Barret Rhoden [Thu, 29 Sep 2011 20:12:01 +0000 (13:12 -0700)]
Removes __proc_kmsg_pending()

Since proc management kmsgs return and are IMMEDIATE, we no longer need
the painful logic of determining that the kernel needs to clean up in
anticipating of a 'stack killing' kmsg.

This means schedule() can run on a core, preempt the _M's vcore running
there, and give out both that vcore and the pcore without worrying about
its own code getting interrupted.

8 years agoProcess mgmt kmsgs are now IMMEDIATE
Barret Rhoden [Thu, 29 Sep 2011 01:37:27 +0000 (18:37 -0700)]
Process mgmt kmsgs are now IMMEDIATE

Instead of ROUTINE.  This means that __startcore, __notify, __preempt,
and __death now are received whenever interrupts are enabled, instead of
only when we PRKM.  This means we no longer need to go out of our way to
get these messages, which will allow me to clean up some proc mgmt code
in future commits.

Note that __launch_kthread() is still ROUTINE, since it does not return.

8 years agoProtects cur_tf by disabling interrupts
Barret Rhoden [Wed, 28 Sep 2011 20:58:06 +0000 (13:58 -0700)]
Protects cur_tf by disabling interrupts

Disable interrupts to keep cur_tf or its contents from changing out from
under you.  This doesn't happen yet, since all kmsgs that change cur_tf
are still routine.

proc_yield() needs to be careful due to concurrent notifications.
proc_yield() is a lot like the other blocks of code that adjust a
process's state on a core (__startcore, __preempt, etc): it should be
run with interrupts disabled to avoid any interleavings.

The changes to _S code (fork/exec) are there just in case we muck with
cur_tf in the future.

8 years agoProc kmsgs now make their changes to cur_tf
Barret Rhoden [Wed, 28 Sep 2011 00:57:47 +0000 (17:57 -0700)]
Proc kmsgs now make their changes to cur_tf

Previously, when a process management kernel message came in, it's
effects would be felt immediately.  A new TF would be popped, etc.  Now,
all of these messages work on the cur_tf, which is the context that will
run when the kernel is done and either idles or reaches a place it can
run a process (like a PRKM site) (which is where we call

Put another way, instead of actually running the context, we just set up
to run it later.  We can then handle other messages (like a __preempt),
which will just change the cur_tf to do what we want when we attempt to
run them (in that case, it will be to do nothing, since __preempt sets
cur_tf to 0).

Also, __startcore and __notify now return.  __launch_kthread still does

8 years agoset_current_tf() no longer sets the local *tf var
Barret Rhoden [Wed, 28 Sep 2011 00:44:24 +0000 (17:44 -0700)]
set_current_tf() no longer sets the local *tf var

Meaning that we only copy out the *tf and set cur_tf, but do not change
tf in the calling function.  The contents are the same, but if something
happens that changes cur_tf's contents, you're still using the same one
you came in on (this will matter for a future commit).

The old style had a bug too.  If a kthread migrated, when it returned up
its stack and it looked at *tf, it would point to the cur_tf of possibly
another core (which is not what we want).  We want to point to the
original TF we came in on, so we can decide if we should return to the
kernel or not (and if we do, we just pop that TF).

Sparc and RISCV probably need a little work.  I put warns in there to
catch IRQs being enabled.  set_current_tf() probably needs to be called
more often too (like when handling other traps).

8 years agox86 interrupts are disabled til cur_tf is set
Barret Rhoden [Tue, 27 Sep 2011 21:27:36 +0000 (14:27 -0700)]
x86 interrupts are disabled til cur_tf is set

Whenever we're in the kernel with interrupts enabled, if there is a
process that is running (or should be running) on the core, current and
cur_tf should both be set.  On the first time into the kernel (syscall,
trap, etc) from userspace, cur_tf needs to get set.

Also remember that a 0'd cur_tf means that we should no longer run a
context (which happens after a kthread returns from blocking if the
process is no longer present).  In those situations, it is still okay to
have current set.  That is just which process's context we have loaded.

8 years ago__preempt and __death now return
Barret Rhoden [Tue, 27 Sep 2011 00:05:48 +0000 (17:05 -0700)]
__preempt and __death now return

They had been 'stack-smashing' KMSGs, which forced them to be routine
and made it hard to receive them from certain fictional contexts (such
as schedule() trying to preempt the core it runs on from the process
running there.).

8 years agox86 kernel messages go through irq_handler()
Barret Rhoden [Mon, 26 Sep 2011 23:36:18 +0000 (16:36 -0700)]
x86 kernel messages go through irq_handler()

Previously, __kernel_message() was getting called directly from the
assembly routines.  Now, it goes through irq_handler() like all other
traps.  While it is slightly slower, it will go through the same path,
including proc_restartcore() on the way back out.

8 years agoResolves race with __unmap and __map_vcore()
Barret Rhoden [Mon, 26 Sep 2011 20:49:06 +0000 (13:49 -0700)]
Resolves race with __unmap and __map_vcore()

When you send a __preempt message (or __death), the unmapping happens on
the destination core.  If you were to try and give out the vcore
immediately, the old mapping would still be there.  This is a problem
that came about when we switch to using vcore lists.

Now we'll spin til the remote core unmaps.  This means that we can't
have scheduler code (or whatever) try to preempt its current pcore's
vcore and then try to give out that same vcore somewhere else without
take the stack-smashing __preempt message.  No one does this yet, since
our scheduler() only runs on LL cores.

8 years ago_S processes properly map/unmap vcore 0
Barret Rhoden [Mon, 26 Sep 2011 20:32:01 +0000 (13:32 -0700)]
_S processes properly map/unmap vcore 0

To make __death easier, vcore 0 is mapped to whatever pcore the process
is running on in _S.  We were a bit lazy about unmapping it.

8 years agoCleaned up memory barrier usage (XCC)
Barret Rhoden [Sun, 25 Sep 2011 23:16:34 +0000 (16:16 -0700)]
Cleaned up memory barrier usage (XCC)

Cleaned up the use of memory barriers in our shared memory
synchronization code (event stuff, locking stuff, etc).  Check out the
documentation if you plan to write any concurrent, shared memory code
that doesn't use locking.

8 years agoFixes disable_kevent()
Barret Rhoden [Tue, 20 Sep 2011 21:50:14 +0000 (14:50 -0700)]
Fixes disable_kevent()

Need to be more careful with deregistering for events (don't free the
ev_q if it is possible the kernel is still sending messages).

No one uses it yet (or ever), so it's not a big deal.

8 years agoProcesses can yield the entire process
Barret Rhoden [Sun, 18 Sep 2011 02:44:40 +0000 (19:44 -0700)]
Processes can yield the entire process

When yielding your last vcore, you'll now transition to WAITING, and be
woken up when an event comes in.  If you ever want to wake back up,
you'll need to have at least one ev_q marked FALLBACK/INDIR, and have
that ev_q trigger.

We don't support yielding just to be nice.  If you yield, you need an
event to wake you.  Otherwise, just do your work.

This also changes the ksched to be able to handle a RUNNABLE_M, albeit
not in a perfect manner.

8 years agoManager change: Hit Shift-G to get to the monitor
Barret Rhoden [Sun, 18 Sep 2011 02:36:35 +0000 (19:36 -0700)]
Manager change: Hit Shift-G to get to the monitor

For now, the manager will just spin looking for work.  Interrupt it with
a shift-g to get into the monitor.  Believe it or not, this is an
improvement over the old style, though it ideally wouldn't need to spin
looking for work either.

8 years agopthread_join() no longer spins
Barret Rhoden [Sun, 18 Sep 2011 01:29:35 +0000 (18:29 -0700)]
pthread_join() no longer spins

It'll now wait on the join_target, which will wake it up when it exits
(depending on how the atomic_swap race went).

8 years agoev_q option VCORE_MUST_RUN (XCC)
Barret Rhoden [Sat, 17 Sep 2011 00:59:44 +0000 (17:59 -0700)]
ev_q option VCORE_MUST_RUN (XCC)

Some event queues need to have their alerts sent to a vcore that will
definitely run (as of the time alert_vcore() was called), and not just a
can_rcv_msg.  The one (and probably only) example of this is the
preempt_msg ev_q.  Simply put, you can't send the preempt message about
a given vcore to that vcore, which could happen without this option.

Note that the vcore that receives this message can be yielding or
getting preempted or whatever - so long as it wasn't the vcore that
was preempted (and thus generated the preempt message) (unless it will
be forced to run in the ultimate_fallback area).

Even if you want to just poll your preeempt ev_q (and not want an
INDIR), you still need the MUST_RUN flag to make sure the IPI gets
there.  If you don't want an IPI either, you'll have issues with locking
in uthread context and with preemption response latency.

8 years agoAllow ev_qs to not have INDIR throttling (XCC)
Barret Rhoden [Fri, 16 Sep 2011 23:14:43 +0000 (16:14 -0700)]
Allow ev_qs to not have INDIR throttling (XCC)

As a reminder, ev_qs normally will only have one INDIR event sent at a
time (roughly), and future INDIRs/IPIs (alerts) won't be sent until the
main ev_q has been tended to.  This patch allows ev_qs to opt out.

The only use for this I forsee is the preemption ev_q, since the
original INDIR might be sent to a preempted vcore.