parent
61e3f0b3a4
commit
f9b643e7b3
@ -1,3 +1,3 @@
|
|||||||
[workspace]
|
[workspace]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = ["gdb_qemu", "demo"]
|
members = ["gdb_qemu", "gdb_demo"]
|
||||||
|
@ -28,7 +28,7 @@ command = "cargo"
|
|||||||
args = [
|
args = [
|
||||||
"build",
|
"build",
|
||||||
"-p",
|
"-p",
|
||||||
"demo",
|
"gdb_demo",
|
||||||
"--profile",
|
"--profile",
|
||||||
"${PROFILE}",
|
"${PROFILE}",
|
||||||
"--target",
|
"--target",
|
||||||
@ -38,7 +38,7 @@ args = [
|
|||||||
[tasks.run_demo]
|
[tasks.run_demo]
|
||||||
dependencies = ["demo"]
|
dependencies = ["demo"]
|
||||||
command = "cargo"
|
command = "cargo"
|
||||||
args = ["run", "-p", "demo", "--target", "powerpc-unknown-linux-gnu"]
|
args = ["run", "-p", "gdb_demo", "--target", "powerpc-unknown-linux-gnu"]
|
||||||
|
|
||||||
[tasks.build]
|
[tasks.build]
|
||||||
dependencies = ["format", "clippy"]
|
dependencies = ["format", "clippy"]
|
||||||
@ -65,7 +65,7 @@ args = [
|
|||||||
"/usr/powerpc-linux-gnu",
|
"/usr/powerpc-linux-gnu",
|
||||||
"-g",
|
"-g",
|
||||||
"1234",
|
"1234",
|
||||||
"${DEMO_DIR}/demo",
|
"${DEMO_DIR}/gdb_demo",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tasks.gdb]
|
[tasks.gdb]
|
||||||
@ -79,9 +79,9 @@ args = [
|
|||||||
"-ex",
|
"-ex",
|
||||||
"set confirm off",
|
"set confirm off",
|
||||||
"-ex",
|
"-ex",
|
||||||
"file ${DEMO_DIR}/demo",
|
"file ${DEMO_DIR}/gdb_demo",
|
||||||
"-ex",
|
"-ex",
|
||||||
"target remote | ${TARGET_DIR}/gdb_qemu -p 1234 -L trace qemu-ppc -- -L /usr/powerpc-linux-gnu -g 1234 ${DEMO_DIR}/demo",
|
"target remote | ${TARGET_DIR}/gdb_qemu -p 1234 -L trace qemu-ppc -- -L /usr/powerpc-linux-gnu -g 1234 ${DEMO_DIR}/gdb_demo",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tasks.all]
|
[tasks.all]
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
use {std::error::Error, vergen::EmitBuilder};
|
use std::error::Error;
|
||||||
|
|
||||||
|
use vergen::EmitBuilder;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
EmitBuilder::builder()
|
EmitBuilder::builder()
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::fmt::Write;
|
||||||
|
|
||||||
use clap::{builder::Str, Parser};
|
use clap::{builder::Str, Parser};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -18,8 +20,10 @@ impl From<Version> for Str {
|
|||||||
("Cargo Target Triple", env!("VERGEN_CARGO_TARGET_TRIPLE")),
|
("Cargo Target Triple", env!("VERGEN_CARGO_TARGET_TRIPLE")),
|
||||||
]
|
]
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(k, v)| format!("{k:25}: {v}\n"))
|
.fold(String::new(), |mut output, (k, v)| {
|
||||||
.collect::<String>();
|
writeln!(output, "{k:25}: {v}").unwrap();
|
||||||
|
output
|
||||||
|
});
|
||||||
|
|
||||||
format!("\n{version:}").into()
|
format!("\n{version:}").into()
|
||||||
}
|
}
|
@ -1,10 +1,10 @@
|
|||||||
mod args;
|
mod args;
|
||||||
|
|
||||||
use {
|
use std::{thread::sleep, time::Duration};
|
||||||
crate::args::Args,
|
|
||||||
clap::Parser,
|
use clap::Parser;
|
||||||
std::{thread::sleep, time::Duration},
|
|
||||||
};
|
use crate::args::Args;
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
extern "C" fn run_test(num: usize) {
|
extern "C" fn run_test(num: usize) {
|
@ -1,4 +1,6 @@
|
|||||||
use {std::error::Error, vergen::EmitBuilder};
|
use std::error::Error;
|
||||||
|
|
||||||
|
use vergen::EmitBuilder;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
EmitBuilder::builder()
|
EmitBuilder::builder()
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use {clap::ValueEnum, simplelog::LevelFilter};
|
use clap::ValueEnum;
|
||||||
|
use simplelog::LevelFilter;
|
||||||
|
|
||||||
#[derive(ValueEnum, Debug, Clone, Copy)]
|
#[derive(ValueEnum, Debug, Clone, Copy)]
|
||||||
pub enum Level {
|
pub enum Level {
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
pub mod level;
|
pub mod level;
|
||||||
mod version;
|
mod version;
|
||||||
|
|
||||||
use {
|
use std::iter;
|
||||||
crate::args::{level::Level, version::Version},
|
|
||||||
clap::Parser,
|
use clap::Parser;
|
||||||
std::iter,
|
|
||||||
};
|
use crate::args::{level::Level, version::Version};
|
||||||
|
|
||||||
pub trait ParentArgs {
|
pub trait ParentArgs {
|
||||||
fn port(&self) -> u16;
|
fn port(&self) -> u16;
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::fmt::Write;
|
||||||
|
|
||||||
use clap::builder::Str;
|
use clap::builder::Str;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -18,8 +20,10 @@ impl From<Version> for Str {
|
|||||||
("Cargo Target Triple", env!("VERGEN_CARGO_TARGET_TRIPLE")),
|
("Cargo Target Triple", env!("VERGEN_CARGO_TARGET_TRIPLE")),
|
||||||
]
|
]
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(k, v)| format!("{k:25}: {v}\n"))
|
.fold(String::new(), |mut output, (k, v)| {
|
||||||
.collect::<String>();
|
writeln!(output, "{k:25}: {v}").unwrap();
|
||||||
|
output
|
||||||
|
});
|
||||||
|
|
||||||
format!("\n{version:}").into()
|
format!("\n{version:}").into()
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
use {
|
use std::{
|
||||||
crate::{args::ChildArgs, exit::Exit},
|
ffi::CString,
|
||||||
anyhow::{anyhow, Result},
|
os::fd::{AsRawFd, RawFd},
|
||||||
nix::unistd::{dup2, execvp},
|
|
||||||
std::ffi::CString,
|
|
||||||
std::os::fd::{AsRawFd, RawFd},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
use nix::unistd::{dup2, execvp};
|
||||||
|
|
||||||
|
use crate::{args::ChildArgs, exit::Exit};
|
||||||
|
|
||||||
pub struct Child {
|
pub struct Child {
|
||||||
argv: Vec<String>,
|
argv: Vec<String>,
|
||||||
fd1: RawFd,
|
fd1: RawFd,
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
use {
|
use anyhow::{anyhow, Result};
|
||||||
crate::errno::errno,
|
use libc::{_exit, prctl, PR_SET_PDEATHSIG};
|
||||||
anyhow::{anyhow, Result},
|
use nix::{
|
||||||
libc::{_exit, prctl, PR_SET_PDEATHSIG},
|
sys::{
|
||||||
nix::sys::signal::SIGKILL,
|
signal::{sigaction, SaFlags, SigAction, SigHandler, SigSet, SIGCHLD, SIGKILL},
|
||||||
nix::{
|
wait::{waitpid, WaitStatus::Exited},
|
||||||
sys::{
|
|
||||||
signal::{sigaction, SaFlags, SigAction, SigHandler, SigSet, SIGCHLD},
|
|
||||||
wait::{waitpid, WaitStatus::Exited},
|
|
||||||
},
|
|
||||||
unistd::Pid,
|
|
||||||
},
|
},
|
||||||
|
unistd::Pid,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use crate::errno::errno;
|
||||||
|
|
||||||
pub struct Exit;
|
pub struct Exit;
|
||||||
|
|
||||||
impl Exit {
|
impl Exit {
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
use {
|
use std::fs::File;
|
||||||
crate::args::LogArgs,
|
|
||||||
anyhow::{anyhow, Result},
|
use anyhow::{anyhow, Result};
|
||||||
simplelog::{Config, LevelFilter, WriteLogger},
|
use simplelog::{Config, LevelFilter, WriteLogger};
|
||||||
std::fs::File,
|
|
||||||
};
|
use crate::args::LogArgs;
|
||||||
|
|
||||||
pub struct Logger;
|
pub struct Logger;
|
||||||
|
|
||||||
|
@ -9,12 +9,13 @@ mod parent;
|
|||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate simplelog;
|
extern crate simplelog;
|
||||||
|
|
||||||
use {
|
use std::os::fd::AsRawFd;
|
||||||
crate::{args::Args, child::Child, exit::Exit, logger::Logger, parent::Parent},
|
|
||||||
anyhow::{anyhow, Result},
|
use anyhow::{anyhow, Result};
|
||||||
clap::Parser,
|
use clap::Parser;
|
||||||
nix::unistd::{fork, pipe, ForkResult},
|
use nix::unistd::{fork, pipe, ForkResult};
|
||||||
};
|
|
||||||
|
use crate::{args::Args, child::Child, exit::Exit, logger::Logger, parent::Parent};
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
@ -30,8 +31,10 @@ fn main() -> Result<()> {
|
|||||||
let (a2, b2) = pipe().map_err(|e| anyhow!("Failed to create pipe #2: {e:}"))?;
|
let (a2, b2) = pipe().map_err(|e| anyhow!("Failed to create pipe #2: {e:}"))?;
|
||||||
|
|
||||||
match unsafe { fork() } {
|
match unsafe { fork() } {
|
||||||
Ok(ForkResult::Parent { child: _, .. }) => Parent::new(&args, a1, a2).run()?,
|
Ok(ForkResult::Parent { child: _, .. }) => {
|
||||||
Ok(ForkResult::Child) => Child::new(&args, b1, b2).run()?,
|
Parent::new(&args, a1.as_raw_fd(), a2.as_raw_fd()).run()?
|
||||||
|
}
|
||||||
|
Ok(ForkResult::Child) => Child::new(&args, b1.as_raw_fd(), b2.as_raw_fd()).run()?,
|
||||||
Err(e) => Err(anyhow!("main: fork failed: {e:}"))?,
|
Err(e) => Err(anyhow!("main: fork failed: {e:}"))?,
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
use {
|
use std::{
|
||||||
crate::{args::ParentArgs, exit::Exit},
|
fmt,
|
||||||
anyhow::{anyhow, Result},
|
io::{Read, Write},
|
||||||
nix::unistd::read,
|
net::{SocketAddr, TcpStream},
|
||||||
std::{
|
os::fd::RawFd,
|
||||||
fmt,
|
thread::spawn,
|
||||||
io::{Read, Write},
|
time::{Duration, SystemTime},
|
||||||
net::{SocketAddr, TcpStream},
|
|
||||||
os::fd::RawFd,
|
|
||||||
thread::spawn,
|
|
||||||
time::{Duration, SystemTime},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use anyhow::{anyhow, Result};
|
||||||
|
use nix::unistd::read;
|
||||||
|
|
||||||
|
use crate::{args::ParentArgs, exit::Exit};
|
||||||
|
|
||||||
enum Direction {
|
enum Direction {
|
||||||
GdbToTarget,
|
GdbToTarget,
|
||||||
TargetToGdb,
|
TargetToGdb,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user