Auto merge of #3554 - RalfJung:freebsd, r=RalfJung

document unofficially supported OSes

Also tweak the freeBSD testing a bit.
This commit is contained in:
bors 2024-05-04 12:33:22 +00:00
commit 3a6faee1e2
10 changed files with 34 additions and 33 deletions

View File

@ -224,8 +224,11 @@ degree documented below):
- `s390x-unknown-linux-gnu` is supported as our "big-endian target of choice". - `s390x-unknown-linux-gnu` is supported as our "big-endian target of choice".
- For every other target with OS `linux`, `macos`, or `windows`, Miri should generally work, but we - For every other target with OS `linux`, `macos`, or `windows`, Miri should generally work, but we
make no promises and we don't run tests for such targets. make no promises and we don't run tests for such targets.
- For targets on other operating systems, even basic operations such as printing to the standard - We have unofficial support (not maintained by the Miri team itself) for some further operating systems.
output might not work, and Miri might fail before even reaching the `main` function. - `freebsd`: **maintainer wanted**. Supports `std::env` and parts of `std::{thread, fs}`, but not `std::sync`.
- `android`: **maintainer wanted**. Support very incomplete, but a basic "hello world" works.
- `wasm`: **maintainer wanted**. Support very incomplete, not even standard output works, but an empty `main` function works.
- For targets on other operating systems, Miri might fail before even reaching the `main` function.
However, even for targets that we do support, the degree of support for accessing platform APIs However, even for targets that we do support, the degree of support for accessing platform APIs
(such as the file system) differs between targets: generally, Linux targets have the best support, (such as the file system) differs between targets: generally, Linux targets have the best support,

View File

@ -141,11 +141,13 @@ case $HOST_TARGET in
MIRI_TEST_TARGET=arm-unknown-linux-gnueabi run_tests MIRI_TEST_TARGET=arm-unknown-linux-gnueabi run_tests
MIRI_TEST_TARGET=s390x-unknown-linux-gnu run_tests # big-endian architecture of choice MIRI_TEST_TARGET=s390x-unknown-linux-gnu run_tests # big-endian architecture of choice
# Partially supported targets (tier 2) # Partially supported targets (tier 2)
MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal hello integer vec panic/panic concurrency/simple pthread-threadname libc-getentropy libc-getrandom libc-misc libc-fs atomic env align num_cpus VERY_BASIC="integer vec string btreemap" # common things we test on all of them (if they have std), requires no target-specific shims
MIRI_TEST_TARGET=i686-unknown-freebsd run_tests_minimal hello integer vec panic/panic concurrency/simple pthread-threadname libc-getentropy libc-getrandom libc-misc libc-fs atomic env align num_cpus BASIC="$VERY_BASIC hello hashmap alloc align" # ensures we have the shims for stdout and basic data structures
MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal hello integer vec panic/panic MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-getentropy libc-getrandom libc-misc fs env num_cpus
MIRI_TEST_TARGET=wasm32-wasi run_tests_minimal no_std integer strings wasm MIRI_TEST_TARGET=i686-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-getentropy libc-getrandom libc-misc fs env num_cpus
MIRI_TEST_TARGET=wasm32-unknown-unknown run_tests_minimal no_std integer strings wasm MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal $VERY_BASIC hello panic/panic
MIRI_TEST_TARGET=wasm32-wasi run_tests_minimal $VERY_BASIC wasm
MIRI_TEST_TARGET=wasm32-unknown-unknown run_tests_minimal $VERY_BASIC wasm
MIRI_TEST_TARGET=thumbv7em-none-eabihf run_tests_minimal no_std MIRI_TEST_TARGET=thumbv7em-none-eabihf run_tests_minimal no_std
# Custom target JSON file # Custom target JSON file
MIRI_TEST_TARGET=tests/avr.json MIRI_NO_STD=1 run_tests_minimal no_std MIRI_TEST_TARGET=tests/avr.json MIRI_NO_STD=1 run_tests_minimal no_std

View File

@ -47,21 +47,6 @@ fn emulate_foreign_item_inner(
this.read_scalar(len)?, this.read_scalar(len)?,
)?; )?;
} }
"getrandom" => {
let [ptr, len, flags] =
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
let ptr = this.read_pointer(ptr)?;
let len = this.read_target_usize(len)?;
let _flags = this.read_scalar(flags)?.to_i32()?;
// flags on freebsd does not really matter
// in practice, GRND_RANDOM does not particularly draw from /dev/random
// since it is the same as to /dev/urandom.
// GRND_INSECURE is only an alias of GRND_NONBLOCK, which
// does not affect the RNG.
// https://man.freebsd.org/cgi/man.cgi?query=getrandom&sektion=2&n=1
this.gen_random(ptr, len)?;
this.write_scalar(Scalar::from_target_usize(len, this), dest)?;
}
// File related shims // File related shims
// For those, we both intercept `func` and `call@FBSD_1.0` symbols cases // For those, we both intercept `func` and `call@FBSD_1.0` symbols cases
@ -90,7 +75,22 @@ fn emulate_foreign_item_inner(
this.write_scalar(result, dest)?; this.write_scalar(result, dest)?;
} }
// errno // Miscellaneous
"getrandom" => {
let [ptr, len, flags] =
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
let ptr = this.read_pointer(ptr)?;
let len = this.read_target_usize(len)?;
let _flags = this.read_scalar(flags)?.to_i32()?;
// flags on freebsd does not really matter
// in practice, GRND_RANDOM does not particularly draw from /dev/random
// since it is the same as to /dev/urandom.
// GRND_INSECURE is only an alias of GRND_NONBLOCK, which
// does not affect the RNG.
// https://man.freebsd.org/cgi/man.cgi?query=getrandom&sektion=2&n=1
this.gen_random(ptr, len)?;
this.write_scalar(Scalar::from_target_usize(len, this), dest)?;
}
"__error" => { "__error" => {
let [] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?; let [] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
let errno_place = this.last_error_place()?; let errno_place = this.last_error_place()?;

View File

@ -62,7 +62,10 @@ fn test_from_utf8() {
const N: usize = 10; const N: usize = 10;
let vec = vec![0x4141414141414141u64; N]; let vec = vec![0x4141414141414141u64; N];
let content = unsafe { std::slice::from_raw_parts(vec.as_ptr() as *const u8, 8 * N) }; let content = unsafe { std::slice::from_raw_parts(vec.as_ptr() as *const u8, 8 * N) };
println!("{:?}", std::str::from_utf8(content).unwrap()); assert_eq!(
std::str::from_utf8(content).unwrap(),
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
);
} }
fn test_u64_array() { fn test_u64_array() {

View File

@ -1 +0,0 @@
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

View File

@ -31,8 +31,8 @@ fn main() {
} }
// Regression test for Debug impl's // Regression test for Debug impl's
println!("{:?} {:?}", dst, dst.iter()); format!("{:?} {:?}", dst, dst.iter());
println!("{:?}", VecDeque::<u32>::new().iter()); format!("{:?}", VecDeque::<u32>::new().iter());
for a in dst { for a in dst {
assert_eq!(*a, 2); assert_eq!(*a, 2);

View File

@ -1,2 +0,0 @@
[2, 2] Iter([2, 2], [])
Iter([], [])

View File

@ -1,2 +0,0 @@
[2, 2] Iter([2, 2], [])
Iter([], [])

View File

@ -1,2 +0,0 @@
[2, 2] Iter([2, 2], [])
Iter([], [])