@@ -207,7 +207,7 @@ pub fn allocate_and_run<R, F: FnOnce() -> R>(size: usize, f: F) -> R {
207
207
208
208
// NOTE: Keep this consistent with `image-loading-*.s`.
209
209
stack[ end_offset - 4 - 10 ] = & mut ctx as * mut Context < F , R > as usize as u64 ; // rdi
210
- const NUM_SAVED_REGISTERS : usize = 23 ;
210
+ const NUM_SAVED_REGISTERS : usize = 31 ;
211
211
let stack_begin = stack
212
212
. as_mut_ptr ( )
213
213
. offset ( ( end_offset - 4 - NUM_SAVED_REGISTERS ) as isize ) ;
@@ -347,7 +347,7 @@ unsafe fn install_sighandler() {
347
347
pub struct FaultInfo {
348
348
pub faulting_addr : * const c_void ,
349
349
pub ip : * const c_void ,
350
- pub known_registers : [ Option < u64 > ; 24 ] ,
350
+ pub known_registers : [ Option < u64 > ; 32 ] ,
351
351
}
352
352
353
353
#[ cfg( all( target_os = "linux" , target_arch = "x86_64" ) ) ]
@@ -378,7 +378,7 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
378
378
let gregs = & ( * ucontext) . uc_mcontext . gregs ;
379
379
let fpregs = & * ( * ucontext) . uc_mcontext . fpregs ;
380
380
381
- let mut known_registers: [ Option < u64 > ; 24 ] = [ None ; 24 ] ;
381
+ let mut known_registers: [ Option < u64 > ; 32 ] = [ None ; 32 ] ;
382
382
known_registers[ X64Register :: GPR ( GPR :: R15 ) . to_index ( ) . 0 ] = Some ( gregs[ REG_R15 as usize ] as _ ) ;
383
383
known_registers[ X64Register :: GPR ( GPR :: R14 ) . to_index ( ) . 0 ] = Some ( gregs[ REG_R14 as usize ] as _ ) ;
384
384
known_registers[ X64Register :: GPR ( GPR :: R13 ) . to_index ( ) . 0 ] = Some ( gregs[ REG_R13 as usize ] as _ ) ;
@@ -405,6 +405,14 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
405
405
known_registers[ X64Register :: XMM ( XMM :: XMM5 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 5 ] ) ) ;
406
406
known_registers[ X64Register :: XMM ( XMM :: XMM6 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 6 ] ) ) ;
407
407
known_registers[ X64Register :: XMM ( XMM :: XMM7 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 7 ] ) ) ;
408
+ known_registers[ X64Register :: XMM ( XMM :: XMM8 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 8 ] ) ) ;
409
+ known_registers[ X64Register :: XMM ( XMM :: XMM9 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 9 ] ) ) ;
410
+ known_registers[ X64Register :: XMM ( XMM :: XMM10 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 10 ] ) ) ;
411
+ known_registers[ X64Register :: XMM ( XMM :: XMM11 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 11 ] ) ) ;
412
+ known_registers[ X64Register :: XMM ( XMM :: XMM12 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 12 ] ) ) ;
413
+ known_registers[ X64Register :: XMM ( XMM :: XMM13 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 13 ] ) ) ;
414
+ known_registers[ X64Register :: XMM ( XMM :: XMM14 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 14 ] ) ) ;
415
+ known_registers[ X64Register :: XMM ( XMM :: XMM15 ) . to_index ( ) . 0 ] = Some ( read_xmm ( & fpregs. _xmm [ 15 ] ) ) ;
408
416
409
417
FaultInfo {
410
418
faulting_addr : si_addr as usize as _ ,
@@ -458,8 +466,17 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
458
466
}
459
467
#[ repr( C ) ]
460
468
struct fpstate {
461
- _unused : [ u8 ; 168 ] ,
462
- xmm : [ [ u64 ; 2 ] ; 8 ] ,
469
+ _cwd : u16 ,
470
+ _swd : u16 ,
471
+ _ftw : u16 ,
472
+ _fop : u16 ,
473
+ _rip : u64 ,
474
+ _rdp : u64 ,
475
+ _mxcsr : u32 ,
476
+ _mxcr_mask : u32 ,
477
+ _st : [ [ u16 ; 8 ] ; 8 ] ,
478
+ xmm : [ [ u64 ; 2 ] ; 16 ] ,
479
+ _padding : [ u32 ; 24 ] ,
463
480
}
464
481
#[ allow( dead_code) ]
465
482
#[ repr( C ) ]
@@ -476,7 +493,7 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
476
493
let ss = & ( * ( * ucontext) . uc_mcontext ) . ss ;
477
494
let fs = & ( * ( * ucontext) . uc_mcontext ) . fs ;
478
495
479
- let mut known_registers: [ Option < u64 > ; 24 ] = [ None ; 24 ] ;
496
+ let mut known_registers: [ Option < u64 > ; 32 ] = [ None ; 32 ] ;
480
497
481
498
known_registers[ X64Register :: GPR ( GPR :: R15 ) . to_index ( ) . 0 ] = Some ( ss. r15 ) ;
482
499
known_registers[ X64Register :: GPR ( GPR :: R14 ) . to_index ( ) . 0 ] = Some ( ss. r14 ) ;
@@ -504,6 +521,14 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
504
521
known_registers[ X64Register :: XMM ( XMM :: XMM5 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 5 ] [ 0 ] ) ;
505
522
known_registers[ X64Register :: XMM ( XMM :: XMM6 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 6 ] [ 0 ] ) ;
506
523
known_registers[ X64Register :: XMM ( XMM :: XMM7 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 7 ] [ 0 ] ) ;
524
+ known_registers[ X64Register :: XMM ( XMM :: XMM8 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 8 ] [ 0 ] ) ;
525
+ known_registers[ X64Register :: XMM ( XMM :: XMM9 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 9 ] [ 0 ] ) ;
526
+ known_registers[ X64Register :: XMM ( XMM :: XMM10 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 10 ] [ 0 ] ) ;
527
+ known_registers[ X64Register :: XMM ( XMM :: XMM11 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 11 ] [ 0 ] ) ;
528
+ known_registers[ X64Register :: XMM ( XMM :: XMM12 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 12 ] [ 0 ] ) ;
529
+ known_registers[ X64Register :: XMM ( XMM :: XMM13 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 13 ] [ 0 ] ) ;
530
+ known_registers[ X64Register :: XMM ( XMM :: XMM14 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 14 ] [ 0 ] ) ;
531
+ known_registers[ X64Register :: XMM ( XMM :: XMM15 ) . to_index ( ) . 0 ] = Some ( fs. xmm [ 15 ] [ 0 ] ) ;
507
532
508
533
FaultInfo {
509
534
faulting_addr : si_addr,
0 commit comments