11 years agoDisabled the printf() workaround to avoid remote syscalls.
Paul Pearce [Tue, 16 Jun 2009 07:14:46 +0000 (00:14 -0700)]
Disabled the printf() workaround to avoid remote syscalls.

Commented out the hack in fstat() and isatty() to avoid remote syscalls. This hack allows printf to work
even without remote syscalls functioning. Now, remote syscalls are needed for printf.

11 years agoGot the File IO tests up and running over ethernet.
Paul Pearce [Tue, 16 Jun 2009 06:59:05 +0000 (23:59 -0700)]
Got the File IO tests up and running over ethernet.

This is incredibly hacky. I am simulating UDP/IP at the driver/syscall level because we lack a network stack.
The code in handle_rx_packet() is really really ugly and a total hack. This needs to go away.

I also fixed the tcp/ip/udp checksum flags in the descriptor register. Their offsets are now correct
(and undocummented in the spec sheet). They need to be handled as part of the vlan field instead of command.
Note: The nic is stupid. If you send a UDP packet with the TCP checksum enabled, it sticks 16 bits where
it thinks it should go, right over your data.

11 years agoFixed bug with sysenter not restoring interrupts. Cleaned up mistakenly left in debug...
Paul Pearce [Mon, 15 Jun 2009 04:28:59 +0000 (21:28 -0700)]
Fixed bug with sysenter not restoring interrupts. Cleaned up mistakenly left in debug lines in nic driver

Sysenter, somewhat covertly, disables the IF bit in the eflags register upon its invokation. This is
described only in the RTL, not the functional description. The result of this is upon entering userland,
if syscalls were serviced by the sysenter facility, interrupts would be disabled and not come back online.
The fix is to force the IF bit back  on as soon as we get inside the syscall wrapper.

Also removed some debugging stuff from rl8168.c.

11 years agoFixed a typo in syscall.c introduced in last commit.
Paul Pearce [Sat, 13 Jun 2009 05:17:15 +0000 (22:17 -0700)]
Fixed a typo in syscall.c introduced in last commit.

I accidently removed a definition instead of a debug statement before commiting before.

11 years agoBuilt a basic framework for sending ethernet packets from userland. Switched from...
Paul Pearce [Sat, 13 Jun 2009 04:50:39 +0000 (21:50 -0700)]
Built a basic framework for sending ethernet packets from userland. Switched from measurements to matrix.

Built a syscall framework called sys_eth_write/read that sends and receives packets. It does this by (stupidly) wrapping the data to send with
hard coded ETH/IP/UDP headers, and pushing it out on the NIC. There is currently no mechinism for receiving packets, as userland interrupts are not
working, and those are required for incoming notification. This current version will send properly formatted UDP packets out on the wire.

I also modified newlib_backend to use this new medium, and (for debugging) reenabled the hacks on isatty and fstat to make printf not go over the wire.

I also merged back in the code to switch  to the user enviroment, and run matrix.c.

11 years agoFixed a typo in monitor.c
Paul Pearce [Thu, 11 Jun 2009 21:46:42 +0000 (14:46 -0700)]
Fixed a typo in monitor.c

Upon typing showmapping, it responds saying the usage is showmappings, with
an s. I just removed the s. When merging this branch in, may want to include
this change.

11 years agoMoved all NIC related stuff into rl8168.c/h from testing. Cleaned up nic code
Paul Pearce [Thu, 11 Jun 2009 20:44:32 +0000 (13:44 -0700)]
Moved all NIC related stuff into rl8168.c/h from testing. Cleaned up nic code

I moved all the PCI/NIC related work from testing.c/h into rl8168.c/h. rl8168
is the chipset used in the development boxes. It is the rl8168d/8111d. I made
the required changes to the Makefrag, and called the initalize function from

I also cleaned up the code greatly. I moved each phase of the startup process
into its own function, moved print msgs to macros for easy on/off, and moved
all magic numbers to be #define's at the top of the file, with sensible names.

The location of the #define's will move from .c to .h when I'm further along
in the dev process.

11 years agoFixed up sysenter/sysexit semantics to allow another environment to be run on exit
Kevin Klues [Sat, 27 Jun 2009 04:05:03 +0000 (21:05 -0700)]
Fixed up sysenter/sysexit semantics to allow another environment to be run on exit

Looking at the diff files it should be fairly obvious what was done.  Also, I fixed up some errors we had in the 'ifdefs' for SERIAL_IO in console.c

11 years agoPulled out the standard gcc header files into a fixed directory to compile against
Kevin Klues [Wed, 24 Jun 2009 18:06:44 +0000 (11:06 -0700)]
Pulled out the standard gcc header files into a fixed directory to compile against

