Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jul 2018 20:28:26 -0700
From:      Ravi Pokala <rpokala@freebsd.org>
To:        Marcelo Araujo <araujo@FreeBSD.org>, <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@freebsd.org>
Subject:   Re: svn commit: r336188 - head/usr.sbin/bhyve
Message-ID:  <3D1CA66E-9F52-435E-A5A4-E22C6A4931F5@panasas.com>
In-Reply-To: <201807110323.w6B3N9FO003639@repo.freebsd.org>
References:  <201807110323.w6B3N9FO003639@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Marcelo,

If the intention is to have specific exit codes have specific meanings, wou=
ldn't it be useful to set up defines or an enum or something, so a symbolic =
value can be used rather than a bare integer?

Thanks,

Ravi (rpokala@)

=EF=BB=BF-----Original Message-----
From: <owner-src-committers@freebsd.org> on behalf of Marcelo Araujo <arauj=
o@FreeBSD.org>
Date: 2018-07-10, Tuesday at 20:23
To: <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@=
freebsd.org>
Subject: svn commit: r336188 - head/usr.sbin/bhyve

Author: araujo
Date: Wed Jul 11 03:23:09 2018
New Revision: 336188
URL: https://svnweb.freebsd.org/changeset/base/336188

Log:
  Improve bhyve exit(3) error code.
 =20
  The bhyve(8) exit status indicates how the VM was terminated:
 =20
  0	rebooted
  1	powered off
  2	halted
  3	triple fault
 =20
  The problem is when we have wrappers around bhyve that parses the exit
  error code and gets an exit(1) for an error but interprets it as "powered=
 off".
  So to mitigate this issue and makes it less error prone for third part
  applications, I have added a new exit code 4 that is "exited due to an er=
ror".
 =20
  For now the bhyve(8) exit status are:
  0	rebooted
  1	powered off
  2	halted
  3	triple fault
  4	exited due to an error
 =20
  Reviewed by:	@jhb
  MFC after:	2 weeks.
  Sponsored by:	iXsystems Inc.
  Differential Revision:	https://reviews.freebsd.org/D16161

Modified:
  head/usr.sbin/bhyve/bhyve.8
  head/usr.sbin/bhyve/bhyverun.c
  head/usr.sbin/bhyve/dbgport.c
  head/usr.sbin/bhyve/fwctl.c
  head/usr.sbin/bhyve/mevent_test.c
  head/usr.sbin/bhyve/pci_e82545.c

Modified: head/usr.sbin/bhyve/bhyve.8
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- head/usr.sbin/bhyve/bhyve.8	Wed Jul 11 02:32:06 2018	(r336187)
+++ head/usr.sbin/bhyve/bhyve.8	Wed Jul 11 03:23:09 2018	(r336188)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd Jul 05, 2018
+.Dd Jul 11, 2018
 .Dt BHYVE 8
 .Os
 .Sh NAME
@@ -520,6 +520,8 @@ powered off
 halted
 .It 3
 triple fault
+.It 4
+exited due to an error
 .El
 .Sh EXAMPLES
 If not using a boot ROM, the guest operating system must have been loaded =
with

Modified: head/usr.sbin/bhyve/bhyverun.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- head/usr.sbin/bhyve/bhyverun.c	Wed Jul 11 02:32:06 2018	(r336187)
+++ head/usr.sbin/bhyve/bhyverun.c	Wed Jul 11 03:23:09 2018	(r336188)
@@ -397,7 +397,7 @@ fbsdrun_deletecpu(struct vmctx *ctx, int vcpu)
=20
 	if (!CPU_ISSET(vcpu, &cpumask)) {
 		fprintf(stderr, "Attempting to delete unknown cpu %d\n", vcpu);
-		exit(1);
+		exit(4);
 	}
=20
 	CPU_CLR_ATOMIC(vcpu, &cpumask);
@@ -742,7 +742,7 @@ vm_loop(struct vmctx *ctx, int vcpu, uint64_t startrip
 		if (exitcode >=3D VM_EXITCODE_MAX || handler[exitcode] =3D=3D NULL) {
 			fprintf(stderr, "vm_loop: unexpected exitcode 0x%x\n",
 			    exitcode);
-			exit(1);
+			exit(4);
 		}
=20
 		rc =3D (*handler[exitcode])(ctx, &vmexit[vcpu], &vcpu);
@@ -753,7 +753,7 @@ vm_loop(struct vmctx *ctx, int vcpu, uint64_t startrip
 		case VMEXIT_ABORT:
 			abort();
 		default:
-			exit(1);
+			exit(4);
 		}
 	}
 	fprintf(stderr, "vm_run error %d, errno %d\n", error, errno);
