@@ -596,18 +596,59 @@ pub trait EvalContextExt<'a, 'mir, 'tcx: 'a+'mir>: crate::MiriEvalContextExt<'a,
596
596
this. write_scalar ( Scalar :: from_uint ( key, dest. layout . size ) , dest) ?;
597
597
}
598
598
"TlsGetValue" => {
599
- let key = this. read_scalar ( args[ 0 ] ) ?. to_bits ( args [ 0 ] . layout . size ) ? ;
599
+ let key = this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ? as u128 ;
600
600
let ptr = this. machine . tls . load_tls ( key) ?;
601
601
this. write_scalar ( ptr, dest) ?;
602
602
}
603
603
"TlsSetValue" => {
604
- let key = this. read_scalar ( args[ 0 ] ) ?. to_bits ( args [ 0 ] . layout . size ) ? ;
604
+ let key = this. read_scalar ( args[ 0 ] ) ?. to_u32 ( ) ? as u128 ;
605
605
let new_ptr = this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?;
606
606
this. machine . tls . store_tls ( key, new_ptr) ?;
607
607
608
608
// Return success (1)
609
609
this. write_scalar ( Scalar :: from_int ( 1 , dest. layout . size ) , dest) ?;
610
610
}
611
+ "GetStdHandle" => {
612
+ let which = this. read_scalar ( args[ 0 ] ) ?. to_i32 ( ) ?;
613
+ // We just make this the identity function, so we know later in "WriteFile"
614
+ // which one it is.
615
+ this. write_scalar ( Scalar :: from_int ( which, this. pointer_size ( ) ) , dest) ?;
616
+ }
617
+ "WriteFile" => {
618
+ let handle = this. read_scalar ( args[ 0 ] ) ?. to_isize ( this) ?;
619
+ let buf = this. read_scalar ( args[ 1 ] ) ?. not_undef ( ) ?;
620
+ let n = this. read_scalar ( args[ 2 ] ) ?. to_u32 ( ) ?;
621
+ let written_place = this. deref_operand ( args[ 3 ] ) ?;
622
+ this. write_null ( written_place. into ( ) ) ?; // spec says we always write 0 first
623
+ let written = if handle == -11 || handle == -12 {
624
+ // stdout/stderr
625
+ use std:: io:: { self , Write } ;
626
+
627
+ let buf_cont = this. memory ( ) . read_bytes ( buf, Size :: from_bytes ( u64:: from ( n) ) ) ?;
628
+ let res = if handle == -11 {
629
+ io:: stdout ( ) . write ( buf_cont)
630
+ } else {
631
+ io:: stderr ( ) . write ( buf_cont)
632
+ } ;
633
+ res. ok ( ) . map ( |n| n as u32 )
634
+ } else {
635
+ eprintln ! ( "Miri: Ignored output to handle {}" , handle) ;
636
+ Some ( n) // pretend it all went well
637
+ } ;
638
+ // If there was no error, write back how much was written
639
+ if let Some ( n) = written {
640
+ this. write_scalar ( Scalar :: from_uint ( n, Size :: from_bits ( 32 ) ) , written_place. into ( ) ) ?;
641
+ }
642
+ // Return whether this was a success
643
+ this. write_scalar (
644
+ Scalar :: from_int ( if written. is_some ( ) { 1 } else { 0 } , dest. layout . size ) ,
645
+ dest,
646
+ ) ?;
647
+ }
648
+ "GetConsoleMode" => {
649
+ // Everything is a pipe
650
+ this. write_null ( dest) ?;
651
+ }
611
652
612
653
// We can't execute anything else
613
654
_ => {
0 commit comments