I used the ones from my i386-elf cross compiler on my macbook.  By pulling these out we are sure that whoever is compiling our kernel with any version of gcc / some other compiler, they will always include the same headers.

11 years agoFixes page refcounts in smp boot
Barret Rhoden [Thu, 18 Jun 2009 04:01:29 +0000 (21:01 -0700)]
Fixes page refcounts in smp boot

11 years agoProperly unmasks master PIC for IRQs 8 and up
Barret Rhoden [Wed, 17 Jun 2009 22:07:14 +0000 (15:07 -0700)]
Properly unmasks master PIC for IRQs 8 and up

11 years agoAdded beginnings of a proper kmalloc implementation.
Kevin Klues [Wed, 17 Jun 2009 20:44:32 +0000 (13:44 -0700)]
Added beginnings of a proper kmalloc implementation.

Right now the algorithm is vdery simple and there is lots of wasted space.  The goal is to start writing kernel code that can properly use the kmalloc interface and innovate on its implementation as we move forward.

11 years agoKernel and roslib now use newlib's queue.h
Barret Rhoden [Tue, 9 Jun 2009 03:05:04 +0000 (20:05 -0700)]
Kernel and roslib now use newlib's queue.h

Newlib's queue.h remains unchanged.  The kernel and roslib use a
modified copy (with ivy annotations), but is otherwise the same
(specifically regarding typedefing).  roslib's sys/queue.h is actually a
symlink to the kernel's - can think about changing this.

Note that due to ros/env.h, the kernel and roslib need to have the same
include path to queue.h (sys/queue.h).  The env.h interface will change

Also, changed the asynccall to use a TAILQ, and moved the userspace
specific syscall_desc list to userspace.

11 years agoDeputizes env.c. Update your Ivy!
Zach Anderson [Sun, 7 Jun 2009 20:53:59 +0000 (13:53 -0700)]
Deputizes env.c.  Update your Ivy!

Annotates env.c and includes.  There are still a few TODOs.  Barret
added a couple things to make it work with some of the changes already
on master (UGDATA, run_env_handler).

11 years agoMinor changes to some makefiles to make things work in the presence of a cross-compiler.
Kevin Klues [Sat, 6 Jun 2009 07:03:44 +0000 (00:03 -0700)]
Minor changes to some makefiles to make things work in the presence of a cross-compiler.

FINALLY got things to compile on my mac by setting up a cross compiler.  Now I can do native development and not rely on that stupid virtual machine that kept crashing my computer....

11 years agoSerial I/O is toggleable
Barret Rhoden [Sat, 6 Jun 2009 01:17:44 +0000 (18:17 -0700)]
Serial I/O is toggleable

If you want serial I/O, make with SERIAL_IO defined.  That will turn off
serial console output and enable the serial read/write syscalls.

11 years agoSplit atomic library
Barret Rhoden [Sat, 6 Jun 2009 01:08:28 +0000 (18:08 -0700)]
Split atomic library

Now an arch/atomic that has lower layer atomic primitives, and the
regular include/atomic (and a userspace version) with higher level
primitives (which should be renamed or changed later).  Esp since they
are still arch specific.

Also removed printks from some userspace apps, and changed back the
printk macro.

11 years agoMeasurement infrastructure and tests
Barret Rhoden [Fri, 5 Jun 2009 20:42:07 +0000 (13:42 -0700)]
Measurement infrastructure and tests

test_run_measurements and measurements.c are closely coupled.  Make sure
the case statements match up.

11 years agoFix some races with env destruction and dispatch
Barret Rhoden [Thu, 4 Jun 2009 23:11:29 +0000 (16:11 -0700)]
Fix some races with env destruction and dispatch

11 years agoAdded cache_buster syscall
Barret Rhoden [Tue, 26 May 2009 03:05:07 +0000 (20:05 -0700)]
Added cache_buster syscall

The cache-buster syscall takes a few more options, so we don't have
to change it to run a different test.  Also changed the roslib syscall
wrappers to have a meaningful name.

11 years agoUserspace atomics library
Barret Rhoden [Thu, 4 Jun 2009 21:50:48 +0000 (14:50 -0700)]
Userspace atomics library

11 years agoAdds a shared RW page to every address space
Barret Rhoden [Thu, 4 Jun 2009 21:33:31 +0000 (14:33 -0700)]
Adds a shared RW page to every address space

11 years agoFixed how errno is handled with isatty()
Paul Pearce [Thu, 4 Jun 2009 02:08:46 +0000 (22:08 -0400)]
Fixed how errno is handled with isatty()

