Hello,
I've committed a few changes to the CVS tree:
- Made the transition code more self-contained. These are mostly
cosmetic fixes (e.g. the transition code itself clears the busy
bit of the TSS instead of relying on the caller to do it), but
contain one bugfix: the old code assumed that the host parameters
(PDBR, GDT, TSS, ...) remain constant while a process is running.
This is not true in general; e.g. on Linux 2.3.x SMP systems, each
processor always uses the same TSS. This means that if the process
is rescheduled from one processor to another, it will use multiple
TSSes throughout its lifetime. The old code would surely have caused
a crash if this happened :-/
The new version saves *all* host parameters on every transition;
this might be overkill, but it stays on the safe side (and it doesn't
really matter performance-wise; according to rdtsc this adds about
200-300 cycles per transition, out of a total of 4000 +/- 500 on a
Pentium).
- Separated the monitor initialization from the default guest init;
this (and avoiding to store linear addresses into the monitor as
far as possible) now actually allows the monitor to migrate in the
the guest address space from one linear address to another (and from
one set of selectors to another) with not very much overhead; see
the new map_monitor()/unmap_monitor() routines.
- Finally, I've improved operand decoding in the kernel-side emulator
a bit, and added support for a few more opcodes. This doesn't have
any visible effect, because lgdt still doesn't work, unfortunately ...
Everyone who was experiencing crashes: could you retry with this version
containing the revised transition code?
Bye,
Ulrich
--
Ulrich Weigand,
IMMD 1, Universitaet Erlangen-Nuernberg,
Martensstr. 3, D-91058 Erlangen, Phone: +49 9131 85-7688