Skip to content

Commit a96abb2

Browse files
authored
Merge pull request #317 from Freax13/proper-star-error
add `InvalidStarSegmentSelectors`
2 parents 3b8a597 + ddf7a68 commit a96abb2

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

src/registers/model_specific.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ mod x86_64 {
118118
use crate::PrivilegeLevel;
119119
use bit_field::BitField;
120120
use core::convert::TryInto;
121+
use core::fmt;
121122

122123
impl Msr {
123124
/// Read 64 bits msr register.
@@ -367,21 +368,21 @@ mod x86_64 {
367368
ss_sysret: SegmentSelector,
368369
cs_syscall: SegmentSelector,
369370
ss_syscall: SegmentSelector,
370-
) -> Result<(), &'static str> {
371+
) -> Result<(), InvalidStarSegmentSelectors> {
371372
if cs_sysret.0 - 16 != ss_sysret.0 - 8 {
372-
return Err("Sysret CS and SS is not offset by 8.");
373+
return Err(InvalidStarSegmentSelectors::SysretOffset);
373374
}
374375

375376
if cs_syscall.0 != ss_syscall.0 - 8 {
376-
return Err("Syscall CS and SS is not offset by 8.");
377+
return Err(InvalidStarSegmentSelectors::SyscallOffset);
377378
}
378379

379380
if ss_sysret.rpl() != PrivilegeLevel::Ring3 {
380-
return Err("Sysret's segment must be a Ring3 segment.");
381+
return Err(InvalidStarSegmentSelectors::SysretPrivilegeLevel);
381382
}
382383

383384
if ss_syscall.rpl() != PrivilegeLevel::Ring0 {
384-
return Err("Syscall's segment must be a Ring0 segment.");
385+
return Err(InvalidStarSegmentSelectors::SyscallPrivilegeLevel);
385386
}
386387

387388
unsafe { Self::write_raw(ss_sysret.0 - 8, cs_syscall.0) };
@@ -390,6 +391,29 @@ mod x86_64 {
390391
}
391392
}
392393

394+
#[derive(Debug)]
395+
pub enum InvalidStarSegmentSelectors {
396+
SysretOffset,
397+
SyscallOffset,
398+
SysretPrivilegeLevel,
399+
SyscallPrivilegeLevel,
400+
}
401+
402+
impl fmt::Display for InvalidStarSegmentSelectors {
403+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
404+
match self {
405+
Self::SysretOffset => write!(f, "Sysret CS and SS are not offset by 8."),
406+
Self::SyscallOffset => write!(f, "Syscall CS and SS are not offset by 8."),
407+
Self::SysretPrivilegeLevel => {
408+
write!(f, "Sysret's segment must be a Ring3 segment.")
409+
}
410+
Self::SyscallPrivilegeLevel => {
411+
write!(f, "Syscall's segment must be a Ring0 segment.")
412+
}
413+
}
414+
}
415+
}
416+
393417
impl LStar {
394418
/// Read the current LStar register.
395419
/// This holds the target RIP of a syscall.

0 commit comments

Comments
 (0)