From owner-svn-src-head@freebsd.org Wed Jul 11 03:28:30 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 13BB3102A223; Wed, 11 Jul 2018 03:28:30 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [IPv6:2610:1c1:1:606c::24b:4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "smtp.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id BE9837A2B4; Wed, 11 Jul 2018 03:28:29 +0000 (UTC) (envelope-from rpokala@freebsd.org) Received: from [172.17.133.41] (unknown [12.202.168.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) (Authenticated sender: rpokala) by smtp.freebsd.org (Postfix) with ESMTPSA id 1B16419721; Wed, 11 Jul 2018 03:28:29 +0000 (UTC) (envelope-from rpokala@freebsd.org) User-Agent: Microsoft-MacOutlook/10.e.1.180613 Date: Tue, 10 Jul 2018 20:28:26 -0700 Subject: Re: svn commit: r336188 - head/usr.sbin/bhyve From: Ravi Pokala To: Marcelo Araujo , , , Message-ID: <3D1CA66E-9F52-435E-A5A4-E22C6A4931F5@panasas.com> Thread-Topic: svn commit: r336188 - head/usr.sbin/bhyve References: <201807110323.w6B3N9FO003639@repo.freebsd.org> In-Reply-To: <201807110323.w6B3N9FO003639@repo.freebsd.org> Mime-version: 1.0 Content-type: text/plain; charset="UTF-8" Content-transfer-encoding: quoted-printable X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.27 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Jul 2018 03:28:30 -0000 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: on behalf of Marcelo Araujo Date: 2018-07-10, Tuesday at 20:23 To: , , 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 /*