From 4e487d448de590ec564cfbab02d353f327e4de6e Mon Sep 17 00:00:00 2001 From: ivila <390810839@qq.com> Date: Fri, 20 Dec 2024 17:31:13 +0800 Subject: [PATCH] Use optee-utee-build crate to build hello_world example 1. add optee-utee-build in build-dependencies 2. remove uuid from build-dependencies 3. use build method from optee-utee-build instead of custom build script 4. use gcc as linker instead of ld.bfd to avoid compilation problems on Arm host 5. remove ta_static.rs file 6. remove configuration consts in src/main.rs --- examples/hello_world-rs/ta/Cargo.toml | 4 +- examples/hello_world-rs/ta/Makefile | 2 +- examples/hello_world-rs/ta/build.rs | 86 +------------------- examples/hello_world-rs/ta/src/main.rs | 12 --- examples/hello_world-rs/ta/ta_static.rs | 102 ------------------------ 5 files changed, 7 insertions(+), 199 deletions(-) delete mode 100644 examples/hello_world-rs/ta/ta_static.rs diff --git a/examples/hello_world-rs/ta/Cargo.toml b/examples/hello_world-rs/ta/Cargo.toml index badab895..d272b6fe 100644 --- a/examples/hello_world-rs/ta/Cargo.toml +++ b/examples/hello_world-rs/ta/Cargo.toml @@ -29,9 +29,9 @@ proto = { path = "../proto" } optee-utee-sys = { path = "../../../optee-utee/optee-utee-sys" } optee-utee = { path = "../../../optee-utee" } -[build_dependencies] -uuid = { version = "1.6.1", default-features = false } +[build-dependencies] proto = { path = "../proto" } +optee-utee-build = { path = "../../../optee-utee-build" } [profile.release] panic = "abort" diff --git a/examples/hello_world-rs/ta/Makefile b/examples/hello_world-rs/ta/Makefile index 72a9cb3f..c1c4344a 100644 --- a/examples/hello_world-rs/ta/Makefile +++ b/examples/hello_world-rs/ta/Makefile @@ -20,7 +20,7 @@ UUID ?= $(shell cat "../uuid.txt") TARGET ?= aarch64-unknown-linux-gnu CROSS_COMPILE ?= aarch64-linux-gnu- OBJCOPY := $(CROSS_COMPILE)objcopy -LINKER_CFG := target.$(TARGET).linker=\"$(CROSS_COMPILE)ld.bfd\" +LINKER_CFG := target.$(TARGET).linker=\"$(CROSS_COMPILE)gcc\" TA_SIGN_KEY ?= $(TA_DEV_KIT_DIR)/keys/default_ta.pem SIGN := $(TA_DEV_KIT_DIR)/scripts/sign_encrypt.py diff --git a/examples/hello_world-rs/ta/build.rs b/examples/hello_world-rs/ta/build.rs index fa0d1954..cb894f70 100644 --- a/examples/hello_world-rs/ta/build.rs +++ b/examples/hello_world-rs/ta/build.rs @@ -16,88 +16,10 @@ // under the License. use proto; -use std::env; -use std::fs::File; -use std::io::{BufRead, BufReader, Write}; -use std::path::{Path, PathBuf}; -use uuid::Uuid; +use optee_utee_build::{TAConfig, RustEdition, Error}; -fn main() -> std::io::Result<()> { - let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); +fn main() -> Result<(), Error> { + let config = TAConfig::new_standard_with_cargo_env(proto::UUID)?; + optee_utee_build::build(RustEdition::Before2024, config) - let mut buffer = File::create(out.join("user_ta_header.rs"))?; - buffer.write_all(include_bytes!("ta_static.rs"))?; - - let tee_uuid = Uuid::parse_str(proto::UUID).unwrap(); - let (time_low, time_mid, time_hi_and_version, clock_seq_and_node) = tee_uuid.as_fields(); - - write!(buffer, "\n")?; - write!( - buffer, - "const TA_UUID: optee_utee_sys::TEE_UUID = optee_utee_sys::TEE_UUID {{ - timeLow: {:#x}, - timeMid: {:#x}, - timeHiAndVersion: {:#x}, - clockSeqAndNode: {:#x?}, -}};", - time_low, time_mid, time_hi_and_version, clock_seq_and_node - )?; - - let mut aarch64_flag = true; - match env::var("TARGET_TA") { - Ok(ref v) if v == "arm-unknown-linux-gnueabihf" || v == "arm-unknown-optee" => { - println!("cargo:rustc-link-arg=--no-warn-mismatch"); - aarch64_flag = false; - }, - _ => {} - }; - - let optee_os_dir = env::var("TA_DEV_KIT_DIR").unwrap(); - let search_path = Path::new(&optee_os_dir).join("lib"); - - let optee_os_path = &PathBuf::from(optee_os_dir.clone()); - let mut ta_lds = File::create(out.join("ta.lds"))?; - let f = File::open(optee_os_path.join("src/ta.ld.S"))?; - let f = BufReader::new(f); - - for line in f.lines() { - let l = line?; - - if aarch64_flag { - if l.starts_with('#') || - l == "OUTPUT_FORMAT(\"elf32-littlearm\")" || - l == "OUTPUT_ARCH(arm)" { - continue; - } - } else { - if l.starts_with('#') || - l == "OUTPUT_FORMAT(\"elf64-littleaarch64\")" || - l == "OUTPUT_ARCH(aarch64)" { - continue; - } - } - - if l == "\t. = ALIGN(4096);" { - write!(ta_lds, "\t. = ALIGN(65536);\n")?; - } else { - write!(ta_lds, "{}\n", l)?; - } - } - - println!("cargo:rustc-link-search={}", out.display()); - println!("cargo:rerun-if-changed=ta.lds"); - - println!("cargo:rustc-link-search={}", search_path.display()); - println!("cargo:rustc-link-lib=static=utee"); - println!("cargo:rustc-link-lib=static=utils"); - println!("cargo:rustc-link-arg=-Tta.lds"); - println!("cargo:rustc-link-arg=-e__ta_entry"); - println!("cargo:rustc-link-arg=-pie"); - println!("cargo:rustc-link-arg=-Os"); - println!("cargo:rustc-link-arg=--sort-section=alignment"); - - let mut dyn_list = File::create(out.join("dyn_list"))?; - write!(dyn_list, "{{ __elf_phdr_info; trace_ext_prefix; trace_level; ta_head; }};\n")?; - println!("cargo:rustc-link-arg=--dynamic-list=dyn_list"); - Ok(()) } diff --git a/examples/hello_world-rs/ta/src/main.rs b/examples/hello_world-rs/ta/src/main.rs index 8ef0567b..e29f9d68 100644 --- a/examples/hello_world-rs/ta/src/main.rs +++ b/examples/hello_world-rs/ta/src/main.rs @@ -63,16 +63,4 @@ fn invoke_command(cmd_id: u32, params: &mut Parameters) -> Result<()> { } } -// TA configurations -const TA_FLAGS: u32 = 0; -const TA_DATA_SIZE: u32 = 32 * 1024; -const TA_STACK_SIZE: u32 = 2 * 1024; -const TA_VERSION: &[u8] = b"0.1\0"; -const TA_DESCRIPTION: &[u8] = b"This is a hello world example.\0"; -const EXT_PROP_VALUE_1: &[u8] = b"Hello World TA\0"; -const EXT_PROP_VALUE_2: u32 = 0x0010; -const TRACE_LEVEL: i32 = 4; -const TRACE_EXT_PREFIX: &[u8] = b"TA\0"; -const TA_FRAMEWORK_STACK_SIZE: u32 = 2048; - include!(concat!(env!("OUT_DIR"), "/user_ta_header.rs")); diff --git a/examples/hello_world-rs/ta/ta_static.rs b/examples/hello_world-rs/ta/ta_static.rs deleted file mode 100644 index 20e1d977..00000000 --- a/examples/hello_world-rs/ta/ta_static.rs +++ /dev/null @@ -1,102 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -use core::ffi::{c_int, c_void}; -use core::mem; -use core::primitive::u64; - -#[no_mangle] -pub static mut trace_level: c_int = TRACE_LEVEL; - -#[no_mangle] -pub static trace_ext_prefix: &[u8] = TRACE_EXT_PREFIX; - -#[no_mangle] -#[link_section = ".ta_head"] -pub static ta_head: optee_utee_sys::ta_head = optee_utee_sys::ta_head { - uuid: TA_UUID, - stack_size: TA_STACK_SIZE + TA_FRAMEWORK_STACK_SIZE, - flags: TA_FLAGS, - depr_entry: u64::MAX, -}; - -#[no_mangle] -#[link_section = ".bss"] -pub static ta_heap: [u8; TA_DATA_SIZE as usize] = [0; TA_DATA_SIZE as usize]; - -#[no_mangle] -pub static ta_heap_size: usize = mem::size_of::() * TA_DATA_SIZE as usize; -static FLAG_BOOL: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_SINGLE_INSTANCE) != 0; -static FLAG_MULTI: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_MULTI_SESSION) != 0; -static FLAG_INSTANCE: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_INSTANCE_KEEP_ALIVE) != 0; - -#[no_mangle] -pub static ta_num_props: usize = 9; - -#[no_mangle] -pub static ta_props: [optee_utee_sys::user_ta_property; 9] = [ - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_SINGLE_INSTANCE, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL, - value: &FLAG_BOOL as *const bool as *mut _, - }, - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_MULTI_SESSION, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL, - value: &FLAG_MULTI as *const bool as *mut _, - }, - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_KEEP_ALIVE, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL, - value: &FLAG_INSTANCE as *const bool as *mut _, - }, - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_DATA_SIZE, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32, - value: &TA_DATA_SIZE as *const u32 as *mut _, - }, - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_STACK_SIZE, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32, - value: &TA_STACK_SIZE as *const u32 as *mut _, - }, - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_VERSION, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING, - value: TA_VERSION as *const [u8] as *mut _, - }, - optee_utee_sys::user_ta_property { - name: optee_utee_sys::TA_PROP_STR_DESCRIPTION, - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING, - value: TA_DESCRIPTION as *const [u8] as *mut _, - }, - optee_utee_sys::user_ta_property { - name: "gp.ta.description\0".as_ptr(), - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING, - value: EXT_PROP_VALUE_1 as *const [u8] as *mut _, - }, - optee_utee_sys::user_ta_property { - name: "gp.ta.version\0".as_ptr(), - prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32, - value: &EXT_PROP_VALUE_2 as *const u32 as *mut _, - }, -]; - -#[no_mangle] -pub unsafe extern "C" fn tahead_get_trace_level() -> c_int { - return trace_level; -}