8 years agodon't dereference PC during trap entry
Andrew Waterman [Tue, 15 May 2012 12:06:47 +0000 (05:06 -0700)]
don't dereference PC during trap entry

8 years agoon risc-v, emulate keyboard input using an alarm
Andrew Waterman [Sat, 12 May 2012 00:56:25 +0000 (17:56 -0700)]
on risc-v, emulate keyboard input using an alarm

8 years agoon risc-v, initialize core_stacktops; fix halt
Andrew Waterman [Sat, 12 May 2012 00:55:30 +0000 (17:55 -0700)]
on risc-v, initialize core_stacktops; fix halt

halt needs ints enabled!

8 years agorisc-v supervisor mode updates
Andrew Waterman [Fri, 11 May 2012 04:28:54 +0000 (21:28 -0700)]
risc-v supervisor mode updates

8 years agorisc-v boot process bugfixes
Andrew Waterman [Tue, 24 Jan 2012 02:11:52 +0000 (18:11 -0800)]
risc-v boot process bugfixes

8 years agobig speedups for memcpy/memset
Andrew Waterman [Tue, 24 Jan 2012 02:10:19 +0000 (18:10 -0800)]
big speedups for memcpy/memset

8 years agoWants top of stack, not bottom...
Kevin Klues [Tue, 1 May 2012 02:43:45 +0000 (19:43 -0700)]
Wants top of stack, not bottom...

8 years agoproc_wakeup() replaces schedule_scp()
Barret Rhoden [Wed, 25 Apr 2012 02:17:10 +0000 (19:17 -0700)]
proc_wakeup() replaces schedule_scp()

All places wanting to make sure a proc runs now can spam proc_wakeup().
This commit makes new-proc calls and yield-related calls that aren't
already in the ksched call proc_wakeup().

This should also have cleaned up the last of the deadlockable lock
orderings (ever since we had proc_destroy in the ksched, it was possible
to deadlock during a concurrent sched_scp()).

Finally, this just gets rid of schedule_scp(), which was in no way
related to the __schedule_scp().  Ugh.

8 years agoproc_wakeup() - spammable and starts in the ksched
Barret Rhoden [Wed, 25 Apr 2012 00:16:33 +0000 (17:16 -0700)]
proc_wakeup() - spammable and starts in the ksched

Need to have the ksched lock held while waking up so that we atomically
wake up and alert the ksched (via the callbacks).  If we grab the ksched
lock after the proc lock, we can deadlock.  If we unlock the proc lock
before telling the ksched, we could have another core try a
proc_destroy(), and the ksched would destroy it after the old
__proc_wakeup, but before the ksched finds out about the wakeup.  So we
enter the call via the ksched, and grab its lock first, like with

Note that excessive spamming of proc_wakeup would hurt the ksched a bit
(coarser lock than all the proc locks), but all cases expect it to be a
necessary call.  For instance, the event code all peaks at the state of
p, making sure it was WAITING before bothering the ksched.  We'd have
excessive calls only if two or more cores tried that at the same time
and all saw WAITING before the ksched called __proc_wakeup to change it

8 years agoproc_change_to_m() is now a scheduler function
Barret Rhoden [Mon, 23 Apr 2012 23:16:30 +0000 (16:16 -0700)]
proc_change_to_m() is now a scheduler function

Due to issues of lock ordering.  We need to atomically change process
state and tell the ksched about it.  The way to do this without
deadlocking is to grab the ksched lock first.  Ultimately, we're going
to end up tying proc and ksched code together a bit, where proc code
does the bidding of sched code.

8 years agoProc refcnt no longer needs '+1 for existing'
Barret Rhoden [Fri, 20 Apr 2012 21:26:50 +0000 (14:26 -0700)]
Proc refcnt no longer needs '+1 for existing'

This reference is managed by the kernel scheduler.

8 years agoKernel scheduler tracks procs 'cradle to grave'
Barret Rhoden [Fri, 20 Apr 2012 21:20:02 +0000 (14:20 -0700)]
Kernel scheduler tracks procs 'cradle to grave'

Previously, the ksched would only know about processes whenever it
needed to make a decisions.  For MCPs, this was always.  For SCPs, it
was only when runnable.  Now it knows about them from register_proc()
(called during proc creation) until proc_destroy(), which recently
became a ksched function (this was part of the motivation for that).

This also allows the ksched to not need to poll the queues to detect if
someone is dying or not.  That messiness is gone, and the ksched just
gets called for proc_destroy().

8 years agoFixes TAILQ usage in arsc.c
Barret Rhoden [Fri, 20 Apr 2012 20:24:21 +0000 (13:24 -0700)]
Fixes TAILQ usage in arsc.c

8 years agoproc_destroy() now starts in the ksched
Barret Rhoden [Fri, 20 Apr 2012 00:07:32 +0000 (17:07 -0700)]
proc_destroy() now starts in the ksched

This allows the kernel scheduler to lock first, which helps with some
other lock-ordering trickery we do, and allows the ksched to do
additional cleanup, other than just receiving the idle cores.

Additionally, we have less of a need for put_idle_cores() (the only
caller is an old preemption function, which might get sucked into the
ksched soon).

8 years agoTracks state properly for paused uthreads
Barret Rhoden [Mon, 23 Apr 2012 22:56:39 +0000 (15:56 -0700)]
Tracks state properly for paused uthreads

Pthreads uses a state for threads stopped from below (currently only for
preemptions (either pending or recoverery)).

Uthreads just tracks them as NOT_RUNNABLE.

