7 years agoVFS dummy ops
Barret Rhoden [Fri, 16 Aug 2013 23:40:17 +0000 (16:40 -0700)]
VFS dummy ops

To catch bugs when we calling ops on inodes/dentries unexpectedly.

7 years agoFixes up lindent
Barret Rhoden [Mon, 19 Aug 2013 22:29:44 +0000 (15:29 -0700)]
Fixes up lindent

indent still messes up sometimes.  In some cases (like with weird printk
formatting), it can be fixed and won't cause the problem again.  In
others, like in sys_buster right after the #defines, it'll insist on
formatting in a weird manner.

Anyway, this is better than not formatting the code at all.

7 years agoLindent script for Akaros
Ronald G. Minnich [Mon, 19 Aug 2013 20:51:11 +0000 (13:51 -0700)]
Lindent script for Akaros

Some minor changes -- ts and i set to 8.
Should we dump the line length? Do we really care
about 80 columns? I know I don't.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
7 years agoROUNDDOWN can handle uint64_t on 32 bit (XCC)
Barret Rhoden [Thu, 15 Aug 2013 23:44:34 +0000 (16:44 -0700)]
ROUNDDOWN can handle uint64_t on 32 bit (XCC)

ROUNDDOWN was casting to a uintptr_t, which would truncate a uint64_t on
32 bit builds.  (Came up in mboot parsing, when pages above
0x0000000100000000 would get treated as if offset from 0).

Since the compiler complains about the int->pointer->int casting, even
in code that should never be called (based on the sizeof() in
ROUNDDOWN), we had to make ROUNDDOWN (and ROUNDUP) only work on
uintptr_t.  Ideally, we'll fix that in the future (C11 features,

You should reinstall your kernel headers to get the new changes for
userspace, though it's not a huge deal.

7 years agoMultiboot memory detection fixes
Barret Rhoden [Thu, 15 Aug 2013 00:17:39 +0000 (17:17 -0700)]
Multiboot memory detection fixes

A few things:
- Multiboot's regions don't cover all of physical memory; it has holes.  We now
  init the pages[] array (for x86) to mark all pages as busy, and explicitly
  mark the free pages.
- The previous version of this worked a little, since the unmarked, non-free
  pages weren't on any free page lists.  However, the contiguous memory
  allocator (which is really lousy btw) looks directly at refcnts, bypassing
  the lists.
- One problem is that there is a big chunk of unusable memory around 0xfec00000
  (IOAPIC and friends).  This was working okay with multiboot's memory
  mappings, but not with qemu's "here's a lot of memory" approach.  In lieu of
  doing full-fledged memory detection/probing, I'm just ignoring physical
  memory from [0xc0000000, 0xffffffff].  This only applies to qemu, when
  launched with the -kernel flag.
- 32 bit had some other issues when giving out memory near the 4GB mark, as
  well as having other issues with 64 bit addresses (note some of the changes
  from %p to 0x%016llx).
- The bug with giving out pages that were mapped to IO/BIOS/x86 magic regions
  in high memory showed up as clobbered bookkeeping in small slab pages in
  kmem_cache_grow() (stored at the end of the pages improperly allocated).
  Good times!

7 years agoSlightly more consistent VC count interfaces
Barret Rhoden [Sat, 10 Aug 2013 00:21:10 +0000 (17:21 -0700)]
Slightly more consistent VC count interfaces

The main concern was the size of size_t vs uint32_t.  We're still sloppy
about uint32_t vs int.

The kernel header still has max_vcores as a size_t.  I'll change that
next time I muck around in that part of the headers (I don't want to
force more toolchain rebuilds).

7 years agoThread0 can call pthread_exit()
Barret Rhoden [Fri, 9 Aug 2013 23:41:11 +0000 (16:41 -0700)]
Thread0 can call pthread_exit()

Needed to not free thread0's TLS (it was never malloc'd), and needed to
trigger exit() when the last pthread (including thread0) exits.

7 years agoUpdated GETTING_STARTED
Barret Rhoden [Thu, 8 Aug 2013 21:35:04 +0000 (14:35 -0700)]

