double faulting in thread start while pushing thread's general registers
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
parent
5a4f8a561e
commit
2522ece23f
@ -53,23 +53,28 @@ impl Thread {
|
||||
unsafe {
|
||||
Thread {
|
||||
id: ThreadId::new(),
|
||||
rsp: alloc(Layout::new::<[u8; STACK_SIZE]>()) as u64,
|
||||
rsp: alloc(Layout::new::<[u8; STACK_SIZE]>()) as u64 + STACK_SIZE as u64 - 0x80,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn start(&mut self, rip: u64) {
|
||||
unsafe {
|
||||
*RUNNING_THREAD.lock().await = self.id;
|
||||
asm!(
|
||||
"pusha", // Save current thread regs
|
||||
"push rax", // Save current thread regs
|
||||
"push rbx",
|
||||
"push rcx",
|
||||
"push rdx",
|
||||
"push rbp",
|
||||
"push rsi",
|
||||
"push rdi",
|
||||
|
||||
"push rsp", // Recover current rsp
|
||||
"pop {out}",
|
||||
out = out(reg) self.rsp, // Save current rsp
|
||||
out = out(reg) KERNEL_THREAD.lock().await.rsp, // Save current rsp
|
||||
);
|
||||
}
|
||||
|
||||
*RUNNING_THREAD.lock().await = self.id;
|
||||
unsafe {
|
||||
asm!(
|
||||
"push {rsp}",
|
||||
"pop rsp",
|
||||
@ -83,10 +88,17 @@ impl Thread {
|
||||
pub async fn run(&mut self) {
|
||||
unsafe {
|
||||
asm!(
|
||||
"pusha", // Save current thread regs
|
||||
"push rax", // Save current thread regs
|
||||
"push rbx",
|
||||
"push rcx",
|
||||
"push rdx",
|
||||
"push rbp",
|
||||
"push rsi",
|
||||
"push rdi",
|
||||
|
||||
"push rsp", // Recover current rsp
|
||||
"pop {out}",
|
||||
out = out(reg) self.rsp, // Save current rsp
|
||||
out = out(reg) KERNEL_THREAD.lock().await.rsp, // Save current rsp
|
||||
);
|
||||
|
||||
*RUNNING_THREAD.lock().await = self.id; // change running thread
|
||||
@ -94,7 +106,14 @@ impl Thread {
|
||||
asm!(
|
||||
"push {rsp}", // Set stack pointer to the new thread
|
||||
"pop rsp",
|
||||
"popa", // Restore new thread regs
|
||||
|
||||
"pop rdi", // Restore new thread regs
|
||||
"pop rsi",
|
||||
"pop rbp",
|
||||
"pop rdx",
|
||||
"pop rcx",
|
||||
"pop rbx",
|
||||
"pop rax",
|
||||
rsp = in(reg) self.rsp,
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user