This patch also provides a helper for the three usages of
copyout/sched_ops->paused.  Depending on what 2LSs need, we might
provide copyout directly again, but for now we'll leave it as an
internal helper.

8 years agoPthread join/exit/yield use the uth_yield func ptr
Barret Rhoden [Wed, 18 Apr 2012 22:23:50 +0000 (15:23 -0700)]
Pthread join/exit/yield use the uth_yield func ptr

Instead of passing info via states and flags, we pass info via the
function pointer, like all other uses of uthread_yield.  This allows us
to clean up join/exit/yield a bit.

Now, all yield paths touch the 2LS, and in those callbacks the 2LS sets
the pthread's state, which it then sees in pth_thread_runnable() later

Fun note: there was a cryptic comment above pthread_exit():

/* This function cannot be migrated to a different vcore by the
userspace scheduler.  Will need to sort that shit out. */

I think that was talking about the old version of exit, back when there
was no uthread library and when exit and yield had separate (but highly
similar) functions for getting into vcore context.

If you're curious, check it out.  It was from a commit 2 years and a day
ago.  (f35c3ed435fd).

8 years agouthread_yield() takes a func* and arg
Barret Rhoden [Wed, 18 Apr 2012 21:34:23 +0000 (14:34 -0700)]
uthread_yield() takes a func* and arg

We had a variety of ways to pass info across the uth_yield->__uth_yield
boundary.  Instead of doing all of that, we just tell uthread_yield to
run a function when it gets to vcore context.

The purpose of this function is to somehow deal with the uthread and its
reason for blocking.  This could be because it blocked on a syscall, or
perhaps for some 'external' reason, such as blocking on a mutex.  This
setup allows the mutex code to not be aware of 2LS-particulars, though
it still needs to know about uthreads.  This will help us with mutexes
and libraries that aren't bound to a particular 2LS, as well as simplify
many different mechanisms (like the pth specific stuff for join/exit).

8 years ago2LS thread_blockon now takes the uthread*
Barret Rhoden [Wed, 18 Apr 2012 20:58:12 +0000 (13:58 -0700)]
2LS thread_blockon now takes the uthread*

Keeps it in line with the other 2LS thread ops.  Need to do some void*
trickery for upcoming patches, and because C is picky about void* vs
struct xme* as parameters in function pointers.

8 years agoPthread state tracking
Barret Rhoden [Wed, 18 Apr 2012 20:52:12 +0000 (13:52 -0700)]
Pthread state tracking

We don't do anything smart in pth_thread_runnable(), but that's where
you can make different decisions on what to do with the thread based on
why it slept/woke up.

All yielding/blocking paths will touch the 2LS (pthread in this case),
and that is where the 2LS can record info (states) for later

8 years agoPthread code calls uthread_runnable() consistently
Barret Rhoden [Wed, 18 Apr 2012 19:23:53 +0000 (12:23 -0700)]
Pthread code calls uthread_runnable() consistently

We were doing a mix of calling the schedop directly and indirectly
(uth_runnable).  This is a little slower, but all paths involving waking
up a uthread go through the same code now.  External code (e.g. mutex
libraries) will use uthread_runnable().

8 years agoUthread code no longer tracks detailed states
Barret Rhoden [Wed, 18 Apr 2012 19:18:16 +0000 (12:18 -0700)]
Uthread code no longer tracks detailed states

Uthread code only cares about RUNNING vs NOT_RUNNING, and this is only
to catch bugs.  The 2LS is responsible for any state it wishes to track,
such as the diff btw blocking on a syscall, joining, exiting, blocking
on a mutex, whatever.

8 years agoFake tcgetattr() to allow busybox to do line edits
Barret Rhoden [Tue, 10 Apr 2012 22:34:10 +0000 (15:34 -0700)]
Fake tcgetattr() to allow busybox to do line edits

This fakes the tcgetattr() call with hard-coded answers from a linux
machine.  This is enough to get busybox to do line editing.  It also
allows us to remove the devfs stdin hacks, and add new ones to stdout!

I added my busybox config to tools/.  If you don't want to use mine, be
sure to turn on FEATURE_EDITING in yours to get backspace working on the
command line.  I'll update it periodically.

8 years agoConfig option to turn off backspace for printk
Barret Rhoden [Tue, 10 Apr 2012 23:00:01 +0000 (16:00 -0700)]
Config option to turn off backspace for printk

If you set CONFIG_PRINTK_NO_BACKSPACE, then the console won't try to go
backwards when you send a \b or \x7f, and will print ^H instead.

8 years agox86 console and readline() honor 0x7f
Barret Rhoden [Tue, 10 Apr 2012 21:02:10 +0000 (14:02 -0700)]
x86 console and readline() honor 0x7f

Qemu sends an 0x7f (DEL) via serial when you hit backspace, and readline
was ignoring it.  Not that readline matters much, but it'll now treat
the 0x7f like a backspace (\b, 0x8).

Note that \b and \x7f get sent directly to userspace, and it is up to
them to parse that.  This means that the KB (qemu and real world)
backspace is sending \b, real-world serial (at least my minicom) is
sending \b, but qemu serial sends \x7f.

Keymaps, terminal settings, and what programs expect are all huge pains
in the ass.

8 years agoAdded calls neessary to get lithe running on ROS
Kevin Klues [Tue, 10 Apr 2012 01:13:22 +0000 (18:13 -0700)]
Added calls neessary to get lithe running on ROS

This also includes some nice helper macros for accessing
and modifying TLS variables in other contexts without
having to remember the entire sequence of things you need
to do to make this happen.