With info about how to run without a VM image file, straight outta qemu.

7 years agoThe monitor's trace coretf can query all cores
Barret Rhoden [Thu, 8 Aug 2013 20:37:17 +0000 (13:37 -0700)]
The monitor's trace coretf can query all cores

You can pass -1 for the COREID, and we'll NMI all cores, instead of just one.

Due to this, the NMI handler doesn't print the trapframe by default.  To get
the trapframe, toggle the trace's verbosity to 'on' with "trace verbose".

7 years agox86: option to disable the keyboard
Barret Rhoden [Thu, 8 Aug 2013 20:18:28 +0000 (13:18 -0700)]
x86: option to disable the keyboard

To avoid some SMM overheads on machines with USB keyboards.

Without this, simply sitting in the kernel monitor on core 0 has a massive
performance hit on some benchmarks (10-15x for fluidanimate).

Note that sitting in the monitor still has an effect on performance, for now,
even with the KB disabled.

7 years agox86 can handle missing multiboot mmaps
Barret Rhoden [Thu, 8 Aug 2013 20:02:00 +0000 (13:02 -0700)]
x86 can handle missing multiboot mmaps

If you run qemu with -kernel akaros-kernel, instead of with a hard disk image
(like mnt/hdd.img), qemu won't fake all of the multiboot memory maps.  x86 was
using this info to figure out what memory was free.  We now handle the case
where we only get a maximum memory amount from multiboot.

Incidentally, the memory reported by multiboot from the BIOS usually is
insufficient if you have more than 4GB of RAM, at least in my experience.  This
is why I was parsing the mmap regions, where multiboot details memory about
4GB.  Qemu with -kernel, which doesn't tell us the mmaps, does tell us all of
physical memory via the BIOS methods (mboot_detect_memory()).

With this change, you can run very large kernel images in qemu.  Qemu takes
forever to load large images (> 100MB) when it tries to load from a disk image.
You can load a 300MB+ kernel directly via -kernel in about a minute.

7 years agoFixes KFS multi-paths
Barret Rhoden [Thu, 8 Aug 2013 19:49:21 +0000 (12:49 -0700)]
Fixes KFS multi-paths

You can have multiple KFS paths in your .config (space separated).  KFS will be
built from the union of the contents of all of those directories.

A couple notes:
- if you have multiple directories named the same, they both appear, and with
  the same name.  For instance, you can have two /bins.  When you ls /bin,
  you'll get the contents of both bins.  It's a little weird, but not in a way
  that stops you from merging different KFS paths.  (for now).
- KFS might not like symlinks to directories outside of the KFS path.  Not
  sure.  If you put a symlink in kern/kfs from go -> ../../../go, KFS code
  doesn't like it.  If you really want this behavior, let me know.  O/w, just
  use multiple KFS paths.

7 years agoForgot the risvc Kbuild in last commit
Kevin Klues [Thu, 8 Aug 2013 04:35:54 +0000 (21:35 -0700)]
Forgot the risvc Kbuild in last commit

7 years agoAdded setjmp/longjmp support to the kernel
Kevin Klues [Thu, 8 Aug 2013 04:23:27 +0000 (21:23 -0700)]
Added setjmp/longjmp support to the kernel

Full implementations for 32/64 bit x86.
Stubs in place for riscv with TODOs.
Test and example usage in kern/src/testing.c

7 years agoContext-saving functions are attrib'd return_twice
Barret Rhoden [Mon, 5 Aug 2013 23:22:44 +0000 (16:22 -0700)]
Context-saving functions are attrib'd return_twice

The compiler should warn us if it was unable to generate the code that doesn't
rely on registers across the function call.

The places we used it didn't do much on the return, so this probably wasn't a
problem.  Still, it may be in the future, and this beats inspecting the

One thing that isn't clear is whether or not returns_twice causes the compiler
to mark all registers as dead, or just the caller-saved registers.  Probably
the former.

The motivation for this is a stack clobber problem, where the compiler may save
the caller-saved registers (before calling save_user_ctx()) by pushing them on
the stack.  If this happens, when save_ returns the first time, it'll restore
the registers properly, but then could clobber that space so that the second
time it returns, the values it pops are garbage.  Hopefully the compiler will
avoid saving registers in this manner, or otherwise do anything that could be
harmed by returning twice.