For some reason, isatty() defines an error response to be a return value of 0, not -1. In that case
errno is set. I modified parts of newlib_backend.c to handle this unique case.

11 years agoCleaned up send_message, corrected errno scope, added errno support.
Paul Pearce [Thu, 4 Jun 2009 01:15:30 +0000 (21:15 -0400)]
Cleaned up send_message, corrected errno scope, added errno support.

Rewrote send_message to reduce redundent code. Also made changes to
function to facilitate reporting errno for all file io syscalls. Made
change to the file syscalls themselves to deal with errno reporting.
Removed #undef .. extern in newlib_backend.h that was creating 2 copies
of errno. This now lets userlab apps get access to errno by simply
including errno.h. Also made various housekeeping code changes.

Created a new test file, file_error to test errno functionality, and put
hooks into matrix.c.

11 years agoCleaned up the newlib file functions and headers to conform to ros standards.
Paul Pearce [Wed, 3 Jun 2009 21:25:43 +0000 (17:25 -0400)]
Cleaned up the newlib file functions and headers to conform to ros standards.

Made all lines (sans TODO comments) 80 char max, also changed from
syscall_id to syscall_id_t, with an explicit definition of size to uint32_t.
Also lost the byte macro and replaced it with just a char reference.
Cleaned up some random code tidbits.

11 years agoMove file_io to a matrix-run app. Cleaned up matrix and file_io.
Paul Pearce [Mon, 1 Jun 2009 06:03:00 +0000 (02:03 -0400)]
Move file_io to a matrix-run app. Cleaned up matrix and file_io.

Rewrote file_io to be an application executed from our "shell" app. Cleaned
up both matrix and file_io to be more presentable for the retreat. Changed
the tests in file_io to be more interactive. Done.

11 years agoChanged the format of the stat struct to conform to MAC OSs format.
Kevin Klues [Fri, 5 Jun 2009 01:19:57 +0000 (18:19 -0700)]
Changed the format of the stat struct to conform to MAC OSs format.

11 years agoFixed print macros in stdio.h, fixed bug in readline.c, expanded matrix.c
Paul Pearce [Sun, 31 May 2009 23:42:24 +0000 (19:42 -0400)]
Fixed print macros in stdio.h, fixed bug in readline.c, expanded matrix.c

Fixed a bug in the arguments of the printk and printd macros in stdio.h. This bug
caused strange behavior in user land apps, such as the arguments to sbrk being

Corrected the behavior of readline() to detect errors on the return value, not
the character returned, and removed a floating point printf format character.

Expanded matrix.c to include the full help message and execute the correct apps.

11 years agoAdded some more apps / functionality to the matrix shell
Kevin Klues [Sun, 31 May 2009 04:35:07 +0000 (21:35 -0700)]
Added some more apps / functionality to the matrix shell

11 years agoDelete open_read.c
Paul Pearce [Sun, 31 May 2009 21:50:05 +0000 (17:50 -0400)]
Delete open_read.c

11 years agoAdded serial hw flow control, rest of the file syscalls, updated tests
Paul Pearce [Sun, 31 May 2009 21:46:31 +0000 (17:46 -0400)]
Added serial hw flow control, rest of the file syscalls, updated tests

Set two bits high in the serial control register, to enable hardware
flow control. Also filled in the bodies for lseek, link, unlink, stat,
and fstat. However I did not enable fstat/stat over serial, as the stat
structure is still inconsistent between ros and server.

Also changed open_read.c to file_io.c, and added additional tests.

11 years agoThe beginnings of a shell for launching user apps and taling over serial to a remote...
Kevin Klues [Sat, 30 May 2009 12:01:20 +0000 (05:01 -0700)]
The beginnings of a shell for launching user apps and taling over serial to a remote server.

11 years agoCleaned up the return values for all system calls.
Kevin Klues [Sat, 30 May 2009 09:55:06 +0000 (02:55 -0700)]
Cleaned up the return values for all system calls.

Defined a type intreg_t and uintreg_t to denote values stored into variables in a platform
independent manner.  This type is now returned by the top level syscall handler, with the
semantics of its meaning needing to be interpreted by the caller upon its return.  Also cleaned
up a bit of newlib backends handling of the standard stream file descriptors.

11 years agoChanged debug() format inside newlib_backend, added multiline print test
Paul Pearce [Sat, 30 May 2009 00:22:16 +0000 (20:22 -0400)]
Changed debug() format inside newlib_backend, added multiline print test


11 years agoExpanded on open/read test, fixing some small bugs along the way.
Kevin Klues [Fri, 5 Jun 2009 01:12:09 +0000 (18:12 -0700)]
Expanded on open/read test, fixing some small bugs along the way.

