Arch context in kernel context

This commit is contained in:
Jeremy Soller 2016-08-24 10:35:42 -06:00
parent f6e57ff5d1
commit 2be7ccaec2
3 changed files with 60 additions and 16 deletions

View file

@ -1,26 +1,36 @@
#[derive(Debug)]
pub struct Context {
flags: usize,
bx: usize,
/// RFLAGS register
rflags: usize,
/// RBX register
rbx: usize,
/// R12 register
r12: usize,
/// R13 register
r13: usize,
/// R14 register
r14: usize,
/// R15 register
r15: usize,
bp: usize,
sp: usize,
/// Base pointer
rbp: usize,
/// Stack pointer
rsp: usize,
/// Page table pointer
cr3: usize
}
impl Context {
pub fn new() -> Context {
Context {
flags: 0,
bx: 0,
rflags: 0,
rbx: 0,
r12: 0,
r13: 0,
r14: 0,
r15: 0,
bp: 0,
sp: 0,
rbp: 0,
rsp: 0,
cr3: 0
}
}
@ -40,11 +50,11 @@ impl Context {
}
*/
asm!("pushfq ; pop $0" : "=r"(self.flags) : : "memory" : "intel", "volatile");
asm!("push $0 ; popfq" : : "r"(next.flags) : "memory" : "intel", "volatile");
asm!("pushfq ; pop $0" : "=r"(self.rflags) : : "memory" : "intel", "volatile");
asm!("push $0 ; popfq" : : "r"(next.rflags) : "memory" : "intel", "volatile");
asm!("mov $0, rbx" : "=r"(self.bx) : : "memory" : "intel", "volatile");
asm!("mov rbx, $0" : : "r"(next.bx) : "memory" : "intel", "volatile");
asm!("mov $0, rbx" : "=r"(self.rbx) : : "memory" : "intel", "volatile");
asm!("mov rbx, $0" : : "r"(next.rbx) : "memory" : "intel", "volatile");
asm!("mov $0, r12" : "=r"(self.r12) : : "memory" : "intel", "volatile");
asm!("mov r12, $0" : : "r"(next.r12) : "memory" : "intel", "volatile");
@ -58,11 +68,11 @@ impl Context {
asm!("mov $0, r15" : "=r"(self.r15) : : "memory" : "intel", "volatile");
asm!("mov r15, $0" : : "r"(next.r15) : "memory" : "intel", "volatile");
asm!("mov $0, rbp" : "=r"(self.bp) : : "memory" : "intel", "volatile");
asm!("mov rbp, $0" : : "r"(next.bp) : "memory" : "intel", "volatile");
asm!("mov $0, rbp" : "=r"(self.rbp) : : "memory" : "intel", "volatile");
asm!("mov rbp, $0" : : "r"(next.rbp) : "memory" : "intel", "volatile");
asm!("mov $0, rsp" : "=r"(self.sp) : : "memory" : "intel", "volatile");
asm!("mov rsp, $0" : : "r"(next.sp) : "memory" : "intel", "volatile");
asm!("mov $0, rsp" : "=r"(self.rsp) : : "memory" : "intel", "volatile");
asm!("mov rsp, $0" : : "r"(next.rsp) : "memory" : "intel", "volatile");
/* TODO
asm!("mov $0, cr3" : "=r"(self.cr3) : : "memory" : "intel", "volatile");