Add lspci command and SI_PCI_INFO getsysinfo call
This commit is contained in:
parent
045f1cdb10
commit
cb6dbfca2c
@ -119,6 +119,7 @@ ALL = \
|
|||||||
lp \
|
lp \
|
||||||
lpd \
|
lpd \
|
||||||
ls \
|
ls \
|
||||||
|
lspci \
|
||||||
mail \
|
mail \
|
||||||
man \
|
man \
|
||||||
mesg \
|
mesg \
|
||||||
@ -532,6 +533,10 @@ ls: ls.c
|
|||||||
$(CCLD) -o $@ $<
|
$(CCLD) -o $@ $<
|
||||||
@install -S 20kw $@
|
@install -S 20kw $@
|
||||||
|
|
||||||
|
lspci: lspci.c
|
||||||
|
$(CCLD) -o $@ $<
|
||||||
|
@install -S 4kw $@
|
||||||
|
|
||||||
mail: mail.c
|
mail: mail.c
|
||||||
$(CCLD) -o $@ $<
|
$(CCLD) -o $@ $<
|
||||||
@install -S 4kw $@
|
@install -S 4kw $@
|
||||||
@ -1012,6 +1017,7 @@ install: \
|
|||||||
/usr/bin/lpd \
|
/usr/bin/lpd \
|
||||||
/usr/bin/ls \
|
/usr/bin/ls \
|
||||||
/bin/ls \
|
/bin/ls \
|
||||||
|
/usr/bin/lspci \
|
||||||
/usr/bin/mail \
|
/usr/bin/mail \
|
||||||
/usr/bin/man \
|
/usr/bin/man \
|
||||||
/usr/bin/mesg \
|
/usr/bin/mesg \
|
||||||
@ -1404,6 +1410,9 @@ install: \
|
|||||||
/bin/ls: ls
|
/bin/ls: ls
|
||||||
install -cs -o bin $< $@
|
install -cs -o bin $< $@
|
||||||
|
|
||||||
|
/usr/bin/lspci: lspci
|
||||||
|
install -cs -o bin $< $@
|
||||||
|
|
||||||
/usr/bin/mail: mail
|
/usr/bin/mail: mail
|
||||||
install -cs -o root -m 4755 $< $@
|
install -cs -o root -m 4755 $< $@
|
||||||
|
|
||||||
|
53
commands/simple/lspci.c
Normal file
53
commands/simple/lspci.c
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2009, Erik van der Kouwe
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <minix/com.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct pciinfo_entry *entry;
|
||||||
|
struct pciinfo pciinfo;
|
||||||
|
|
||||||
|
/* obtain a list of PCI devices from PM */
|
||||||
|
if (getsysinfo(PM_PROC_NR, SI_PCI_INFO, &pciinfo) < 0)
|
||||||
|
{
|
||||||
|
perror("getsysinfo failed");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print the list of devices */
|
||||||
|
entry = pciinfo.pi_entries;
|
||||||
|
while (pciinfo.pi_count-- > 0)
|
||||||
|
{
|
||||||
|
printf("%.4X:%.4X %s\n", entry->pie_vid, entry->pie_did, entry->pie_name);
|
||||||
|
entry++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -33,9 +33,6 @@ Created: Jan 2000 by Philip Homburg <philip@cs.vu.nl>
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <minix/sysutil.h>
|
#include <minix/sysutil.h>
|
||||||
|
|
||||||
#define NR_PCIBUS 40
|
|
||||||
#define NR_PCIDEV 50
|
|
||||||
|
|
||||||
#define PBT_INTEL_HOST 1
|
#define PBT_INTEL_HOST 1
|
||||||
#define PBT_PCIBRIDGE 2
|
#define PBT_PCIBRIDGE 2
|
||||||
#define PBT_CARDBUS 3
|
#define PBT_CARDBUS 3
|
||||||
|
@ -95,4 +95,8 @@
|
|||||||
#define SPROFILE 1 /* statistical profiling */
|
#define SPROFILE 1 /* statistical profiling */
|
||||||
#define CPROFILE 0 /* call profiling */
|
#define CPROFILE 0 /* call profiling */
|
||||||
|
|
||||||
|
/* PCI configuration parameters */
|
||||||
|
#define NR_PCIBUS 40
|
||||||
|
#define NR_PCIDEV 50
|
||||||
|
|
||||||
#endif /* _CONFIG_H */
|
#endif /* _CONFIG_H */
|
||||||
|
@ -193,5 +193,20 @@ struct k_randomness {
|
|||||||
} bin[RANDOM_SOURCES];
|
} bin[RANDOM_SOURCES];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* information on PCI devices */
|
||||||
|
|
||||||
|
#define PCIINFO_ENTRY_SIZE 80
|
||||||
|
|
||||||
|
struct pciinfo_entry {
|
||||||
|
u16_t pie_vid;
|
||||||
|
u16_t pie_did;
|
||||||
|
char pie_name[PCIINFO_ENTRY_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pciinfo {
|
||||||
|
size_t pi_count;
|
||||||
|
struct pciinfo_entry pi_entries[NR_PCIDEV];
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _TYPE_H */
|
#endif /* _TYPE_H */
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#define SI_LOADINFO 6 /* get copy of load average structure */
|
#define SI_LOADINFO 6 /* get copy of load average structure */
|
||||||
#define SI_KPROC_TAB 7 /* copy of kernel process table */
|
#define SI_KPROC_TAB 7 /* copy of kernel process table */
|
||||||
#define SI_CALL_STATS 8 /* system call statistics */
|
#define SI_CALL_STATS 8 /* system call statistics */
|
||||||
|
#define SI_PCI_INFO 9 /* get kernel info via PM */
|
||||||
|
|
||||||
/* NULL must be defined in <unistd.h> according to POSIX Sec. 2.7.1. */
|
/* NULL must be defined in <unistd.h> according to POSIX Sec. 2.7.1. */
|
||||||
#define NULL ((void *)0)
|
#define NULL ((void *)0)
|
||||||
|
@ -13,7 +13,7 @@ PUBLIC char *pci_dev_name(vid, did)
|
|||||||
u16_t vid;
|
u16_t vid;
|
||||||
u16_t did;
|
u16_t did;
|
||||||
{
|
{
|
||||||
static char name[80]; /* We need a better interface for this */
|
static char name[PCIINFO_ENTRY_SIZE]; /* We need a better interface for this */
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
cp_grant_id_t gid;
|
cp_grant_id_t gid;
|
||||||
@ -41,7 +41,9 @@ u16_t did;
|
|||||||
|
|
||||||
if (m.m_type == ENOENT)
|
if (m.m_type == ENOENT)
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
printf("pci_dev_name: got no name\n");
|
printf("pci_dev_name: got no name\n");
|
||||||
|
#endif
|
||||||
return NULL; /* No name for this device */
|
return NULL; /* No name for this device */
|
||||||
}
|
}
|
||||||
if (m.m_type != 0)
|
if (m.m_type != 0)
|
||||||
|
15
man/man1/lspci.1
Normal file
15
man/man1/lspci.1
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
.TH LSPCI 1
|
||||||
|
.SH NAME
|
||||||
|
lspci \- print table of PCI devices
|
||||||
|
.SH SYNOPSIS
|
||||||
|
\fBlspci\fP
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The
|
||||||
|
.B lspci
|
||||||
|
utility prints a list of devices detected on the PCI bus to the standard output.
|
||||||
|
Each row specifies the vendor ID, device ID and device name according to the
|
||||||
|
MINIX PCI table. The vendor ID and device ID are printed in hexadecimal.
|
||||||
|
Wherever the name is missing, MINIX does not recognize the PCI device.
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page and the utility were written by Erik van der Kouwe
|
||||||
|
<vdkouwe@cs.vu.nl>.
|
@ -29,6 +29,7 @@
|
|||||||
#include <archconst.h>
|
#include <archconst.h>
|
||||||
#include <archtypes.h>
|
#include <archtypes.h>
|
||||||
#include <lib.h>
|
#include <lib.h>
|
||||||
|
#include <assert.h>
|
||||||
#include "mproc.h"
|
#include "mproc.h"
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "../../kernel/proc.h"
|
#include "../../kernel/proc.h"
|
||||||
@ -62,6 +63,8 @@ PRIVATE char *uts_tbl[] = {
|
|||||||
PUBLIC unsigned long calls_stats[NCALLS];
|
PUBLIC unsigned long calls_stats[NCALLS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
FORWARD _PROTOTYPE( int getpciinfo, (struct pciinfo *pciinfo) );
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* do_allocmem *
|
* do_allocmem *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
@ -201,6 +204,7 @@ PUBLIC int do_getsysinfo()
|
|||||||
vir_bytes src_addr, dst_addr;
|
vir_bytes src_addr, dst_addr;
|
||||||
struct kinfo kinfo;
|
struct kinfo kinfo;
|
||||||
struct loadinfo loadinfo;
|
struct loadinfo loadinfo;
|
||||||
|
struct pciinfo pciinfo;
|
||||||
static struct proc proctab[NR_PROCS+NR_TASKS];
|
static struct proc proctab[NR_PROCS+NR_TASKS];
|
||||||
size_t len;
|
size_t len;
|
||||||
int s, r;
|
int s, r;
|
||||||
@ -240,6 +244,12 @@ PUBLIC int do_getsysinfo()
|
|||||||
src_addr = (vir_bytes) &loadinfo;
|
src_addr = (vir_bytes) &loadinfo;
|
||||||
len = sizeof(struct loadinfo);
|
len = sizeof(struct loadinfo);
|
||||||
break;
|
break;
|
||||||
|
case SI_PCI_INFO: /* PCI info is obtained via PM */
|
||||||
|
if ((r=getpciinfo(&pciinfo)) != OK)
|
||||||
|
return r;
|
||||||
|
src_addr = (vir_bytes) &pciinfo;
|
||||||
|
len = sizeof(struct pciinfo);
|
||||||
|
break;
|
||||||
#if ENABLE_SYSCALL_STATS
|
#if ENABLE_SYSCALL_STATS
|
||||||
case SI_CALL_STATS:
|
case SI_CALL_STATS:
|
||||||
src_addr = (vir_bytes) calls_stats;
|
src_addr = (vir_bytes) calls_stats;
|
||||||
@ -593,3 +603,44 @@ char *brk_addr;
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* getpciinfo *
|
||||||
|
*===========================================================================*/
|
||||||
|
|
||||||
|
PRIVATE int getpciinfo(pciinfo)
|
||||||
|
struct pciinfo *pciinfo;
|
||||||
|
{
|
||||||
|
int devind, r;
|
||||||
|
struct pciinfo_entry *entry;
|
||||||
|
char *name;
|
||||||
|
u16_t vid, did;
|
||||||
|
|
||||||
|
/* look up PCI process number */
|
||||||
|
pci_init();
|
||||||
|
|
||||||
|
/* start enumerating devices */
|
||||||
|
entry = pciinfo->pi_entries;
|
||||||
|
r = pci_first_dev(&devind, &vid, &did);
|
||||||
|
while (r)
|
||||||
|
{
|
||||||
|
/* fetch device name */
|
||||||
|
name = pci_dev_name(vid, did);
|
||||||
|
if (!name)
|
||||||
|
name = "";
|
||||||
|
|
||||||
|
/* store device information in table */
|
||||||
|
assert((char *) entry < (char *) (pciinfo + 1));
|
||||||
|
entry->pie_vid = vid;
|
||||||
|
entry->pie_did = did;
|
||||||
|
strncpy(entry->pie_name, name, sizeof(entry->pie_name));
|
||||||
|
entry->pie_name[sizeof(entry->pie_name) - 1] = 0;
|
||||||
|
entry++;
|
||||||
|
|
||||||
|
/* continue with the next device */
|
||||||
|
r = pci_next_dev(&devind, &vid, &did);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store number of entries */
|
||||||
|
pciinfo->pi_count = entry - pciinfo->pi_entries;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user