Skip to content

Commit

Permalink
kvm: minimize dirtying of kvm regs/sregs [skip ci]
Browse files Browse the repository at this point in the history
Compare with old copies.
This should speed up the things.
  • Loading branch information
stsp committed Jun 18, 2021
1 parent ed248bf commit 4f8884a
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions src/base/emu-i386/kvm.c
Original file line number Diff line number Diff line change
Expand Up @@ -927,6 +927,8 @@ int kvm_vm86(struct vm86_struct *info)
{
int vm86_ret;
unsigned int trapno, exit_reason;
struct kvm_regs old_kregs;
struct kvm_sregs old_sregs;
struct vm86_regs *regs = &info->regs;
struct kvm_regs *kregs = &run->s.regs.regs;
struct kvm_sregs *sregs = &run->s.regs.sregs;
Expand All @@ -935,6 +937,8 @@ int kvm_vm86(struct vm86_struct *info)
monitor->tss.esp0 = offsetof(struct monitor, stack) + sizeof(monitor->stack);

do {
memcpy(&old_kregs, kregs, sizeof(old_kregs));
memset(kregs, 0, sizeof(*kregs));
kregs->rax = regs->eax;
kregs->rbx = regs->ebx;
kregs->rcx = regs->ecx;
Expand All @@ -947,16 +951,19 @@ int kvm_vm86(struct vm86_struct *info)
kregs->rflags = regs->eflags;
kregs->rflags &= (SAFE_MASK | X86_EFLAGS_VIF | X86_EFLAGS_VIP);
kregs->rflags |= X86_EFLAGS_FIXED | X86_EFLAGS_VM | X86_EFLAGS_IF;
run->kvm_dirty_regs |= KVM_SYNC_X86_REGS;
if (memcmp(&old_kregs, kregs, sizeof(old_kregs)))
run->kvm_dirty_regs |= KVM_SYNC_X86_REGS;

memcpy(&old_sregs, sregs, sizeof(old_sregs));
*sregs = global_sregs;
set_vm86_seg(&sregs->cs, regs->cs);
set_vm86_seg(&sregs->ds, regs->ds);
set_vm86_seg(&sregs->es, regs->es);
set_vm86_seg(&sregs->fs, regs->fs);
set_vm86_seg(&sregs->gs, regs->gs);
set_vm86_seg(&sregs->ss, regs->ss);
run->kvm_dirty_regs |= KVM_SYNC_X86_SREGS;
if (memcmp(&old_sregs, sregs, sizeof(old_sregs)))
run->kvm_dirty_regs |= KVM_SYNC_X86_SREGS;

exit_reason = kvm_run();

Expand Down Expand Up @@ -1013,12 +1020,16 @@ int kvm_dpmi(sigcontext_t *scp)
{
int ret;
unsigned int exit_reason;
struct kvm_regs old_kregs;
struct kvm_sregs old_sregs;
struct kvm_regs *kregs = &run->s.regs.regs;
struct kvm_sregs *sregs = &run->s.regs.sregs;

monitor->tss.esp0 = offsetof(struct monitor, stack.es);

do {
memcpy(&old_kregs, kregs, sizeof(old_kregs));
memset(kregs, 0, sizeof(*kregs));
kregs->rax = _eax;
kregs->rbx = _ebx;
kregs->rcx = _ecx;
Expand All @@ -1031,16 +1042,19 @@ int kvm_dpmi(sigcontext_t *scp)
kregs->rflags = _eflags;
kregs->rflags &= (SAFE_MASK | X86_EFLAGS_VIF | X86_EFLAGS_VIP);
kregs->rflags |= X86_EFLAGS_FIXED | X86_EFLAGS_IF;
run->kvm_dirty_regs |= KVM_SYNC_X86_REGS;
if (memcmp(&old_kregs, kregs, sizeof(old_kregs)))
run->kvm_dirty_regs |= KVM_SYNC_X86_REGS;

memcpy(&old_sregs, sregs, sizeof(old_sregs));
*sregs = global_sregs;
set_ldt_seg(&sregs->cs, _cs);
set_ldt_seg(&sregs->ds, _ds);
set_ldt_seg(&sregs->es, _es);
set_ldt_seg(&sregs->ss, _ss);
set_ldt_seg(&sregs->fs, _fs);
set_ldt_seg(&sregs->gs, _gs);
run->kvm_dirty_regs |= KVM_SYNC_X86_SREGS;
if (memcmp(&old_sregs, sregs, sizeof(old_sregs)))
run->kvm_dirty_regs |= KVM_SYNC_X86_SREGS;

exit_reason = kvm_run();

Expand Down

0 comments on commit 4f8884a

Please sign in to comment.