This patch adds support for TPM command line options. The command line options supported here are ./qemu-... -tpmdev passthrough,path=<path to TPM device>,id=<id> -device tpm-tis,tpmdev=<id>,id=<other id> and ./qemu-... -tpmdev help where the latter works similar to -soundhw help and shows a list of available TPM backends (for example 'passthrough'). Using the type parameter, the backend is chosen, i.e., 'passthrough' for the passthrough driver. The interpretation of the other parameters along with determining whether enough parameters were provided is pushed into the backend driver, which needs to implement the interface function 'create' and return a TPMDriverOpts structure if the VM can be started or 'NULL' if not enough or bad parameters were provided. Monitor support for 'info tpm' has been added. It for example prints the following: (qemu) info tpm TPM devices: tpm0: model=tpm-tis \ tpm0: type=passthrough,path=/dev/tpm0,cancel-path=/sys/devices/pnp0/00:09/cancel Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Reviewed-by: Corey Bryant <coreyb@linux.vnet.ibm.com> Reviewed-by: Joel Schopp <jschopp@linux.vnet.ibm.com> Message-id: 1361987275-26289-2-git-send-email-stefanb@linux.vnet.ibm.com Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
84 lines
2 KiB
C
84 lines
2 KiB
C
/*
|
|
* TPM configuration
|
|
*
|
|
* Copyright (C) 2011-2013 IBM Corporation
|
|
*
|
|
* Authors:
|
|
* Stefan Berger <stefanb@us.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
#ifndef TPM_TPM_INT_H
|
|
#define TPM_TPM_INT_H
|
|
|
|
#include "exec/memory.h"
|
|
#include "tpm/tpm_tis.h"
|
|
|
|
struct TPMDriverOps;
|
|
typedef struct TPMDriverOps TPMDriverOps;
|
|
|
|
typedef struct TPMBackend {
|
|
char *id;
|
|
enum TpmModel fe_model;
|
|
char *path;
|
|
char *cancel_path;
|
|
const TPMDriverOps *ops;
|
|
|
|
QLIST_ENTRY(TPMBackend) list;
|
|
} TPMBackend;
|
|
|
|
/* overall state of the TPM interface */
|
|
typedef struct TPMState {
|
|
ISADevice busdev;
|
|
MemoryRegion mmio;
|
|
|
|
union {
|
|
TPMTISEmuState tis;
|
|
} s;
|
|
|
|
uint8_t locty_number;
|
|
TPMLocality *locty_data;
|
|
|
|
char *backend;
|
|
TPMBackend *be_driver;
|
|
} TPMState;
|
|
|
|
#define TPM(obj) OBJECT_CHECK(TPMState, (obj), TYPE_TPM_TIS)
|
|
|
|
typedef void (TPMRecvDataCB)(TPMState *, uint8_t locty);
|
|
|
|
struct TPMDriverOps {
|
|
enum TpmType type;
|
|
/* get a descriptive text of the backend to display to the user */
|
|
const char *(*desc)(void);
|
|
|
|
TPMBackend *(*create)(QemuOpts *opts, const char *id);
|
|
void (*destroy)(TPMBackend *t);
|
|
|
|
/* initialize the backend */
|
|
int (*init)(TPMBackend *t, TPMState *s, TPMRecvDataCB *datacb);
|
|
/* start up the TPM on the backend */
|
|
int (*startup_tpm)(TPMBackend *t);
|
|
/* returns true if nothing will ever answer TPM requests */
|
|
bool (*had_startup_error)(TPMBackend *t);
|
|
|
|
size_t (*realloc_buffer)(TPMSizedBuffer *sb);
|
|
|
|
void (*deliver_request)(TPMBackend *t);
|
|
|
|
void (*reset)(TPMBackend *t);
|
|
|
|
void (*cancel_cmd)(TPMBackend *t);
|
|
|
|
bool (*get_tpm_established_flag)(TPMBackend *t);
|
|
};
|
|
|
|
TPMBackend *qemu_find_tpm(const char *id);
|
|
int tpm_register_model(enum TpmModel model);
|
|
int tpm_register_driver(const TPMDriverOps *tdo);
|
|
void tpm_display_backend_drivers(void);
|
|
const TPMDriverOps *tpm_get_backend_driver(const char *type);
|
|
|
|
#endif /* TPM_TPM_INT_H */
|