7 years agoFixes bug in KFS new inode creation
Barret Rhoden [Sun, 4 Aug 2013 19:22:50 +0000 (12:22 -0700)]
Fixes bug in KFS new inode creation

Wasn't properly initializing the size field.  This would only matter
when creating new files in KFS, and would only trigger if the memory we
alloc'd wasn't already zeroed.

Something like      $ echo "" >> tmpfile    was enough to cause it, once
the bits lined up right.

The previous commit's backtrace was rather useful in determining this
(without it, all we know is there was a KPF in memcpy).

7 years agoArbitrary kernel context backtracing
Barret Rhoden [Sun, 4 Aug 2013 18:57:48 +0000 (11:57 -0700)]
Arbitrary kernel context backtracing

We can backtrace any context compiled with frame pointers, given the
program counter and frame pointer.

The existing monitor command 'backtrace' will still backtrace the
calling context, when given no arguments.  Additionally, it will
backtrace any frame, given the PC and FP.

Kernel page faults on x86 will backtrace the faulting context.  Riscv
still needs an implementation of backtrace_frame().

backtrace_frame() will sort of work for userspace too, though the kernel
won't know the names of functions, and you need to compile all of
userspace with -fno-omit-frame-pointer (which we don't do by default).

7 years agoUserspace handling of errstr and errno (XCC)
Barret Rhoden [Sun, 4 Aug 2013 02:48:46 +0000 (19:48 -0700)]
Userspace handling of errstr and errno (XCC)

Since not all uthreads have TLS, errno and the new errstr need to be
decoupled from the TLS.

When we're a uthread, we'll use storage in the uthread struct for errno
and errstr.  Otherwise, we'll default to the TLS locations (for vcores).
ld.so will continue to use its own area.  Very early in start.c, before
we call out to uthread code, we'd also use the TLS location.

perror() will print out the errstr, if there is one like so:

"your-message: errno-translated-to-text, errstr"

Rebuild your cross compiler.

7 years agoKernel support for set_errstr()
Barret Rhoden [Sun, 4 Aug 2013 01:34:37 +0000 (18:34 -0700)]
Kernel support for set_errstr()

7 years ago__ros_syscall -> __ros_syscall_noerrno (XCC)
Barret Rhoden [Sun, 4 Aug 2013 01:14:37 +0000 (18:14 -0700)]
__ros_syscall -> __ros_syscall_noerrno (XCC)

The *errno_loc parameter was never used by anyone, and this func was
left over from when __ros_syscall_errno() called __ros_syscall() under
the hood.

Since everyone who calls this wants no errno, I just removed it.

Rebuild your cross compiler.  (Copy over the changed files, or just make
clean first).

7 years agox86_64: removes unnecessary syscall (XCC)
Barret Rhoden [Sun, 4 Aug 2013 01:02:34 +0000 (18:02 -0700)]
x86_64: removes unnecessary syscall (XCC)

It was leftover from 32 bit code.

Copy over the changed file and rebuild your cross compiler.

7 years agoAdd an errstr to the syscall struct
Ronald G. Minnich [Fri, 2 Aug 2013 22:07:53 +0000 (15:07 -0700)]
Add an errstr to the syscall struct

Not supported in kernel or userland yet but this will allow us to
get more extensive error info to users as needed.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
7 years agoSmall optimization to inline ros_syscall_sync
Kevin Klues [Fri, 2 Aug 2013 20:55:56 +0000 (13:55 -0700)]
Small optimization to inline ros_syscall_sync

When calling from other libc functions in the same file, just inline it.
Only exposed version of the call is not inlined now.

7 years agoMalloc changes for future plan 9 namespace support
Ronald G. Minnich [Fri, 2 Aug 2013 17:19:41 +0000 (10:19 -0700)]
Malloc changes for future plan 9 namespace support

Add a kzmalloc which zeros the allocated area.

Add a flag, to be done later, which indicates that blocking, instead
of panicing, is ok when memory is not available.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
7 years agox86: fixes initialization errors in page_alloc
Barret Rhoden [Thu, 1 Aug 2013 23:32:07 +0000 (16:32 -0700)]
x86: fixes initialization errors in page_alloc

If the kernel's end symbol was page aligned, pa64_is_in_kernel() would
inaccurately report that address as being in the kernel.  That page actually
can be free.  check_range() was catching this.  Luckily, the error was in the
safe direction; we were marking a free page as busy.

The ROUNDDOWN fix is similar.  Check the comment for details; we're mostly
ignoring the issue for now.

7 years agoPreemption recovery doesn't change TLSs
Barret Rhoden [Thu, 1 Aug 2013 22:59:19 +0000 (15:59 -0700)]
Preemption recovery doesn't change TLSs

Instead of changing TLSs to get at current_uthread, we figure out the linear
address of the remote vcore's current_uthread and access it directly (from
within our usual TLS).