@@ -785,7 +785,7 @@ fbsdrun_set_capabilities(struct vmctx *ctx, int cpu)
 		err =3D vm_get_capability(ctx, cpu, VM_CAP_HALT_EXIT, &tmp);
 		if (err < 0) {
 			fprintf(stderr, "VM exit on HLT not supported\n");
-			exit(1);
+			exit(4);
 		}
 		vm_set_capability(ctx, cpu, VM_CAP_HALT_EXIT, 1);
 		if (cpu =3D=3D BSP)
@@ -800,7 +800,7 @@ fbsdrun_set_capabilities(struct vmctx *ctx, int cpu)
 		if (err < 0) {
 			fprintf(stderr,
 			    "SMP mux requested, no pause support\n");
-			exit(1);
+			exit(4);
 		}
 		vm_set_capability(ctx, cpu, VM_CAP_PAUSE_EXIT, 1);
 		if (cpu =3D=3D BSP)
@@ -814,7 +814,7 @@ fbsdrun_set_capabilities(struct vmctx *ctx, int cpu)
=20
 	if (err) {
 		fprintf(stderr, "Unable to set x2apic state (%d)\n", err);
-		exit(1);
+		exit(4);
 	}
=20
 	vm_set_capability(ctx, cpu, VM_CAP_ENABLE_INVPCID, 1);
@@ -850,7 +850,7 @@ do_open(const char *vmname)
 			}
 		} else {
 			perror("vm_create");
-			exit(1);
+			exit(4);
 		}
 	} else {
 		if (!romboot) {
@@ -859,14 +859,14 @@ do_open(const char *vmname)
 			 * bootrom must be configured to boot it.
 			 */
 			fprintf(stderr, "virtual machine cannot be booted\n");
-			exit(1);
+			exit(4);
 		}
 	}
=20
 	ctx =3D vm_open(vmname);
 	if (ctx =3D=3D NULL) {
 		perror("vm_open");
-		exit(1);
+		exit(4);
 	}
=20
 #ifndef WITHOUT_CAPSICUM
@@ -888,7 +888,7 @@ do_open(const char *vmname)
 		error =3D vm_reinit(ctx);
 		if (error) {
 			perror("vm_reinit");
-			exit(1);
+			exit(4);
 		}
 	}
 	error =3D vm_set_topology(ctx, sockets, cores, threads, maxcpus);
@@ -967,7 +967,7 @@ main(int argc, char *argv[])
 			break;
 		case 's':
 			if (pci_parse_slot(optarg) !=3D 0)
-				exit(1);
+				exit(4);
 			else
 				break;
 		case 'S':
@@ -1033,7 +1033,7 @@ main(int argc, char *argv[])
 	if (guest_ncpus > max_vcpus) {
 		fprintf(stderr, "%d vCPUs requested but only %d available\n",
 			guest_ncpus, max_vcpus);
-		exit(1);
+		exit(4);
 	}
=20
 	fbsdrun_set_capabilities(ctx, BSP);
@@ -1042,13 +1042,13 @@ main(int argc, char *argv[])
 	err =3D vm_setup_memory(ctx, memsize, VM_MMAP_ALL);
 	if (err) {
 		fprintf(stderr, "Unable to setup memory (%d)\n", errno);
-		exit(1);
+		exit(4);
 	}
=20
 	error =3D init_msr();
 	if (error) {
 		fprintf(stderr, "init_msr error %d", error);
-		exit(1);
+		exit(4);
 	}
=20
 	init_mem();
@@ -1063,8 +1063,10 @@ main(int argc, char *argv[])
 	/*
 	 * Exit if a device emulation finds an error in its initilization
 	 */
-	if (init_pci(ctx) !=3D 0)
-		exit(1);
+	if (init_pci(ctx) !=3D 0) {
+		perror("device emulation initialization error");
+		exit(4);
+	}
=20
 	if (dbg_port !=3D 0)
 		init_dbgport(dbg_port);
@@ -1079,7 +1081,7 @@ main(int argc, char *argv[])
 		if (vm_set_capability(ctx, BSP, VM_CAP_UNRESTRICTED_GUEST, 1)) {
 			fprintf(stderr, "ROM boot failed: unrestricted guest "
 			    "capability not available\n");
-			exit(1);
+			exit(4);
 		}
 		error =3D vcpu_reset(ctx, BSP);
 		assert(error =3D=3D 0);
@@ -1093,8 +1095,10 @@ main(int argc, char *argv[])
 	 */
 	if (mptgen) {
 		error =3D mptable_build(ctx, guest_ncpus);
-		if (error)
-			exit(1);
+		if (error) {
+			perror("error to build the guest tables");
+			exit(4);
+		}
 	}
