Ptrace memory reading and floating point registers support

This commit is contained in:
jD91mZM2
2019-07-07 17:07:04 +00:00
committed by Jeremy Soller
parent 788526a3b3
commit 6fbb4fbae1
12 changed files with 363 additions and 272 deletions
+3 -4
View File
@@ -1,4 +1,4 @@
use crate::interrupt::syscall::SyscallStack;
use crate::macros::InterruptStack;
use crate::memory::{allocate_frames, deallocate_frames, Frame};
use crate::paging::{ActivePageTable, PhysicalAddress, VirtualAddress};
use crate::paging::entry::EntryFlags;
@@ -18,15 +18,14 @@ fn enforce_root() -> Result<()> {
}
}
pub fn iopl(level: usize, stack: &mut SyscallStack) -> Result<usize> {
pub fn iopl(level: usize, stack: &mut InterruptStack) -> Result<usize> {
enforce_root()?;
if level > 3 {
return Err(Error::new(EINVAL));
}
let iret = &mut stack.interrupt_stack.iret;
iret.rflags = (iret.rflags & !(3 << 12)) | ((level & 3) << 12);
stack.iret.rflags = (stack.iret.rflags & !(3 << 12)) | ((level & 3) << 12);
Ok(0)
}
+6 -6
View File
@@ -19,7 +19,7 @@ use self::error::{Error, Result, ENOSYS};
use self::number::*;
use crate::context::ContextId;
use crate::interrupt::syscall::SyscallStack;
use crate::macros::InterruptStack;
use crate::scheme::{FileHandle, SchemeNamespace};
/// Debug
@@ -48,9 +48,9 @@ pub mod validate;
/// This function is the syscall handler of the kernel, it is composed of an inner function that returns a `Result<usize>`. After the inner function runs, the syscall
/// function calls [`Error::mux`] on it.
pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: usize, stack: &mut SyscallStack) -> usize {
pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: usize, stack: &mut InterruptStack) -> usize {
#[inline(always)]
fn inner(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: usize, stack: &mut SyscallStack) -> Result<usize> {
fn inner(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: usize, stack: &mut InterruptStack) -> Result<usize> {
//SYS_* is declared in kernel/syscall/src/number.rs
match a & SYS_CLASS {
SYS_CLASS_FILE => {
@@ -94,12 +94,12 @@ pub fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize, bp: u
SYS_GETPGID => getpgid(ContextId::from(b)).map(ContextId::into),
SYS_GETPPID => getppid().map(ContextId::into),
SYS_CLONE => {
let old_rsp = stack.rsp;
let old_rsp = stack.iret.rsp;
if b & flag::CLONE_STACK == flag::CLONE_STACK {
stack.rsp = c;
stack.iret.rsp = c;
}
let ret = clone(b, bp).map(ContextId::into);
stack.rsp = old_rsp;
stack.iret.rsp = old_rsp;
ret
},
SYS_EXIT => exit((b & 0xFF) << 8),