
  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    New guest vs. monitor eflags handling.
    IOPL dependent behaviour of STI/CLI/IRET.
    Bugfix: correct limit handling for big segments.
    Added new 'paging' guest kernel.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Added interrupt interception to kernel module and plugin interface.
    Moved IF handling to kernel-side, using a VIF/VIP mechanism.
    Various fixes/cleanups for the ICE plugin.
    Use US keyboard map in virtcode.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Added VGA font and updated README accordingly.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Simplified loading of guest kernel.
    Store page numbers instead of addresses in VM data structure.
    Removed all dependecies on host.h from non-OS specific files.
    Moved freemware.h to root, don't include kernel headers from user.
    Removed unnecessary #include directives.
    Removed Bochs macintosh GUI.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Removed the 'NT-flag hack'; instead set all but current code segment
    descriptors to type 'data' to make iret trap.  This allows to run the
    *unmodified* cooperative and preemptive kernels.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Clean up: split user.c into multiple files.
    Main executable renamed to 'freemware'.
    Added emulation for ins/outs instructions (including rep variants).
      [partially based on a patch due to Jens Nerche] 
    Added emulation of int3 instruction.
    Always use 'bx_printf' for Bochs debug output.

  - "Josh Wilmes"  <josh@hitchhiker.org>:
    Added curses UI for bochs plugin.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Added support for raising hardware interrupts to kernel module.
    Added INTR interface between user and plugins.
    Added PIC/PIT hardware models from Bochs.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Cleaned up user/kernel interface a bit.
    General clean up: CFLAGS simplified, compiler warnings fixed.

  - "Jens Nerche" <jn4@os.inf.tu-dresden.de>:
    Added emulation for more instructions.
    Updated 'virtcode' app to include minishell.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Miscellaneous bugfixes.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Simplified user mode instruction emulation interface.
    Increased Bochs timer update frequency.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Resource allocation and event handling for plugins.
    user.c reorganization / cleanup.
    Added I/O emulation plugin interface to Bochs.
    Updated 'virtcode' app to test keyboard input.

  - "Jens Nerche" <jn4@os.inf.tu-dresden.de>:
    Added support for in/out instruction emulation.
    Fixed and improved VM dump.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Fixed AT&T syntax suffixes.
    Added gdb remote protocol documentation.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Allow to change 'safe' guest flags from user mode.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Bugfix to 'mywait'.  Make VGA timer handler restartable.
    Fixed 'Power' button.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Removed .bin guest kernels (always use ELF).
    Compile shared libraries with -fPIC.
    Compile everything except kernel with debug symbols.
    Fixed memory overwrite bug in plugin handling.

  - "Oleg Drokin" <green@crimea.edu>:
    Disable VGA timer handler before unmapping guest memory.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Added support for plugins.  
    Make Bochs device emulation framework a plugin.
    Added ICE plugin for remote GDB debugger support.
    Added AT&T syntax instruction decoding to decode.c.
    Removed timeout handling; general clean-up of user.c.

  - "Kevin P. Lawton" <kevin@bochs.com>
    Integrated VGA, keyboard and certain IO device emulation framework
    from bochs into FreeMWare.  Writes to the text video memory
    are now displayed in an X window via the VGA emulation.  The
    cooperative kernel was tested and displays fine.
    Added periodic timer signal handler to user code, so it can
    drive updates in the IO device emulation.
    Expanded copyrights in user/ from 1999 to 1999-2000.

  - "Ramon van Handel" <vhandel@chem.vu.nl>:
    Updated README file.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Bugfix: return modified guest_context on EINTR.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Bugfix: monitor_pages should contain virtual, not physical addresses.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Removed linker script; retrieve module address range from kernel data.
    Use standard 'current_got_fatal_signal()' test.
    Return -EINTR instead of -ERESTARTSYS.
    Added some missing .globl definitions in nexus.S.
    Added NT flag hack to preemptive kernel as well.
    Bugfix: do *not* allow direct I/O access to guest!

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Added emulation for lgdt/lidt/lldt/ltr/int/iret instructions.
    Activated nexus selector migration (after lgdt).
    Hack: set NT flag during guest execution so that iret traps.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Improved/fixed kernel emulation operand decoding.
    Added decoding of some more instructions.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Separated monitor from guest initialization code.
    Prepared for monitor/nexus linear address / selector migration.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Made transition code more self-contained; don't rely on host 
    parameters not changing over time.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Map module pages into guest at arbitrary linear adresses
    by shifting the monitor segment bases accordingly. 
    Re-enabled monitor-side fault handlers.

  - "Kevin P. Lawton" <kevin@bochs.com>:
    Simplified nexus access via C structure.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Support for multiple VMs on the host (Linux) side.

  - "Kevin P. Lawton" <kevin@bochs.com>:
    Implemented transition into guest space using 'nexus' page.
    Prepared for managing multiple VMs.

  - <beef@niggard.org>:
    Fixed some warnings.

  - "Ben" <ben@comp.uark.edu>:
    Portability fixes for Linux versions >= 2.3.25.

  - "Todd T. Fries" <toddf@acm.org>:
    Portability fixes.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Fixed incorrect decoding of some instructions (user).
    Added effective address decoding to kernel emulator.

  - "Jens Nerche" <jn4@os.inf.tu-dresden.de>:
    Added beginnings of emulation framework.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Added Intel instruction decoder to 'user'.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Bug fix: run guest at IOPL 0, not IOPL 3.

  - "Oleg Drokin" <green@crimea.edu>:
    Fix signal handling on glibc systems.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Pass guest context from/to user space on FMWRUNGUEST ioctl.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Removed 'quanta' argument to FMWRUNGUEST ioctl.
    Replaced 'quanta' handling in 'user' by SIGALRM-based timeout mechanism.

  - "Jens Nerche" <jn4@os.inf.tu-dresden.de>:
    here comes the patch for loading ELF binaries. I enhanced
    the config file: text address, data address, stack address
    and bss address are new options, and user.c undertands -d
    for debugging messages now.
    If the file is in ELF format, the text address is taken from
    file, if it is a pure binary it's taken from config file.
    data address and bss address are still unused.

  - "Love" <lha@stacken.kth.se>:
    Adapted Makefiles to allow build outside the source-tree.

  - "Jens Nerche" <jn4@os.inf.tu-dresden.de>:
    Command line parameters and config file for 'user'.

  - "Ulrich Weigand" <weigand@informatik.uni-erlangen.de>:
    Created 'guest' directory to contain various test guest kernels.
    Moved dummy virtcode to guest/virtcode.
    Added Ramon's nullkernel as guest/cooperative and guest/preemptive.
    Made guest kernel to load a command line parameter to 'user'.
    Reorganized interrupt/exception handling in kernel module.

  - "Kevin P. Lawton" <kevin@bochs.com>:
    Fixed soft_int macro.