=20
 	error =3D smbios_build(ctx);
@@ -1133,5 +1137,5 @@ main(int argc, char *argv[])
 	 */
 	mevent_dispatch();
=20
-	exit(1);
+	exit(4);
 }

Modified: head/usr.sbin/bhyve/dbgport.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- head/usr.sbin/bhyve/dbgport.c	Wed Jul 11 02:32:06 2018	(r336187)
+++ head/usr.sbin/bhyve/dbgport.c	Wed Jul 11 03:23:09 2018	(r336188)
@@ -139,8 +139,8 @@ init_dbgport(int sport)
 	conn_fd =3D -1;
=20
 	if ((listen_fd =3D socket(AF_INET, SOCK_STREAM, 0)) < 0) {
-		perror("socket");
-		exit(1);
+		perror("cannot create socket");
+		exit(4);
 	}
=20
 	sin.sin_len =3D sizeof(sin);
@@ -151,18 +151,18 @@ init_dbgport(int sport)
 	reuse =3D 1;
 	if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuse,
 	    sizeof(reuse)) < 0) {
-		perror("setsockopt");
-		exit(1);
+		perror("cannot set socket options");
+		exit(4);
 	}
=20
 	if (bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
-		perror("bind");
-		exit(1);
+		perror("cannot bind socket");
+		exit(4);
 	}
=20
 	if (listen(listen_fd, 1) < 0) {
-		perror("listen");
-		exit(1);
+		perror("cannot listen socket");
+		exit(4);
 	}
=20
 #ifndef WITHOUT_CAPSICUM

Modified: head/usr.sbin/bhyve/fwctl.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- head/usr.sbin/bhyve/fwctl.c	Wed Jul 11 02:32:06 2018	(r336187)
+++ head/usr.sbin/bhyve/fwctl.c	Wed Jul 11 03:23:09 2018	(r336188)
@@ -375,7 +375,7 @@ fwctl_request(uint32_t value)
 		/* Verify size */
 		if (value < 12) {
 			printf("msg size error");
-			exit(1);
+			exit(4);
 		}
 		rinfo.req_size =3D value;
 		rinfo.req_count =3D 1;

Modified: head/usr.sbin/bhyve/mevent_test.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- head/usr.sbin/bhyve/mevent_test.c	Wed Jul 11 02:32:06 2018	(r336187)
+++ head/usr.sbin/bhyve/mevent_test.c	Wed Jul 11 03:23:09 2018	(r336188)
@@ -143,7 +143,7 @@ echoer(void *param)
 	mev =3D mevent_add(fd, EVF_READ, echoer_callback, &sync);
 	if (mev =3D=3D NULL) {
 		printf("Could not allocate echoer event\n");
-		exit(1);
+		exit(4);
 	}
=20
 	while (!pthread_cond_wait(&sync.e_cond, &sync.e_mt)) {
@@ -200,8 +200,8 @@ acceptor(void *param)
 	static int first;
=20
 	if ((s =3D socket(AF_INET, SOCK_STREAM, 0)) < 0) {
-		perror("socket");
-		exit(1);
+		perror("cannot create socket");
+		exit(4);
 	}
=20
 	sin.sin_len =3D sizeof(sin);
@@ -210,13 +210,13 @@ acceptor(void *param)
 	sin.sin_port =3D htons(TEST_PORT);
=20
 	if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
-		perror("bind");
-		exit(1);
+		perror("cannot bind socket");
+		exit(4);
 	}
=20
 	if (listen(s, 1) < 0) {
-		perror("listen");
-		exit(1);
+		perror("cannot listen socket");
+		exit(4);
 	}
=20
 	(void) mevent_add(s, EVF_READ, acceptor_callback, NULL);

Modified: head/usr.sbin/bhyve/pci_e82545.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- head/usr.sbin/bhyve/pci_e82545.c	Wed Jul 11 02:32:06 2018	(r336187)
+++ head/usr.sbin/bhyve/pci_e82545.c	Wed Jul 11 03:23:09 2018	(r336188)
@@ -2224,7 +2224,7 @@ e82545_open_tap(struct e82545_softc *sc, char *opts)
 	sc->esc_tapfd =3D open(tbuf, O_RDWR);
 	if (sc->esc_tapfd =3D=3D -1) {
 		DPRINTF("unable to open tap device %s\n", opts);
-		exit(1);
+		exit(4);
 	}
=20
 	/*






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D1CA66E-9F52-435E-A5A4-E22C6A4931F5>