Skip to content

Commit a490929

Browse files
authored
kvm: Set the right bit in kvm_dirty_regs when setting a register (#251)
In #248, `cr2` was updated but `kvm_dirty_regs` wasn't set appropriately so the change doesn't get flushed to the vcpu.
1 parent a27082c commit a490929

2 files changed

Lines changed: 66 additions & 34 deletions

File tree

scripts/gen_coveragefile_binja.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
"""Generate a coverage file for WTF using Binary Ninja.
2-
3-
@australeo - 2023
4-
"""
5-
from json import dump
6-
from pathlib import Path
7-
from binaryninja import PluginCommand, interaction
8-
9-
def generate_coverage_file(bv):
10-
# bv.file.filename: 'C:/path/to/binary.bndb'
11-
name = Path(bv.file.filename).stem
12-
13-
bb_list = []
14-
15-
for block in bv.basic_blocks:
16-
bb_list.append(block.start - bv.start)
17-
18-
json_object = {
19-
"name": name,
20-
"addresses": bb_list
21-
}
22-
23-
output_file = interaction.get_save_filename_input("Filename: ", ".cov", name + ".cov")
24-
25-
with open(output_file, "w", encoding="utf-8") as file:
26-
dump(json_object, file)
27-
28-
def register_plugin():
29-
PluginCommand.register("Generate WTF coverage file", \
30-
"Generate WTF coverage file", generate_coverage_file)
31-
32-
register_plugin()
1+
"""Generate a coverage file for WTF using Binary Ninja.
2+
3+
@australeo - 2023
4+
"""
5+
from json import dump
6+
from pathlib import Path
7+
from binaryninja import PluginCommand, interaction
8+
9+
def generate_coverage_file(bv):
10+
# bv.file.filename: 'C:/path/to/binary.bndb'
11+
name = Path(bv.file.filename).stem
12+
13+
bb_list = []
14+
15+
for block in bv.basic_blocks:
16+
bb_list.append(block.start - bv.start)
17+
18+
json_object = {
19+
"name": name,
20+
"addresses": bb_list
21+
}
22+
23+
output_file = interaction.get_save_filename_input("Filename: ", ".cov", name + ".cov")
24+
25+
with open(output_file, "w", encoding="utf-8") as file:
26+
dump(json_object, file)
27+
28+
def register_plugin():
29+
PluginCommand.register("Generate WTF coverage file", \
30+
"Generate WTF coverage file", generate_coverage_file)
31+
32+
register_plugin()

src/wtf/kvm_backend.cc

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1968,6 +1968,37 @@ uint64_t KvmBackend_t::GetReg(const Registers_t Reg) const {
19681968
return 0;
19691969
}
19701970

1971+
uint64_t GetKvmDirtyRegsFromRegister(const Registers_t Reg) {
1972+
switch (Reg) {
1973+
case Registers_t::Rax:
1974+
case Registers_t::Rbx:
1975+
case Registers_t::Rcx:
1976+
case Registers_t::Rdx:
1977+
case Registers_t::Rsi:
1978+
case Registers_t::Rdi:
1979+
case Registers_t::Rip:
1980+
case Registers_t::Rsp:
1981+
case Registers_t::Rbp:
1982+
case Registers_t::R8:
1983+
case Registers_t::R9:
1984+
case Registers_t::R10:
1985+
case Registers_t::R11:
1986+
case Registers_t::R12:
1987+
case Registers_t::R13:
1988+
case Registers_t::R14:
1989+
case Registers_t::R15:
1990+
case Registers_t::Rflags:
1991+
return KVM_SYNC_X86_REGS;
1992+
1993+
case Registers_t::Cr2:
1994+
case Registers_t::Cr3:
1995+
return KVM_SYNC_X86_SREGS;
1996+
}
1997+
1998+
std::abort();
1999+
return 0;
2000+
}
2001+
19712002
uint64_t KvmBackend_t::SetReg(const Registers_t Reg, const uint64_t Value) {
19722003
switch (Reg) {
19732004
case Registers_t::Rax: {
@@ -2072,10 +2103,11 @@ uint64_t KvmBackend_t::SetReg(const Registers_t Reg, const uint64_t Value) {
20722103
}
20732104

20742105
//
2075-
// Tell KVM to flush the regs into the VCPU next time it runs.
2106+
// Tell KVM to flush the appropriate set of regs into the VCPU next time it
2107+
// runs.
20762108
//
20772109

2078-
Run_->kvm_dirty_regs |= KVM_SYNC_X86_REGS;
2110+
Run_->kvm_dirty_regs |= GetKvmDirtyRegsFromRegister(Reg);
20792111
return Value;
20802112
}
20812113

0 commit comments

Comments
 (0)