1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
4*758e9fbaSOystein Eftevaag * All rights reserved.
5*758e9fbaSOystein Eftevaag ******************************************************************************/
6*758e9fbaSOystein Eftevaag
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag
11*758e9fbaSOystein Eftevaag #include <stdlib.h>
12*758e9fbaSOystein Eftevaag #include <string.h>
13*758e9fbaSOystein Eftevaag
14*758e9fbaSOystein Eftevaag #include "tss2_fapi.h"
15*758e9fbaSOystein Eftevaag #include "fapi_int.h"
16*758e9fbaSOystein Eftevaag #include "fapi_util.h"
17*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
18*758e9fbaSOystein Eftevaag #define LOGMODULE fapi
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "util/aux_util.h"
21*758e9fbaSOystein Eftevaag
22*758e9fbaSOystein Eftevaag /** Retrieve handles for polling
23*758e9fbaSOystein Eftevaag *
24*758e9fbaSOystein Eftevaag * Returns an array of handles that can be polled on to get notified when
25*758e9fbaSOystein Eftevaag * data from the TPM or from a disk operation is available.
26*758e9fbaSOystein Eftevaag *
27*758e9fbaSOystein Eftevaag * The corresponding code should look similar to follows:
28*758e9fbaSOystein Eftevaag * do { r = Fapi_GetPollHandles(fc, &ph, &nph);
29*758e9fbaSOystein Eftevaag if (r == TSS2_RC_SUCCESS) { poll(ph, nph, -1); Fapi_Free(ph); }
30*758e9fbaSOystein Eftevaag * r = Fapi_*_Finish(fc, ...); } while (r == TSS2_FAPI_RC_TRY_AGAIN);
31*758e9fbaSOystein Eftevaag *
32*758e9fbaSOystein Eftevaag * @param[in,out] context The FAPI_CONTEXT
33*758e9fbaSOystein Eftevaag * @param[out] handles An array of poll handle entries
34*758e9fbaSOystein Eftevaag * @param[out] num_handles The size of the array in handles
35*758e9fbaSOystein Eftevaag *
36*758e9fbaSOystein Eftevaag * @retval TSS2_RC_SUCCESS: if the function call was a success.
37*758e9fbaSOystein Eftevaag * @retval TSS2_FAPI_RC_BAD_REFERENCE: if context or data is NULL.
38*758e9fbaSOystein Eftevaag * @retval TSS2_FAPI_RC_BAD_CONTEXT: if context corruption is detected.
39*758e9fbaSOystein Eftevaag * @retval TSS2_FAPI_RC_BAD_SEQUENCE: if the context has no asynchronous
40*758e9fbaSOystein Eftevaag * operation pending.
41*758e9fbaSOystein Eftevaag * @retval TSS2_FAPI_RC_NO_HANDLE: if there are no handles to poll on
42*758e9fbaSOystein Eftevaag * @retval TSS2_FAPI_RC_MEMORY: if the FAPI cannot allocate enough memory for
43*758e9fbaSOystein Eftevaag * internal operations or return parameters.
44*758e9fbaSOystein Eftevaag */
45*758e9fbaSOystein Eftevaag TSS2_RC
Fapi_GetPollHandles(FAPI_CONTEXT * context,FAPI_POLL_HANDLE ** handles,size_t * num_handles)46*758e9fbaSOystein Eftevaag Fapi_GetPollHandles(
47*758e9fbaSOystein Eftevaag FAPI_CONTEXT *context,
48*758e9fbaSOystein Eftevaag FAPI_POLL_HANDLE **handles,
49*758e9fbaSOystein Eftevaag size_t *num_handles)
50*758e9fbaSOystein Eftevaag {
51*758e9fbaSOystein Eftevaag LOG_TRACE("called for context:%p", context);
52*758e9fbaSOystein Eftevaag
53*758e9fbaSOystein Eftevaag TSS2_RC r;
54*758e9fbaSOystein Eftevaag
55*758e9fbaSOystein Eftevaag /* Check for NULL parameters */
56*758e9fbaSOystein Eftevaag check_not_null(context);
57*758e9fbaSOystein Eftevaag check_not_null(handles);
58*758e9fbaSOystein Eftevaag check_not_null(num_handles);
59*758e9fbaSOystein Eftevaag
60*758e9fbaSOystein Eftevaag /* Check the correct state for poll handle retrieval. */
61*758e9fbaSOystein Eftevaag if (context->state == _FAPI_STATE_INIT) {
62*758e9fbaSOystein Eftevaag LOG_ERROR("PollHandles can only be returned while an operation is running");
63*758e9fbaSOystein Eftevaag return TSS2_FAPI_RC_BAD_SEQUENCE;
64*758e9fbaSOystein Eftevaag }
65*758e9fbaSOystein Eftevaag
66*758e9fbaSOystein Eftevaag /* First we check for poll handles from IO operations. */
67*758e9fbaSOystein Eftevaag r = ifapi_io_poll_handles(&context->io, handles, num_handles);
68*758e9fbaSOystein Eftevaag if (r == TSS2_RC_SUCCESS) {
69*758e9fbaSOystein Eftevaag LOG_DEBUG("Returning %zi IO poll handles.", *num_handles);
70*758e9fbaSOystein Eftevaag return r;
71*758e9fbaSOystein Eftevaag }
72*758e9fbaSOystein Eftevaag if (r != TSS2_FAPI_RC_NO_HANDLE)
73*758e9fbaSOystein Eftevaag return_if_error(r, "Retrieving poll handles failed");
74*758e9fbaSOystein Eftevaag
75*758e9fbaSOystein Eftevaag /* Then we check for poll handles from ESYS operations. */
76*758e9fbaSOystein Eftevaag /* If we are running in none-TPM mode then we are already done trying. */
77*758e9fbaSOystein Eftevaag return_if_null(context->esys, "No non-TPM based poll handles found.",
78*758e9fbaSOystein Eftevaag TSS2_FAPI_RC_NO_HANDLE);
79*758e9fbaSOystein Eftevaag
80*758e9fbaSOystein Eftevaag /* Retrieve the actual poll handles from ESYS. */
81*758e9fbaSOystein Eftevaag r = Esys_GetPollHandles(context->esys, handles, num_handles);
82*758e9fbaSOystein Eftevaag if (r) {
83*758e9fbaSOystein Eftevaag LOG_DEBUG("Returning TSS2_FAPI_RC_NO_HANDLE");
84*758e9fbaSOystein Eftevaag return TSS2_FAPI_RC_NO_HANDLE;
85*758e9fbaSOystein Eftevaag }
86*758e9fbaSOystein Eftevaag
87*758e9fbaSOystein Eftevaag LOG_DEBUG("Returning %zi ESYS poll handles.", *num_handles);
88*758e9fbaSOystein Eftevaag LOG_TRACE("finished");
89*758e9fbaSOystein Eftevaag return r;
90*758e9fbaSOystein Eftevaag }
91