Skip to content

Commit f67b03a

Browse files
committed
refactor: gate x86_64-specific code in hyperlight-guest-bin
- Gate paging and exception modules on target_arch = x86_64 - Gate ProfiledLockedHeap (uses x86 out asm) on x86_64 - Skip musl/printf C compilation in build.rs on non-x86_64 Signed-off-by: Ludvig Liljenberg <4257730+ludfjig@users.noreply.github.com>
1 parent cd1e034 commit f67b03a

File tree

2 files changed

+79
-69
lines changed

2 files changed

+79
-69
lines changed

src/hyperlight_guest_bin/build.rs

Lines changed: 71 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -42,85 +42,93 @@ fn copy_includes<P: AsRef<Path>, Q: AsRef<Path> + std::fmt::Debug>(include_dir:
4242
fn cargo_main() {
4343
println!("cargo:rerun-if-changed=third_party");
4444

45-
let mut cfg = cc::Build::new();
45+
let target = env::var("TARGET").expect("cargo TARGET not set");
46+
let is_x86_64 = target.starts_with("x86_64");
4647

47-
if cfg!(feature = "printf") {
48-
cfg.include("third_party/printf")
49-
.file("third_party/printf/printf.c");
50-
}
48+
// Skip C/musl compilation on aarch64 since no musl support yet
49+
if is_x86_64 {
50+
let mut cfg = cc::Build::new();
51+
52+
if cfg!(feature = "printf") {
53+
cfg.include("third_party/printf")
54+
.file("third_party/printf/printf.c");
55+
}
5156

52-
if cfg!(feature = "libc") {
53-
let entries = glob::glob("third_party/musl/**/*.[cs]") // .c and .s files
54-
.expect("glob pattern should be valid")
55-
.filter_map(Result::ok);
56-
cfg.files(entries);
57+
if cfg!(feature = "libc") {
58+
let entries = glob::glob("third_party/musl/**/*.[cs]") // .c and .s files
59+
.expect("glob pattern should be valid")
60+
.filter_map(Result::ok);
61+
cfg.files(entries);
5762

58-
cfg.include("third_party/musl/src/include")
59-
.include("third_party/musl/include")
60-
.include("third_party/musl/src/internal")
61-
.include("third_party/musl/arch/generic")
62-
.include("third_party/musl/arch/x86_64");
63-
}
63+
cfg.include("third_party/musl/src/include")
64+
.include("third_party/musl/include")
65+
.include("third_party/musl/src/internal")
66+
.include("third_party/musl/arch/generic")
67+
.include("third_party/musl/arch/x86_64");
68+
}
6469

65-
if cfg!(any(feature = "printf", feature = "libc")) {
66-
cfg.define("HYPERLIGHT", None); // used in certain musl files for conditional compilation
70+
if cfg!(any(feature = "printf", feature = "libc")) {
71+
cfg.define("HYPERLIGHT", None); // used in certain musl files for conditional compilation
6772

68-
// silence compiler warnings
69-
cfg.flag("-Wno-unused-command-line-argument") // including .s files makes clang believe arguments are unused
70-
.flag("-Wno-sign-compare")
71-
.flag("-Wno-bitwise-op-parentheses")
72-
.flag("-Wno-unknown-pragmas")
73-
.flag("-Wno-shift-op-parentheses")
74-
.flag("-Wno-logical-op-parentheses")
75-
.flag("-Wno-unused-but-set-variable")
76-
.flag("-Wno-unused-parameter")
77-
.flag("-Wno-string-plus-int");
73+
// silence compiler warnings
74+
cfg.flag("-Wno-unused-command-line-argument") // including .s files makes clang believe arguments are unused
75+
.flag("-Wno-sign-compare")
76+
.flag("-Wno-bitwise-op-parentheses")
77+
.flag("-Wno-unknown-pragmas")
78+
.flag("-Wno-shift-op-parentheses")
79+
.flag("-Wno-logical-op-parentheses")
80+
.flag("-Wno-unused-but-set-variable")
81+
.flag("-Wno-unused-parameter")
82+
.flag("-Wno-string-plus-int");
7883

79-
cfg.flag("-fPIC");
80-
// This is a terrible hack, because
81-
// - we need stack clash protection, because we have put the
82-
// stack right smack in the middle of everything in the guest
83-
// - clang refuses to do stack clash protection unless it is
84-
// required by a target ABI (Windows, MacOS) or the target is
85-
// is Linux or FreeBSD (see Clang.cpp RenderSCPOptions
86-
// https://github.com/llvm/llvm-project/blob/1bb52e9/clang/lib/Driver/ToolChains/Clang.cpp#L3724).
87-
// Hopefully a flag to force stack clash protection on generic
88-
// targets will eventually show up.
89-
cfg.flag("--target=x86_64-unknown-linux-none");
84+
cfg.flag("-fPIC");
85+
// This is a terrible hack, because
86+
// - we need stack clash protection, because we have put the
87+
// stack right smack in the middle of everything in the guest
88+
// - clang refuses to do stack clash protection unless it is
89+
// required by a target ABI (Windows, MacOS) or the target is
90+
// is Linux or FreeBSD (see Clang.cpp RenderSCPOptions
91+
// https://github.com/llvm/llvm-project/blob/1bb52e9/clang/lib/Driver/ToolChains/Clang.cpp#L3724).
92+
// Hopefully a flag to force stack clash protection on generic
93+
// targets will eventually show up.
94+
cfg.flag("--target=x86_64-unknown-linux-none");
9095

91-
// We don't use a different stack for all interrupts, so there
92-
// can be no red zone
93-
cfg.flag("-mno-red-zone");
96+
// We don't use a different stack for all interrupts, so there
97+
// can be no red zone
98+
cfg.flag("-mno-red-zone");
9499

95-
// We don't support stack protectors at the moment, but Arch Linux clang
96-
// auto-enables them for -linux platforms, so explicitly disable them.
97-
cfg.flag("-fno-stack-protector");
98-
cfg.flag("-fstack-clash-protection");
99-
cfg.flag("-mstack-probe-size=4096");
100-
cfg.compiler(
101-
env::var("HYPERLIGHT_GUEST_clang")
102-
.as_deref()
103-
.unwrap_or("clang"),
104-
);
100+
// We don't support stack protectors at the moment, but Arch Linux clang
101+
// auto-enables them for -linux platforms, so explicitly disable them.
102+
cfg.flag("-fno-stack-protector");
103+
cfg.flag("-fstack-clash-protection");
104+
cfg.flag("-mstack-probe-size=4096");
105+
cfg.compiler(
106+
env::var("HYPERLIGHT_GUEST_clang")
107+
.as_deref()
108+
.unwrap_or("clang"),
109+
);
105110

106-
if cfg!(windows) {
107-
unsafe { env::set_var("AR_x86_64_unknown_none", "llvm-ar") };
111+
if cfg!(windows) {
112+
unsafe { env::set_var("AR_x86_64_unknown_none", "llvm-ar") };
113+
}
114+
cfg.compile("hyperlight_guest_bin");
108115
}
109-
cfg.compile("hyperlight_guest_bin");
110116
}
111117

112118
let out_dir = env::var("OUT_DIR").expect("cargo OUT_DIR not set");
113119
let include_dir = PathBuf::from(&out_dir).join("include");
114120
fs::create_dir_all(&include_dir)
115121
.unwrap_or_else(|e| panic!("Could not create include dir {:?}: {}", &include_dir, e));
116-
if cfg!(feature = "printf") {
117-
copy_includes(&include_dir, "third_party/printf/");
118-
}
119-
if cfg!(feature = "libc") {
120-
copy_includes(&include_dir, "third_party/musl/include");
121-
copy_includes(&include_dir, "third_party/musl/arch/generic");
122-
copy_includes(&include_dir, "third_party/musl/arch/x86_64");
123-
copy_includes(&include_dir, "third_party/musl/src/internal");
122+
if is_x86_64 {
123+
if cfg!(feature = "printf") {
124+
copy_includes(&include_dir, "third_party/printf/");
125+
}
126+
if cfg!(feature = "libc") {
127+
copy_includes(&include_dir, "third_party/musl/include");
128+
copy_includes(&include_dir, "third_party/musl/arch/generic");
129+
copy_includes(&include_dir, "third_party/musl/arch/x86_64");
130+
copy_includes(&include_dir, "third_party/musl/src/internal");
131+
}
124132
}
125133
/* do not canonicalize: clang has trouble with UNC paths */
126134
let include_str = include_dir

src/hyperlight_guest_bin/src/lib.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use hyperlight_guest::guest_handle::handle::GuestHandle;
3434

3535
// === Modules ===
3636
#[cfg_attr(target_arch = "x86_64", path = "arch/amd64/mod.rs")]
37+
#[cfg_attr(target_arch = "aarch64", path = "arch/aarch64/mod.rs")]
3738
mod arch;
3839
// temporarily expose the architecture-specific exception interface;
3940
// this should be replaced with something a bit more abstract in the
@@ -49,12 +50,13 @@ pub mod guest_function {
4950
pub mod guest_logger;
5051
pub mod host_comm;
5152
pub mod memory;
53+
#[cfg(target_arch = "x86_64")]
5254
pub mod paging;
5355

5456
// Globals
55-
#[cfg(feature = "mem_profile")]
57+
#[cfg(all(feature = "mem_profile", target_arch = "x86_64"))]
5658
struct ProfiledLockedHeap<const ORDER: usize>(LockedHeap<ORDER>);
57-
#[cfg(feature = "mem_profile")]
59+
#[cfg(all(feature = "mem_profile", target_arch = "x86_64"))]
5860
unsafe impl<const ORDER: usize> alloc::alloc::GlobalAlloc for ProfiledLockedHeap<ORDER> {
5961
unsafe fn alloc(&self, layout: core::alloc::Layout) -> *mut u8 {
6062
let addr = unsafe { self.0.alloc(layout) };
@@ -107,10 +109,10 @@ unsafe impl<const ORDER: usize> alloc::alloc::GlobalAlloc for ProfiledLockedHeap
107109
}
108110

109111
// === Globals ===
110-
#[cfg(not(feature = "mem_profile"))]
112+
#[cfg(not(all(feature = "mem_profile", target_arch = "x86_64")))]
111113
#[global_allocator]
112114
pub(crate) static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::empty();
113-
#[cfg(feature = "mem_profile")]
115+
#[cfg(all(feature = "mem_profile", target_arch = "x86_64"))]
114116
#[global_allocator]
115117
pub(crate) static HEAP_ALLOCATOR: ProfiledLockedHeap<32> =
116118
ProfiledLockedHeap(LockedHeap::<32>::empty());
@@ -191,9 +193,9 @@ pub(crate) extern "C" fn generic_init(
191193

192194
let heap_start = (*peb_ptr).guest_heap.ptr as usize;
193195
let heap_size = (*peb_ptr).guest_heap.size as usize;
194-
#[cfg(not(feature = "mem_profile"))]
196+
#[cfg(not(all(feature = "mem_profile", target_arch = "x86_64")))]
195197
let heap_allocator = &HEAP_ALLOCATOR;
196-
#[cfg(feature = "mem_profile")]
198+
#[cfg(all(feature = "mem_profile", target_arch = "x86_64"))]
197199
let heap_allocator = &HEAP_ALLOCATOR.0;
198200
heap_allocator
199201
.try_lock()

0 commit comments

Comments
 (0)