Skip to content

Commit 61d9b66

Browse files
committed
Add additional tests for TSS entry
Signed-off-by: Joe Richey <[email protected]>
1 parent cb9e4b2 commit 61d9b66

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

testing/src/gdt.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ lazy_static! {
2020
};
2121
static ref GDT: (GlobalDescriptorTable, Selectors) = {
2222
let mut gdt = GlobalDescriptorTable::new();
23+
// Add an unused segment so we get a different value for CS
24+
gdt.append(Descriptor::kernel_data_segment());
2325
let code_selector = gdt.append(Descriptor::kernel_code_segment());
2426
let tss_selector = gdt.append(Descriptor::tss_segment(&TSS));
2527
(
@@ -41,9 +43,16 @@ pub fn init() {
4143
use x86_64::instructions::segmentation::{Segment, CS};
4244
use x86_64::instructions::tables::load_tss;
4345

46+
// Make sure loading CS actually changes the value
4447
GDT.0.load();
45-
unsafe {
46-
CS::set_reg(GDT.1.code_selector);
47-
load_tss(GDT.1.tss_selector);
48-
}
48+
assert_ne!(CS::get_reg(), GDT.1.code_selector);
49+
unsafe { CS::set_reg(GDT.1.code_selector) };
50+
assert_eq!(CS::get_reg(), GDT.1.code_selector);
51+
52+
// Loading the TSS should mark the GDT entry as busy
53+
let tss_idx: usize = GDT.1.tss_selector.index().into();
54+
let old_tss_entry = GDT.0.entries()[tss_idx].clone();
55+
unsafe { load_tss(GDT.1.tss_selector) };
56+
let new_tss_entry = GDT.0.entries()[tss_idx].clone();
57+
assert_ne!(old_tss_entry, new_tss_entry);
4958
}

0 commit comments

Comments
 (0)