@@ -118,6 +118,7 @@ mod x86_64 {
118
118
use crate :: PrivilegeLevel ;
119
119
use bit_field:: BitField ;
120
120
use core:: convert:: TryInto ;
121
+ use core:: fmt;
121
122
122
123
impl Msr {
123
124
/// Read 64 bits msr register.
@@ -367,21 +368,21 @@ mod x86_64 {
367
368
ss_sysret : SegmentSelector ,
368
369
cs_syscall : SegmentSelector ,
369
370
ss_syscall : SegmentSelector ,
370
- ) -> Result < ( ) , & ' static str > {
371
+ ) -> Result < ( ) , InvalidStarSegmentSelectors > {
371
372
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 ) ;
373
374
}
374
375
375
376
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 ) ;
377
378
}
378
379
379
380
if ss_sysret. rpl ( ) != PrivilegeLevel :: Ring3 {
380
- return Err ( "Sysret's segment must be a Ring3 segment." ) ;
381
+ return Err ( InvalidStarSegmentSelectors :: SysretPrivilegeLevel ) ;
381
382
}
382
383
383
384
if ss_syscall. rpl ( ) != PrivilegeLevel :: Ring0 {
384
- return Err ( "Syscall's segment must be a Ring0 segment." ) ;
385
+ return Err ( InvalidStarSegmentSelectors :: SyscallPrivilegeLevel ) ;
385
386
}
386
387
387
388
unsafe { Self :: write_raw ( ss_sysret. 0 - 8 , cs_syscall. 0 ) } ;
@@ -390,6 +391,29 @@ mod x86_64 {
390
391
}
391
392
}
392
393
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
+
393
417
impl LStar {
394
418
/// Read the current LStar register.
395
419
/// This holds the target RIP of a syscall.
0 commit comments