11 years agoDisabled IVY for user apps. Altered the open/read userapp test.
Paul Pearce [Fri, 29 May 2009 07:20:43 +0000 (03:20 -0400)]
Disabled IVY for user apps. Altered the open/read userapp test.


11 years agoChanged return type of serial_read_byte(), removed debugging comments.
Paul Pearce [Fri, 29 May 2009 00:04:31 +0000 (20:04 -0400)]
Changed return type of serial_read_byte(), removed debugging comments.

Fixed the return type of serial_read_byte() to be of type int, instead of
uint16. This prevented a return value of -1 to denote no data avaiable.
Also removed several printk statements specifying the systemcall occuring

11 years agoFixed our newlib_backend to use the systems unistd for func decls.
Kevin Klues [Thu, 28 May 2009 14:17:41 +0000 (07:17 -0700)]
Fixed our newlib_backend to use the systems unistd for func decls.

Before we had all definitions in a newlib_backend.h file, now we are doing things the more
correct way.  Applications should #include unistd.h and other similar header files to get access
to teh funciton declarations for the system call wrappers implemented in newlib_backend.c

11 years agoFixed up return value for sys_serial_write on both kern/user
Kevin Klues [Thu, 28 May 2009 13:37:05 +0000 (06:37 -0700)]
Fixed up return value for sys_serial_write on both kern/user

11 years agoAdded open_read, enabled it to run.
Paul Pearce [Thu, 28 May 2009 19:19:53 +0000 (15:19 -0400)]
Added open_read, enabled it to run.

11 years ago Implemented the bodies of the serial read/write syscalls on both user/kernel...
Kevin Klues [Thu, 28 May 2009 10:11:52 +0000 (03:11 -0700)]
Implemented the bodies of the serial read/write syscalls on both user/kernel side

    We should consider creating a kern/serial.c file for serial stuff instead of bundling it in

11 years agoFixed return type of strnlen(), removed sseek, swrite, added debug stmts
Kevin Klues [Wed, 27 May 2009 22:32:41 +0000 (15:32 -0700)]
Fixed return type of strnlen(), removed sseek, swrite, added debug stmts

Changed the return type of strnlen() to be size_t instead of int.
Removed sseek and swrite from newlib_backend, as well as added in
  the function prototypes for the 19 syscall wrappers.
Added in debugging print statements into the various calls, and redefined
  debug to print nothing.

11 years agoFixed those damn __sseek and __swrite problems!
Kevin Klues [Wed, 27 May 2009 19:59:41 +0000 (12:59 -0700)]
Fixed those damn __sseek and __swrite problems!

Needed to recompile newlib undefining all linux/unix specific macros defined by gcc.  To do this
you use a -U on the command line, and to even see what these defines are you can do a -dM.

11 years agoAdded a debug statement for debugging stuff in parlib.
Kevin Klues [Wed, 27 May 2009 16:40:39 +0000 (09:40 -0700)]
Added a debug statement for debugging stuff in parlib.

Just pulled out printf implementation from roslib and renamed everything debug*.  Also hacked the
menager to only run our one single enviroment and then die.

11 years agoFixed up some stuff to try and get printf from newlib to work since sbrk is now in...
Kevin Klues [Wed, 27 May 2009 13:38:44 +0000 (06:38 -0700)]
Fixed up some stuff to try and get printf from newlib to work since sbrk is now in place.

Doesn't seem to work yet though.  I basically have a redirect in teh body of the write() function
that says if its a write to stdout to call the sys_cputs syscall instead.  Somehow there is
something weird going on in the manager though where I can't just create one environment, run it
and then panic immediately.  I get stuck in some weird infinite loop where it creates an
environment, destroys it, gives me a whole bunch of kernel warnings, and then repeats.  Looking
into this now...

11 years agoMinimal implementation of sbrk that allocates from a static array
Kevin Klues [Wed, 27 May 2009 11:03:47 +0000 (04:03 -0700)]
Minimal implementation of sbrk that allocates from a static array

What we really need is to request memory from the OS and return pointers from there until we run
out and need to request more.  Barret and I talked a bit about this yesterday i.e. why not just
return chunks of pages through sbrk?  It could just as easily "malloc" pages of memory from the
OS and return pointers to those instead of relying on the presence of a HEAP that grows towards
the stack.

11 years agoAdded function bodies for open, close, read, and write, as well as supporting functio...
Paul Pearce [Wed, 27 May 2009 03:16:08 +0000 (20:16 -0700)]
Added function bodies for open, close, read, and write, as well as supporting functions, in parlib.c/h

