dm: add option "lapic_pt" to create VM for realtime scenarios

New option "--lapic_pt" added to create VM with local apic passthrough, for
realtime scenarios.
When the option is set, a VM is created with LAPIC_PASSTHROUGH.
The option is not set by default.

Tracked-On: #2351
Signed-off-by: Yan, Like <like.yan@intel.com>
Acked-by: Eddie Dong <eddie.dong@intel.com>
Acked-by: Anthony Xu <anthony.xu@intel.com>
This commit is contained in:
Yan, Like 2019-01-22 17:00:13 +08:00 committed by wenlingz
parent 8925da64d9
commit c873d60ae2
3 changed files with 18 additions and 2 deletions

View File

@ -171,7 +171,8 @@ usage(int code)
" --intr_monitor: enable interrupt storm monitor\n" " --intr_monitor: enable interrupt storm monitor\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"
" --virtio_poll: enable virtio poll mode with poll interval with ns\n" " --virtio_poll: enable virtio poll mode with poll interval with ns\n"
" --vtpm2: Virtual TPM2 args: sock_path=$PATH_OF_SWTPM_SOCKET\n", " --vtpm2: Virtual TPM2 args: sock_path=$PATH_OF_SWTPM_SOCKET\n"
" --lapic_pt: enable local apic passthrough\n",
progname, (int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), "", progname, (int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), "",
(int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), "",
(int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), ""); (int)strnlen(progname, PATH_MAX), "", (int)strnlen(progname, PATH_MAX), "");
@ -706,6 +707,7 @@ enum {
CMD_OPT_DUMP, CMD_OPT_DUMP,
CMD_OPT_INTR_MONITOR, CMD_OPT_INTR_MONITOR,
CMD_OPT_VTPM2, CMD_OPT_VTPM2,
CMD_OPT_LAPIC_PT,
}; };
static struct option long_options[] = { static struct option long_options[] = {
@ -744,6 +746,7 @@ static struct option long_options[] = {
{"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}, {"vtpm2", required_argument, 0, CMD_OPT_VTPM2},
{"lapic_pt", no_argument, 0, CMD_OPT_LAPIC_PT},
{0, 0, 0, 0 }, {0, 0, 0, 0 },
}; };
@ -887,6 +890,9 @@ dm_run(int argc, char *argv[])
case CMD_OPT_DEBUGEXIT: case CMD_OPT_DEBUGEXIT:
debugexit_enabled = true; debugexit_enabled = true;
break; break;
case CMD_OPT_LAPIC_PT:
lapic_pt = true;
break;
case CMD_OPT_VTPM2: case CMD_OPT_VTPM2:
if (acrn_parse_vtpm2(optarg) != 0) { if (acrn_parse_vtpm2(optarg) != 0) {
errx(EX_USAGE, "invalid vtpm2 param %s", optarg); errx(EX_USAGE, "invalid vtpm2 param %s", optarg);

View File

@ -138,6 +138,14 @@ vm_create(const char *name, uint64_t req_buf)
else else
create_vm.vm_flag &= (~SECURE_WORLD_ENABLED); create_vm.vm_flag &= (~SECURE_WORLD_ENABLED);
if (lapic_pt) {
create_vm.vm_flag |= LAPIC_PASSTHROUGH;
create_vm.vm_flag |= IOREQ_COMPLETION_POLLING;
} else {
create_vm.vm_flag &= (~LAPIC_PASSTHROUGH);
create_vm.vm_flag &= (~IOREQ_COMPLETION_POLLING);
}
create_vm.req_buf = req_buf; create_vm.req_buf = req_buf;
while (retry > 0) { while (retry > 0) {
error = ioctl(ctx->fd, IC_CREATE_VM, &create_vm); error = ioctl(ctx->fd, IC_CREATE_VM, &create_vm);

View File

@ -66,7 +66,9 @@
#endif #endif
/* Generic VM flags from guest OS */ /* Generic VM flags from guest OS */
#define SECURE_WORLD_ENABLED (1UL<<0) /* Whether secure world is enabled */ #define SECURE_WORLD_ENABLED (1UL << 0U) /* Whether secure world is enabled */
#define LAPIC_PASSTHROUGH (1UL << 1U) /* Whether LAPIC is passed through */
#define IOREQ_COMPLETION_POLLING (1UL << 2U) /* Whether need hypervisor poll IO completion */
/** /**
* @brief Hypercall * @brief Hypercall