7 years agox86: fast core_id() option
Barret Rhoden [Thu, 18 Jul 2013 23:42:11 +0000 (16:42 -0700)]
x86: fast core_id() option

Implements core_id() with rdtscp.  VM support for rdtscp can be a bit
spotty.  If you want to run with this, try it once without, and see if
the kernel detects support for rdtscp (in the bootup output).  If so,
you're good to go.

7 years agox86: fixes backtrace bug
Barret Rhoden [Thu, 18 Jul 2013 22:38:26 +0000 (15:38 -0700)]
x86: fixes backtrace bug

Was using func_name after freeing.

7 years agox86: fixes early core_id() calls
Barret Rhoden [Wed, 17 Jul 2013 21:21:28 +0000 (14:21 -0700)]
x86: fixes early core_id() calls

Ever since we set up minimal paging in assembly, we were unable to access the
LAPIC (and therefore coreid) until the LAPIC was mapped in during vm_init().
This prevented the newer panic and warn from working, and totally killed
spinlock debugging.

Previously, we had a full "virtual" KERNBASE mapping (in 32 bit) with
segmentation.  I think those attempted accesses of the unmapped LAPIC were just
silentely returning 0, which is the 'right' answer at that stage of bootup.
Either way, now that paging is on, unmapped LAPIC accesses would page fault and
trigger a reboot since the IDT isn't set up yet either.

Any callers of core_id() that can happen before vm_init() need to use
core_id_early().  I'm not overly concerned about code reachable via the
monitor, since if you got there, it's by a panic and we should already be
working on that problem.  If this is too much of a burden, we can just put the
bool check in core_id(), and take that potential cache miss on every call.

7 years agox86: fixes read_tsc_serialized()
Barret Rhoden [Wed, 17 Jul 2013 22:16:09 +0000 (15:16 -0700)]
x86: fixes read_tsc_serialized()

The compiler was reordering operations (stores, in one case) past the

7 years agox86_64: support for machines with only 2MB pages
Barret Rhoden [Fri, 19 Jul 2013 23:43:13 +0000 (16:43 -0700)]
x86_64: support for machines with only 2MB pages

Some machines (future AMD ones? and definitely some VMs) don't support 1
GB jumbo pages.

This adds in support for using 2MB jumbos for the boot mappings.

This adds an extra 2MB or so of extra memory in the data segment for the
pml2s, regardless of whether or not your machine needs them.  I might
add a CONFIG for that at some point.

7 years agox86_64: boot up error messages
Barret Rhoden [Fri, 19 Jul 2013 16:35:31 +0000 (09:35 -0700)]
x86_64: boot up error messages

If the machine can't support long mode (unlikely) or 1 GB pages (more
likely, esp for VMs), we print an error message and halt.  If we need
more error checking, we can add it in easily.

The errors will be printed to the CGA and COM1.

7 years agoDebug tools use the symbol table
Barret Rhoden [Wed, 17 Jul 2013 18:13:11 +0000 (11:13 -0700)]
Debug tools use the symbol table

Including kfunc (now available for riscv!), x86_64 backtrace, and spinlock

This also allows us to clean up the headers a bit (remove eipdebuginfo, make
spinlock debug arch independent).

7 years agoReflects symbol table into the kernel
Barret Rhoden [Wed, 17 Jul 2013 01:47:03 +0000 (18:47 -0700)]
Reflects symbol table into the kernel

The symbol table is processed and dumped into a C file, which gets compiled
into the kernel.  It's similar to Linux's kallsyms, just not as efficient.  It
allows us to map to and from addresses and symbols (char *s).

7 years agox86: fixes 32 bit trap-syscalls
Barret Rhoden [Tue, 16 Jul 2013 00:08:17 +0000 (17:08 -0700)]
x86: fixes 32 bit trap-syscalls

Broken since dd07360f, since our sysenter and trap methods expect their args in
different registers (on 32 bit).

7 years agoChanges Akaros default build to x86_64
Barret Rhoden [Fri, 12 Jul 2013 00:35:21 +0000 (17:35 -0700)]
Changes Akaros default build to x86_64

If you want something else, you'll have to do a small amount of fiddling.  To
mess with the kernel/userspace config, menuconfig will do the trick.  You can
do the same for busybox, when in their source tree, or just edit the .config.

For the cross compiler, just make the appropriate target (even for x86_64).

7 years agoFixes int overflow in lockprov.sh
Barret Rhoden [Fri, 12 Jul 2013 00:12:28 +0000 (17:12 -0700)]
Fixes int overflow in lockprov.sh

Too many 9's get converted into a negative number by pthread_test.

7 years agox86_64: fixes initial stack alignment
Barret Rhoden [Thu, 11 Jul 2013 23:11:54 +0000 (16:11 -0700)]
x86_64: fixes initial stack alignment

