PERFORCE change 158695 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Mar 4 14:16:24 PST 2009
http://perforce.freebsd.org/chv.cgi?CH=158695
Change 158695 by hselasky at hselasky_laptop001 on 2009/03/04 22:16:12
IFC @ 158694 (Need vga_pci.c patch)
Affected files ...
.. //depot/projects/usb/src/sys/amd64/linux32/linux.h#10 integrate
.. //depot/projects/usb/src/sys/amd64/linux32/linux32_sysvec.c#14 integrate
.. //depot/projects/usb/src/sys/compat/linux/linux_misc.c#17 integrate
.. //depot/projects/usb/src/sys/compat/linux/linux_misc.h#3 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-acerlabs.c#3 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-ahci.c#5 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-intel.c#3 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-marvell.c#4 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-nvidia.c#3 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-siliconimage.c#3 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-sis.c#4 integrate
.. //depot/projects/usb/src/sys/dev/ata/chipsets/ata-via.c#3 integrate
.. //depot/projects/usb/src/sys/dev/pci/pci.c#16 integrate
.. //depot/projects/usb/src/sys/dev/pci/vga_pci.c#3 integrate
.. //depot/projects/usb/src/sys/fs/udf/udf_vnops.c#15 integrate
.. //depot/projects/usb/src/sys/i386/linux/linux.h#10 integrate
.. //depot/projects/usb/src/sys/i386/linux/linux_sysvec.c#10 integrate
.. //depot/projects/usb/src/sys/net80211/ieee80211_scan_sta.c#10 integrate
.. //depot/projects/usb/src/sys/netinet/sctp_constants.h#14 integrate
.. //depot/projects/usb/src/sys/netinet/sctp_indata.c#13 integrate
.. //depot/projects/usb/src/sys/netinet/sctp_os_bsd.h#14 integrate
Differences ...
==== //depot/projects/usb/src/sys/amd64/linux32/linux.h#10 (text+ko) ====
@@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/amd64/linux32/linux.h,v 1.22 2008/11/29 17:14:06 kib Exp $
+ * $FreeBSD: src/sys/amd64/linux32/linux.h,v 1.23 2009/03/04 12:14:33 dchagin Exp $
*/
#ifndef _AMD64_LINUX_H_
@@ -108,6 +108,10 @@
#define LINUX_CTL_MAXNAME 10
+#define LINUX_AT_COUNT 16 /* Count of used aux entry types.
+ * Keep this synchronized with
+ * elf_linux_fixup() code.
+ */
struct l___sysctl_args
{
l_uintptr_t name;
==== //depot/projects/usb/src/sys/amd64/linux32/linux32_sysvec.c#14 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.41 2009/01/31 20:46:01 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.42 2009/03/04 12:14:33 dchagin Exp $");
#include "opt_compat.h"
#ifndef COMPAT_IA32
@@ -78,6 +78,7 @@
#include <amd64/linux32/linux32_proto.h>
#include <compat/linux/linux_emul.h>
#include <compat/linux/linux_mib.h>
+#include <compat/linux/linux_misc.h>
#include <compat/linux/linux_signal.h>
#include <compat/linux/linux_util.h>
@@ -106,6 +107,8 @@
#define LINUX_SYS_linux_rt_sendsig 0
#define LINUX_SYS_linux_sendsig 0
+const char *linux_platform = "i686";
+static int linux_szplatform;
extern char linux_sigcode[];
extern int linux_szsigcode;
@@ -246,7 +249,12 @@
{
Elf32_Auxargs *args;
Elf32_Addr *base;
- Elf32_Addr *pos;
+ Elf32_Addr *pos, *uplatform;
+ struct linux32_ps_strings *arginfo;
+
+ arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
+ uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szsigcode -
+ linux_szplatform);
KASSERT(curthread->td_proc == imgp->proc,
("unsafe elf_linux_fixup(), should be curproc"));
@@ -254,8 +262,8 @@
args = (Elf32_Auxargs *)imgp->auxargs;
pos = base + (imgp->args->argc + imgp->args->envc + 2);
- if (args->execfd != -1)
- AUXARGS_ENTRY_32(pos, AT_EXECFD, args->execfd);
+ AUXARGS_ENTRY_32(pos, LINUX_AT_HWCAP, cpu_feature);
+ AUXARGS_ENTRY_32(pos, LINUX_AT_CLKTCK, hz);
AUXARGS_ENTRY_32(pos, AT_PHDR, args->phdr);
AUXARGS_ENTRY_32(pos, AT_PHENT, args->phent);
AUXARGS_ENTRY_32(pos, AT_PHNUM, args->phnum);
@@ -263,10 +271,14 @@
AUXARGS_ENTRY_32(pos, AT_FLAGS, args->flags);
AUXARGS_ENTRY_32(pos, AT_ENTRY, args->entry);
AUXARGS_ENTRY_32(pos, AT_BASE, args->base);
+ AUXARGS_ENTRY_32(pos, LINUX_AT_SECURE, 0);
AUXARGS_ENTRY_32(pos, AT_UID, imgp->proc->p_ucred->cr_ruid);
AUXARGS_ENTRY_32(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid);
AUXARGS_ENTRY_32(pos, AT_GID, imgp->proc->p_ucred->cr_rgid);
AUXARGS_ENTRY_32(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid);
+ AUXARGS_ENTRY_32(pos, LINUX_AT_PLATFORM, PTROUT(uplatform));
+ if (args->execfd != -1)
+ AUXARGS_ENTRY_32(pos, AT_EXECFD, args->execfd);
AUXARGS_ENTRY_32(pos, AT_NULL, 0);
free(imgp->auxargs, M_TEMP);
@@ -857,23 +869,27 @@
char *stringp, *destp;
u_int32_t *stack_base;
struct linux32_ps_strings *arginfo;
- int sigcodesz;
/*
* Calculate string base and vector table pointers.
* Also deal with signal trampoline code for this exec type.
*/
arginfo = (struct linux32_ps_strings *)LINUX32_PS_STRINGS;
- sigcodesz = *(imgp->proc->p_sysent->sv_szsigcode);
- destp = (caddr_t)arginfo - sigcodesz - SPARE_USRSPACE -
- roundup((ARG_MAX - imgp->args->stringspace), sizeof(char *));
+ destp = (caddr_t)arginfo - linux_szsigcode - SPARE_USRSPACE -
+ linux_szplatform - roundup((ARG_MAX - imgp->args->stringspace),
+ sizeof(char *));
/*
* install sigcode
*/
- if (sigcodesz)
- copyout(imgp->proc->p_sysent->sv_sigcode,
- ((caddr_t)arginfo - sigcodesz), sigcodesz);
+ copyout(imgp->proc->p_sysent->sv_sigcode,
+ ((caddr_t)arginfo - linux_szsigcode), linux_szsigcode);
+
+ /*
+ * Install LINUX_PLATFORM
+ */
+ copyout(linux_platform, ((caddr_t)arginfo - linux_szsigcode -
+ linux_szplatform), linux_szplatform);
/*
* If we have a valid auxargs ptr, prepare some room
@@ -885,7 +901,7 @@
* lower compatibility.
*/
imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size :
- (AT_COUNT * 2);
+ (LINUX_AT_COUNT * 2);
/*
* The '+ 2' is for the null pointers at the end of each of
* the arg and env vector sets,and imgp->auxarg_size is room
@@ -919,14 +935,14 @@
/*
* Fill in "ps_strings" struct for ps, w, etc.
*/
- suword32(&arginfo->ps_argvstr, (u_int32_t)(intptr_t)vectp);
+ suword32(&arginfo->ps_argvstr, (uint32_t)(intptr_t)vectp);
suword32(&arginfo->ps_nargvstr, argc);
/*
* Fill in argument portion of vector table.
*/
for (; argc > 0; --argc) {
- suword32(vectp++, (u_int32_t)(intptr_t)destp);
+ suword32(vectp++, (uint32_t)(intptr_t)destp);
while (*stringp++ != 0)
destp++;
destp++;
@@ -935,14 +951,14 @@
/* a null vector table pointer separates the argp's from the envp's */
suword32(vectp++, 0);
- suword32(&arginfo->ps_envstr, (u_int32_t)(intptr_t)vectp);
+ suword32(&arginfo->ps_envstr, (uint32_t)(intptr_t)vectp);
suword32(&arginfo->ps_nenvstr, envc);
/*
* Fill in environment portion of vector table.
*/
for (; envc > 0; --envc) {
- suword32(vectp++, (u_int32_t)(intptr_t)destp);
+ suword32(vectp++, (uint32_t)(intptr_t)destp);
while (*stringp++ != 0)
destp++;
destp++;
@@ -1089,6 +1105,8 @@
linux_schedtail, NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec,
linux_proc_exec, NULL, 1000);
+ linux_szplatform = roundup(strlen(linux_platform) + 1,
+ sizeof(char *));
if (bootverbose)
printf("Linux ELF exec handler installed\n");
} else
==== //depot/projects/usb/src/sys/compat/linux/linux_misc.c#17 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.231 2008/12/29 12:58:45 ed Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_misc.c,v 1.232 2009/03/04 12:14:33 dchagin Exp $");
#include "opt_compat.h"
#include "opt_mac.h"
@@ -92,10 +92,6 @@
#include <compat/linux/linux_emul.h>
#include <compat/linux/linux_misc.h>
-#ifdef __i386__
-#include <machine/cputypes.h>
-#endif
-
#define BSD_TO_LINUX_SIGNAL(sig) \
(((sig) <= LINUX_SIGTBLSZ) ? bsd_to_linux_signal[_SIG_IDX(sig)] : sig)
@@ -731,34 +727,8 @@
*p = '\0';
break;
}
-#ifdef __i386__
- {
- const char *class;
+ strlcpy(utsname.machine, linux_platform, LINUX_MAX_UTSNAME);
- switch (cpu_class) {
- case CPUCLASS_686:
- class = "i686";
- break;
- case CPUCLASS_586:
- class = "i586";
- break;
- case CPUCLASS_486:
- class = "i486";
- break;
- default:
- class = "i386";
- }
- strlcpy(utsname.machine, class, LINUX_MAX_UTSNAME);
- }
-#elif defined(__amd64__) /* XXX: Linux can change 'personality'. */
-#ifdef COMPAT_LINUX32
- strlcpy(utsname.machine, "i686", LINUX_MAX_UTSNAME);
-#else
- strlcpy(utsname.machine, "x86_64", LINUX_MAX_UTSNAME);
-#endif /* COMPAT_LINUX32 */
-#else /* something other than i386 or amd64 - assume we and Linux agree */
- strlcpy(utsname.machine, machine, LINUX_MAX_UTSNAME);
-#endif /* __i386__ */
mtx_lock(&hostname_mtx);
strlcpy(utsname.domainname, V_domainname, LINUX_MAX_UTSNAME);
mtx_unlock(&hostname_mtx);
==== //depot/projects/usb/src/sys/compat/linux/linux_misc.h#3 (text+ko) ====
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/compat/linux/linux_misc.h,v 1.3 2008/02/22 11:47:56 kib Exp $
+ * $FreeBSD: src/sys/compat/linux/linux_misc.h,v 1.4 2009/03/04 12:14:33 dchagin Exp $
*/
#ifndef _LINUX_MISC_H_
@@ -45,4 +45,19 @@
#define LINUX_MREMAP_MAYMOVE 1
#define LINUX_MREMAP_FIXED 2
+extern const char *linux_platform;
+
+/*
+ * Non-standard aux entry types used in Linux ELF binaries.
+ */
+
+#define LINUX_AT_PLATFORM 15 /* String identifying CPU */
+#define LINUX_AT_HWCAP 16 /* CPU capabilities */
+#define LINUX_AT_CLKTCK 17 /* frequency at which times() increments */
+#define LINUX_AT_SECURE 23 /* secure mode boolean */
+#define LINUX_AT_BASE_PLATFORM 24 /* string identifying real platform, may
+ * differ from AT_PLATFORM.
+ */
+#define LINUX_AT_EXECFN 31 /* filename of program */
+
#endif /* _LINUX_MISC_H_ */
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-acerlabs.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-acerlabs.c,v 1.3 2009/02/19 00:32:55 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-acerlabs.c,v 1.4 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -113,10 +113,6 @@
if ((ctlr->chip->chipid == ATA_ALI_5288) &&
(ata_ahci_chipinit(dev) != ENXIO))
return 0;
-
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
break;
case ALI_NEW:
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-ahci.c#5 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-ahci.c,v 1.18 2009/03/01 22:50:14 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-ahci.c,v 1.19 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -135,10 +135,6 @@
ctlr->suspend = ata_ahci_suspend;
ctlr->resume = ata_ahci_ctlr_reset;
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
-
/* announce we support the HW */
version = ATA_INL(ctlr->r_res2, ATA_AHCI_VS);
device_printf(dev,
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-intel.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-intel.c,v 1.3 2009/02/19 00:32:55 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-intel.c,v 1.4 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -213,10 +213,6 @@
ctlr->setmode = ata_intel_sata_setmode;
else
ctlr->setmode = ata_sata_setmode;
-
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
}
return 0;
}
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-marvell.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-marvell.c,v 1.5 2009/02/19 00:32:55 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-marvell.c,v 1.6 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -212,9 +212,6 @@
ATA_OUTL(ctlr->r_res1, 0x01d64, 0x000000ff/*HC0*/ | 0x0001fe00/*HC1*/ |
/*(1<<19) | (1<<20) | (1<<21) |*/(1<<22) | (1<<24) | (0x7f << 25));
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
return 0;
}
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-nvidia.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-nvidia.c,v 1.4 2009/02/20 08:49:56 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-nvidia.c,v 1.5 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -183,11 +183,6 @@
/* enable device and PHY state change interrupts */
ATA_OUTB(ctlr->r_res2, offset + 1, 0xdd);
}
-
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400,2);
-
}
ctlr->setmode = ata_sata_setmode;
}
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-siliconimage.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-siliconimage.c,v 1.4 2009/02/21 23:46:34 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-siliconimage.c,v 1.5 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -150,10 +150,6 @@
ATA_OUTL(ctlr->r_res1, 0x0040, 0x80000000);
DELAY(10000);
ATA_OUTL(ctlr->r_res1, 0x0040, 0x0000000f);
-
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400, 2);
break;
case SII_MEMIO:
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-sis.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-sis.c,v 1.4 2009/02/19 00:32:55 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-sis.c,v 1.5 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -189,10 +189,6 @@
ctlr->ch_attach = ata_sis_ch_attach;
ctlr->ch_detach = ata_pci_ch_detach;
ctlr->reset = ata_sis_reset;
-
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400,2);
}
ctlr->setmode = ata_sata_setmode;
return 0;
==== //depot/projects/usb/src/sys/dev/ata/chipsets/ata-via.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-via.c,v 1.3 2009/02/19 00:32:55 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ata/chipsets/ata-via.c,v 1.4 2009/03/04 18:25:39 rnoland Exp $");
#include "opt_ata.h"
#include <sys/param.h>
@@ -143,10 +143,6 @@
ctlr->ch_attach = ata_via_ch_attach;
ctlr->ch_detach = ata_via_ch_detach;
ctlr->reset = ata_via_reset;
-
- /* enable PCI interrupt */
- pci_write_config(dev, PCIR_COMMAND,
- pci_read_config(dev, PCIR_COMMAND, 2) & ~0x0400,2);
}
if (ctlr->chip->cfg2 & VIABAR) {
==== //depot/projects/usb/src/sys/dev/pci/pci.c#16 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.371 2009/03/03 16:38:59 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pci/pci.c,v 1.372 2009/03/04 18:23:48 rnoland Exp $");
#include "opt_bus.h"
@@ -2825,14 +2825,24 @@
if (error)
return (error);
- /*
- * If this is a direct child, check to see if the interrupt is
- * MSI or MSI-X. If so, ask our parent to map the MSI and give
- * us the address and data register values. If we fail for some
- * reason, teardown the interrupt handler.
- */
+ /* If this is not a direct child, just bail out. */
+ if (device_get_parent(child) != dev) {
+ *cookiep = cookie;
+ return(0);
+ }
+
rid = rman_get_rid(irq);
- if (device_get_parent(child) == dev && rid > 0) {
+ if (rid == 0) {
+ /* Make sure that INTx is enabled */
+ pci_clear_command_bit(dev, child, PCIM_CMD_INTxDIS);
+ } else {
+ /*
+ * Check to see if the interrupt is MSI or MSI-X.
+ * Ask our parent to map the MSI and give
+ * us the address and data register values.
+ * If we fail for some reason, teardown the
+ * interrupt handler.
+ */
dinfo = device_get_ivars(child);
if (dinfo->cfg.msi.msi_alloc > 0) {
if (dinfo->cfg.msi.msi_addr == 0) {
@@ -2874,7 +2884,8 @@
}
mte->mte_handlers++;
}
- /* Disable INTx if we are using MSI/MSIX */
+
+ /* Make sure that INTx is disabled if we are using MSI/MSIX */
pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS);
bad:
if (error) {
@@ -2896,16 +2907,24 @@
struct pci_devinfo *dinfo;
int error, rid;
- /*
- * If this is a direct child, check to see if the interrupt is
- * MSI or MSI-X. If so, decrement the appropriate handlers
- * count and mask the MSI-X message, or disable MSI messages
- * if the count drops to 0.
- */
if (irq == NULL || !(rman_get_flags(irq) & RF_ACTIVE))
return (EINVAL);
+
+ /* If this isn't a direct child, just bail out */
+ if (device_get_parent(child) != dev)
+ return(bus_generic_teardown_intr(dev, child, irq, cookie));
+
rid = rman_get_rid(irq);
- if (device_get_parent(child) == dev && rid > 0) {
+ if (rid > 0) {
+ /* Mask INTx */
+ pci_set_command_bit(dev, child, PCIM_CMD_INTxDIS);
+ } else {
+ /*
+ * Check to see if the interrupt is MSI or MSI-X. If so,
+ * decrement the appropriate handlers count and mask the
+ * MSI-X message, or disable MSI messages if the count
+ * drops to 0.
+ */
dinfo = device_get_ivars(child);
rle = resource_list_find(&dinfo->resources, SYS_RES_IRQ, rid);
if (rle->res != irq)
@@ -2930,11 +2949,9 @@
if (mte->mte_handlers == 0)
pci_mask_msix(child, rid - 1);
}
- /* Restore INTx capability for MSI/MSIX */
- pci_clear_command_bit(dev, child, PCIM_CMD_INTxDIS);
}
error = bus_generic_teardown_intr(dev, child, irq, cookie);
- if (device_get_parent(child) == dev && rid > 0)
+ if (rid > 0)
KASSERT(error == 0,
("%s: generic teardown failed for MSI/MSI-X", __func__));
return (error);
==== //depot/projects/usb/src/sys/dev/pci/vga_pci.c#3 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/pci/vga_pci.c,v 1.7 2008/09/19 19:11:35 rnoland Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/pci/vga_pci.c,v 1.8 2009/03/04 21:04:52 jhb Exp $");
/*
* Simple driver for PCI VGA display devices. Drivers such as agp(4) and
@@ -42,12 +42,20 @@
#include <sys/bus.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#include <sys/rman.h>
+#include <sys/systm.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
+struct vga_resource {
+ struct resource *vr_res;
+ int vr_refs;
+};
+
struct vga_pci_softc {
device_t vga_msi_child; /* Child driver using MSI. */
+ struct vga_resource vga_res[PCIR_MAX_BAR_0 + 1];
};
static int
@@ -130,7 +138,27 @@
vga_pci_alloc_resource(device_t dev, device_t child, int type, int *rid,
u_long start, u_long end, u_long count, u_int flags)
{
+ struct vga_pci_softc *sc;
+ int bar;
+ switch (type) {
+ case SYS_RES_MEMORY:
+ case SYS_RES_IOPORT:
+ /*
+ * For BARs, we cache the resource so that we only allocate it
+ * from the PCI bus once.
+ */
+ bar = PCI_RID2BAR(*rid);
+ if (bar < 0 || bar > PCIR_MAX_BAR_0)
+ return (NULL);
+ sc = device_get_softc(dev);
+ if (sc->vga_res[bar].vr_res == NULL)
+ sc->vga_res[bar].vr_res = bus_alloc_resource(dev, type,
+ rid, start, end, count, flags);
+ if (sc->vga_res[bar].vr_res != NULL)
+ sc->vga_res[bar].vr_refs++;
+ return (sc->vga_res[bar].vr_res);
+ }
return (bus_alloc_resource(dev, type, rid, start, end, count, flags));
}
@@ -138,6 +166,37 @@
vga_pci_release_resource(device_t dev, device_t child, int type, int rid,
struct resource *r)
{
+ struct vga_pci_softc *sc;
+ int bar, error;
+
+ switch (type) {
+ case SYS_RES_MEMORY:
+ case SYS_RES_IOPORT:
+ /*
+ * For BARs, we release the resource from the PCI bus
+ * when the last child reference goes away.
+ */
+ bar = PCI_RID2BAR(rid);
+ if (bar < 0 || bar > PCIR_MAX_BAR_0)
+ return (EINVAL);
+ sc = device_get_softc(dev);
+ if (sc->vga_res[bar].vr_res == NULL)
+ return (EINVAL);
+ KASSERT(sc->vga_res[bar].vr_res == r,
+ ("vga_pci resource mismatch"));
+ if (sc->vga_res[bar].vr_refs > 1) {
+ sc->vga_res[bar].vr_refs--;
+ return (0);
+ }
+ KASSERT(sc->vga_res[bar].vr_refs > 0,
+ ("vga_pci resource reference count underflow"));
+ error = bus_release_resource(dev, type, rid, r);
+ if (error == 0) {
+ sc->vga_res[bar].vr_res = NULL;
+ sc->vga_res[bar].vr_refs = 0;
+ }
+ return (error);
+ }
return (bus_release_resource(dev, type, rid, r));
}
==== //depot/projects/usb/src/sys/fs/udf/udf_vnops.c#15 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/fs/udf/udf_vnops.c,v 1.85 2009/03/03 13:10:25 avg Exp $
+ * $FreeBSD: src/sys/fs/udf/udf_vnops.c,v 1.87 2009/03/04 13:54:10 avg Exp $
*/
/* udf_vnops.c */
@@ -738,7 +738,7 @@
* Update the offset. Align on a 4 byte boundary because the
* UDF spec says so.
*/
- ds->this_off = ds->off;
+ ds->this_off = ds->offset + ds->off;
if (!ds->fid_fragment) {
ds->off += (total_fid_size + 3) & ~0x03;
} else {
@@ -1018,10 +1018,6 @@
node = VTON(vp);
if (bp->b_blkno == bp->b_lblkno) {
- /*
- * Files that are embedded in the fentry don't translate well
- * to a block number. Reject.
- */
offset = lblktosize(node->udfmp, bp->b_lblkno);
error = udf_bmap_internal(node, offset, §or, &maxsize);
if (error) {
==== //depot/projects/usb/src/sys/i386/linux/linux.h#10 (text+ko) ====
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/linux/linux.h,v 1.83 2008/11/29 17:14:06 kib Exp $
+ * $FreeBSD: src/sys/i386/linux/linux.h,v 1.84 2009/03/04 12:14:33 dchagin Exp $
*/
#ifndef _I386_LINUX_H_
@@ -102,6 +102,10 @@
#define LINUX_CTL_MAXNAME 10
+#define LINUX_AT_COUNT 16 /* Count of used aux entry types.
+ * Keep this synchronized with
+ * elf_linux_fixup() code.
+ */
struct l___sysctl_args
{
l_int *name;
==== //depot/projects/usb/src/sys/i386/linux/linux_sysvec.c#10 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/linux/linux_sysvec.c,v 1.158 2008/12/17 06:11:42 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/linux/linux_sysvec.c,v 1.159 2009/03/04 12:14:33 dchagin Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -58,6 +58,7 @@
#include <vm/vm_param.h>
#include <machine/cpu.h>
+#include <machine/cputypes.h>
#include <machine/md_var.h>
#include <machine/pcb.h>
@@ -65,6 +66,7 @@
#include <i386/linux/linux_proto.h>
#include <compat/linux/linux_emul.h>
#include <compat/linux/linux_mib.h>
+#include <compat/linux/linux_misc.h>
#include <compat/linux/linux_signal.h>
#include <compat/linux/linux_util.h>
@@ -107,7 +109,11 @@
static void linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask);
static void exec_linux_setregs(struct thread *td, u_long entry,
u_long stack, u_long ps_strings);
+static register_t *linux_copyout_strings(struct image_params *imgp);
+static int linux_szplatform;
+const char *linux_platform;
+
extern LIST_HEAD(futex_list, futex) futex_list;
extern struct sx futex_sx;
@@ -231,22 +237,30 @@
**stack_base = (intptr_t)(void *)argv;
(*stack_base)--;
**stack_base = imgp->args->argc;
- return 0;
+ return (0);
}
static int
elf_linux_fixup(register_t **stack_base, struct image_params *imgp)
{
+ struct proc *p;
Elf32_Auxargs *args;
+ Elf32_Addr *uplatform;
+ struct ps_strings *arginfo;
register_t *pos;
KASSERT(curthread->td_proc == imgp->proc,
("unsafe elf_linux_fixup(), should be curproc"));
+
+ p = imgp->proc;
+ arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
+ uplatform = (Elf32_Addr *)((caddr_t)arginfo - linux_szsigcode -
+ linux_szplatform);
args = (Elf32_Auxargs *)imgp->auxargs;
pos = *stack_base + (imgp->args->argc + imgp->args->envc + 2);
- if (args->execfd != -1)
- AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd);
+ AUXARGS_ENTRY(pos, LINUX_AT_HWCAP, cpu_feature);
+ AUXARGS_ENTRY(pos, LINUX_AT_CLKTCK, hz);
AUXARGS_ENTRY(pos, AT_PHDR, args->phdr);
AUXARGS_ENTRY(pos, AT_PHENT, args->phent);
AUXARGS_ENTRY(pos, AT_PHNUM, args->phnum);
@@ -254,10 +268,14 @@
AUXARGS_ENTRY(pos, AT_FLAGS, args->flags);
AUXARGS_ENTRY(pos, AT_ENTRY, args->entry);
AUXARGS_ENTRY(pos, AT_BASE, args->base);
+ AUXARGS_ENTRY(pos, LINUX_AT_SECURE, 0);
AUXARGS_ENTRY(pos, AT_UID, imgp->proc->p_ucred->cr_ruid);
AUXARGS_ENTRY(pos, AT_EUID, imgp->proc->p_ucred->cr_svuid);
AUXARGS_ENTRY(pos, AT_GID, imgp->proc->p_ucred->cr_rgid);
AUXARGS_ENTRY(pos, AT_EGID, imgp->proc->p_ucred->cr_svgid);
+ AUXARGS_ENTRY(pos, LINUX_AT_PLATFORM, PTROUT(uplatform));
+ if (args->execfd != -1)
+ AUXARGS_ENTRY(pos, AT_EXECFD, args->execfd);
AUXARGS_ENTRY(pos, AT_NULL, 0);
free(imgp->auxargs, M_TEMP);
@@ -265,9 +283,125 @@
(*stack_base)--;
**stack_base = (register_t)imgp->args->argc;
- return 0;
+ return (0);
+}
+
+/*
+ * Copied from kern/kern_exec.c
+ */
+static register_t *
+linux_copyout_strings(struct image_params *imgp)
+{
+ int argc, envc;
+ char **vectp;
+ char *stringp, *destp;
+ register_t *stack_base;
+ struct ps_strings *arginfo;
+ struct proc *p;
+
+ /*
+ * Calculate string base and vector table pointers.
+ * Also deal with signal trampoline code for this exec type.
+ */
+ p = imgp->proc;
+ arginfo = (struct ps_strings *)p->p_sysent->sv_psstrings;
+ destp = (caddr_t)arginfo - linux_szsigcode - SPARE_USRSPACE -
+ linux_szplatform - roundup((ARG_MAX - imgp->args->stringspace),
+ sizeof(char *));
+
+ /*
+ * install sigcode
+ */
+ copyout(p->p_sysent->sv_sigcode, ((caddr_t)arginfo -
+ linux_szsigcode), linux_szsigcode);
+
+ /*
+ * install LINUX_PLATFORM
+ */
+ copyout(linux_platform, ((caddr_t)arginfo - linux_szsigcode -
+ linux_szplatform), linux_szplatform);
+
+ /*
+ * If we have a valid auxargs ptr, prepare some room
+ * on the stack.
+ */
+ if (imgp->auxargs) {
+ /*
+ * 'AT_COUNT*2' is size for the ELF Auxargs data. This is for
+ * lower compatibility.
+ */
+ imgp->auxarg_size = (imgp->auxarg_size) ? imgp->auxarg_size :
+ (LINUX_AT_COUNT * 2);
+ /*
+ * The '+ 2' is for the null pointers at the end of each of
+ * the arg and env vector sets,and imgp->auxarg_size is room
+ * for argument of Runtime loader.
+ */
+ vectp = (char **)(destp - (imgp->args->argc +
+ imgp->args->envc + 2 + imgp->auxarg_size) * sizeof(char *));
+ } else {
+ /*
+ * The '+ 2' is for the null pointers at the end of each of
+ * the arg and env vector sets
+ */
+ vectp = (char **)(destp - (imgp->args->argc + imgp->args->envc + 2) *
+ sizeof(char *));
+ }
+
+ /*
+ * vectp also becomes our initial stack base
+ */
+ stack_base = (register_t *)vectp;
+
+ stringp = imgp->args->begin_argv;
+ argc = imgp->args->argc;
+ envc = imgp->args->envc;
+
+ /*
+ * Copy out strings - arguments and environment.
+ */
+ copyout(stringp, destp, ARG_MAX - imgp->args->stringspace);
+
+ /*
+ * Fill in "ps_strings" struct for ps, w, etc.
+ */
+ suword(&arginfo->ps_argvstr, (long)(intptr_t)vectp);
+ suword(&arginfo->ps_nargvstr, argc);
+
+ /*
+ * Fill in argument portion of vector table.
+ */
+ for (; argc > 0; --argc) {
+ suword(vectp++, (long)(intptr_t)destp);
+ while (*stringp++ != 0)
+ destp++;
+ destp++;
+ }
+
+ /* a null vector table pointer separates the argp's from the envp's */
+ suword(vectp++, 0);
+
+ suword(&arginfo->ps_envstr, (long)(intptr_t)vectp);
+ suword(&arginfo->ps_nenvstr, envc);
+
+ /*
+ * Fill in environment portion of vector table.
+ */
+ for (; envc > 0; --envc) {
+ suword(vectp++, (long)(intptr_t)destp);
+ while (*stringp++ != 0)
+ destp++;
+ destp++;
+ }
+
+ /* end of vector table is a null pointer */
+ suword(vectp, 0);
+
+ return (stack_base);
}
+
+
extern int _ucodesel, _udatasel;
extern unsigned long linux_sznonrtsigcode;
@@ -808,6 +942,25 @@
fldcw(&control);
}
+static void
+linux_get_machine(const char **dst)
+{
+
+ switch (cpu_class) {
+ case CPUCLASS_686:
+ *dst = "i686";
+ break;
+ case CPUCLASS_586:
+ *dst = "i586";
+ break;
+ case CPUCLASS_486:
+ *dst = "i486";
+ break;
+ default:
+ *dst = "i386";
+ }
+}
+
struct sysentvec linux_sysvec = {
.sv_size = LINUX_SYS_MAXSYSCALL,
.sv_table = linux_sysent,
@@ -863,7 +1016,7 @@
.sv_usrstack = USRSTACK,
.sv_psstrings = PS_STRINGS,
.sv_stackprot = VM_PROT_ALL,
- .sv_copyout_strings = exec_copyout_strings,
+ .sv_copyout_strings = linux_copyout_strings,
.sv_setregs = exec_linux_setregs,
.sv_fixlimit = NULL,
.sv_maxssiz = NULL,
@@ -929,6 +1082,9 @@
NULL, 1000);
linux_exec_tag = EVENTHANDLER_REGISTER(process_exec, linux_proc_exec,
NULL, 1000);
+ linux_get_machine(&linux_platform);
+ linux_szplatform = roundup(strlen(linux_platform) + 1,
+ sizeof(char *));
if (bootverbose)
printf("Linux ELF exec handler installed\n");
} else
==== //depot/projects/usb/src/sys/net80211/ieee80211_scan_sta.c#10 (text+ko) ====
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list