fmw-19990826a:

  - (UW) [host-linux.c] [host-linux.h]
    Added check to prevent the guest physical memory from being
    freed while still mapped to user space.
    Added check to prevent duplicate allocation (memory leak!).
    Use 'mem_map_(un)reserve' macros instead of manipulating page
    flags directly.

  - (UW) [user.c]
    Unmap guest physical memory before freeing it.


fmw-19990825a:

  [patch1 from UW]
  - Use some linker/ELF magic to retrieve the linear address space
    occupied by the kernel module at runtime.

  - Walk the host page tables to retrieve a list of all physical pages
    underlying the kernel module's code and data sections.

  - Allocate memory for the monitor page tables, and set them up as follows:
    * An identity mapping of the complete guest physical memory (at address 0)
    * A mapping of the kernel module's code/data pages at the same
      linear address as in the host space.

  - Remove the dynamic allocation of interrupt reflection stubs
    (sorry Ramon :-/).
    These stubs are called in the guest VM, so using kmalloc() -- which
    returns some arbitrary address inside host physical memory -- to
    allocate them is not a real good idea ;-)   I've moved them to memory
    inside the module's data pages.

  - Add the actual PDBR reloading.

  [patch2 from UW]
  - The do_nothing task is removed from the kernel module.
    Instead, it is built as standalone executable 'virtcode.bin',
    which gets loaded by the user app into the guest memory.

  - The kernel module, on initial switch to the monitor, starts
    executing the guest code in ring-3.

  - A nasty problem with the mmap() implementation appeared:
    It seems that Linux doesn't like if we map normal memory
    pages using remap_page_range; apparently you are only allowed
    to map 'hardware' pages.  While it did seem to work, what
    actually happened was that remap_page_range recognized the
    page as normal memory page, and decided to map in an anonymous
    page instead.  Thus, the guest could access the mapped memory
    perfectly well --- the only problem is that is accessed completely
    different pages, which were mapped in by the standard nopage
    handler :-/

    This patch circumvent the problem by a very ugly hack:  it
    simply sets the PG_reserved bit of all those pages used for
    guest memory, thereby declaring them as 'hardware range' ;-)
    This works fine on my system (2.0.36), but I'm not at all sure
    that it will work on other versions ...

    Anyway, this needs to be fixed correctly, of course.  I'll be
    looking into this problem.  For now, we need the hack, because
    otherwise the user app is unable to load the guest code in ...

