mirror of
				https://github.com/projectacrn/acrn-hypervisor.git
				synced 2025-10-31 01:09:28 +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:
		| @@ -84,6 +84,7 @@ SRCS += hw/platform/rpmb/rpmb_sim.c | |||||||
| SRCS += hw/platform/rpmb/rpmb_backend.c | SRCS += hw/platform/rpmb/rpmb_backend.c | ||||||
| SRCS += hw/platform/tpm/tpm_emulator.c | SRCS += hw/platform/tpm/tpm_emulator.c | ||||||
| SRCS += hw/platform/tpm/tpm_crb.c | SRCS += hw/platform/tpm/tpm_crb.c | ||||||
|  | SRCS += hw/platform/tpm/tpm.c | ||||||
| SRCS += hw/platform/debugexit.c | SRCS += hw/platform/debugexit.c | ||||||
| SRCS += hw/pci/wdt_i6300esb.c | SRCS += hw/pci/wdt_i6300esb.c | ||||||
| SRCS += hw/pci/lpc.c | SRCS += hw/pci/lpc.c | ||||||
|   | |||||||
| @@ -64,6 +64,7 @@ | |||||||
| #include "atomic.h" | #include "atomic.h" | ||||||
| #include "vmcfg_config.h" | #include "vmcfg_config.h" | ||||||
| #include "vmcfg.h" | #include "vmcfg.h" | ||||||
|  | #include "tpm.h" | ||||||
|  |  | ||||||
| #define GUEST_NIO_PORT		0x488	/* guest upcalls via i/o port */ | #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" | 		"       --ptdev_no_reset: disable reset check for ptdev\n" | ||||||
| 		"       --debugexit: enable debug exit function\n" | 		"       --debugexit: enable debug exit function\n" | ||||||
| 		"       --intr_monitor: enable interrupt storm monitor\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", | 		"............its params: threshold/s,probe-period(s),delay_time(ms),delay_duration(ms)\n", | ||||||
| 		progname, (int)strlen(progname), "", (int)strlen(progname), "", | 		progname, (int)strlen(progname), "", (int)strlen(progname), "", | ||||||
| 		(int)strlen(progname), ""); | 		(int)strlen(progname), ""); | ||||||
| @@ -446,6 +448,8 @@ vm_init_vdevs(struct vmctx *ctx) | |||||||
| 	if (ret < 0) | 	if (ret < 0) | ||||||
| 		goto pci_fail; | 		goto pci_fail; | ||||||
|  |  | ||||||
|  | 	init_vtpm2(ctx); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
| pci_fail: | pci_fail: | ||||||
| @@ -480,6 +484,7 @@ vm_deinit_vdevs(struct vmctx *ctx) | |||||||
| 	atkbdc_deinit(ctx); | 	atkbdc_deinit(ctx); | ||||||
| 	pci_irq_deinit(ctx); | 	pci_irq_deinit(ctx); | ||||||
| 	ioapic_deinit(); | 	ioapic_deinit(); | ||||||
|  | 	deinit_vtpm2(ctx); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| @@ -703,6 +708,7 @@ enum { | |||||||
| 	CMD_OPT_VMCFG, | 	CMD_OPT_VMCFG, | ||||||
| 	CMD_OPT_DUMP, | 	CMD_OPT_DUMP, | ||||||
| 	CMD_OPT_INTR_MONITOR, | 	CMD_OPT_INTR_MONITOR, | ||||||
|  | 	CMD_OPT_VTPM2, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static struct option long_options[] = { | static struct option long_options[] = { | ||||||
| @@ -737,6 +743,7 @@ static struct option long_options[] = { | |||||||
| 		CMD_OPT_PTDEV_NO_RESET}, | 		CMD_OPT_PTDEV_NO_RESET}, | ||||||
| 	{"debugexit",		no_argument,		0, CMD_OPT_DEBUGEXIT}, | 	{"debugexit",		no_argument,		0, CMD_OPT_DEBUGEXIT}, | ||||||
| 	{"intr_monitor",	required_argument,	0, CMD_OPT_INTR_MONITOR}, | 	{"intr_monitor",	required_argument,	0, CMD_OPT_INTR_MONITOR}, | ||||||
|  | 	{"vtpm2",		required_argument,	0, CMD_OPT_VTPM2}, | ||||||
| 	{0,			0,			0,  0  }, | 	{0,			0,			0,  0  }, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -860,6 +867,11 @@ dm_run(int argc, char *argv[]) | |||||||
| 			break; | 			break; | ||||||
| 		case CMD_OPT_DEBUGEXIT: | 		case CMD_OPT_DEBUGEXIT: | ||||||
| 			debugexit_enabled = true; | 			debugexit_enabled = true; | ||||||
|  | 		case CMD_OPT_VTPM2: | ||||||
|  | 			if (acrn_parse_vtpm2(optarg) != 0) { | ||||||
|  | 				errx(EX_USAGE, "invalid vtpm2 param %s", optarg); | ||||||
|  | 				exit(1); | ||||||
|  | 			} | ||||||
| 			break; | 			break; | ||||||
| 		case CMD_OPT_INTR_MONITOR: | 		case CMD_OPT_INTR_MONITOR: | ||||||
| 			if (acrn_parse_intr_monitor(optarg) != 0) { | 			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_REG_SIZE ((CRB_DATA_BUFFER) - (TPM_CRB_MMIO_ADDR)) | ||||||
| #define TPM_CRB_DATA_BUFFER_SIZE ((TPM_CRB_MMIO_SIZE) - (TPM_CRB_REG_SIZE)) | #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 | #endif | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user