Filled in the function bodies, as well as creating send_message(), write_to_channel(), and read_from_channel() to parlib.c.
Also added supporting macros to parlib.h, as well as the new prototypes for the new functions.

11 years ago Added stubs for sys_serial_read and sys_serial_write for remote syscall servicing.
Kevin Klues [Fri, 5 Jun 2009 00:52:44 +0000 (17:52 -0700)]
 Added stubs for sys_serial_read and sys_serial_write for remote syscall servicing.

11 years agoReorganized the directory structure, placing newlib under user/parlib.
Kevin Klues [Fri, 5 Jun 2009 00:43:42 +0000 (17:43 -0700)]
Reorganized the directory structure, placing newlib under user/parlib.

These changes required modifications to some header files as well as some Makefrags to conform to the new structure.

11 years agoFix unnecessary switching of CR3 registers in syscall handling.
David Zhu [Thu, 28 May 2009 21:06:31 +0000 (14:06 -0700)]
Fix unnecessary switching of CR3 registers in syscall handling.

11 years agoSMP boot cleanup
Barret Rhoden [Thu, 28 May 2009 00:58:21 +0000 (17:58 -0700)]
SMP boot cleanup

Deallocates the *page table* used by the smp_boot mapping, which was
being copied into every processes address space, which caused problems.

Need to take a look at UTOP and ULIM and add a check in env_vm_setup to
check for these things in the future.  Do this when gutting UPAGES.

11 years agominor changes, disregard
Barret Rhoden [Wed, 27 May 2009 07:33:27 +0000 (00:33 -0700)]
minor changes, disregard

11 years agoMinor touchups after rebase to make it work
Kevin Klues [Tue, 26 May 2009 05:54:28 +0000 (22:54 -0700)]
Minor touchups after rebase to make it work

11 years agoCan process async calls on processes that die
Barret Rhoden [Mon, 25 May 2009 23:15:15 +0000 (16:15 -0700)]
Can process async calls on processes that die

Has protections and a ref count to keep a process alive while its
address space/context is being used.  Specifically, when processing
async calls.

11 years agoAdds sys_getcpuid and sys_cache_invalidate
Barret Rhoden [Fri, 22 May 2009 07:33:57 +0000 (00:33 -0700)]
Adds sys_getcpuid and sys_cache_invalidate

11 years agoCan run batches of processes repeatedly.
Barret Rhoden [Fri, 22 May 2009 07:03:34 +0000 (00:03 -0700)]
Can run batches of processes repeatedly.

Created a manager function that runs on core 0, which can create batches
of environments, run one on core 0, and then continue.  It's a bit
hacky, since there's the issue of not being able to return from env_run

11 years agoDecouples running remote envs from smp_call
Barret Rhoden [Thu, 21 May 2009 22:14:33 +0000 (15:14 -0700)]
Decouples running remote envs from smp_call

Adds a workqueue, checked from smp_idle, that allows the env to run to
be added from within the smp_call interrupt handler, but then run after
iretting from the interrupt (in smp_idle).  Needs some more logical
organization, as well as work with env_destroy and run from a management
core (core 0).

11 years agoManually needed to copy the shadowed timer.c file from user/parlib/src into kern/src
Kevin Klues [Tue, 26 May 2009 04:13:57 +0000 (21:13 -0700)]
Manually needed to copy the shadowed timer.c file from user/parlib/src into kern/src

11 years agoAnother round at reorganization
Kevin Klues [Tue, 26 May 2009 03:24:57 +0000 (20:24 -0700)]
Another round at reorganization

This time 'parlib' has become the wrapper around newlib stuff, and 'roslib' is our somehwat ghetto libc
implementation weve been using since the beginning.  We also have the notion of architecture specific
includes, as well as includes shared by user/kernel space in the same style as the 'linux' include
directory in a linux distribution.

11 years agoFixed some inconsistent placement of compiled objects
Kevin Klues [Mon, 25 May 2009 15:49:45 +0000 (08:49 -0700)]
Fixed some inconsistent placement of compiled objects

11 years agoMassive reorganizing and making all the makefiles consistent.
Kevin Klues [Mon, 25 May 2009 00:47:38 +0000 (17:47 -0700)]
Massive reorganizing and making all the makefiles consistent.

Only minor code changes to make include directories correct.  Still haven't fixed the problem of the
kernel relying on compiling some user space library files.

11 years agoAll programs should die gracefully now since fixing sbrk to return -1
Kevin Klues [Fri, 22 May 2009 22:46:56 +0000 (15:46 -0700)]
All programs should die gracefully now since fixing sbrk to return -1

