diff --git a/rust-vsock-payload/build.rs b/rust-vsock-payload/build.rs new file mode 100644 index 0000000..ae5de3f --- /dev/null +++ b/rust-vsock-payload/build.rs @@ -0,0 +1,8 @@ +use std::env; + +fn main() { + let out_dir = env::var("RUST_LINK_C_LIB_DIR").unwrap(); + let lib_name = env::var("RUST_LINK_C_LIB_NAME").unwrap(); + println!("cargo:rustc-link-search=native={}", out_dir); + println!("cargo:rustc-link-lib=static={}", lib_name); +} diff --git a/rust-vsock-payload/readme.md b/rust-vsock-payload/readme.md index 02f4220..fa86bc5 100644 --- a/rust-vsock-payload/readme.md +++ b/rust-vsock-payload/readme.md @@ -12,6 +12,12 @@ export RUST_IPL_BIN=$BASE_DIR/target/x86_64-unknown-uefi/release/rust_ipl.efi export RUST_PAYLOAD_BIN=$BASE_DIR/target/x86_64-unknown-uefi/release/rust-vsock-payload.efi export RUST_FIRMWARE_BIN=$BASE_DIR/target/x86_64-unknown-uefi/release/final_vsock.bin ``` +To link a static C library, set the folder and name of lib to the environment variable: + +```bash +export RUST_LINK_C_LIB_DIR=$BASE_DIR/rust-vsock-payload/ +export RUST_LINK_C_LIB_NAME=main.a +``` To build default PE format OBJ and link with a static C library: diff --git a/rust-vsock-payload/src/main.rs b/rust-vsock-payload/src/main.rs index 9b58ea4..1a6261a 100644 --- a/rust-vsock-payload/src/main.rs +++ b/rust-vsock-payload/src/main.rs @@ -18,6 +18,13 @@ mod vsock_impl; mod client; mod server; +mod vsock_lib; + +#[link(name = "main")] +extern "C" { + fn server_entry() -> i32; + fn client_entry() -> i32; +} #[no_mangle] #[cfg_attr(target_os = "uefi", export_name = "efi_main")] @@ -45,17 +52,24 @@ pub extern "win64" fn _start(hob_list: *const u8, _reserved_param: usize) -> ! { vsock_impl::init_vsock_device(); - client::test_client(); - server::test_server(); + // client::test_client(); + let mut result; + unsafe { + result = client_entry(); + } + log::debug!("Client example done: {}\n", result); + + // server::test_server(); + unsafe { + result = server_entry(); + } - log::debug!("Example done\n"); + log::debug!("Server Example done: {}\n", result); loop {} } -#[cfg(target_os = "uefi")] use core::panic::PanicInfo; -#[cfg(target_os = "uefi")] #[panic_handler] fn panic(_info: &PanicInfo) -> ! { rust_ipl_log::write_log( diff --git a/rust-vsock-payload/vsock_c_lib/main.c b/rust-vsock-payload/vsock_c_lib/main.c new file mode 100644 index 0000000..1e0687b --- /dev/null +++ b/rust-vsock-payload/vsock_c_lib/main.c @@ -0,0 +1,96 @@ +// +// Copyright (c) 2021 Intel Corporation +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// This example does the same work as rust-vsock-payload/src/server.rs +// + +#include + +typedef unsigned int socklen_t; + +struct sockaddr { + unsigned short svm_family; + unsigned short svm_reserved1; + unsigned int svm_port; + unsigned int svm_cid; + unsigned char svm_flags; + unsigned char svm_zero[3]; +}; + +extern int socket (int family, int type, int protocol); +extern int bind (int sockfd, const struct sockaddr *addr,socklen_t addrlen); +extern int listen (int sockfd, int backlog); +extern int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen); +extern ssize_t recv (int sockfd, void *buf, size_t len, int flags); +extern int connect (int sockfd, const struct sockaddr *addr,socklen_t addrlen); +extern ssize_t send (int sockfd, void *buf, size_t len, int flags); +extern int shutdown (int fd, int how); + +#define RECV_BUF_LEN 1024 + +int server_entry () { + int sockfd; + unsigned char buf[1024]; + struct sockaddr bindAddr; + socklen_t bindAddrLen; + struct sockaddr acceptAddr; + socklen_t acceptAddrLen; + + bindAddr.svm_port = 1234; + bindAddr.svm_cid = 33; + bindAddrLen = 11; + + sockfd = socket (0, 0, 0); + + if (bind (sockfd, &bindAddr, bindAddrLen)) { + return -1; + } + + if (listen (sockfd, 1)) { + return -1; + } + + if (accept (sockfd, &acceptAddr, &acceptAddrLen)) { + return -1; + } + + while (1) { + if (!recv (sockfd, buf, 1024, 0)) { + break; + } + } + + if (shutdown (sockfd, 0)) { + return -1; + } + return 0; +} + + + +int client_entry () { + int sockfd; + struct sockaddr serverAddr; + socklen_t serverAddrLen; + + sockfd = socket (0, 0, 0); + + serverAddr.svm_port = 1234; + serverAddr.svm_cid = 2; + serverAddrLen = 11; + + if (connect (sockfd, &serverAddr, serverAddrLen)) { + return -1; + } + + if (send (sockfd, "hello", 5, 0)) { + return -1; + } + + if (shutdown (sockfd, 0)) { + return -1; + } + return 0; +}