Re: [PATCH v14 06/23] x86/virt/tdx: Add SEAMCALL error printing for module initialization

From: Huang, Kai
Date: Wed Oct 18 2023 - 02:27:31 EST



> >
> > +typedef void (*sc_err_func_t)(u64 fn, u64 err, struct tdx_module_args *args);
> > +
> > +static inline void seamcall_err(u64 fn, u64 err, struct tdx_module_args *args)
> > +{
> > + pr_err("SEAMCALL (0x%llx) failed: 0x%llx\n", fn, err);
> > +}
> > +
>
> Why pass args here?

It needs to be sc_err_func_t so that it can be used by the common code
sc_retry_prerr() below.

>
> > +static inline void seamcall_err_ret(u64 fn, u64 err,
> > + struct tdx_module_args *args)
> > +{
> > + seamcall_err(fn, err, args);
> > + pr_err("RCX 0x%llx RDX 0x%llx R8 0x%llx R9 0x%llx R10 0x%llx R11 0x%llx\n",
> > + args->rcx, args->rdx, args->r8, args->r9,
> > + args->r10, args->r11);
> > +}
> > +
> > +static inline void seamcall_err_saved_ret(u64 fn, u64 err,
> > + struct tdx_module_args *args)
> > +{
> > + seamcall_err_ret(fn, err, args);
> > + pr_err("RBX 0x%llx RDI 0x%llx RSI 0x%llx R12 0x%llx R13 0x%llx R14 0x%llx R15 0x%llx\n",
> > + args->rbx, args->rdi, args->rsi, args->r12,
> > + args->r13, args->r14, args->r15);
> > +}
> > +
> > +static inline int sc_retry_prerr(sc_func_t func, sc_err_func_t err_func,
> > + u64 fn, struct tdx_module_args *args)
> > +{
> > + u64 sret = sc_retry(func, fn, args);
> > +
> > + if (sret == TDX_SUCCESS)
> > + return 0;
> > +
> > + if (sret == TDX_SEAMCALL_VMFAILINVALID)
> > + return -ENODEV;
> > +
> > + if (sret == TDX_SEAMCALL_GP)
> > + return -EOPNOTSUPP;
> > +
> > + if (sret == TDX_SEAMCALL_UD)
> > + return -EACCES;
> > +
> > + err_func(fn, sret, args);
> > + return -EIO;
> > +}
> > +
> > +#define seamcall_prerr(__fn, __args) \
> > + sc_retry_prerr(__seamcall, seamcall_err, (__fn), (__args))
> > +
> > +#define seamcall_prerr_ret(__fn, __args) \
> > + sc_retry_prerr(__seamcall_ret, seamcall_err_ret, (__fn), (__args))
> > +
> > static int __init record_keyid_partitioning(u32 *tdx_keyid_start,
> > u32 *nr_tdx_keyids)
> > {
>