Gone with x86_64-custom

This commit is contained in:
Zhang Junyang
2024-02-27 20:28:43 +08:00
committed by Tate, Hongliang Tian
parent e3c227ae06
commit 7eac2772d0
18 changed files with 64 additions and 147 deletions

View File

@ -1,23 +0,0 @@
name: Cargo check
on:
pull_request:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 10
container: asterinas/asterinas:0.3.1
steps:
- run: echo "Running in asterinas/asterinas:0.3.1"
- uses: actions/checkout@v3
- run: make install_osdk
- name: Check
id: check
run: make check

View File

@ -1,29 +0,0 @@
name: Unit test
on:
pull_request:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 15
container: asterinas/asterinas:0.3.1
steps:
- run: echo "Running in asterinas/asterinas:0.3.1"
- uses: actions/checkout@v3
- run: make install_osdk
- name: Usermode Unit test
id: usermode_unit_test
run: make test
- name: Ktest Unit Test
id: ktest_unit_test
run: make update_initramfs && make ktest
# TODO: add component check.

View File

@ -1,5 +1,5 @@
[workspace] [workspace]
resolver = "2"
members = [ members = [
"framework/aster-frame", "framework/aster-frame",
"framework/libs/align_ext", "framework/libs/align_ext",
@ -28,7 +28,6 @@ members = [
"kernel/libs/typeflags", "kernel/libs/typeflags",
"kernel/libs/typeflags-util", "kernel/libs/typeflags-util",
] ]
exclude = [ exclude = [
"osdk", "osdk",
"target/osdk/base", "target/osdk/base",

View File

@ -125,10 +125,10 @@ docs:
@cd docs && mdbook build # Build mdBook @cd docs && mdbook build # Build mdBook
format: format:
./tools/format_all.sh @./tools/format_all.sh
check: check:
./tools/format_all.sh --check # Check Rust format issues @./tools/format_all.sh --check # Check Rust format issues
@cargo osdk clippy @cargo osdk clippy
clean: clean:

View File

@ -29,7 +29,7 @@ trapframe = { git = "https://github.com/asterinas/trapframe-rs", rev = "2f37590"
unwinding = { version = "0.2.1", default-features = false, features = ["fde-static", "hide-trace", "panic", "personality", "unwinder"] } unwinding = { version = "0.2.1", default-features = false, features = ["fde-static", "hide-trace", "panic", "personality", "unwinder"] }
volatile = { version = "0.4.5", features = ["unstable"] } volatile = { version = "0.4.5", features = ["unstable"] }
[target.x86_64-custom.dependencies] [target.x86_64-unknown-none.dependencies]
x86_64 = "0.14.2" x86_64 = "0.14.2"
x86 = "0.52.0" x86 = "0.52.0"
acpi = "4.1.1" acpi = "4.1.1"

View File

@ -13,17 +13,5 @@ x86_64 = "0.14.2"
aster-time = { path = "comps/time" } aster-time = { path = "comps/time" }
aster-framebuffer = { path = "comps/framebuffer" } aster-framebuffer = { path = "comps/framebuffer" }
[profile.dev]
opt-level = 0
debug = true
lto = false
panic = "unwind"
[profile.release]
opt-level = 3
debug = false
lto = false
panic = "unwind"
[features] [features]
intel_tdx = ["aster-frame/intel_tdx", "aster-nix/intel_tdx"] intel_tdx = ["aster-frame/intel_tdx", "aster-nix/intel_tdx"]

View File

@ -28,7 +28,7 @@ pub fn controlled(
item: proc_macro::TokenStream, item: proc_macro::TokenStream,
) -> proc_macro::TokenStream { ) -> proc_macro::TokenStream {
let attr = attr.to_string(); let attr = attr.to_string();
if attr.len() != 0 { if !attr.is_empty() {
panic!("controlled cannot accept inner tokens.") panic!("controlled cannot accept inner tokens.")
} }
let mut tokens: proc_macro::TokenStream = quote!( let mut tokens: proc_macro::TokenStream = quote!(
@ -45,7 +45,7 @@ pub fn uncontrolled(
item: proc_macro::TokenStream, item: proc_macro::TokenStream,
) -> proc_macro::TokenStream { ) -> proc_macro::TokenStream {
let attr = attr.to_string(); let attr = attr.to_string();
if attr.len() != 0 { if !attr.is_empty() {
panic!("uncontrolled cannot accept inner tokens.") panic!("uncontrolled cannot accept inner tokens.")
} }
let mut tokens: proc_macro::TokenStream = quote!( let mut tokens: proc_macro::TokenStream = quote!(

2
osdk/Cargo.lock generated
View File

@ -128,7 +128,7 @@ dependencies = [
[[package]] [[package]]
name = "cargo-osdk" name = "cargo-osdk"
version = "0.2.0" version = "0.4.0"
dependencies = [ dependencies = [
"assert_cmd", "assert_cmd",
"clap", "clap",

View File

@ -4,13 +4,20 @@
//! It will depend on the kernel crate. //! It will depend on the kernel crate.
//! //!
use std::{fs, path::Path, str::FromStr}; use std::{fs, path::{Path, PathBuf}, str::FromStr};
use crate::util::get_cargo_metadata;
pub fn new_base_crate( pub fn new_base_crate(
base_crate_path: impl AsRef<Path>, base_crate_path: impl AsRef<Path>,
dep_crate_name: &str, dep_crate_name: &str,
dep_crate_path: impl AsRef<Path>, dep_crate_path: impl AsRef<Path>,
) { ) {
let workspace_root = {
let meta = get_cargo_metadata(None::<&str>, None::<&[&str]>).unwrap();
PathBuf::from(meta.get("workspace_root").unwrap().as_str().unwrap())
};
if base_crate_path.as_ref().exists() { if base_crate_path.as_ref().exists() {
std::fs::remove_dir_all(&base_crate_path).unwrap(); std::fs::remove_dir_all(&base_crate_path).unwrap();
} }
@ -47,12 +54,8 @@ pub fn new_base_crate(
std::env::set_current_dir(&base_crate_path).unwrap(); std::env::set_current_dir(&base_crate_path).unwrap();
// Add linker.ld file // Add linker.ld file
let linker_ld = include_str!("x86_64-custom.ld.template"); let linker_ld = include_str!("x86_64.ld.template");
fs::write("x86_64-custom.ld", linker_ld).unwrap(); fs::write("x86_64.ld", linker_ld).unwrap();
// Add target json file
let target_json = include_str!("x86_64-custom.json.template");
fs::write("x86_64-custom.json", target_json).unwrap();
// Overrite the main.rs file // Overrite the main.rs file
let main_rs = include_str!("main.rs.template"); let main_rs = include_str!("main.rs.template");
@ -64,7 +67,7 @@ pub fn new_base_crate(
add_manifest_dependency(dep_crate_name, dep_crate_path); add_manifest_dependency(dep_crate_name, dep_crate_path);
// Copy the manifest configurations from the target crate to the base crate // Copy the manifest configurations from the target crate to the base crate
copy_manifest_configurations(base_crate_path); copy_profile_configurations(workspace_root);
// Get back to the original directory // Get back to the original directory
std::env::set_current_dir(original_dir).unwrap(); std::env::set_current_dir(original_dir).unwrap();
@ -100,8 +103,8 @@ fn add_manifest_dependency(crate_name: &str, crate_path: impl AsRef<Path>) {
fs::write(mainfest_path, content).unwrap(); fs::write(mainfest_path, content).unwrap();
} }
fn copy_manifest_configurations(target_crate_path: impl AsRef<Path>) { fn copy_profile_configurations(workspace_root: impl AsRef<Path>) {
let target_manifest_path = target_crate_path.as_ref().join("Cargo.toml"); let target_manifest_path = workspace_root.as_ref().join("Cargo.toml");
let manifest_path = "Cargo.toml"; let manifest_path = "Cargo.toml";
let target_manifest: toml::Table = { let target_manifest: toml::Table = {

View File

@ -1,21 +0,0 @@
{
"llvm-target": "x86_64-unknown-none",
"data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128",
"code-model": "kernel",
"cpu": "x86-64",
"arch": "x86_64",
"target-endian": "little",
"target-pointer-width": "64",
"target-c-int-width": "32",
"os": "none",
"executables": true,
"linker-flavor": "ld.lld",
"linker": "rust-lld",
"pre-link-args": {
"ld.lld": [
"--script=x86_64-custom.ld"
]
},
"disable-redzone": true,
"features": "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float"
}

View File

@ -3,11 +3,7 @@
mod bin; mod bin;
mod grub; mod grub;
use std::{ use std::{path::Path, process};
path::{Path, PathBuf},
process,
str::FromStr,
};
use bin::strip_elf_for_qemu; use bin::strip_elf_for_qemu;
@ -40,6 +36,7 @@ pub fn execute_build_command(config: &BuildConfig) {
&osdk_target_directory, &osdk_target_directory,
&ws_target_directory, &ws_target_directory,
config, config,
&[],
); );
} }
@ -48,6 +45,7 @@ pub fn create_base_and_build(
osdk_target_directory: impl AsRef<Path>, osdk_target_directory: impl AsRef<Path>,
cargo_target_directory: impl AsRef<Path>, cargo_target_directory: impl AsRef<Path>,
config: &BuildConfig, config: &BuildConfig,
rustflags: &[&str],
) -> Bundle { ) -> Bundle {
let base_crate_path = osdk_target_directory.as_ref().join("base"); let base_crate_path = osdk_target_directory.as_ref().join("base");
new_base_crate( new_base_crate(
@ -62,6 +60,7 @@ pub fn create_base_and_build(
&osdk_target_directory, &osdk_target_directory,
&cargo_target_directory, &cargo_target_directory,
config, config,
rustflags,
); );
std::env::set_current_dir(original_dir).unwrap(); std::env::set_current_dir(original_dir).unwrap();
bundle bundle
@ -72,6 +71,7 @@ pub fn do_build(
osdk_target_directory: impl AsRef<Path>, osdk_target_directory: impl AsRef<Path>,
cargo_target_directory: impl AsRef<Path>, cargo_target_directory: impl AsRef<Path>,
config: &BuildConfig, config: &BuildConfig,
rustflags: &[&str],
) -> Bundle { ) -> Bundle {
if bundle_path.as_ref().exists() { if bundle_path.as_ref().exists() {
std::fs::remove_dir_all(&bundle_path).unwrap(); std::fs::remove_dir_all(&bundle_path).unwrap();
@ -93,7 +93,7 @@ pub fn do_build(
}; };
info!("Building kernel ELF"); info!("Building kernel ELF");
let aster_elf = build_kernel_elf(&config.cargo_args, &cargo_target_directory); let aster_elf = build_kernel_elf(&config.cargo_args, &cargo_target_directory, rustflags);
if matches!(config.manifest.qemu.machine, QemuMachine::Microvm) { if matches!(config.manifest.qemu.machine, QemuMachine::Microvm) {
let stripped_elf = strip_elf_for_qemu(&osdk_target_directory, &aster_elf); let stripped_elf = strip_elf_for_qemu(&osdk_target_directory, &aster_elf);
@ -117,13 +117,25 @@ pub fn do_build(
bundle bundle
} }
fn build_kernel_elf(args: &CargoArgs, cargo_target_directory: impl AsRef<Path>) -> AsterBin { fn build_kernel_elf(args: &CargoArgs, cargo_target_directory: impl AsRef<Path>, rustflags: &[&str]) -> AsterBin {
let target_json_path = PathBuf::from_str("x86_64-custom.json").unwrap(); let target = "x86_64-unknown-none";
let env_rustflags = std::env::var("RUSTFLAGS").unwrap_or_default();
let mut rustflags = Vec::from(rustflags);
// We disable RELRO and PIC here because they cause link failures
rustflags.extend(vec![
&env_rustflags,
"-C link-arg=-Tx86_64.ld",
"-C code-model=kernel",
"-C relocation-model=static",
"-Z relro-level=off",
]);
let mut command = cargo(); let mut command = cargo();
command.env_remove("RUSTUP_TOOLCHAIN"); command.env_remove("RUSTUP_TOOLCHAIN");
command.env("RUSTFLAGS", rustflags.join(" "));
command.arg("build"); command.arg("build");
command.arg("--target").arg(&target_json_path); command.arg("--target").arg(target);
command command
.arg("--target-dir") .arg("--target-dir")
.arg(cargo_target_directory.as_ref()); .arg(cargo_target_directory.as_ref());
@ -135,9 +147,7 @@ fn build_kernel_elf(args: &CargoArgs, cargo_target_directory: impl AsRef<Path>)
process::exit(Errno::ExecuteCommand as _); process::exit(Errno::ExecuteCommand as _);
} }
let aster_bin_path = cargo_target_directory let aster_bin_path = cargo_target_directory.as_ref().join(target);
.as_ref()
.join(target_json_path.file_stem().unwrap().to_str().unwrap());
let aster_bin_path = if args.profile == "dev" { let aster_bin_path = if args.profile == "dev" {
aster_bin_path.join("debug") aster_bin_path.join("debug")
} else { } else {

View File

@ -3,13 +3,14 @@
use std::process; use std::process;
use super::util::{cargo, COMMON_CARGO_ARGS}; use super::util::{cargo, COMMON_CARGO_ARGS};
use crate::{commands::util::create_target_json, error::Errno, error_msg}; use crate::{error::Errno, error_msg};
pub fn execute_check_command() { pub fn execute_check_command() {
let target_json_path = create_target_json();
let mut command = cargo(); let mut command = cargo();
command.arg("check").arg("--target").arg(target_json_path); command
.arg("check")
.arg("--target")
.arg("x86_64-unkown-none");
command.args(COMMON_CARGO_ARGS); command.args(COMMON_CARGO_ARGS);
let status = command.status().unwrap(); let status = command.status().unwrap();
if !status.success() { if !status.success() {

View File

@ -3,13 +3,16 @@
use std::process; use std::process;
use super::util::{cargo, COMMON_CARGO_ARGS}; use super::util::{cargo, COMMON_CARGO_ARGS};
use crate::{commands::util::create_target_json, error::Errno, error_msg}; use crate::{error::Errno, error_msg};
pub fn execute_clippy_command() { pub fn execute_clippy_command() {
let target_json_path = create_target_json();
let mut command = cargo(); let mut command = cargo();
command.arg("clippy").arg("-h"); command
.arg("clippy")
.arg("-h")
.arg("--target")
.arg("x86_64-unknown-none")
.args(COMMON_CARGO_ARGS);
info!("Running `cargo clippy -h`"); info!("Running `cargo clippy -h`");
let output = command.output().unwrap(); let output = command.output().unwrap();
if !output.status.success() { if !output.status.success() {
@ -20,8 +23,11 @@ pub fn execute_clippy_command() {
} }
let mut command = cargo(); let mut command = cargo();
command.arg("clippy").arg("--target").arg(target_json_path); command
command.args(COMMON_CARGO_ARGS); .arg("clippy")
.arg("--target")
.arg("x86_64-unknown-none")
.args(COMMON_CARGO_ARGS);
// TODO: Add support for custom clippy args using OSDK commandline rather than hardcode it. // TODO: Add support for custom clippy args using OSDK commandline rather than hardcode it.
command.args(["--", "-D", "warnings"]); command.args(["--", "-D", "warnings"]);
let status = command.status().unwrap(); let status = command.status().unwrap();

View File

@ -50,6 +50,7 @@ pub fn execute_run_command(config: &RunConfig) {
&osdk_target_directory, &osdk_target_directory,
&ws_target_directory, &ws_target_directory,
&required_build_config, &required_build_config,
&[],
); );
bundle.run(config); bundle.run(config);

View File

@ -52,13 +52,12 @@ pub static KTEST_CRATE_WHITELIST: Option<&[&str]> = Some(&{:#?});
}; };
let original_dir = std::env::current_dir().unwrap(); let original_dir = std::env::current_dir().unwrap();
std::env::set_current_dir(&target_crate_dir).unwrap(); std::env::set_current_dir(&target_crate_dir).unwrap();
// Add `--cfg ktest` to RUSTFLAGS
std::env::set_var("RUSTFLAGS", "--cfg ktest");
let bundle = do_build( let bundle = do_build(
default_bundle_directory, default_bundle_directory,
&osdk_target_directory, &osdk_target_directory,
&ws_target_directory, &ws_target_directory,
&required_build_config, &required_build_config,
&["--cfg ktest", "-C panic=unwind"],
); );
std::env::remove_var("RUSTFLAGS"); std::env::remove_var("RUSTFLAGS");
std::env::set_current_dir(original_dir).unwrap(); std::env::set_current_dir(original_dir).unwrap();

View File

@ -1,8 +1,6 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
use std::{fs, path::PathBuf, process::Command}; use std::process::Command;
use crate::util::get_target_directory;
pub const COMMON_CARGO_ARGS: &[&str] = &[ pub const COMMON_CARGO_ARGS: &[&str] = &[
"-Zbuild-std=core,alloc,compiler_builtins", "-Zbuild-std=core,alloc,compiler_builtins",
@ -14,18 +12,3 @@ pub const DEFAULT_TARGET_RELPATH: &str = "osdk";
pub fn cargo() -> Command { pub fn cargo() -> Command {
Command::new("cargo") Command::new("cargo")
} }
pub fn create_target_json() -> PathBuf {
let target_osdk_dir = get_target_directory().join(DEFAULT_TARGET_RELPATH);
fs::create_dir_all(&target_osdk_dir).unwrap();
let target_json_path = target_osdk_dir.join("x86_64-custom.json");
if target_json_path.is_file() {
return target_json_path;
}
let contents = include_str!("../base_crate/x86_64-custom.json.template");
fs::write(&target_json_path, contents).unwrap();
target_json_path
}

View File

@ -221,6 +221,7 @@ FROM rust
RUN apt update && apt-get install -y --no-install-recommends \ RUN apt update && apt-get install -y --no-install-recommends \
cpio \ cpio \
cpuid \ cpuid \
exfatprogs \
file \ file \
gdb \ gdb \
grub-efi-amd64 \ grub-efi-amd64 \
@ -237,8 +238,7 @@ RUN apt update && apt-get install -y --no-install-recommends \
unzip \ unzip \
vim \ vim \
xorriso \ xorriso \
zip \ zip
exfatprogs
# Clean apt cache # Clean apt cache
RUN apt clean && rm -rf /var/lib/apt/lists/* RUN apt clean && rm -rf /var/lib/apt/lists/*