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.

8 years agosys_change_vcore can send CHECK_MSGS event
Barret Rhoden [Wed, 14 Dec 2011 21:51:55 +0000 (13:51 -0800)]
sys_change_vcore can send CHECK_MSGS event

When a vcore changes to another, and when that vcore has no need to
return (packed up its cur_uth, not holding locks, etc), then to deal
with it going offline, the process just needs to check its messages.

8 years agoPreemption events sent via SPAM, and not INDIR
Barret Rhoden [Wed, 14 Dec 2011 01:59:24 +0000 (17:59 -0800)]
Preemption events sent via SPAM, and not INDIR

In accordance with prophecy (aka, documentation from 'n' commits ago).

Note we are using the small ev_qs, which merely tell the kernel where to
send things.  In this case, it is to spam the messages to VCPD public

8 years agoEvent flag for spamming public messages (XCC)
Barret Rhoden [Wed, 14 Dec 2011 01:38:48 +0000 (17:38 -0800)]
Event flag for spamming public messages (XCC)

ev_qs can use EVENT_SPAM_PUBLIC to send a spammable message to some
vcore's public mbox.  This flag will honor VCORE_MUST_RUN.  We'll try to
spam ev_q->ev_vcore, or someother prescribed source of vcoreid (like
APPRO, for whatever the kernel thinks is appropriate, or ROUNDROBIN).

Cleaned up send_event() a bit too, esp regarding how we come up with the
vcoreid and the ev_mbox (SPAM_PUBLIC doesn't need to bother with an

Reinstall your kernel header(s).

8 years agoPreemption recovery handler
Barret Rhoden [Tue, 13 Dec 2011 23:25:59 +0000 (15:25 -0800)]
Preemption recovery handler

The handler is still a bit rough, and there are a couple nagging bugs
out there.

8 years agoUthread helper to copy a uthread's context
Barret Rhoden [Tue, 13 Dec 2011 23:15:00 +0000 (15:15 -0800)]
Uthread helper to copy a uthread's context

From the VCPD to the uthread, subject to where the uthread's flags say
its contexts are.

8 years agoUTHREAD_FPSAVED flag
Barret Rhoden [Tue, 13 Dec 2011 23:10:42 +0000 (15:10 -0800)]

Tracks whether or not the uthread's FP state is saved in it's uthread
struct, much like UTHREAD_SAVED.  It's a bit different, since we load
the FP state at different places.

In the future, we can (or you can!) set up some optimizations to only
save the FP state if it was used/needs to be saved.

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