Aside from removing two potentially expensive TLS changes, this also simplifies
and clarifies the code.

7 years agoVcore TLS desc in procdata (XCC)
Barret Rhoden [Wed, 31 Jul 2013 18:47:14 +0000 (11:47 -0700)]
Vcore TLS desc in procdata (XCC)

Userspace now tells the kernel what TLS descriptor to use for each vcore.  The
main reason is that when making a new context, the kernel would zero the TLS
base, and then userspace would quickly set it to the vcore's TLS.  On amd64,
this incurs an extra syscall (for now), and on i686, it's an extra 70ns for the
lousy-LDT mangling.  This change allows the kernel to quickly set the TLS base
(and optionally not change it if it is already correct).

Note that only amd64 uses this option in the kernel; riscv and i686 still
handle this in userspace, but also expose their tlsdesc to the kernel.

The other benefit to this is debugging - it's often helpful for me to have
access to this from the kernel.

As a historic note, this isn't the first arch-dependent tidbit in procdata.
The transition_stack (vcore's stack) was added to procdata since sparc couldn't
handle not having a stack (x86 was just loading %sp in assembly before _start).

7 years agox86: catches buggy rdtscp
Barret Rhoden [Wed, 31 Jul 2013 00:20:30 +0000 (17:20 -0700)]
x86: catches buggy rdtscp

Not sure if this is a "bug in qemu" or something I'm doing wrong.  But rdtscp
should drop the value of MSR_TSC_AUX in ecx.  If this fails, it busts our
FAST_COREID.  If this happens to you in a VM, just change your CONFIG.

If it happens on hardware, let me know.

7 years agoRemoves unnecessary TLS var from vcore.c
Barret Rhoden [Tue, 30 Jul 2013 02:27:28 +0000 (19:27 -0700)]
Removes unnecessary TLS var from vcore.c

Not sure why that was in TLS.  If I had a good reason, then I should
have left a note...

7 years agoUthreads do not require TLS
Barret Rhoden [Tue, 30 Jul 2013 02:11:03 +0000 (19:11 -0700)]
Uthreads do not require TLS

By default, individual uthreads will not have their own TLS; they will piggyback
off of their vcore's TLS.  The uthread library can handle individual
uthreads having TLS.

Note that thread0 (from glibc) will have TLS, no matter what.   FYI,
thread0's TLS gets used at exit, and needs to be the same as when the
program started (C++ programs, fluidanimate at least).

2LSs choose whether or not their specific uthreads have TLS.  To be
somewhat compatible, pthreads will have them by default.  If you're app
doesn't need TLS, call pthread_need_tls(FALSE), preferably before call

For reference, this lowers the latency of the context switch (via the
untuned pthread_test 100 100000 1) from ~360ns -> 194ns.  That includes
3 mcs locks in the 2LS, which we could minimize.

7 years agoAdd basic timeout functionality to pthread futexes
Kevin Klues [Tue, 30 Jul 2013 03:28:56 +0000 (20:28 -0700)]
Add basic timeout functionality to pthread futexes

In the current implementation we simply launch a helper pthread that
calls sys_block(1000) in a tight loop.  It wakes up every millisecond
and checks if there are any futexes whose timeouts have expired and it
wakes them up. If there are no futexes waiting on a timer, we park the
pthread and wait until another futex is waited on that has timeout.

7 years agoUpdate futex code to faster method for blocking
Kevin Klues [Tue, 30 Jul 2013 00:18:12 +0000 (17:18 -0700)]
Update futex code to faster method for blocking

This method has proven to be significantly faster when using the 2LS
futex code in the context of lithe.  I ported it over from the futex
code I wrote for lithe as the 2LS.

7 years agoExpose akaros_syscall_sync through libc (XCC)
Kevin Klues [Sun, 28 Jul 2013 23:59:38 +0000 (16:59 -0700)]
Expose akaros_syscall_sync through libc (XCC)

This function takes a syscall struct as a parameter and performs a
single synchyronous syscall using that struct.  If the syscall is not
complete upon exiting the kernel the currently running thread will be
handed off to the 2LS and blocked there.

7 years agoFixes assembly input clobbers (XCC)
Barret Rhoden [Sat, 27 Jul 2013 05:21:57 +0000 (22:21 -0700)]
Fixes assembly input clobbers (XCC)

You can't list an input as a clobber, so to actually clobber it, you
need to use it as an output.  So we use a dummy variable, and hopefully
the compiler does the right thing.

Note we can't (or at least shouldn't) output to the same input variable
(using "+D"(a0), for instance).  We aren't actually outputting a valid
value for any variable; it's usually gibberish or 0, and we don't want
the compiler to *not* save and restore any input args that it may need in
the future.

