@@ -507,16 +507,55 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
507
507
this. write_scalar ( Scalar :: from_int ( result, dest. layout . size ) , dest) ?;
508
508
}
509
509
510
- "strlen" => {
511
- let ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
512
- let n = this. memory ( ) . read_c_str ( ptr) ?. len ( ) ;
513
- this. write_scalar ( Scalar :: from_uint ( n as u64 , dest. layout . size ) , dest) ?;
510
+ "clock_gettime" => {
511
+ if !this. machine . communicate {
512
+ throw_unsup_format ! ( "`clock_gettime` not available when isolation is enabled" )
513
+ } else {
514
+ let tcx = & { this. tcx . tcx } ;
515
+
516
+ let clk_id = this. read_scalar ( args[ 0 ] ) ?. to_i32 ( ) ?;
517
+
518
+ if clk_id != this. eval_libc_i32 ( "CLOCK_REALTIME" ) ? {
519
+ let einval = this. eval_libc ( "EINVAL" ) ?;
520
+ this. set_last_error ( einval) ?;
521
+ this. write_scalar ( Scalar :: from_int ( -1i32 , dest. layout . size ) , dest) ?;
522
+ } else {
523
+ let tp = this. force_ptr ( this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?) ?;
524
+
525
+ let allocation = this. memory_mut ( ) . get_mut ( tp. alloc_id ) ?;
526
+
527
+ let duration = std:: time:: SystemTime :: now ( )
528
+ . duration_since ( std:: time:: SystemTime :: UNIX_EPOCH )
529
+ . unwrap_or_else ( |_| bug ! ( "Clock went backwards" ) ) ;
530
+
531
+ allocation. write_scalar (
532
+ tcx,
533
+ tp,
534
+ Scalar :: from_u64 ( duration. as_secs ( ) ) . into ( ) ,
535
+ Size :: from_bits ( 64 ) ,
536
+ ) ?;
537
+ allocation. write_scalar (
538
+ tcx,
539
+ tp. offset ( Size :: from_bits ( 64 ) , tcx) ?,
540
+ Scalar :: from_u64 ( duration. subsec_nanos ( ) as u64 ) . into ( ) ,
541
+ Size :: from_bits ( 64 ) ,
542
+ ) ?;
543
+
544
+ this. write_scalar ( Scalar :: from_int ( 0i32 , dest. layout . size ) , dest) ?;
545
+ }
546
+ }
514
547
}
515
548
516
- // math functions
517
- "cbrtf" | "coshf" | "sinhf" | "tanf" => {
518
- // FIXME: Using host floats.
519
- let f = f32:: from_bits ( this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ?) ;
549
+ "strlen" => {
550
+ let ptr = this. read_scalar ( args[ 0 ] ) ?. not_undef ( ) ?;
551
+ let n = this. memory ( ) . read_c_str ( ptr) ?. len ( ) ;
552
+ this. write_scalar ( Scalar :: from_uint ( n as u64 , dest. layout . size ) , dest) ?;
553
+ }
554
+
555
+ // math functions
556
+ "cbrtf" | "coshf" | "sinhf" | "tanf" => {
557
+ // FIXME: Using host floats.
558
+ let f = f32:: from_bits ( this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ?) ;
520
559
let f = match link_name {
521
560
"cbrtf" => f. cbrt ( ) ,
522
561
"coshf" => f. cosh ( ) ,
0 commit comments