diff --git a/usr.sbin/bhyve/aarch64/bhyverun_machdep.c b/usr.sbin/bhyve/aarch64/bhyverun_machdep.c index 10018d082f7e..50b765eff64f 100644 --- a/usr.sbin/bhyve/aarch64/bhyverun_machdep.c +++ b/usr.sbin/bhyve/aarch64/bhyverun_machdep.c @@ -100,7 +100,8 @@ bhyve_usage(int code) "Usage: %s [-CDHhSW]\n" " %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n" " %*s [-k config_file] [-m mem] [-o var=value]\n" - " %*s [-p vcpu:hostcpu] [-r file] [-s pci] [-U uuid] vmname\n" + " %*s [-p vcpu:hostcpu] [-p vcpuN-vcpuM:hostcpuX-hostcpuY]\n" + " %*s [-r file] [-s pci] [-U uuid] vmname\n" " -C: include guest memory in core file\n" " -c: number of CPUs and/or topology specification\n" " -D: destroy on power-off\n" @@ -116,7 +117,7 @@ bhyve_usage(int code) " -U: UUID\n" " -W: force virtio to use single-vector MSI\n", progname, (int)strlen(progname), "", (int)strlen(progname), "", - (int)strlen(progname), ""); + (int)strlen(progname), "", (int)strlen(progname), ""); exit(code); } diff --git a/usr.sbin/bhyve/amd64/bhyverun_machdep.c b/usr.sbin/bhyve/amd64/bhyverun_machdep.c index 538d031fd1a4..32f99aedb7f2 100644 --- a/usr.sbin/bhyve/amd64/bhyverun_machdep.c +++ b/usr.sbin/bhyve/amd64/bhyverun_machdep.c @@ -78,7 +78,8 @@ bhyve_usage(int code) "Usage: %s [-aCDeHhPSuWwxY]\n" " %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n" " %*s [-G port] [-k config_file] [-l lpc] [-m mem] [-o var=value]\n" - " %*s [-p vcpu:hostcpu] [-r file] [-s pci] [-U uuid] vmname\n" + " %*s [-p vcpu:hostcpu] [-p vcpuN-vcpuM:hostcpuX-hostcpuY]\n" + " %*s [-r file] [-s pci] [-U uuid] vmname\n" " -a: local apic is in xAPIC mode (deprecated)\n" " -C: include guest memory in core file\n" " -c: number of CPUs and/or topology specification\n" @@ -108,7 +109,7 @@ bhyve_usage(int code) " -x: local APIC is in x2APIC mode\n" " -Y: disable MPtable generation\n", progname, (int)strlen(progname), "", (int)strlen(progname), "", - (int)strlen(progname), ""); + (int)strlen(progname), "", (int)strlen(progname), ""); exit(code); } diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c index 9db62972467c..9bde49f5039b 100644 --- a/usr.sbin/bhyve/bhyverun.c +++ b/usr.sbin/bhyve/bhyverun.c @@ -356,18 +356,12 @@ calc_topology(void) guest_ncpus = ncpus; } -int -bhyve_pincpu_parse(const char *opt) +static int +bhyve_pincpu(int vcpu, int pcpu) { const char *value; char *newval; char key[16]; - int vcpu, pcpu; - - if (sscanf(opt, "%d:%d", &vcpu, &pcpu) != 2) { - fprintf(stderr, "invalid format: %s\n", opt); - return (-1); - } if (vcpu < 0) { fprintf(stderr, "invalid vcpu '%d'\n", vcpu); @@ -394,6 +388,34 @@ bhyve_pincpu_parse(const char *opt) return (0); } +int +bhyve_pincpu_parse(const char *opt) +{ + int vcpu_first, vcpu_last, pcpu_first, pcpu_last; + int vcpu, pcpu; + + if (sscanf(opt, "%d-%d:%d-%d", &vcpu_first, &vcpu_last, &pcpu_first, &pcpu_last) == 4) { + if (vcpu_first > vcpu_last || pcpu_first > pcpu_last) { + fprintf(stderr, "invalid range (must be ascending): %s\n", opt); + return (-1); + } + if ((vcpu_last - vcpu_first) != (pcpu_last - pcpu_first)) { + fprintf(stderr, "range sizes do not match: %s\n", opt); + return (-1); + } + for (vcpu = vcpu_first, pcpu = pcpu_first; vcpu <= vcpu_last; vcpu++, pcpu++) + if (bhyve_pincpu(vcpu, pcpu) != 0) + return (-1); + return (0); + } + + if (sscanf(opt, "%d:%d", &vcpu, &pcpu) == 2) + return bhyve_pincpu(vcpu, pcpu); + + fprintf(stderr, "invalid format: %s\n", opt); + return (-1); +} + static void parse_cpuset(int vcpu, const char *list, cpuset_t *set) { diff --git a/usr.sbin/bhyve/riscv/bhyverun_machdep.c b/usr.sbin/bhyve/riscv/bhyverun_machdep.c index a90a508901bc..55e28d54ed11 100644 --- a/usr.sbin/bhyve/riscv/bhyverun_machdep.c +++ b/usr.sbin/bhyve/riscv/bhyverun_machdep.c @@ -95,7 +95,8 @@ bhyve_usage(int code) "Usage: %s [-CDHhSW]\n" " %*s [-c [[cpus=]numcpus][,sockets=n][,cores=n][,threads=n]]\n" " %*s [-k config_file] [-m mem] [-o var=value]\n" - " %*s [-p vcpu:hostcpu] [-r file] [-s pci] [-U uuid] vmname\n" + " %*s [-p vcpu:hostcpu] [-p vcpuN-vcpuM:hostcpuX-hostcpuY]\n" + " %*s [-r file] [-s pci] [-U uuid] vmname\n" " -C: include guest memory in core file\n" " -c: number of CPUs and/or topology specification\n" " -D: destroy on power-off\n" @@ -110,7 +111,7 @@ bhyve_usage(int code) " -U: UUID\n" " -W: force virtio to use single-vector MSI\n", progname, (int)strlen(progname), "", (int)strlen(progname), "", - (int)strlen(progname), ""); + (int)strlen(progname), "", (int)strlen(progname), ""); exit(code); }