Before, sbrk was trying to actually do something facny which caused us to die because I just pulle
dthis implementation off the newlib page.  I just make it die now returing the proper return value
indicating no memory is available.  This way we can compile/run a printf based applications (which
doesnt' actually print anything), but at least it doesnt case a page fault or an invalid opcode trap
as it was doing before...

11 years agoBeginnings of getting user apps to compile against newlib
Kevin Klues [Fri, 22 May 2009 22:09:57 +0000 (15:09 -0700)]
Beginnings of getting user apps to compile against newlib

I've compiled newlib outside of this source tree with the -nostdinc option for linking so that none
of the libraries from my local machine got bundled with it as it was compiled.  It is installed in
the newlib directory along with some files for providing the necessary libc wrappers for our
platform.  The bodies of the functions found in libc_wrappers.c should be filled in to define how
these functions interact with ROS.  Right now, noe of them do the right thing :)  We will fill them
in as we go along...

11 years agobug fixes for timer and timer training.
David Zhu [Tue, 26 May 2009 00:50:01 +0000 (17:50 -0700)]
bug fixes for timer and timer training.

several bugs fixed.
Serialized read tsc was clobbering register values.
We were getting negative reading for trained timer overhead.
Fixed pool implementation so we can iterate through allocated pool

11 years agoMerged the timing and measurement stuff together and cleaned it up a bit
Kevin Klues [Fri, 22 May 2009 07:50:49 +0000 (00:50 -0700)]
Merged the timing and measurement stuff together and cleaned it up a bit

This involved moving some things around as well as renaiming some things.  I'm still not
happy with the name timer.h/c because these names imply fucntionality such as being able to
set an interrrupt based timer, etc.  But we can change this later if we want to.  I also made
some small modifications to finally get rid of all remnants of the "jos" tainted throughout
our code.  Additionally, there was some reorganization of who includes what header files so as
to be consistent with what is really needed by any individual file.

11 years agoInitial implementation of timer pool and timer tag
David Zhu [Fri, 22 May 2009 03:18:35 +0000 (20:18 -0700)]
Initial implementation of timer pool and timer tag

Each function can call function begin and end macros to do single run measurement and aggregate measurement.
At the end of the run, we can go through the timer pool to print out each timer measurement.

11 years agoAdded some function to read the tsc with start/stop semantics
Kevin Klues [Thu, 21 May 2009 17:29:31 +0000 (10:29 -0700)]
Added some function to read the tsc with start/stop semantics

In addition to these functions, there is a training function that figures out what the correct
overhead of making the calls is so that it can be factored out before returning the time
difference.  This has not been tested on real hardware yet, and is pretty flaky in my
bochs-inside-vmware environment.  Logic seems sound though...

11 years agoLAPIC Timer work
Barret Rhoden [Thu, 21 May 2009 00:44:40 +0000 (17:44 -0700)]
LAPIC Timer work

Adds a wrapper to set up the LAPIC Timer in usec, instead of ticks.
Also tweaks some of the training and testing to avoid extra interrupts.

11 years agoFixed udelay_pit to be aware of the PIT divisor.
Barret Rhoden [Wed, 20 May 2009 23:00:04 +0000 (16:00 -0700)]
Fixed udelay_pit to be aware of the PIT divisor.

11 years agoChanges the serial port to output at 115200
Barret Rhoden [Tue, 12 May 2009 23:05:39 +0000 (16:05 -0700)]
Changes the serial port to output at 115200

11 years agoSYSENTER support on other cores other than core 0.
David Zhu [Tue, 12 May 2009 00:03:55 +0000 (17:03 -0700)]
SYSENTER support on other cores other than core 0.

11 years agoSYSENTER support and using SYSENTER as default syscall method.
David Zhu [Mon, 11 May 2009 23:37:49 +0000 (16:37 -0700)]
SYSENTER support and using SYSENTER as default syscall method.

11 years agoCache-buster syscall, sync and async varieties
Barret Rhoden [Mon, 11 May 2009 01:10:45 +0000 (18:10 -0700)]
Cache-buster syscall, sync and async varieties

Just grabs a lock and writes a value to a certain number of entries to
an array in kernel space.  Right now, the array is sitting at
0xd0000000, which is far from being allocated for anything.

Also added a wrapper function to get both an async and a sys desc, which
seems to be the common case for a lot of syscalls.

11 years agoHandles multiple simultaneous synchronous syscalls
Barret Rhoden [Sat, 9 May 2009 22:17:16 +0000 (15:17 -0700)]
Handles multiple simultaneous synchronous syscalls

Running multiple processes has worked before, but we needed a per-core
curenv to track which process was in the kernel on that specific core
while processing a syscall.

Also changed some debugging statements to include the core number.

