mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-05-20 22:30:39 +00:00
DM: Add support for virtual TPM enabling
Support TPM enable option when launch UOS. New option: "--vtpm sock_path=$PATH_OF_SWTPM_SOCKET". If valid option parsed, then init virtual tpm device. Tracked-On: #1924 Signed-off-by: Qi Yadong <yadong.qi@intel.com> Reviewed-by: Zhu Bing <bing.zhu@intel.com> Reviewed-by: Jason Chen CJ <jason.cj.chen@intel.com> Acked-by: Yin Fengwei <fengwei.yin@intel.com>
This commit is contained in:
parent
7df90a2527
commit
aae70db6b9
@ -84,6 +84,7 @@ SRCS += hw/platform/rpmb/rpmb_sim.c
|
||||
SRCS += hw/platform/rpmb/rpmb_backend.c
|
||||
SRCS += hw/platform/tpm/tpm_emulator.c
|
||||
SRCS += hw/platform/tpm/tpm_crb.c
|
||||
SRCS += hw/platform/tpm/tpm.c
|
||||
SRCS += hw/platform/debugexit.c
|
||||
SRCS += hw/pci/wdt_i6300esb.c
|
||||
SRCS += hw/pci/lpc.c
|
||||
|
@ -64,6 +64,7 @@
|
||||
#include "atomic.h"
|
||||
#include "vmcfg_config.h"
|
||||
#include "vmcfg.h"
|
||||
#include "tpm.h"
|
||||
|
||||
#define GUEST_NIO_PORT 0x488 /* guest upcalls via i/o port */
|
||||
|
||||
@ -157,6 +158,7 @@ usage(int code)
|
||||
" --ptdev_no_reset: disable reset check for ptdev\n"
|
||||
" --debugexit: enable debug exit function\n"
|
||||
" --intr_monitor: enable interrupt storm monitor\n"
|
||||
" --vtpm2: Virtual TPM2 args: sock_path=$PATH_OF_SWTPM_SOCKET\n"
|
||||
"............its params: threshold/s,probe-period(s),delay_time(ms),delay_duration(ms)\n",
|
||||
progname, (int)strlen(progname), "", (int)strlen(progname), "",
|
||||
(int)strlen(progname), "");
|
||||
@ -446,6 +448,8 @@ vm_init_vdevs(struct vmctx *ctx)
|
||||
if (ret < 0)
|
||||
goto pci_fail;
|
||||
|
||||
init_vtpm2(ctx);
|
||||
|
||||
return 0;
|
||||
|
||||
pci_fail:
|
||||
@ -480,6 +484,7 @@ vm_deinit_vdevs(struct vmctx *ctx)
|
||||
atkbdc_deinit(ctx);
|
||||
pci_irq_deinit(ctx);
|
||||
ioapic_deinit();
|
||||
deinit_vtpm2(ctx);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -703,6 +708,7 @@ enum {
|
||||
CMD_OPT_VMCFG,
|
||||
CMD_OPT_DUMP,
|
||||
CMD_OPT_INTR_MONITOR,
|
||||
CMD_OPT_VTPM2,
|
||||
};
|
||||
|
||||
static struct option long_options[] = {
|
||||
@ -737,6 +743,7 @@ static struct option long_options[] = {
|
||||
CMD_OPT_PTDEV_NO_RESET},
|
||||
{"debugexit", no_argument, 0, CMD_OPT_DEBUGEXIT},
|
||||
{"intr_monitor", required_argument, 0, CMD_OPT_INTR_MONITOR},
|
||||
{"vtpm2", required_argument, 0, CMD_OPT_VTPM2},
|
||||
{0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
@ -860,6 +867,11 @@ dm_run(int argc, char *argv[])
|
||||
break;
|
||||
case CMD_OPT_DEBUGEXIT:
|
||||
debugexit_enabled = true;
|
||||
case CMD_OPT_VTPM2:
|
||||
if (acrn_parse_vtpm2(optarg) != 0) {
|
||||
errx(EX_USAGE, "invalid vtpm2 param %s", optarg);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case CMD_OPT_INTR_MONITOR:
|
||||
if (acrn_parse_intr_monitor(optarg) != 0) {
|
||||
|
83
devicemodel/hw/platform/tpm/tpm.c
Normal file
83
devicemodel/hw/platform/tpm/tpm.c
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "vmmapi.h"
|
||||
#include "tpm.h"
|
||||
#include "tpm_internal.h"
|
||||
|
||||
static int tpm_debug;
|
||||
#define LOG_TAG "tpm: "
|
||||
#define DPRINTF(fmt, args...) \
|
||||
do { if (tpm_debug) printf(LOG_TAG "%s:" fmt, __func__, ##args); } while (0)
|
||||
#define WPRINTF(fmt, args...) \
|
||||
do { printf(LOG_TAG "%s:" fmt, __func__, ##args); } while (0)
|
||||
|
||||
#define STR_MAX_LEN 1024U
|
||||
static char *sock_path = NULL;
|
||||
|
||||
enum {
|
||||
SOCK_PATH_OPT = 0
|
||||
};
|
||||
|
||||
char *const token[] = {
|
||||
[SOCK_PATH_OPT] = "sock_path",
|
||||
NULL
|
||||
};
|
||||
|
||||
int acrn_parse_vtpm2(char *arg)
|
||||
{
|
||||
char *value;
|
||||
size_t len = strlen(arg);
|
||||
|
||||
if (len > STR_MAX_LEN)
|
||||
return -1;
|
||||
|
||||
if (SOCK_PATH_OPT == getsubopt(&arg, token, &value)) {
|
||||
if (value == NULL) {
|
||||
DPRINTF("Invalid vtpm socket path\n");
|
||||
return -1;
|
||||
}
|
||||
sock_path = calloc(len + 1, 1);
|
||||
if (!sock_path)
|
||||
return -1;
|
||||
strcpy(sock_path, value);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void init_vtpm2(struct vmctx *ctx)
|
||||
{
|
||||
if (!sock_path) {
|
||||
WPRINTF("Invalid socket path!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (init_tpm_emulator(sock_path) < 0) {
|
||||
WPRINTF("Failed init tpm emulator!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (init_tpm_crb(ctx) < 0) {
|
||||
WPRINTF("Failed init tpm emulator!\n");
|
||||
}
|
||||
}
|
||||
|
||||
void deinit_vtpm2(struct vmctx *ctx)
|
||||
{
|
||||
if (ctx->tpm_dev) {
|
||||
deinit_tpm_crb(ctx);
|
||||
|
||||
deinit_tpm_emulator();
|
||||
}
|
||||
}
|
@ -39,4 +39,14 @@ enum {
|
||||
#define TPM_CRB_REG_SIZE ((CRB_DATA_BUFFER) - (TPM_CRB_MMIO_ADDR))
|
||||
#define TPM_CRB_DATA_BUFFER_SIZE ((TPM_CRB_MMIO_SIZE) - (TPM_CRB_REG_SIZE))
|
||||
|
||||
/* APIs by tpm.c */
|
||||
/* Initialize Virtual TPM2 */
|
||||
void init_vtpm2(struct vmctx *ctx);
|
||||
|
||||
/* Deinitialize Virtual TPM2 */
|
||||
void deinit_vtpm2(struct vmctx *ctx);
|
||||
|
||||
/* Parse Virtual TPM option from command line */
|
||||
int acrn_parse_vtpm2(char *arg);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user