Re-enable PKU support
Also add a testcase for PKU support
This commit is contained in:
parent
50e4653e12
commit
f280a9c382
5
.github/workflows/hw_mode_test.yml
vendored
5
.github/workflows/hw_mode_test.yml
vendored
@ -166,7 +166,7 @@ jobs:
|
||||
runs-on: ${{ matrix.self_runner }}
|
||||
strategy:
|
||||
matrix:
|
||||
self_runner: [[self-hosted, SGX2-HW]]
|
||||
self_runner: [[self-hosted, SGX2-HW, PKU]]
|
||||
|
||||
steps:
|
||||
- name: Clean before running
|
||||
@ -205,6 +205,9 @@ jobs:
|
||||
- name: Run processBuilder
|
||||
run: docker exec ${{ env.CONTAINER_NAME }} bash -c "cd /root/occlum/demos/java && ./run_java_on_occlum.sh processBuilder"
|
||||
|
||||
- name: Run hello PKU
|
||||
run: docker exec ${{ env.CONTAINER_NAME }} bash -c "cd /root/occlum/demos/java && ./run_java_on_occlum.sh hello_pku"
|
||||
|
||||
- name: Clean the environment
|
||||
if: ${{ always() }}
|
||||
run: docker stop ${{ env.CONTAINER_NAME }}
|
||||
|
@ -6,7 +6,7 @@ NC='\033[0m'
|
||||
|
||||
show_usage() {
|
||||
echo "Error: invalid arguments"
|
||||
echo "Usage: $0 web_app/hello/processBuilder"
|
||||
echo "Usage: $0 web_app/hello/processBuilder/hello_pku"
|
||||
exit 1
|
||||
}
|
||||
|
||||
@ -33,6 +33,10 @@ init_instance() {
|
||||
echo "${new_json}" > Occlum.json
|
||||
}
|
||||
|
||||
update_pku_config() {
|
||||
new_json="$(jq '.metadata.pkru = 1' Occlum.json)" && echo "${new_json}" > Occlum.json
|
||||
}
|
||||
|
||||
build_web() {
|
||||
# Copy JVM and JAR file into Occlum instance and build
|
||||
rm -rf image
|
||||
@ -66,6 +70,16 @@ run_hello() {
|
||||
occlum run /usr/lib/jvm/java-11-alibaba-dragonwell/jre/bin/java -Xmx512m -XX:-UseCompressedOops -XX:MaxMetaspaceSize=64m -Dos.name=Linux Main
|
||||
}
|
||||
|
||||
run_hello_pku() {
|
||||
hello=./hello_world/Main.class
|
||||
check_file_exist ${hello}
|
||||
init_instance
|
||||
update_pku_config
|
||||
build_hello
|
||||
echo -e "${BLUE}occlum run JVM hello with PKU enabled${NC}"
|
||||
occlum run /usr/lib/jvm/java-11-alibaba-dragonwell/jre/bin/java -Xmx512m -XX:-UseCompressedOops -XX:MaxMetaspaceSize=64m -Dos.name=Linux Main
|
||||
}
|
||||
|
||||
build_processBuilder() {
|
||||
# Copy JVM and class file into Occlum instance and build
|
||||
rm -rf image
|
||||
@ -97,6 +111,9 @@ case "$arg" in
|
||||
processBuilder)
|
||||
run_processBuilder
|
||||
;;
|
||||
hello_pku)
|
||||
run_hello_pku
|
||||
;;
|
||||
*)
|
||||
show_usage
|
||||
esac
|
||||
|
@ -1,5 +1,6 @@
|
||||
use super::*;
|
||||
|
||||
use crate::vm::{VMPerms, VMRange};
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
|
||||
/// Status variable accessed by assembly code
|
||||
@ -31,55 +32,91 @@ pub fn check_pku_enabled() -> bool {
|
||||
PKU_ENABLED.load(Ordering::Acquire)
|
||||
}
|
||||
|
||||
pub fn pkey_mprotect_userspace_mem(user_mem_base: usize, user_mem_len: usize, perm: i32) {
|
||||
pub fn pkey_mprotect_userspace_mem(
|
||||
user_space_range: &VMRange,
|
||||
gap_range: Option<&VMRange>,
|
||||
perm: VMPerms,
|
||||
) {
|
||||
if !self::check_pku_enabled() {
|
||||
return;
|
||||
}
|
||||
let mut retval = -1;
|
||||
debug!(
|
||||
"associate memory region: 0x{:x} -> 0x{:x}, size: 0x{:x} with pkey for userspace: {:?}",
|
||||
user_mem_base,
|
||||
user_mem_base + user_mem_len,
|
||||
user_mem_len,
|
||||
user_space_range.start(),
|
||||
user_space_range.end(),
|
||||
user_space_range.size(),
|
||||
PKEY_USER
|
||||
);
|
||||
let sgx_status = unsafe {
|
||||
occlum_ocall_pkey_mprotect(
|
||||
&mut retval,
|
||||
user_mem_base as *const c_void,
|
||||
user_mem_len,
|
||||
perm,
|
||||
PKEY_USER,
|
||||
)
|
||||
};
|
||||
|
||||
pkey_mprotect_user_space(user_space_range, gap_range, perm.bits() as i32, PKEY_USER);
|
||||
}
|
||||
|
||||
pub fn clear_pku_when_libos_exit(
|
||||
user_space_range: &VMRange,
|
||||
gap_range: Option<&VMRange>,
|
||||
perm: VMPerms,
|
||||
) {
|
||||
if !self::check_pku_enabled() {
|
||||
return;
|
||||
}
|
||||
debug!(
|
||||
"re-associate memory region 0x{:x} -> 0x{:x}, size: 0x{:x} with pkey for libos: {:?}",
|
||||
user_space_range.start(),
|
||||
user_space_range.end(),
|
||||
user_space_range.size(),
|
||||
PKEY_LIBOS
|
||||
);
|
||||
pkey_mprotect_user_space(user_space_range, gap_range, perm.bits() as i32, PKEY_LIBOS);
|
||||
|
||||
debug!("free pkey: {:?}", PKEY_USER);
|
||||
let mut retval = -1;
|
||||
let sgx_status = unsafe { occlum_ocall_pkey_free(&mut retval, PKEY_USER) };
|
||||
assert!(sgx_status == sgx_status_t::SGX_SUCCESS && retval == 0);
|
||||
}
|
||||
|
||||
pub fn clear_pku_when_libos_exit(user_mem_base: usize, user_mem_len: usize, perm: i32) {
|
||||
if !self::check_pku_enabled() {
|
||||
return;
|
||||
}
|
||||
fn pkey_mprotect_user_space(
|
||||
user_space_range: &VMRange,
|
||||
gap_range: Option<&VMRange>,
|
||||
perm: i32,
|
||||
pkey: i32,
|
||||
) {
|
||||
let mut retval = -1;
|
||||
debug!(
|
||||
"re-associate memory region 0x{:x} -> 0x{:x}, size: 0x{:x} with pkey for libos: {:?}",
|
||||
user_mem_base,
|
||||
user_mem_base + user_mem_len,
|
||||
user_mem_len,
|
||||
PKEY_LIBOS
|
||||
);
|
||||
|
||||
if let Some(gap_range) = gap_range {
|
||||
// user_space_left
|
||||
let user_space_left = VMRange::new(user_space_range.start(), gap_range.start()).unwrap();
|
||||
let user_space_right = VMRange::new(gap_range.end(), user_space_range.end()).unwrap();
|
||||
let sgx_status = unsafe {
|
||||
occlum_ocall_pkey_mprotect(
|
||||
&mut retval,
|
||||
user_mem_base as *const c_void,
|
||||
user_mem_len,
|
||||
user_space_left.start() as *const c_void,
|
||||
user_space_left.size(),
|
||||
perm,
|
||||
PKEY_LIBOS,
|
||||
pkey,
|
||||
)
|
||||
};
|
||||
assert!(sgx_status == sgx_status_t::SGX_SUCCESS && retval == 0);
|
||||
debug!("free pkey: {:?}", PKEY_USER);
|
||||
let sgx_status = unsafe { occlum_ocall_pkey_free(&mut retval, PKEY_USER) };
|
||||
let sgx_status = unsafe {
|
||||
occlum_ocall_pkey_mprotect(
|
||||
&mut retval,
|
||||
user_space_right.start() as *const c_void,
|
||||
user_space_right.size(),
|
||||
perm,
|
||||
pkey,
|
||||
)
|
||||
};
|
||||
} else {
|
||||
let sgx_status = unsafe {
|
||||
occlum_ocall_pkey_mprotect(
|
||||
&mut retval,
|
||||
user_space_range.start() as *const c_void,
|
||||
user_space_range.size(),
|
||||
perm,
|
||||
pkey,
|
||||
)
|
||||
};
|
||||
assert!(sgx_status == sgx_status_t::SGX_SUCCESS && retval == 0);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
Loading…
Reference in New Issue
Block a user