cpu: Minor refactor in call_interrupt_vector

This commit is contained in:
Amaan Cheval 2018-09-20 00:30:32 +05:30 committed by Fabian
parent 8ba3de34c1
commit ae70cb7e4f
2 changed files with 12 additions and 5 deletions

View file

@ -257,6 +257,7 @@ function V86Starter(options)
"abs": Math.abs, "abs": Math.abs,
"do_task_switch": (selector, error_code) => cpu.do_task_switch(selector, error_code), "do_task_switch": (selector, error_code) => cpu.do_task_switch(selector, error_code),
// XXX: Port to Rust
"get_tss_stack_addr": (dpl) => cpu.get_tss_stack_addr(dpl), "get_tss_stack_addr": (dpl) => cpu.get_tss_stack_addr(dpl),
"switch_cs_real_mode": (selector) => cpu.switch_cs_real_mode(selector), "switch_cs_real_mode": (selector) => cpu.switch_cs_real_mode(selector),
}; };

View file

@ -438,14 +438,17 @@ pub unsafe fn call_interrupt_vector(
if !is_valid_type || !reserved_zeroes_are_valid { if !is_valid_type || !reserved_zeroes_are_valid {
// invalid gate_type // invalid gate_type
dbg_trace(); dbg_log!(
dbg_log!("invalid gate_type: 0b{:b}", gate_type); "gate type invalid or reserved 0s violated. gate_type=0b{:b}",
gate_type
);
dbg_log!( dbg_log!(
"addr={:x} offset={:x} selector={:x}", "addr={:x} offset={:x} selector={:x}",
descriptor_address, descriptor_address,
offset, offset,
selector selector
); );
dbg_trace();
panic!("Unimplemented: #GP handler"); panic!("Unimplemented: #GP handler");
} }
@ -524,14 +527,14 @@ pub unsafe fn call_interrupt_vector(
let error_code_space = if has_error_code == true { 1 } else { 0 }; let error_code_space = if has_error_code == true { 1 } else { 0 };
let vm86_space = if (old_flags & FLAG_VM) == FLAG_VM { let vm86_space = if (old_flags & FLAG_VM) == FLAG_VM {
1 4
} }
else { else {
0 0
}; };
let bytes_per_arg = if is_16 { 2 } else { 4 }; let bytes_per_arg = if is_16 { 2 } else { 4 };
let stack_space = bytes_per_arg * (5 + error_code_space + 4 * vm86_space); let stack_space = bytes_per_arg * (5 + error_code_space + vm86_space);
let new_stack_pointer = ss_segment_descriptor.base() + if ss_segment_descriptor.is_32() let new_stack_pointer = ss_segment_descriptor.base() + if ss_segment_descriptor.is_32()
{ {
new_esp - stack_space new_esp - stack_space
@ -545,6 +548,7 @@ pub unsafe fn call_interrupt_vector(
ss_segment_descriptor.base() + new_esp - 1 ss_segment_descriptor.base() + new_esp - 1
)); ));
// no exceptions below
*cpl = cs_segment_descriptor.dpl(); *cpl = cs_segment_descriptor.dpl();
cpl_changed(); cpl_changed();
@ -553,11 +557,13 @@ pub unsafe fn call_interrupt_vector(
*flags &= !FLAG_VM & !FLAG_RF; *flags &= !FLAG_VM & !FLAG_RF;
if !switch_seg(SS, new_ss) { if !switch_seg(SS, new_ss) {
// XXX
dbg_assert!(false); dbg_assert!(false);
} // XXX }
set_stack_reg(new_esp); set_stack_reg(new_esp);
// XXX: #SS if stack would cross stack limit // XXX: #SS if stack would cross stack limit
if old_flags & FLAG_VM != 0 { if old_flags & FLAG_VM != 0 {
if is_16 { if is_16 {
dbg_assert!(false); dbg_assert!(false);