relibc: use /scheme/proc/{pid}/ctx for ptrace GETREGS/SETREGS

This commit is contained in:
Red Bear OS
2026-07-08 17:58:11 +03:00
parent 628d5c2a51
commit c1e4c1d53d
+10 -16
View File
@@ -35,9 +35,8 @@ use syscall;
pub struct Session {
pub first: bool,
pub fpregs: File,
pub mem: File,
pub regs: File,
pub ctx: File,
pub tracer: File,
}
pub struct State {
@@ -94,16 +93,8 @@ pub fn get_session(
CStr::borrow(&CString::new(format!("/scheme/proc/{}/mem", pid)).unwrap()),
NEW_FLAGS,
)?,
regs: File::open(
CStr::borrow(
&CString::new(format!("/scheme/proc/{}/regs/int", pid)).unwrap(),
),
NEW_FLAGS,
)?,
fpregs: File::open(
CStr::borrow(
&CString::new(format!("/scheme/proc/{}/regs/float", pid)).unwrap(),
),
ctx: File::open(
CStr::borrow(&CString::new(format!("/scheme/proc/{}/ctx", pid)).unwrap()),
NEW_FLAGS,
)?,
}))
@@ -194,8 +185,9 @@ unsafe fn inner_ptrace(
}
sys_ptrace::PTRACE_GETREGS => {
let c_regs = unsafe { &mut *(data as *mut user_regs_struct) };
let mut redox_regs = syscall::IntRegisters::default();
(&mut &session.regs).read(&mut redox_regs)?;
let mut full = syscall::FullContextRegs::default();
(&mut &session.ctx).read(&mut full)?;
let redox_regs = full.int;
*c_regs = user_regs_struct {
r15: redox_regs.r15 as _,
r14: redox_regs.r14 as _,
@@ -229,7 +221,9 @@ unsafe fn inner_ptrace(
}
sys_ptrace::PTRACE_SETREGS => {
let c_regs = unsafe { &*(data as *mut user_regs_struct) };
let redox_regs = syscall::IntRegisters {
let mut full = syscall::FullContextRegs::default();
(&mut &session.ctx).read(&mut full)?;
full.int = syscall::IntRegisters {
r15: c_regs.r15 as _,
r14: c_regs.r14 as _,
r13: c_regs.r13 as _,
@@ -258,7 +252,7 @@ unsafe fn inner_ptrace(
// fs: c_regs.fs as _,
// gs: c_regs.gs as _,
};
(&mut &session.regs).write(&redox_regs)?;
(&mut &session.ctx).write(&full)?;
Ok(0)
}
_ => unimplemented!(),