Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F110619953
D1206.id2680.vs2617.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
39 KB
Referenced Files
None
Subscribers
None
D1206.id2680.vs2617.diff
View Options
Index: Makefile
===================================================================
--- Makefile
+++ Makefile
@@ -4,6 +4,7 @@
PROG= pciconf
SRCS= pciconf.c cap.c err.c
MAN= pciconf.8
+LIBADD= xo
WARNS?= 3
Index: cap.c
===================================================================
--- cap.c
+++ cap.c
@@ -39,6 +39,7 @@
#include <stdio.h>
#include <sys/agpio.h>
#include <sys/pciio.h>
+#include <libxo/xo.h>
#include <dev/agp/agpreg.h>
#include <dev/pci/pcireg.h>
@@ -52,12 +53,16 @@
{
uint16_t cap, status;
+ xo_emit("{e:capability-name/Power Management}");
cap = read_config(fd, &p->pc_sel, ptr + PCIR_POWER_CAP, 2);
status = read_config(fd, &p->pc_sel, ptr + PCIR_POWER_STATUS, 2);
- printf("powerspec %d supports D0%s%s D3 current D%d",
- cap & PCIM_PCAP_SPEC,
+ //printf("powerspec %d supports D0%s%s D3 current D%d",
+ xo_emit("powerspec {:power-management-version/%d} ",
+ cap & PCIM_PCAP_SPEC);
+ xo_emit("supports {:supported-power-states/D0%s%s D3} ",
cap & PCIM_PCAP_D1SUPP ? " D1" : "",
- cap & PCIM_PCAP_D2SUPP ? " D2" : "",
+ cap & PCIM_PCAP_D2SUPP ? " D2" : "");
+ xo_emit("current {q:current-power-state/D%d}",
status & PCIM_PSTAT_DMASK);
}
@@ -68,58 +73,78 @@
status = read_config(fd, &p->pc_sel, ptr + AGP_STATUS, 4);
command = read_config(fd, &p->pc_sel, ptr + AGP_CAPID, 4);
- printf("AGP ");
+ //printf("AGP ");
+ xo_emit("{:capability-name/AGP} ");
if (AGP_MODE_GET_MODE_3(status)) {
- printf("v3 ");
+ //printf("v3 ");
+ xo_emit("v{:agp-version/%d} ", 3);
if (AGP_MODE_GET_RATE(status) & AGP_MODE_V3_RATE_8x)
- printf("8x ");
+ //printf("8x ");
+ xo_emit("{:agp-speed/8}x ");
if (AGP_MODE_GET_RATE(status) & AGP_MODE_V3_RATE_4x)
- printf("4x ");
+ //printf("4x ");
+ xo_emit("{:agp-speed/4}x ");
} else {
+ //xo_emit("v{:agp-version/%d} ", 2);
if (AGP_MODE_GET_RATE(status) & AGP_MODE_V2_RATE_4x)
- printf("4x ");
+ //printf("4x ");
+ xo_emit("{:agp-speed/4}x ");
if (AGP_MODE_GET_RATE(status) & AGP_MODE_V2_RATE_2x)
- printf("2x ");
+ //printf("2x ");
+ xo_emit("{:agp-speed/2}x ");
if (AGP_MODE_GET_RATE(status) & AGP_MODE_V2_RATE_1x)
- printf("1x ");
+ //printf("1x ");
+ xo_emit("{:agp-speed/1}x ");
}
if (AGP_MODE_GET_SBA(status))
- printf("SBA ");
+ //printf("SBA ");
+ xo_emit("SBA ");
if (AGP_MODE_GET_AGP(command)) {
- printf("enabled at ");
+ //printf("enabled at ");
+ xo_emit("{:side-band-addressing/enabled} at ");
if (AGP_MODE_GET_MODE_3(command)) {
- printf("v3 ");
+ //printf("v3 ");
+ xo_emit("v{:agp-version/%d} ", 3);
switch (AGP_MODE_GET_RATE(command)) {
case AGP_MODE_V3_RATE_8x:
- printf("8x ");
+ //printf("8x ");
+ xo_emit("{:side-band-addressing-speed/8}x ");
break;
case AGP_MODE_V3_RATE_4x:
- printf("4x ");
+ //printf("4x ");
+ xo_emit("{:side-band-addressing-speed/4}x ");
break;
}
} else
switch (AGP_MODE_GET_RATE(command)) {
case AGP_MODE_V2_RATE_4x:
- printf("4x ");
+ //printf("4x ");
+ xo_emit("{:side-band-addressing-speed/4}x ");
break;
case AGP_MODE_V2_RATE_2x:
- printf("2x ");
+ //printf("2x ");
+ xo_emit("{:side-band-addressing-speed/2}x ");
break;
case AGP_MODE_V2_RATE_1x:
- printf("1x ");
+ //printf("1x ");
+ xo_emit("{:side-band-addressing-speed/1}x ");
break;
}
if (AGP_MODE_GET_SBA(command))
- printf("SBA ");
+ //printf("SBA ");
+ xo_emit("SBA ");
} else
- printf("disabled");
+ //printf("disabled");
+ xo_emit("{:side-band-addressing/disabled}");
}
static void
cap_vpd(int fd, struct pci_conf *p, uint8_t ptr)
{
- printf("VPD");
+ //printf("VPD");
+ xo_emit("{e:capability-name/VPD}");
+ xo_emit("VPD{eq:vital-product-data/true}");
}
static void
@@ -130,14 +155,21 @@
ctrl = read_config(fd, &p->pc_sel, ptr + PCIR_MSI_CTRL, 2);
msgnum = 1 << ((ctrl & PCIM_MSICTRL_MMC_MASK) >> 1);
- printf("MSI supports %d message%s%s%s ", msgnum,
- (msgnum == 1) ? "" : "s",
+ //printf("MSI supports %d message%s%s%s ", msgnum,
+ xo_emit("{:capability-name/MSI} ");
+ xo_emit("supports {:multi-message-capable/%d} message{d:/%s%s%s} ",
+ msgnum, (msgnum == 1) ? "" : "s",
(ctrl & PCIM_MSICTRL_64BIT) ? ", 64 bit" : "",
(ctrl & PCIM_MSICTRL_VECTOR) ? ", vector masks" : "");
+ xo_emit("{e:capable-of-64-bits/%s}",
+ (ctrl & PCIM_MSICTRL_64BIT) ? "true" : "false");
+ xo_emit("{e:per-vector-mask-capable/%s}",
+ (ctrl & PCIM_MSICTRL_VECTOR) ? "true" : "false");
if (ctrl & PCIM_MSICTRL_MSI_ENABLE) {
msgnum = 1 << ((ctrl & PCIM_MSICTRL_MME_MASK) >> 4);
- printf("enabled with %d message%s", msgnum,
- (msgnum == 1) ? "" : "s");
+ //printf("enabled with %d message%s", msgnum,
+ xo_emit("enabled with {:multiple-message-enable/%d} message{d:/%s}",
+ msgnum, (msgnum == 1) ? "" : "s");
}
}
@@ -148,25 +180,35 @@
int comma, max_splits, max_burst_read;
status = read_config(fd, &p->pc_sel, ptr + PCIXR_STATUS, 4);
- printf("PCI-X ");
+ //printf("PCI-X ");
+ xo_emit("{:capability-name/PCI-X} "); // XXX not yet ready
if (status & PCIXM_STATUS_64BIT)
- printf("64-bit ");
+ //printf("64-bit ");
+ xo_emit("{:pcix-feature/64-bit} ");
if ((p->pc_hdr & PCIM_HDRTYPE) == 1)
- printf("bridge ");
+ //printf("bridge ");
+ xo_emit("{:pcix-device-type/bridge} ");
if ((p->pc_hdr & PCIM_HDRTYPE) != 1 || (status & (PCIXM_STATUS_133CAP |
PCIXM_STATUS_266CAP | PCIXM_STATUS_533CAP)) != 0)
- printf("supports");
+ //printf("supports");
+ xo_emit("supports");
comma = 0;
if (status & PCIXM_STATUS_133CAP) {
- printf("%s 133MHz", comma ? "," : "");
+ //printf("%s 133MHz", comma ? "," : "");
+ xo_emit("%s {:supported-bus-speed-133mhz/133MHz/true}",
+ comma ? "," : "");
comma = 1;
}
if (status & PCIXM_STATUS_266CAP) {
- printf("%s 266MHz", comma ? "," : "");
+ //printf("%s 266MHz", comma ? "," : "");
+ xo_emit("%s {:supported-bus-speed-266mhz/266MHz/true}",
+ comma ? "," : "");
comma = 1;
}
if (status & PCIXM_STATUS_533CAP) {
- printf("%s 533MHz", comma ? "," : "");
+ //printf("%s 533MHz", comma ? "," : "");
+ xo_emit("%s {:supported-bus-speed-533mhz/533MHz/true}",
+ comma ? "," : "");
comma = 1;
}
if ((p->pc_hdr & PCIM_HDRTYPE) == 1)
@@ -211,8 +253,11 @@
max_splits = 32;
break;
}
- printf("%s %d burst read, %d split transaction%s", comma ? "," : "",
- max_burst_read, max_splits, max_splits == 1 ? "" : "s");
+ //printf("%s %d burst read, %d split transaction%s", comma ? "," : "",
+ xo_emit("%s {:maximum-read-burst/%d} burst read, ",
+ comma ? "," : "", max_burst_read);
+ xo_emit("{:maximum-split-transactions/%d} split transaction{d:/%s}",
+ max_splits, max_splits == 1 ? "" : "s");
}
static void
@@ -222,74 +267,101 @@
uint16_t command;
command = read_config(fd, &p->pc_sel, ptr + PCIR_HT_COMMAND, 2);
- printf("HT ");
+ //printf("HT ");
+ xo_emit("HT {eq:capability-name/Hyper-Transport}");
if ((command & 0xe000) == PCIM_HTCAP_SLAVE)
- printf("slave");
+ //printf("slave");
+ xo_emit("slave{eq:hyper-transport-mode/slave}");
else if ((command & 0xe000) == PCIM_HTCAP_HOST)
- printf("host");
+ //printf("host");
+ xo_emit("host{eq:hyper-transport-mode/host}");
else
switch (command & PCIM_HTCMD_CAP_MASK) {
case PCIM_HTCAP_SWITCH:
- printf("switch");
+ //printf("switch");
+ xo_emit("{q:hyper-transport-mode/switch}");
break;
case PCIM_HTCAP_INTERRUPT:
- printf("interrupt");
+ //printf("interrupt");
+ xo_emit("{q:hyper-transport-mode/interrupt}");
break;
case PCIM_HTCAP_REVISION_ID:
- printf("revision ID");
+ //printf("revision ID");
+ xo_emit("{q:hyper-transport-mode/revision ID}");
break;
case PCIM_HTCAP_UNITID_CLUMPING:
- printf("unit ID clumping");
+ //printf("unit ID clumping");
+ xo_emit("{q:hyper-tranport-mode/unit ID clumping}");
break;
case PCIM_HTCAP_EXT_CONFIG_SPACE:
- printf("extended config space");
+ //printf("extended config space");
+ xo_emit("{q:hyper-transport-mode/extended config space}");
break;
case PCIM_HTCAP_ADDRESS_MAPPING:
- printf("address mapping");
+ //printf("address mapping");
+ xo_emit("{q:hyper-transport-mode/address mapping}");
break;
case PCIM_HTCAP_MSI_MAPPING:
- printf("MSI %saddress window %s at 0x",
+ //printf("MSI %saddress window %s at 0x",
+ xo_emit("{d:/MSI %saddress window %s at }",
command & PCIM_HTCMD_MSI_FIXED ? "fixed " : "",
command & PCIM_HTCMD_MSI_ENABLE ? "enabled" :
"disabled");
if (command & PCIM_HTCMD_MSI_FIXED)
- printf("fee00000");
+ //printf("fee00000");
+ xo_emit("{msi-window-address:/0xfee00000}");
else {
reg = read_config(fd, &p->pc_sel,
ptr + PCIR_HTMSI_ADDRESS_HI, 4);
+ //if (reg != 0)
+ //printf("%08x", reg);
if (reg != 0)
- printf("%08x", reg);
- reg = read_config(fd, &p->pc_sel,
- ptr + PCIR_HTMSI_ADDRESS_LO, 4);
- printf("%08x", reg);
+ xo_emit("{:msi-window-address/0x%08x%08x}",
+ reg,
+ read_config(fd, &p->pc_sel,
+ ptr + PCIR_HTMSI_ADDRESS_LO, 4));
+ else
+ xo_emit("{:msi-window-address/0x%08x}",
+ read_config(fd, &p->pc_sel,
+ ptr + PCIR_HTMSI_ADDRESS_LO, 4));
}
break;
- case PCIM_HTCAP_DIRECT_ROUTE:
- printf("direct route");
+ case PCIM_HTCAP_DIRECT_ROUTE: // XXX not yet ready
+ //printf("direct route");
+ xo_emit("{q:hyper-transport-mode/direct route}");
break;
case PCIM_HTCAP_VCSET:
- printf("VC set");
+ //printf("VC set");
+ xo_emit("{q:hyper-transport-mode/VC set");
break;
case PCIM_HTCAP_RETRY_MODE:
- printf("retry mode");
+ //printf("retry mode");
+ xo_emit("{q:hyper-transport-mode/retry mode");
break;
case PCIM_HTCAP_X86_ENCODING:
- printf("X86 encoding");
+ //printf("X86 encoding");
+ xo_emit("{q:hyper-transport-mode/X86 encoding");
break;
case PCIM_HTCAP_GEN3:
- printf("Gen3");
+ //printf("Gen3");
+ xo_emit("{q:hyper-transport-mode/Gen3");
break;
case PCIM_HTCAP_FLE:
- printf("function-level extension");
+ //printf("function-level extension");
+ xo_emit("{q:hyper-transport-mode/function-level extension");
break;
case PCIM_HTCAP_PM:
- printf("power management");
+ //printf("power management");
+ xo_emit("{q:hyper-transport-mode/power management");
break;
case PCIM_HTCAP_HIGH_NODE_COUNT:
- printf("high node count");
+ //printf("high node count");
+ xo_emit("{q:hyper-transport-mode/high node count");
break;
default:
- printf("unknown %02x", command);
+ //printf("unknown %02x", command);
+ xo_emit("{q:hyper-transport-mode/unknown %02x{:/}",
+ command);
break;
}
}
@@ -300,14 +372,19 @@
uint8_t length;
length = read_config(fd, &p->pc_sel, ptr + PCIR_VENDOR_LENGTH, 1);
- printf("vendor (length %d)", length);
+ //printf("vendor (length %d)", length);
+ xo_emit("{eq:capability-name/Vendor Specific Information}");
+ xo_emit("vendor (length {:vendor-specific-data-length/%d})", length);
if (p->pc_vendor == 0x8086) {
/* Intel */
uint8_t version;
version = read_config(fd, &p->pc_sel, ptr + PCIR_VENDOR_DATA,
1);
- printf(" Intel cap %d version %d", version >> 4, version & 0xf);
+ //printf(" Intel cap %d version %d", version >> 4, version & 0xf);
+ xo_emit(" {:vendor-name/Intel} cap {:intel-specific-capabilities/%d} "
+ "version {:version/%d}",
+ version >> 4, version & 0xf);
if (version >> 4 == 1 && length == 12) {
/* Feature Detection */
uint32_t fvec;
@@ -316,38 +393,53 @@
comma = 0;
fvec = read_config(fd, &p->pc_sel, ptr +
PCIR_VENDOR_DATA + 5, 4);
- printf("\n\t\t features:");
+ //printf("\n\t\t features:");
+ xo_emit("\n\t\t features:");
if (fvec & (1 << 0)) {
- printf(" AMT");
+ //printf(" AMT");
+ xo_emit(" AMT{eq:feature-amt/true}");
comma = 1;
}
fvec = read_config(fd, &p->pc_sel, ptr +
PCIR_VENDOR_DATA + 1, 4);
if (fvec & (1 << 21)) {
- printf("%s Quick Resume", comma ? "," : "");
+ //printf("%s Quick Resume", comma ? "," : "");
+ xo_emit("{d:/%s} Quick Resume{eq:feature-quick-resume/true}",
+ comma ? "," : "");
comma = 1;
}
if (fvec & (1 << 18)) {
- printf("%s SATA RAID-5", comma ? "," : "");
+ //printf("%s SATA RAID-5", comma ? "," : "");
+ xo_emit("{d:/%s} SATA RAID-5{eq:feature-raid-5/true}",
+ comma ? "," : "");
comma = 1;
}
if (fvec & (1 << 9)) {
- printf("%s Mobile", comma ? "," : "");
+ //printf("%s Mobile", comma ? "," : "");
+ xo_emit("{d:/%s} Mobile{eq:feature-mobile/true}", comma ? "," : "");
comma = 1;
}
if (fvec & (1 << 7)) {
- printf("%s 6 PCI-e x1 slots", comma ? "," : "");
+ //printf("%s 6 PCI-e x1 slots", comma ? "," : "");
+ xo_emit("{d:/%s} 6 PCI-e x1 slots{e:pci-express-slots/6}",
+ comma ? "," : "");
comma = 1;
} else {
- printf("%s 4 PCI-e x1 slots", comma ? "," : "");
+ //printf("%s 4 PCI-e x1 slots", comma ? "," : "");
+ xo_emit("{d:/%s} 4 PCI-e x1 slots{e:pci-express-slots/4}",
+ comma ? "," : "");
comma = 1;
}
if (fvec & (1 << 5)) {
- printf("%s SATA RAID-0/1/10", comma ? "," : "");
+ //printf("%s SATA RAID-0/1/10", comma ? "," : "");
+ xo_emit("{d:/%s} SATA RAID-0/1/10{eq:feature-raid-0-1-10/true}",
+ comma ? "," : "");
comma = 1;
}
if (fvec & (1 << 3)) {
- printf("%s SATA AHCI", comma ? "," : "");
+ //printf("%s SATA AHCI", comma ? "," : "");
+ xo_emit("{d:/%s} SATA AHCI{eq:feature-sata-ahci/true}",
+ comma ? "," : "");
comma = 1;
}
}
@@ -359,8 +451,11 @@
{
uint16_t debug_port;
+ xo_emit("{e:capability-name/Debug}");
debug_port = read_config(fd, &p->pc_sel, ptr + PCIR_DEBUG_PORT, 2);
- printf("EHCI Debug Port at offset 0x%x in map 0x%x", debug_port &
+ //printf("EHCI Debug Port at offset 0x%x in map 0x%x", debug_port &
+ xo_emit("EHCI Debug Port at offset {:ehci-debug-port-offset/0x%x}"
+ " in map {:ehci-debug-port-map/0x%x}", debug_port &
PCIM_DEBUG_PORT_OFFSET, PCIR_BAR(debug_port >> 13));
}
@@ -369,8 +464,13 @@
{
uint32_t id;
+ xo_emit("{eq:capability-name/Subvendor}");
id = read_config(fd, &p->pc_sel, ptr + PCIR_SUBVENDCAP_ID, 4);
- printf("PCI Bridge card=0x%08x", id);
+ //printf("PCI Bridge card=0x%08x", id);
+ xo_emit("PCI Bridge card={:pci-bridge-subdevice-id/0x%04x}",
+ (id >> 16) & 0xffff);
+ xo_emit("{:pci-bridge-subvendor-id/%04x/0x%04x}",
+ id & 0xffff);
}
#define MAX_PAYLOAD(field) (128 << (field))
@@ -414,70 +514,97 @@
uint16_t ctl, flags, sta;
flags = read_config(fd, &p->pc_sel, ptr + PCIER_FLAGS, 2);
- printf("PCI-Express %d ", flags & PCIEM_FLAGS_VERSION);
+ //printf("PCI-Express %d ", flags & PCIEM_FLAGS_VERSION);
+ xo_emit("{:capability-name/PCI-Express} ");
+ xo_emit("{:pci-express-version/%d} ", flags & PCIEM_FLAGS_VERSION);
switch (flags & PCIEM_FLAGS_TYPE) {
case PCIEM_TYPE_ENDPOINT:
- printf("endpoint");
+ //printf("endpoint");
+ xo_emit("{:device-type/endpoint}");
break;
case PCIEM_TYPE_LEGACY_ENDPOINT:
- printf("legacy endpoint");
+ //printf("legacy endpoint");
+ xo_emit("{:device-type/legacy endpoint}");
break;
case PCIEM_TYPE_ROOT_PORT:
- printf("root port");
+ //printf("root port");
+ xo_emit("{:device-type/root port}");
break;
case PCIEM_TYPE_UPSTREAM_PORT:
- printf("upstream port");
+ //printf("upstream port");
+ xo_emit("{:device-type/upstream port}");
break;
case PCIEM_TYPE_DOWNSTREAM_PORT:
- printf("downstream port");
+ //printf("downstream port");
+ xo_emit("{:device-type/downstream port}");
break;
case PCIEM_TYPE_PCI_BRIDGE:
- printf("PCI bridge");
+ //printf("PCI bridge");
+ xo_emit("{:device-type/PCI bridge}");
break;
case PCIEM_TYPE_PCIE_BRIDGE:
- printf("PCI to PCIe bridge");
+ //printf("PCI to PCIe bridge");
+ xo_emit("{:device-type/PCI to PCIe bridge}");
break;
case PCIEM_TYPE_ROOT_INT_EP:
- printf("root endpoint");
+ //printf("root endpoint");
+ xo_emit("{:device-type/root endpoint}");
break;
case PCIEM_TYPE_ROOT_EC:
- printf("event collector");
+ //printf("event collector");
+ xo_emit("{:device-type/event collector}");
break;
default:
- printf("type %d", (flags & PCIEM_FLAGS_TYPE) >> 4);
+ //printf("type %d", (flags & PCIEM_FLAGS_TYPE) >> 4);
+ xo_emit("type {:device-type/%d}", (flags & PCIEM_FLAGS_TYPE) >> 4);
break;
}
if (flags & PCIEM_FLAGS_SLOT)
- printf(" slot");
+ //printf(" slot");
+ xo_emit(" slot{eq:slot-implemented/true}");
if (flags & PCIEM_FLAGS_IRQ)
- printf(" IRQ %d", (flags & PCIEM_FLAGS_IRQ) >> 9);
+ //printf(" IRQ %d", (flags & PCIEM_FLAGS_IRQ) >> 9);
+ xo_emit(" IRQ {:interrupt-message-number/%d}",
+ (flags & PCIEM_FLAGS_IRQ) >> 9);
cap = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CAP, 4);
cap2 = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CAP2, 4);
ctl = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CTL, 2);
- printf(" max data %d(%d)",
+ //printf(" max data %d(%d)",
+ xo_emit(" max data {:controller-maximum-payload/%d}"
+ "({:capability-maximum-payload/%d})",
MAX_PAYLOAD((ctl & PCIEM_CTL_MAX_PAYLOAD) >> 5),
MAX_PAYLOAD(cap & PCIEM_CAP_MAX_PAYLOAD));
if ((cap & PCIEM_CAP_FLR) != 0)
- printf(" FLR");
+ //printf(" FLR");
+ xo_emit(" FLR{eq:pci-express-capability-flr/true}");
cap = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_CAP, 4);
sta = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_STA, 2);
- printf(" link x%d(x%d)", (sta & PCIEM_LINK_STA_WIDTH) >> 4,
+ //printf(" link x%d(x%d)", (sta & PCIEM_LINK_STA_WIDTH) >> 4,
+ xo_emit(" link x{:link-width/%d}(x{:link-max-width/%d})",
+ (sta & PCIEM_LINK_STA_WIDTH) >> 4,
(cap & PCIEM_LINK_CAP_MAX_WIDTH) >> 4);
if ((cap & (PCIEM_LINK_CAP_MAX_WIDTH | PCIEM_LINK_CAP_ASPM)) != 0)
- printf("\n ");
+ //printf("\n ");
+ xo_emit("\n ");
if ((cap & PCIEM_LINK_CAP_MAX_WIDTH) != 0) {
- printf(" speed %s(%s)", (sta & PCIEM_LINK_STA_WIDTH) == 0 ?
+ //printf(" speed %s(%s)", (sta & PCIEM_LINK_STA_WIDTH) == 0 ?
+ xo_emit(" speed {n:link-speed/%s}({n:link-max-speed/%s})",
+ (sta & PCIEM_LINK_STA_WIDTH) == 0 ?
"0.0" : link_speed_string(sta & PCIEM_LINK_STA_SPEED),
link_speed_string(cap & PCIEM_LINK_CAP_MAX_SPEED));
}
if ((cap & PCIEM_LINK_CAP_ASPM) != 0) {
ctl = read_config(fd, &p->pc_sel, ptr + PCIER_LINK_CTL, 2);
- printf(" ASPM %s(%s)", aspm_string(ctl & PCIEM_LINK_CTL_ASPMC),
+ //printf(" ASPM %s(%s)", aspm_string(ctl & PCIEM_LINK_CTL_ASPMC),
+ xo_emit(" ASPM {:controller-active-state-power-management/%s}"
+ "({:capability-active-state-power-management/%s})",
+ aspm_string(ctl & PCIEM_LINK_CTL_ASPMC),
aspm_string((cap & PCIEM_LINK_CAP_ASPM) >> 10));
}
if ((cap2 & PCIEM_CAP2_ARI) != 0) {
ctl = read_config(fd, &p->pc_sel, ptr + PCIER_DEVICE_CTL2, 4);
- printf(" ARI %s",
+ //printf(" ARI %s",
+ xo_emit(" ARI {:pci-express-alternate-requester-id/%s}}",
(ctl & PCIEM_CTL2_ARI) ? "enabled" : "disabled");
}
}
@@ -500,12 +627,21 @@
pba_bar = PCIR_BAR(val & PCIM_MSIX_BIR_MASK);
pba_offset = val & ~PCIM_MSIX_BIR_MASK;
- printf("MSI-X supports %d message%s%s\n", msgnum,
- (msgnum == 1) ? "" : "s",
+ //printf("MSI-X supports %d message%s%s\n", msgnum,
+ xo_emit("{:capability-name/MSI-X} ");
+ xo_emit("supports {:tyble-size/%d} message{d:/%s%s}\n",
+ msgnum, (msgnum == 1) ? "" : "s",
(ctrl & PCIM_MSIXCTRL_MSIX_ENABLE) ? ", enabled" : "");
+ xo_emit("{e:msix-enable/%s}",
+ (ctrl & PCIM_MSIXCTRL_MSIX_ENABLE) ? "true" : "false");
- printf(" ");
- printf("Table in map 0x%x[0x%x], PBA in map 0x%x[0x%x]",
+ //printf(" ");
+ xo_emit(" ");
+ //printf("Table in map 0x%x[0x%x], PBA in map 0x%x[0x%x]",
+ xo_emit("Table in map {:base-index-register/0x%x}"
+ "[{:table-offset/0x%x}], "
+ "PBA in map {:pba-index-register/0x%x}"
+ "[{:pba-offset/0x%x}]",
table_bar, table_offset, pba_bar, pba_offset);
}
@@ -513,7 +649,9 @@
cap_sata(int fd, struct pci_conf *p, uint8_t ptr)
{
- printf("SATA Index-Data Pair");
+ //printf("SATA Index-Data Pair");
+ xo_emit("{:capability-name/SATA} ");
+ xo_emit("Index-Data Pair{eq:sata-index-data-pair/true}");
}
static void
@@ -522,9 +660,15 @@
uint8_t cap;
cap = read_config(fd, &p->pc_sel, ptr + PCIR_PCIAF_CAP, 1);
- printf("PCI Advanced Features:%s%s",
+ //printf("PCI Advanced Features:%s%s",
+ xo_emit("{:capability-name/PCI Advanced Features}:");
+ xo_emit("{d:/%s%s}",
cap & PCIM_PCIAFCAP_FLR ? " FLR" : "",
cap & PCIM_PCIAFCAP_TP ? " TP" : "");
+ xo_emit("{e:pci-avanced-feature-flr/%s}"
+ "{e:pci-advance-feature-tp/%s}",
+ cap & PCIM_PCIAFCAP_FLR ? "true" : "false",
+ cap & PCIM_PCIAFCAP_TP ? "true" : "false");
}
void
@@ -554,9 +698,14 @@
/* Walk the capability list. */
express = 0;
ptr = read_config(fd, &p->pc_sel, ptr, 1);
+ xo_open_list("capabilities");
while (ptr != 0 && ptr != 0xff) {
cap = read_config(fd, &p->pc_sel, ptr + PCICAP_ID, 1);
- printf(" cap %02x[%02x] = ", cap, ptr);
+ //printf(" cap %02x[%02x] = ", cap, ptr);
+ xo_open_instance("capability");
+ xo_emit(" cap {:capability-number/%02x/0x%x}"
+ "[{:capability-pointer/%02x/0x%x}] = ",
+ cap, ptr);
switch (cap) {
case PCIY_PMG:
cap_power(fd, p, ptr);
@@ -599,12 +748,15 @@
cap_pciaf(fd, p, ptr);
break;
default:
- printf("unknown");
+ //printf("unknown");
+ xo_emit("{:name/unknown}");
break;
}
- printf("\n");
+ xo_emit("\n");
+ xo_close_instance("capability");
ptr = read_config(fd, &p->pc_sel, ptr + PCICAP_NEXTPTR, 1);
}
+ xo_close_list("capabilities");
if (express)
list_ecaps(fd, p);
@@ -628,15 +780,20 @@
{
uint32_t sta, mask;
- printf("AER %d", ver);
+ //printf("AER %d", ver);
+ xo_emit("AER {eq:capability-name/Advanced Error Reporting}");
+ xo_emit("{:advanced-error-reporting-version/%d}", ver);
if (ver < 1)
return;
sta = read_config(fd, &p->pc_sel, ptr + PCIR_AER_UC_STATUS, 4);
mask = read_config(fd, &p->pc_sel, ptr + PCIR_AER_UC_SEVERITY, 4);
- printf(" %d fatal", bitcount32(sta & mask));
- printf(" %d non-fatal", bitcount32(sta & ~mask));
+ //printf(" %d fatal", bitcount32(sta & mask));
+ xo_emit(" {:fatal-errors/%d} fatal", bitcount32(sta & mask));
+ //printf(" %d non-fatal", bitcount32(sta & ~mask));
+ xo_emit(" {:non-fatal-errors/%d} non-fatal", bitcount32(sta & ~mask));
sta = read_config(fd, &p->pc_sel, ptr + PCIR_AER_COR_STATUS, 4);
- printf(" %d corrected", bitcount32(sta));
+ //printf(" %d corrected", bitcount32(sta));
+ xo_emit(" {:corrected-errors/%d} corrected", bitcount32(sta));
}
static void
@@ -644,13 +801,17 @@
{
uint32_t cap1;
- printf("VC %d", ver);
+ //printf("VC %d", ver);
+ xo_emit("VC {eq:capability-name/Virtual Channels}");
+ xo_emit("{:virtual-channel-version/%d}", ver);
if (ver < 1)
return;
cap1 = read_config(fd, &p->pc_sel, ptr + PCIR_VC_CAP1, 4);
- printf(" max VC%d", cap1 & PCIM_VC_CAP1_EXT_COUNT);
+ //printf(" max VC%d", cap1 & PCIM_VC_CAP1_EXT_COUNT);
+ xo_emit(" max VC{:highest-virtual-channel-number/%d}", cap1 & PCIM_VC_CAP1_EXT_COUNT);
if ((cap1 & PCIM_VC_CAP1_LOWPRI_EXT_COUNT) != 0)
- printf(" lowpri VC0-VC%d",
+ //printf(" lowpri VC0-VC%d",
+ xo_emit(" lowpri VC0-VC{:highest-low-priority-virtual-channel-number/%d}",
(cap1 & PCIM_VC_CAP1_LOWPRI_EXT_COUNT) >> 4);
}
@@ -659,12 +820,15 @@
{
uint32_t high, low;
- printf("Serial %d", ver);
+ //printf("Serial %d", ver);
+ xo_emit("Serial {eq:capability-name/Serial Number}");
+ xo_emit("{:serial-number-version/%d}", ver);
if (ver < 1)
return;
low = read_config(fd, &p->pc_sel, ptr + PCIR_SERIAL_LOW, 4);
high = read_config(fd, &p->pc_sel, ptr + PCIR_SERIAL_HIGH, 4);
- printf(" %08x%08x", high, low);
+ //printf(" %08x%08x", high, low);
+ xo_emit(" {:serial-number/%08x%08x/0x%x%08x}", high, low);
}
static void
@@ -672,11 +836,14 @@
{
uint32_t val;
- printf("Vendor %d", ver);
+ //printf("Vendor %d", ver);
+ xo_emit("{capability-name/Vendor} ");
+ xo_emit("{:vendor-version/%d}", ver);
if (ver < 1)
return;
val = read_config(fd, &p->pc_sel, ptr + 4, 4);
- printf(" ID %d", val & 0xffff);
+ //printf(" ID %d", val & 0xffff);
+ xo_emit(" ID {:vendor-id/%d}", val & 0xffff);
}
static void
@@ -684,11 +851,14 @@
{
uint32_t val;
- printf("PCIe Sec %d", ver);
+ //printf("PCIe Sec %d", ver);
+ xo_emit("{eq:capability-name/Secondary Uncorrectable Errors}");
+ xo_emit("PCIe Sec {:version/%d}", ver);
if (ver < 1)
return;
val = read_config(fd, &p->pc_sel, ptr + 8, 4);
- printf(" lane errors %#x", val);
+ //printf(" lane errors %#x", val);
+ xo_emit(" lane errors {:lane-errors/%#x}", val);
}
struct {
@@ -725,8 +895,13 @@
ecap = read_config(fd, &p->pc_sel, ptr, 4);
if (ecap == 0xffffffff || ecap == 0)
return;
+ xo_open_list("extended-capabilities");
for (;;) {
- printf(" ecap %04x[%03x] = ", PCI_EXTCAP_ID(ecap), ptr);
+ xo_open_instance("extended-capability");
+ //printf(" ecap %04x[%03x] = ", PCI_EXTCAP_ID(ecap), ptr);
+ xo_emit(" ecap {:extended-capability-number/%04x/0x%x}"
+ "[{:capability-pointer/%03x/0x%x}] = ",
+ PCI_EXTCAP_ID(ecap), ptr);
switch (PCI_EXTCAP_ID(ecap)) {
case PCIZ_AER:
ecap_aer(fd, p, ptr, PCI_EXTCAP_VER(ecap));
@@ -750,15 +925,21 @@
name = ecap_names[i].name;
break;
}
- printf("%s %d", name, PCI_EXTCAP_VER(ecap));
+ //printf("%s %d", name, PCI_EXTCAP_VER(ecap));
+ xo_emit("{:extended-capability-type/%s} "
+ "{:extended-capability-version/%d}",
+ name, PCI_EXTCAP_VER(ecap));
break;
}
- printf("\n");
+ //printf("\n");
+ xo_emit("\n");
+ xo_close_instance("extended-capability");
ptr = PCI_EXTCAP_NEXTPTR(ecap);
if (ptr == 0)
break;
ecap = read_config(fd, &p->pc_sel, ptr, 4);
}
+ xo_close_list("extended-capabilities");
}
/* Find offset of a specific capability. Returns 0 on failure. */
Index: err.c
===================================================================
--- err.c
+++ err.c
@@ -35,6 +35,7 @@
#include <err.h>
#include <stdio.h>
+#include <libxo/xo.h>
#include <dev/pci/pcireg.h>
@@ -111,6 +112,17 @@
{ 0, NULL },
};
+static int errors;
+
+static void
+print_header(const char *header)
+{
+ if (errors++ == 0)
+ xo_open_list("error-categories");
+ xo_open_instance("error-category");
+ xo_emit("{:category/%14s} = ", header);
+}
+
static void
print_bits(const char *header, struct bit_table *table, uint32_t mask)
{
@@ -120,20 +132,30 @@
for (; table->desc != NULL; table++)
if (mask & table->mask) {
if (first) {
- printf("%14s = ", header);
+ print_header(header);
+ xo_open_list("detected-errors");
first = 0;
} else
- printf(" ");
- printf("%s\n", table->desc);
+ xo_emit(" ");
+ xo_open_instance("detected");
+ xo_emit("{:error/%s}\n", table->desc);
+ xo_close_instance("detected");
mask &= ~table->mask;
}
+ if (!first)
+ xo_close_list("detected-errors");
if (mask != 0) {
- if (first)
- printf("%14s = ", header);
- else
- printf(" ");
- printf("Unknown: 0x%08x\n", mask);
+ if (first) {
+ print_header(header);
+ first = 0;
+ } else
+ xo_emit(" ");
+ xo_emit("Unknown: {:unknown-errors-bitmask/0x%08x}\n", mask);
}
+ if (!first)
+ xo_close_instance("error-category");
+ if (errors != 0)
+ xo_close_list("error-categories");
}
void
@@ -143,6 +165,8 @@
uint16_t sta, aer;
uint8_t pcie;
+ errors = 0;
+
/* First check for standard PCI errors. */
sta = read_config(fd, &p->pc_sel, PCIR_STATUS, 2);
print_bits("PCI errors", pci_status, sta & PCI_ERRORS);
Index: pciconf.c
===================================================================
--- pciconf.c
+++ pciconf.c
@@ -45,6 +45,7 @@
#include <unistd.h>
#include <sys/pciio.h>
#include <sys/queue.h>
+#include <libxo/xo.h>
#include <dev/pci/pcireg.h>
@@ -86,7 +87,8 @@
static void
usage(void)
{
- fprintf(stderr, "%s\n%s\n%s\n%s\n",
+
+ xo_error("%s\n%s\n%s\n%s\n",
"usage: pciconf -l [-bcevV] [device]",
" pciconf -a device",
" pciconf -r [-b | -h] device addr[:addr2]",
@@ -105,6 +107,10 @@
listmode = readmode = writemode = attachedmode = 0;
bars = caps = errors = verbose = vpd = byte = isshort = 0;
+ argc = xo_parse_args(argc, argv);
+ if (argc < 0)
+ usage();
+
while ((c = getopt(argc, argv, "abcehlrwvV")) != -1) {
switch(c) {
case 'a':
@@ -173,7 +179,7 @@
} else {
usage();
}
-
+ xo_finish();
return exitstatus;
}
@@ -192,7 +198,7 @@
fd = open(_PATH_DEVPCI, (caps || errors) ? O_RDWR : O_RDONLY, 0);
if (fd < 0)
- err(1, "%s", _PATH_DEVPCI);
+ xo_err(1, "%s", _PATH_DEVPCI);
bzero(&pc, sizeof(struct pci_conf_io));
pc.match_buf_len = sizeof(conf);
@@ -210,7 +216,7 @@
do {
if (ioctl(fd, PCIOCGETCONF, &pc) == -1)
- err(1, "ioctl(PCIOCGETCONF)");
+ xo_err(1, "ioctl(PCIOCGETCONF)");
/*
* 255 entries should be more than enough for most people,
@@ -221,28 +227,42 @@
* not be desirable.
*/
if (pc.status == PCI_GETCONF_LIST_CHANGED) {
- warnx("PCI device list changed, please try again");
+ xo_warnx("PCI device list changed, please try again");
exitstatus = 1;
close(fd);
return;
} else if (pc.status == PCI_GETCONF_ERROR) {
- warnx("error returned from PCIOCGETCONF ioctl");
+ xo_warnx("error returned from PCIOCGETCONF ioctl");
exitstatus = 1;
close(fd);
return;
}
+ xo_open_list("pci-devices");
for (p = conf; p < &conf[pc.num_matches]; p++) {
- printf("%s%d@pci%d:%d:%d:%d:\tclass=0x%06x card=0x%08x "
- "chip=0x%08x rev=0x%02x hdr=0x%02x\n",
+ xo_open_instance("pci-device");
+ xo_emit("{kq:device/%s%d}",
(p->pd_name && *p->pd_name) ? p->pd_name :
"none",
(p->pd_name && *p->pd_name) ? (int)p->pd_unit :
- none_count++, p->pc_sel.pc_domain,
- p->pc_sel.pc_bus, p->pc_sel.pc_dev,
- p->pc_sel.pc_func, (p->pc_class << 16) |
- (p->pc_subclass << 8) | p->pc_progif,
- (p->pc_subdevice << 16) | p->pc_subvendor,
- (p->pc_device << 16) | p->pc_vendor,
+ none_count++);
+ xo_emit("@pci{:domain-number/%d}:"
+ "{:bus-number/%d}:"
+ "{:device-number/%d}:"
+ "{:function-number/%d}:\t",
+ p->pc_sel.pc_domain, p->pc_sel.pc_bus,
+ p->pc_sel.pc_dev, p->pc_sel.pc_func);
+ xo_emit("class={:base-class/0x%02x}"
+ "{:sub-class/%02x/0x%02x}"
+ "{:programming-interface/%02x/0x%02x} ",
+ p->pc_class, p->pc_subclass, p->pc_progif);
+ xo_emit("card={:card-device-id/0x%04x}"
+ "{:card-vendor-id/%04x/0x%04x} ",
+ p->pc_subdevice, p->pc_subvendor);
+ xo_emit("chip={:chip-device-id/0x%04x}"
+ "{:chip-vendor-id/%4x/0x%04x} ",
+ p->pc_device, p->pc_vendor);
+ xo_emit("rev={:chip-revision/0x%02x} "
+ "hdr={:header-type/0x%02x}\n",
p->pc_revid, p->pc_hdr);
if (verbose)
list_verbose(p);
@@ -254,7 +274,9 @@
list_errors(fd, p);
if (vpd)
list_vpd(fd, p);
+ xo_close_instance("pci-device");
}
+ xo_close_list("pci-devices");
} while (pc.status == PCI_GETCONF_MORE_DEVS);
close(fd);
@@ -282,6 +304,7 @@
return;
}
+ xo_open_list("base-addresses");
for (i = 0; i <= max; i++) {
bar.pbi_sel = p->pc_sel;
bar.pbi_reg = PCIR_BAR(i);
@@ -311,11 +334,14 @@
}
base = bar.pbi_base & ~((uint64_t)0xf);
}
- printf(" bar [%02x] = type %s, range %2d, base %#jx, ",
+ xo_open_instance("base-address");
+ xo_emit(" bar [{:register-offset/%#02x}] = type {:type/%s}, range {:address-bits/%2d}, base {:base-address/%#jx}, ",
PCIR_BAR(i), type, range, (uintmax_t)base);
- printf("size %ju, %s\n", (uintmax_t)bar.pbi_length,
+ xo_emit("size {:size/%ju}, {:state/%s}\n", (uintmax_t)bar.pbi_length,
bar.pbi_enabled ? "enabled" : "disabled");
+ xo_close_instance("base-address");
}
+ xo_close_list("base-addresses");
}
static void
@@ -327,7 +353,7 @@
TAILQ_FOREACH(vi, &pci_vendors, link) {
if (vi->id == p->pc_vendor) {
- printf(" vendor = '%s'\n", vi->desc);
+ xo_emit(" vendor = '{:vendor-name/%s}'\n", vi->desc);
break;
}
}
@@ -336,15 +362,15 @@
} else {
TAILQ_FOREACH(di, &vi->devs, link) {
if (di->id == p->pc_device) {
- printf(" device = '%s'\n", di->desc);
+ xo_emit(" device = '{:device-name/%s}'\n", di->desc);
break;
}
}
}
if ((dp = guess_class(p)) != NULL)
- printf(" class = %s\n", dp);
+ xo_emit(" class = {:class-name/%s}\n", dp);
if ((dp = guess_subclass(p)) != NULL)
- printf(" subclass = %s\n", dp);
+ xo_emit(" subclass = {:subclass-name/%s}\n", dp);
}
static void
@@ -352,6 +378,9 @@
{
struct pci_list_vpd_io list;
struct pci_vpd_element *vpd, *end;
+ int cap_printed; // XXX: This function assumes that "capabilities"
+ int item_printed; // and "items" are grouped together in the VPD
+ int vpd_printed; // and that all "items" come at the end of VPD
list.plvi_sel = p->pc_sel;
list.plvi_len = 0;
@@ -367,13 +396,11 @@
vpd = list.plvi_data;
end = (struct pci_vpd_element *)((char *)vpd + list.plvi_len);
- for (; vpd < end; vpd = PVE_NEXT(vpd)) {
- if (vpd->pve_flags == PVE_FLAG_IDENT) {
- printf(" VPD ident = '%.*s'\n",
- (int)vpd->pve_datalen, vpd->pve_data);
- continue;
- }
+ cap_printed = 0;
+ item_printed = 0;
+ vpd_printed = 0;
+ for (; vpd < end; vpd = PVE_NEXT(vpd)) {
/* Ignore the checksum keyword. */
if (!(vpd->pve_flags & PVE_FLAG_RW) &&
memcmp(vpd->pve_keyword, "RV", 2) == 0)
@@ -384,23 +411,55 @@
memcmp(vpd->pve_keyword, "RW", 2) == 0)
continue;
+ if (!vpd_printed) {
+ xo_open_container("vital-product-data");
+ vpd_printed = 1;
+ }
+
+ if (vpd->pve_flags == PVE_FLAG_IDENT) {
+ xo_emit(" VPD ident = '{:ident/%*s}'\n",
+ vpd->pve_datalen, (void*)&vpd->pve_data);
+ continue;
+ }
+
/* Handle extended capability keyword. */
if (!(vpd->pve_flags & PVE_FLAG_RW) &&
memcmp(vpd->pve_keyword, "CP", 2) == 0) {
- printf(" VPD ro CP = ID %02x in map 0x%x[0x%x]\n",
+ if (!cap_printed) {
+ xo_open_list("capabilities");
+ cap_printed = 1;
+ }
+ xo_open_instance("capability");
+ xo_emit(" VPD {:mode/ro} {:keyword/CP} = ID {:ident-number/%02x} in map {:base-address/%#x}[{:data/%#x}]\n",
(unsigned int)vpd->pve_data[0],
PCIR_BAR((unsigned int)vpd->pve_data[1]),
- (unsigned int)vpd->pve_data[3] << 8 |
- (unsigned int)vpd->pve_data[2]);
+ (unsigned int)vpd->pve_data[3] << 8 | (unsigned int)vpd->pve_data[2]);
+ xo_close_instance("capability");
continue;
}
+ if (cap_printed) {
+ xo_close_list("capabilities");
+ }
/* Remaining keywords should all have ASCII values. */
- printf(" VPD %s %c%c = '%.*s'\n",
+ if (!item_printed) {
+ xo_open_list("items");
+ item_printed = 1;
+ }
+ xo_open_instance("item");
+ xo_emit(" VPD {:read-write-mode/%s} {:keyword/%c%c} = '{:value/%*s}'\n",
vpd->pve_flags & PVE_FLAG_RW ? "rw" : "ro",
- vpd->pve_keyword[0], vpd->pve_keyword[1],
- (int)vpd->pve_datalen, vpd->pve_data);
+ vpd->pve_keyword[0], vpd->pve_keyword[1],
+ vpd->pve_datalen, (void*)&vpd->pve_data);
+ xo_close_instance("item");
}
+ if (item_printed) {
+ xo_close_list("items");
+ }
+ if (vpd_printed) {
+ xo_close_container("vital-product-data");
+ }
+ xo_finish();
free(list.plvi_data);
}
@@ -573,13 +632,13 @@
if ((id == 0) || (strlen(str) < 1))
continue;
if ((cv = malloc(sizeof(struct pci_vendor_info))) == NULL) {
- warn("allocating vendor entry");
+ xo_warn("allocating vendor entry");
error = 1;
break;
}
if ((cv->desc = strdup(str)) == NULL) {
free(cv);
- warn("allocating vendor description");
+ xo_warn("allocating vendor description");
error = 1;
break;
}
@@ -594,17 +653,17 @@
if ((id == 0) || (strlen(str) < 1))
continue;
if (cv == NULL) {
- warnx("device entry with no vendor!");
+ xo_warnx("device entry with no vendor!");
continue;
}
if ((cd = malloc(sizeof(struct pci_device_info))) == NULL) {
- warn("allocating device entry");
+ xo_warn("allocating device entry");
error = 1;
break;
}
if ((cd->desc = strdup(str)) == NULL) {
free(cd);
- warn("allocating device description");
+ xo_warn("allocating device description");
error = 1;
break;
}
@@ -632,7 +691,7 @@
pi.pi_width = width;
if (ioctl(fd, PCIOCREAD, &pi) < 0)
- err(1, "ioctl(PCIOCREAD)");
+ xo_err(1, "ioctl(PCIOCREAD)");
return (pi.pi_data);
}
@@ -648,7 +707,7 @@
fd = open(_PATH_DEVPCI, O_RDONLY, 0);
if (fd < 0)
- err(1, "%s", _PATH_DEVPCI);
+ xo_err(1, "%s", _PATH_DEVPCI);
bzero(&pc, sizeof(struct pci_conf_io));
pc.match_buf_len = sizeof(conf);
@@ -662,16 +721,16 @@
* find the start of the unit.
*/
if (name[0] == '\0')
- errx(1, "Empty device name");
+ xo_errx(1, "Empty device name");
cp = strchr(name, '\0');
assert(cp != NULL && cp != name);
cp--;
while (cp != name && isdigit(cp[-1]))
cp--;
if (cp == name || !isdigit(*cp))
- errx(1, "Invalid device name");
+ xo_errx(1, "Invalid device name");
if ((size_t)(cp - name) + 1 > sizeof(patterns[0].pd_name))
- errx(1, "Device name is too long");
+ xo_errx(1, "Device name is too long");
memcpy(patterns[0].pd_name, name, cp - name);
patterns[0].pd_unit = strtol(cp, &cp, 10);
assert(*cp == '\0');
@@ -681,13 +740,13 @@
pc.patterns = patterns;
if (ioctl(fd, PCIOCGETCONF, &pc) == -1)
- err(1, "ioctl(PCIOCGETCONF)");
+ xo_err(1, "ioctl(PCIOCGETCONF)");
if (pc.status != PCI_GETCONF_LAST_DEVICE &&
pc.status != PCI_GETCONF_MORE_DEVS)
- errx(1, "error returned from PCIOCGETCONF ioctl");
+ xo_errx(1, "error returned from PCIOCGETCONF ioctl");
close(fd);
if (pc.num_matches == 0)
- errx(1, "Device not found");
+ xo_errx(1, "Device not found");
return (conf[0].pc_sel);
}
@@ -726,7 +785,7 @@
sel.pc_domain = 0;
}
if (*ep != '\x0' || ep == epbase)
- errx(1, "cannot parse selector %s", str);
+ xo_errx(1, "cannot parse selector %s", str);
return sel;
}
@@ -747,8 +806,10 @@
static void
readone(int fd, struct pcisel *sel, long reg, int width)
{
-
- printf("%0*x", width*2, read_config(fd, sel, reg, width));
+ xo_open_instance("config-register");
+ xo_emit("{ke:offset/0x%02x}{:data/0x%0*x}{e:width/%d}",
+ reg, width*2, read_config(fd, sel, reg, width), width);
+ xo_close_instance("config-register");
}
static void
@@ -764,7 +825,7 @@
fd = open(_PATH_DEVPCI, O_RDWR, 0);
if (fd < 0)
- err(1, "%s", _PATH_DEVPCI);
+ xo_err(1, "%s", _PATH_DEVPCI);
rend = rstart = strtol(reg, &end, 0);
if (end && *end == ':') {
@@ -772,14 +833,20 @@
rend = strtol(end, (char **) 0, 0);
}
sel = getsel(name);
+ xo_open_list("config-space");
for (i = 1, r = rstart; r <= rend; i++, r += width) {
readone(fd, &sel, r, width);
if (i && !(i % 8))
- putchar(' ');
- putchar(i % (16/width) ? ' ' : '\n');
+ xo_emit(" ");
+ if (i % (16/width)) {
+ xo_emit(" ");
+ } else {
+ xo_emit("\n");
+ }
}
if (i % (16/width) != 1)
- putchar('\n');
+ xo_emit("\n");
+ xo_close_list("config-space");
close(fd);
}
@@ -796,10 +863,10 @@
fd = open(_PATH_DEVPCI, O_RDWR, 0);
if (fd < 0)
- err(1, "%s", _PATH_DEVPCI);
+ xo_err(1, "%s", _PATH_DEVPCI);
if (ioctl(fd, PCIOCWRITE, &pi) < 0)
- err(1, "ioctl(PCIOCWRITE)");
+ xo_err(1, "ioctl(PCIOCWRITE)");
}
static void
@@ -812,11 +879,13 @@
fd = open(_PATH_DEVPCI, O_RDWR, 0);
if (fd < 0)
- err(1, "%s", _PATH_DEVPCI);
+ xo_err(1, "%s", _PATH_DEVPCI);
if (ioctl(fd, PCIOCATTACHED, &pi) < 0)
- err(1, "ioctl(PCIOCATTACHED)");
+ xo_err(1, "ioctl(PCIOCATTACHED)");
+ xo_open_container("device-status");
+ xo_emit("{:name/%s}: {:status/%s%s}\n", name, pi.pi_data == 0 ? "not " : "", "attached");
+ xo_close_container("device-status");
exitstatus = pi.pi_data ? 0 : 2; /* exit(2), if NOT attached */
- printf("%s: %s%s\n", name, pi.pi_data == 0 ? "not " : "", "attached");
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Feb 22, 12:23 AM (3 h, 4 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16763333
Default Alt Text
D1206.id2680.vs2617.diff (39 KB)
Attached To
Mode
D1206: Add libxo support to pciconf
Attached
Detach File
Event Timeline
Log In to Comment