Skip to content

Commit 78256e0

Browse files
committed
tmp (x3)
Signed-off-by: danbugs <[email protected]>
1 parent cd7e211 commit 78256e0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+5445
-4523
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ exclude = [
2121
"src/tests/rust_guests/callbackguest",
2222
"src/tests/rust_guests/dummyguest",
2323
"src/tests/rust_guests/simpleguest",
24-
# Note: This is a temporary guest to test
24+
# TODO(danbugs:297): This is a temporary guest to test
2525
# the new memory layout. Once I'm done w/
2626
# the work, I'll delete it. `simpleguest`
2727
# and `callbackguest` will be demonstrative

Justfile

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ default-target := "debug"
1414
simpleguest_source := "src/tests/rust_guests/simpleguest/target/x86_64-unknown-none"
1515
simpleguest_msvc_source := "src/tests/rust_guests/simpleguest/target/x86_64-pc-windows-msvc"
1616
dummyguest_source := "src/tests/rust_guests/dummyguest/target/x86_64-unknown-none"
17+
# TODO(danbugs:297): Delete
1718
customguest_source := "src/tests/rust_guests/customguest/target/x86_64-unknown-none"
1819
callbackguest_source := "src/tests/rust_guests/callbackguest/target/x86_64-unknown-none"
1920
callbackguest_msvc_source := "src/tests/rust_guests/callbackguest/target/x86_64-pc-windows-msvc"
@@ -36,19 +37,21 @@ tar-static-lib: (build-rust-capi "release") (build-rust-capi "debug")
3637

3738
# BUILDING
3839
build-rust-guests target=default-target:
39-
cd src/tests/rust_guests/callbackguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
40-
cd src/tests/rust_guests/callbackguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }} --target=x86_64-pc-windows-msvc
41-
cd src/tests/rust_guests/simpleguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
40+
cd src/tests/rust_guests/simpleguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
4241
cd src/tests/rust_guests/simpleguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }} --target=x86_64-pc-windows-msvc
43-
cd src/tests/rust_guests/dummyguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
44-
cd src/tests/rust_guests/customguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
42+
# TODO(danbugs:297): clean up
43+
# cd src/tests/rust_guests/callbackguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
44+
# cd src/tests/rust_guests/callbackguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }} --target=x86_64-pc-windows-msvc
45+
# cd src/tests/rust_guests/dummyguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
46+
# cd src/tests/rust_guests/customguest && cargo build --profile={{ if target == "debug" { "dev" } else { target } }}
4547

4648
@move-rust-guests target=default-target:
4749
cp {{ callbackguest_source }}/{{ target }}/callbackguest* {{ rust_guests_bin_dir }}/{{ target }}/
4850
cp {{ callbackguest_msvc_source }}/{{ target }}/callbackguest* {{ rust_guests_bin_dir }}/{{ target }}/
4951
cp {{ simpleguest_source }}/{{ target }}/simpleguest* {{ rust_guests_bin_dir }}/{{ target }}/
5052
cp {{ simpleguest_msvc_source }}/{{ target }}/simpleguest* {{ rust_guests_bin_dir }}/{{ target }}/
5153
cp {{ dummyguest_source }}/{{ target }}/dummyguest* {{ rust_guests_bin_dir }}/{{ target }}/
54+
# TODO(danbugs:297): Delete
5255
cp {{ customguest_source }}/{{ target }}/customguest* {{ rust_guests_bin_dir }}/{{ target }}/
5356

5457
build-and-move-rust-guests: (build-rust-guests "debug") (move-rust-guests "debug") (build-rust-guests "release") (move-rust-guests "release")
@@ -72,6 +75,7 @@ clean-rust:
7275
cargo clean
7376
cd src/tests/rust_guests/simpleguest && cargo clean
7477
cd src/tests/rust_guests/dummyguest && cargo clean
78+
# TODO(danbugs:297): Delete
7579
cd src/tests/rust_guests/customguest && cargo clean
7680
cd src/tests/rust_guests/callbackguest && cargo clean
7781
git clean -fdx src/tests/c_guests/bin src/tests/rust_guests/bin
@@ -130,6 +134,7 @@ fmt-check:
130134
cargo +nightly fmt --manifest-path src/tests/rust_guests/callbackguest/Cargo.toml -- --check
131135
cargo +nightly fmt --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml -- --check
132136
cargo +nightly fmt --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml -- --check
137+
# TODO(danbugs:297): Delete
133138
cargo +nightly fmt --manifest-path src/tests/rust_guests/customguest/Cargo.toml -- --check
134139
cargo +nightly fmt --manifest-path src/hyperlight_guest_capi/Cargo.toml -- --check
135140