Stacks at function entry points need to be 8 bytes off from 16 byte alignment.
This 16-byte aligns stack-based input args, and also the compiler can get a 16
byte aligned stack by subtracting (or adding) 8 to %rsp, for use in xmm
instructions (like movaps).

7 years agox86_64: secure SW contexts
Barret Rhoden [Thu, 11 Jul 2013 21:31:08 +0000 (14:31 -0700)]
x86_64: secure SW contexts

The kernel can legitimately be asked to pop a SW context from VCPD.  If a
syscall (a SW ctx) is in the kernel when a __preempt arrives, that SW ctx will
be saved into VCPD.  If that VC was in vcore context (notifs disabled), then
the kernel will secure and restart it next time that vcore runs (change_to or

7 years agox86_64: user space TF handlers
Barret Rhoden [Thu, 11 Jul 2013 02:42:18 +0000 (19:42 -0700)]
x86_64: user space TF handlers

Saving and popping HW and SW TFs.  Might be a few bugs with it still.
Note the x86_64 port uses SW contexts for syscalls, so we might have
some subtle issues out there.

At this point, busybox, signal handling, and regular pthread_test work.

7 years agox86_64: all apps compiled with -mno-red-zone (XCC)
Barret Rhoden [Wed, 10 Jul 2013 18:23:18 +0000 (11:23 -0700)]
x86_64: all apps compiled with -mno-red-zone (XCC)

The red-zone is an ABI specification, allowing the compiler to use 128
bytes below the stack pointer.  This helps with some leaf functions.
We make a bunch of assumptions about being able to use the area below
the stack for popping user contexts, so we can't allow the red-zone
optimization.  There is a similar issue with interrupts in the kernel
(given our current interrupt handling strategy).

Copy over ros64.h and rebuild GCC.

7 years agox86_64: save/pop kernel contexts
Barret Rhoden [Tue, 9 Jul 2013 23:08:15 +0000 (16:08 -0700)]
x86_64: save/pop kernel contexts

Kernel contexts are now arch-specific, and x86_64 is using SW contexts
(smaller, simpler).

7 years agox86_64: glibc TLS (XCC)
Barret Rhoden [Thu, 4 Jul 2013 06:04:24 +0000 (23:04 -0700)]
x86_64: glibc TLS (XCC)

get and set_tls for glibc.  This doesn't attempt to use WRFSBASE (if
present) yet.

Rebuild glibc; make sure to copy the tls.h from the -ros directory (or
just make clean).

7 years agoAllow file mmaps beyond the end of the file
Barret Rhoden [Thu, 4 Jul 2013 06:02:39 +0000 (23:02 -0700)]
Allow file mmaps beyond the end of the file

64 bit glibc libraries have an unaligned 2MB hole in the middle, and
ld.so just maps that extra space in the original mmap call, then
mprotects it to PROT_NONE.  Fair enough.

7 years agox86_64: sets the desired dynamic linker (XCC)
Barret Rhoden [Tue, 2 Jul 2013 21:49:58 +0000 (14:49 -0700)]
x86_64: sets the desired dynamic linker (XCC)

This uses the same linker pathname for 32 and 64 bit.  We aren't set up for
multiarch, or otherwise having both 32 and 64 bit binaries on a 64 bit system.

7 years agoFixes memory checking bug on syscall structs
Barret Rhoden [Tue, 2 Jul 2013 20:18:21 +0000 (13:18 -0700)]
Fixes memory checking bug on syscall structs

The long term fix is to have the kernel handle page faults on user addresses,
instead of looking at the page tables (which is insufficient unless we pin, and
is slow regardless).

7 years agox86_64: TLS FS base changing 'fast call' (XCC)
Barret Rhoden [Tue, 2 Jul 2013 18:33:01 +0000 (11:33 -0700)]
x86_64: TLS FS base changing 'fast call' (XCC)

For systems that don't support reading/writing the FS base from userspace, we
have a fast path in the kernel to change the FS base.  We don't save or restore
anything, nor do we enter the main syscall path.  Hopefully that will be
reasonably fast.

This does impact the normal syscall path, albeit slightly.  If you know you
have hardware (Ivy Bridge or later) that supports WRFSBASE, then you can
disable this option.  Be sure your userspace knows what to do.

Reinstall your kernel headers.

7 years agox86_64: Syscall/Sysenter/int 0x80 (XCC)
Barret Rhoden [Sat, 29 Jun 2013 00:23:01 +0000 (17:23 -0700)]
x86_64: Syscall/Sysenter/int 0x80 (XCC)

Userspace can make system calls with either syscall (aka sysenter in the
codebase, 'syscall' is pretty generic) or int 0x80.

