Skip to content

Commit 9aa9ef0

Browse files
committed
gdt: Remove the segment selector for GS
It turns out that we don't need to have a segment selector for GS to be able to use the GSBase MSR, as discussed in rust-osdev/x86_64#333. I suspect this is because we now have a kernel data segment selector for SS, which we didn't when I first added support for CPU-local data. Removing the extra selector frees up a slot in the GDT. Signed-off-by: SlyMarbo <[email protected]>
1 parent c856098 commit 9aa9ef0

File tree

2 files changed

+2
-8
lines changed

2 files changed

+2
-8
lines changed

kernel/src/gdt.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//! have no effect.
2020
2121
use lazy_static::lazy_static;
22-
use x86_64::instructions::segmentation::{Segment, CS, GS, SS};
22+
use x86_64::instructions::segmentation::{Segment, CS, SS};
2323
use x86_64::instructions::tables::load_tss;
2424
use x86_64::structures::gdt::{Descriptor, GlobalDescriptorTable, SegmentSelector};
2525
use x86_64::structures::tss::TaskStateSegment;
@@ -33,7 +33,6 @@ pub fn init() {
3333
unsafe {
3434
CS::set_reg(GDT.1.kernel_code_selector);
3535
SS::set_reg(GDT.1.kernel_stack_selector);
36-
GS::set_reg(GDT.1.cpu_local_selector);
3736
load_tss(GDT.1.tss_selector);
3837
}
3938
}
@@ -44,14 +43,12 @@ lazy_static! {
4443
let kernel_code_selector = gdt.add_entry(Descriptor::kernel_code_segment());
4544
let kernel_stack_selector = gdt.add_entry(Descriptor::kernel_data_segment());
4645
let tss_selector = gdt.add_entry(Descriptor::tss_segment(&TSS));
47-
let cpu_local_selector = gdt.add_entry(Descriptor::kernel_data_segment());
4846
(
4947
gdt,
5048
Selectors {
5149
kernel_code_selector,
5250
kernel_stack_selector,
5351
tss_selector,
54-
cpu_local_selector,
5552
},
5653
)
5754
};
@@ -61,7 +58,6 @@ struct Selectors {
6158
kernel_code_selector: SegmentSelector,
6259
kernel_stack_selector: SegmentSelector,
6360
tss_selector: SegmentSelector,
64-
cpu_local_selector: SegmentSelector,
6561
}
6662

6763
// Set up the task state segment with a safe

kernel/src/multitasking/cpu_local.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use core::mem::size_of;
3232
use core::sync::atomic::{AtomicBool, AtomicU64, Ordering};
3333
use x86_64::addr::align_up;
3434
use x86_64::instructions::interrupts;
35-
use x86_64::instructions::segmentation::{Segment, CS, GS, SS};
35+
use x86_64::instructions::segmentation::{Segment, CS, SS};
3636
use x86_64::instructions::tables::load_tss;
3737
use x86_64::registers::model_specific::GsBase;
3838
use x86_64::registers::model_specific::Msr;
@@ -161,7 +161,6 @@ pub fn init(cpu_id: CpuId, stack_space: &VirtAddrRange) {
161161
let kernel_code_selector = data.gdt.add_entry(Descriptor::kernel_code_segment());
162162
let kernel_stack_selector = data.gdt.add_entry(Descriptor::kernel_data_segment());
163163
let tss_selector = data.gdt.add_entry(Descriptor::tss_segment(tss_ref));
164-
let cpu_local_selector = data.gdt.add_entry(Descriptor::kernel_data_segment());
165164
let user_code_selector = data.gdt.add_entry(Descriptor::user_code_segment());
166165
let user_stack_selector = data.gdt.add_entry(Descriptor::user_data_segment());
167166

@@ -170,7 +169,6 @@ pub fn init(cpu_id: CpuId, stack_space: &VirtAddrRange) {
170169
unsafe {
171170
CS::set_reg(kernel_code_selector);
172171
SS::set_reg(kernel_stack_selector);
173-
GS::set_reg(cpu_local_selector);
174172
GsBase::write(start); // Set the GS base again now we've updated GS.
175173
load_tss(tss_selector);
176174

0 commit comments

Comments
 (0)