mirror of https://gitee.com/openkylin/qemu.git
Merge tpm 2018/10/29 v2
-----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJb2M/IAAoJEHWtZYAqC0IRu5AIAKR7lDJ9nPDqoCOvc4hAY6TV Zd986geEGiwrsFJ/CXbXXMsM7aUP+Qq717wekkZFghjtsfG83S+JWROZo2b8AUsI Atq0T/G6BLWFvdzW6sCtfo8zCrhj3EFJpFWTYCIrNHDB6rs1R9bbuR/Bt2h7tpDh CAmUkbumVUvanG4oklaRrwWfN7GksVhxAqX41PHaJAACww6UkNLzkWDJ5eQswvG6 nzEtWGQU41FqdcL+5E7nH6IEEGb4MnTkAftIab5Phr+lMWnd3mN0/tiY0wgVCDbP OGBxOiPDxRbO4m7EH9iigFL+Xz3eZz3m6mnjmD+Ss29JkROF4Rn1E5FuJIDxiic= =SyrU -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2018-10-29-2' into staging Merge tpm 2018/10/29 v2 # gpg: Signature made Tue 30 Oct 2018 21:40:24 GMT # gpg: using RSA key 75AD65802A0B4211 # gpg: Good signature from "Stefan Berger <stefanb@linux.vnet.ibm.com>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: B818 B9CA DF90 89C2 D5CE C66B 75AD 6580 2A0B 4211 * remotes/stefanberger/tags/pull-tpm-2018-10-29-2: tpm: Zero-init structure to avoid uninitialized variables in valgrind log MAINTAINERS: Change my email address to the new domain docs: tpm: Mention implemented TPM CRB interface emulation and specs tests/tpm: Display if swtpm is not found or --tpm2 not supported tests/tpm: fix tpm_util_swtpm_has_tpm2() Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
8002fa2bf6
|
@ -1796,7 +1796,7 @@ F: docs/devel/tracing.txt
|
|||
T: git git://github.com/stefanha/qemu.git tracing
|
||||
|
||||
TPM
|
||||
M: Stefan Berger <stefanb@linux.vnet.ibm.com>
|
||||
M: Stefan Berger <stefanb@linux.ibm.com>
|
||||
S: Maintained
|
||||
F: tpm.c
|
||||
F: stubs/tpm.c
|
||||
|
|
|
@ -20,6 +20,21 @@ QEMU files related to TPM TIS interface:
|
|||
- hw/tpm/tpm_tis.h
|
||||
|
||||
|
||||
QEMU also implements a TPM CRB interface following the Trusted Computing
|
||||
Group's specification "TCG PC Client Platform TPM Profile (PTP)
|
||||
Specification", Family "2.0", Level 00 Revision 01.03 v22, May 22, 2017.
|
||||
This specification, or a later version of it, can be accessed from the
|
||||
following URL:
|
||||
|
||||
https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profile-ptp-specification/
|
||||
|
||||
The CRB interface makes a memory mapped IO region in the area 0xfed40000 -
|
||||
0xfed40fff (1 locality) available to the guest operating system.
|
||||
|
||||
QEMU files related to TPM CRB interface:
|
||||
- hw/tpm/tpm_crb.c
|
||||
|
||||
|
||||
= ACPI Interface =
|
||||
|
||||
The TPM device is defined with ACPI ID "PNP0C31". QEMU builds a SSDT and passes
|
||||
|
|
|
@ -166,6 +166,7 @@ static int tpm_emulator_set_locality(TPMEmulator *tpm_emu, uint8_t locty_number,
|
|||
|
||||
trace_tpm_emulator_set_locality(locty_number);
|
||||
|
||||
memset(&loc, 0, sizeof(loc));
|
||||
loc.u.req.loc = locty_number;
|
||||
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_SET_LOCALITY, &loc,
|
||||
sizeof(loc), sizeof(loc)) < 0) {
|
||||
|
|
|
@ -18,6 +18,17 @@
|
|||
#include "libqtest.h"
|
||||
#include "tpm-tests.h"
|
||||
|
||||
static bool
|
||||
tpm_test_swtpm_skip(void)
|
||||
{
|
||||
if (!tpm_util_swtpm_has_tpm2()) {
|
||||
fprintf(stderr, "swtpm not in PATH or missing --tpm2 support; ");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx,
|
||||
const char *ifmodel)
|
||||
{
|
||||
|
@ -28,12 +39,13 @@ void tpm_test_swtpm_test(const char *src_tpm_path, tx_func *tx,
|
|||
GPid swtpm_pid;
|
||||
GError *error = NULL;
|
||||
|
||||
succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error);
|
||||
/* succ may be false if swtpm is not available */
|
||||
if (!succ) {
|
||||
if (tpm_test_swtpm_skip()) {
|
||||
return;
|
||||
}
|
||||
|
||||
succ = tpm_util_swtpm_start(src_tpm_path, &swtpm_pid, &addr, &error);
|
||||
g_assert_true(succ);
|
||||
|
||||
args = g_strdup_printf(
|
||||
"-chardev socket,id=chr,path=%s "
|
||||
"-tpmdev emulator,id=dev,chardev=chr "
|
||||
|
@ -74,19 +86,17 @@ void tpm_test_swtpm_migration_test(const char *src_tpm_path,
|
|||
GError *error = NULL;
|
||||
QTestState *src_qemu, *dst_qemu;
|
||||
|
||||
succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid,
|
||||
&src_tpm_addr, &error);
|
||||
/* succ may be false if swtpm is not available */
|
||||
if (!succ) {
|
||||
if (tpm_test_swtpm_skip()) {
|
||||
return;
|
||||
}
|
||||
|
||||
succ = tpm_util_swtpm_start(src_tpm_path, &src_tpm_pid,
|
||||
&src_tpm_addr, &error);
|
||||
g_assert_true(succ);
|
||||
|
||||
succ = tpm_util_swtpm_start(dst_tpm_path, &dst_tpm_pid,
|
||||
&dst_tpm_addr, &error);
|
||||
/* succ may be false if swtpm is not available */
|
||||
if (!succ) {
|
||||
goto err_src_tpm_kill;
|
||||
}
|
||||
g_assert_true(succ);
|
||||
|
||||
tpm_util_migration_start_qemu(&src_qemu, &dst_qemu,
|
||||
src_tpm_addr, dst_tpm_addr, uri,
|
||||
|
@ -118,7 +128,6 @@ void tpm_test_swtpm_migration_test(const char *src_tpm_path,
|
|||
qapi_free_SocketAddress(dst_tpm_addr);
|
||||
}
|
||||
|
||||
err_src_tpm_kill:
|
||||
tpm_util_swtpm_kill(src_tpm_pid);
|
||||
if (src_tpm_addr) {
|
||||
g_unlink(src_tpm_addr->u.q_unix.path);
|
||||
|
|
|
@ -145,39 +145,33 @@ void tpm_util_pcrread(QTestState *s, tx_func *tx,
|
|||
g_assert_cmpmem(buffer, exp_resp_size, exp_resp, exp_resp_size);
|
||||
}
|
||||
|
||||
static gboolean tpm_util_swtpm_has_tpm2(void)
|
||||
bool tpm_util_swtpm_has_tpm2(void)
|
||||
{
|
||||
gint mystdout;
|
||||
gboolean succ;
|
||||
unsigned i;
|
||||
char buffer[10240];
|
||||
ssize_t n;
|
||||
gchar *swtpm_argv[] = {
|
||||
g_strdup("swtpm"), g_strdup("socket"), g_strdup("--help"), NULL
|
||||
bool has_tpm2 = false;
|
||||
char *out = NULL;
|
||||
static const char *argv[] = {
|
||||
"swtpm", "socket", "--help", NULL
|
||||
};
|
||||
|
||||
succ = g_spawn_async_with_pipes(NULL, swtpm_argv, NULL,
|
||||
G_SPAWN_SEARCH_PATH, NULL, NULL, NULL,
|
||||
NULL, &mystdout, NULL, NULL);
|
||||
if (!succ) {
|
||||
goto cleanup;
|
||||
if (!g_spawn_sync(NULL /* working_dir */,
|
||||
(char **)argv,
|
||||
NULL /* envp */,
|
||||
G_SPAWN_SEARCH_PATH,
|
||||
NULL /* child_setup */,
|
||||
NULL /* user_data */,
|
||||
&out,
|
||||
NULL /* err */,
|
||||
NULL /* exit_status */,
|
||||
NULL)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
n = read(mystdout, buffer, sizeof(buffer) - 1);
|
||||
if (n < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
buffer[n] = 0;
|
||||
if (!strstr(buffer, "--tpm2")) {
|
||||
succ = false;
|
||||
if (strstr(out, "--tpm2")) {
|
||||
has_tpm2 = true;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
for (i = 0; swtpm_argv[i]; i++) {
|
||||
g_free(swtpm_argv[i]);
|
||||
}
|
||||
|
||||
return succ;
|
||||
g_free(out);
|
||||
return has_tpm2;
|
||||
}
|
||||
|
||||
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
||||
|
@ -196,11 +190,6 @@ gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
|||
gboolean succ;
|
||||
unsigned i;
|
||||
|
||||
succ = tpm_util_swtpm_has_tpm2();
|
||||
if (!succ) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
*addr = g_new0(SocketAddress, 1);
|
||||
(*addr)->type = SOCKET_ADDRESS_TYPE_UNIX;
|
||||
(*addr)->u.q_unix.path = g_build_filename(path, "sock", NULL);
|
||||
|
@ -208,7 +197,6 @@ gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
|||
succ = g_spawn_async(NULL, swtpm_argv, NULL, G_SPAWN_SEARCH_PATH,
|
||||
NULL, NULL, pid, error);
|
||||
|
||||
cleanup:
|
||||
for (i = 0; swtpm_argv[i]; i++) {
|
||||
g_free(swtpm_argv[i]);
|
||||
}
|
||||
|
|
|
@ -32,6 +32,8 @@ void tpm_util_pcrextend(QTestState *s, tx_func *tx);
|
|||
void tpm_util_pcrread(QTestState *s, tx_func *tx,
|
||||
const unsigned char *exp_resp, size_t exp_resp_size);
|
||||
|
||||
bool tpm_util_swtpm_has_tpm2(void);
|
||||
|
||||
gboolean tpm_util_swtpm_start(const char *path, GPid *pid,
|
||||
SocketAddress **addr, GError **error);
|
||||
void tpm_util_swtpm_kill(GPid pid);
|
||||
|
|
Loading…
Reference in New Issue