fmw-19990822b:

  - (KPL) Converted to using GNU autoconf for easier configuration
    on multiple host OS platforms.  You only have to run autoconf
    if you change the configure.in file.  Otherwise, re-run
    configure.  To make things simple, and so that it's easy
    to run configure with known flags etc, run ./configure.hostos,
    where hostos is your host OS.  I made one for Linux and
    BeOS, though the BeOS one may be broken.

  - (KPL) Integrated patch from Ulrich regarding looking for
    signals in kernel module before looping on running guest OS.

  - (KPL) Moved sti() call in host-linux.c into soft_int macro.
    The IF change will not be recognised until after the INT
    instruction, in this case, so there is no chance of an
    interrupt intervening.

  - (KPL) Created a NEED_RESCHED macro, so we can compile
    for various Linux kernel versions.  I don't know when the
    change was made to put need_resched in the "current" structure.
    I guessed 2.2.0.  If this is not right, please let us know
    when the change occurred.

  - (KPL) added inline function pending_signals() to host-linux.c.
    Please also fix the version number code that controls which
    method to use to access the signals field in the "current"
    structure.  This was a small fix to get Ramon's changes
    to compile on my 2.2.5 kernel.  I'm not sure if the signals
    > 31 are interesting to us.  If not, we don't need the loop
    code I put in the inline function.
    

fmw-19990821a:

  - (RvH) I cleaned up all of the code, giving it bigger indents
    and converting to C-style comments whenever things got really
    ugly.  It's still not the clearest code I've ever seen but it'll
    do for now.  I also moved the virtualised test code into a
    separate file, virtcode.c.

  - (RvH) I changed host-linux.c so that it takes the amount of
    quanta to run as an argument to ioctl().  Now it doesn't trap
    back to the user application on ever quantum.  Question:
    on 2.2 we use current->need_resched, but is this true for
    2.0 too, or does it have need_resched as a global variable ?

  - (RvH) I integrated Ulrich's mmap() code into the module, and
    fixed it so that it compiles on 2.2 kernels.

  - (RvH) I changed the way interrupts are allocated.  Now, the
    host code needs to call init_reflect() (in monitor.c) after
    init_monitor() for every interrupt that needs to be reflected
    back to the host OS.  The monitor.c code then dynamically
    generates and relocates a correct interrupt stub.  The host
    code is responsible for allocating/freeing memory for the
    stubs.

  - (RvH) I fixed up the interrupts so that the code works on my
    SMP machine.  I still have 2.0 code in there too, but I can't
    test that --- can anybody test this on a 2.0 SMP box ?
    2.2 SMP is rather annoying because it allocates lots of IPIs,
    and most of them aren't fixed (2.2 SMP does not use the 0x20-
    0x2f mapping for the PIC, but has everything go through the
    I/O APIC with rather weird interrupt mappings).  In order to
    allocate the correct interrupts I need access to a kernel
    array called irq_vector[], which unfortunately is not exported
    to modules.  Thus you need to patch the linux kernel if you
    want to run this code on a 2.2 SMP box.  The patch is simple:
    put the following code in linux/arch/i386/kernel/i386_ksyms.c:

        #ifdef __SMP__
        #include "irq.h"
        EXPORT_SYMBOL(irq_vector);
        #endif

    and everything will work just beautifully (or anyway, that's
    what it looks like.)

fmw-990817c:

  - (KPL) I added irq16 vector to the init_monitor() call.
    If you pass a 0, no irq16 redirect handler is installed.
    Irq16 is the APIC IPI interrupt, which is used on multiple
    processor compiles of Linux (SMP).  The code is untested.
    In kernel/include/host-linux.h, I do this:

    #ifdef __SMP__
    #  define IRQ16_BASE_VECTOR 0x30  // IPI vector
    #else
    #  define IRQ16_BASE_VECTOR 0     // IPI not used on non-SMP
    #endif

    Let me know if this makes this code work on your SMP
    Linux machine.

  - (KPL) Fixed the previous interrupt bug, thanks to a find
    by Ulrich and Ramon.

fmw-990817b:
  - (KPL) Initial release.  Has interrupt bug.
