b49020 opened a new pull request, #114:
URL: https://github.com/apache/incubator-teaclave-trustzone-sdk/pull/114

   Existing OP-TEE rust environment required a custom rust toolchain target for 
OP-TEE based TAs. I suppose back in 2019 when this SDK was created, rust 
embedded ecosystem (especially no_std support) was in its very early stages of 
development. But as of today many rust crates have already added support for 
rust no_std or are being actively worked on to add rust no_std support for 
example rustls here(https://github.com/rustls/rustls/pull/1399).
   
   This effort is a followup effort to the discussion here 
(https://github.com/apache/incubator-teaclave-trustzone-sdk/issues/113). The 
major motivation for this effort was to make OP-TEE rust TAs development 
environment to be the first class citizen. Rust `no_std` support seems to 
provide quite similar environment as we have on the C counterpart side in 
OP-TEE (we don't support fully fledged libc/glibc but rather our    own quite 
simple libutils library).
   
   Upsides for this PR:
   --------------------
   - Reusing standard rust aarch64 teir-1 toolchain target 
(aarch64-unknown-linux-gnu) for TAs development.
   - Significant rust TAs performance improvements.
   - Significant rust TAs binary size reduction.
   - Dropping custom rust toolchain/libc/compiler-builtins support.
   - Make rust TA builds to be quite similar to rust Linux application builds:
   ```
     $ cargo build --target $(TARGET) --release --verbose --config $(LINKER_CFG)
   ```
   
   Downsides for this PR:
   ----------------------
   - We have to drop networking and serde related TA examples due to their 
strong reliance on rust std support. But as I mentioned above with no_std 
support picking up, we should be able to rewrite them.
   
   Testing
   =======
   
   Their is one change needed for OP-TEE build repo in order to build this PR 
as follows. Once there is consensus on this PR, I will submit this change as 
well.
   
   ```
   build$ git diff
   diff --git 
a/br-ext/package/optee_rust_examples_ext/optee_rust_examples_ext.mk 
b/br-ext/package/optee_rust_examples_ext/optee_rust_examples_ext.mk
   index e19e8b5..af2f368 100644
   --- a/br-ext/package/optee_rust_examples_ext/optee_rust_examples_ext.mk
   +++ b/br-ext/package/optee_rust_examples_ext/optee_rust_examples_ext.mk
   @@ -12,7 +12,7 @@ endif
    EXAMPLE = $(wildcard examples/*)
    
    HOST_TARGET := aarch64-unknown-linux-gnu
   -TA_TARGET := aarch64-unknown-optee-trustzone
   +TA_TARGET := aarch64-unknown-linux-gnu
    
    export RUST_TARGET_PATH = $(@D)
    export RUST_COMPILER_RT_ROOT = 
$(RUST_TARGET_PATH)/rust/rust/src/llvm-project/compiler-rt
   ```
   
   Once that's done we should be able to build OP-TEE buildroot setup with rust 
support:
   
   ```
   $ make -j`nproc` OPTEE_RUST_ENABLE=y
   ```
   
   For interactive run, just bring up Qemu with below command and run rust 
examples:
   
   ```
   $ make run-only
   ```
   
   Or you can test all rust examples in one go:
   
   ```
   $ make check-only-rust
   <snip>
   Starting QEMU...
    done, guest is booted.
   Test Rust applications:
   Running acipher-rs...
   Test success
   Running aes-rs...
   Test success
   Running authentication-rs...
   Test success
   Running big_int-rs...
   Test success
   Running diffie_hellman-rs...
   Test success
   Running digest-rs...
   Test success
   Running hello_world-rs...
   Test success
   Running hotp-rs...
   Test success
   Running random-rs...
   Test success
   Running secure_storage-rs...
   Test success
   Running supp_plugin-rs...
   Test success
   Running time-rs...
   Test success
   Running signature_verification-rs...
   Test success
   Test Rust application finished
   ```
   
   Performance comparisons
   =======================
   
   After this PR, the TA performance becomes equivalent to the C counterparts. 
This is impressive improvement as compared to 35% performance gap earlier as 
illustrated here 
(https://github.com/apache/incubator-teaclave-trustzone-sdk/issues/89).
   
   See below comparison after this PR:
   
   ```
   # time aes-rs 
   Prepare encode operation
   Load key in TA
   Reset ciphering operation in TA (provides the initial vector)
   Encode buffer from TA
   Prepare decode operation
   Load key in TA
   Reset ciphering operation in TA (provides the initial vector)
   Decode buffer from TA
   Clear text and decoded text match
   real 0m 0.10s
   user 0m 0.00s
   sys  0m 0.09s
   # 
   # time optee_example_aes 
   Prepare session with the TA
   Prepare encode operation
   Load key in TA
   Reset ciphering operation in TA (provides the initial vector)
   Encode buffer from TA
   Prepare decode operation
   Load key in TA
   Reset ciphering operation in TA (provides the initial vector)
   Decode buffer from TA
   Clear text and decoded text match
   real 0m 0.10s
   user 0m 0.00s
   sys  0m 0.08s
   #
   #
   # time random-rs 
   Invoking TA to generate random UUID...
   Invoking done!
   Generate random UUID: 60ee720f-493b-45a2-f7413c1bfc3df154
   Success
   real 0m 0.08s
   user 0m 0.00s
   sys  0m 0.07s
   # 
   # time optee_example_random 
   Invoking TA to generate random UUID... 
   TA generated UUID value = 0x4d45495584fb6fa851a761c3583dc3c
   real 0m 0.08s
   user 0m 0.00s
   sys  0m 0.06s
   
   ``` 
   
   Size comparisons
   ================
   
   As you can observe from the comparisons below, there is approx. 70K - 80K TA 
binary size reduction after this PR:
   
   ```
   $ ls -lh ./per-package/optee_rust_examples_ext/target/lib/optee_armtz/
   ...
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:29 
057f4b66-bdab-11eb-96cf-33d6e41cc849.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:30 
0864c8ec-bdab-11eb-8926-c7fa47a8c92d.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:30 
0a5a06b2-bdab-11eb-add0-77f29de31296.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:30 
0bef16a2-bdab-11eb-94be-6f9815f37c21.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:30 
0e6bf4fe-bdab-11eb-9bc5-3f4ecb50aee7.ta
   -r--r--r-- 2 sumit sumit 196K Dec 21 17:30 
10de87e2-bdab-11eb-b73c-63fec73e597c.ta
   -r--r--r-- 2 sumit sumit 196K Dec 21 17:30 
133af0ca-bdab-11eb-9130-43bf7873bf67.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:30 
1585d412-bdab-11eb-ba91-3b085fd2601f.ta
   -r--r--r-- 2 sumit sumit 196K Dec 21 17:30 
197c710c-bdab-11eb-8f3f-17a5f698d23b.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:30 
1cd6d392-bdab-11eb-9082-abc902ac5cd4.ta
   -r--r--r-- 2 sumit sumit 196K Dec 21 17:31 
21b1a1da-bdab-11eb-b614-275a7098826f.ta
   -r--r--r-- 2 sumit sumit 262K Dec 21 17:31 
255fc838-de89-42d3-9a8e-d044c50fa57c.ta
   -r--r--r-- 2 sumit sumit 197K Dec 21 17:31 
c7e478c2-89b3-46eb-ac19-571e66c3830d.ta
   ```
   
   Before this PR:
   
   ```
   $ ls -lh ./per-package/optee_rust_examples_ext/target/lib/optee_armtz/
   ...
   -r--r--r-- 2 sumit.garg primary 272K Dec 19 10:26 
057f4b66-bdab-11eb-96cf-33d6e41cc849.ta
   -r--r--r-- 2 sumit.garg primary 273K Dec 19 10:26 
0864c8ec-bdab-11eb-8926-c7fa47a8c92d.ta
   -r--r--r-- 2 sumit.garg primary 273K Dec 19 10:26 
0a5a06b2-bdab-11eb-add0-77f29de31296.ta
   -r--r--r-- 2 sumit.garg primary 273K Dec 19 10:27 
0bef16a2-bdab-11eb-94be-6f9815f37c21.ta
   -r--r--r-- 2 sumit.garg primary 272K Dec 19 10:27 
0e6bf4fe-bdab-11eb-9bc5-3f4ecb50aee7.ta
   -r--r--r-- 2 sumit.garg primary 264K Dec 19 10:27 
10de87e2-bdab-11eb-b73c-63fec73e597c.ta
   -r--r--r-- 2 sumit.garg primary 264K Dec 19 10:28 
133af0ca-bdab-11eb-9130-43bf7873bf67.ta
   -r--r--r-- 2 sumit.garg primary 272K Dec 19 10:28 
1585d412-bdab-11eb-ba91-3b085fd2601f.ta
   ...
   -r--r--r-- 2 sumit.garg primary 264K Dec 19 10:29 
197c710c-bdab-11eb-8f3f-17a5f698d23b.ta
   -r--r--r-- 2 sumit.garg primary 268K Dec 19 10:29 
1cd6d392-bdab-11eb-9082-abc902ac5cd4.ta
   ...
   -r--r--r-- 2 sumit.garg primary 260K Dec 19 10:32 
21b1a1da-bdab-11eb-b614-275a7098826f.ta
   -r--r--r-- 2 sumit.garg primary 273K Dec 19 10:31 
255fc838-de89-42d3-9a8e-d044c50fa57c.ta
   ...
   -r--r--r-- 2 sumit.garg primary 338K Dec 19 10:31 
c7e478c2-89b3-46eb-ac19-571e66c3830d.ta
   ...
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@teaclave.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@teaclave.apache.org
For additional commands, e-mail: dev-h...@teaclave.apache.org

Reply via email to