Add `is_forced` into `PageFaultInfo`
This commit is contained in:
parent
6d2ff13a63
commit
35b9841cee
|
|
@ -152,10 +152,7 @@ impl TryFrom<&CpuExceptionInfo> for PageFaultInfo {
|
||||||
_ => return Err(()),
|
_ => return Err(()),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(PageFaultInfo {
|
Ok(PageFaultInfo::new(value.page_fault_addr, required_perms))
|
||||||
address: value.page_fault_addr,
|
|
||||||
required_perms,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -150,10 +150,7 @@ impl TryFrom<&CpuException> for PageFaultInfo {
|
||||||
_ => return Err(()),
|
_ => return Err(()),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(PageFaultInfo {
|
Ok(PageFaultInfo::new(*fault_addr, required_perms))
|
||||||
address: *fault_addr,
|
|
||||||
required_perms,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -145,10 +145,7 @@ impl From<&RawPageFaultInfo> for PageFaultInfo {
|
||||||
VmPerms::READ
|
VmPerms::READ
|
||||||
};
|
};
|
||||||
|
|
||||||
PageFaultInfo {
|
PageFaultInfo::new(raw_info.addr, required_perms)
|
||||||
address: raw_info.addr,
|
|
||||||
required_perms,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,10 +72,7 @@ pub fn futex_wait_bitset(
|
||||||
// The futex word is aligned on a 4-byte boundary, so it cannot cross the page boundary.
|
// The futex word is aligned on a 4-byte boundary, so it cannot cross the page boundary.
|
||||||
user_space
|
user_space
|
||||||
.vmar()
|
.vmar()
|
||||||
.handle_page_fault(&PageFaultInfo {
|
.handle_page_fault(&PageFaultInfo::new(futex_addr, VmPerms::READ))
|
||||||
address: futex_addr,
|
|
||||||
required_perms: VmPerms::READ,
|
|
||||||
})
|
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
Error::with_message(
|
Error::with_message(
|
||||||
Errno::EFAULT,
|
Errno::EFAULT,
|
||||||
|
|
@ -288,10 +285,10 @@ pub fn futex_wake_op(
|
||||||
// The futex word is aligned on a 4-byte boundary, so it cannot cross the page boundary.
|
// The futex word is aligned on a 4-byte boundary, so it cannot cross the page boundary.
|
||||||
user_space
|
user_space
|
||||||
.vmar()
|
.vmar()
|
||||||
.handle_page_fault(&PageFaultInfo {
|
.handle_page_fault(&PageFaultInfo::new(
|
||||||
address: futex_addr_2,
|
futex_addr_2,
|
||||||
required_perms: VmPerms::READ | VmPerms::WRITE,
|
VmPerms::READ | VmPerms::WRITE,
|
||||||
})
|
))
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
Error::with_message(
|
Error::with_message(
|
||||||
Errno::EFAULT,
|
Errno::EFAULT,
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,30 @@ pub struct PageFaultInfo {
|
||||||
/// The [`VmPerms`] required by the memory operation that causes page fault.
|
/// The [`VmPerms`] required by the memory operation that causes page fault.
|
||||||
/// For example, a "store" operation may require `VmPerms::WRITE`.
|
/// For example, a "store" operation may require `VmPerms::WRITE`.
|
||||||
pub required_perms: VmPerms,
|
pub required_perms: VmPerms,
|
||||||
|
|
||||||
|
/// Whether this page fault is forced (e.g., manually triggered by `ptrace`).
|
||||||
|
/// A forced page fault may bypass some permission checks.
|
||||||
|
pub is_forced: bool,
|
||||||
|
|
||||||
|
_private: (),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PageFaultInfo {
|
||||||
|
/// Creates a new `PageFaultInfo`.
|
||||||
|
pub fn new(address: Vaddr, required_perms: VmPerms) -> Self {
|
||||||
|
Self {
|
||||||
|
address,
|
||||||
|
required_perms,
|
||||||
|
is_forced: false,
|
||||||
|
_private: (),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Marks this page fault as forced.
|
||||||
|
pub fn force(mut self) -> Self {
|
||||||
|
self.is_forced = true;
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// We can't handle most exceptions, just send self a fault signal before return to user space.
|
/// We can't handle most exceptions, just send self a fault signal before return to user space.
|
||||||
|
|
|
||||||
|
|
@ -150,10 +150,7 @@ impl Vmar {
|
||||||
Some(_) | None => (),
|
Some(_) | None => (),
|
||||||
}
|
}
|
||||||
|
|
||||||
let page_fault_info = PageFaultInfo {
|
let page_fault_info = PageFaultInfo::new(vaddr, required_page_flags.into()).force();
|
||||||
address: vaddr,
|
|
||||||
required_perms: required_page_flags.into(),
|
|
||||||
};
|
|
||||||
self.handle_page_fault(&page_fault_info)?;
|
self.handle_page_fault(&page_fault_info)?;
|
||||||
|
|
||||||
item = self.query_page(vaddr)?;
|
item = self.query_page(vaddr)?;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue