Skip to content

Commit a8205f3

Browse files
committed
fpu tests
1 parent 6ca52a9 commit a8205f3

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

src/emu32.rs

+43
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,11 @@ mod console;
146146
pub mod colors;
147147
pub mod constants;
148148
mod winapi;
149+
mod fpu;
149150

150151
use flags::Flags;
151152
use eflags::Eflags;
153+
use fpu::FPU;
152154
use maps::Maps;
153155
use regs32::Regs32;
154156
use console::Console;
@@ -163,6 +165,7 @@ pub struct Emu32 {
163165
regs: Regs32,
164166
flags: Flags,
165167
eflags: Eflags,
168+
fpu: FPU,
166169
maps: Maps,
167170
exp: u64,
168171
break_on_alert: bool,
@@ -180,6 +183,7 @@ impl Emu32 {
180183
regs: Regs32::new(),
181184
flags: Flags::new(),
182185
eflags: Eflags::new(),
186+
fpu: FPU::new(),
183187
maps: Maps::new(),
184188
exp: 0,
185189
break_on_alert: false,
@@ -5466,6 +5470,45 @@ impl Emu32 {
54665470
}
54675471
},
54685472

5473+
///// FPU ///// https://github.com/radare/radare/blob/master/doc/xtra/fpu
5474+
5475+
Some("ffree") => {
5476+
if !step {
5477+
println!("{}{} {}{}", self.colors.green, self.pos, ins, self.colors.nc);
5478+
}
5479+
5480+
let op = ins.op_str().unwrap();
5481+
match op {
5482+
"st(0)" => self.fpu.clear(0),
5483+
"st(1)" => self.fpu.clear(1),
5484+
"st(2)" => self.fpu.clear(2),
5485+
"st(3)" => self.fpu.clear(3),
5486+
"st(4)" => self.fpu.clear(4),
5487+
"st(5)" => self.fpu.clear(5),
5488+
"st(6)" => self.fpu.clear(6),
5489+
"st(7)" => self.fpu.clear(7),
5490+
_ => panic!("fpu ffre operand no implemented"),
5491+
}
5492+
self.fpu.set_eip(self.regs.eip);
5493+
},
5494+
5495+
Some("fnstenv") => {
5496+
if !step {
5497+
println!("{}{} {}{}", self.colors.green, self.pos, ins, self.colors.nc);
5498+
}
5499+
5500+
let mut dir = "dword ptr ".to_string();
5501+
dir.push_str(ins.op_str().unwrap());
5502+
5503+
let addr:u32 = self.memory_operand_to_address(dir.as_str());
5504+
let env = self.fpu.get_env();
5505+
for i in 0..4 {
5506+
self.maps.write_dword(addr+(i*4), env[i as usize]);
5507+
}
5508+
5509+
self.fpu.set_eip(self.regs.eip);
5510+
},
5511+
54695512

54705513
Some("sysenter") => {
54715514
println!("{}{} {}{} function: 0x{:x}", self.colors.red, self.pos, ins, self.colors.nc, self.regs.eax);

src/emu32/fpu.rs

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
3+
pub struct FPU {
4+
st:Vec<f32>,
5+
tag:u16,
6+
stat:u16,
7+
ctrl:u16,
8+
eip:u32,
9+
}
10+
11+
impl FPU {
12+
pub fn new() -> FPU {
13+
FPU {
14+
st: vec![0.0;8],
15+
tag: 0xffff,
16+
stat: 0,
17+
ctrl: 0x027f,
18+
eip: 0,
19+
}
20+
}
21+
22+
pub fn clear(&mut self, n:u32) {
23+
self.st[n as usize] = 0.0;
24+
}
25+
26+
pub fn set_eip(&mut self, eip:u32) {
27+
self.eip = eip;
28+
}
29+
30+
pub fn get_env(&self) -> Vec<u32> {
31+
let mut r:Vec<u32> = Vec::new();
32+
let mut r1:u32 = self.tag as u32;
33+
r1 = r1 << 16;
34+
r1 += self.ctrl as u32;
35+
r.push(r1);
36+
r.push(0xffff0000);
37+
r.push(0xffffffff);
38+
r.push(self.eip);
39+
return r;
40+
}
41+
42+
}
43+
44+

0 commit comments

Comments
 (0)