[PATCH v2] efi_loader: Don't limit the StMM buffer size explicitly
Ilias Apalodimas
ilias.apalodimas at linaro.org
Sat Dec 25 20:35:11 CET 2021
On Sat, Dec 25, 2021 at 05:13:23PM +0100, Heinrich Schuchardt wrote:
> On 12/25/21 16:04, Ilias Apalodimas wrote:
> >
> >
> > On Sat, 25 Dec 2021, 16:28 Heinrich Schuchardt, <xypron.glpk at gmx.de
> > <mailto:xypron.glpk at gmx.de>> wrote:
> >
> >
> >
> > Am 25. Dezember 2021 12:16:29 MEZ schrieb Ilias Apalodimas
> > <ilias.apalodimas at linaro.org <mailto:ilias.apalodimas at linaro.org>>:
> > >> >
> > >[...]
> > >> > rc = tee_invoke_func(conn.tee, &arg, 2, param);
> > >> > tee_shm_free(shm);
> > >> > + /*
> > >> > + * Although the max payload is configurable on StMM, we
> > only share
> > >> > + * four pages from OP-TEE for the non-secure buffer used to
> > communicate
> > >> > + * with StMM. OP-TEE will reject anything bigger than that
> > and will
> > >> > + * return. So le'ts at least warn users
> > >> > + */
>
> The comment mentioning four pages does not make too much sense to me as
> both OP-TEE as well as U-Boot can be configured to other sizes.
>
> > >> > tee_close_session(conn.tee, conn.session);
> > >> > - if (rc || arg.ret != TEE_SUCCESS)
> > >> > + if (rc || arg.ret != TEE_SUCCESS) {
> > >>
> > >> tee_close_session(): Will arg.ret be valid if rc != 0?
> > >
> > >Depends when tee_invoke_func() failed. But why do we care?
> >
> > Should we write a message if rc !=0 && arg.ret == TEE_ERROR_EXCESS_DATA?
> >
> >
> > I don't think its needed. OPTEE will set that only if RC == 0
> >
> > Cheers
> > Ilias
> >
> >
> > >The connection needs to close regardless and we then have to
> > reason with
> > >the error.
> > >
> > >Regards
> > >/Ilias
>
> So how about:
>
> @@ -114,7 +113,11 @@ static efi_status_t optee_mm_communicate(void
> *comm_buf, ulong dsize)
> rc = tee_invoke_func(conn.tee, &arg, 2, param);
> tee_shm_free(shm);
> tee_close_session(conn.tee, conn.session);
> - if (rc || arg.ret != TEE_SUCCESS)
> + if (rc)
> + return EFI_DEVICE_ERROR;
> + if (arg.ret == TEE_ERROR_EXCESS_DATA)
> + log_err("Variable payload too large\n");
> + if (arg.ret != TEE_SUCCESS)
> return EFI_DEVICE_ERROR;
We just move the error reporting out of the inner if.
i.e
if (arg.ret == TEE_ERROR_EXCESS_DATA)
log_err("Variable payload too large\n");
if (rc || arg.ret != TEE_SUCCESS)
return EFI_DEVICE_ERROR;
Which looks better to me
Regards
/Ilias
>
> Best regards
>
> Heinrich
>
> > >>
> > >> > + if (arg.ret == TEE_ERROR_EXCESS_DATA)
> > >> > + log_err("Variable payload too large\n");
> > >> > return EFI_DEVICE_ERROR;
> > >> > + }
> > >> >
> > >> > switch (param[1].u.value.a) {
> > >> > case ARM_SVC_SPM_RET_SUCCESS:
> > >> > @@ -255,15 +263,6 @@ efi_status_t EFIAPI
> > get_max_payload(efi_uintn_t *size)
> > >> > goto out;
> > >> > }
> > >> > *size = var_payload->size;
> > >> > - /*
> > >> > - * Although the max payload is configurable on StMM, we
> > only share a
> > >> > - * single page from OP-TEE for the non-secure buffer used
> > to communicate
> > >> > - * with StMM. Since OP-TEE will reject to map anything
> > bigger than that,
> > >> > - * make sure we are in bounds.
> > >> > - */
> > >> > - if (*size > OPTEE_PAGE_SIZE)
> > >> > - *size = OPTEE_PAGE_SIZE - MM_COMMUNICATE_HEADER_SIZE -
> > >> > - MM_VARIABLE_COMMUNICATE_SIZE;
> > >> > /*
> > >> > * There seems to be a bug in EDK2 miscalculating the
> > boundaries and
> > >> > * size checks, so deduct 2 more bytes to fulfill this
> > requirement. Fix
> > >>
> >
>
More information about the U-Boot
mailing list