blob: 68f012a140415dd1b6f00ddf093f77d7d06be97a [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "result.h"
#include <base/stringprintf.h>
#include "tss/tss_error.h"
#include "tss/tss_error_basics.h"
namespace trunks {
bool Result::IsSuccess(TSS_RESULT return_code) {
return ((return_code & TSS_ERROR_MASK) == TSS_SUCCESS);
}
TSS_RESULT Result::TspResult(TSS_RESULT return_code) {
return (return_code & ~TSS_LAYER_MASK) | (TSS_LAYER_TSP);
}
TSS_RESULT Result::TcsResult(TSS_RESULT return_code) {
return (return_code & ~TSS_LAYER_MASK) | (TSS_LAYER_TCS);
}
TSS_RESULT Result::TddlResult(TSS_RESULT return_code) {
return (return_code & ~TSS_LAYER_MASK) | (TSS_LAYER_TDDL);
}
TSS_RESULT Result::TpmResult(TSS_RESULT return_code) {
return (return_code & ~TSS_LAYER_MASK) | (TSS_LAYER_TPM);
}
const char* Result::GetTextFromTable(TSS_RESULT return_code,
const ResultTablePair* table) {
while (table->text != NULL) {
if (return_code == table->code)
return table->text;
table++;
}
return NULL;
}
std::string Result::ToString(TSS_RESULT return_code) {
UINT32 subsystem_code = (return_code & TSS_LAYER_MASK) >> 12;
UINT32 error_code = (return_code & TSS_ERROR_MASK);
// Attempt to lookup subsystem-specific error message.
const char* error_message =
GetTextFromTable(error_code, kResultTable[subsystem_code].code_table);
// Fall back to generic error message (unless subsystem is TPM).
if (!error_message && subsystem_code != 0)
error_message = GetTextFromTable(error_code, kGenericCodeTable);
// Fall back to unknown error message.
if (!error_message)
error_message = "Unknown error.";
const char* subsystem_message;
if (subsystem_code > 3)
subsystem_message = "Unknown subsystem";
else
subsystem_message = kResultTable[subsystem_code].subsystem;
return StringPrintf("Error %08X: (%s) %s", return_code, subsystem_message,
error_message);
}
}