// 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 crate::{Param, ParamTypes}; use optee_teec_sys as raw; use std::marker::PhantomData; use std::mem; /// This type defines the payload of either an open session operation or an /// invoke command operation. It is also used for cancellation of operations, /// which may be desirable even if no payload is passed. pub struct Operation { pub raw: raw::TEEC_Operation, phantom0: PhantomData, phantom1: PhantomData, phantom2: PhantomData, phantom3: PhantomData, } impl Operation { pub fn new(started: u32, mut p0: A, mut p1: B, mut p2: C, mut p3: D) -> Operation { let mut raw_op: raw::TEEC_Operation = unsafe { mem::zeroed() }; raw_op.started = started; raw_op.paramTypes = ParamTypes::new( p0.param_type(), p1.param_type(), p2.param_type(), p3.param_type(), ) .into(); raw_op.params = [p0.into_raw(), p1.into_raw(), p2.into_raw(), p3.into_raw()]; Operation { raw: raw_op, phantom0: PhantomData, phantom1: PhantomData, phantom2: PhantomData, phantom3: PhantomData, } } pub fn as_mut_raw_ptr(&mut self) -> *mut raw::TEEC_Operation { &mut self.raw } pub fn parameters(&self) -> (A, B, C, D) { let (f0, f1, f2, f3) = ParamTypes::from(self.raw.paramTypes).into_flags(); ( A::from_raw(self.raw.params[0], f0), B::from_raw(self.raw.params[1], f1), C::from_raw(self.raw.params[2], f2), D::from_raw(self.raw.params[3], f3), ) } }