Rebuild the toolchain to use this, though _start probably doesn't work well as
is.  If you really want to test off this commit, write your own C program,
define _start, and compile with a non-cross gcc:

$ gcc minihello.c -o minihello -static -nostdinc -nostartfiles

7 years agox86_64: tracks stacktop in pcpui for sysenter
Barret Rhoden [Fri, 28 Jun 2013 18:35:24 +0000 (11:35 -0700)]
x86_64: tracks stacktop in pcpui for sysenter

Would be nice to avoid having per-core GDTs and TSSs too, but the traps and irq
stuff pushes everthing before we get control.  Oh well.

7 years agox86_64: GS base work
Barret Rhoden [Fri, 28 Jun 2013 00:08:21 +0000 (17:08 -0700)]
x86_64: GS base work

The kernel uses GS base to point to pcpu info, and will make sure this is set
up on entry.  It's also important to reset KERN_GS_BASE before we reenable
interrupts.  The assumption is that on entry from any trap/irq, that the
correct kernel GS base is in KERN_GS_BASE.

We don't actually need to swapgs in trap and irq code, but it'll make it easier
to save the user contexts directly into pcpui->cur_tf in the future.

Also note that we're not even going to bother saving and restoring fs and gs -
just the base registers.  This also goes for ds and es, meaning it is possible
for one application to see the ds of a previous program running on that core.
AFAIK, the hardware just ignores DS and ES's internal registers, so if a
program randomly sets DS, it shouldn't hurt the kernel or another process.

7 years agox86_64: pop non-sysenter TFs, fixes segmentation
Barret Rhoden [Wed, 26 Jun 2013 00:35:32 +0000 (17:35 -0700)]
x86_64: pop non-sysenter TFs, fixes segmentation

