Skip to content

Commit

Permalink
powerpc/pseries: fix plpks_read_var() code for different consumers
Browse files Browse the repository at this point in the history
Even though plpks_read_var() is currently called to read variables
owned by different consumers, it internally supports only OS consumer.

Fix plpks_read_var() to handle different consumers correctly.

Fixes: 2454a7a ("powerpc/pseries: define driver for Platform KeyStore")
Signed-off-by: Nayna Jain <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
naynajain authored and mpe committed Nov 24, 2022
1 parent 212dd5c commit 1f622f3
Showing 1 changed file with 18 additions and 10 deletions.
28 changes: 18 additions & 10 deletions arch/powerpc/platforms/pseries/plpks.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,22 +354,24 @@ static int plpks_read_var(u8 consumer, struct plpks_var *var)
{
unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
struct plpks_auth *auth;
struct label *label;
struct label *label = NULL;
u8 *output;
int rc;

if (var->namelen > MAX_NAME_SIZE)
return -EINVAL;

auth = construct_auth(PKS_OS_OWNER);
auth = construct_auth(consumer);
if (IS_ERR(auth))
return PTR_ERR(auth);

label = construct_label(var->component, var->os, var->name,
var->namelen);
if (IS_ERR(label)) {
rc = PTR_ERR(label);
goto out_free_auth;
if (consumer == PKS_OS_OWNER) {
label = construct_label(var->component, var->os, var->name,
var->namelen);
if (IS_ERR(label)) {
rc = PTR_ERR(label);
goto out_free_auth;
}
}

output = kzalloc(maxobjsize, GFP_KERNEL);
Expand All @@ -378,9 +380,15 @@ static int plpks_read_var(u8 consumer, struct plpks_var *var)
goto out_free_label;
}

rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
virt_to_phys(label), label->size, virt_to_phys(output),
maxobjsize);
if (consumer == PKS_OS_OWNER)
rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
virt_to_phys(label), label->size, virt_to_phys(output),
maxobjsize);
else
rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
virt_to_phys(var->name), var->namelen, virt_to_phys(output),
maxobjsize);


if (rc != H_SUCCESS) {
rc = pseries_status_to_err(rc);
Expand Down

0 comments on commit 1f622f3

Please sign in to comment.