11 years agoAsync error handling
Barret Rhoden [Sat, 9 May 2009 05:45:01 +0000 (22:45 -0700)]
Async error handling

Receives error return values and passes them back up the userspace
stack.  It's up to the top levels to deal with them.  cprintf currently
does not, and null does.

Also adjusted measure_ to handle an error (presumably RING_FULL), and
not try that iteration again.  The numbers may be a little odd from it
if the error doesn't happen on the first outer iteration.

Also, for any real measurements, note the final parameter of

11 years agoAsync call responses
Barret Rhoden [Sat, 9 May 2009 02:48:35 +0000 (19:48 -0700)]
Async call responses

Pass back some sort of response from the syscalls within an async call.
Could consider passing in a function that does the aggregation of
responses, since it may be syscall specific.

Also, process_syscalls no longer resets the machine when trying to
process the syscalls of a process that's been freed.  Though there is no
sync protection with that yet.

11 years agoAdded an asynchronous sys_null_async() call and wrappers
Kevin Klues [Fri, 8 May 2009 01:06:53 +0000 (18:06 -0700)]
Added an asynchronous sys_null_async() call and wrappers

11 years agoMeasurement for async syscalls
Barret Rhoden [Thu, 7 May 2009 22:48:47 +0000 (15:48 -0700)]
Measurement for async syscalls

Needs error checking on the userspace syscall path.

11 years agoAsync call tweaks
Barret Rhoden [Thu, 7 May 2009 21:06:38 +0000 (14:06 -0700)]
Async call tweaks

