TPM: fix transmit_cmd error logic

It's incorrect to assume that buffers returned by the TPM
10 bytes long are always error reports. This patches
parses the error field in its header instead. The error report
is now being printed using dev_err() instead of dev_dbg(), making
it easier for users to provide more detailed bug reports.

Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com>
This commit is contained in:
Rajiv Andrade 2011-11-01 17:00:52 -02:00
Родитель 2f592f2a7d
Коммит b9e3238aa3
3 изменённых файлов: 9 добавлений и 10 удалений

Просмотреть файл

@ -438,7 +438,6 @@ out:
} }
#define TPM_DIGEST_SIZE 20 #define TPM_DIGEST_SIZE 20
#define TPM_ERROR_SIZE 10
#define TPM_RET_CODE_IDX 6 #define TPM_RET_CODE_IDX 6
enum tpm_capabilities { enum tpm_capabilities {
@ -467,12 +466,14 @@ static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
len = tpm_transmit(chip,(u8 *) cmd, len); len = tpm_transmit(chip,(u8 *) cmd, len);
if (len < 0) if (len < 0)
return len; return len;
if (len == TPM_ERROR_SIZE) { else if (len < TPM_HEADER_SIZE)
return -EFAULT;
err = be32_to_cpu(cmd->header.out.return_code); err = be32_to_cpu(cmd->header.out.return_code);
dev_dbg(chip->dev, "A TPM error (%d) occurred %s\n", err, desc); if (err != 0)
dev_err(chip->dev, "A TPM error (%d) occurred %s\n", err, desc);
return err; return err;
}
return 0;
} }
#define TPM_INTERNAL_RESULT_SIZE 200 #define TPM_INTERNAL_RESULT_SIZE 200

Просмотреть файл

@ -39,7 +39,7 @@ enum tpm_addr {
}; };
#define TPM_WARN_DOING_SELFTEST 0x802 #define TPM_WARN_DOING_SELFTEST 0x802
#define TPM_HEADER_SIZE 10
extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr, extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
char *); char *);
extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr, extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,

Просмотреть файл

@ -29,8 +29,6 @@
#include <linux/freezer.h> #include <linux/freezer.h>
#include "tpm.h" #include "tpm.h"
#define TPM_HEADER_SIZE 10
enum tis_access { enum tis_access {
TPM_ACCESS_VALID = 0x80, TPM_ACCESS_VALID = 0x80,
TPM_ACCESS_ACTIVE_LOCALITY = 0x20, TPM_ACCESS_ACTIVE_LOCALITY = 0x20,