On Mon, Aug 27, 2018 at 9:58 PM Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> wrote: > > From: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > > Add a function to perform ENCLS(EINIT), which initializes an enclave, > which can be used by a driver for running enclaves and VMMs. > > Writing the LE hash MSRs is extraordinarily expensive, e.g. 3-4x slower > than normal MSRs, so we use a per-cpu cache to track the last known value > of the MSRs to avoid unnecessarily writing the MSRs with the current value. > > Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > Co-developed-by: Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> > +int sgx_einit(struct sgx_sigstruct *sigstruct, struct sgx_einittoken *token, > + struct sgx_epc_page *secs_page, u64 lepubkeyhash[4]); This [4] doesn't make any sense in a C when used in function call parameter list. > +/* The cache for the last known values of IA32_SGXLEPUBKEYHASHx MSRs for each > + * CPU. The entries are initialized when they are first used by sgx_einit(). > + */ > +struct sgx_lepubkeyhash { > + u64 msrs[4]; 4 is MAGIC. > + u64 pm_cnt; > +}; > +int sgx_einit(struct sgx_sigstruct *sigstruct, struct sgx_einittoken *token, > + struct sgx_epc_page *secs_page, u64 lepubkeyhash[4]) Same two comments about [4]. > +{ > + cache = per_cpu(sgx_lepubkeyhash_cache, smp_processor_id()); > + if (!cache) { How often it's being expected to happen? > + cache = kzalloc(sizeof(struct sgx_lepubkeyhash), GFP_KERNEL); > + if (!cache) > + return -ENOMEM; > + } > + for (i = 0; i < 4; i++) { Same MAGIC? > + } > +} -- With Best Regards, Andy Shevchenko