• A
    KVM: PPC: Book3S: Add hack for split real mode · c01e3f66
    Alexander Graf 提交于
    Today we handle split real mode by mapping both instruction and data faults
    into a special virtual address space that only exists during the split mode
    phase.
    
    This is good enough to catch 32bit Linux guests that use split real mode for
    copy_from/to_user. In this case we're always prefixed with 0xc0000000 for our
    instruction pointer and can map the user space process freely below there.
    
    However, that approach fails when we're running KVM inside of KVM. Here the 1st
    level last_inst reader may well be in the same virtual page as a 2nd level
    interrupt handler.
    
    It also fails when running Mac OS X guests. Here we have a 4G/4G split, so a
    kernel copy_from/to_user implementation can easily overlap with user space
    addresses.
    
    The architecturally correct way to fix this would be to implement an instruction
    interpreter in KVM that kicks in whenever we go into split real mode. This
    interpreter however would not receive a great amount of testing and be a lot of
    bloat for a reasonably isolated corner case.
    
    So I went back to the drawing board and tried to come up with a way to make
    split real mode work with a single flat address space. And then I realized that
    we could get away with the same trick that makes it work for Linux:
    
    Whenever we see an instruction address during split real mode that may collide,
    we just move it higher up the virtual address space to a place that hopefully
    does not collide (keep your fingers crossed!).
    
    That approach does work surprisingly well. I am able to successfully run
    Mac OS X guests with KVM and QEMU (no split real mode hacks like MOL) when I
    apply a tiny timing probe hack to QEMU. I'd say this is a win over even more
    broken split real mode :).
    Signed-off-by: NAlexander Graf <agraf@suse.de>
    c01e3f66
kvm_book3s.h 10.3 KB