Fix gdb-qemu (#2773)

Co-authored-by: WorksButNotTested
This commit is contained in:
WorksButNotTested 2024-12-17 10:34:26 +00:00 committed by GitHub
parent 61e3f0b3a4
commit f9b643e7b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 82 additions and 66 deletions

View File

@ -1,3 +1,3 @@
[workspace] [workspace]
resolver = "2" resolver = "2"
members = ["gdb_qemu", "demo"] members = ["gdb_qemu", "gdb_demo"]

View File

@ -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]

View File

@ -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()

View File

@ -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()
} }

View File

@ -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) {

View File

@ -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()

View File

@ -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 {

View File

@ -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;

View File

@ -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()
} }

View File

@ -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,

View File

@ -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 {

View File

@ -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;

View File

@ -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(())

View File

@ -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,