Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 93a0584605 |
@@ -243,7 +243,7 @@ fn validate_user_align_size(addr: usize, layout: &Layout) -> Result<(), Error> {
|
|||||||
return Err(Error::InvalidArgument);
|
return Err(Error::InvalidArgument);
|
||||||
}
|
}
|
||||||
if addr + layout.size() > KERNEL_VIRT_OFFSET {
|
if addr + layout.size() > KERNEL_VIRT_OFFSET {
|
||||||
todo!();
|
return Err(Error::InvalidArgument);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -75,8 +75,10 @@ cfg_if::cfg_if! {
|
|||||||
if #[cfg(target_arch = "x86_64")] {
|
if #[cfg(target_arch = "x86_64")] {
|
||||||
extern crate ygg_driver_net_igbe;
|
extern crate ygg_driver_net_igbe;
|
||||||
} else if #[cfg(target_arch = "aarch64")] {
|
} else if #[cfg(target_arch = "aarch64")] {
|
||||||
|
extern crate ygg_driver_bsp_arm;
|
||||||
extern crate ygg_driver_bsp_bcm283x;
|
extern crate ygg_driver_bsp_bcm283x;
|
||||||
} else if #[cfg(target_arch = "riscv64")] {
|
} else if #[cfg(target_arch = "riscv64")] {
|
||||||
|
extern crate ygg_driver_bsp_riscv;
|
||||||
extern crate ygg_driver_bsp_jh7110;
|
extern crate ygg_driver_bsp_jh7110;
|
||||||
|
|
||||||
extern crate ygg_driver_net_stmmac;
|
extern crate ygg_driver_net_stmmac;
|
||||||
|
|||||||
Generated
+24
@@ -901,6 +901,12 @@ dependencies = [
|
|||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "either"
|
||||||
|
version = "1.15.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "elf"
|
name = "elf"
|
||||||
version = "0.7.4"
|
version = "0.7.4"
|
||||||
@@ -1089,6 +1095,15 @@ dependencies = [
|
|||||||
"slab",
|
"slab",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fuzzy"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"itertools",
|
||||||
|
"rand",
|
||||||
|
"runtime",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "generic-array"
|
name = "generic-array"
|
||||||
version = "0.14.7"
|
version = "0.14.7"
|
||||||
@@ -1410,6 +1425,15 @@ version = "1.70.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itertools"
|
||||||
|
version = "0.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.15"
|
version = "1.0.15"
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ members = [
|
|||||||
"netutils",
|
"netutils",
|
||||||
"sysutils",
|
"sysutils",
|
||||||
"tools/crypt",
|
"tools/crypt",
|
||||||
|
"tools/fuzzy",
|
||||||
"tools/init",
|
"tools/init",
|
||||||
"tools/md2txt",
|
"tools/md2txt",
|
||||||
"tools/ntpc",
|
"tools/ntpc",
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "fuzzy"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
itertools = "0.14.0"
|
||||||
|
rand.workspace = true
|
||||||
|
runtime.workspace = true
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
#![feature(rustc_private)]
|
||||||
|
|
||||||
|
use itertools::Itertools;
|
||||||
|
use rand::Rng;
|
||||||
|
use runtime::abi::SyscallFunction;
|
||||||
|
|
||||||
|
enum Argument {
|
||||||
|
Fd,
|
||||||
|
OptionFd,
|
||||||
|
Path,
|
||||||
|
AccessMode,
|
||||||
|
BytesRef,
|
||||||
|
BytesMut,
|
||||||
|
FileSize,
|
||||||
|
Enum(usize),
|
||||||
|
Number(usize, usize),
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Definition {
|
||||||
|
name: &'static str,
|
||||||
|
number: usize,
|
||||||
|
args: &'static [Argument],
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn syscall(
|
||||||
|
func: SyscallFunction,
|
||||||
|
name: &'static str,
|
||||||
|
args: &'static [Argument],
|
||||||
|
) -> Definition {
|
||||||
|
Definition {
|
||||||
|
name,
|
||||||
|
number: func as _,
|
||||||
|
args,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const DEFS: &[Definition] = const {
|
||||||
|
use Argument::*;
|
||||||
|
|
||||||
|
&[
|
||||||
|
// syscall get_random(buffer: &mut [u8]);
|
||||||
|
syscall(SyscallFunction::GetRandom, "get_random", &[BytesMut]),
|
||||||
|
// syscall get_clock(clock: ClockType, out: &mut MaybeUninit<SystemTime>) -> Result<()>;
|
||||||
|
// syscall set_clock(clock: ClockType, value: &SystemTime) -> Result<()>;
|
||||||
|
// syscall mount(opts: &MountOptions<'_>) -> Result<()>;
|
||||||
|
// syscall unmount(opts: &UnmountOptions) -> Result<()>;
|
||||||
|
// syscall load_module(path: &str) -> Result<()>;
|
||||||
|
|
||||||
|
// syscall filesystem_control(fd: Option<RawFd>, option: u32, value: &mut [u8], len: usize) -> Result<usize>;
|
||||||
|
// syscall get_system_info(option: u32, value: &mut [u8]) -> Result<usize>;
|
||||||
|
|
||||||
|
// syscall open(at: Option<RawFd>, path: &str, opts: OpenOptions, mode: FileMode) -> Result<RawFd>;
|
||||||
|
syscall(SyscallFunction::Open, "open", &[OptionFd, Path, AccessMode]),
|
||||||
|
// syscall check_access(at: Option<RawFd>, path: &str, access: AccessMode) -> Result<()>;
|
||||||
|
syscall(
|
||||||
|
SyscallFunction::CheckAccess,
|
||||||
|
"check_access",
|
||||||
|
&[OptionFd, Path, AccessMode],
|
||||||
|
),
|
||||||
|
// syscall close(fd: RawFd) -> Result<()>;
|
||||||
|
syscall(SyscallFunction::Close, "close", &[Fd]),
|
||||||
|
// syscall write(fd: RawFd, data: &[u8]) -> Result<usize>;
|
||||||
|
syscall(SyscallFunction::Write, "write", &[Fd, BytesRef]),
|
||||||
|
// syscall read(fd: RawFd, data: &mut [u8]) -> Result<usize>;
|
||||||
|
syscall(SyscallFunction::Read, "read", &[Fd, BytesMut]),
|
||||||
|
// syscall seek(fd: RawFd, pos: SeekFrom, output: &mut u64) -> Result<()>; TODO
|
||||||
|
// syscall truncate(fd: RawFd, size: u64) -> Result<()>;
|
||||||
|
syscall(SyscallFunction::Truncate, "truncate", &[Fd, FileSize]),
|
||||||
|
// syscall fsync(fd: RawFd, what: FileSync) -> Result<()>;
|
||||||
|
// syscall(SyscallFunction::Fsync, "fsync", &[Fd, Enum(123)]), TODO not implemented
|
||||||
|
// syscall read_at(fd: RawFd, pos: u64, data: &mut [u8]) -> Result<usize>;
|
||||||
|
syscall(
|
||||||
|
SyscallFunction::ReadAt,
|
||||||
|
"read_at",
|
||||||
|
&[Fd, FileSize, BytesMut],
|
||||||
|
),
|
||||||
|
// syscall write_at(fd: RawFd, pos: u64, data: &[u8]) -> Result<usize>;
|
||||||
|
syscall(
|
||||||
|
SyscallFunction::WriteAt,
|
||||||
|
"write_at",
|
||||||
|
&[Fd, FileSize, BytesRef],
|
||||||
|
),
|
||||||
|
// syscall get_file_option(fd: RawFd, option: u32, data: &mut [u8]) -> Result<usize>;
|
||||||
|
syscall(
|
||||||
|
SyscallFunction::GetFileOption,
|
||||||
|
"get_file_option",
|
||||||
|
&[Fd, Number(usize::MIN, usize::MAX), BytesMut],
|
||||||
|
),
|
||||||
|
// syscall set_file_option(fd: RawFd, option: u32, data: &[u8]) -> Result<()>;
|
||||||
|
syscall(
|
||||||
|
SyscallFunction::SetFileOption,
|
||||||
|
"set_file_option",
|
||||||
|
&[Fd, Number(usize::MIN, usize::MAX), BytesRef],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
fn generate_argument_variants(arg: &Argument) -> Vec<Vec<usize>> {
|
||||||
|
match arg {
|
||||||
|
Argument::Path | Argument::BytesRef => {
|
||||||
|
vec![vec![0, 0], vec![0, 123], vec![0xFFFFFF8012345678, 123]]
|
||||||
|
}
|
||||||
|
Argument::BytesMut => {
|
||||||
|
vec![
|
||||||
|
vec![0, 0],
|
||||||
|
vec![0, 123],
|
||||||
|
vec![0xFFFFFF8012345678, 123],
|
||||||
|
vec!["abcdef".as_ptr().addr(), 123],
|
||||||
|
]
|
||||||
|
}
|
||||||
|
Argument::OptionFd | Argument::Fd => {
|
||||||
|
vec![vec![1234], vec![usize::MAX]]
|
||||||
|
}
|
||||||
|
Argument::AccessMode => {
|
||||||
|
vec![vec![0], vec![usize::MAX]]
|
||||||
|
}
|
||||||
|
Argument::FileSize => {
|
||||||
|
vec![vec![usize::MAX]]
|
||||||
|
}
|
||||||
|
&Argument::Enum(lower_bound) => {
|
||||||
|
vec![vec![lower_bound + 1], vec![usize::MAX]]
|
||||||
|
}
|
||||||
|
&Argument::Number(a, b) => (0..100)
|
||||||
|
.map(|_| rand::thread_rng().gen_range(a..b))
|
||||||
|
.map(|a| vec![a])
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fuzz(def: &Definition) {
|
||||||
|
let argument_variants = def
|
||||||
|
.args
|
||||||
|
.iter()
|
||||||
|
.map(generate_argument_variants)
|
||||||
|
.multi_cartesian_product()
|
||||||
|
.map(|combo| combo.into_iter().flatten());
|
||||||
|
|
||||||
|
for variant in argument_variants {
|
||||||
|
let variant = variant.collect::<Vec<_>>();
|
||||||
|
println!("{}: {:x?}", def.name, variant);
|
||||||
|
let result = unsafe {
|
||||||
|
match variant.len() {
|
||||||
|
1 => runtime::rt::syscall!(def.number, variant[0]),
|
||||||
|
2 => runtime::rt::syscall!(def.number, variant[0], variant[1]),
|
||||||
|
3 => runtime::rt::syscall!(def.number, variant[0], variant[1], variant[2]),
|
||||||
|
4 => runtime::rt::syscall!(
|
||||||
|
def.number, variant[0], variant[1], variant[2], variant[3]
|
||||||
|
),
|
||||||
|
5 => runtime::rt::syscall!(
|
||||||
|
def.number, variant[0], variant[1], variant[2], variant[3], variant[4]
|
||||||
|
),
|
||||||
|
_ => unimplemented!(),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
println!(" -> {:#x} ({})", result, result as isize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
for def in DEFS {
|
||||||
|
fuzz(def);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -81,6 +81,7 @@ const PROGRAMS: &[(&str, &str)] = &[
|
|||||||
// crypt
|
// crypt
|
||||||
("crypt", "bin/crypt"),
|
("crypt", "bin/crypt"),
|
||||||
("dyn-loader", "libexec/dyn-loader"),
|
("dyn-loader", "libexec/dyn-loader"),
|
||||||
|
("fuzzy", "sbin/fuzzy"),
|
||||||
// TODO: proper process for C program builds
|
// TODO: proper process for C program builds
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user