Skip to content

Commit f8fc6ba

Browse files
committed
set kernel stack in tss
1 parent 0560f65 commit f8fc6ba

4 files changed

Lines changed: 30 additions & 6 deletions

File tree

kernel/src/arch/amd64/gdt.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,23 @@ pub fn init_ap(ap_id: usize) {
122122
load_tss(tss_selector);
123123
}
124124
}
125+
126+
pub fn set_tss_kernel_stack(stack_top: u64) {
127+
unsafe {
128+
// For BSP
129+
if TSS.is_completed() {
130+
let tss = &*TSS as *const TaskStateSegment as *mut TaskStateSegment;
131+
(*tss).privilege_stack_table[0] = VirtAddr::new(stack_top);
132+
return;
133+
}
134+
135+
// For APs
136+
let gdt_ap = GDT_AP.lock();
137+
let ap_id = crate::cpu::current_cpu().cpu_id;
138+
139+
if let Some(gdt) = gdt_ap.iter().find(|g| g.ap_id == ap_id) {
140+
let tss = gdt.tss as *const TaskStateSegment as *mut TaskStateSegment;
141+
(*tss).privilege_stack_table[0] = VirtAddr::new(stack_top);
142+
}
143+
}
144+
}

kernel/src/cpu.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ pub struct Cpu {
122122
user_space_stack: usize,
123123
pub kernel_stack: Cell<usize>,
124124

125-
cpu_id: usize,
125+
pub cpu_id: usize,
126126
pub lapic_id: u32,
127127
pub run_queue: Spinlock<VecDeque<Arc<Thread>>>,
128128
pub wait_queue: Spinlock<VecDeque<Arc<Thread>>>,

kernel/src/sched/process.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::fs::file::File;
88
use crate::fs::vnode::VNode;
99
use crate::mem::frame::FRAME_ALLOCATOR;
1010
use crate::mem::vm::{protflags_from_ptflags, Vm};
11-
use crate::mem::{HIGHER_HALF_OFFSET, KERNEL_THREAD_STACK_TOP, PROCESS_START, STACK_SIZE};
11+
use crate::mem::{HIGHER_HALF_OFFSET, KERNEL_THREAD_STACK_TOP, STACK_SIZE};
1212
use crate::VFS;
1313
use alloc::collections::BTreeMap;
1414
use alloc::sync::Arc;
@@ -122,7 +122,7 @@ impl Process {
122122

123123
for ph in elf.segments().expect("Failed to get program headers") {
124124
if ph.p_type == elf::abi::PT_LOAD {
125-
let start = ph.p_vaddr + PROCESS_START;
125+
let start = ph.p_vaddr;
126126
let end = start + ph.p_memsz;
127127

128128
let page_start = align_down(start, Size4KiB::SIZE);
@@ -172,7 +172,7 @@ impl Process {
172172
}
173173
}
174174

175-
VirtAddr::new(elf.ehdr.e_entry + PROCESS_START)
175+
VirtAddr::new(elf.ehdr.e_entry)
176176
}
177177

178178
pub fn next_tid(&mut self) -> usize {

kernel/src/sched/scheduler.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::arch::amd64::gdt::GDT_BSP;
1+
use crate::arch::amd64::gdt::{set_tss_kernel_stack, GDT_BSP};
22
use crate::arch::amd64::switch_context;
33
use crate::cpu::current_cpu;
44
use crate::timer::timer_event::TimerEvent;
@@ -83,9 +83,13 @@ pub fn switch_threads(old: Arc<Thread>, new: Arc<Thread>) {
8383

8484
DS::set_reg(GDT_BSP.1.user_data_selector);
8585

86+
let kernel_stack_top = new.kernel_stack.as_ref().unwrap().kernel_stack_top;
87+
8688
current_cpu()
8789
.kernel_stack
88-
.set(new.kernel_stack.as_ref().unwrap().kernel_stack_top);
90+
.set(kernel_stack_top);
91+
92+
set_tss_kernel_stack(kernel_stack_top as u64);
8993
}
9094
}
9195

0 commit comments

Comments
 (0)