summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorgrehan <grehan@FreeBSD.org>2013-10-18 22:05:17 +0000
committergrehan <grehan@FreeBSD.org>2013-10-18 22:05:17 +0000
commit9ad9e387e9806be0093be97b2e0952a7fab968e9 (patch)
treeb4a49ea2f380dac64bdf8e0bcf704afa5d09ca0c /usr.sbin
parent4bbe413766853fb56498b922eeb0146111eb7ca3 (diff)
downloadFreeBSD-src-9ad9e387e9806be0093be97b2e0952a7fab968e9.zip
FreeBSD-src-9ad9e387e9806be0093be97b2e0952a7fab968e9.tar.gz
MFC r256709:
Eliminate unconditional debug printfs. Linux writes to these nominally read-only registers, so avoid having bhyve write warning messages to stdout when the reg writes can be safely ignored. Change the WPRINTF to DPRINTF which is conditional. Approved by: re (delphij)
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/bhyve/bhyverun.c16
-rw-r--r--usr.sbin/bhyve/bhyverun.h1
-rw-r--r--usr.sbin/bhyve/mptbl.c150
-rw-r--r--usr.sbin/bhyve/pci_hostbridge.c16
-rw-r--r--usr.sbin/bhyve/pci_virtio_block.c9
-rw-r--r--usr.sbin/bhyve/pci_virtio_net.c13
-rw-r--r--usr.sbin/bhyve/rtc.c2
7 files changed, 60 insertions, 147 deletions
diff --git a/usr.sbin/bhyve/bhyverun.c b/usr.sbin/bhyve/bhyverun.c
index 5359442..09d043d 100644
--- a/usr.sbin/bhyve/bhyverun.c
+++ b/usr.sbin/bhyve/bhyverun.c
@@ -81,6 +81,7 @@ int guest_ncpus;
static int pincpu = -1;
static int guest_vmexit_on_hlt, guest_vmexit_on_pause, disable_x2apic;
+static int virtio_msix = 1;
static int foundcpus;
@@ -120,7 +121,7 @@ usage(int code)
{
fprintf(stderr,
- "Usage: %s [-aehAHIP][-g <gdb port>][-s <pci>][-S <pci>]"
+ "Usage: %s [-aehAHIPW][-g <gdb port>][-s <pci>][-S <pci>]"
"[-c vcpus][-p pincpu][-m mem]"
" <vmname>\n"
" -a: local apic is in XAPIC mode (default is X2APIC)\n"
@@ -131,6 +132,7 @@ usage(int code)
" -H: vmexit from the guest on hlt\n"
" -I: present an ioapic to the guest\n"
" -P: vmexit from the guest on pause\n"
+ " -W: force virtio to use single-vector MSI\n"
" -e: exit on unhandled i/o access\n"
" -h: help\n"
" -s: <slot,driver,configinfo> PCI slot config\n"
@@ -169,6 +171,13 @@ fbsdrun_vmexit_on_hlt(void)
return (guest_vmexit_on_hlt);
}
+int
+fbsdrun_virtio_msix(void)
+{
+
+ return (virtio_msix);
+}
+
static void *
fbsdrun_start_thread(void *param)
{
@@ -500,7 +509,7 @@ main(int argc, char *argv[])
ioapic = 0;
memsize = 256 * MB;
- while ((c = getopt(argc, argv, "abehAHIPp:g:c:s:S:m:")) != -1) {
+ while ((c = getopt(argc, argv, "abehAHIPWp:g:c:s:S:m:")) != -1) {
switch (c) {
case 'a':
disable_x2apic = 1;
@@ -547,6 +556,9 @@ main(int argc, char *argv[])
case 'e':
strictio = 1;
break;
+ case 'W':
+ virtio_msix = 0;
+ break;
case 'h':
usage(0);
default:
diff --git a/usr.sbin/bhyve/bhyverun.h b/usr.sbin/bhyve/bhyverun.h
index 28ffb3c..27c858e 100644
--- a/usr.sbin/bhyve/bhyverun.h
+++ b/usr.sbin/bhyve/bhyverun.h
@@ -46,4 +46,5 @@ int fbsdrun_muxed(void);
int fbsdrun_vmexit_on_hlt(void);
int fbsdrun_vmexit_on_pause(void);
int fbsdrun_disable_x2apic(void);
+int fbsdrun_virtio_msix(void);
#endif
diff --git a/usr.sbin/bhyve/mptbl.c b/usr.sbin/bhyve/mptbl.c
index 74db2ea..5687d90 100644
--- a/usr.sbin/bhyve/mptbl.c
+++ b/usr.sbin/bhyve/mptbl.c
@@ -71,6 +71,9 @@ __FBSDID("$FreeBSD$");
#define MPEP_FEATURES (0xBFEBFBFF) /* XXX Intel i7 */
+/* Number of i/o intr entries */
+#define MPEII_MAX_IRQ 16
+
/* Define processor entry struct since <x86/mptable.h> gets it wrong */
typedef struct BPROCENTRY {
u_char type;
@@ -155,14 +158,14 @@ mpt_build_bus_entries(bus_entry_ptr mpeb)
memset(mpeb, 0, sizeof(*mpeb));
mpeb->type = MPCT_ENTRY_BUS;
- mpeb->bus_id = ISA;
- memcpy(mpeb->bus_type, MPE_BUSNAME_ISA, MPE_BUSNAME_LEN);
+ mpeb->bus_id = 0;
+ memcpy(mpeb->bus_type, MPE_BUSNAME_PCI, MPE_BUSNAME_LEN);
mpeb++;
memset(mpeb, 0, sizeof(*mpeb));
mpeb->type = MPCT_ENTRY_BUS;
- mpeb->bus_id = PCI;
- memcpy(mpeb->bus_type, MPE_BUSNAME_PCI, MPE_BUSNAME_LEN);
+ mpeb->bus_id = 1;
+ memcpy(mpeb->bus_type, MPE_BUSNAME_ISA, MPE_BUSNAME_LEN);
}
static void
@@ -177,9 +180,8 @@ mpt_build_ioapic_entries(io_apic_entry_ptr mpei, int id)
mpei->apic_address = IOAPIC_PADDR;
}
-#ifdef notyet
static void
-mpt_build_ioint_entries(struct mpe_ioint *mpeii, int num_pins, int id)
+mpt_build_ioint_entries(int_entry_ptr mpie, int num_pins, int id)
{
int pin;
@@ -189,28 +191,27 @@ mpt_build_ioint_entries(struct mpe_ioint *mpeii, int num_pins, int id)
* just use the default config, tweek later if needed.
*/
-
/* Run through all 16 pins. */
for (pin = 0; pin < num_pins; pin++) {
- memset(mpeii, 0, sizeof(*mpeii));
- mpeii->entry_type = MP_ENTRY_IOINT;
- mpeii->src_bus_id = MPE_BUSID_ISA;
- mpeii->dst_apic_id = id;
+ memset(mpie, 0, sizeof(*mpie));
+ mpie->type = MPCT_ENTRY_INT;
+ mpie->src_bus_id = 1;
+ mpie->dst_apic_id = id;
/*
* All default configs route IRQs from bus 0 to the first 16
* pins of the first I/O APIC with an APIC ID of 2.
*/
- mpeii->dst_apic_intin = pin;
+ mpie->dst_apic_int = pin;
switch (pin) {
case 0:
/* Pin 0 is an ExtINT pin. */
- mpeii->intr_type = MPEII_INTR_EXTINT;
+ mpie->int_type = INTENTRY_TYPE_EXTINT;
break;
case 2:
/* IRQ 0 is routed to pin 2. */
- mpeii->intr_type = MPEII_INTR_INT;
- mpeii->src_bus_irq = 0;
+ mpie->int_type = INTENTRY_TYPE_INT;
+ mpie->src_bus_irq = 0;
break;
case 5:
case 10:
@@ -218,118 +219,20 @@ mpt_build_ioint_entries(struct mpe_ioint *mpeii, int num_pins, int id)
/*
* PCI Irqs set to level triggered.
*/
- mpeii->intr_flags = MPEII_FLAGS_TRIGMODE_LEVEL;
- mpeii->src_bus_id = MPE_BUSID_PCI;
+ mpie->int_flags = INTENTRY_FLAGS_TRIGGER_LEVEL;
+ mpie->src_bus_id = 0;
+ /* fall through.. */
default:
/* All other pins are identity mapped. */
- mpeii->intr_type = MPEII_INTR_INT;
- mpeii->src_bus_irq = pin;
+ mpie->int_type = INTENTRY_TYPE_INT;
+ mpie->src_bus_irq = pin;
break;
}
- mpeii++;
+ mpie++;
}
}
-#define COPYSTR(dest, src, bytes) \
- memcpy(dest, src, bytes); \
- str[bytes] = 0;
-
-static void
-mptable_dump(struct mp_floating_pointer *mpfp, struct mp_config_hdr *mpch)
-{
- static char str[16];
- int i;
- char *cur;
-
- union mpe {
- struct mpe_proc *proc;
- struct mpe_bus *bus;
- struct mpe_ioapic *ioapic;
- struct mpe_ioint *ioint;
- struct mpe_lint *lnit;
- char *p;
- };
-
- union mpe mpe;
-
- printf(" MP Floating Pointer :\n");
- COPYSTR(str, mpfp->signature, 4);
- printf("\tsignature:\t%s\n", str);
- printf("\tmpch paddr:\t%x\n", mpfp->mptable_paddr);
- printf("\tlength:\t%x\n", mpfp->length);
- printf("\tspecrec:\t%x\n", mpfp->specrev);
- printf("\tchecksum:\t%x\n", mpfp->checksum);
- printf("\tfeature1:\t%x\n", mpfp->feature1);
- printf("\tfeature2:\t%x\n", mpfp->feature2);
- printf("\tfeature3:\t%x\n", mpfp->feature3);
- printf("\tfeature4:\t%x\n", mpfp->feature4);
-
- printf(" MP Configuration Header :\n");
- COPYSTR(str, mpch->signature, 4);
- printf(" signature: %s\n", str);
- printf(" length: %x\n", mpch->length);
- printf(" specrec: %x\n", mpch->specrev);
- printf(" checksum: %x\n", mpch->checksum);
- COPYSTR(str, mpch->oemid, MPCH_OEMID_LEN);
- printf(" oemid: %s\n", str);
- COPYSTR(str, mpch->prodid, MPCH_PRODID_LEN);
- printf(" prodid: %s\n", str);
- printf(" oem_ptr: %x\n", mpch->oem_ptr);
- printf(" oem_sz: %x\n", mpch->oem_sz);
- printf(" nr_entries: %x\n", mpch->nr_entries);
- printf(" apic paddr: %x\n", mpch->lapic_paddr);
- printf(" ext_length: %x\n", mpch->ext_length);
- printf(" ext_checksum: %x\n", mpch->ext_checksum);
-
- cur = (char *)mpch + sizeof(*mpch);
- for (i = 0; i < mpch->nr_entries; i++) {
- mpe.p = cur;
- switch(*mpe.p) {
- case MP_ENTRY_PROC:
- printf(" MP Processor Entry :\n");
- printf(" lapic_id: %x\n", mpe.proc->lapic_id);
- printf(" lapic_version: %x\n", mpe.proc->lapic_version);
- printf(" proc_flags: %x\n", mpe.proc->proc_flags);
- printf(" proc_signature: %x\n", mpe.proc->proc_signature);
- printf(" feature_flags: %x\n", mpe.proc->feature_flags);
- cur += sizeof(struct mpe_proc);
- break;
- case MP_ENTRY_BUS:
- printf(" MP Bus Entry :\n");
- printf(" busid: %x\n", mpe.bus->busid);
- COPYSTR(str, mpe.bus->busname, MPE_BUSNAME_LEN);
- printf(" busname: %s\n", str);
- cur += sizeof(struct mpe_bus);
- break;
- case MP_ENTRY_IOAPIC:
- printf(" MP IOAPIC Entry :\n");
- printf(" ioapi_id: %x\n", mpe.ioapic->ioapic_id);
- printf(" ioapi_version: %x\n", mpe.ioapic->ioapic_version);
- printf(" ioapi_flags: %x\n", mpe.ioapic->ioapic_flags);
- printf(" ioapi_paddr: %x\n", mpe.ioapic->ioapic_paddr);
- cur += sizeof(struct mpe_ioapic);
- break;
- case MP_ENTRY_IOINT:
- printf(" MP IO Interrupt Entry :\n");
- printf(" intr_type: %x\n", mpe.ioint->intr_type);
- printf(" intr_flags: %x\n", mpe.ioint->intr_flags);
- printf(" src_bus_id: %x\n", mpe.ioint->src_bus_id);
- printf(" src_bus_irq: %x\n", mpe.ioint->src_bus_irq);
- printf(" dst_apic_id: %x\n", mpe.ioint->dst_apic_id);
- printf(" dst_apic_intin: %x\n", mpe.ioint->dst_apic_intin);
- cur += sizeof(struct mpe_ioint);
- break;
- case MP_ENTRY_LINT:
- printf(" MP Local Interrupt Entry :\n");
- cur += sizeof(struct mpe_lint);
- break;
- }
-
- }
-}
-#endif
-
void
mptable_add_oemtbl(void *tbl, int tblsz)
{
@@ -346,6 +249,7 @@ mptable_build(struct vmctx *ctx, int ncpu, int ioapic)
io_apic_entry_ptr mpei;
bproc_entry_ptr mpep;
mpfps_t mpfp;
+ int_entry_ptr mpie;
char *curraddr;
char *startaddr;
@@ -381,12 +285,10 @@ mptable_build(struct vmctx *ctx, int ncpu, int ioapic)
mpch->entry_count++;
}
-#ifdef notyet
- mpt_build_ioint_entries((struct mpe_ioint*)curraddr, MPEII_MAX_IRQ,
- ncpu + 1);
- curraddr += sizeof(struct mpe_ioint) * MPEII_MAX_IRQ;
+ mpie = (int_entry_ptr) curraddr;
+ mpt_build_ioint_entries(mpie, MPEII_MAX_IRQ, ncpu + 1);
+ curraddr += sizeof(*mpie) * MPEII_MAX_IRQ;
mpch->entry_count += MPEII_MAX_IRQ;
-#endif
if (oem_tbl_start) {
mpch->oem_table_pointer = curraddr - startaddr + MPTABLE_BASE;
diff --git a/usr.sbin/bhyve/pci_hostbridge.c b/usr.sbin/bhyve/pci_hostbridge.c
index dee0a47..54a25ae 100644
--- a/usr.sbin/bhyve/pci_hostbridge.c
+++ b/usr.sbin/bhyve/pci_hostbridge.c
@@ -47,6 +47,22 @@ pci_hostbridge_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
return (0);
}
+static int
+pci_amd_hostbridge_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
+{
+ (void) pci_hostbridge_init(ctx, pi, opts);
+ pci_set_cfgdata16(pi, PCIR_VENDOR, 0x1022); /* AMD */
+ pci_set_cfgdata16(pi, PCIR_DEVICE, 0x7432); /* made up */
+
+ return (0);
+}
+
+struct pci_devemu pci_de_amd_hostbridge = {
+ .pe_emu = "amd_hostbridge",
+ .pe_init = pci_amd_hostbridge_init,
+};
+PCI_EMUL_SET(pci_de_amd_hostbridge);
+
struct pci_devemu pci_de_hostbridge = {
.pe_emu = "hostbridge",
.pe_init = pci_hostbridge_init,
diff --git a/usr.sbin/bhyve/pci_virtio_block.c b/usr.sbin/bhyve/pci_virtio_block.c
index a190497..a7556d7 100644
--- a/usr.sbin/bhyve/pci_virtio_block.c
+++ b/usr.sbin/bhyve/pci_virtio_block.c
@@ -256,8 +256,6 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
off_t size;
int fd;
int sectsz;
- int use_msix;
- const char *env_msi;
if (opts == NULL) {
printf("virtio-block: backing device required\n");
@@ -336,12 +334,7 @@ pci_vtblk_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_STORAGE);
pci_set_cfgdata16(pi, PCIR_SUBDEV_0, VIRTIO_TYPE_BLOCK);
- use_msix = 1;
- if ((env_msi = getenv("BHYVE_USE_MSI"))) {
- if (strcasecmp(env_msi, "yes") == 0)
- use_msix = 0;
- }
- if (vi_intr_init(&sc->vbsc_vs, 1, use_msix))
+ if (vi_intr_init(&sc->vbsc_vs, 1, fbsdrun_virtio_msix()))
return (1);
vi_set_io_bar(&sc->vbsc_vs, 0);
return (0);
diff --git a/usr.sbin/bhyve/pci_virtio_net.c b/usr.sbin/bhyve/pci_virtio_net.c
index 2939949..ae20231 100644
--- a/usr.sbin/bhyve/pci_virtio_net.c
+++ b/usr.sbin/bhyve/pci_virtio_net.c
@@ -509,11 +509,9 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
char nstr[80];
char tname[MAXCOMLEN + 1];
struct pci_vtnet_softc *sc;
- const char *env_msi;
char *devname;
char *vtopts;
int mac_provided;
- int use_msix;
sc = malloc(sizeof(struct pci_vtnet_softc));
memset(sc, 0, sizeof(struct pci_vtnet_softc));
@@ -531,15 +529,6 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
#endif
/*
- * Use MSI if set by user
- */
- use_msix = 1;
- if ((env_msi = getenv("BHYVE_USE_MSI")) != NULL) {
- if (strcasecmp(env_msi, "yes") == 0)
- use_msix = 0;
- }
-
- /*
* Attempt to open the tap device and read the MAC address
* if specified
*/
@@ -623,7 +612,7 @@ pci_vtnet_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts)
sc->vsc_config.status = 1;
/* use BAR 1 to map MSI-X table and PBA, if we're using MSI-X */
- if (vi_intr_init(&sc->vsc_vs, 1, use_msix))
+ if (vi_intr_init(&sc->vsc_vs, 1, fbsdrun_virtio_msix()))
return (1);
/* use BAR 0 to map config regs in IO space */
diff --git a/usr.sbin/bhyve/rtc.c b/usr.sbin/bhyve/rtc.c
index c1a84d74..f3ce2bc 100644
--- a/usr.sbin/bhyve/rtc.c
+++ b/usr.sbin/bhyve/rtc.c
@@ -331,7 +331,7 @@ rtc_init(struct vmctx *ctx)
memset(rtc_nvram, 0, sizeof(rtc_nvram));
- rtc_nvram[nvoff(RTC_CENTURY)] = rtcout(tm.tm_year / 100);
+ rtc_nvram[nvoff(RTC_CENTURY)] = bin2bcd((tm.tm_year + 1900) / 100);
/* XXX init diag/reset code/equipment/checksum ? */
OpenPOWER on IntegriCloud