Skip to content
This repository was archived by the owner on Feb 13, 2024. It is now read-only.

Commit e087cc8

Browse files
bors[bot]toku-sa-n
andauthored
Merge #619
619: chore: create the process loader r=toku-sa-n a=toku-sa-n - fix: the order of registers to be pushed - chore: create a process loader Fixes: #618 bors r+ Co-authored-by: toku-sa-n <[email protected]>
2 parents 7c34ca1 + 0c68d81 commit e087cc8

File tree

3 files changed

+27
-13
lines changed

3 files changed

+27
-13
lines changed

kernel/src/process/manager.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ fn add_process(p: Process) {
4444
collections::process::add(p);
4545
}
4646

47+
pub(super) fn loader(f: fn() -> !) -> ! {
48+
f()
49+
}
50+
4751
enum Message {
4852
Add(fn() -> !, Privilege),
4953
}

kernel/src/process/stack_frame.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// SPDX-License-Identifier: GPL-3.0-or-later
22

3+
use core::convert::TryInto;
4+
35
use crate::gdt::GDT;
46
use rflags::RFlags;
57
use x86_64::{
@@ -15,18 +17,21 @@ pub struct StackFrame {
1517
interrupt: InterruptStackFrameValue,
1618
}
1719
impl StackFrame {
18-
pub fn kernel(instruction_pointer: VirtAddr, stack_pointer: VirtAddr) -> Self {
19-
Self::new(instruction_pointer, stack_pointer, &Selectors::kernel())
20+
pub fn kernel(f: fn() -> !, stack_pointer: VirtAddr) -> Self {
21+
Self::new(f, stack_pointer, &Selectors::kernel())
2022
}
2123

22-
pub fn user(instruction_pointer: VirtAddr, stack_pointer: VirtAddr) -> Self {
23-
Self::new(instruction_pointer, stack_pointer, &Selectors::user())
24+
pub fn user(f: fn() -> !, stack_pointer: VirtAddr) -> Self {
25+
Self::new(f, stack_pointer, &Selectors::user())
2426
}
2527

26-
fn new(instruction_pointer: VirtAddr, stack_pointer: VirtAddr, segs: &Selectors) -> Self {
28+
fn new(f: fn() -> !, stack_pointer: VirtAddr, segs: &Selectors) -> Self {
2729
let cpu_flags = (rflags::read() | RFlags::INTERRUPT_FLAG).bits();
30+
let instruction_pointer =
31+
VirtAddr::new((super::manager::loader as usize).try_into().unwrap());
32+
2833
Self {
29-
regs: GeneralRegisters::default(),
34+
regs: GeneralRegisters::new(f),
3035
interrupt: InterruptStackFrameValue {
3136
instruction_pointer,
3237
code_segment: segs.code.0.into(),
@@ -59,13 +64,12 @@ impl Selectors {
5964
#[repr(C)]
6065
#[derive(Default, Debug)]
6166
struct GeneralRegisters {
62-
_rbp: u64,
6367
_rax: u64,
6468
_rbx: u64,
6569
_rcx: u64,
6670
_rdx: u64,
6771
_rsi: u64,
68-
_rdi: u64,
72+
rdi: u64,
6973
_r8: u64,
7074
_r9: u64,
7175
_r10: u64,
@@ -74,4 +78,13 @@ struct GeneralRegisters {
7478
_r13: u64,
7579
_r14: u64,
7680
_r15: u64,
81+
_rbp: u64,
82+
}
83+
impl GeneralRegisters {
84+
fn new(f: fn() -> !) -> Self {
85+
Self {
86+
rdi: (f as usize).try_into().unwrap(),
87+
..Self::default()
88+
}
89+
}
7790
}

kernel/src/process/switch.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,10 @@ impl<'a> StackCreator<'a> {
9292

9393
match self.process.stack {
9494
Some(ref s) => {
95-
let instruction_pointer =
96-
VirtAddr::new((self.process.f as usize).try_into().unwrap());
9795
let stack_bottom = s.virt_addr() + s.bytes().as_usize();
98-
9996
let stack_frame = PageBox::kernel(match self.process.privilege {
100-
Privilege::Kernel => StackFrame::kernel(instruction_pointer, stack_bottom),
101-
Privilege::User => StackFrame::user(instruction_pointer, stack_bottom),
97+
Privilege::Kernel => StackFrame::kernel(self.process.f, stack_bottom),
98+
Privilege::User => StackFrame::user(self.process.f, stack_bottom),
10299
});
103100

104101
self.process.stack_frame = Some(stack_frame);

0 commit comments

Comments
 (0)