@@ -138,6 +143,7 @@ fmt-apply:
138143
cargo +nightly fmt --manifest-path src/tests/rust_guests/callbackguest/Cargo.toml
139144
cargo +nightly fmt --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml
140145
cargo +nightly fmt --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml
146+
# TODO(danbugs:297): Delete
141147
cargo +nightly fmt --manifest-path src/tests/rust_guests/customguest/Cargo.toml
142148
cargo +nightly fmt --manifest-path src/hyperlight_guest_capi/Cargo.toml
143149

src/hyperlight_common/src/flatbuffer_wrappers/function_types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ impl TryFrom<&ReturnValue> for Vec<u8> {
710710
&mut builder,
711711
&hlsizeprefixedbufferArgs {
712712
value: Some(val),
713-
size_: v.len() as i32,
713+
size: v.len() as i32,
714714
},
715715
)
716716
};
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
use alloc::vec::Vec;
2+
use anyhow::Result;
3+
use flatbuffers::{size_prefixed_root, FlatBufferBuilder};
4+
5+
use crate::flatbuffers::hyperlight::generated::{HyperlightPEB as FbHyperlightPEB, HyperlightPEBArgs as FbHyperlightPEBArgs};
6+
7+
/// Hyperlight supports 2 primary modes:
8+
/// (1) Hypervisor mode
9+
/// (2) In-process mode
10+
///
11+
/// When running in process, there's no hypervisor isolation.
12+
/// In-process mode is primarily used for debugging and testing.
13+
#[repr(u64)]
14+
#[derive(Clone, PartialEq)]
15+
pub enum RunMode {
16+
None = 0,
17+
Hypervisor = 1,
18+
InProcessWindows = 2,
19+
InProcessLinux = 3,
20+
Invalid = 4,
21+
}
22+
23+
#[derive(Clone)]
24+
pub struct HyperlightPEB {
25+
/// The guest function dispatch pointer is what allows
26+
/// a host to call "guest functions". The host can
27+
/// directly set the instruction pointer register to this
28+
/// before re-entering the guest.
29+
pub guest_function_dispatch_ptr: Option<u64>,
30+
31+
// Host function details may be used in the guest before
32+
// issuing a host function call to validate it before
33+
// ensuing a `VMEXIT`.
34+
pub host_function_details_ptr: Option<u64>,
35+
pub host_function_details_size: Option<u64>,
36+
37+
/// Guest error data can be used to pass error information
38+
/// between host and the guest.
39+
pub guest_error_data_ptr: Option<u64>,
40+
pub guest_error_data_size: Option<u64>,
41+
42+
/// On Windows, Hyperlight supports in-process execution.
43+
/// In-process execution means a guest is running in
44+
/// Hyperlight, but with no hypervisor isolation. When we
45+
/// run in-process, we can't rely on the usual mechanism for
46+
/// host function calls (i.e., `outb`). Instead, we call a
47+
/// function directly, which is represented by this pointer.
48+
pub outb_ptr: Option<u64>,
49+
50+
/// Hyperlight supports two primary modes:
51+
/// (1) Hypervisor mode
52+
/// (2) In-process mode
53+
///
54+
/// When running in process, there's no hypervisor isolation.
55+
/// It's a mode primarily used for debugging and testing.
56+
pub run_mode: Option<RunMode>,
57+
58+
/// The input data pointer is used to pass data from
59+
/// the host to the guest.
60+
pub input_data_ptr: Option<u64>,
61+
pub input_data_size: Option<u64>,
62+
63+
/// The output data pointer is used to pass data from
64+
/// the guest to the host.
65+
pub output_data_ptr: Option<u64>,
66+
pub output_data_size: Option<u64>,
67+
68+
/// The guest panic context pointer can be used to pass
69+
/// panic context data from the guest to the host.
70+
pub guest_panic_context_ptr: Option<u64>,
71+
pub guest_panic_context_size: Option<u64>,
72+
73+
/// The guest heap data pointer points to a region of
74+
/// memory in the guest that is used for heap allocations.
75+
pub guest_heap_data_ptr: Option<u64>,
76+
pub guest_heap_data_size: Option<u64>,
77+
78+
/// The guest stack data pointer points to a region of
79+
/// memory in the guest that is used for stack allocations.
80+
pub guest_stack_data_ptr: Option<u64>,
81+
pub guest_stack_data_size: Option<u64>,
82+
}
83+
84+
impl TryFrom<&[u8]> for HyperlightPEB {
85+
type Error = anyhow::Error;
86+
87+
fn try_from(value: &[u8]) -> Result<Self> {
88+
let peb_fb = size_prefixed_root::<FbHyperlightPEB>(value)
89+
.map_err(|e| anyhow::anyhow!("Error reading HyperlightPEB buffer: {:?}", e))?;
90+
91+
let run_mode = match peb_fb.run_mode() {
92+
0 => Some(RunMode::None),
93+
1 => Some(RunMode::Hypervisor),
94+
2 => Some(RunMode::InProcessWindows),
95+
3 => Some(RunMode::InProcessLinux),
96+
4 => Some(RunMode::Invalid),
97+
_ => None, // Handles unexpected values gracefully
98+
};
99+
100+
Ok(Self {
101+
guest_function_dispatch_ptr: Some(peb_fb.guest_function_dispatch_ptr()).filter(|&v| v != 0),
102+
host_function_details_ptr: Some(peb_fb.host_function_details_ptr()).filter(|&v| v != 0),
103+
host_function_details_size: Some(peb_fb.host_function_details_size()).filter(|&v| v != 0),
104+
guest_error_data_ptr: Some(peb_fb.guest_error_data_ptr()).filter(|&v| v != 0),
105+
guest_error_data_size: Some(peb_fb.guest_error_data_size()).filter(|&v| v != 0),
106+
outb_ptr: Some(peb_fb.outb_ptr()).filter(|&v| v != 0),
107+
run_mode,
108+
input_data_ptr: Some(peb_fb.input_data_ptr()).filter(|&v| v != 0),
109+
input_data_size: Some(peb_fb.input_data_size()).filter(|&v| v != 0),
110+
output_data_ptr: Some(peb_fb.output_data_ptr()).filter(|&v| v != 0),
111+
output_data_size: Some(peb_fb.output_data_size()).filter(|&v| v != 0),
112+
guest_panic_context_ptr: Some(peb_fb.guest_panic_context_ptr()).filter(|&v| v != 0),
113+
guest_panic_context_size: Some(peb_fb.guest_panic_context_size()).filter(|&v| v != 0),
114+
guest_heap_data_ptr: Some(peb_fb.guest_heap_data_ptr()).filter(|&v| v != 0),
115+
guest_heap_data_size: Some(peb_fb.guest_heap_data_size()).filter(|&v| v != 0),
116+
guest_stack_data_ptr: Some(peb_fb.guest_stack_data_ptr()).filter(|&v| v != 0),
117+
guest_stack_data_size: Some(peb_fb.guest_stack_data_size()).filter(|&v| v != 0),
118+
})
119+
}
120+
}
121+
122+
impl TryFrom<HyperlightPEB> for Vec<u8> {
123+
type Error = anyhow::Error;
124+
125+
fn try_from(value: HyperlightPEB) -> Result<Vec<u8>> {
126+
let mut builder = FlatBufferBuilder::new();
127+
128+
// Convert RunMode into u64
129+
let run_mode: u64 = match value.run_mode {
130+
Some(RunMode::None) => 0,
131+
Some(RunMode::Hypervisor) => 1,
132+
Some(RunMode::InProcessWindows) => 2,
133+
Some(RunMode::InProcessLinux) => 3,
134+
Some(RunMode::Invalid) => 4,
135+
None => 0, // Default to None
136+
};
137+
138+
let hyperlight_peb = FbHyperlightPEB::create(
139+
&mut builder,
140+
&FbHyperlightPEBArgs {
141+
guest_function_dispatch_ptr: value.guest_function_dispatch_ptr.unwrap_or(0),
142+
host_function_details_ptr: value.host_function_details_ptr.unwrap_or(0),
143+
host_function_details_size: value.host_function_details_size.unwrap_or(0),
144+
guest_error_data_ptr: value.guest_error_data_ptr.unwrap_or(0),
145+
guest_error_data_size: value.guest_error_data_size.unwrap_or(0),
146+
outb_ptr: value.outb_ptr.unwrap_or(0),
147+
run_mode,
148+
input_data_ptr: value.input_data_ptr.unwrap_or(0),
149+
input_data_size: value.input_data_size.unwrap_or(0),
150+
output_data_ptr: value.output_data_ptr.unwrap_or(0),
151+
output_data_size: value.output_data_size.unwrap_or(0),
152+
guest_panic_context_ptr: value.guest_panic_context_ptr.unwrap_or(0),
153+
guest_panic_context_size: value.guest_panic_context_size.unwrap_or(0),
154+
guest_heap_data_ptr: value.guest_heap_data_ptr.unwrap_or(0),
155+
guest_heap_data_size: value.guest_heap_data_size.unwrap_or(0),
156+
guest_stack_data_ptr: value.guest_stack_data_ptr.unwrap_or(0),
157+
guest_stack_data_size: value.guest_stack_data_size.unwrap_or(0),
158+
},
159+
);
160+
161+
builder.finish_size_prefixed(hyperlight_peb, None);
162+
let res = builder.finished_data().to_vec();
163+
164+
Ok(res)
165+
}
166+
}

src/hyperlight_common/src/flatbuffer_wrappers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ pub mod host_function_definition;
2626
/// cbindgen:ignore
2727
pub mod host_function_details;
2828
pub mod util;
29+
pub mod hyperlight_peb;

0 commit comments

Comments
 (0)