8 years agoAdd symlink of parlib->(current_directory) in include install path
Kevin Klues [Tue, 10 Apr 2012 01:11:41 +0000 (18:11 -0700)]
Add symlink of parlib->(current_directory) in include install path

This allows us to access all header files installed on our system
via either <parlib/*> or just regular <*>

8 years ago__ros_scp_simple_evq should be declared as extern in syscall.h
Kevin Klues [Tue, 10 Apr 2012 01:10:56 +0000 (18:10 -0700)]
__ros_scp_simple_evq should be declared as extern in syscall.h

8 years agoAllow the headers to be used when compiling c++ programs
Kevin Klues [Tue, 10 Apr 2012 01:09:49 +0000 (18:09 -0700)]
Allow the headers to be used when compiling c++ programs

8 years agoFixes x86 LAPIC_ISR/IRR reading
Barret Rhoden [Mon, 9 Apr 2012 21:03:10 +0000 (14:03 -0700)]
Fixes x86 LAPIC_ISR/IRR reading

The ISR and IRR are not bitmaps, but are 8 32-bit registers spaced every
16 bytes in the LAPIC address space.  Thanks

8 years agoStops calling ros_debug in place of printf
Barret Rhoden [Sat, 7 Apr 2012 01:32:50 +0000 (18:32 -0700)]
Stops calling ros_debug in place of printf

Uthread code (not glibc code) was calling ros_debug.  We probably don't
need to do this anymore.  And the whole 'appserver redirection' doesn't
need to happen at all, since writing to stdout will just be a printk
under the hood.

8 years agoFixes mhello, soon to be destroyed
Barret Rhoden [Sat, 7 Apr 2012 01:27:11 +0000 (18:27 -0700)]
Fixes mhello, soon to be destroyed

mhello is pretty ugly, and continues to get uglier as uthread code
becomes more capable.  This keeps it alive a bit longer, allowing it to
deal with blocking syscalls (I have mmap() blocking in some of my
tests).  mhello will just spin til the syscall is done.

8 years agoFixes issues with proc_yield and preempt_pending
Barret Rhoden [Sat, 7 Apr 2012 01:18:38 +0000 (18:18 -0700)]
Fixes issues with proc_yield and preempt_pending

preempt_pending has been neglected a little with some of the recent
kernel/user core management code.

This fix stops the kernel from aborting a yield when a process has a
preempt pending *and* some race happened in userspace where amt_wanted
wasn't decreased.

This also decreases the chance of that race by keeping userspace from
decrementing its amt_wanted when it is being nice (preempt pending).

8 years agox86: handles spurious IRQs from the PIC and LAPIC
Barret Rhoden [Thu, 5 Apr 2012 19:34:51 +0000 (12:34 -0700)]
x86: handles spurious IRQs from the PIC and LAPIC

I put printks in there, since I'm curious to see if this even happens
and haven't been able to test it yet.  Once it happens, we'll turn off
the printks.

Note things get a little confusing when talking about IRQ numbers.
The kernel's IRQs are mapped 32 (PIC1_OFFSET) slots higher than
hardware's IRQs.  For instance, what the PIC things of as IRQ0 comes in
to irq_handler as 32.  When talking to the PIC/hardware, we use their
numbers.  Devices, like the Keyboard on IRQ0 need to get registered at 0
+ PIC1_OFFSET.  Might clean this up over time, but there's no getting
around the offset/remapping.

Also, make sure you never tell the LAPIC/IOAPIC to use a PIC IRQ if you
are also using the PIC; the kernel won't be able to tell the difference.
I might be able to change this, but it's not a real problem.

8 years agoFixes bug with reading LAPIC ISR/IRR
Barret Rhoden [Thu, 5 Apr 2012 00:19:29 +0000 (17:19 -0700)]
Fixes bug with reading LAPIC ISR/IRR

Not sure what I was thinking there.

Be sure to read the documentation if you're using ipi_is_pending().

8 years agoPIC helper functions to read the ISR, IRR, and IMR
Barret Rhoden [Wed, 4 Apr 2012 23:40:39 +0000 (16:40 -0700)]
PIC helper functions to read the ISR, IRR, and IMR

Remember, bit 2 (0x4) will be high on the ISR/IRR when any of the high 8
IRQs are high, due to the chaining of the PICs.  Likewise, the IRR will
show an IRQ when it is masked - the chip will simply never send it.

Also note that these only apply for interrupts coming in via the PIC,
and not the IOAPIC/LAPIC.  You'll need to check the LAPIC for its

8 years agox86 register IRQ handlers for devices that exist
Barret Rhoden [Wed, 4 Apr 2012 00:39:43 +0000 (17:39 -0700)]
x86 register IRQ handlers for devices that exist

Instead of just blindly registering anything that could exist.

Note that we can only register one 'device' per IRQ, so if you have both
COM1 and COM3 (for example, and let alone other devices sharing IRQs),
then the last one to register will get serviced.

8 years agox86 console/serial cleanup
Barret Rhoden [Wed, 4 Apr 2012 00:19:18 +0000 (17:19 -0700)]
x86 console/serial cleanup

Console devices (KB, serial) now have structs associated with them,
which we can later register with interrupt drivers.

Input devices can now get -1 (0xff) and 0.  Not a big deal for the
keyboard, but the serial device might actually get those 'chars' at some

We also look for and initialize COM2, COM3, and COM4, as well as detect
the type of serial device.  For now, our output spams all of these (if

8 years agoFixes serial interrupt enabling on x86 hardware
Barret Rhoden [Tue, 3 Apr 2012 18:24:40 +0000 (11:24 -0700)]
Fixes serial interrupt enabling on x86 hardware

Qemu didn't need the bit set, but our desktops (16550(A)s) do.  Nice to
know that my old IO Ports list called that bit "auxiliary
user-designated output 2".  My bad for clobbering that bit (that was on
by default) when attempting to set the flow control.

8 years agoKsched preempts SCPs on schedule() calls
Barret Rhoden [Fri, 30 Mar 2012 21:24:15 +0000 (14:24 -0700)]
Ksched preempts SCPs on schedule() calls

Also will check for SCPs to run when the core has nothing to do
(cpu_bored()), as opposed to waiting til the next timer tick.

8 years agoFixes static binary init issue (XCC)
Barret Rhoden [Fri, 30 Mar 2012 03:02:22 +0000 (20:02 -0700)]
Fixes static binary init issue (XCC)

Can't call vcore_event_init() before the other C runtime inits (runs
into issues with not having TLS initialized, which vcore_event_init()
needs (some malloc checks/init stuff)).

Rebuild glibc, copying over at least start.c.

8 years agoKernel now halts when there is no work
Barret Rhoden [Sat, 24 Mar 2012 01:39:30 +0000 (18:39 -0700)]
Kernel now halts when there is no work

We had been polling in a variety of places.  This takes away the last
one: spinning in the manager().  Now, the manager doesn't get called
much (it gets called once, and that should be it).

Note that we still poll in the monitor(), which you can always get to
via 'G' (the call of the giraffe).  (so long as interrupts are enabled,
you're not stuck in a loop, etc).

8 years agoReading from /dev/stdin will block
Barret Rhoden [Sat, 24 Mar 2012 01:17:37 +0000 (18:17 -0700)]
Reading from /dev/stdin will block

We read one char at a time now (per syscall).  busybox asks for up to
1023, interestingly enough.  It also doesn't know it is a tty yet, so
I'm sure its behavior will change.  Note that we already fake a bunch of
TTY related things.  Not sure who is supposed to echo the key btw...

And we don't do anything like sending SIGINT or control characters.

8 years agoKeyboard/char input buffering and irq handling
Barret Rhoden [Sat, 24 Mar 2012 01:08:44 +0000 (18:08 -0700)]
Keyboard/char input buffering and irq handling

Each arch needs to have interrupt handlers for their console input that
call the appropriate routine kmsgs, which will handle putting the char
in the console buffer.  Take a look at x86's.  If this is somehow
fundamentally incompatible with RISCV, let me know.

This techincally adds to a kernel header, but no one should need to
rebuild anything.

8 years agosys_trywait() now blocks
Barret Rhoden [Wed, 21 Mar 2012 20:01:15 +0000 (13:01 -0700)]
sys_trywait() now blocks

We actually need a real wait/waitpid() call, which will also allow us to
cleanup glibc's waitpid() and fork() calls.  For now, this will allow us
to have bb block on its children, instead of spinning.

8 years agoGlibc syscalls now block properly (XCC)
Barret Rhoden [Wed, 21 Mar 2012 19:50:38 +0000 (12:50 -0700)]
Glibc syscalls now block properly (XCC)

Glibc wasn't calling out to the proper blockon call.  We deal with this
by having a default blockon, defined in glibc's syscall.c, that
degenerate SCPs can use.  Once they init enough and have access to
parlib symbols, they switch the function ptr to use the 'real' blockon,
which uses glibc's default one for SCPs.

Rebuild glibc and anything in userspace.

8 years agoKernel can detect degenerate SCPs (XCC)
Barret Rhoden [Wed, 21 Mar 2012 19:44:40 +0000 (12:44 -0700)]
Kernel can detect degenerate SCPs (XCC)

Meaning, the SCP can't go into vcore context yet (very early in the life
of a process).  Once userspace turns off the VC_SCP_NOVCCTX flag, the
kernel will put the SCP into vc ctx, when appropriate (notified).

8 years agoSCPs can sleep on events (XCC)
Barret Rhoden [Fri, 16 Mar 2012 19:39:23 +0000 (12:39 -0700)]
SCPs can sleep on events (XCC)

If single-core processes yield that aren't 'being nice', they will block
waiting for an event.  Otherwise, the process is simply giving up the
processor for someone else, even though it has work to do.

The meaning of being_nice differs between SCPs and MCPs.  MCPs will
never give up if they have work to do, unless they think a preemption is
coming in.  Might consider getting rid of the whole SCP 'sched_yield'
approach (arguably, it's the kernel's job) for _Ss, but whatever.

Rebuild your cross compiler, making sure to replace sched_yield.c in
your glibc directory.  Otherwise, sched_yielders (like busybox) will
accidentally block.

8 years agoSCPs can register ev_qs for syscalls (XCC)
Barret Rhoden [Fri, 16 Mar 2012 00:09:22 +0000 (17:09 -0700)]
SCPs can register ev_qs for syscalls (XCC)

Right now, they just yield and get restarted right away, while waiting
for the event (and actually they just check the sysc flag).  Future
patches will have them become WAITING.

Rebuild your cross compiler/userspace.

8 years agoRemoved unnecessary/fauly assert
Barret Rhoden [Thu, 15 Mar 2012 20:15:46 +0000 (13:15 -0700)]
Removed unnecessary/fauly assert

This safely trips if SCPs kthread and yield in a loop while waiting.
Here's what happens:
1) process causes a kthread (sys_block)
2) process yields, leaving the core (no longer current or owning)
3) timer interrupt goes off and unblocks the kthread, which sets current
(but not owning)
4) kthread does not clear current - that's done in the
restartcore/smp_idle path.
5) ksched's timer tick goes off, causing its work to be done in a
routine kmsg
6) proc_restartcore executes the kmsg before abanonding
&) ksched kmsg calls proc_run_s

We actually don't want to abandon early - it's better to stay in that
context til after we check messages (avoid an extra TLB flush).  The old
assert was probably important a long time ago (back when owning_proc and
current were the same thing), or at least a "this is weird, check it

Note the process is current, but not the owning proc.

8 years agoFixes bug in event headers (XCC)
Barret Rhoden [Thu, 15 Mar 2012 18:57:57 +0000 (11:57 -0700)]
Fixes bug in event headers (XCC)

Has been around since 16a868, haven't seen it hit yet, though it might
have been masking other bugs.

8 years agoEvent delivery to _S procs
Barret Rhoden [Thu, 15 Mar 2012 02:59:15 +0000 (19:59 -0700)]
Event delivery to _S procs

If an _S registers an ev_q, the kernel event delivery system will send
events to the process.  Events will go to vcore0's public mbox,
regardless of ev_flags, so long as the proc is an _S.  Processes can set
up ev_qs for whatever they want later, and then when they are MCPs, the
flags will kick in (and you don't have to change things).  That is how
processes should set up ev_qs for POSIX signals.

The code can also handle the process being descheduled, and the _S will
pop into vcore context when it starts up (if it wasn't already in vcore
context when it was stopped).

Receiving an event also should wake an _S, rescheduling it, though that
hasn't been tested yet (_Ss don't WAIT yet).

8 years agoAll apps now must link against parlib (XCC)
Barret Rhoden [Tue, 13 Mar 2012 21:21:29 +0000 (14:21 -0700)]
All apps now must link against parlib (XCC)

Glibc calls out to a low-level parlib function (vcore_event_init(), used
to enable event delivery of *all* processes) that needs to be linked in
to every binary, regardless of whether or not the process will be an

In addition to linking against parlib, applications need to be built
with " -u force_parlib_symbols ", which forces the linker to find the
strong version of symbols weakly used in glibc's start.c.

All test code has these flags/libraries set, but external apps need it
too.  Busybox, in particular, needs the patch in tools/patches to force
linking with parlib.

Rebuild your cross compiler, and install-libs (esp before rebuilding
busybox).  At a minimum, you need to copy start.c to the glibc-2.14.1/
tree and rebuild.  If that doesn't make sense, then just do a full
rebuild of glibc.

8 years agouthread_vcore_entry() can handle not having a 2LS
Barret Rhoden [Tue, 13 Mar 2012 00:38:34 +0000 (17:38 -0700)]
uthread_vcore_entry() can handle not having a 2LS

_Ss that never link in a 2LS will pop up in vcore_entry() when receiving
events.  This patch allows them to restart current_uthread - sort of a
'default 2LS op'.  I thought of making it an actual member of
default_2ls_ops, but I didn't want 2LS writers to think it is actually a
real default choice for them.  It's just to make _S code work.

8 years agouthread_slim_init()
Barret Rhoden [Tue, 13 Mar 2012 00:33:34 +0000 (17:33 -0700)]

Allows the uthread code to manage thread0 in the absence of a 2LS.
Eventually, all processes will call uthread_slim_init(), which will be
useful for event delivery to _Ss.  Then processes that will become MCPs
will call uthread_lib_init and set up the full system (using 2LS
threads, instead of just struct uthreads).

8 years agoproc_yield() will abort if they want the core
Barret Rhoden [Mon, 12 Mar 2012 20:09:29 +0000 (13:09 -0700)]
proc_yield() will abort if they want the core

This saves the kernel scheduler the effort of reallocating the core.
This could trigger if there was a concurrent vcore_requester, though it
should be pretty rare.

8 years agoEvents that wake processes poke the ksched
Barret Rhoden [Sun, 11 Mar 2012 17:47:57 +0000 (10:47 -0700)]
Events that wake processes poke the ksched

Previously, the processes would wake up, but wouldn't tell the ksched.
The ksched would have to notice on its next tick, which could be 10ms
away (current ksched), or never (tickless kscheds).  For block_test,
which sleeps 5ms per loop, without this patch, you'd wait close to 5ms
til the next timer tick.  This patch cuts down block test to about
5.5sec (poke to run when avail), instead of 10sec (run on timer tick).

Unblocking is a big enough deal that it got its own callback, but we're
not using it for anything other than a RES_CORES poke right now.

8 years agoput_idle_core() called without the proc_lock
Barret Rhoden [Fri, 9 Mar 2012 22:18:54 +0000 (14:18 -0800)]
put_idle_core() called without the proc_lock

Minor changes to yield and preempt, we give back the core after
unlocking (like with previous patches).

Now, ksched's should be free to do whatever they want in put_idle.

8 years ago__proc_give_cores() no longer makes a callback
Barret Rhoden [Fri, 9 Mar 2012 21:26:42 +0000 (13:26 -0800)]
__proc_give_cores() no longer makes a callback

The put_idle_cores() callback could deadlock if kscheds ever did smart
things in that function.

Kernel schedulers can do more advanced things than in core_request().
For instance, one could attempt to give some cores to one proc, and if
that fails, just give the same pc_arr to the next in line (assuming it
needs them).  Right now, we don't support partial allocations, mostly
because it's the ksched'd job to know what you want and give no more
than that amount.

8 years agoRemoves the dumb version of take_allcores
Barret Rhoden [Fri, 9 Mar 2012 19:20:58 +0000 (11:20 -0800)]
Removes the dumb version of take_allcores

Part of a move to not call ksched trigger functions while holding the
proc_lock.  Until we do that, the ksched can (and will) deadlock if it
tries to do anything smart in the callbacks (like give cores to a

8 years agoKsched interface cleanup, smp_idle() cleanup
Barret Rhoden [Thu, 8 Mar 2012 23:28:35 +0000 (15:28 -0800)]
Ksched interface cleanup, smp_idle() cleanup

Moves the logic about what a core should do when having nothing to do to
the ksched.

8 years agoFixes bug with abort_halt()
Barret Rhoden [Tue, 6 Mar 2012 01:47:46 +0000 (17:47 -0800)]
Fixes bug with abort_halt()

Could PF when dereferencing EIP when the page hadn't been populated yet
(like right after a sys_fork()).

8 years agoKsched is interrupt driven
Barret Rhoden [Mon, 5 Mar 2012 23:47:08 +0000 (15:47 -0800)]
Ksched is interrupt driven

schedule() is called from timer ticks, every 10msec.  It's just an
example of what any ksched can do.

8 years agoAlarm interface for incremental alarms
Barret Rhoden [Mon, 5 Mar 2012 23:45:11 +0000 (15:45 -0800)]
Alarm interface for incremental alarms

So you can reset an alarm for a new time, relative to the last alarm
(compared to 'relative to now').  This is useful if you want a periodic
tick, where you care about how much time passes.

Though you can always run into issues where you try to tick too fast for
the system to keep up, and you'll start to fall behind (setting alarms
for the past, etc), so anything serious is likely to need a more serious

8 years agoFCFS ksched gives out what it can
Barret Rhoden [Mon, 5 Mar 2012 22:24:03 +0000 (14:24 -0800)]
FCFS ksched gives out what it can

Previously, it would only give you cores if it could fully meet the
request (amt_min style) - now it just gives out what it can.

Less dumb, but still really dumb.

8 years agoMinimizes proc_locking in core_request
Barret Rhoden [Fri, 2 Mar 2012 22:54:21 +0000 (14:54 -0800)]
Minimizes proc_locking in core_request

__core_request() now needs the ksched lock held, instead of using the
proclock.  This does mean that you can have two concurrent core_requests
for different processes, but since the bulk of core_request is really
just dealing with the ksched's structures, this style makes more sense.

Also gets rid of the old return value of core_req, since we don't use

8 years agoschedule() only hands out to _S if it's an LL core
Barret Rhoden [Fri, 2 Mar 2012 21:04:12 +0000 (13:04 -0800)]
schedule() only hands out to _S if it's an LL core

Not that schedule() is called on CG cores, but it might in the future.
Also, CG vs LL is going to be a ksched controlled thing (for the most

8 years agoRemoves resource.c/h
Barret Rhoden [Fri, 2 Mar 2012 01:16:47 +0000 (17:16 -0800)]
Removes resource.c/h

Moves the only real functionality into the ksched (which will help with
the ghetto proc_wants_cores() calls).  core_request() is really just
"proc wants cores, find cores, give cores", which is the scheduler's

8 years agoRemoves sys_resource_req (XCC)
Barret Rhoden [Thu, 1 Mar 2012 00:30:44 +0000 (16:30 -0800)]
Removes sys_resource_req (XCC)

Reinstall your kernel header (or the kernel will catch the invalid

8 years agoUserspace reboot helper
Barret Rhoden [Thu, 1 Mar 2012 00:19:19 +0000 (16:19 -0800)]
Userspace reboot helper

With correct accents.

8 years agoBreaks up sys_resource_req (XCC)
Barret Rhoden [Thu, 1 Mar 2012 00:17:07 +0000 (16:17 -0800)]
Breaks up sys_resource_req (XCC)

sys_resource_req() did both a transition to _M as well as poking the
ksched.  This splits that into two separate syscalls.  At this point,
the way to do resource requests is to write into procdata and optionally
poke the ksched.

Reinstall your kernel header.

8 years agoResource requests use the procdata interface
Barret Rhoden [Wed, 29 Feb 2012 08:19:28 +0000 (00:19 -0800)]
Resource requests use the procdata interface

Also clarifies the semantics of vcore_request() (still using the "n more
than i currrently have", though that may change in a future patch).

Also removes the extra check/loop in vcore_request() (handle_it), to
make the pattern a little more clear.  The handle_it path was in case we
had more requests while we were in sys_res_req, and merely avoided
unlocking/relocking, which isn't a big deal.

Still using the syscall for the mcp transition or poking of the ksched.

8 years agoMoves resource requests to procdata (XCC)
Barret Rhoden [Wed, 29 Feb 2012 00:39:09 +0000 (16:39 -0800)]
Moves resource requests to procdata (XCC)

Userspace doesn't use it yet, but resource requests are via procdata
instead of a syscall.  Resource grants are in procinfo.

Reinstall your kernel headers / rebuild parlib apps.

8 years agoproc_yield() no longer messes with amt_wanted
Barret Rhoden [Tue, 28 Feb 2012 23:24:07 +0000 (15:24 -0800)]
proc_yield() no longer messes with amt_wanted

The only time the kernel will mess with it (for now) is in
__proc_wakeup(), so that the ksched will give them something.

8 years agoKsched tracks MCPs for their entire lifetime
Barret Rhoden [Tue, 28 Feb 2012 21:23:41 +0000 (13:23 -0800)]
Ksched tracks MCPs for their entire lifetime

_Ss still work like traditional schedulers - we tell the ksched about
them when they are runnable.  _Ms are always tracked, regardless of
running or not.

There's some minor races with proc state that give_cores can handle,
though I'd like to change that part a bit.

Also note that schedule() grabs proclocks.  Don't call this when holding
a proclock or from interrupt context.

8 years ago__proc_give_cores() can be called multiple times
Barret Rhoden [Sat, 25 Feb 2012 01:14:26 +0000 (17:14 -0800)]
__proc_give_cores() can be called multiple times

Once you're done giving cores, call __proc_run_m() to actually start it
up.  This patch moves the sending of the bulk preempt list events to
right before we run, so that you can give out small groups of cores
without having to run after each handout.  Check out core_request() for
an example.

This also moves the running of _Ms out of the ksched, though
core_request() is pretty close to the ksched anyway.  Regardless,
schedulers no longer need to track the difference between a RUNNABLE_M
and a RUNNING_M.

8 years agoBreaks proc_run() into _S and _M functions
Barret Rhoden [Fri, 24 Feb 2012 22:47:05 +0000 (14:47 -0800)]
Breaks proc_run() into _S and _M functions

Eventually, proc_run_m will be called internally (or will go away

8 years agoMoves proc runnable list to the ksched
Barret Rhoden [Thu, 23 Feb 2012 05:02:02 +0000 (21:02 -0800)]
Moves proc runnable list to the ksched

And changes the (totally unused) old procinfo option.  One minorly
ghetto thing is that whatever embedded structure the ksched wants to use
will need to be in the proc struct (TAILQ now, but later...).

8 years agoproc_run() now returns
Barret Rhoden [Wed, 22 Feb 2012 03:07:18 +0000 (19:07 -0800)]
proc_run() now returns

Previously, it would not return if you were running an _S.  Now, no code
has to worry about it not returning.

This was an artifact of the old implementation that required proc code
to immediately deal with popping user contexts.  Now that we have
current_tf and owning_proc in pcpui, proc_run() acts like
__proc_give_cores() and friends: it just tells the core (via pcpui) to
run you when the core has nothing else to do (smp_idle).

8 years ago_S -> _M and schedule()/core_request() work
Barret Rhoden [Wed, 22 Feb 2012 02:24:45 +0000 (18:24 -0800)]
_S -> _M and schedule()/core_request() work

A lot is in transition.  This step makes the transition code to _M mode
the province of process.c, instead of resource.c.  I kept around the old
_M->_S code, but don't seriously use it or plan on it ever being used.

8 years agoAllows no EXT2 block device
Barret Rhoden [Mon, 27 Feb 2012 21:26:40 +0000 (13:26 -0800)]
Allows no EXT2 block device

Note you still need to have the block device if you compile with EXT2
support.  This just lets people not use EXT2 and still build.

8 years agoFixes some RISCV compilation issues
Barret Rhoden [Mon, 27 Feb 2012 21:25:20 +0000 (13:25 -0800)]
Fixes some RISCV compilation issues

8 years agoFixes backtrace (x86, at least)
Barret Rhoden [Sat, 4 Feb 2012 00:07:38 +0000 (16:07 -0800)]
Fixes backtrace (x86, at least)

Probably due to the recent cross compiler change, we were enabling
omit-frame-pointer, which was breaking our backtrace implementation.

8 years agoPreserves mmaps of MAP_SHARED files across fork()
Barret Rhoden [Fri, 3 Feb 2012 23:44:09 +0000 (15:44 -0800)]
Preserves mmaps of MAP_SHARED files across fork()

mm.c's copy_pages() uses env_user_mem_walk(), which is probably faster
than a pgdir walk for each PTE, esp on 64 bit architectures.  Still, I
kept around code that can do the copy_page manually, since I'm not a
huge fan of the mem walk - I'll probably change its interface when the
need arises.

8 years agoFixes bug with mmapping beyond a file's last page
Barret Rhoden [Fri, 3 Feb 2012 21:02:07 +0000 (13:02 -0800)]
Fixes bug with mmapping beyond a file's last page

The kernel was page faulting.  Now, we check for it at do_mmap() time,
and recheck during handle_page_fault().  Linux sends a SIGBUS at access
time if you tried to access beyond the filesize.

Note that we still don't have any concurrency protection regarding the
file size.  Someone could be truncating the file right as you are
loading the page, but after you checked i_size.

8 years agoLoad elf program segments with the correct perms
Barret Rhoden [Fri, 3 Feb 2012 01:44:55 +0000 (17:44 -0800)]
Load elf program segments with the correct perms

We had been giving them all write access.  All the writable ones need to
be PRIVATE (so we don't mess with the original file).

Note that ld wants its EXEC sections to be loaded writable, despite the
elf header saying otherwise.  There's a decent chance we're doing
something wrong, somewhere.  Anyway, I talk about it in the code a bit,
so if you see weird things with permissions of binaries involving ld,
take a look.

8 years agoBetter file permission checks in mmap()
Barret Rhoden [Tue, 31 Jan 2012 23:14:42 +0000 (15:14 -0800)]
Better file permission checks in mmap()

The checks we do in mprotect are now done in mmap, with backup checks
done in handle_page_fault().  The checks (and the VFS!) could use a bit
of work.  Note that the VFS's check_perms() always allows access

8 years agoFixes MAP_PRIVATE bug in mmap()
Barret Rhoden [Tue, 31 Jan 2012 04:00:30 +0000 (20:00 -0800)]
Fixes MAP_PRIVATE bug in mmap()

Flags were being set, instead of checking.  Further, we needed to make
private copies (or CoW) on any private mapping, independently of its
PROT status, due to some other issues we have with libc and loadelf.

Note that we have a couple other bugs still, related to mmap of files
across fork or mmap of regions of files exceeding the filesize.

8 years agoMoves the idlecoremap to the ksched
Barret Rhoden [Wed, 25 Jan 2012 19:10:39 +0000 (11:10 -0800)]
Moves the idlecoremap to the ksched

There's a lot of stuff built in to process code that belongs more in the
scheduler - such as the idlecoremap.  That one was an old example of how
things could be done.

The interfaces in sched.h are pretty ghetto, and a lot of this stuff is
just intermediate code.  And that hideous code for initing the number of
idle cores was simply moved to sched.c.

8 years agoBulk preemption uses the bulk preempt list
Barret Rhoden [Mon, 23 Jan 2012 23:40:23 +0000 (15:40 -0800)]
Bulk preemption uses the bulk preempt list

Using the old, ghetto __proc_preempt functions.  Also when you take the
last core using these, the process will be put in RUNNABLE_M and

8 years agoFixes occasional STAB error on x86
Barret Rhoden [Mon, 23 Jan 2012 23:33:02 +0000 (15:33 -0800)]
Fixes occasional STAB error on x86

We were erroring out unnecessarily, which was breaking things like

8 years ago__proc_give_cores() can now handle bulk preemption
Barret Rhoden [Thu, 19 Jan 2012 02:45:11 +0000 (18:45 -0800)]
__proc_give_cores() can now handle bulk preemption

Or so I think.  We don't actually use the BP list yet.

8 years agoReorganizes the __proc_take cores functions
Barret Rhoden [Wed, 18 Jan 2012 22:06:22 +0000 (14:06 -0800)]
Reorganizes the __proc_take cores functions

Making them more suitable to bulk preemption.

8 years agoFixes rare race with notifying unmapped vcores
Barret Rhoden [Wed, 18 Jan 2012 21:39:27 +0000 (13:39 -0800)]
Fixes rare race with notifying unmapped vcores

Fun fact: this race only presented itself when we had the next commit
applied for block_test, even though we don't call any of the functions
that the next commit changes.

8 years agoRemoves __proc_set_allcores()
Barret Rhoden [Wed, 11 Jan 2012 22:28:50 +0000 (14:28 -0800)]
Removes __proc_set_allcores()

Never was used, and I'm cleaning up the proc core management.

8 years agoFixes bug with run_current_uthread()
Barret Rhoden [Tue, 20 Dec 2011 10:02:30 +0000 (02:02 -0800)]
Fixes bug with run_current_uthread()

The code had been assuming that if you had a current_uthread, that it
was RUNNING and its TF was loaded in the vcpd notif_tf.  That's not
always the case.

Previously, it wasn't the case for brief moments between setting current
and popping that TF.  During one of those moments, you could handle a
message that made you start over at vcore entry (if there was a
CHECK_MSGS for instance, or a handle_vcpd_mbox()).  When you restarted
in vcore context, you could get to a run_current_uthread() that assumed
it was running out of the notif_tf.

Anyway, now run_current_uthread() and run_uthread() are two wrappers
around the real __run_current_uthread(), which does the heavy lifting,
especially managing the uthread TF and related flags.  The wrappers are
mostly for setting cur_uth and debugging( which is the main reason I
have those uthread states and whatnot).

8 years agoFixes rare deadlock in user-side ucq
Barret Rhoden [Tue, 20 Dec 2011 01:47:18 +0000 (17:47 -0800)]
Fixes rare deadlock in user-side ucq

In that loop, we spin on userspace.  If that vcore was preempted in its
short window (message reception), and we were the last vcore, and we got
to the spinning loop before getting the preempt message, then we'd
deadlock.  Side note: this hasn't happened yet.

8 years agoVcore preemption spinning helpers
Barret Rhoden [Tue, 20 Dec 2011 01:40:11 +0000 (17:40 -0800)]
Vcore preemption spinning helpers

Provides two helpers for vcore code, which should be used when you spin
and wait on another vcore that could be preempted.  If you want to spin
a little before trying to see if you are spinning due to a preemption,
use the cpu_relax_vc() call.  o/w, directly call ensure_vcore_runs().

8 years agoVcoreid sanity checks in event code
Barret Rhoden [Sat, 17 Dec 2011 00:43:26 +0000 (16:43 -0800)]
Vcoreid sanity checks in event code

Very large vcoreid's could cause the kernel to find VCPD addresses
outside of procdata.  MAX_NUM_CPUS is what we use for MAX_NUM_VCORES
btw.  No one should want/need more vcores than that.  k/s/pmap.c has
checks built in to make sure procdata stays within its size too.

8 years agoRemoved dangling symlink
Barret Rhoden [Fri, 16 Dec 2011 01:20:54 +0000 (17:20 -0800)]
Removed dangling symlink

8 years agoCleans up preempt_pending helper functions
Barret Rhoden [Thu, 15 Dec 2011 00:41:32 +0000 (16:41 -0800)]
Cleans up preempt_pending helper functions

Don't call __check_preempt_pending() from places that can't handle a
noreturn.  Examples include inside event handlers, while processing an
ev_q (you'll miss messages), while holding locks, etc.  If a preempt is
pending, the vcore will yield and may never come back.  Next time it
runs, it'll be starting fresh from vcore_entry().

If needed, we can make versions of event handlers that can handle
responding to a preempt_pending, but those will need to be careful to
not ignore message queues and stuff like that.  One of the side effects
of not returning is that someone might be expecting you to process all
of your messages, etc.