Also note that these issues are just with the software contexts, where I
was trying to use the asm clobbers to mimic the amd64 calling
convention, so none of the HW TFs were affected.

Reinstall your cross compiler.

7 years agoAdds a KMSG tracer
Barret Rhoden [Sat, 27 Jul 2013 00:14:35 +0000 (17:14 -0700)]
Adds a KMSG tracer

This traces all kernel messages and MCP proc_yields (which affect the
local context much like a KMSG).  It's a non-overwrite, so you'll need
to reset the ring to get up-to-date results.

Default is off.

7 years agoAdds a pcpui trace buffer for generic events
Barret Rhoden [Sat, 27 Jul 2013 00:09:51 +0000 (17:09 -0700)]
Adds a pcpui trace buffer for generic events

Users pick the next available type and provide a handler.  You can run
all the handlers or reset the trace ring from the kernel monitor (e.g.
trace pcpui, trace pcpui-reset).

All users should use the same access method (racy, no overwrite).  If
some subsystem uses overwrite, they'll end up starving the

7 years agoAdds a tracing facility for in-kernel events
Barret Rhoden [Sat, 27 Jul 2013 00:05:59 +0000 (17:05 -0700)]
Adds a tracing facility for in-kernel events

Useful for debugging.  Check out k/i/trace.h for info and how to use it.

7 years agoCleans up restartcore/smp_idle, fixes corner case
Barret Rhoden [Thu, 25 Jul 2013 18:37:02 +0000 (11:37 -0700)]
Cleans up restartcore/smp_idle, fixes corner case

It was possible to have a proc's address space hang around on a core, if that
core was idle, then received a __startcore, followed quickly by __death, and
then was never used again.

This cleans up this situation (abandon_core() aggressively if there is no
owner), and cleans up proc_restartcore() and smp_idle() a little.

7 years agox86: smp_boot no longer uses smp_call_*
Barret Rhoden [Sat, 20 Jul 2013 01:05:17 +0000 (18:05 -0700)]
x86: smp_boot no longer uses smp_call_*

Instead, we have a dedicated IRQ vector that does nothing but return.
This is enough to break the non-core0s out of their hlt.

Other than it being nice to not need the ancient smp_callsi_ (which
might go away), this is needed if you run with FAST_COREID.  Before,
smp_call_ would trigger a full irq_handler(), which increments pcpui
irq_depth, before core_id() is ready.  The other option would be to use
a core_id_early() call in irq_handler(), which I dislike.

Also, don't repurpose the POKE_HANDLER() without thinking about how it
might interact with abort_halt().

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