Can run a cleanup function for an entire async call.  Also manages POOL
memory better (frees and 0's).

11 years agocprintf_async works with strings greater than 256
Barret Rhoden [Thu, 7 May 2009 08:36:33 +0000 (01:36 -0700)]
cprintf_async works with strings greater than 256

Had to change all of the vprintf family of functions to pass a **buf
instead of just a *buf, so putch_async could change the buffer in use
when it submitted an async call.

Also turned off deputy in kern/printf.c.  Sorry Zach.

11 years agoCleanup functions for syscalls
Barret Rhoden [Thu, 7 May 2009 07:39:31 +0000 (00:39 -0700)]
Cleanup functions for syscalls

11 years agoCan wait on async library calls
Barret Rhoden [Thu, 7 May 2009 06:22:12 +0000 (23:22 -0700)]
Can wait on async library calls

Also uses Pools for the allocation of bookkeeping for the syscall and
async call returns.  Still can't free, and printfing more than 256
doesn't work right.

11 years agoAsync waiting right above the kernel
Barret Rhoden [Wed, 6 May 2009 22:06:30 +0000 (15:06 -0700)]
Async waiting right above the kernel

Can wait on a descriptor for an async syscall from any frontring.
Currently waits manually in cprintf_async right after making the calls.

11 years agoMeasurement infrastructure
Barret Rhoden [Wed, 6 May 2009 18:16:49 +0000 (11:16 -0700)]
Measurement infrastructure

TSC frequency is stored in the env_t for now.

11 years agoAdded pool implementation for statically sized pools
Kevin Klues [Wed, 6 May 2009 23:02:06 +0000 (16:02 -0700)]
Added pool implementation for statically sized pools

11 years agolapic_wait_to_send tests
Barret Rhoden [Tue, 21 Apr 2009 21:43:04 +0000 (14:43 -0700)]
lapic_wait_to_send tests

Initial work, just blasts IPIs, can adjust to not wait, etc.

11 years agoAsync syscall handling
Barret Rhoden [Wed, 6 May 2009 02:27:09 +0000 (19:27 -0700)]
Async syscall handling

Separate function that processes generic async syscalls.  The backring
is in the env_t.  Currently pushes responses back to userspace, though
userspace doesn't know how to get responses.  All syscalls are processed
synchronously once actually in the kernel.

11 years agouse tsc directly in userspace until user level timer facility is made
David Zhu [Tue, 5 May 2009 22:50:43 +0000 (15:50 -0700)]
use tsc directly in userspace until user level timer facility is made

11 years agolapic timer calibration and gettimer/getfreq
David Zhu [Tue, 5 May 2009 22:03:37 +0000 (15:03 -0700)]
lapic timer calibration and gettimer/getfreq

Implemented lapic timer calibration and provide abstraction of gettimer
and getfreq to be used in the future to choose between different timers.

11 years agoAdded the null syscall and a userapp that exploits it.
Kevin Klues [Tue, 5 May 2009 06:24:44 +0000 (23:24 -0700)]
Added the null syscall and a userapp that exploits it.

Still need to make an async version of the null syscall and change
init.c to run it correctly.  I made the changes locally, but didn't want
to push the changes in init.c to the global tree.

11 years agoXen Ring Buffers
Barret Rhoden [Sat, 2 May 2009 03:48:14 +0000 (20:48 -0700)]
Xen Ring Buffers

Adds Xen's ring buffers and uses them in a rudimentary manner to do the
cprintf_async syscalls.  The lib/syscall currently prints the string
twice.  Done just for testing, will be gone next commit.

11 years agoPoor-mans async printf support for userspace
Barret Rhoden [Fri, 1 May 2009 23:30:37 +0000 (16:30 -0700)]
Poor-mans async printf support for userspace

It's very rudimentary.  Not threadsafe, and it only allows 10
cprintf_asyncs.  Ever.  No tracking of when the async calls are done.
If putch uses more than one buffer, the overall count return is a lie
too.  The userspace side of syscall_async can only send two calls.

11 years agoChanged some handlers to use void*
Barret Rhoden [Fri, 1 May 2009 22:07:07 +0000 (15:07 -0700)]
Changed some handlers to use void*

Also uses the run_env handler to start two processes on different cores,
and shows how to receive their async syscalls.

11 years agoInterrupt handlers and smp_calls take a void*
Barret Rhoden [Mon, 27 Apr 2009 08:17:39 +0000 (01:17 -0700)]
Interrupt handlers and smp_calls take a void*

Allows the passing of a pointer to the receiver, set on a per-handler
basis.  Can now have several functions in flight that have different

11 years agosmp_call backend removed, other async tweaks
Barret Rhoden [Mon, 27 Apr 2009 06:47:37 +0000 (23:47 -0700)]
smp_call backend removed, other async tweaks

Merged the back and frontend to just one checklist, since they both
needed to be waited on.  Added some other checks to prevent trying to
grab a handler when none are available and will never become available
(like if they are all being waited on and the caller could be the
waiter).  Uses a global counter to track the number of outstanding
calls.  Also has support for commit_checklist to preemptively abort if
it knows it will take a while (locked or not clear).

11 years agosmp_call wait / backend work
Barret Rhoden [Mon, 27 Apr 2009 01:06:55 +0000 (18:06 -0700)]
smp_call wait / backend work

Fixes the problem mentioned in the previous commit, where you would
deadlock if you tried to use the same wrapper you were currently waiting
on.  There is still the possibility of deadlocking by holding too many
waits and then not being able to find a free handler, (get stuck in the
while loop).

Also, the backend is looking rather redundant with the front end.  Might
be time to get rid of the front end, and have the only toggling happen
on the backend of running the handler.  It'd mean we can't reuse the
vector until everyone is complete, not just everyone knows what function
to run.  But we can't reliably wait without that.  The other way would
be to have the backend list be on the caller's stack, so there's no
chance of clobbering.

11 years agosmp_call_function's wait is split out
Barret Rhoden [Mon, 27 Apr 2009 00:03:13 +0000 (17:03 -0700)]
smp_call_function's wait is split out

waiting on an smp_call can be done via a separate function afterwards,
so that you can do other things before waiting.

need to be very careful with this currently - you can easily deadlock
the system if you try to do an smp_call with a wait while having an
outstanding wait.  you could try to grab the same wrapper as the one you
are currently waiting on, and if the front end is clean, you'll spin
trying to commit to the backend checklist.  need to sort this.

11 years agoInvariant TSC check and SMP timeouts tweaked.
Barret Rhoden [Sat, 25 Apr 2009 06:22:41 +0000 (23:22 -0700)]
Invariant TSC check and SMP timeouts tweaked.

Had a case in KVM where core1 was lagging long enough to not even get to
increment the semaphore before everyone was done and the udelay was
done.  Adjusted up the timings more in accordance with some things
mentioned in the SDM.  We'll see if it works.

The invariant TSC is fairly new.  Supposedly it means it will always be
as good as wall-clock time.  That's probably true.

11 years agoRough asynchronous syscalls
Barret Rhoden [Sat, 25 Apr 2009 00:34:14 +0000 (17:34 -0700)]
Rough asynchronous syscalls

Creates an async mechanism to pass syscalls through the UDATA mapping.
Right now, it's just a struct Syscall right at the beginning of UDATA.
There's a cprintf_async userspace function that uses the sys_cputs_async
call (which is the only async call for now).  However, the userspace
printf functions aren't built to have multiple printfs in flight (async
or otherwise), so be careful.

11 years agoCan use per-process shared data page
Barret Rhoden [Fri, 24 Apr 2009 19:17:03 +0000 (12:17 -0700)]
Can use per-process shared data page

Basics to communicate from user -> kernel through shared memory, across
cores.  Just prints a string right now.