Port lldt to rust

This commit is contained in:
Fabian 2021-03-30 12:27:28 -05:00
parent 827b9f3741
commit acb4e5f2dd
2 changed files with 42 additions and 1 deletions

View file

@ -2285,6 +2285,48 @@ pub unsafe fn load_tr(selector: i32) {
safe_write64(descriptor_address, descriptor.set_busy().raw).unwrap();
}
pub unsafe fn load_ldt(selector: i32) {
let selector = SegmentSelector::of_u16(selector as u16);
if selector.is_null() {
*segment_limits.offset(LDTR as isize) = 0;
*segment_offsets.offset(LDTR as isize) = 0;
*sreg.offset(LDTR as isize) = selector.raw;
return;
}
dbg_assert!(selector.is_gdt(), "TODO: LDT can only be loaded from GDT");
let (descriptor, _) = match return_on_pagefault!(lookup_segment_selector(selector)) {
Ok((desc, addr)) => (desc, addr),
Err(SelectorNullOrInvalid::IsNull) => {
panic!("TODO: null TR");
},
Err(SelectorNullOrInvalid::OutsideOfTableLimit) => {
panic!("TODO: TR selector outside of table limit");
},
};
if !descriptor.is_present() {
panic!("#NT | present bit not set (lldt)");
}
if !descriptor.is_system() {
panic!("#GP | lldt: not a system entry");
}
if descriptor.system_type() != 2 {
panic!(
"#GP | lldt: invalid type (type = 0x{:x})",
descriptor.system_type()
);
}
*segment_limits.offset(LDTR as isize) = descriptor.effective_limit();
*segment_offsets.offset(LDTR as isize) = descriptor.base();
*sreg.offset(LDTR as isize) = selector.raw;
}
#[no_mangle]
pub unsafe fn log_segment_null(segment: i32) {
dbg_assert!(segment >= 0 && segment < 8);

View file

@ -3,7 +3,6 @@
extern "C" {
fn get_rand_int() -> i32;
fn cpuid();
fn load_ldt(v: i32);
}
unsafe fn undefined_instruction() {