Apparently we do need some data segmentation, at least for the SS, when popping
via iretq into userspace.  I haven't needed it for the kernel yet.  Note the
segment limit/base are ignored (they can't express 64 bits), but things like
the DPL and the W bit seemed to be checked.

7 years agoElf loader 32/64 bit checks
Barret Rhoden [Wed, 26 Jun 2013 00:33:35 +0000 (17:33 -0700)]
Elf loader 32/64 bit checks

KERN64 was a riscv-only thing.  CONFIG_64BIT is arch-indep (and set by
Kconfig).  Also, x86_64 can't handle 32 bit elves, though riscv can.

7 years agoFixes fill-kfs
Barret Rhoden [Tue, 25 Jun 2013 22:35:15 +0000 (15:35 -0700)]
Fixes fill-kfs

Wasn't removing the libs or bins due to missing trailing slashes.

7 years agox86_64: smp_boot
Barret Rhoden [Tue, 25 Jun 2013 20:44:34 +0000 (13:44 -0700)]
x86_64: smp_boot

Also fixes an old bug where smp_boot was treating the boot lock and sem as if
they were 32 bit (they are 16).

7 years agoCleans up sysenter_init
Barret Rhoden [Tue, 25 Jun 2013 20:15:33 +0000 (13:15 -0700)]
Cleans up sysenter_init

It's existence is arch specific, so we don't really want it in kernel_init (or
riscv) and within x86, each subarch has different ways to set it up.

7 years agox86: pmap boot lowmem unmapping
Barret Rhoden [Tue, 25 Jun 2013 20:09:49 +0000 (13:09 -0700)]
x86: pmap boot lowmem unmapping

We need to be able to unmap the 1GB physical memory identity map.  One thing
holding this back was the GDT PD pointing to physical memory, instead of
virtual memory.

7 years agox86_64: kernel trap/interrupt handling
Barret Rhoden [Mon, 24 Jun 2013 22:12:31 +0000 (15:12 -0700)]
x86_64: kernel trap/interrupt handling

Worked for breakpoint and a self-ipi.  Vcore stuff is turned off til I
get the kernel sorted.

7 years agoFixes casting error
Barret Rhoden [Mon, 24 Jun 2013 22:10:54 +0000 (15:10 -0700)]
Fixes casting error

int -> long, when passing via a void *.

7 years agoDisables TLS in 64 bit glibc (XCC)
Barret Rhoden [Mon, 24 Jun 2013 18:30:09 +0000 (11:30 -0700)]
Disables TLS in 64 bit glibc (XCC)

Pending some decisions about how we'll do TLS.

Rebuild your cross compiler (either clean glibc, or copy over tls.h from the
-ros directory to the main glibc directory).

7 years agoFixes pointer size error
Barret Rhoden [Sun, 23 Jun 2013 06:23:46 +0000 (23:23 -0700)]
Fixes pointer size error

7 years agoMakefile rebuilds binary objects on subarch change
Barret Rhoden [Sun, 23 Jun 2013 06:16:36 +0000 (23:16 -0700)]
Makefile rebuilds binary objects on subarch change

When changing back and forth between 64 and 32 bit, old binary blobs
that we link into the kernel were not being updated, causing linker
errors.  Instead of requiring a make objclean, this detects those cases
and removes the old objects (KFS and EXT2 blobs).

7 years agoX86: initializes the 64 bit IDT and TSS
Barret Rhoden [Fri, 21 Jun 2013 00:37:53 +0000 (17:37 -0700)]
X86: initializes the 64 bit IDT and TSS

The IRQ handlers aren't fixed yet.

7 years agox86: 64 bit pmap code
Barret Rhoden [Thu, 20 Jun 2013 05:37:02 +0000 (22:37 -0700)]
x86: 64 bit pmap code

Page table walking, segment inserting, etc.  These ones are more
powerful than what the main part of the kernel expects, mostly in the
realm of jumbo pages.  We'll have to start using (and testing) them more

7 years agoReworks memlayout (XCC)
Barret Rhoden [Mon, 17 Jun 2013 06:20:50 +0000 (23:20 -0700)]
Reworks memlayout (XCC)

Adds a memlayout for 64 bit x86, and reworks it slightly for the other
arches.  Everyone needs to specify UVPT and BRK_END, for instance.

Probably should reinstall your kernel headers and rebuild userspace.

7 years agoStops using boot_alloc during vm_init
Barret Rhoden [Sun, 16 Jun 2013 05:56:24 +0000 (22:56 -0700)]
Stops using boot_alloc during vm_init

Now calls vm_init after fully setting up the free page list.  One
requirement of this is that we have all available physical memory mapped
into the boot page tables.  Our current page allocator gives them out in
reverse order, so we start right below max_paddr.  We're good up to
512GB on amd64.

The benefit of this is we don't have to deal with calling boot_alloc in
our vm_init code, which cleans things up a bit.

7 years agoFixes bug with 64 bit linkage
Barret Rhoden [Sun, 16 Jun 2013 04:27:50 +0000 (21:27 -0700)]
Fixes bug with 64 bit linkage

The old style of tricking grub with the linker script is a bad idea.
Using objcopy instead.  For more info, check out:


7 years agoPhysical memory init uses multiboot info
Barret Rhoden [Sun, 16 Jun 2013 00:20:04 +0000 (17:20 -0700)]
Physical memory init uses multiboot info

The old style of trusting only the BIOS memory detection, would miss out
on pmem above 4GB.  Additionally, we were assuming the area from right
above the kernel til the end of extended memory was free, instead of
checking the mmap ranges.

Now we parse the multiboot info to figure out which memory ranges are
really free.  Additionally, we use the largest range (which might not be
the one the kernel is already sitting in) for our boot allocator.
Systems with obscene amounts of RAM (256GB) will need more RAM than fits
in extended memory (~6GB for the pages array).

Anyway, we try to handle situations whether or not the kernel is in the
boot allocator zone, whether the zone is larger than addressable
physical memory, and a bunch of other things.

7 years agox86_64 boot up
Barret Rhoden [Fri, 14 Jun 2013 08:35:10 +0000 (01:35 -0700)]
x86_64 boot up

Gets into long mode, maps 512GB of KERNBASE in 1 GB pages.

7 years agoUpdates multiboot code for amd64
Barret Rhoden [Thu, 13 Jun 2013 23:44:25 +0000 (16:44 -0700)]
Updates multiboot code for amd64

The old version was 64-bit incompatible (assumed longs were 32 bits).
The FSF has a newer version anyway.

Note our old style of determining which memory to use only works for the
first 3GB or so of pmem (at least on my test machines).

7 years agoFixes page-faulting glibc on certain machines (XCC)
Barret Rhoden [Sat, 22 Jun 2013 17:10:06 +0000 (10:10 -0700)]
Fixes page-faulting glibc on certain machines (XCC)

The i686 toolchain when built on brho's desktop was causing apps linked
against glibc to page fault in __flockfile (_IO_flockfile) on
(*stream->lock).owner.  I'm not sure why this was limited to certain
machines, or if we've seen the end of this bug.

You'll need a full rebuild of the toolchain (at least of glibc).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

For more info:

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

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

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

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

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

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

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

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

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

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

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

And makes it not depend on $ARCH.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Rebuild the kernel and test applications.

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

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

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

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

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

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

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

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

For those curious:

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

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

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

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

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

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

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

$ make ARCH=i686 config

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

For info:
$ lock_test --help

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

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

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

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

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

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

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

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

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

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

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

Also this exposes some lower-level MCS locking functions.

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

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

This also cleans up the retval work a little.

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

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

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