[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merge.
# HG changeset patch # User adsharma@xxxxxxxxxxxxxxxxxxxx # Node ID 29aab159846c9348b5bc6de410b457f163acee3b # Parent 40b887fa79d00b7836248060d51f8d1cc04f5c28 # Parent f11a31ad22d5d6c594664966ef3a4fb3758478eb Merge. diff -r 40b887fa79d0 -r 29aab159846c .hgignore --- a/.hgignore Fri Aug 12 17:35:15 2005 +++ b/.hgignore Mon Aug 15 18:32:29 2005 @@ -69,19 +69,19 @@ ^tools/blktap/blkdump$ ^tools/blktap/blkgnbd$ ^tools/blktap/blkimg$ -^tools/blktap/blockstore\.dat$ -^tools/blktap/blockstored$ ^tools/blktap/bstest$ -^tools/blktap/parallax$ ^tools/blktap/vdi\.dot$ ^tools/blktap/vdi\.ps$ -^tools/blktap/vdi_create$ -^tools/blktap/vdi_fill$ -^tools/blktap/vdi_list$ -^tools/blktap/vdi_snap$ -^tools/blktap/vdi_snap_list$ -^tools/blktap/vdi_tree$ -^tools/blktap/vdi_validate$ +^tools/blktap/parallax/vdi_create$ +^tools/blktap/parallax/vdi_fill$ +^tools/blktap/parallax/vdi_list$ +^tools/blktap/parallax/vdi_snap$ +^tools/blktap/parallax/vdi_snap_list$ +^tools/blktap/parallax/vdi_snap_delete$ +^tools/blktap/parallax/vdi_tree$ +^tools/blktap/parallax/vdi_validate$ +^tools/blktap/parallax/parallax$ +^tools/blktap/parallax/blockstored$ ^tools/blktap/xen/.*$ ^tools/check/\..*$ ^tools/cmdline/.*$ diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 --- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_32 Mon Aug 15 18:32:29 2005 @@ -18,8 +18,8 @@ CONFIG_XEN_NETDEV_BACKEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_GRANT_TX is not set -# CONFIG_XEN_NETDEV_GRANT_RX is not set +CONFIG_XEN_NETDEV_GRANT_TX=y +CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 --- a/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xen0_defconfig_x86_64 Mon Aug 15 18:32:29 2005 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-xen0 -# Tue Aug 2 23:55:35 2005 +# Linux kernel version: 2.6.12.3-xen0 +# Mon Aug 15 11:36:25 2005 # CONFIG_XEN=y CONFIG_ARCH_XEN=y @@ -18,8 +18,8 @@ CONFIG_XEN_NETDEV_BACKEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_GRANT_TX is not set -# CONFIG_XEN_NETDEV_GRANT_RX is not set +CONFIG_XEN_NETDEV_GRANT_TX=y +CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set @@ -118,6 +118,7 @@ CONFIG_GENERIC_CPU=y CONFIG_X86_L1_CACHE_BYTES=128 # CONFIG_X86_TSC is not set +CONFIG_X86_XEN_GENAPIC=y # CONFIG_X86_MSR is not set # CONFIG_GART_IOMMU is not set CONFIG_DUMMY_IOMMU=y @@ -371,7 +372,23 @@ # # Multi-device support (RAID and LVM) # -# CONFIG_MD is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=y +CONFIG_MD_RAID0=y +CONFIG_MD_RAID1=y +# CONFIG_MD_RAID10 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_RAID6 is not set +CONFIG_MD_MULTIPATH=y +# CONFIG_MD_FAULTY is not set +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_MIRROR=y +# CONFIG_DM_ZERO is not set +CONFIG_DM_MULTIPATH=y +CONFIG_DM_MULTIPATH_EMC=y # # Fusion MPT device support @@ -803,7 +820,12 @@ # # InfiniBand support # -# CONFIG_INFINIBAND is not set +CONFIG_INFINIBAND=y +CONFIG_INFINIBAND_MTHCA=y +CONFIG_INFINIBAND_MTHCA_DEBUG=y +CONFIG_INFINIBAND_IPOIB=y +CONFIG_INFINIBAND_IPOIB_DEBUG=y +CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y # # Power management options diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 --- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_32 Mon Aug 15 18:32:29 2005 @@ -15,8 +15,8 @@ CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_GRANT_TX is not set -# CONFIG_XEN_NETDEV_GRANT_RX is not set +CONFIG_XEN_NETDEV_GRANT_TX=y +CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 --- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 Mon Aug 15 18:32:29 2005 @@ -15,8 +15,8 @@ CONFIG_XEN_BLKDEV_GRANT=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y -# CONFIG_XEN_NETDEV_GRANT_TX is not set -# CONFIG_XEN_NETDEV_GRANT_RX is not set +CONFIG_XEN_NETDEV_GRANT_TX=y +CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 --- a/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xen_defconfig_x86_64 Mon Aug 15 18:32:29 2005 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-xen -# Fri Jul 15 00:34:21 2005 +# Linux kernel version: 2.6.12.3-xen0 +# Mon Aug 15 19:46:39 2005 # CONFIG_XEN=y CONFIG_ARCH_XEN=y @@ -18,6 +18,8 @@ CONFIG_XEN_NETDEV_BACKEND=y CONFIG_XEN_BLKDEV_FRONTEND=y CONFIG_XEN_NETDEV_FRONTEND=y +CONFIG_XEN_NETDEV_GRANT_TX=y +CONFIG_XEN_NETDEV_GRANT_RX=y # CONFIG_XEN_NETDEV_FRONTEND_PIPELINED_TRANSMITTER is not set # CONFIG_XEN_BLKDEV_TAP is not set # CONFIG_XEN_SHADOW_MODE is not set @@ -50,8 +52,7 @@ # CONFIG_IKCONFIG is not set # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_KALLSYMS_EXTRA_PASS=y CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_BASE_FULL=y @@ -73,7 +74,7 @@ # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set -# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_MODULE_SRCVERSION_ALL=y CONFIG_KMOD=y CONFIG_XENARCH="x86_64" CONFIG_X86=y @@ -108,7 +109,7 @@ # CONFIG_X86_64=y CONFIG_64BIT=y -# CONFIG_EARLY_PRINTK is not set +CONFIG_EARLY_PRINTK=y # # Processor type and features @@ -117,6 +118,7 @@ CONFIG_GENERIC_CPU=y CONFIG_X86_L1_CACHE_BYTES=128 # CONFIG_X86_TSC is not set +CONFIG_X86_XEN_GENAPIC=y # CONFIG_X86_MSR is not set # CONFIG_GART_IOMMU is not set CONFIG_DUMMY_IOMMU=y @@ -149,7 +151,7 @@ # Executable file formats # CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=m +CONFIG_BINFMT_MISC=y # # Device Drivers @@ -160,8 +162,7 @@ # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y -CONFIG_FW_LOADER=m -# CONFIG_DEBUG_DRIVER is not set +CONFIG_FW_LOADER=y # # Memory Technology Devices (MTD) @@ -174,7 +175,7 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set -# CONFIG_MTD_CMDLINE_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y # # User Modules And Translation Layers @@ -206,7 +207,7 @@ # CONFIG_MTD_CFI_I8 is not set CONFIG_MTD_CFI_INTELEXT=m CONFIG_MTD_CFI_AMDSTD=m -CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_AMDSTD_RETRY=3 CONFIG_MTD_CFI_STAA=m CONFIG_MTD_CFI_UTIL=m CONFIG_MTD_RAM=m @@ -219,11 +220,8 @@ # Mapping drivers for chip access # CONFIG_MTD_COMPLEX_MAPPINGS=y -CONFIG_MTD_PHYSMAP=m -CONFIG_MTD_PHYSMAP_START=0x8000000 -CONFIG_MTD_PHYSMAP_LEN=0x4000000 -CONFIG_MTD_PHYSMAP_BANKWIDTH=2 -CONFIG_MTD_PNC2000=m +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PNC2000 is not set CONFIG_MTD_SC520CDP=m CONFIG_MTD_NETSC520=m CONFIG_MTD_TS5500=m @@ -231,10 +229,9 @@ CONFIG_MTD_ELAN_104NC=m # CONFIG_MTD_AMD76XROM is not set # CONFIG_MTD_ICHXROM is not set -# CONFIG_MTD_SCB2_FLASH is not set -CONFIG_MTD_NETtel=m -CONFIG_MTD_DILNETPC=m -CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +CONFIG_MTD_SCB2_FLASH=m +# CONFIG_MTD_NETtel is not set +# CONFIG_MTD_DILNETPC is not set # CONFIG_MTD_L440GX is not set CONFIG_MTD_PCI=m @@ -244,19 +241,19 @@ CONFIG_MTD_PMC551=m # CONFIG_MTD_PMC551_BUGFIX is not set # CONFIG_MTD_PMC551_DEBUG is not set -CONFIG_MTD_SLRAM=m -CONFIG_MTD_PHRAM=m +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set CONFIG_MTD_MTDRAM=m CONFIG_MTDRAM_TOTAL_SIZE=4096 CONFIG_MTDRAM_ERASE_SIZE=128 -CONFIG_MTD_BLKMTD=m -# CONFIG_MTD_BLOCK2MTD is not set +# CONFIG_MTD_BLKMTD is not set +CONFIG_MTD_BLOCK2MTD=m # # Disk-On-Chip Device Drivers # CONFIG_MTD_DOC2000=m -CONFIG_MTD_DOC2001=m +# CONFIG_MTD_DOC2001 is not set CONFIG_MTD_DOC2001PLUS=m CONFIG_MTD_DOCPROBE=m CONFIG_MTD_DOCECC=m @@ -269,10 +266,7 @@ CONFIG_MTD_NAND=m # CONFIG_MTD_NAND_VERIFY_WRITE is not set CONFIG_MTD_NAND_IDS=m -CONFIG_MTD_NAND_DISKONCHIP=m -# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set -CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 -# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set +# CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_NANDSIM is not set # @@ -280,8 +274,7 @@ # CONFIG_PARPORT=m CONFIG_PARPORT_PC=m -CONFIG_PARPORT_SERIAL=m -CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set CONFIG_PARPORT_NOT_PC=y # CONFIG_PARPORT_GSC is not set @@ -290,13 +283,7 @@ # # Plug and Play support # -CONFIG_PNP=y -# CONFIG_PNP_DEBUG is not set - -# -# Protocols -# -CONFIG_PNPACPI=y +# CONFIG_PNP is not set # # Block devices @@ -324,7 +311,7 @@ CONFIG_PARIDE_FIT2=m CONFIG_PARIDE_FIT3=m CONFIG_PARIDE_EPAT=m -# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPATC8=y CONFIG_PARIDE_EPIA=m CONFIG_PARIDE_FRIQ=m CONFIG_PARIDE_FRPW=m @@ -345,7 +332,7 @@ # CONFIG_BLK_DEV_UB is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=16 -CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_RAM_SIZE=16384 CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_LBD=y @@ -360,70 +347,69 @@ CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y -# CONFIG_ATA_OVER_ETH is not set +CONFIG_ATA_OVER_ETH=m # # ATA/ATAPI/MFM/RLL support # -CONFIG_IDE=m -CONFIG_BLK_DEV_IDE=m +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_HD_IDE is not set -CONFIG_BLK_DEV_IDEDISK=m -# CONFIG_IDEDISK_MULTI_MODE is not set -CONFIG_BLK_DEV_IDECD=m -CONFIG_BLK_DEV_IDETAPE=m -CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_BLK_DEV_IDECD=y +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y CONFIG_BLK_DEV_IDESCSI=m # CONFIG_IDE_TASK_IOCTL is not set # # IDE chipset support/bugfixes # -CONFIG_IDE_GENERIC=m +CONFIG_IDE_GENERIC=y CONFIG_BLK_DEV_CMD640=y -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -# CONFIG_BLK_DEV_IDEPNP is not set +CONFIG_BLK_DEV_CMD640_ENHANCED=y CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y # CONFIG_BLK_DEV_OFFBOARD is not set -CONFIG_BLK_DEV_GENERIC=m -CONFIG_BLK_DEV_OPTI621=m -CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_GENERIC=y +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_RZ1000=y CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set -CONFIG_BLK_DEV_AEC62XX=m -CONFIG_BLK_DEV_ALI15X3=m +CONFIG_BLK_DEV_AEC62XX=y +CONFIG_BLK_DEV_ALI15X3=y # CONFIG_WDC_ALI15X3 is not set -CONFIG_BLK_DEV_AMD74XX=m -CONFIG_BLK_DEV_ATIIXP=m -CONFIG_BLK_DEV_CMD64X=m -CONFIG_BLK_DEV_TRIFLEX=m -CONFIG_BLK_DEV_CY82C693=m -CONFIG_BLK_DEV_CS5520=m -CONFIG_BLK_DEV_CS5530=m -CONFIG_BLK_DEV_HPT34X=m +CONFIG_BLK_DEV_AMD74XX=y +CONFIG_BLK_DEV_ATIIXP=y +CONFIG_BLK_DEV_CMD64X=y +CONFIG_BLK_DEV_TRIFLEX=y +CONFIG_BLK_DEV_CY82C693=y +CONFIG_BLK_DEV_CS5520=y +CONFIG_BLK_DEV_CS5530=y +CONFIG_BLK_DEV_HPT34X=y # CONFIG_HPT34X_AUTODMA is not set -CONFIG_BLK_DEV_HPT366=m -CONFIG_BLK_DEV_SC1200=m -CONFIG_BLK_DEV_PIIX=m -CONFIG_BLK_DEV_NS87415=m -CONFIG_BLK_DEV_PDC202XX_OLD=m -CONFIG_PDC202XX_BURST=y -CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_BLK_DEV_HPT366=y +# CONFIG_BLK_DEV_SC1200 is not set +CONFIG_BLK_DEV_PIIX=y +# CONFIG_BLK_DEV_NS87415 is not set +CONFIG_BLK_DEV_PDC202XX_OLD=y +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=y CONFIG_PDC202XX_FORCE=y -CONFIG_BLK_DEV_SVWKS=m -CONFIG_BLK_DEV_SIIMAGE=m -CONFIG_BLK_DEV_SIS5513=m -CONFIG_BLK_DEV_SLC90E66=m -CONFIG_BLK_DEV_TRM290=m -CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_SVWKS=y +CONFIG_BLK_DEV_SIIMAGE=y +CONFIG_BLK_DEV_SIS5513=y +CONFIG_BLK_DEV_SLC90E66=y +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_VIA82CXXX=y # CONFIG_IDE_ARM is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set @@ -433,17 +419,17 @@ # # SCSI device support # -CONFIG_SCSI=m +CONFIG_SCSI=y CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # -CONFIG_BLK_DEV_SD=m +CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=m -# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m # @@ -458,7 +444,7 @@ # CONFIG_SCSI_SPI_ATTRS=m CONFIG_SCSI_FC_ATTRS=m -# CONFIG_SCSI_ISCSI_ATTRS is not set +CONFIG_SCSI_ISCSI_ATTRS=m # # SCSI low-level drivers @@ -468,29 +454,30 @@ CONFIG_SCSI_ACARD=m CONFIG_SCSI_AACRAID=m CONFIG_SCSI_AIC7XXX=m -CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_CMDS_PER_DEVICE=4 CONFIG_AIC7XXX_RESET_DELAY_MS=15000 -CONFIG_AIC7XXX_DEBUG_ENABLE=y +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set CONFIG_AIC7XXX_DEBUG_MASK=0 -CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set CONFIG_SCSI_AIC7XXX_OLD=m CONFIG_SCSI_AIC79XX=m -CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_CMDS_PER_DEVICE=4 CONFIG_AIC79XX_RESET_DELAY_MS=15000 -CONFIG_AIC79XX_ENABLE_RD_STRM=y -CONFIG_AIC79XX_DEBUG_ENABLE=y +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +# CONFIG_AIC79XX_DEBUG_ENABLE is not set CONFIG_AIC79XX_DEBUG_MASK=0 -CONFIG_AIC79XX_REG_PRETTY_PRINT=y -CONFIG_SCSI_ADVANSYS=m -# CONFIG_MEGARAID_NEWGEN is not set -CONFIG_MEGARAID_LEGACY=m +# CONFIG_AIC79XX_REG_PRETTY_PRINT is not set +# CONFIG_SCSI_ADVANSYS is not set +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m CONFIG_SCSI_SATA=y CONFIG_SCSI_SATA_AHCI=m CONFIG_SCSI_SATA_SVW=m -CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_ATA_PIIX=y CONFIG_SCSI_SATA_NV=m CONFIG_SCSI_SATA_PROMISE=m -# CONFIG_SCSI_SATA_QSTOR is not set +CONFIG_SCSI_SATA_QSTOR=m CONFIG_SCSI_SATA_SX4=m CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIS=m @@ -500,17 +487,14 @@ CONFIG_SCSI_BUSLOGIC=m # CONFIG_SCSI_OMIT_FLASHPOINT is not set # CONFIG_SCSI_CPQFCTS is not set -CONFIG_SCSI_DMX3191D=m -CONFIG_SCSI_EATA=m -CONFIG_SCSI_EATA_TAGGED_QUEUE=y -CONFIG_SCSI_EATA_LINKED_COMMANDS=y -CONFIG_SCSI_EATA_MAX_TAGS=16 -CONFIG_SCSI_EATA_PIO=m -CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set CONFIG_SCSI_GDTH=m CONFIG_SCSI_IPS=m -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_INITIO=m +CONFIG_SCSI_INIA100=m CONFIG_SCSI_PPA=m CONFIG_SCSI_IMM=m # CONFIG_SCSI_IZIP_EPP16 is not set @@ -520,32 +504,29 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -CONFIG_SCSI_IPR=m -# CONFIG_SCSI_IPR_TRACE is not set -# CONFIG_SCSI_IPR_DUMP is not set +# CONFIG_SCSI_IPR is not set # CONFIG_SCSI_PCI2000 is not set # CONFIG_SCSI_PCI2220I is not set -CONFIG_SCSI_QLOGIC_ISP=m -CONFIG_SCSI_QLOGIC_FC=m -CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +# CONFIG_SCSI_QLOGIC_ISP is not set +# CONFIG_SCSI_QLOGIC_FC is not set CONFIG_SCSI_QLOGIC_1280=m CONFIG_SCSI_QLOGIC_1280_1040=y -CONFIG_SCSI_QLA2XXX=m -# CONFIG_SCSI_QLA21XX is not set -# CONFIG_SCSI_QLA22XX is not set -# CONFIG_SCSI_QLA2300 is not set -# CONFIG_SCSI_QLA2322 is not set -# CONFIG_SCSI_QLA6312 is not set +CONFIG_SCSI_QLA2XXX=y +CONFIG_SCSI_QLA21XX=m +CONFIG_SCSI_QLA22XX=m +CONFIG_SCSI_QLA2300=m +CONFIG_SCSI_QLA2322=m +CONFIG_SCSI_QLA6312=m CONFIG_SCSI_LPFC=m CONFIG_SCSI_DC395x=m CONFIG_SCSI_DC390T=m -CONFIG_SCSI_DEBUG=m +# CONFIG_SCSI_DEBUG is not set # # Multi-device support (RAID and LVM) # CONFIG_MD=y -CONFIG_BLK_DEV_MD=m +CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m @@ -579,7 +560,7 @@ # Subsystem Options # # CONFIG_IEEE1394_VERBOSEDEBUG is not set -# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_OUI_DB=y CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y CONFIG_IEEE1394_CONFIG_ROM_IP1394=y @@ -618,9 +599,9 @@ # # Networking options # -CONFIG_PACKET=m +CONFIG_PACKET=y CONFIG_PACKET_MMAP=y -CONFIG_UNIX=m +CONFIG_UNIX=y CONFIG_NET_KEY=m CONFIG_INET=y CONFIG_IP_MULTICAST=y @@ -784,11 +765,6 @@ CONFIG_IP6_NF_RAW=m # -# DECnet: Netfilter Configuration -# -CONFIG_DECNET_NF_GRABULATOR=m - -# # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=m @@ -810,9 +786,9 @@ CONFIG_BRIDGE_EBT_REDIRECT=m CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m -# CONFIG_BRIDGE_EBT_ULOG is not set +CONFIG_BRIDGE_EBT_ULOG=m CONFIG_XFRM=y -CONFIG_XFRM_USER=m +CONFIG_XFRM_USER=y # # SCTP Configuration (EXPERIMENTAL) @@ -823,19 +799,18 @@ # CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y -CONFIG_ATM=y -CONFIG_ATM_CLIP=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m # CONFIG_ATM_CLIP_NO_ICMP is not set CONFIG_ATM_LANE=m -CONFIG_ATM_MPOA=m +# CONFIG_ATM_MPOA is not set CONFIG_ATM_BR2684=m # CONFIG_ATM_BR2684_IPFILTER is not set CONFIG_BRIDGE=m CONFIG_VLAN_8021Q=m -CONFIG_DECNET=m -# CONFIG_DECNET_ROUTER is not set +# CONFIG_DECNET is not set CONFIG_LLC=y -CONFIG_LLC2=m +# CONFIG_LLC2 is not set CONFIG_IPX=m # CONFIG_IPX_INTERN is not set CONFIG_ATALK=m @@ -843,12 +818,10 @@ CONFIG_IPDDP=m CONFIG_IPDDP_ENCAP=y CONFIG_IPDDP_DECAP=y -CONFIG_X25=m -CONFIG_LAPB=m -# CONFIG_NET_DIVERT is not set -CONFIG_ECONET=m -CONFIG_ECONET_AUNUDP=y -CONFIG_ECONET_NATIVE=y +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +CONFIG_NET_DIVERT=y +# CONFIG_ECONET is not set CONFIG_WAN_ROUTER=m # @@ -880,9 +853,9 @@ CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m -# CONFIG_CLS_U32_PERF is not set -# CONFIG_NET_CLS_IND is not set -# CONFIG_CLS_U32_MARK is not set +CONFIG_CLS_U32_PERF=y +CONFIG_NET_CLS_IND=y +CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m CONFIG_NET_EMATCH=y @@ -897,31 +870,12 @@ # # Network testing # -CONFIG_NET_PKTGEN=m +# CONFIG_NET_PKTGEN is not set CONFIG_NETPOLL=y # CONFIG_NETPOLL_RX is not set -# CONFIG_NETPOLL_TRAP is not set +CONFIG_NETPOLL_TRAP=y CONFIG_NET_POLL_CONTROLLER=y -CONFIG_HAMRADIO=y - -# -# Packet Radio protocols -# -CONFIG_AX25=m -# CONFIG_AX25_DAMA_SLAVE is not set -CONFIG_NETROM=m -CONFIG_ROSE=m - -# -# AX.25 network device drivers -# -CONFIG_MKISS=m -CONFIG_6PACK=m -CONFIG_BPQETHER=m -CONFIG_BAYCOM_SER_FDX=m -CONFIG_BAYCOM_SER_HDX=m -CONFIG_BAYCOM_PAR=m -CONFIG_YAM=m +# CONFIG_HAMRADIO is not set CONFIG_IRDA=m # @@ -937,7 +891,7 @@ # CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y -CONFIG_IRDA_DEBUG=y +# CONFIG_IRDA_DEBUG is not set # # Infrared-port device drivers @@ -1002,9 +956,9 @@ CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y -# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIUART_BCSP_TXCRC=y CONFIG_BT_HCIBCM203X=m -# CONFIG_BT_HCIBPA10X is not set +CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_NETDEVICES=y @@ -1012,21 +966,11 @@ CONFIG_BONDING=m CONFIG_EQUALIZER=m CONFIG_TUN=m -CONFIG_NET_SB1000=m # # ARCnet devices # -CONFIG_ARCNET=m -CONFIG_ARCNET_1201=m -CONFIG_ARCNET_1051=m -CONFIG_ARCNET_RAW=m -# CONFIG_ARCNET_CAP is not set -CONFIG_ARCNET_COM90xx=m -CONFIG_ARCNET_COM90xxIO=m -CONFIG_ARCNET_RIM_I=m -CONFIG_ARCNET_COM20020=m -CONFIG_ARCNET_COM20020_PCI=m +# CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) @@ -1046,21 +990,21 @@ CONFIG_DE2104X=m CONFIG_TULIP=m # CONFIG_TULIP_MWI is not set -# CONFIG_TULIP_MMIO is not set +CONFIG_TULIP_MMIO=y # CONFIG_TULIP_NAPI is not set CONFIG_DE4X5=m CONFIG_WINBOND_840=m CONFIG_DM9102=m -CONFIG_HP100=m +# CONFIG_HP100 is not set CONFIG_NET_PCI=y CONFIG_PCNET32=m CONFIG_AMD8111_ETH=m -# CONFIG_AMD8111E_NAPI is not set +CONFIG_AMD8111E_NAPI=y CONFIG_ADAPTEC_STARFIRE=m -# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_ADAPTEC_STARFIRE_NAPI=y CONFIG_B44=m CONFIG_FORCEDETH=m -# CONFIG_DGRS is not set +CONFIG_DGRS=m CONFIG_EEPRO100=m CONFIG_E100=m CONFIG_FEALNX=m @@ -1069,7 +1013,7 @@ CONFIG_8139CP=m CONFIG_8139TOO=m CONFIG_8139TOO_PIO=y -CONFIG_8139TOO_TUNE_TWISTER=y +# CONFIG_8139TOO_TUNE_TWISTER is not set CONFIG_8139TOO_8129=y # CONFIG_8139_OLD_RX_RESET is not set CONFIG_SIS900=m @@ -1077,21 +1021,22 @@ CONFIG_SUNDANCE=m # CONFIG_SUNDANCE_MMIO is not set CONFIG_VIA_RHINE=m -# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_RHINE_MMIO=y # # Ethernet (1000 Mbit) # -# CONFIG_ACENIC is not set +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set CONFIG_DL2K=m CONFIG_E1000=m -# CONFIG_E1000_NAPI is not set +CONFIG_E1000_NAPI=y CONFIG_NS83820=m CONFIG_HAMACHI=m CONFIG_YELLOWFIN=m CONFIG_R8169=m -# CONFIG_R8169_NAPI is not set -# CONFIG_R8169_VLAN is not set +CONFIG_R8169_NAPI=y +CONFIG_R8169_VLAN=y CONFIG_SK98LIN=m CONFIG_VIA_VELOCITY=m CONFIG_TIGON3=m @@ -1101,9 +1046,9 @@ # Ethernet (10000 Mbit) # CONFIG_IXGB=m -# CONFIG_IXGB_NAPI is not set +CONFIG_IXGB_NAPI=y CONFIG_S2IO=m -# CONFIG_S2IO_NAPI is not set +CONFIG_S2IO_NAPI=y # CONFIG_2BUFF_MODE is not set # @@ -1124,7 +1069,7 @@ # # Obsolete Wireless cards support (pre-802.11) # -CONFIG_STRIP=m +# CONFIG_STRIP is not set # # Wireless 802.11b ISA/PCI cards support @@ -1145,35 +1090,7 @@ # # Wan interfaces # -CONFIG_WAN=y -CONFIG_DSCC4=m -CONFIG_DSCC4_PCISYNC=y -CONFIG_DSCC4_PCI_RST=y -CONFIG_LANMEDIA=m -CONFIG_SYNCLINK_SYNCPPP=m -CONFIG_HDLC=m -CONFIG_HDLC_RAW=y -CONFIG_HDLC_RAW_ETH=y -CONFIG_HDLC_CISCO=y -CONFIG_HDLC_FR=y -CONFIG_HDLC_PPP=y -CONFIG_HDLC_X25=y -CONFIG_PCI200SYN=m -CONFIG_WANXL=m -CONFIG_PC300=m -CONFIG_PC300_MLPPP=y -CONFIG_FARSYNC=m -CONFIG_DLCI=m -CONFIG_DLCI_COUNT=24 -CONFIG_DLCI_MAX=8 -CONFIG_WAN_ROUTER_DRIVERS=y -# CONFIG_VENDOR_SANGOMA is not set -CONFIG_CYCLADES_SYNC=m -CONFIG_CYCLOMX_X25=y -CONFIG_LAPBETHER=m -CONFIG_X25_ASY=m -CONFIG_SBNI=m -# CONFIG_SBNI_MULTILINE is not set +# CONFIG_WAN is not set # # ATM drivers @@ -1184,8 +1101,7 @@ # CONFIG_ATM_ENI_DEBUG is not set # CONFIG_ATM_ENI_TUNE_BURST is not set CONFIG_ATM_FIRESTREAM=m -CONFIG_ATM_ZATM=m -# CONFIG_ATM_ZATM_DEBUG is not set +# CONFIG_ATM_ZATM is not set CONFIG_ATM_IDT77252=m # CONFIG_ATM_IDT77252_DEBUG is not set # CONFIG_ATM_IDT77252_RCV_ALL is not set @@ -1195,20 +1111,13 @@ CONFIG_ATM_HORIZON=m # CONFIG_ATM_HORIZON_DEBUG is not set CONFIG_ATM_FORE200E_MAYBE=m -CONFIG_ATM_FORE200E_PCA=y -CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y -# CONFIG_ATM_FORE200E_USE_TASKLET is not set -CONFIG_ATM_FORE200E_TX_RETRY=16 -CONFIG_ATM_FORE200E_DEBUG=0 -CONFIG_ATM_FORE200E=m +# CONFIG_ATM_FORE200E_PCA is not set CONFIG_ATM_HE=m -CONFIG_ATM_HE_USE_SUNI=y +# CONFIG_ATM_HE_USE_SUNI is not set CONFIG_FDDI=y -CONFIG_DEFXX=m +# CONFIG_DEFXX is not set CONFIG_SKFP=m -CONFIG_HIPPI=y -CONFIG_ROADRUNNER=m -# CONFIG_ROADRUNNER_LARGE_RINGS is not set +# CONFIG_HIPPI is not set CONFIG_PLIP=m CONFIG_PPP=m CONFIG_PPP_MULTILINK=y @@ -1216,15 +1125,15 @@ CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_PPP_DEFLATE=m -CONFIG_PPP_BSDCOMP=m +# CONFIG_PPP_BSDCOMP is not set CONFIG_PPPOE=m CONFIG_PPPOATM=m CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y -CONFIG_SLIP_MODE_SLIP6=y +# CONFIG_SLIP_MODE_SLIP6 is not set CONFIG_NET_FC=y -CONFIG_SHAPER=m +# CONFIG_SHAPER is not set CONFIG_NETCONSOLE=m # @@ -1240,16 +1149,15 @@ CONFIG_ISDN_PPP_VJ=y CONFIG_ISDN_MPP=y CONFIG_IPPP_FILTER=y -CONFIG_ISDN_PPP_BSDCOMP=m +# CONFIG_ISDN_PPP_BSDCOMP is not set CONFIG_ISDN_AUDIO=y CONFIG_ISDN_TTY_FAX=y -CONFIG_ISDN_X25=y # # ISDN feature submodules # CONFIG_ISDN_DRV_LOOP=m -# CONFIG_ISDN_DIVERSION is not set +CONFIG_ISDN_DIVERSION=m # # ISDN4Linux hardware drivers @@ -1265,9 +1173,9 @@ # CONFIG_HISAX_EURO=y CONFIG_DE_AOC=y -# CONFIG_HISAX_NO_SENDCOMPLETE is not set -# CONFIG_HISAX_NO_LLC is not set -# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_NO_SENDCOMPLETE=y +CONFIG_HISAX_NO_LLC=y +CONFIG_HISAX_NO_KEYPAD=y CONFIG_HISAX_1TR6=y CONFIG_HISAX_NI1=y CONFIG_HISAX_MAX_CARDS=8 @@ -1342,19 +1250,12 @@ # # Active Eicon DIVA Server cards # -CONFIG_CAPI_EICON=y -CONFIG_ISDN_DIVAS=m -CONFIG_ISDN_DIVAS_BRIPCI=y -CONFIG_ISDN_DIVAS_PRIPCI=y -CONFIG_ISDN_DIVAS_DIVACAPI=m -CONFIG_ISDN_DIVAS_USERIDI=m -CONFIG_ISDN_DIVAS_MAINT=m +# CONFIG_CAPI_EICON is not set # # Telephony Support # -CONFIG_PHONE=m -CONFIG_PHONE_IXJ=m +# CONFIG_PHONE is not set # # Input device support @@ -1365,27 +1266,25 @@ # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m -CONFIG_INPUT_TSDEV=m -CONFIG_INPUT_TSDEV_SCREEN_X=240 -CONFIG_INPUT_TSDEV_SCREEN_Y=320 -CONFIG_INPUT_EVDEV=m -CONFIG_INPUT_EVBUG=m +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y -CONFIG_KEYBOARD_SUNKBD=m -CONFIG_KEYBOARD_LKKBD=m -CONFIG_KEYBOARD_XTKBD=m -CONFIG_KEYBOARD_NEWTON=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y -CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_PS2=y CONFIG_MOUSE_SERIAL=m CONFIG_MOUSE_VSXXXAA=m CONFIG_INPUT_JOYSTICK=y @@ -1427,19 +1326,19 @@ # CONFIG_SERIO=y CONFIG_SERIO_I8042=y -CONFIG_SERIO_SERPORT=m -CONFIG_SERIO_CT82C710=m -CONFIG_SERIO_PARKBD=m -CONFIG_SERIO_PCIPS2=m +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y -CONFIG_SERIO_RAW=m +# CONFIG_SERIO_RAW is not set CONFIG_GAMEPORT=m CONFIG_GAMEPORT_NS558=m CONFIG_GAMEPORT_L4=m CONFIG_GAMEPORT_EMU10K1=m CONFIG_GAMEPORT_VORTEX=m CONFIG_GAMEPORT_FM801=m -# CONFIG_GAMEPORT_CS461X is not set +CONFIG_GAMEPORT_CS461X=m # # Character devices @@ -1452,21 +1351,16 @@ # # Serial drivers # -CONFIG_SERIAL_8250=m -# CONFIG_SERIAL_8250_ACPI is not set -CONFIG_SERIAL_8250_NR_UARTS=4 -# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250 is not set # # Non-8250 serial port support # -CONFIG_SERIAL_CORE=m -CONFIG_SERIAL_JSM=m +# CONFIG_SERIAL_JSM is not set CONFIG_UNIX98_PTYS=y -CONFIG_LEGACY_PTYS=y -CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_LEGACY_PTYS is not set CONFIG_PRINTER=m -# CONFIG_LP_CONSOLE is not set +CONFIG_LP_CONSOLE=y CONFIG_PPDEV=m CONFIG_TIPAR=m @@ -1500,7 +1394,7 @@ CONFIG_WAFER_WDT=m CONFIG_I8XX_TCO=m CONFIG_SC1200_WDT=m -CONFIG_60XX_WDT=m +# CONFIG_60XX_WDT is not set CONFIG_CPU5_WDT=m CONFIG_W83627HF_WDT=m CONFIG_W83877F_WDT=m @@ -1518,67 +1412,31 @@ # CONFIG_USBPCWATCHDOG=m CONFIG_HW_RANDOM=m -CONFIG_NVRAM=m -CONFIG_RTC=m -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +# CONFIG_NVRAM is not set +CONFIG_RTC=y CONFIG_DTLK=m CONFIG_R3964=m -CONFIG_APPLICOM=m +# CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # -CONFIG_FTAPE=m -CONFIG_ZFTAPE=m -CONFIG_ZFT_DFLT_BLK_SZ=10240 - -# -# The compressor will be built as a module only! -# -CONFIG_ZFT_COMPRESSOR=m -CONFIG_FT_NR_BUFFERS=3 -CONFIG_FT_PROC_FS=y -CONFIG_FT_NORMAL_DEBUG=y -# CONFIG_FT_FULL_DEBUG is not set -# CONFIG_FT_NO_TRACE is not set -# CONFIG_FT_NO_TRACE_AT_ALL is not set - -# -# Hardware configuration -# -CONFIG_FT_STD_FDC=y -# CONFIG_FT_MACH2 is not set -# CONFIG_FT_PROBE_FC10 is not set -# CONFIG_FT_ALT_FDC is not set -CONFIG_FT_FDC_THR=8 -CONFIG_FT_FDC_MAX_RATE=2000 -CONFIG_FT_ALPHA_CLOCK=0 -CONFIG_AGP=m -CONFIG_AGP_AMD64=m -CONFIG_AGP_INTEL=m +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set CONFIG_DRM=m CONFIG_DRM_TDFX=m # CONFIG_DRM_GAMMA is not set CONFIG_DRM_R128=m CONFIG_DRM_RADEON=m -CONFIG_DRM_I810=m -CONFIG_DRM_I830=m -CONFIG_DRM_I915=m -CONFIG_DRM_MGA=m -CONFIG_DRM_SIS=m -CONFIG_MWAVE=m -CONFIG_RAW_DRIVER=m +# CONFIG_MWAVE is not set +# CONFIG_RAW_DRIVER is not set # CONFIG_HPET is not set -CONFIG_MAX_RAW_DEVS=256 CONFIG_HANGCHECK_TIMER=m # # TPM devices # -CONFIG_TCG_TPM=m -CONFIG_TCG_NSC=m -CONFIG_TCG_ATMEL=m +# CONFIG_TCG_TPM is not set # # I2C support @@ -1596,24 +1454,24 @@ # # I2C Hardware Bus support # -CONFIG_I2C_ALI1535=m -CONFIG_I2C_ALI1563=m -CONFIG_I2C_ALI15X3=m +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set CONFIG_I2C_AMD756=m CONFIG_I2C_AMD756_S4882=m CONFIG_I2C_AMD8111=m -CONFIG_I2C_I801=m -CONFIG_I2C_I810=m -CONFIG_I2C_PIIX4=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +# CONFIG_I2C_PIIX4 is not set CONFIG_I2C_ISA=m CONFIG_I2C_NFORCE2=m -CONFIG_I2C_PARPORT=m -CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PARPORT is not set +# CONFIG_I2C_PARPORT_LIGHT is not set CONFIG_I2C_PROSAVAGE=m CONFIG_I2C_SAVAGE4=m -CONFIG_SCx200_ACB=m -CONFIG_I2C_SIS5595=m -CONFIG_I2C_SIS630=m +# CONFIG_SCx200_ACB is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set CONFIG_I2C_SIS96X=m CONFIG_I2C_STUB=m CONFIG_I2C_VIA=m @@ -1648,7 +1506,7 @@ CONFIG_SENSORS_LM92=m CONFIG_SENSORS_MAX1619=m CONFIG_SENSORS_PC87360=m -# CONFIG_SENSORS_SMSC47B397 is not set +CONFIG_SENSORS_SMSC47B397=m CONFIG_SENSORS_SIS5595=m CONFIG_SENSORS_SMSC47M1=m CONFIG_SENSORS_VIA686A=m @@ -1682,7 +1540,7 @@ # # Misc devices # -CONFIG_IBM_ASM=m +# CONFIG_IBM_ASM is not set # # Multimedia devices @@ -1714,13 +1572,14 @@ CONFIG_VIDEO_ZORAN_LML33=m CONFIG_VIDEO_ZORAN_LML33R10=m # CONFIG_VIDEO_ZR36120 is not set -# CONFIG_VIDEO_SAA7134 is not set +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_SAA7134_DVB=m CONFIG_VIDEO_MXB=m CONFIG_VIDEO_DPC=m CONFIG_VIDEO_HEXIUM_ORION=m CONFIG_VIDEO_HEXIUM_GEMINI=m CONFIG_VIDEO_CX88=m -# CONFIG_VIDEO_CX88_DVB is not set +CONFIG_VIDEO_CX88_DVB=m CONFIG_VIDEO_OVCAMCHIP=m # @@ -1740,7 +1599,7 @@ # Supported SAA7146 based PCI Adapters # CONFIG_DVB_AV7110=m -# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_AV7110_OSD=y CONFIG_DVB_BUDGET=m CONFIG_DVB_BUDGET_CI=m CONFIG_DVB_BUDGET_AV=m @@ -1755,7 +1614,12 @@ CONFIG_DVB_DIBUSB_MISDESIGNED_DEVICES=y # CONFIG_DVB_DIBCOM_DEBUG is not set CONFIG_DVB_CINERGYT2=m -# CONFIG_DVB_CINERGYT2_TUNING is not set +CONFIG_DVB_CINERGYT2_TUNING=y +CONFIG_DVB_CINERGYT2_STREAM_URB_COUNT=32 +CONFIG_DVB_CINERGYT2_STREAM_BUF_SIZE=512 +CONFIG_DVB_CINERGYT2_QUERY_INTERVAL=250 +CONFIG_DVB_CINERGYT2_ENABLE_RC_INPUT_DEVICE=y +CONFIG_DVB_CINERGYT2_RC_QUERY_INTERVAL=100 # # Supported FlexCopII (B2C2) Adapters @@ -1822,6 +1686,7 @@ CONFIG_VIDEO_VIDEOBUF=m CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BUF_DVB=m CONFIG_VIDEO_BTCX=m CONFIG_VIDEO_IR=m CONFIG_VIDEO_TVEEPROM=m @@ -1830,36 +1695,34 @@ # Graphics support # CONFIG_FB=y -CONFIG_FB_CFB_FILLRECT=m -CONFIG_FB_CFB_COPYAREA=m -CONFIG_FB_CFB_IMAGEBLIT=m -CONFIG_FB_SOFT_CURSOR=m +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +CONFIG_FB_SOFT_CURSOR=y # CONFIG_FB_MACMODES is not set CONFIG_FB_MODE_HELPERS=y CONFIG_FB_TILEBLITTING=y CONFIG_FB_CIRRUS=m -CONFIG_FB_PM2=m -CONFIG_FB_PM2_FIFO_DISCONNECT=y -CONFIG_FB_CYBER2000=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set CONFIG_FB_VGA16=m -# CONFIG_FB_VESA is not set +CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y -CONFIG_FB_HGA=m -# CONFIG_FB_HGA_ACCEL is not set -CONFIG_FB_NVIDIA=m -CONFIG_FB_NVIDIA_I2C=y +# CONFIG_FB_HGA is not set +# CONFIG_FB_NVIDIA is not set CONFIG_FB_RIVA=m -CONFIG_FB_RIVA_I2C=y -CONFIG_FB_RIVA_DEBUG=y +# CONFIG_FB_RIVA_I2C is not set +# CONFIG_FB_RIVA_DEBUG is not set CONFIG_FB_MATROX=m CONFIG_FB_MATROX_MILLENIUM=y CONFIG_FB_MATROX_MYSTIQUE=y -# CONFIG_FB_MATROX_G is not set +CONFIG_FB_MATROX_G=y CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m CONFIG_FB_MATROX_MULTIHEAD=y -CONFIG_FB_RADEON_OLD=m +# CONFIG_FB_RADEON_OLD is not set CONFIG_FB_RADEON=m CONFIG_FB_RADEON_I2C=y # CONFIG_FB_RADEON_DEBUG is not set @@ -1867,33 +1730,30 @@ CONFIG_FB_ATY=m CONFIG_FB_ATY_CT=y CONFIG_FB_ATY_GENERIC_LCD=y -CONFIG_FB_ATY_XL_INIT=y +# CONFIG_FB_ATY_XL_INIT is not set CONFIG_FB_ATY_GX=y CONFIG_FB_SAVAGE=m CONFIG_FB_SAVAGE_I2C=y CONFIG_FB_SAVAGE_ACCEL=y -CONFIG_FB_SIS=m -CONFIG_FB_SIS_300=y -CONFIG_FB_SIS_315=y +# CONFIG_FB_SIS is not set CONFIG_FB_NEOMAGIC=m CONFIG_FB_KYRO=m CONFIG_FB_3DFX=m -# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_3DFX_ACCEL=y CONFIG_FB_VOODOO1=m CONFIG_FB_TRIDENT=m -# CONFIG_FB_TRIDENT_ACCEL is not set +CONFIG_FB_TRIDENT_ACCEL=y # CONFIG_FB_PM3 is not set -CONFIG_FB_GEODE=y -CONFIG_FB_GEODE_GX1=m -CONFIG_FB_S1D13XXX=m -CONFIG_FB_VIRTUAL=m +# CONFIG_FB_GEODE is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_VIRTUAL is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_DUMMY_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE=m +CONFIG_FRAMEBUFFER_CONSOLE=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y @@ -1901,8 +1761,15 @@ # # Logo configuration # -# CONFIG_LOGO is not set -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=m +CONFIG_BACKLIGHT_DEVICE=y +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_DEVICE=y # # Sound @@ -1936,7 +1803,7 @@ CONFIG_SND_DUMMY=m CONFIG_SND_VIRMIDI=m CONFIG_SND_MTPAV=m -CONFIG_SND_SERIAL_U16550=m +# CONFIG_SND_SERIAL_U16550 is not set CONFIG_SND_MPU401=m # @@ -1956,8 +1823,8 @@ CONFIG_SND_CS46XX_NEW_DSP=y CONFIG_SND_CS4281=m CONFIG_SND_EMU10K1=m -# CONFIG_SND_EMU10K1X is not set -# CONFIG_SND_CA0106 is not set +CONFIG_SND_EMU10K1X=m +CONFIG_SND_CA0106=m CONFIG_SND_KORG1212=m CONFIG_SND_MIXART=m CONFIG_SND_NM256=m @@ -1982,7 +1849,7 @@ CONFIG_SND_INTEL8X0M=m CONFIG_SND_SONICVIBES=m CONFIG_SND_VIA82XX=m -# CONFIG_SND_VIA82XX_MODEM is not set +CONFIG_SND_VIA82XX_MODEM=m CONFIG_SND_VX222=m CONFIG_SND_HDA_INTEL=m @@ -1995,75 +1862,7 @@ # # Open Sound System # -CONFIG_SOUND_PRIME=m -CONFIG_SOUND_BT878=m -CONFIG_SOUND_CMPCI=m -# CONFIG_SOUND_CMPCI_FM is not set -# CONFIG_SOUND_CMPCI_MIDI is not set -CONFIG_SOUND_CMPCI_JOYSTICK=y -CONFIG_SOUND_EMU10K1=m -CONFIG_MIDI_EMU10K1=y -CONFIG_SOUND_FUSION=m -CONFIG_SOUND_CS4281=m -CONFIG_SOUND_ES1370=m -CONFIG_SOUND_ES1371=m -CONFIG_SOUND_ESSSOLO1=m -CONFIG_SOUND_MAESTRO=m -CONFIG_SOUND_MAESTRO3=m -CONFIG_SOUND_ICH=m -CONFIG_SOUND_SONICVIBES=m -CONFIG_SOUND_TRIDENT=m -# CONFIG_SOUND_MSNDCLAS is not set -# CONFIG_SOUND_MSNDPIN is not set -CONFIG_SOUND_VIA82CXXX=m -CONFIG_MIDI_VIA82CXXX=y -CONFIG_SOUND_OSS=m -# CONFIG_SOUND_TRACEINIT is not set -# CONFIG_SOUND_DMAP is not set -# CONFIG_SOUND_AD1816 is not set -CONFIG_SOUND_AD1889=m -CONFIG_SOUND_SGALAXY=m -CONFIG_SOUND_ADLIB=m -CONFIG_SOUND_ACI_MIXER=m -CONFIG_SOUND_CS4232=m -CONFIG_SOUND_SSCAPE=m -CONFIG_SOUND_GUS=m -CONFIG_SOUND_GUS16=y -CONFIG_SOUND_GUSMAX=y -CONFIG_SOUND_VMIDI=m -CONFIG_SOUND_TRIX=m -CONFIG_SOUND_MSS=m -CONFIG_SOUND_MPU401=m -CONFIG_SOUND_NM256=m -CONFIG_SOUND_MAD16=m -CONFIG_MAD16_OLDCARD=y -CONFIG_SOUND_PAS=m -CONFIG_SOUND_PSS=m -CONFIG_PSS_MIXER=y -CONFIG_SOUND_SB=m -# CONFIG_SOUND_AWE32_SYNTH is not set -CONFIG_SOUND_WAVEFRONT=m -CONFIG_SOUND_MAUI=m -CONFIG_SOUND_YM3812=m -CONFIG_SOUND_OPL3SA1=m -CONFIG_SOUND_OPL3SA2=m -CONFIG_SOUND_YMFPCI=m -# CONFIG_SOUND_YMFPCI_LEGACY is not set -CONFIG_SOUND_UART6850=m -CONFIG_SOUND_AEDSP16=m -CONFIG_SC6600=y -CONFIG_SC6600_JOY=y -CONFIG_SC6600_CDROM=4 -CONFIG_SC6600_CDROMBASE=0x0 -# CONFIG_AEDSP16_MSS is not set -# CONFIG_AEDSP16_SBPRO is not set -# CONFIG_AEDSP16_MPU401 is not set -CONFIG_SOUND_TVMIXER=m -CONFIG_SOUND_KAHLUA=m -CONFIG_SOUND_ALI5455=m -CONFIG_SOUND_FORTE=m -CONFIG_SOUND_RME96XX=m -CONFIG_SOUND_AD1980=m +# CONFIG_SOUND_PRIME is not set # # USB support @@ -2077,14 +1876,14 @@ # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y -CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_BANDWIDTH is not set # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # # USB Host Controller Drivers # -CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD=m CONFIG_USB_EHCI_SPLIT_ISO=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_OHCI_HCD=m @@ -2096,7 +1895,7 @@ # # USB Device Class drivers # -CONFIG_USB_AUDIO=m +# CONFIG_USB_AUDIO is not set # # USB Bluetooth TTY can only be used with disabled Bluetooth subsystem @@ -2122,16 +1921,13 @@ # # USB Input Devices # -CONFIG_USB_HID=m +CONFIG_USB_HID=y CONFIG_USB_HIDINPUT=y -# CONFIG_HID_FF is not set +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y CONFIG_USB_HIDDEV=y - -# -# USB HID Boot Protocol drivers -# -CONFIG_USB_KBD=y -CONFIG_USB_MOUSE=y CONFIG_USB_AIPTEK=m CONFIG_USB_WACOM=m CONFIG_USB_KBTAB=m @@ -2150,7 +1946,7 @@ # # USB Multimedia devices # -# CONFIG_USB_DABUSB is not set +CONFIG_USB_DABUSB=m CONFIG_USB_VICAM=m CONFIG_USB_DSBR=m CONFIG_USB_IBMCAM=m @@ -2220,30 +2016,30 @@ CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m -# CONFIG_USB_SERIAL_GARMIN is not set +CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m -# CONFIG_USB_SERIAL_KEYSPAN_MPR is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set -# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_HP4X=m CONFIG_USB_SERIAL_SAFE=m -# CONFIG_USB_SERIAL_SAFE_PADDED is not set -# CONFIG_USB_SERIAL_TI is not set +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_TI=m CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_OMNINET=m @@ -2252,17 +2048,17 @@ # # USB Miscellaneous drivers # -# CONFIG_USB_EMI62 is not set +CONFIG_USB_EMI62=m # CONFIG_USB_EMI26 is not set CONFIG_USB_AUERSWALD=m CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m CONFIG_USB_LED=m -CONFIG_USB_CYTHERM=m +# CONFIG_USB_CYTHERM is not set CONFIG_USB_PHIDGETKIT=m CONFIG_USB_PHIDGETSERVO=m -# CONFIG_USB_IDMOUSE is not set +CONFIG_USB_IDMOUSE=m CONFIG_USB_SISUSBVGA=m CONFIG_USB_TEST=m @@ -2275,33 +2071,24 @@ # # USB Gadget Support # -CONFIG_USB_GADGET=m -# CONFIG_USB_GADGET_DEBUG_FILES is not set -CONFIG_USB_GADGET_NET2280=y -CONFIG_USB_NET2280=m -# CONFIG_USB_GADGET_PXA2XX is not set -# CONFIG_USB_GADGET_GOKU is not set -# CONFIG_USB_GADGET_LH7A40X is not set -# CONFIG_USB_GADGET_OMAP is not set -# CONFIG_USB_GADGET_DUMMY_HCD is not set -CONFIG_USB_GADGET_DUALSPEED=y -CONFIG_USB_ZERO=m -CONFIG_USB_ETH=m -CONFIG_USB_ETH_RNDIS=y -CONFIG_USB_GADGETFS=m -CONFIG_USB_FILE_STORAGE=m -# CONFIG_USB_FILE_STORAGE_TEST is not set -CONFIG_USB_G_SERIAL=m +# CONFIG_USB_GADGET is not set # # MMC/SD Card support # -# CONFIG_MMC is not set +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=m +CONFIG_MMC_WBSD=m # # InfiniBand support # -# CONFIG_INFINIBAND is not set +CONFIG_INFINIBAND=m +CONFIG_INFINIBAND_MTHCA=m +# CONFIG_INFINIBAND_MTHCA_DEBUG is not set +CONFIG_INFINIBAND_IPOIB=m +# CONFIG_INFINIBAND_IPOIB_DEBUG is not set # # Power management options @@ -2335,7 +2122,7 @@ # # File systems # -CONFIG_EXT2_FS=m +CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y @@ -2345,16 +2132,18 @@ CONFIG_EXT3_FS_SECURITY=y CONFIG_JBD=m # CONFIG_JBD_DEBUG is not set -CONFIG_FS_MBCACHE=m +CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set -# CONFIG_REISERFS_PROC_INFO is not set -# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_REISERFS_PROC_INFO=y +CONFIG_REISERFS_FS_XATTR=y +CONFIG_REISERFS_FS_POSIX_ACL=y +CONFIG_REISERFS_FS_SECURITY=y CONFIG_JFS_FS=m CONFIG_JFS_POSIX_ACL=y -# CONFIG_JFS_SECURITY is not set +CONFIG_JFS_SECURITY=y # CONFIG_JFS_DEBUG is not set -CONFIG_JFS_STATISTICS=y +# CONFIG_JFS_STATISTICS is not set CONFIG_FS_POSIX_ACL=y # @@ -2362,15 +2151,15 @@ # CONFIG_XFS_FS=m CONFIG_XFS_EXPORT=y -CONFIG_XFS_RT=y +# CONFIG_XFS_RT is not set CONFIG_XFS_QUOTA=y CONFIG_XFS_SECURITY=y CONFIG_XFS_POSIX_ACL=y CONFIG_MINIX_FS=m CONFIG_ROMFS_FS=m CONFIG_QUOTA=y -CONFIG_QFMT_V1=m -CONFIG_QFMT_V2=m +# CONFIG_QFMT_V1 is not set +CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_DNOTIFY=y CONFIG_AUTOFS_FS=m @@ -2379,10 +2168,10 @@ # # CD-ROM/DVD Filesystems # -CONFIG_ISO9660_FS=m +CONFIG_ISO9660_FS=y CONFIG_JOLIET=y CONFIG_ZISOFS=y -CONFIG_ZISOFS_FS=m +CONFIG_ZISOFS_FS=y CONFIG_UDF_FS=m CONFIG_UDF_NLS=y @@ -2393,10 +2182,8 @@ CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -CONFIG_NTFS_FS=m -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_RW is not set +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_NTFS_FS is not set # # Pseudo filesystems @@ -2404,9 +2191,7 @@ CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y -CONFIG_DEVFS_FS=y -# CONFIG_DEVFS_MOUNT is not set -# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y CONFIG_DEVPTS_FS_SECURITY=y CONFIG_TMPFS=y @@ -2419,8 +2204,7 @@ # # Miscellaneous filesystems # -CONFIG_ADFS_FS=m -# CONFIG_ADFS_FS_RW is not set +# CONFIG_ADFS_FS is not set CONFIG_AFFS_FS=m CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m @@ -2428,20 +2212,18 @@ # CONFIG_BEFS_DEBUG is not set CONFIG_BFS_FS=m CONFIG_EFS_FS=m -CONFIG_JFFS_FS=m -CONFIG_JFFS_FS_VERBOSE=0 -CONFIG_JFFS_PROC_FS=y +# CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=m CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_JFFS2_FS_NAND is not set +CONFIG_JFFS2_FS_NAND=y # CONFIG_JFFS2_FS_NOR_ECC is not set # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y # CONFIG_JFFS2_RUBIN is not set -CONFIG_CRAMFS=y +CONFIG_CRAMFS=m CONFIG_VXFS_FS=m -CONFIG_HPFS_FS=m +# CONFIG_HPFS_FS is not set CONFIG_QNX4FS_FS=m # CONFIG_QNX4FS_RW is not set CONFIG_SYSV_FS=m @@ -2470,7 +2252,8 @@ # CONFIG_SMB_NLS_DEFAULT is not set CONFIG_CIFS=m # CONFIG_CIFS_STATS is not set -# CONFIG_CIFS_XATTR is not set +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y # CONFIG_CIFS_EXPERIMENTAL is not set CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y @@ -2478,38 +2261,29 @@ CONFIG_NCPFS_STRONG=y CONFIG_NCPFS_NFS_NS=y CONFIG_NCPFS_OS2_NS=y -# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_SMALLDOS=y CONFIG_NCPFS_NLS=y CONFIG_NCPFS_EXTRAS=y -CONFIG_CODA_FS=m -# CONFIG_CODA_FS_OLD_API is not set -CONFIG_AFS_FS=m -CONFIG_RXRPC=m +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y -CONFIG_ACORN_PARTITION=y -CONFIG_ACORN_PARTITION_CUMANA=y -# CONFIG_ACORN_PARTITION_EESOX is not set -CONFIG_ACORN_PARTITION_ICS=y -# CONFIG_ACORN_PARTITION_ADFS is not set -# CONFIG_ACORN_PARTITION_POWERTEC is not set -CONFIG_ACORN_PARTITION_RISCIX=y +# CONFIG_ACORN_PARTITION is not set CONFIG_OSF_PARTITION=y CONFIG_AMIGA_PARTITION=y -CONFIG_ATARI_PARTITION=y +# CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y -CONFIG_LDM_PARTITION=y -# CONFIG_LDM_DEBUG is not set +# CONFIG_LDM_PARTITION is not set CONFIG_SGI_PARTITION=y -CONFIG_ULTRIX_PARTITION=y +# CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y CONFIG_EFI_PARTITION=y @@ -2517,8 +2291,8 @@ # Native Language Support # CONFIG_NLS=y -CONFIG_NLS_DEFAULT="cp437" -CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m @@ -2541,7 +2315,7 @@ CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m -CONFIG_NLS_ASCII=m +CONFIG_NLS_ASCII=y CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m @@ -2561,15 +2335,15 @@ # Security options # CONFIG_KEYS=y -# CONFIG_KEYS_DEBUG_PROC_KEYS is not set +CONFIG_KEYS_DEBUG_PROC_KEYS=y CONFIG_SECURITY=y -# CONFIG_SECURITY_NETWORK is not set -CONFIG_SECURITY_CAPABILITIES=m -CONFIG_SECURITY_ROOTPLUG=m -CONFIG_SECURITY_SECLVL=m +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_ROOTPLUG is not set +# CONFIG_SECURITY_SECLVL is not set CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y -CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=0 +CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y @@ -2582,8 +2356,8 @@ CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_WP512=m @@ -2602,7 +2376,7 @@ CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_CRC32C=m -CONFIG_CRYPTO_TEST=m +# CONFIG_CRYPTO_TEST is not set # # Hardware crypto devices @@ -2616,29 +2390,12 @@ CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m -CONFIG_REED_SOLOMON=m -CONFIG_REED_SOLOMON_DEC16=y # # Kernel hacking # # CONFIG_PRINTK_TIME is not set -CONFIG_DEBUG_KERNEL=y -CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_KERNEL is not set CONFIG_LOG_BUF_SHIFT=14 -# CONFIG_SCHEDSTATS is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_SPINLOCK_SLEEP is not set -# CONFIG_DEBUG_KOBJECT is not set -# CONFIG_DEBUG_INFO is not set -# CONFIG_DEBUG_FS is not set -# CONFIG_DEBUG_STACKOVERFLOW is not set -# CONFIG_KPROBES is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_4KSTACKS is not set CONFIG_X86_FIND_SMP_CONFIG=y CONFIG_X86_MPPARSE=y -# CONFIG_CHECKING is not set -# CONFIG_INIT_DEBUG is not set diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c Mon Aug 15 18:32:29 2005 @@ -206,9 +206,9 @@ struct vcpu_time_info *info = &HYPERVISOR_shared_info->vcpu_time[0]; do_div(__cpu_khz, info->tsc_to_system_mul); if ( info->tsc_shift < 0 ) - cpu_khz = __cpu_khz >> -info->tsc_shift; + cpu_khz = __cpu_khz << -info->tsc_shift; else - cpu_khz = __cpu_khz << info->tsc_shift; + cpu_khz = __cpu_khz >> info->tsc_shift; } static u64 get_nsec_offset(struct shadow_time_info *shadow) @@ -231,32 +231,18 @@ { long wtm_nsec, xtime_nsec; time_t wtm_sec, xtime_sec; - s64 tmp, wc_nsec; + u64 tmp, wc_nsec; /* Adjust wall-clock time base based on wall_jiffies ticks. */ wc_nsec = processed_system_time; - wc_nsec += (sec * 1000000000LL) + nsec; + wc_nsec += (u64)sec * 1000000000ULL; + wc_nsec += (u64)nsec; wc_nsec -= (jiffies - wall_jiffies) * (u64)(NSEC_PER_SEC / HZ); /* Split wallclock base into seconds and nanoseconds. */ - if ( (tmp = wc_nsec) < 0 ) - { - /* -ve UTC offset => -ve seconds, +ve nanoseconds. */ - tmp = -tmp; - xtime_nsec = do_div(tmp, 1000000000); - tmp = -tmp; - if ( xtime_nsec != 0 ) - { - xtime_nsec = 1000000000 - xtime_nsec; - tmp--; - } - } - else - { - /* +ve UTC offset => +ve seconds, +ve nanoseconds. */ - xtime_nsec = do_div(tmp, 1000000000); - } - xtime_sec = (time_t)tmp; + tmp = wc_nsec; + xtime_nsec = do_div(tmp, 1000000000); + xtime_sec = (time_t)tmp; wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - xtime_sec); wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - xtime_nsec); diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/i386/mm/highmem.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/highmem.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/highmem.c Mon Aug 15 18:32:29 2005 @@ -41,8 +41,7 @@ if (!pte_none(*(kmap_pte-idx))) BUG(); #endif - set_pte(kmap_pte-idx, mk_pte(page, prot)); - __flush_tlb_one(vaddr); + set_pte_at_sync(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot)); return (void*) vaddr; } diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c Mon Aug 15 18:32:29 2005 @@ -286,8 +286,8 @@ pmd = pmd_offset(pud, (vstart + (i*PAGE_SIZE))); pte = pte_offset_kernel(pmd, (vstart + (i*PAGE_SIZE))); mfn = pte_mfn(*pte); - HYPERVISOR_update_va_mapping( - vstart + (i*PAGE_SIZE), __pte_ma(0), 0); + BUG_ON(HYPERVISOR_update_va_mapping( + vstart + (i*PAGE_SIZE), __pte_ma(0), 0)); phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = INVALID_P2M_ENTRY; BUG_ON(HYPERVISOR_dom_mem_op( @@ -300,9 +300,9 @@ /* 3. Map the new extent in place of old pages. */ for (i = 0; i < (1<<order); i++) { - HYPERVISOR_update_va_mapping( + BUG_ON(HYPERVISOR_update_va_mapping( vstart + (i*PAGE_SIZE), - __pte_ma(((mfn+i)<<PAGE_SHIFT)|__PAGE_KERNEL), 0); + __pte_ma(((mfn+i)<<PAGE_SHIFT)|__PAGE_KERNEL), 0)); xen_machphys_update(mfn+i, (__pa(vstart)>>PAGE_SHIFT)+i); phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = mfn+i; } @@ -345,7 +345,8 @@ #ifdef CONFIG_X86_64 xen_l1_entry_update(pte, __pte(0)); #else - HYPERVISOR_update_va_mapping(vstart + (i*PAGE_SIZE), __pte_ma(0), 0); + BUG_ON(HYPERVISOR_update_va_mapping(vstart + (i*PAGE_SIZE), + __pte_ma(0), 0)); #endif phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = INVALID_P2M_ENTRY; diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/ioremap.c Mon Aug 15 18:32:29 2005 @@ -298,90 +298,20 @@ #define direct_mk_pte_phys(physpage, pgprot) \ __direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot) -static inline void direct_remap_area_pte(pte_t *pte, - unsigned long address, - unsigned long size, - mmu_update_t **v) -{ - unsigned long end; - - address &= ~PMD_MASK; - end = address + size; - if (end > PMD_SIZE) - end = PMD_SIZE; - if (address >= end) - BUG(); - - do { - (*v)->ptr = virt_to_machine(pte); - (*v)++; - address += PAGE_SIZE; - pte++; - } while (address && (address < end)); -} - -static inline int direct_remap_area_pmd(struct mm_struct *mm, - pmd_t *pmd, - unsigned long address, - unsigned long size, - mmu_update_t **v) -{ - unsigned long end; - - address &= ~PGDIR_MASK; - end = address + size; - if (end > PGDIR_SIZE) - end = PGDIR_SIZE; - if (address >= end) - BUG(); - do { - pte_t *pte = (mm == &init_mm) ? - pte_alloc_kernel(mm, pmd, address) : - pte_alloc_map(mm, pmd, address); - if (!pte) - return -ENOMEM; - direct_remap_area_pte(pte, address, end - address, v); - pte_unmap(pte); - address = (address + PMD_SIZE) & PMD_MASK; - pmd++; - } while (address && (address < end)); - return 0; -} - -int __direct_remap_area_pages(struct mm_struct *mm, - unsigned long address, - unsigned long size, - mmu_update_t *v) -{ - pgd_t * dir; - unsigned long end = address + size; - int error; - - dir = pgd_offset(mm, address); - if (address >= end) - BUG(); - spin_lock(&mm->page_table_lock); - do { - pud_t *pud; - pmd_t *pmd; - - error = -ENOMEM; - pud = pud_alloc(mm, dir, address); - if (!pud) - break; - pmd = pmd_alloc(mm, pud, address); - if (!pmd) - break; - error = 0; - direct_remap_area_pmd(mm, pmd, address, end - address, &v); - address = (address + PGDIR_SIZE) & PGDIR_MASK; - dir++; - - } while (address && (address < end)); - spin_unlock(&mm->page_table_lock); - return error; -} - + +static int direct_remap_area_pte_fn(pte_t *pte, + struct page *pte_page, + unsigned long address, + void *data) +{ + mmu_update_t **v = (mmu_update_t **)data; + + (*v)->ptr = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT) + | ((unsigned long)pte & ~PAGE_MASK); + (*v)++; + + return 0; +} int direct_remap_area_pages(struct mm_struct *mm, unsigned long address, @@ -393,7 +323,7 @@ int i; unsigned long start_address; #define MAX_DIRECTMAP_MMU_QUEUE 130 - mmu_update_t u[MAX_DIRECTMAP_MMU_QUEUE], *v = u; + mmu_update_t u[MAX_DIRECTMAP_MMU_QUEUE], *v = u, *w = u; start_address = address; @@ -402,10 +332,9 @@ for (i = 0; i < size; i += PAGE_SIZE) { if ((v - u) == MAX_DIRECTMAP_MMU_QUEUE) { /* Fill in the PTE pointers. */ - __direct_remap_area_pages(mm, - start_address, - address-start_address, - u); + generic_page_range(mm, start_address, + address-start_address, + direct_remap_area_pte_fn, &w); if (HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0) return -EFAULT; @@ -426,10 +355,9 @@ if (v != u) { /* get the ptep's filled in */ - __direct_remap_area_pages(mm, - start_address, - address-start_address, - u); + generic_page_range(mm, start_address, + address-start_address, + direct_remap_area_pte_fn, &w); if (unlikely(HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0)) return -EFAULT; } @@ -440,3 +368,34 @@ } EXPORT_SYMBOL(direct_remap_area_pages); + +int create_lookup_pte_addr(struct mm_struct *mm, + unsigned long address, + unsigned long *ptep) +{ + int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + { + unsigned long *ptep = (unsigned long *)data; + if (ptep) *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT) + | ((unsigned long)pte & ~PAGE_MASK); + return 0; + } + + return generic_page_range(mm, address, PAGE_SIZE, f, ptep); +} + +EXPORT_SYMBOL(create_lookup_pte_addr); + +int touch_pte_range(struct mm_struct *mm, + unsigned long address, + unsigned long size) +{ + int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + { + return 0; + } + + return generic_page_range(mm, address, size, f, NULL); +} + +EXPORT_SYMBOL(touch_pte_range); diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/pgtable.c Mon Aug 15 18:32:29 2005 @@ -222,8 +222,8 @@ unsigned long va = (unsigned long)__va(page_to_pfn(pte)<<PAGE_SHIFT); if (!pte_write(*virt_to_ptep(va))) - HYPERVISOR_update_va_mapping( - va, pfn_pte(page_to_pfn(pte), PAGE_KERNEL), 0); + BUG_ON(HYPERVISOR_update_va_mapping( + va, pfn_pte(page_to_pfn(pte), PAGE_KERNEL), 0)); ClearPageForeign(pte); set_page_count(pte, 1); @@ -355,10 +355,10 @@ if (!pte_write(*ptep)) { xen_pgd_unpin(__pa(pgd)); - HYPERVISOR_update_va_mapping( + BUG_ON(HYPERVISOR_update_va_mapping( (unsigned long)pgd, pfn_pte(virt_to_phys(pgd)>>PAGE_SHIFT, PAGE_KERNEL), - 0); + 0)); } /* in the PAE case user pgd entries are overwritten before usage */ @@ -451,9 +451,9 @@ if (PageHighMem(page)) return; - HYPERVISOR_update_va_mapping( + BUG_ON(HYPERVISOR_update_va_mapping( (unsigned long)__va(pfn << PAGE_SHIFT), - pfn_pte(pfn, flags), 0); + pfn_pte(pfn, flags), 0)); } static void mm_walk(struct mm_struct *mm, pgprot_t flags) @@ -492,10 +492,10 @@ spin_lock(&mm->page_table_lock); mm_walk(mm, PAGE_KERNEL_RO); - HYPERVISOR_update_va_mapping( + BUG_ON(HYPERVISOR_update_va_mapping( (unsigned long)mm->pgd, pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL_RO), - UVMF_TLB_FLUSH); + UVMF_TLB_FLUSH)); xen_pgd_pin(__pa(mm->pgd)); mm->context.pinned = 1; spin_lock(&mm_unpinned_lock); @@ -510,9 +510,9 @@ spin_lock(&mm->page_table_lock); xen_pgd_unpin(__pa(mm->pgd)); - HYPERVISOR_update_va_mapping( + BUG_ON(HYPERVISOR_update_va_mapping( (unsigned long)mm->pgd, - pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL), 0); + pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, PAGE_KERNEL), 0)); mm_walk(mm, PAGE_KERNEL); xen_tlb_flush(); mm->context.pinned = 0; diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/kernel/reboot.c --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c Mon Aug 15 18:32:29 2005 @@ -15,6 +15,7 @@ #include <asm-xen/linux-public/suspend.h> #include <asm-xen/queues.h> #include <asm-xen/xenbus.h> +#include <asm-xen/ctrl_if.h> #define SHUTDOWN_INVALID -1 #define SHUTDOWN_POWEROFF 0 diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/Makefile --- a/linux-2.6-xen-sparse/arch/xen/x86_64/Makefile Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/Makefile Mon Aug 15 18:32:29 2005 @@ -79,14 +79,15 @@ CFLAGS += $(xenflags-y) AFLAGS += $(xenflags-y) -prepare: include/asm-$(XENARCH)/asm_offset.h -CLEAN_FILES += include/asm-$(XENARCH)/asm_offset.h +prepare: include/asm-$(XENARCH)/asm_offsets.h +CLEAN_FILES += include/asm-$(XENARCH)/asm_offsets.h arch/$(XENARCH)/kernel/asm-offsets.s: include/asm include/.asm-ignore \ include/linux/version.h include/config/MARKER +include/asm-$(XENARCH)/offset.h: arch/$(XENARCH)/kernel/asm-offsets.s + $(call filechk,gen-asm-offsets) -include/asm-$(XENARCH)/asm_offset.h: arch/xen/x86_64/kernel/asm-offsets.s - $(call filechk,gen-asm-offsets) - ln -fsn asm_offset.h include/asm-$(XENARCH)/offset.h - +include/asm-$(XENARCH)/asm_offsets.h: include/asm-$(XENARCH)/offset.h + ln -fsn offset.h include/asm-$(XENARCH)/asm_offsets.h + ln -fsn offset.h include/asm-$(XENARCH)/asm_offset.h diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/apic.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/apic.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/apic.c Mon Aug 15 18:32:29 2005 @@ -45,10 +45,11 @@ void smp_local_timer_interrupt(struct pt_regs *regs) { - int cpu = smp_processor_id(); profile_tick(CPU_PROFILING, regs); #ifndef CONFIG_XEN + int cpu = smp_processor_id(); + if (--per_cpu(prof_counter, cpu) <= 0) { /* * The multiplier may have changed since the last time we got diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/e820.c Mon Aug 15 18:32:29 2005 @@ -46,7 +46,7 @@ e820.nr_map++; } -#if 0 +#ifndef CONFIG_XEN extern char _end[]; /* @@ -235,7 +235,6 @@ } } - void __init e820_print_map(char *who) { int i; @@ -516,9 +515,31 @@ printk(KERN_INFO "BIOS-provided physical RAM map:\n"); e820_print_map(who); } + +#else /* CONFIX_XEN */ +extern unsigned long xen_override_max_pfn; +extern union xen_start_info_union xen_start_info_union; +/* + * Guest physical starts from 0. + */ +unsigned long __init e820_end_of_ram(void) +{ + unsigned long max_end_pfn = xen_start_info.nr_pages; + + if ( xen_override_max_pfn < max_end_pfn) + xen_override_max_pfn = max_end_pfn; + + return xen_override_max_pfn; +} + + + +void __init e820_reserve_resources(void) +{ + return; /* Xen won't have reserved entries */ +} + #endif - -extern unsigned long xen_override_max_pfn; void __init parse_memopt(char *p, char **from) { diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S Mon Aug 15 18:32:29 2005 @@ -128,7 +128,6 @@ * #define VGCF_IN_SYSCALL (1<<8) */ .macro SWITCH_TO_USER flag - movl $0,%gs:pda_kernel_mode # change to user mode subq $8*4,%rsp # reuse rip, cs, rflags, rsp, ss in the stack movq %rax,(%rsp) movq %r11,1*8(%rsp) @@ -139,7 +138,6 @@ .endm .macro SWITCH_TO_KERNEL ssoff,adjust=0 - btsq $0,%gs:pda_kernel_mode jc 1f orb $1,\ssoff-\adjust+4(%rsp) 1: diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/process.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/process.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/process.c Mon Aug 15 18:32:29 2005 @@ -148,7 +148,6 @@ if (cpu_is_offline(cpu)) play_dead(); - __IRQ_STAT(cpu,idle_timestamp) = jiffies; xen_idle(); } diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Mon Aug 15 18:32:29 2005 @@ -40,7 +40,6 @@ #include <linux/acpi.h> #include <linux/kallsyms.h> #include <linux/edd.h> -#include <linux/percpu.h> #include <asm/mtrr.h> #include <asm/uaccess.h> #include <asm/system.h> @@ -58,27 +57,36 @@ #include <asm/setup.h> #include <asm/mach_apic.h> #include <asm/numa.h> +#ifdef CONFIG_XEN +#include <linux/percpu.h> #include <asm-xen/xen-public/physdev.h> #include "setup_arch_pre.h" #include <asm-xen/hypervisor.h> - #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_PHYS(x) ((x) << PAGE_SHIFT) - +#define end_pfn_map end_pfn #include <asm/mach-xen/setup_arch_post.h> extern unsigned long start_pfn; - -#if 0 -struct edid_info { - unsigned char dummy[128]; -}; -#endif - extern struct edid_info edid_info; + +shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; +EXPORT_SYMBOL(HYPERVISOR_shared_info); /* Allows setting of maximum possible memory size */ unsigned long xen_override_max_pfn; + +u32 *phys_to_machine_mapping, *pfn_to_mfn_frame_list; + +EXPORT_SYMBOL(phys_to_machine_mapping); + +DEFINE_PER_CPU(multicall_entry_t, multicall_list[8]); +DEFINE_PER_CPU(int, nr_multicall_ents); + +/* Raw start-of-day parameters from the hypervisor. */ +union xen_start_info_union xen_start_info_union; +#endif + /* * Machine setup.. */ @@ -166,7 +174,7 @@ #define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM) -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) static struct resource system_rom_resource = { .name = "System ROM", .start = 0xf0000, @@ -200,7 +208,7 @@ #define ADAPTER_ROM_RESOURCES \ (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0]) -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) static struct resource video_rom_resource = { .name = "Video ROM", .start = 0xc0000, @@ -216,7 +224,7 @@ .flags = IORESOURCE_RAM, }; -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) #define romsignature(x) (*(unsigned short *)(x) == 0xaa55) static int __init romchecksum(unsigned char *rom, unsigned long length) @@ -294,33 +302,24 @@ } #endif -/* - * Point at the empty zero page to start with. We map the real shared_info - * page as soon as fixmap is up and running. - */ -shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; -EXPORT_SYMBOL(HYPERVISOR_shared_info); - -u32 *phys_to_machine_mapping, *pfn_to_mfn_frame_list; - -EXPORT_SYMBOL(phys_to_machine_mapping); - -DEFINE_PER_CPU(multicall_entry_t, multicall_list[8]); -DEFINE_PER_CPU(int, nr_multicall_ents); - -/* Raw start-of-day parameters from the hypervisor. */ -union xen_start_info_union xen_start_info_union; static __init void parse_cmdline_early (char ** cmdline_p) { char c = ' ', *to = command_line, *from = COMMAND_LINE; - int len = 0, max_cmdline; - + int len = 0; + + /* Save unparsed command line copy for /proc/cmdline */ +#ifdef CONFIG_XEN + int max_cmdline; + if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE) max_cmdline = COMMAND_LINE_SIZE; memcpy(saved_command_line, xen_start_info.cmd_line, max_cmdline); - /* Save unparsed command line copy for /proc/cmdline */ saved_command_line[max_cmdline-1] = '\0'; +#else + memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE); + saved_command_line[COMMAND_LINE_SIZE-1] = '\0'; +#endif for (;;) { if (c != ' ') @@ -378,8 +377,7 @@ acpi_skip_timer_override = 1; #endif #endif - -#if 0 +#ifndef CONFIG_XEN if (!memcmp(from, "nolapic", 7) || !memcmp(from, "disableapic", 11)) disable_apic = 1; @@ -391,8 +389,7 @@ skip_ioapic_setup = 0; ioapic_force = 1; } -#endif - +#endif if (!memcmp(from, "mem=", 4)) parse_memopt(from+4, &from); @@ -426,14 +423,10 @@ } #ifndef CONFIG_DISCONTIGMEM +#ifdef CONFIG_XEN static void __init contig_initmem_init(void) { unsigned long bootmap_size, bootmap; - - /* - * partially used pages are not usable - thus - * we are rounding upwards: - */ bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; bootmap = start_pfn; @@ -441,19 +434,22 @@ reserve_bootmem(bootmap, bootmap_size); free_bootmem(start_pfn << PAGE_SHIFT, (end_pfn - start_pfn) << PAGE_SHIFT); - printk("Registering memory for bootmem: from %lx, size = %lx\n", - start_pfn << PAGE_SHIFT, (end_pfn - start_pfn) << PAGE_SHIFT); - /* - * This should cover kernel_end - */ -#if 0 - reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) + - bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY)); -#endif reserve_bootmem(0, (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1)); - +} +#else +static void __init contig_initmem_init(void) +{ + unsigned long bootmap_size, bootmap; + bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; + bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size); + if (bootmap == -1L) + panic("Cannot find bootmem map of size %ld\n",bootmap_size); + bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn); + e820_bootmem_free(&contig_page_data, 0, end_pfn << PAGE_SHIFT); + reserve_bootmem(bootmap, bootmap_size); } +#endif /* !CONFIG_XEN */ #endif /* Use inline assembly to define this because the nops are defined @@ -545,35 +541,8 @@ } #endif -#if 0 -#define EBDA_ADDR_POINTER 0x40E -static void __init reserve_ebda_region(void) -{ - unsigned int addr; - /** - * there is a real-mode segmented pointer pointing to the - * 4K EBDA area at 0x40E - */ - addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER); - addr <<= 4; - if (addr) - reserve_bootmem_generic(addr, PAGE_SIZE); -} -#endif - -/* - * Guest physical starts from 0. - */ - -unsigned long __init xen_end_of_ram(void) -{ - unsigned long max_end_pfn = xen_start_info.nr_pages; - - if ( xen_override_max_pfn < max_end_pfn) - xen_override_max_pfn = max_end_pfn; - - return xen_override_max_pfn; -} +#ifdef CONFIG_XEN +#define reserve_ebda_region() void(0) static void __init print_memory_map(char *who) { @@ -601,7 +570,6 @@ } } -#ifdef CONFIG_XEN void __init smp_alloc_memory(void) { int cpu; @@ -612,37 +580,35 @@ /* XXX free unused pages later */ } } + + +#else +#define EBDA_ADDR_POINTER 0x40E +static void __init reserve_ebda_region(void) +{ + unsigned int addr; + /** + * there is a real-mode segmented pointer pointing to the + * 4K EBDA area at 0x40E + */ + addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER); + addr <<= 4; + if (addr) + reserve_bootmem_generic(addr, PAGE_SIZE); +} #endif void __init setup_arch(char **cmdline_p) { - int i, j; - physdev_op_t op; - -#if 0 - ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); -#else + unsigned long kernel_end; + +#ifdef CONFIG_XEN ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); -#endif drive_info = DRIVE_INFO; - + kernel_end = 0; /* dummy */ #ifdef CONFIG_XEN_PHYSDEV_ACCESS screen_info = SCREEN_INFO; -#endif - edid_info = EDID_INFO; - saved_video_mode = SAVED_VIDEO_MODE; - bootloader_type = LOADER_TYPE; - -#ifdef CONFIG_BLK_DEV_RAM - rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; - rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); - rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); -#endif - - HYPERVISOR_vm_assist(VMASST_CMD_enable, - VMASST_TYPE_writable_pagetables); - -#ifdef CONFIG_XEN_PHYSDEV_ACCESS + /* This is drawn from a dump from vgacon:startup in standard Linux. */ screen_info.orig_video_mode = 3; screen_info.orig_video_isVGA = 1; @@ -650,27 +616,57 @@ screen_info.orig_video_cols = 80; screen_info.orig_video_ega_bx = 3; screen_info.orig_video_points = 16; -#endif +#endif + edid_info = EDID_INFO; + saved_video_mode = SAVED_VIDEO_MODE; + bootloader_type = LOADER_TYPE; + +#ifdef CONFIG_BLK_DEV_RAM + rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; + rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); + rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); + + +#endif + + HYPERVISOR_vm_assist(VMASST_CMD_enable, + VMASST_TYPE_writable_pagetables); + ARCH_SETUP print_memory_map(machine_specific_memory_setup()); - - /* copy_edd(); */ +#else + ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV); + drive_info = DRIVE_INFO; + screen_info = SCREEN_INFO; + edid_info = EDID_INFO; + saved_video_mode = SAVED_VIDEO_MODE; + bootloader_type = LOADER_TYPE; + +#ifdef CONFIG_BLK_DEV_RAM + rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK; + rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); + rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); +#endif + setup_memory_region(); + copy_edd(); +#endif /* !CONFIG_XEN */ if (!MOUNT_ROOT_RDONLY) root_mountflags &= ~MS_RDONLY; init_mm.start_code = (unsigned long) &_text; init_mm.end_code = (unsigned long) &_etext; init_mm.end_data = (unsigned long) &_edata; -/* init_mm.brk = (unsigned long) &_end; */ +#ifdef CONFIG_XEN init_mm.brk = start_pfn << PAGE_SHIFT; - - -#if 0 /* XEN: This is nonsense: kernel may not even be contiguous in RAM. */ +#else + init_mm.brk = (unsigned long) &_end; + code_resource.start = virt_to_phys(&_text); code_resource.end = virt_to_phys(&_etext)-1; data_resource.start = virt_to_phys(&_etext); data_resource.end = virt_to_phys(&_edata)-1; #endif + parse_cmdline_early(cmdline_p); early_identify_cpu(&boot_cpu_data); @@ -679,15 +675,11 @@ * partially used pages are not usable - thus * we are rounding upwards: */ -#if 0 end_pfn = e820_end_of_ram(); -#else - end_pfn = xen_end_of_ram(); -#endif check_efer(); - init_memory_mapping(0, (end_pfn << PAGE_SHIFT)); + init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT)); #ifdef CONFIG_ACPI_NUMA /* @@ -702,24 +694,25 @@ contig_initmem_init(); #endif - /* Reserve direct mapping and shared info etc. */ -// reserve_bootmem_generic(table_start << PAGE_SHIFT, (table_end + 1 - table_start) << PAGE_SHIFT); - -// reserve_bootmem_generic(0, (table_end + 1) << PAGE_SHIFT); +#ifndef CONFIG_XEN + /* Reserve direct mapping */ + reserve_bootmem_generic(table_start << PAGE_SHIFT, + (table_end - table_start) << PAGE_SHIFT); /* reserve kernel */ -// kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE); - -#if 0 + kernel_end = round_up(__pa_symbol(&_end),PAGE_SIZE); + reserve_bootmem_generic(HIGH_MEMORY, kernel_end - HIGH_MEMORY); + /* * reserve physical page 0 - it's a special BIOS page on many boxes, * enabling clean reboots, SMP operation, laptop functions. */ reserve_bootmem_generic(0, PAGE_SIZE); -#endif /* reserve ebda region */ -/* reserve_ebda_region(); */ + reserve_ebda_region(); +#endif + #ifdef CONFIG_SMP /* @@ -739,6 +732,7 @@ */ acpi_reserve_bootmem(); #endif +#ifdef CONFIG_XEN #ifdef CONFIG_BLK_DEV_INITRD if (xen_start_info.mod_start) { if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) { @@ -756,10 +750,27 @@ } #endif #ifdef CONFIG_SMP -#ifdef CONFIG_XEN smp_alloc_memory(); #endif -#endif +#else /* CONFIG_XEN */ +#ifdef CONFIG_BLK_DEV_INITRD + if (LOADER_TYPE && INITRD_START) { + if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) { + reserve_bootmem_generic(INITRD_START, INITRD_SIZE); + initrd_start = + INITRD_START ? INITRD_START + PAGE_OFFSET : 0; + initrd_end = initrd_start+INITRD_SIZE; + } + else { + printk(KERN_ERR "initrd extends beyond end of memory " + "(0x%08lx > 0x%08lx)\ndisabling initrd\n", + (unsigned long)(INITRD_START + INITRD_SIZE), + (unsigned long)(end_pfn << PAGE_SHIFT)); + initrd_start = 0; + } + } +#endif +#endif /* !CONFIG_XEN */ paging_init(); #ifdef CONFIG_X86_LOCAL_APIC /* @@ -767,30 +778,36 @@ */ find_smp_config(); #endif - /* Make sure we have a large enough P->M table. */ - if (end_pfn > xen_start_info.nr_pages) { - phys_to_machine_mapping = alloc_bootmem( - max_pfn * sizeof(unsigned long)); - memset(phys_to_machine_mapping, ~0, - max_pfn * sizeof(unsigned long)); - memcpy(phys_to_machine_mapping, - (unsigned long *)xen_start_info.mfn_list, - xen_start_info.nr_pages * sizeof(unsigned long)); - free_bootmem( - __pa(xen_start_info.mfn_list), - PFN_PHYS(PFN_UP(xen_start_info.nr_pages * - sizeof(unsigned long)))); - } - - pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); - - for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) - { - pfn_to_mfn_frame_list[j] = - virt_to_machine(&phys_to_machine_mapping[i]) >> PAGE_SHIFT; - } - -#if 0 +#ifdef CONFIG_XEN + { + int i, j; + /* Make sure we have a large enough P->M table. */ + if (end_pfn > xen_start_info.nr_pages) { + phys_to_machine_mapping = alloc_bootmem( + max_pfn * sizeof(unsigned long)); + memset(phys_to_machine_mapping, ~0, + max_pfn * sizeof(unsigned long)); + memcpy(phys_to_machine_mapping, + (unsigned long *)xen_start_info.mfn_list, + xen_start_info.nr_pages * sizeof(unsigned long)); + free_bootmem( + __pa(xen_start_info.mfn_list), + PFN_PHYS(PFN_UP(xen_start_info.nr_pages * + sizeof(unsigned long)))); + } + + pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); + + for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) + { + pfn_to_mfn_frame_list[j] = + virt_to_machine(&phys_to_machine_mapping[i]) >> PAGE_SHIFT; + } + + } +#endif + +#ifndef CONFIG_XEN check_ioapic(); #endif @@ -806,6 +823,7 @@ */ acpi_boot_init(); #endif + #ifdef CONFIG_X86_LOCAL_APIC /* * get boot-time SMP configuration: @@ -817,18 +835,14 @@ #endif #endif - /* XXX Disable irqdebug until we have a way to avoid interrupt - * conflicts. */ -/* noirqdebug_setup(""); */ - -#ifdef CONFIG_XEN_PRIVILEGED_GUEST +#if defined(CONFIG_XEN_PRIVILEGED_GUEST) || !defined(CONFIG_XEN) /* * Request address space for all standard RAM and ROM resources * and also for regions reported as reserved by the e820. */ probe_roms(); -#endif -/* e820_reserve_resources(); */ + e820_reserve_resources(); +#endif request_resource(&iomem_resource, &video_ram_resource); @@ -845,14 +859,40 @@ iommu_hole_init(); #endif - op.cmd = PHYSDEVOP_SET_IOPL; - op.u.set_iopl.iopl = 1; - HYPERVISOR_physdev_op(&op); - - if (xen_start_info.flags & SIF_INITDOMAIN) { - if (!(xen_start_info.flags & SIF_PRIVILEGED)) - panic("Xen granted us console access " - "but not privileged status"); +#ifdef CONFIG_XEN + { + physdev_op_t op; + + op.cmd = PHYSDEVOP_SET_IOPL; + op.u.set_iopl.iopl = 1; + HYPERVISOR_physdev_op(&op); + + if (xen_start_info.flags & SIF_INITDOMAIN) { + if (!(xen_start_info.flags & SIF_PRIVILEGED)) + panic("Xen granted us console access " + "but not privileged status"); + +#ifdef CONFIG_VT +#if defined(CONFIG_VGA_CONSOLE) + conswitchp = &vga_con; +#elif defined(CONFIG_DUMMY_CONSOLE) + conswitchp = &dummy_con; +#endif +#endif + } else { +#ifdef CONFIG_XEN_PRIVILEGED_GUEST + extern const struct consw xennull_con; + extern int console_use_vt; +#if defined(CONFIG_VGA_CONSOLE) + /* disable VGA driver */ + ORIG_VIDEO_ISVGA = VIDEO_TYPE_VLFB; +#endif + conswitchp = &xennull_con; + console_use_vt = 0; +#endif + } + } +#else /* CONFIG_XEN */ #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) @@ -861,18 +901,8 @@ conswitchp = &dummy_con; #endif #endif - } else { -#ifdef CONFIG_XEN_PRIVILEGED_GUEST - extern const struct consw xennull_con; - extern int console_use_vt; -#if defined(CONFIG_VGA_CONSOLE) - /* disable VGA driver */ - ORIG_VIDEO_ISVGA = VIDEO_TYPE_VLFB; -#endif - conswitchp = &xennull_con; - console_use_vt = 0; -#endif - } + +#endif /* !CONFIG_XEN */ } static int __init get_model_name(struct cpuinfo_x86 *c) diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Mon Aug 15 18:32:29 2005 @@ -557,8 +557,6 @@ void __init xen_init_pt(void) { - pgd_t *old_level4 = (pgd_t *)xen_start_info.pt_base; - memcpy((void *)init_level4_pgt, (void *)xen_start_info.pt_base, PAGE_SIZE); diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/ioremap.c Mon Aug 15 18:32:29 2005 @@ -464,3 +464,34 @@ } EXPORT_SYMBOL(direct_remap_area_pages); + +int create_lookup_pte_addr(struct mm_struct *mm, + unsigned long address, + unsigned long *ptep) +{ + int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + { + unsigned long *ptep = (unsigned long *)data; + if (ptep) *ptep = (pfn_to_mfn(page_to_pfn(pte_page)) << PAGE_SHIFT) + | ((unsigned long)pte & ~PAGE_MASK); + return 0; + } + + return generic_page_range(mm, address, PAGE_SIZE, f, ptep); +} + +EXPORT_SYMBOL(create_lookup_pte_addr); + +int touch_pte_range(struct mm_struct *mm, + unsigned long address, + unsigned long size) +{ + int f(pte_t *pte, struct page *pte_page, unsigned long addr, void *data) + { + return 0; + } + + return generic_page_range(mm, address, size, f, NULL); +} + +EXPORT_SYMBOL(touch_pte_range); diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Mon Aug 15 18:32:29 2005 @@ -211,11 +211,11 @@ /* Link back into the page tables if it's not a highmem page. */ if ( pfn < max_low_pfn ) { - HYPERVISOR_update_va_mapping( + BUG_ON(HYPERVISOR_update_va_mapping( (unsigned long)__va(pfn << PAGE_SHIFT), __pte_ma((mfn_list[i] << PAGE_SHIFT) | pgprot_val(PAGE_KERNEL)), - 0); + 0)); } /* Finally, relinquish the memory back to the system allocator. */ @@ -249,8 +249,8 @@ { v = phys_to_virt(pfn << PAGE_SHIFT); scrub_pages(v, 1); - HYPERVISOR_update_va_mapping( - (unsigned long)v, __pte_ma(0), 0); + BUG_ON(HYPERVISOR_update_va_mapping( + (unsigned long)v, __pte_ma(0), 0)); } #ifdef CONFIG_XEN_SCRUB_PAGES else diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Mon Aug 15 18:32:29 2005 @@ -120,10 +120,10 @@ { if ( BLKBACK_INVALID_HANDLE != ( handle = pending_handle(idx, i) ) ) { - unmap[i].host_virt_addr = MMAP_VADDR(idx, i); + unmap[i].host_addr = MMAP_VADDR(idx, i); unmap[i].dev_bus_addr = 0; unmap[i].handle = handle; - pending_handle(idx, i) = BLKBACK_INVALID_HANDLE; + pending_handle(idx, i) = BLKBACK_INVALID_HANDLE; invcount++; } } @@ -383,7 +383,7 @@ { struct gnttab_map_grant_ref map; - map.host_virt_addr = MMAP_VADDR(pending_idx, 0); + map.host_addr = MMAP_VADDR(pending_idx, 0); map.flags = GNTMAP_host_map; map.ref = blkif_gref_from_fas(req->frame_and_sects[0]); map.dom = blkif->domid; @@ -480,7 +480,7 @@ goto bad_descriptor; preq.nr_sects += seg[i].nsec; - map[i].host_virt_addr = MMAP_VADDR(pending_idx, i); + map[i].host_addr = MMAP_VADDR(pending_idx, i); map[i].dom = blkif->domid; map[i].ref = blkif_gref_from_fas(fas); map[i].flags = GNTMAP_host_map; diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/blkback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/interface.c Mon Aug 15 18:32:29 2005 @@ -42,7 +42,7 @@ * must still be notified to the remote driver. */ #ifdef CONFIG_XEN_BLKDEV_GRANT - op.host_virt_addr = blkif->shmem_vaddr; + op.host_addr = blkif->shmem_vaddr; op.handle = blkif->shmem_handle; op.dev_bus_addr = 0; BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); @@ -204,7 +204,7 @@ #else { /* Map: Use the Grant table reference */ struct gnttab_map_grant_ref op; - op.host_virt_addr = VMALLOC_VMADDR(vma->addr); + op.host_addr = VMALLOC_VMADDR(vma->addr); op.flags = GNTMAP_host_map; op.ref = ref; op.dom = domid; diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/netback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Mon Aug 15 18:32:29 2005 @@ -20,6 +20,13 @@ #include <asm/io.h> #include <asm/pgalloc.h> +#if defined(CONFIG_XEN_NETDEV_GRANT_TX) || defined(CONFIG_XEN_NETDEV_GRANT_RX) +#include <asm-xen/xen-public/grant_table.h> +#include <asm-xen/gnttab.h> +#endif + + + #if 0 #define ASSERT(_p) \ if ( !(_p) ) { printk("Assertion '%s' failed, line %d, file %s", #_p , \ @@ -40,7 +47,17 @@ /* Physical parameters of the comms window. */ unsigned long tx_shmem_frame; +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + u16 tx_shmem_handle; + memory_t tx_shmem_vaddr; + grant_ref_t tx_shmem_ref; +#endif unsigned long rx_shmem_frame; +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + u16 rx_shmem_handle; + memory_t rx_shmem_vaddr; + grant_ref_t rx_shmem_ref; +#endif unsigned int evtchn; /* The shared rings and indexes. */ diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Mon Aug 15 18:32:29 2005 @@ -71,12 +71,31 @@ netif_t *netif = (netif_t *)arg; ctrl_msg_t cmsg; netif_be_disconnect_t disc; +#if defined(CONFIG_XEN_NETDEV_GRANT_RX) || defined(CONFIG_XEN_NETDEV_GRANT_TX) + struct gnttab_unmap_grant_ref op; +#endif /* * These can't be done in netif_disconnect() because at that point there * may be outstanding requests in the network stack whose asynchronous * responses must still be notified to the remote driver. */ + +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + op.host_addr = netif->tx_shmem_vaddr; + op.handle = netif->tx_shmem_handle; + op.dev_bus_addr = 0; + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); +#endif + +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + op.host_addr = netif->rx_shmem_vaddr; + op.handle = netif->rx_shmem_handle; + op.dev_bus_addr = 0; + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); +#endif + + vfree(netif->tx); /* Frees netif->rx as well. */ /* Construct the deferred response message. */ @@ -275,40 +294,61 @@ unsigned long tx_shmem_frame = connect->tx_shmem_frame; unsigned long rx_shmem_frame = connect->rx_shmem_frame; struct vm_struct *vma; - pgprot_t prot; +#if !defined(CONFIG_XEN_NETDEV_GRANT_TX)||!defined(CONFIG_XEN_NETDEV_GRANT_RX) + pgprot_t prot = __pgprot(_KERNPG_TABLE); int error; +#endif netif_t *netif; netif = netif_find_by_handle(domid, handle); - if ( unlikely(netif == NULL) ) - { + if ( unlikely(netif == NULL) ) { DPRINTK("netif_connect attempted for non-existent netif (%u,%u)\n", connect->domid, connect->netif_handle); connect->status = NETIF_BE_STATUS_INTERFACE_NOT_FOUND; return; } - if ( netif->status != DISCONNECTED ) - { + if ( netif->status != DISCONNECTED ) { connect->status = NETIF_BE_STATUS_INTERFACE_CONNECTED; return; } - if ( (vma = get_vm_area(2*PAGE_SIZE, VM_IOREMAP)) == NULL ) - { + if ( (vma = get_vm_area(2*PAGE_SIZE, VM_IOREMAP)) == NULL ) { connect->status = NETIF_BE_STATUS_OUT_OF_MEMORY; return; } - prot = __pgprot(_KERNPG_TABLE); - error = direct_remap_area_pages(&init_mm, - VMALLOC_VMADDR(vma->addr), - tx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, - prot, domid); - error |= direct_remap_area_pages(&init_mm, - VMALLOC_VMADDR(vma->addr) + PAGE_SIZE, - rx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, - prot, domid); + +#if defined(CONFIG_XEN_NETDEV_GRANT_TX) + { + struct gnttab_map_grant_ref op; + int tx_ref = connect->tx_shmem_ref; + + /* Map: Use the Grant table reference */ + op.host_addr = VMALLOC_VMADDR(vma->addr); + op.flags = GNTMAP_host_map; + op.ref = tx_ref; + op.dom = domid; + + if ((HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) < 0) || + (op.handle < 0)) { + DPRINTK(" Grant table operation failure !\n"); + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + vfree(vma->addr); + return; + } + + netif->tx_shmem_ref = tx_ref; + netif->tx_shmem_handle = op.handle; + netif->tx_shmem_vaddr = VMALLOC_VMADDR(vma->addr); + } + + +#else + error = direct_remap_area_pages(&init_mm, + VMALLOC_VMADDR(vma->addr), + tx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, + prot, domid); if ( error != 0 ) { if ( error == -ENOMEM ) @@ -320,6 +360,51 @@ vfree(vma->addr); return; } +#endif + + +#if defined(CONFIG_XEN_NETDEV_GRANT_RX) + { + struct gnttab_map_grant_ref op; + int rx_ref = connect->rx_shmem_ref; + + + /* Map: Use the Grant table reference */ + op.host_addr = VMALLOC_VMADDR(vma->addr) + PAGE_SIZE; + op.flags = GNTMAP_host_map; + op.ref = rx_ref; + op.dom = domid; + + if ((HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) < 0) || + (op.handle < 0)) { + DPRINTK(" Grant table operation failure !\n"); + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + vfree(vma->addr); + return; + } + + netif->rx_shmem_ref = rx_ref; + netif->rx_shmem_handle = handle; + netif->rx_shmem_vaddr = VMALLOC_VMADDR(vma->addr) + PAGE_SIZE; + } +#else + error = direct_remap_area_pages(&init_mm, + VMALLOC_VMADDR(vma->addr) + PAGE_SIZE, + rx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, + prot, domid); + if ( error != 0 ) + { + if ( error == -ENOMEM ) + connect->status = NETIF_BE_STATUS_OUT_OF_MEMORY; + else if ( error == -EFAULT ) + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + else + connect->status = NETIF_BE_STATUS_ERROR; + vfree(vma->addr); + return; + } + +#endif netif->evtchn = evtchn; netif->tx_shmem_frame = tx_shmem_frame; diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Aug 15 18:32:29 2005 @@ -55,10 +55,14 @@ static struct timer_list net_timer; +#define MAX_PENDING_REQS 256 + static struct sk_buff_head rx_queue; static multicall_entry_t rx_mcl[NETIF_RX_RING_SIZE*2+1]; static mmu_update_t rx_mmu[NETIF_RX_RING_SIZE]; -#ifndef CONFIG_XEN_NETDEV_GRANT_RX +#ifdef CONFIG_XEN_NETDEV_GRANT_RX +static gnttab_donate_t grant_rx_op[MAX_PENDING_REQS]; +#else static struct mmuext_op rx_mmuext[NETIF_RX_RING_SIZE]; #endif static unsigned char rx_notify[NR_EVENT_CHANNELS]; @@ -66,7 +70,6 @@ /* Don't currently gate addition of an interface to the tx scheduling list. */ #define tx_work_exists(_if) (1) -#define MAX_PENDING_REQS 256 static unsigned long mmap_vstart; #define MMAP_VADDR(_req) (mmap_vstart + ((_req) * PAGE_SIZE)) @@ -90,11 +93,9 @@ #ifdef CONFIG_XEN_NETDEV_GRANT_TX static u16 grant_tx_ref[MAX_PENDING_REQS]; -#endif -#ifdef CONFIG_XEN_NETDEV_GRANT_RX -static gnttab_donate_t grant_rx_op[MAX_PENDING_REQS]; -#endif -#ifndef CONFIG_XEN_NETDEV_GRANT_TX +static gnttab_unmap_grant_ref_t tx_unmap_ops[MAX_PENDING_REQS]; +static gnttab_map_grant_ref_t tx_map_ops[MAX_PENDING_REQS]; +#else static multicall_entry_t tx_mcl[MAX_PENDING_REQS]; #endif @@ -492,7 +493,6 @@ inline static void net_tx_action_dealloc(void) { #ifdef CONFIG_XEN_NETDEV_GRANT_TX - gnttab_unmap_grant_ref_t unmap_ops[MAX_PENDING_REQS]; gnttab_unmap_grant_ref_t *gop; #else multicall_entry_t *mcl; @@ -508,19 +508,18 @@ /* * Free up any grants we have finished using */ - gop = unmap_ops; - while (dc != dp) { + gop = tx_unmap_ops; + while ( dc != dp ) + { pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)]; - gop->host_virt_addr = MMAP_VADDR(pending_idx); + gop->host_addr = MMAP_VADDR(pending_idx); gop->dev_bus_addr = 0; - gop->handle = grant_tx_ref[pending_idx]; + gop->handle = grant_tx_ref[pending_idx]; grant_tx_ref[pending_idx] = GRANT_INVALID_REF; gop++; } - if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, - unmap_ops, gop - unmap_ops))) { - BUG(); - } + BUG_ON(HYPERVISOR_grant_table_op( + GNTTABOP_unmap_grant_ref, tx_unmap_ops, gop - tx_unmap_ops)); #else mcl = tx_mcl; while ( dc != dp ) @@ -583,7 +582,6 @@ u16 pending_idx; NETIF_RING_IDX i; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - gnttab_map_grant_ref_t map_ops[MAX_PENDING_REQS]; gnttab_map_grant_ref_t *mop; #else multicall_entry_t *mcl; @@ -594,7 +592,7 @@ net_tx_action_dealloc(); #ifdef CONFIG_XEN_NETDEV_GRANT_TX - mop = map_ops; + mop = tx_map_ops; #else mcl = tx_mcl; #endif @@ -699,10 +697,10 @@ /* Packets passed to netif_rx() must have some headroom. */ skb_reserve(skb, 16); #ifdef CONFIG_XEN_NETDEV_GRANT_TX - mop->host_virt_addr = MMAP_VADDR(pending_idx); - mop->dom = netif->domid; - mop->ref = txreq.addr >> PAGE_SHIFT; - mop->flags = GNTMAP_host_map | GNTMAP_readonly; + mop->host_addr = MMAP_VADDR(pending_idx); + mop->dom = netif->domid; + mop->ref = txreq.addr >> PAGE_SHIFT; + mop->flags = GNTMAP_host_map | GNTMAP_readonly; mop++; #else MULTI_update_va_mapping_otherdomain( @@ -722,7 +720,7 @@ pending_cons++; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if ((mop - map_ops) >= ARRAY_SIZE(map_ops)) + if ( (mop - tx_map_ops) >= ARRAY_SIZE(tx_map_ops) ) break; #else /* Filled the batch queue? */ @@ -732,20 +730,18 @@ } #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (mop == map_ops) { + if ( mop == tx_map_ops ) return; - } - if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, - map_ops, mop - map_ops))) { - BUG(); - } - mop = map_ops; + + BUG_ON(HYPERVISOR_grant_table_op( + GNTTABOP_map_grant_ref, tx_map_ops, mop - tx_map_ops)); + + mop = tx_map_ops; #else if ( mcl == tx_mcl ) return; - if ( unlikely(HYPERVISOR_multicall(tx_mcl, mcl - tx_mcl) != 0) ) - BUG(); + BUG_ON(HYPERVISOR_multicall(tx_mcl, mcl - tx_mcl) != 0); mcl = tx_mcl; #endif @@ -757,7 +753,13 @@ /* Check the remap error code. */ #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (unlikely(mop->dev_bus_addr == 0)) { + /* + XXX SMH: error returns from grant operations are pretty poorly + specified/thought out, but the below at least conforms with + what the rest of the code uses. + */ + if ( unlikely(mop->handle < 0) ) + { printk(KERN_ALERT "#### netback grant fails\n"); make_tx_response(netif, txreq.id, NETIF_RSP_ERROR); netif_put(netif); diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Aug 15 18:32:29 2005 @@ -59,7 +59,7 @@ #include <asm-xen/gnttab.h> #ifdef GRANT_DEBUG static void -dump_packet(int tag, u32 addr, u32 ap) +dump_packet(int tag, void *addr, u32 ap) { unsigned char *p = (unsigned char *)ap; int i; @@ -200,7 +200,7 @@ [BEST_CONNECTED] = "connected", }; -#if DEBUG +#ifdef DEBUG #define DPRINTK(fmt, args...) \ printk(KERN_ALERT "xen_net (%s:%d) " fmt, __FUNCTION__, __LINE__, ##args) #else @@ -356,8 +356,12 @@ id = np->tx->ring[MASK_NETIF_TX_IDX(i)].resp.id; skb = np->tx_skbs[id]; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (gnttab_query_foreign_access(grant_tx_ref[id]) != 0) { - printk(KERN_ALERT "netfront: query foreign access\n"); + if (unlikely(gnttab_query_foreign_access(grant_tx_ref[id]) != 0)) { + /* other domain is still using this grant - shouldn't happen + but if it does, we'll try to reclaim the grant later */ + printk(KERN_ALERT "network_tx_buf_gc: warning -- grant " + "still in use by backend domain.\n"); + goto out; } gnttab_end_foreign_access(grant_tx_ref[id], GNTMAP_readonly); gnttab_release_grant_reference(&gref_tx_head, grant_tx_ref[id]); @@ -382,6 +386,10 @@ mb(); } while (prod != np->tx->resp_prod); +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + out: +#endif + if (np->tx_full && ((np->tx->req_prod - prod) < NETIF_TX_RING_SIZE)) { np->tx_full = 0; if (np->user_state == UST_OPEN) @@ -433,13 +441,15 @@ np->rx->ring[MASK_NETIF_RX_IDX(req_prod + i)].req.id = id; #ifdef CONFIG_XEN_NETDEV_GRANT_RX - if ((ref = gnttab_claim_grant_reference(&gref_rx_head, gref_rx_terminal)) < 0) { + if (unlikely((ref = gnttab_claim_grant_reference(&gref_rx_head, + gref_rx_terminal)) < 0)) { printk(KERN_ALERT "#### netfront can't claim rx reference\n"); BUG(); } grant_rx_ref[id] = ref; gnttab_grant_foreign_transfer_ref(ref, rdomid, - virt_to_machine(skb->head) >> PAGE_SHIFT); + virt_to_machine( + skb->head) >> PAGE_SHIFT); np->rx->ring[MASK_NETIF_RX_IDX(req_prod + i)].req.gref = ref; #endif rx_pfn_array[i] = virt_to_machine(skb->head) >> PAGE_SHIFT; @@ -528,7 +538,8 @@ tx->id = id; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if ((ref = gnttab_claim_grant_reference(&gref_tx_head, gref_tx_terminal)) < 0) { + if (unlikely((ref = gnttab_claim_grant_reference(&gref_tx_head, + gref_tx_terminal)) < 0)) { printk(KERN_ALERT "#### netfront can't claim tx grant reference\n"); BUG(); } @@ -638,7 +649,6 @@ #ifdef CONFIG_XEN_NETDEV_GRANT_RX ref = grant_rx_ref[rx->id]; grant_rx_ref[rx->id] = GRANT_INVALID_REF; - mfn = gnttab_end_foreign_transfer(ref); gnttab_release_grant_reference(&gref_rx_head, ref); #endif @@ -674,18 +684,20 @@ pfn_pte_ma(mfn, PAGE_KERNEL), 0); #else MULTI_update_va_mapping(mcl, (unsigned long)skb->head, - pfn_pte_ma(rx->addr >> PAGE_SHIFT, PAGE_KERNEL), 0); + pfn_pte_ma(rx->addr >> PAGE_SHIFT, + PAGE_KERNEL), 0); #endif mcl++; +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] = mfn; +#else phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] = -#ifdef CONFIG_XEN_NETDEV_GRANT_RX - mfn; -#else rx->addr >> PAGE_SHIFT; #endif + #ifdef GRANT_DEBUG - printk(KERN_ALERT "#### rx_poll enqueue vdata=%08x mfn=%08x ref=%04x\n", + printk(KERN_ALERT "#### rx_poll enqueue vdata=%p mfn=%lu ref=%x\n", skb->data, mfn, ref); #endif __skb_queue_tail(&rxq, skb); @@ -707,9 +719,9 @@ while ((skb = __skb_dequeue(&rxq)) != NULL) { #ifdef GRANT_DEBUG - printk(KERN_ALERT "#### rx_poll dequeue vdata=%08x mfn=%08x\n", - skb->data, virt_to_machine(skb->data)>>PAGE_SHIFT); - dump_packet('d', skb->data, (unsigned long)skb->data); + printk(KERN_ALERT "#### rx_poll dequeue vdata=%p mfn=%lu\n", + skb->data, virt_to_machine(skb->data)>>PAGE_SHIFT); + dump_packet('d', skb->data, (unsigned long)skb->data); #endif /* * Enough room in skbuff for the data we were passed? Also, Linux @@ -884,7 +896,7 @@ static void vif_show(struct net_private *np) { -#if DEBUG +#ifdef DEBUG if (np) { IPRINTK("<vif handle=%u %s(%s) evtchn=%u tx=%p rx=%p>\n", np->handle, @@ -911,8 +923,29 @@ msg->handle = np->handle; msg->tx_shmem_frame = (virt_to_machine(np->tx) >> PAGE_SHIFT); +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + msg->tx_shmem_ref = (u32)gnttab_claim_grant_reference(&gref_tx_head, + gref_tx_terminal); + if(msg->tx_shmem_ref < 0) { + printk(KERN_ALERT "#### netfront can't claim tx_shmem reference\n"); + BUG(); + } + gnttab_grant_foreign_access_ref (msg->tx_shmem_ref, rdomid, + msg->tx_shmem_frame, 0); +#endif + msg->rx_shmem_frame = (virt_to_machine(np->rx) >> PAGE_SHIFT); - +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + msg->rx_shmem_ref = (u32)gnttab_claim_grant_reference(&gref_rx_head, + gref_rx_terminal); + if(msg->rx_shmem_ref < 0) { + printk(KERN_ALERT "#### netfront can't claim rx_shmem reference\n"); + BUG(); + } + gnttab_grant_foreign_access_ref (msg->rx_shmem_ref, rdomid, + msg->rx_shmem_frame, 0); +#endif + ctrl_if_send_message_block(&cmsg, NULL, 0, TASK_UNINTERRUPTIBLE); } @@ -1380,20 +1413,22 @@ if (xen_start_info.flags & SIF_INITDOMAIN) return 0; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (gnttab_alloc_grant_references(NETIF_TX_RING_SIZE, + /* A grant for every ring slot, plus one for the ring itself */ + if (gnttab_alloc_grant_references(NETIF_TX_RING_SIZE + 1, &gref_tx_head, &gref_tx_terminal) < 0) { printk(KERN_ALERT "#### netfront can't alloc tx grant refs\n"); return 1; } - printk(KERN_ALERT "#### netfront tx using grant tables\n"); + printk(KERN_ALERT "Netdev frontend (TX) is using grant tables.\n"); #endif #ifdef CONFIG_XEN_NETDEV_GRANT_RX - if (gnttab_alloc_grant_references(NETIF_RX_RING_SIZE, + /* A grant for every ring slot, plus one for the ring itself */ + if (gnttab_alloc_grant_references(NETIF_RX_RING_SIZE + 1, &gref_rx_head, &gref_rx_terminal) < 0) { printk(KERN_ALERT "#### netfront can't alloc rx grant refs\n"); return 1; } - printk(KERN_ALERT "#### netfront rx using grant tables\n"); + printk(KERN_ALERT "Netdev frontend (RX) is using grant tables.\n"); #endif if ((err = xennet_proc_init()) != 0) @@ -1417,10 +1452,10 @@ static void netif_exit(void) { #ifdef CONFIG_XEN_NETDEV_GRANT_TX - gnttab_free_grant_references(NETIF_TX_RING_SIZE, gref_tx_head); + gnttab_free_grant_references(NETIF_TX_RING_SIZE + 1, gref_tx_head); #endif #ifdef CONFIG_XEN_NETDEV_GRANT_RX - gnttab_free_grant_references(NETIF_RX_RING_SIZE, gref_rx_head); + gnttab_free_grant_references(NETIF_RX_RING_SIZE + 1, gref_rx_head); #endif } diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c --- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Mon Aug 15 18:32:29 2005 @@ -139,7 +139,7 @@ privcmd_mmapbatch_t m; struct vm_area_struct *vma = NULL; unsigned long *p, addr; - unsigned long mfn; + unsigned long mfn, ptep; int i; if ( copy_from_user(&m, (void *)data, sizeof(m)) ) @@ -163,12 +163,12 @@ if ( get_user(mfn, p) ) return -EFAULT; + ret = create_lookup_pte_addr(vma->vm_mm, addr, &ptep); + if (ret) + goto batch_err; + u.val = (mfn << PAGE_SHIFT) | pgprot_val(vma->vm_page_prot); - - __direct_remap_area_pages(vma->vm_mm, - addr, - PAGE_SIZE, - &u); + u.ptr = ptep; if ( unlikely(HYPERVISOR_mmu_update(&u, 1, NULL, m.dom) < 0) ) put_user(0xF0000000 | mfn, p); diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypercall.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypercall.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/hypercall.h Mon Aug 15 18:32:29 2005 @@ -386,13 +386,6 @@ "4" (flags) : "memory" ); - if ( unlikely(ret < 0) ) - { - printk(KERN_ALERT "Failed update VA mapping: %08lx, %08lx, %08lx\n", - va, (new_val).pte_low, flags); - BUG(); - } - return ret; } diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/mmu_context.h Mon Aug 15 18:32:29 2005 @@ -34,10 +34,10 @@ * are always kernel segments while inside the kernel. Must * happen before reload of cr3/ldt (i.e., not in __switch_to). */ - __asm__ __volatile__ ( "mov %%fs,%0 ; mov %%gs,%1" + asm volatile ( "mov %%fs,%0 ; mov %%gs,%1" : "=m" (*(int *)¤t->thread.fs), "=m" (*(int *)¤t->thread.gs)); - __asm__ __volatile__ ( "mov %0,%%fs ; mov %0,%%gs" + asm volatile ( "mov %0,%%fs ; mov %0,%%gs" : : "r" (0) ); } @@ -100,7 +100,7 @@ } #define deactivate_mm(tsk, mm) \ - asm("mov %0,%%fs ; mov %0,%%gs": :"r" (0)) + asm("movl %0,%%fs ; movl %0,%%gs": :"r" (0)) #define activate_mm(prev, next) \ switch_mm((prev),(next),NULL) diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h Mon Aug 15 18:32:29 2005 @@ -63,15 +63,20 @@ extern unsigned int *phys_to_machine_mapping; #define pfn_to_mfn(_pfn) ((unsigned long)(phys_to_machine_mapping[(_pfn)])) #define mfn_to_pfn(_mfn) ((unsigned long)(machine_to_phys_mapping[(_mfn)])) -static inline unsigned long phys_to_machine(unsigned long phys) -{ - unsigned long machine = pfn_to_mfn(phys >> PAGE_SHIFT); +#ifdef CONFIG_X86_PAE +typedef unsigned long long physaddr_t; +#else +typedef unsigned long physaddr_t; +#endif +static inline physaddr_t phys_to_machine(physaddr_t phys) +{ + physaddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT); machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK); return machine; } -static inline unsigned long machine_to_phys(unsigned long machine) -{ - unsigned long phys = mfn_to_pfn(machine >> PAGE_SHIFT); +static inline physaddr_t machine_to_phys(physaddr_t machine) +{ + physaddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT); phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); return phys; } @@ -86,8 +91,9 @@ typedef struct { unsigned long long pmd; } pmd_t; typedef struct { unsigned long long pgd; } pgd_t; typedef struct { unsigned long long pgprot; } pgprot_t; -#define __pte(x) ({ unsigned long long _x = (x); \ - (((_x)&1) ? ((pte_t) {phys_to_machine(_x)}) : ((pte_t) {(_x)})); }) +#define __pte(x) ({ unsigned long long _x = (x); \ + if (_x & 1) _x = phys_to_machine(_x); \ + ((pte_t) {(unsigned long)(_x), (unsigned long)(_x>>32)}); }) #define __pgd(x) ({ unsigned long long _x = (x); \ (((_x)&1) ? ((pgd_t) {phys_to_machine(_x)}) : ((pgd_t) {(_x)})); }) #define __pmd(x) ({ unsigned long long _x = (x); \ diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgalloc.h Mon Aug 15 18:32:29 2005 @@ -14,9 +14,9 @@ do { \ if (unlikely((mm)->context.pinned)) { \ if (!PageHighMem(pte)) \ - HYPERVISOR_update_va_mapping( \ + BUG_ON(HYPERVISOR_update_va_mapping( \ (unsigned long)__va(page_to_pfn(pte)<<PAGE_SHIFT),\ - pfn_pte(page_to_pfn(pte), PAGE_KERNEL_RO), 0);\ + pfn_pte(page_to_pfn(pte), PAGE_KERNEL_RO), 0));\ set_pmd(pmd, __pmd(_PAGE_TABLE + \ ((unsigned long long)page_to_pfn(pte) << \ (unsigned long long) PAGE_SHIFT))); \ diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-2level.h Mon Aug 15 18:32:29 2005 @@ -14,7 +14,28 @@ * hook is made available. */ #define set_pte(pteptr, pteval) (*(pteptr) = pteval) -#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) + +inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, + pte_t *ptep, pte_t val ) +{ + if ( ((mm != current->mm) && (mm != &init_mm)) || + HYPERVISOR_update_va_mapping( (addr), (val), 0 ) ) + { + set_pte(ptep, val); + } +} + +inline static void set_pte_at_sync(struct mm_struct *mm, unsigned long addr, + pte_t *ptep, pte_t val ) +{ + if ( ((mm != current->mm) && (mm != &init_mm)) || + HYPERVISOR_update_va_mapping( (addr), (val), UVMF_INVLPG ) ) + { + set_pte(ptep, val); + xen_invlpg(addr); + } +} + #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval) #ifndef CONFIG_XEN_SHADOW_MODE diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-3level.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-3level.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable-3level.h Mon Aug 15 18:32:29 2005 @@ -68,7 +68,27 @@ xen_l1_entry_update((pteptr), (pteval)) # define set_pte_atomic(pteptr,pteval) set_pte(pteptr,pteval) #endif -#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) + +inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, + pte_t *ptep, pte_t val ) +{ + if ( ((mm != current->mm) && (mm != &init_mm)) || + HYPERVISOR_update_va_mapping( (addr), (val), 0 ) ) + { + set_pte(ptep, val); + } +} + +inline static void set_pte_at_sync(struct mm_struct *mm, unsigned long addr, + pte_t *ptep, pte_t val ) +{ + if ( ((mm != current->mm) && (mm != &init_mm)) || + HYPERVISOR_update_va_mapping( (addr), (val), UVMF_INVLPG ) ) + { + set_pte(ptep, val); + xen_invlpg(addr); + } +} #ifdef CONFIG_XEN_SHADOW_MODE # define set_pmd(pmdptr,pmdval) \ diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/pgtable.h Mon Aug 15 18:32:29 2005 @@ -398,7 +398,7 @@ do { \ if (__dirty) { \ if ( likely((__vma)->vm_mm == current->mm) ) { \ - HYPERVISOR_update_va_mapping((__address), (__entry), UVMF_INVLPG|UVMF_MULTI|(unsigned long)((__vma)->vm_mm->cpu_vm_mask.bits)); \ + BUG_ON(HYPERVISOR_update_va_mapping((__address), (__entry), UVMF_INVLPG|UVMF_MULTI|(unsigned long)((__vma)->vm_mm->cpu_vm_mask.bits))); \ } else { \ xen_l1_entry_update((__ptep), (__entry)); \ flush_tlb_page((__vma), (__address)); \ @@ -416,8 +416,8 @@ #define ptep_establish_new(__vma, __address, __ptep, __entry) \ do { \ if (likely((__vma)->vm_mm == current->mm)) { \ - HYPERVISOR_update_va_mapping((__address), \ - __entry, 0); \ + BUG_ON(HYPERVISOR_update_va_mapping((__address), \ + __entry, 0)); \ } else { \ xen_l1_entry_update((__ptep), (__entry)); \ } \ @@ -466,10 +466,12 @@ unsigned long size, pgprot_t prot, domid_t domid); -int __direct_remap_area_pages(struct mm_struct *mm, - unsigned long address, - unsigned long size, - mmu_update_t *v); +int create_lookup_pte_addr(struct mm_struct *mm, + unsigned long address, + unsigned long *ptep); +int touch_pte_range(struct mm_struct *mm, + unsigned long address, + unsigned long size); #define io_remap_page_range(vma,from,phys,size,prot) \ direct_remap_area_pages(vma->vm_mm,from,phys,size,prot,DOMID_IO) diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h Mon Aug 15 18:32:29 2005 @@ -9,6 +9,7 @@ #include <asm/fixmap.h> #include <asm/bitops.h> #include <linux/threads.h> +#include <linux/sched.h> #include <asm/pda.h> #ifdef CONFIG_XEN #include <asm-xen/hypervisor.h> @@ -265,7 +266,16 @@ val &= ~(_PAGE_USER | _PAGE_DIRTY); return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED); } -#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) + +inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, + pte_t *ptep, pte_t val ) +{ + if ( ((mm != current->mm) && (mm != &init_mm)) || + HYPERVISOR_update_va_mapping( (addr), (val), 0 ) ) + { + set_pte(ptep, val); + } +} #define pte_none(x) (!(x).pte) #define pte_present(x) ((x).pte & (_PAGE_PRESENT | _PAGE_PROTNONE)) @@ -497,7 +507,7 @@ do { \ if (__dirty) { \ if ( likely((__vma)->vm_mm == current->mm) ) { \ - HYPERVISOR_update_va_mapping((__address), (__entry), UVMF_INVLPG|UVMF_MULTI|(unsigned long)((__vma)->vm_mm->cpu_vm_mask.bits)); \ + BUG_ON(HYPERVISOR_update_va_mapping((__address), (__entry), UVMF_INVLPG|UVMF_MULTI|(unsigned long)((__vma)->vm_mm->cpu_vm_mask.bits))); \ } else { \ xen_l1_entry_update((__ptep), (__entry)); \ flush_tlb_page((__vma), (__address)); \ @@ -528,6 +538,12 @@ unsigned long address, unsigned long size, mmu_update_t *v); +int create_lookup_pte_addr(struct mm_struct *mm, + unsigned long address, + unsigned long *ptep); +int touch_pte_range(struct mm_struct *mm, + unsigned long address, + unsigned long size); #define io_remap_page_range(vma, vaddr, paddr, size, prot) \ direct_remap_area_pages((vma)->vm_mm,vaddr,paddr,size,prot,DOMID_IO) diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/linux/mm.h --- a/linux-2.6-xen-sparse/include/linux/mm.h Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/include/linux/mm.h Mon Aug 15 18:32:29 2005 @@ -817,6 +817,12 @@ int remap_pfn_range(struct vm_area_struct *, unsigned long, unsigned long, unsigned long, pgprot_t); +typedef int (*pte_fn_t)(pte_t *pte, struct page *pte_page, unsigned long addr, + void *data); +extern int generic_page_range(struct mm_struct *mm, unsigned long address, + unsigned long size, pte_fn_t fn, void *data); + + #ifdef CONFIG_PROC_FS void __vm_stat_account(struct mm_struct *, unsigned long, struct file *, long); #else diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/mm/memory.c --- a/linux-2.6-xen-sparse/mm/memory.c Fri Aug 12 17:35:15 2005 +++ b/linux-2.6-xen-sparse/mm/memory.c Mon Aug 15 18:32:29 2005 @@ -954,8 +954,10 @@ i++; start += PAGE_SIZE; len--; +printk(KERN_ALERT "HIT 0x%lx\n", start); continue; - } + } +else printk(KERN_ALERT "MISS 0x%lx\n", start); } if (!vma || (vma->vm_flags & VM_IO) @@ -1213,6 +1215,104 @@ } EXPORT_SYMBOL(remap_pfn_range); +static inline int generic_pte_range(struct mm_struct *mm, + pmd_t *pmd, + unsigned long addr, + unsigned long end, + pte_fn_t fn, void *data) +{ + pte_t *pte; + int err; + struct page *pte_page; + + pte = (mm == &init_mm) ? + pte_alloc_kernel(mm, pmd, addr) : + pte_alloc_map(mm, pmd, addr); + if (!pte) + return -ENOMEM; + + pte_page = pmd_page(*pmd); + + do { + err = fn(pte, pte_page, addr, data); + if (err) + break; + } while (pte++, addr += PAGE_SIZE, addr != end); + + if (mm != &init_mm) + pte_unmap(pte-1); + return err; + +} + +static inline int generic_pmd_range(struct mm_struct *mm, + pud_t *pud, + unsigned long addr, + unsigned long end, + pte_fn_t fn, void *data) +{ + pmd_t *pmd; + unsigned long next; + int err; + + pmd = pmd_alloc(mm, pud, addr); + if (!pmd) + return -ENOMEM; + do { + next = pmd_addr_end(addr, end); + err = generic_pte_range(mm, pmd, addr, next, fn, data); + if (err) + break; + } while (pmd++, addr = next, addr != end); + return err; +} + +static inline int generic_pud_range(struct mm_struct *mm, pgd_t *pgd, + unsigned long addr, + unsigned long end, + pte_fn_t fn, void *data) +{ + pud_t *pud; + unsigned long next; + int err; + + pud = pud_alloc(mm, pgd, addr); + if (!pud) + return -ENOMEM; + do { + next = pud_addr_end(addr, end); + err = generic_pmd_range(mm, pud, addr, next, fn, data); + if (err) + break; + } while (pud++, addr = next, addr != end); + return err; +} + +/* + * Scan a region of virtual memory, filling in page tables as necessary + * and calling a provided function on each leaf page table. + */ +int generic_page_range(struct mm_struct *mm, unsigned long addr, + unsigned long size, pte_fn_t fn, void *data) +{ + pgd_t *pgd; + unsigned long next; + unsigned long end = addr + size; + int err; + + BUG_ON(addr >= end); + pgd = pgd_offset(mm, addr); + spin_lock(&mm->page_table_lock); + do { + next = pgd_addr_end(addr, end); + err = generic_pud_range(mm, pgd, addr, next, fn, data); + if (err) + break; + } while (pgd++, addr = next, addr != end); + spin_unlock(&mm->page_table_lock); + return err; +} + /* * Do pte_mkwrite, but only if the vma says VM_WRITE. We do this when * servicing faults for write access. In the normal case, do always want diff -r 40b887fa79d0 -r 29aab159846c tools/examples/Makefile --- a/tools/examples/Makefile Fri Aug 12 17:35:15 2005 +++ b/tools/examples/Makefile Mon Aug 15 18:32:29 2005 @@ -16,7 +16,7 @@ # Xen script dir and scripts to go there. XEN_SCRIPT_DIR = /etc/xen/scripts -XEN_SCRIPTS = network vif-bridge +XEN_SCRIPTS = network-bridge vif-bridge XEN_SCRIPTS += network-route vif-route XEN_SCRIPTS += block-file XEN_SCRIPTS += block-enbd diff -r 40b887fa79d0 -r 29aab159846c tools/examples/xend-config.sxp --- a/tools/examples/xend-config.sxp Fri Aug 12 17:35:15 2005 +++ b/tools/examples/xend-config.sxp Mon Aug 15 18:32:29 2005 @@ -28,7 +28,7 @@ ## Use the following if VIF traffic is bridged. # The script used to start/stop networking for xend. -(network-script network) +(network-script network-bridge) # The default bridge that virtual interfaces should be connected to. (vif-bridge xen-br0) # The default script used to control virtual interfaces. diff -r 40b887fa79d0 -r 29aab159846c tools/libxc/xc_gnttab.c --- a/tools/libxc/xc_gnttab.c Fri Aug 12 17:35:15 2005 +++ b/tools/libxc/xc_gnttab.c Mon Aug 15 18:32:29 2005 @@ -50,7 +50,7 @@ struct gnttab_map_grant_ref op; int rc; - op.host_virt_addr = host_virt_addr; + op.host_addr = host_virt_addr; op.dom = (domid_t)dom; op.ref = ref; op.flags = flags; @@ -75,7 +75,7 @@ struct gnttab_unmap_grant_ref op; int rc; - op.host_virt_addr = host_virt_addr; + op.host_addr = host_virt_addr; op.dev_bus_addr = dev_bus_addr; op.handle = handle; diff -r 40b887fa79d0 -r 29aab159846c tools/python/setup.py --- a/tools/python/setup.py Fri Aug 12 17:35:15 2005 +++ b/tools/python/setup.py Mon Aug 15 18:32:29 2005 @@ -17,7 +17,7 @@ XEN_ROOT + "/tools/xenstore", ] -libraries = [ "xc", "xenstore" ] +libraries = [ "xc", "xenstore-pic" ] xc = Extension("xc", extra_compile_args = extra_compile_args, diff -r 40b887fa79d0 -r 29aab159846c tools/python/xen/lowlevel/xu/xu.c --- a/tools/python/xen/lowlevel/xu/xu.c Fri Aug 12 17:35:15 2005 +++ b/tools/python/xen/lowlevel/xu/xu.c Mon Aug 15 18:32:29 2005 @@ -655,7 +655,9 @@ case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_CONNECT): C2P(netif_fe_interface_connect_t, handle, Int, Long); C2P(netif_fe_interface_connect_t, tx_shmem_frame, Int, Long); + C2P(netif_fe_interface_connect_t, tx_shmem_ref, Int, Long); C2P(netif_fe_interface_connect_t, rx_shmem_frame, Int, Long); + C2P(netif_fe_interface_connect_t, rx_shmem_ref, Int, Long); return dict; case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_DISCONNECT): C2P(netif_fe_interface_disconnect_t, handle, Int, Long); @@ -681,7 +683,9 @@ C2P(netif_be_connect_t, domid, Int, Long); C2P(netif_be_connect_t, netif_handle, Int, Long); C2P(netif_be_connect_t, tx_shmem_frame, Int, Long); + C2P(netif_be_connect_t, tx_shmem_ref, Int, Long); C2P(netif_be_connect_t, rx_shmem_frame, Int, Long); + C2P(netif_be_connect_t, rx_shmem_ref, Int, Long); C2P(netif_be_connect_t, evtchn, Int, Long); C2P(netif_be_connect_t, status, Int, Long); return dict; @@ -903,8 +907,10 @@ P2C(netif_be_connect_t, domid, u32); P2C(netif_be_connect_t, netif_handle, u32); P2C(netif_be_connect_t, tx_shmem_frame, memory_t); + P2C(netif_be_connect_t, tx_shmem_ref, u32); P2C(netif_be_connect_t, rx_shmem_frame, memory_t); - P2C(netif_be_connect_t, evtchn, u16); + P2C(netif_be_connect_t, rx_shmem_ref, u32); + P2C(netif_be_connect_t, evtchn, u16); break; case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT): P2C(netif_be_disconnect_t, domid, u32); diff -r 40b887fa79d0 -r 29aab159846c tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Fri Aug 12 17:35:15 2005 +++ b/tools/python/xen/xend/XendDomainInfo.py Mon Aug 15 18:32:29 2005 @@ -138,7 +138,7 @@ if domlist and dom == domlist[0]['dom']: return domlist[0] return None - + class XendDomainInfo: """Virtual machine object.""" @@ -593,7 +593,7 @@ def delete(self): """Delete the vm's db. """ - if self.dom_get(self.id): + if dom_get(self.id): return self.id = None self.saveToDB(sync=True) @@ -753,7 +753,7 @@ @param dev_config: device configuration """ dev_type = sxp.name(dev_config) - dev = self.createDevice(self, dev_config, change=True) + dev = self.createDevice(dev_type, dev_config, change=True) self.config.append(['device', dev.getConfig()]) return dev.sxpr() diff -r 40b887fa79d0 -r 29aab159846c tools/python/xen/xend/XendRoot.py --- a/tools/python/xen/xend/XendRoot.py Fri Aug 12 17:35:15 2005 +++ b/tools/python/xen/xend/XendRoot.py Mon Aug 15 18:32:29 2005 @@ -315,7 +315,7 @@ return self.get_config_value('block-%s' % type, '') def get_network_script(self): - return self.get_config_value('network-script', 'network') + return self.get_config_value('network-script', '') def get_enable_dump(self): return self.get_config_bool('enable-dump', 'no') diff -r 40b887fa79d0 -r 29aab159846c tools/python/xen/xend/server/controller.py --- a/tools/python/xen/xend/server/controller.py Fri Aug 12 17:35:15 2005 +++ b/tools/python/xen/xend/server/controller.py Mon Aug 15 18:32:29 2005 @@ -142,7 +142,7 @@ def createDevController(self, type, vm, recreate=False): cls = self.getDevControllerClass(type) if not cls: - raise XendError("unknown device type: " + type) + raise XendError("unknown device type: " + str(type)) return cls.createDevController(vm, recreate=recreate) def getDevControllerTable(): @@ -283,6 +283,8 @@ dev.attach(recreate=recreate, change=change) dev.exportToDB() + return dev + def configureDevice(self, id, config, change=False): """Reconfigure an existing device. May be defined in subclass.""" @@ -323,9 +325,9 @@ return self.destroyed def getDevice(self, id, error=False): - dev = self.devices.get(id) + dev = self.devices.get(int(id)) if error and not dev: - raise XendError("invalid device id: " + id) + raise XendError("invalid device id: " + str(id)) return dev def getDeviceIds(self): diff -r 40b887fa79d0 -r 29aab159846c tools/python/xen/xend/server/netif.py --- a/tools/python/xen/xend/server/netif.py Fri Aug 12 17:35:15 2005 +++ b/tools/python/xen/xend/server/netif.py Mon Aug 15 18:32:29 2005 @@ -421,7 +421,9 @@ 'netif_handle' : self.vif, 'evtchn' : self.getEventChannelBackend(), 'tx_shmem_frame' : val['tx_shmem_frame'], - 'rx_shmem_frame' : val['rx_shmem_frame'] }) + 'tx_shmem_ref' : val['tx_shmem_ref'], + 'rx_shmem_frame' : val['rx_shmem_frame'], + 'rx_shmem_ref' : val['rx_shmem_ref'] }) msg = self.backendChannel.requestResponse(msg) #todo: check return status self.status = NETIF_INTERFACE_STATUS_CONNECTED diff -r 40b887fa79d0 -r 29aab159846c tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Fri Aug 12 17:35:15 2005 +++ b/tools/python/xen/xm/main.py Mon Aug 15 18:32:29 2005 @@ -221,8 +221,9 @@ domsinfo.append(parse_doms_info(info)) if use_long: - # this actually seems like a bad idea, as it just dumps sexp out - PrettyPrint.prettyprint(info) + for dom in doms: + info = server.xend_domain(dom) + PrettyPrint.prettyprint(info) elif show_vcpus: xm_show_vcpus(domsinfo) else: diff -r 40b887fa79d0 -r 29aab159846c tools/xenstore/Makefile --- a/tools/xenstore/Makefile Fri Aug 12 17:35:15 2005 +++ b/tools/xenstore/Makefile Mon Aug 15 18:32:29 2005 @@ -24,7 +24,7 @@ TESTFLAGS= -DTESTING TESTENV = XENSTORED_ROOTDIR=$(TESTDIR) XENSTORED_RUNDIR=$(TESTDIR) -all: xen xenstored libxenstore.so +all: xen xenstored libxenstore.a libxenstore-pic.a testcode: xen xs_test xenstored_test xs_random xs_dom0_test @@ -53,14 +53,20 @@ talloc_test.o: talloc.c $(COMPILE.c) -o $@ $< -libxenstore.so: xs.opic xs_lib.opic - $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-soname -Wl,libxenstore.so -shared -o $@ $^ +LIB_OBJS := xs.o xs_lib.o + +LIB_OBJS_A := $(patsubst %.o,libxenstore.a(%.o),$(LIB_OBJS)) +LIB_OBJS_PIC := $(patsubst %.o,libxenstore-pic.a(%.opic),$(LIB_OBJS)) + +libxenstore.a: $(LIB_OBJS_A) + +libxenstore-pic.a: $(LIB_OBJS_PIC) clean: testsuite-clean - rm -f *.o *.opic *.so + rm -f *.o *.opic *.a rm -f xen xenstored xs_random xs_stress xs_crashme rm -f xs_test xenstored_test xs_dom0_test - $(RM) $(PROG_DEP) + -$(RM) $(PROG_DEP) print-dir: @echo -n tools/xenstore: @@ -111,14 +117,15 @@ tarball: clean cd .. && tar -c -j -v -h -f xenstore.tar.bz2 xenstore/ -install: xenstored libxenstore.so +install: xenstored libxenstore.a libxenstore-pic.a $(INSTALL_DIR) -p $(DESTDIR)/var/run/xenstored $(INSTALL_DIR) -p $(DESTDIR)/var/lib/xenstored $(INSTALL_DIR) -p $(DESTDIR)/usr/sbin $(INSTALL_DIR) -p $(DESTDIR)/usr/include $(INSTALL_PROG) xenstored $(DESTDIR)/usr/sbin $(INSTALL_DIR) -p $(DESTDIR)/usr/$(LIBDIR) - $(INSTALL_DATA) libxenstore.so $(DESTDIR)/usr/$(LIBDIR) + $(INSTALL_DATA) libxenstore.a $(DESTDIR)/usr/$(LIBDIR) + $(INSTALL_DATA) libxenstore-pic.a $(DESTDIR)/usr/$(LIBDIR) $(INSTALL_DATA) xs.h $(DESTDIR)/usr/include $(INSTALL_DATA) xs_lib.h $(DESTDIR)/usr/include diff -r 40b887fa79d0 -r 29aab159846c xen/Rules.mk --- a/xen/Rules.mk Fri Aug 12 17:35:15 2005 +++ b/xen/Rules.mk Mon Aug 15 18:32:29 2005 @@ -2,7 +2,7 @@ # If you change any of these configuration options then you must # 'make clean' before rebuilding. # -verbose ?= n +verbose ?= y debug ?= n perfc ?= n perfc_arrays?= n diff -r 40b887fa79d0 -r 29aab159846c xen/arch/ia64/grant_table.c --- a/xen/arch/ia64/grant_table.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/ia64/grant_table.c Mon Aug 15 18:32:29 2005 @@ -355,7 +355,7 @@ /* Bitwise-OR avoids short-circuiting which screws control flow. */ if ( unlikely(__get_user(dom, &uop->dom) | __get_user(ref, &uop->ref) | - __get_user(host_virt_addr, &uop->host_virt_addr) | + __get_user(host_virt_addr, &uop->host_addr) | __get_user(dev_hst_ro_flags, &uop->flags)) ) { DPRINTK("Fault while reading gnttab_map_grant_ref_t.\n"); @@ -500,7 +500,7 @@ ld = current->domain; /* Bitwise-OR avoids short-circuiting which screws control flow. */ - if ( unlikely(__get_user(virt, &uop->host_virt_addr) | + if ( unlikely(__get_user(virt, &uop->host_addr) | __get_user(frame, &uop->dev_bus_addr) | __get_user(handle, &uop->handle)) ) { diff -r 40b887fa79d0 -r 29aab159846c xen/arch/ia64/xentime.c --- a/xen/arch/ia64/xentime.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/ia64/xentime.c Mon Aug 15 18:32:29 2005 @@ -103,7 +103,7 @@ } /* Set clock to <secs,usecs> after 00:00:00 UTC, 1 January, 1970. */ -void do_settime(s64 secs, u32 nsecs, u64 system_time_base) +void do_settime(unsigned long secs, unsigned long nsecs, u64 system_time_base) { #ifdef CONFIG_VTI u64 _nsecs; diff -r 40b887fa79d0 -r 29aab159846c xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/x86/mm.c Mon Aug 15 18:32:29 2005 @@ -736,7 +736,7 @@ pl2e[l2_table_offset(LINEAR_PT_VIRT_START) + i] = (l3e_get_flags(pl3e[i]) & _PAGE_PRESENT) ? l2e_from_pfn(l3e_get_pfn(pl3e[i]), __PAGE_HYPERVISOR) : - l2e_empty(); + l2e_empty(); unmap_domain_page(pl2e); return 1; @@ -764,7 +764,7 @@ unsigned long l2_backptr = l2_type & PGT_va_mask; BUG_ON(l2_backptr == PGT_va_unknown); - *backptr = ((l2_backptr >> PGT_va_shift) << L3_PAGETABLE_SHIFT) | + *backptr = ((l2_backptr >> PGT_va_shift) << L3_PAGETABLE_SHIFT) | (offset_in_l2 << L2_PAGETABLE_SHIFT); return 1; } @@ -872,7 +872,7 @@ if ( !l2_backptr(&vaddr, i, type) ) goto fail; #else - vaddr = (unsigned long)i << L3_PAGETABLE_SHIFT; + vaddr = (unsigned long)i << L3_PAGETABLE_SHIFT; #endif if ( is_guest_l3_slot(i) && unlikely(!get_page_from_l3e(pl3e[i], pfn, d, vaddr)) ) @@ -1246,7 +1246,7 @@ if (!l4e_has_changed(ol4e, nl4e, _PAGE_PRESENT)) return UPDATE_ENTRY(l4, pl4e, ol4e, nl4e); - if ( unlikely(!l3_backptr(&vaddr, pgentry_ptr_to_slot(pl4e), type)) || + if ( unlikely(!l3_backptr(&vaddr, pgentry_ptr_to_slot(pl4e), type)) || unlikely(!get_page_from_l4e(nl4e, pfn, current->domain, vaddr)) ) return 0; @@ -2268,60 +2268,214 @@ return rc; } -/* This function assumes the caller is holding the domain's BIGLOCK - * and is running in a shadow mode - */ -int update_grant_va_mapping(unsigned long va, - l1_pgentry_t _nl1e, - struct domain *d, - struct vcpu *v) -{ - /* Caller must: - * . own d's BIGLOCK - * . already have 'get_page' correctly on the to-be-installed nl1e - * . be responsible for flushing the TLB - * . check PTE being installed isn't DISALLOWED + +int update_grant_pte_mapping( + unsigned long pte_addr, l1_pgentry_t _nl1e, + struct domain *d, struct vcpu *v) +{ + int rc = GNTST_okay; + void *va; + unsigned long gpfn, mfn; + struct pfn_info *page; + u32 type_info; + l1_pgentry_t ol1e; + + ASSERT(spin_is_locked(&d->big_lock)); + ASSERT(!shadow_mode_refcounts(d)); + ASSERT((l1e_get_flags(_nl1e) & L1_DISALLOW_MASK) == 0); + + gpfn = pte_addr >> PAGE_SHIFT; + mfn = __gpfn_to_mfn(d, gpfn); + + if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) ) + { + MEM_LOG("Could not get page for normal update"); + return GNTST_general_error; + } + + va = map_domain_page(mfn); + va = (void *)((unsigned long)va + (pte_addr & ~PAGE_MASK)); + page = pfn_to_page(mfn); + + type_info = page->u.inuse.type_info; + if ( ((type_info & PGT_type_mask) != PGT_l1_page_table) || + !get_page_type(page, type_info & (PGT_type_mask|PGT_va_mask)) ) + { + DPRINTK("Grant map attempted to update a non-L1 page\n"); + rc = GNTST_general_error; + goto failed; + } + + if ( __copy_from_user(&ol1e, (l1_pgentry_t *)va, sizeof(ol1e)) || + !update_l1e(va, ol1e, _nl1e) ) + { + put_page_type(page); + rc = GNTST_general_error; + goto failed; + } + + put_page_from_l1e(ol1e, d); + + rc = (l1e_get_flags(ol1e) & _PAGE_PRESENT) ? GNTST_flush_all : GNTST_okay; + + if ( unlikely(shadow_mode_enabled(d)) ) + { + struct domain_mmap_cache sh_mapcache; + domain_mmap_cache_init(&sh_mapcache); + shadow_l1_normal_pt_update(d, pte_addr, _nl1e, &sh_mapcache); + domain_mmap_cache_destroy(&sh_mapcache); + } + + put_page_type(page); + + failed: + unmap_domain_page(va); + put_page(page); + return rc; +} + +int clear_grant_pte_mapping( + unsigned long addr, unsigned long frame, struct domain *d) +{ + int rc = GNTST_okay; + void *va; + unsigned long gpfn, mfn; + struct pfn_info *page; + u32 type_info; + l1_pgentry_t ol1e; + + ASSERT(!shadow_mode_refcounts(d)); + + gpfn = addr >> PAGE_SHIFT; + mfn = __gpfn_to_mfn(d, gpfn); + + if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) ) + { + MEM_LOG("Could not get page for normal update"); + return GNTST_general_error; + } + + va = map_domain_page(mfn); + va = (void *)((unsigned long)va + (addr & ~PAGE_MASK)); + page = pfn_to_page(mfn); + + type_info = page->u.inuse.type_info; + if ( ((type_info & PGT_type_mask) != PGT_l1_page_table) || + !get_page_type(page, type_info & (PGT_type_mask|PGT_va_mask)) ) + { + DPRINTK("Grant map attempted to update a non-L1 page\n"); + rc = GNTST_general_error; + goto failed; + } + + if ( __copy_from_user(&ol1e, (l1_pgentry_t *)va, sizeof(ol1e)) ) + { + put_page_type(page); + rc = GNTST_general_error; + goto failed; + } + + /* Check that the virtual address supplied is actually mapped to frame. */ + if ( unlikely((l1e_get_intpte(ol1e) >> PAGE_SHIFT) != frame) ) + { + DPRINTK("PTE entry %lx for address %lx doesn't match frame %lx\n", + (unsigned long)l1e_get_intpte(ol1e), addr, frame); + put_page_type(page); + rc = GNTST_general_error; + goto failed; + } + + /* Delete pagetable entry. */ + if ( unlikely(__put_user(0, (unsigned long *)va))) + { + DPRINTK("Cannot delete PTE entry at %p.\n", va); + put_page_type(page); + rc = GNTST_general_error; + goto failed; + } + + if ( unlikely(shadow_mode_enabled(d)) ) + { + struct domain_mmap_cache sh_mapcache; + domain_mmap_cache_init(&sh_mapcache); + shadow_l1_normal_pt_update(d, addr, l1e_empty(), &sh_mapcache); + domain_mmap_cache_destroy(&sh_mapcache); + } + + put_page_type(page); + + failed: + unmap_domain_page(va); + put_page(page); + return rc; +} + + +int update_grant_va_mapping( + unsigned long va, l1_pgentry_t _nl1e, struct domain *d, struct vcpu *v) +{ + int rc = GNTST_okay; + l1_pgentry_t *pl1e, ol1e; + + ASSERT(spin_is_locked(&d->big_lock)); + ASSERT(!shadow_mode_refcounts(d)); + ASSERT((l1e_get_flags(_nl1e) & L1_DISALLOW_MASK) == 0); + + /* + * This is actually overkill - we don't need to sync the L1 itself, + * just everything involved in getting to this L1 (i.e. we need + * linear_pg_table[l1_linear_offset(va)] to be in sync)... */ - - int rc = 0; - l1_pgentry_t *pl1e; - l1_pgentry_t ol1e; - - cleanup_writable_pagetable(d); - - // This is actually overkill - we don't need to sync the L1 itself, - // just everything involved in getting to this L1 (i.e. we need - // linear_pg_table[l1_linear_offset(va)] to be in sync)... - // __shadow_sync_va(v, va); pl1e = &linear_pg_table[l1_linear_offset(va)]; - if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) ) - rc = -EINVAL; - else if ( !shadow_mode_refcounts(d) ) - { - if ( update_l1e(pl1e, ol1e, _nl1e) ) - { - put_page_from_l1e(ol1e, d); - if ( l1e_get_flags(ol1e) & _PAGE_PRESENT ) - rc = 0; /* Caller needs to invalidate TLB entry */ - else - rc = 1; /* Caller need not invalidate TLB entry */ - } - else - rc = -EINVAL; - } - else - { - printk("grant tables and shadow mode currently don't work together\n"); - BUG(); - } + if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) || + !update_l1e(pl1e, ol1e, _nl1e) ) + return GNTST_general_error; + + put_page_from_l1e(ol1e, d); + + rc = (l1e_get_flags(ol1e) & _PAGE_PRESENT) ? GNTST_flush_one : GNTST_okay; if ( unlikely(shadow_mode_enabled(d)) ) shadow_do_update_va_mapping(va, _nl1e, v); return rc; +} + +int clear_grant_va_mapping(unsigned long addr, unsigned long frame) +{ + l1_pgentry_t *pl1e; + unsigned long _ol1e; + + pl1e = &linear_pg_table[l1_linear_offset(addr)]; + + if ( unlikely(__get_user(_ol1e, (unsigned long *)pl1e) != 0) ) + { + DPRINTK("Could not find PTE entry for address %lx\n", addr); + return GNTST_general_error; + } + + /* + * Check that the virtual address supplied is actually mapped to + * frame. + */ + if ( unlikely((_ol1e >> PAGE_SHIFT) != frame )) + { + DPRINTK("PTE entry %lx for address %lx doesn't match frame %lx\n", + _ol1e, addr, frame); + return GNTST_general_error; + } + + /* Delete pagetable entry. */ + if ( unlikely(__put_user(0, (unsigned long *)pl1e))) + { + DPRINTK("Cannot delete PTE entry at %p.\n", (unsigned long *)pl1e); + return GNTST_general_error; + } + + return 0; } @@ -2358,10 +2512,11 @@ (shadow_mode_translate(d) || shadow_mode_translate(percpu_info[cpu].foreign))) ) { - // The foreign domain's pfn's are in a different namespace. - // There's not enough information in just a gpte to figure out - // how to (re-)shadow this entry. - // + /* + * The foreign domain's pfn's are in a different namespace. There's + * not enough information in just a gpte to figure out how to + * (re-)shadow this entry. + */ domain_crash(); } @@ -2616,7 +2771,7 @@ * Writable Pagetables */ -#ifdef VERBOSE +#ifdef VVERBOSE int ptwr_debug = 0x0; #define PTWR_PRINTK(_f, _a...) \ do { if ( unlikely(ptwr_debug) ) printk( _f , ## _a ); } while ( 0 ) @@ -2624,6 +2779,122 @@ #else #define PTWR_PRINTK(_f, _a...) ((void)0) #endif + + +#ifdef PERF_ARRAYS + +/**************** writeable pagetables profiling functions *****************/ + +#define ptwr_eip_buckets 256 + +int ptwr_eip_stat_threshold[] = {1, 10, 50, 100, L1_PAGETABLE_ENTRIES}; + +#define ptwr_eip_stat_thresholdN (sizeof(ptwr_eip_stat_threshold)/sizeof(int)) + +struct { + unsigned long eip; + domid_t id; + u32 val[ptwr_eip_stat_thresholdN]; +} typedef ptwr_eip_stat_t; + +ptwr_eip_stat_t ptwr_eip_stats[ptwr_eip_buckets]; + +static inline unsigned int ptwr_eip_stat_hash( unsigned long eip, domid_t id ) +{ + return (((unsigned long) id) ^ eip ^ (eip>>8) ^ (eip>>16) ^ (eip>24)) % + ptwr_eip_buckets; +} + +static void ptwr_eip_stat_inc(u32 *n) +{ + int i, j; + + if ( ++(*n) != 0 ) + return; + + *n = ~0; + + /* Re-scale all buckets. */ + for ( i = 0; i <ptwr_eip_buckets; i++ ) + for ( j = 0; j < ptwr_eip_stat_thresholdN; j++ ) + ptwr_eip_stats[i].val[j] >>= 1; +} + +static void ptwr_eip_stat_update(unsigned long eip, domid_t id, int modified) +{ + int i, j, b; + + i = b = ptwr_eip_stat_hash(eip, id); + + do + { + if ( !ptwr_eip_stats[i].eip ) + { + /* doesn't exist */ + ptwr_eip_stats[i].eip = eip; + ptwr_eip_stats[i].id = id; + memset(ptwr_eip_stats[i].val,0, sizeof(ptwr_eip_stats[i].val)); + } + + if ( ptwr_eip_stats[i].eip == eip ) + { + for ( j = 0; j < ptwr_eip_stat_thresholdN; j++ ) + if ( modified <= ptwr_eip_stat_threshold[j] ) + break; + BUG_ON(j >= ptwr_eip_stat_thresholdN); + ptwr_eip_stat_inc(&ptwr_eip_stats[i].val[j]); + return; + } + + i = (i+1) % ptwr_eip_buckets; + } + while ( i != b ); + + printk("ptwr_eip_stat: too many EIPs in use!\n"); + + ptwr_eip_stat_print(); + ptwr_eip_stat_reset(); +} + +void ptwr_eip_stat_reset(void) +{ + memset(ptwr_eip_stats, 0, sizeof(ptwr_eip_stats)); +} + +void ptwr_eip_stat_print(void) +{ + struct domain *e; + domid_t d; + int i, j; + + for_each_domain( e ) + { + d = e->domain_id; + + for ( i = 0; i < ptwr_eip_buckets; i++ ) + { + if ( ptwr_eip_stats[i].eip && ptwr_eip_stats[i].id != d ) + continue; + + printk("D %d eip %08lx ", + ptwr_eip_stats[i].id, ptwr_eip_stats[i].eip); + + for ( j = 0; j < ptwr_eip_stat_thresholdN; j++ ) + printk("<=%u %4u \t", + ptwr_eip_stat_threshold[j], + ptwr_eip_stats[i].val[j]); + printk("\n"); + } + } +} + +#else /* PERF_ARRAYS */ + +#define ptwr_eip_stat_update(eip, id, modified) ((void)0) + +#endif + +/*******************************************************************/ /* Re-validate a given p.t. page, given its prior snapshot */ int revalidate_l1( @@ -2677,8 +2948,8 @@ /* Flush the given writable p.t. page and write-protect it again. */ void ptwr_flush(struct domain *d, const int which) { - unsigned long pte, *ptep, l1va; - l1_pgentry_t *pl1e; + unsigned long l1va; + l1_pgentry_t *pl1e, pte, *ptep; l2_pgentry_t *pl2e; unsigned int modified; @@ -2698,13 +2969,13 @@ TOGGLE_MODE(); l1va = d->arch.ptwr[which].l1va; - ptep = (unsigned long *)&linear_pg_table[l1_linear_offset(l1va)]; + ptep = (l1_pgentry_t *)&linear_pg_table[l1_linear_offset(l1va)]; /* * STEP 1. Write-protect the p.t. page so no more updates can occur. */ - if ( unlikely(__get_user(pte, ptep)) ) + if ( unlikely(__get_user(pte.l1, &ptep->l1)) ) { MEM_LOG("ptwr: Could not read pte at %p", ptep); /* @@ -2713,9 +2984,9 @@ */ BUG(); } - PTWR_PRINTK("[%c] disconnected_l1va at %p is %lx\n", - PTWR_PRINT_WHICH, ptep, pte); - pte &= ~_PAGE_RW; + PTWR_PRINTK("[%c] disconnected_l1va at %p is %"PRIpte"\n", + PTWR_PRINT_WHICH, ptep, pte.l1); + l1e_remove_flags(pte, _PAGE_RW); /* Write-protect the p.t. page in the guest page table. */ if ( unlikely(__put_user(pte, ptep)) ) @@ -2731,8 +3002,8 @@ /* Ensure that there are no stale writable mappings in any TLB. */ /* NB. INVLPG is a serialising instruction: flushes pending updates. */ flush_tlb_one_mask(d->cpumask, l1va); - PTWR_PRINTK("[%c] disconnected_l1va at %p now %lx\n", - PTWR_PRINT_WHICH, ptep, pte); + PTWR_PRINTK("[%c] disconnected_l1va at %p now %"PRIpte"\n", + PTWR_PRINT_WHICH, ptep, pte.l1); /* * STEP 2. Validate any modified PTEs. @@ -2742,6 +3013,7 @@ modified = revalidate_l1(d, pl1e, d->arch.ptwr[which].page); unmap_domain_page(pl1e); perfc_incr_histo(wpt_updates, modified, PT_UPDATES); + ptwr_eip_stat_update( d->arch.ptwr[which].eip, d->domain_id, modified); d->arch.ptwr[which].prev_nr_updates = modified; /* @@ -2897,7 +3169,8 @@ }; /* Write page fault handler: check if guest is trying to modify a PTE. */ -int ptwr_do_page_fault(struct domain *d, unsigned long addr) +int ptwr_do_page_fault(struct domain *d, unsigned long addr, + struct cpu_user_regs *regs) { unsigned long pfn; struct pfn_info *page; @@ -2932,6 +3205,10 @@ { return 0; } + +#if 0 /* Leave this in as useful for debugging */ + goto emulate; +#endif /* Get the L2 index at which this L1 p.t. is always mapped. */ l2_idx = page->u.inuse.type_info & PGT_va_mask; @@ -3002,7 +3279,11 @@ d->arch.ptwr[which].l1va = addr | 1; d->arch.ptwr[which].l2_idx = l2_idx; d->arch.ptwr[which].vcpu = current; - + +#ifdef PERF_ARRAYS + d->arch.ptwr[which].eip = regs->eip; +#endif + /* For safety, disconnect the L1 p.t. page from current space. */ if ( which == PTWR_PT_ACTIVE ) { diff -r 40b887fa79d0 -r 29aab159846c xen/arch/x86/shadow.c --- a/xen/arch/x86/shadow.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/x86/shadow.c Mon Aug 15 18:32:29 2005 @@ -1578,7 +1578,7 @@ if ( unlikely(!VALID_MFN(gmfn)) ) { - SH_LOG("l1pte_write_fault: invalid gpfn=%lx", gpfn); + SH_VLOG("l1pte_write_fault: invalid gpfn=%lx", gpfn); *spte_p = l1e_empty(); return 0; } @@ -1612,7 +1612,7 @@ if ( unlikely(!VALID_MFN(mfn)) ) { - SH_LOG("l1pte_read_fault: invalid gpfn=%lx", pfn); + SH_VLOG("l1pte_read_fault: invalid gpfn=%lx", pfn); *spte_p = l1e_empty(); return 0; } diff -r 40b887fa79d0 -r 29aab159846c xen/arch/x86/shadow32.c --- a/xen/arch/x86/shadow32.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/x86/shadow32.c Mon Aug 15 18:32:29 2005 @@ -665,7 +665,7 @@ shadow_audit(d, 0); - SH_LOG("Free shadow table."); + SH_VLOG("Free shadow table."); } void shadow_mode_init(void) @@ -1137,7 +1137,7 @@ d->arch.shadow_ht_free = NULL; ASSERT(d->arch.shadow_extras_count == 0); - SH_LOG("freed extras, now %d", d->arch.shadow_extras_count); + SH_VLOG("freed extras, now %d", d->arch.shadow_extras_count); if ( d->arch.shadow_dirty_bitmap != NULL ) { diff -r 40b887fa79d0 -r 29aab159846c xen/arch/x86/time.c --- a/xen/arch/x86/time.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/x86/time.c Mon Aug 15 18:32:29 2005 @@ -43,10 +43,7 @@ spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; int timer_ack = 0; unsigned long volatile jiffies; - -/* UTC time at system boot. */ -static s64 wc_sec; -static u32 wc_nsec; +static u32 wc_sec, wc_nsec; /* UTC time at last 'time update'. */ static spinlock_t wc_lock = SPIN_LOCK_UNLOCKED; struct time_scale { @@ -696,33 +693,18 @@ } /* Set clock to <secs,usecs> after 00:00:00 UTC, 1 January, 1970. */ -void do_settime(s64 secs, u32 nsecs, u64 system_time_base) -{ - s64 x; - u32 y; +void do_settime(unsigned long secs, unsigned long nsecs, u64 system_time_base) +{ + u64 x; + u32 y, _wc_sec, _wc_nsec; struct domain *d; shared_info_t *s; - x = (secs * 1000000000LL) + (u64)nsecs - system_time_base; - if ( x < 0 ) - { - /* -ve UTC offset => -ve seconds, +ve nanoseconds. */ - x = -x; - y = do_div(x, 1000000000); - x = -x; - if ( y != 0 ) - { - y = 1000000000 - y; - x--; - } - } - else - { - y = do_div(x, 1000000000); - } - - wc_sec = x; - wc_nsec = y; + x = (secs * 1000000000ULL) + (u64)nsecs - system_time_base; + y = do_div(x, 1000000000); + + wc_sec = _wc_sec = (u32)x; + wc_nsec = _wc_nsec = (u32)y; read_lock(&domlist_lock); spin_lock(&wc_lock); @@ -731,8 +713,8 @@ { s = d->shared_info; version_update_begin(&s->wc_version); - s->wc_sec = x; - s->wc_nsec = y; + s->wc_sec = _wc_sec; + s->wc_nsec = _wc_nsec; version_update_end(&s->wc_version); } diff -r 40b887fa79d0 -r 29aab159846c xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Fri Aug 12 17:35:15 2005 +++ b/xen/arch/x86/traps.c Mon Aug 15 18:32:29 2005 @@ -438,7 +438,7 @@ && KERNEL_MODE(v, regs) && ((regs->error_code & 3) == 3) && /* write-protection fault */ - ptwr_do_page_fault(d, addr) ) + ptwr_do_page_fault(d, addr, regs) ) { UNLOCK_BIGLOCK(d); return EXCRET_fault_fixed; @@ -471,8 +471,6 @@ if ( likely((fixup = search_exception_table(regs->eip)) != 0) ) { perfc_incrc(copy_user_faults); - if ( !shadow_mode_enabled(d) ) - DPRINTK("Page fault: %p -> %p\n", _p(regs->eip), _p(fixup)); regs->eip = fixup; return 0; } diff -r 40b887fa79d0 -r 29aab159846c xen/common/grant_table.c --- a/xen/common/grant_table.c Fri Aug 12 17:35:15 2005 +++ b/xen/common/grant_table.c Mon Aug 15 18:32:29 2005 @@ -6,6 +6,8 @@ * * Copyright (c) 2005 Christopher Clark * Copyright (c) 2004 K A Fraser + * Copyright (c) 2005 Andrew Warfield + * Modifications by Geoffrey Lefebvre are (c) Intel Research Cambridge * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,7 +52,7 @@ grant_table_t *t) { unsigned int h; - if ( unlikely((h = t->maptrack_head) == t->maptrack_limit) ) + if ( unlikely((h = t->maptrack_head) == (t->maptrack_limit - 1)) ) return -1; t->maptrack_head = t->maptrack[h].ref_and_flags >> MAPTRACK_REF_SHIFT; t->map_count++; @@ -73,7 +75,7 @@ struct domain *granting_d, grant_ref_t ref, u16 dev_hst_ro_flags, - unsigned long host_virt_addr, + unsigned long addr, unsigned long *pframe ) /* OUT */ { domid_t sdom; @@ -95,7 +97,7 @@ * Returns: * . -ve: error * . 1: ok - * . 0: ok and TLB invalidate of host_virt_addr needed. + * . 0: ok and TLB invalidate of host_addr needed. * * On success, *pframe contains mfn. */ @@ -121,6 +123,10 @@ sflags = sha->flags; sdom = sha->domid; + /* This loop attempts to set the access (reading/writing) flags + * in the grant table entry. It tries a cmpxchg on the field + * up to five times, and then fails under the assumption that + * the guest is misbehaving. */ for ( ; ; ) { u32 scombo, prev_scombo, new_scombo; @@ -253,28 +259,32 @@ /* * At this point: - * act->pin updated to reflect mapping. + * act->pin updated to reference count mappings. * sha->flags updated to indicate to granting domain mapping done. * frame contains the mfn. */ spin_unlock(&granting_d->grant_table->lock); - if ( (host_virt_addr != 0) && (dev_hst_ro_flags & GNTMAP_host_map) ) + if ( (addr != 0) && (dev_hst_ro_flags & GNTMAP_host_map) ) { /* Write update into the pagetable. */ l1_pgentry_t pte; pte = l1e_from_pfn(frame, GRANT_PTE_FLAGS); + + if ( (dev_hst_ro_flags & GNTMAP_application_map) ) + l1e_add_flags(pte,_PAGE_USER); if ( !(dev_hst_ro_flags & GNTMAP_readonly) ) l1e_add_flags(pte,_PAGE_RW); - rc = update_grant_va_mapping( host_virt_addr, pte, - mapping_d, mapping_ed ); - - /* - * IMPORTANT: (rc == 0) => must flush / invalidate entry in TLB. - * This is done in the outer gnttab_map_grant_ref. - */ - + + if ( dev_hst_ro_flags & GNTMAP_contains_pte ) + rc = update_grant_pte_mapping(addr, pte, mapping_d, mapping_ed); + else + rc = update_grant_va_mapping(addr, pte, mapping_d, mapping_ed); + + /* IMPORTANT: rc indicates the degree of TLB flush that is required. + * GNTST_flush_one (1) or GNTST_flush_all (2). This is done in the + * outer gnttab_map_grant_ref. */ if ( rc < 0 ) { /* Failure: undo and abort. */ @@ -317,6 +327,9 @@ /* * Returns 0 if TLB flush / invalidate required by caller. * va will indicate the address to be invalidated. + * + * addr is _either_ a host virtual address, or the address of the pte to + * update, as indicated by the GNTMAP_contains_pte flag. */ static int __gnttab_map_grant_ref( @@ -326,10 +339,10 @@ domid_t dom; grant_ref_t ref; struct domain *ld, *rd; - struct vcpu *led; + struct vcpu *led; u16 dev_hst_ro_flags; int handle; - unsigned long frame = 0, host_virt_addr; + unsigned long frame = 0, addr; int rc; led = current; @@ -338,19 +351,20 @@ /* Bitwise-OR avoids short-circuiting which screws control flow. */ if ( unlikely(__get_user(dom, &uop->dom) | __get_user(ref, &uop->ref) | - __get_user(host_virt_addr, &uop->host_virt_addr) | + __get_user(addr, &uop->host_addr) | __get_user(dev_hst_ro_flags, &uop->flags)) ) { DPRINTK("Fault while reading gnttab_map_grant_ref_t.\n"); return -EFAULT; /* don't set status */ } - - if ( ((host_virt_addr != 0) || (dev_hst_ro_flags & GNTMAP_host_map)) && - unlikely(!__addr_ok(host_virt_addr))) + if ( (dev_hst_ro_flags & GNTMAP_host_map) && + ( (addr == 0) || + (!(dev_hst_ro_flags & GNTMAP_contains_pte) && + unlikely(!__addr_ok(addr))) ) ) { DPRINTK("Bad virtual address (%lx) or flags (%x).\n", - host_virt_addr, dev_hst_ro_flags); + addr, dev_hst_ro_flags); (void)__put_user(GNTST_bad_virt_addr, &uop->handle); return GNTST_bad_gntref; } @@ -386,12 +400,20 @@ grant_mapping_t *new_mt; grant_table_t *lgt = ld->grant_table; + if ( (lgt->maptrack_limit << 1) > MAPTRACK_MAX_ENTRIES ) + { + put_domain(rd); + DPRINTK("Maptrack table is at maximum size.\n"); + (void)__put_user(GNTST_no_device_space, &uop->handle); + return GNTST_no_device_space; + } + /* Grow the maptrack table. */ new_mt = alloc_xenheap_pages(lgt->maptrack_order + 1); if ( new_mt == NULL ) { put_domain(rd); - DPRINTK("No more map handles available\n"); + DPRINTK("No more map handles available.\n"); (void)__put_user(GNTST_no_device_space, &uop->handle); return GNTST_no_device_space; } @@ -405,7 +427,7 @@ lgt->maptrack_order += 1; lgt->maptrack_limit <<= 1; - printk("Doubled maptrack size\n"); + DPRINTK("Doubled maptrack size\n"); handle = get_maptrack_handle(ld->grant_table); } @@ -416,7 +438,7 @@ if ( 0 <= ( rc = __gnttab_activate_grant_ref( ld, led, rd, ref, dev_hst_ro_flags, - host_virt_addr, &frame))) + addr, &frame))) { /* * Only make the maptrack live _after_ writing the pte, in case we @@ -430,8 +452,9 @@ (void)__put_user(frame, &uop->dev_bus_addr); - if ( dev_hst_ro_flags & GNTMAP_host_map ) - *va = host_virt_addr; + if ( ( dev_hst_ro_flags & GNTMAP_host_map ) && + !( dev_hst_ro_flags & GNTMAP_contains_pte) ) + *va = addr; (void)__put_user(handle, &uop->handle); } @@ -449,12 +472,12 @@ gnttab_map_grant_ref( gnttab_map_grant_ref_t *uop, unsigned int count) { - int i, flush = 0; + int i, rc, flush = 0; unsigned long va = 0; for ( i = 0; i < count; i++ ) - if ( __gnttab_map_grant_ref(&uop[i], &va) == 0 ) - flush++; + if ( (rc =__gnttab_map_grant_ref(&uop[i], &va)) >= 0 ) + flush += rc; if ( flush == 1 ) flush_tlb_one_mask(current->domain->cpumask, va); @@ -479,12 +502,12 @@ grant_mapping_t *map; u16 flags; s16 rc = 1; - unsigned long frame, virt; + unsigned long frame, addr; ld = current->domain; /* Bitwise-OR avoids short-circuiting which screws control flow. */ - if ( unlikely(__get_user(virt, &uop->host_virt_addr) | + if ( unlikely(__get_user(addr, &uop->host_addr) | __get_user(frame, &uop->dev_bus_addr) | __get_user(handle, &uop->handle)) ) { @@ -554,41 +577,19 @@ /* Frame is now unmapped for device access. */ } - if ( (virt != 0) && + if ( (addr != 0) && (flags & GNTMAP_host_map) && ((act->pin & (GNTPIN_hstw_mask | GNTPIN_hstr_mask)) > 0)) { - l1_pgentry_t *pl1e; - unsigned long _ol1e; - - pl1e = &linear_pg_table[l1_linear_offset(virt)]; - - if ( unlikely(__get_user(_ol1e, (unsigned long *)pl1e) != 0) ) - { - DPRINTK("Could not find PTE entry for address %lx\n", virt); - rc = -EINVAL; - goto unmap_out; - } - - /* - * Check that the virtual address supplied is actually mapped to - * act->frame. - */ - if ( unlikely((_ol1e >> PAGE_SHIFT) != frame )) - { - DPRINTK("PTE entry %lx for address %lx doesn't match frame %lx\n", - _ol1e, virt, frame); - rc = -EINVAL; - goto unmap_out; - } - - /* Delete pagetable entry. */ - if ( unlikely(__put_user(0, (unsigned long *)pl1e))) - { - DPRINTK("Cannot delete PTE entry at %p for virtual address %lx\n", - pl1e, virt); - rc = -EINVAL; - goto unmap_out; + if ( flags & GNTMAP_contains_pte ) + { + if ( (rc = clear_grant_pte_mapping(addr, frame, ld)) < 0 ) + goto unmap_out; + } + else + { + if ( (rc = clear_grant_va_mapping(addr, frame)) < 0 ) + goto unmap_out; } map->ref_and_flags &= ~GNTMAP_host_map; @@ -606,7 +607,8 @@ } rc = 0; - *va = virt; + if ( !( flags & GNTMAP_contains_pte) ) + *va = addr; } if ( (map->ref_and_flags & (GNTMAP_device_map|GNTMAP_host_map)) == 0) @@ -630,6 +632,7 @@ if ( act->pin == 0 ) { + act->frame = 0xdeadbeef; clear_bit(_GTF_reading, &sha->flags); put_page(&frame_table[frame]); } @@ -768,7 +771,7 @@ if ( sha_copy.flags ) { DPRINTK("Grant: dom (%hu) SHARED (%d) flags:(%hx) " - "dom:(%hu) frame:(%lx)\n", + "dom:(%hu) frame:(%x)\n", op.dom, i, sha_copy.flags, sha_copy.domid, sha_copy.frame); } } @@ -822,18 +825,20 @@ for (i = 0; i < count; i++) { gnttab_donate_t *gop = &uop[i]; #if GRANT_DEBUG - printk("gnttab_donate: i=%d mfn=%08x domid=%d gref=%08x\n", + printk("gnttab_donate: i=%d mfn=%lx domid=%d gref=%08x\n", i, gop->mfn, gop->domid, gop->handle); #endif page = &frame_table[gop->mfn]; - + if (unlikely(IS_XEN_HEAP_FRAME(page))) { - printk("gnttab_donate: xen heap frame mfn=%lx\n", (unsigned long) gop->mfn); + printk("gnttab_donate: xen heap frame mfn=%lx\n", + (unsigned long) gop->mfn); gop->status = GNTST_bad_virt_addr; continue; } if (unlikely(!pfn_valid(page_to_pfn(page)))) { - printk("gnttab_donate: invalid pfn for mfn=%lx\n", (unsigned long) gop->mfn); + printk("gnttab_donate: invalid pfn for mfn=%lx\n", + (unsigned long) gop->mfn); gop->status = GNTST_bad_virt_addr; continue; } @@ -859,7 +864,8 @@ if (unlikely((x & (PGC_count_mask|PGC_allocated)) != (1 | PGC_allocated)) || unlikely(_nd != _d)) { printk("gnttab_donate: Bad page values %p: ed=%p(%u), sd=%p," - " caf=%08x, taf=%" PRtype_info "\n", (void *) page_to_pfn(page), + " caf=%08x, taf=%" PRtype_info "\n", + (void *) page_to_pfn(page), d, d->domain_id, unpickle_domptr(_nd), x, page->u.inuse.type_info); spin_unlock(&d->page_alloc_lock); @@ -918,9 +924,9 @@ if (unlikely(test_bit(DOMFLAGS_DYING, &e->domain_flags)) || unlikely(e->tot_pages == e->max_pages) || unlikely(!gnttab_prepare_for_transfer(e, d, gop->handle))) { - printk("gnttab_donate: Transferee has no reservation headroom (%d,%d), or " - "provided a bad grant ref (%08x), or is dying (%p).\n", - e->tot_pages, e->max_pages, gop->handle, e->d_flags); + printk("gnttab_donate: Transferee has no reservation headroom (%d," + "%d) or provided a bad grant ref (%08x) or is dying (%p)\n", + e->tot_pages, e->max_pages, gop->handle, e->d_flags); spin_unlock(&e->page_alloc_lock); put_domain(e); result = GNTST_general_error; @@ -933,9 +939,9 @@ } list_add_tail(&page->list, &e->page_list); page_set_owner(page, e); - + spin_unlock(&e->page_alloc_lock); - + /* * Transfer is all done: tell the guest about its new page * frame. @@ -943,7 +949,7 @@ gnttab_notify_transfer(e, d, gop->handle, gop->mfn); put_domain(e); - + gop->status = GNTST_okay; } return result; @@ -954,48 +960,53 @@ unsigned int cmd, void *uop, unsigned int count) { long rc; - + struct domain *d = current->domain; + if ( count > 512 ) return -EINVAL; - - LOCK_BIGLOCK(current->domain); - + + LOCK_BIGLOCK(d); + + sync_pagetable_state(d); + rc = -EFAULT; switch ( cmd ) - { - case GNTTABOP_map_grant_ref: - if ( unlikely(!array_access_ok( - uop, count, sizeof(gnttab_map_grant_ref_t))) ) - goto out; - rc = gnttab_map_grant_ref((gnttab_map_grant_ref_t *)uop, count); - break; - case GNTTABOP_unmap_grant_ref: - if ( unlikely(!array_access_ok( - uop, count, sizeof(gnttab_unmap_grant_ref_t))) ) - goto out; - rc = gnttab_unmap_grant_ref((gnttab_unmap_grant_ref_t *)uop, count); - break; - case GNTTABOP_setup_table: - rc = gnttab_setup_table((gnttab_setup_table_t *)uop, count); - break; + { + case GNTTABOP_map_grant_ref: + if ( unlikely(!array_access_ok( + uop, count, sizeof(gnttab_map_grant_ref_t))) ) + goto out; + rc = gnttab_map_grant_ref((gnttab_map_grant_ref_t *)uop, count); + break; + case GNTTABOP_unmap_grant_ref: + if ( unlikely(!array_access_ok( + uop, count, sizeof(gnttab_unmap_grant_ref_t))) ) + goto out; + rc = gnttab_unmap_grant_ref((gnttab_unmap_grant_ref_t *)uop, + count); + break; + case GNTTABOP_setup_table: + rc = gnttab_setup_table((gnttab_setup_table_t *)uop, count); + break; #if GRANT_DEBUG - case GNTTABOP_dump_table: - rc = gnttab_dump_table((gnttab_dump_table_t *)uop); - break; + case GNTTABOP_dump_table: + rc = gnttab_dump_table((gnttab_dump_table_t *)uop); + break; #endif - case GNTTABOP_donate: - if (unlikely(!array_access_ok(uop, count, sizeof(gnttab_donate_t)))) - goto out; - rc = gnttab_donate(uop, count); - break; - default: - rc = -ENOSYS; - break; - } - -out: - UNLOCK_BIGLOCK(current->domain); - + case GNTTABOP_donate: + if (unlikely(!array_access_ok(uop, count, + sizeof(gnttab_donate_t)))) + goto out; + rc = gnttab_donate(uop, count); + break; + default: + rc = -ENOSYS; + break; + } + + out: + UNLOCK_BIGLOCK(d); + return rc; } @@ -1009,106 +1020,101 @@ * Called a _lot_ at domain creation because pages mapped by priv domains * also traverse this. */ - + /* Note: If the same frame is mapped multiple times, and then one of * the ptes is overwritten, which maptrack handle gets invalidated? * Advice: Don't do it. Explicitly unmap. */ - + unsigned int handle, ref, refcount; grant_table_t *lgt, *rgt; active_grant_entry_t *act; grant_mapping_t *map; int found = 0; - + lgt = ld->grant_table; - + #if GRANT_DEBUG_VERBOSE - if ( ld->domain_id != 0 ) - { - DPRINTK("Foreign unref rd(%d) ld(%d) frm(%x) flgs(%x).\n", - rd->domain_id, ld->domain_id, frame, readonly); - } + if ( ld->domain_ id != 0 ) { + DPRINTK("Foreign unref rd(%d) ld(%d) frm(%lx) flgs(%x).\n", + rd->domain_id, ld->domain_id, frame, readonly); + } #endif - + /* Fast exit if we're not mapping anything using grant tables */ if ( lgt->map_count == 0 ) return 0; - - if ( get_domain(rd) == 0 ) - { + + if ( get_domain(rd) == 0 ) { DPRINTK("gnttab_check_unmap: couldn't get_domain rd(%d)\n", rd->domain_id); return 0; } - + rgt = rd->grant_table; - - for ( handle = 0; handle < lgt->maptrack_limit; handle++ ) - { + + for ( handle = 0; handle < lgt->maptrack_limit; handle++ ) { + map = &lgt->maptrack[handle]; - + if ( map->domid != rd->domain_id ) continue; - + if ( ( map->ref_and_flags & MAPTRACK_GNTMAP_MASK ) && - ( readonly ? 1 : (!(map->ref_and_flags & GNTMAP_readonly)))) - { + ( readonly ? 1 : (!(map->ref_and_flags & GNTMAP_readonly)))) { + ref = (map->ref_and_flags >> MAPTRACK_REF_SHIFT); act = &rgt->active[ref]; - + spin_lock(&rgt->lock); - - if ( act->frame != frame ) - { + + if ( act->frame != frame ) { spin_unlock(&rgt->lock); continue; } - + refcount = act->pin & ( readonly ? GNTPIN_hstr_mask - : GNTPIN_hstw_mask ); - if ( refcount == 0 ) - { + : GNTPIN_hstw_mask ); + + if ( refcount == 0 ) { spin_unlock(&rgt->lock); continue; } - + /* gotcha */ DPRINTK("Grant unref rd(%d) ld(%d) frm(%lx) flgs(%x).\n", rd->domain_id, ld->domain_id, frame, readonly); - + if ( readonly ) act->pin -= GNTPIN_hstr_inc; - else - { + else { act->pin -= GNTPIN_hstw_inc; - + /* any more granted writable mappings? */ - if ( (act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) == 0 ) - { + if ( (act->pin & (GNTPIN_hstw_mask|GNTPIN_devw_mask)) == 0 ) { clear_bit(_GTF_writing, &rgt->shared[ref].flags); put_page_type(&frame_table[frame]); } } - - if ( act->pin == 0 ) - { + + if ( act->pin == 0 ) { clear_bit(_GTF_reading, &rgt->shared[ref].flags); put_page(&frame_table[frame]); } + spin_unlock(&rgt->lock); - + clear_bit(GNTMAP_host_map, &map->ref_and_flags); - + if ( !(map->ref_and_flags & GNTMAP_device_map) ) put_maptrack_handle(lgt, handle); - + found = 1; break; } } put_domain(rd); - + return found; } @@ -1124,8 +1130,10 @@ int retries = 0; unsigned long target_pfn; +#if GRANT_DEBUG_VERBOSE DPRINTK("gnttab_prepare_for_transfer rd(%hu) ld(%hu) ref(%hu).\n", rd->domain_id, ld->domain_id, ref); +#endif if ( unlikely((rgt = rd->grant_table) == NULL) || unlikely(ref >= NR_GRANT_ENTRIES) ) @@ -1203,8 +1211,10 @@ grant_entry_t *sha; unsigned long pfn; +#if GRANT_DEBUG_VERBOSE DPRINTK("gnttab_notify_transfer rd(%hu) ld(%hu) ref(%hu).\n", rd->domain_id, ld->domain_id, ref); +#endif sha = &rd->grant_table->shared[ref]; diff -r 40b887fa79d0 -r 29aab159846c xen/common/perfc.c --- a/xen/common/perfc.c Fri Aug 12 17:35:15 2005 +++ b/xen/common/perfc.c Mon Aug 15 18:32:29 2005 @@ -7,6 +7,7 @@ #include <xen/spinlock.h> #include <public/dom0_ops.h> #include <asm/uaccess.h> +#include <xen/mm.h> #undef PERFCOUNTER #undef PERFCOUNTER_CPU @@ -81,6 +82,10 @@ } printk("\n"); } + +#ifdef PERF_ARRAYS + ptwr_eip_stat_print(); +#endif } void perfc_reset(unsigned char key) @@ -118,6 +123,10 @@ break; } } + +#ifdef PERF_ARRAYS + ptwr_eip_stat_reset(); +#endif } static dom0_perfc_desc_t perfc_d[NR_PERFCTRS]; diff -r 40b887fa79d0 -r 29aab159846c xen/include/asm-x86/mm.h --- a/xen/include/asm-x86/mm.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/asm-x86/mm.h Mon Aug 15 18:32:29 2005 @@ -90,12 +90,9 @@ #define PGT_va_shift 32 #define PGT_va_mask ((unsigned long)((1U<<28)-1)<<PGT_va_shift) /* Is the back pointer still mutable (i.e. not fixed yet)? */ - /* Use PML4 slot for HYPERVISOR_VIRT_START. - 18 = L4_PAGETABLE_SHIFT - L2_PAGETABLE_SHIFT */ -#define PGT_va_mutable ((unsigned long)(256U<<18)<<PGT_va_shift) +#define PGT_va_mutable ((unsigned long)((1U<<28)-1)<<PGT_va_shift) /* Is the back pointer unknown (e.g., p.t. is mapped at multiple VAs)? */ - /* Use PML4 slot for HYPERVISOR_VIRT_START + 1 */ -#define PGT_va_unknown ((unsigned long)(257U<<18)<<PGT_va_shift) +#define PGT_va_unknown ((unsigned long)((1U<<28)-2)<<PGT_va_shift) #endif /* 16-bit count of uses of this frame as its current type. */ @@ -316,6 +313,9 @@ unsigned int prev_nr_updates; /* Exec domain which created writable mapping. */ struct vcpu *vcpu; + /* EIP of the address which took the original write fault + used for stats collection only */ + unsigned long eip; }; #define PTWR_PT_ACTIVE 0 @@ -327,7 +327,8 @@ int ptwr_init(struct domain *); void ptwr_destroy(struct domain *); void ptwr_flush(struct domain *, const int); -int ptwr_do_page_fault(struct domain *, unsigned long); +int ptwr_do_page_fault(struct domain *, unsigned long, + struct cpu_user_regs *); int revalidate_l1(struct domain *, l1_pgentry_t *, l1_pgentry_t *); void cleanup_writable_pagetable(struct domain *d); @@ -350,6 +351,18 @@ #define _audit_domain(_d, _f) ((void)0) #define audit_domain(_d) ((void)0) #define audit_domains() ((void)0) + +#endif + +#ifdef PERF_ARRAYS + +void ptwr_eip_stat_reset(); +void ptwr_eip_stat_print(); + +#else + +#define ptwr_eip_stat_reset() ((void)0) +#define ptwr_eip_stat_print() ((void)0) #endif @@ -361,8 +374,14 @@ * Caller must own d's BIGLOCK, is responsible for flushing the TLB, and must * hold a reference to the page. */ -int update_grant_va_mapping(unsigned long va, - l1_pgentry_t _nl1e, - struct domain *d, - struct vcpu *v); +int update_grant_va_mapping( + unsigned long va, l1_pgentry_t _nl1e, + struct domain *d, struct vcpu *v); +int update_grant_pte_mapping( + unsigned long pte_addr, l1_pgentry_t _nl1e, + struct domain *d, struct vcpu *v); +int clear_grant_va_mapping(unsigned long addr, unsigned long frame); +int clear_grant_pte_mapping( + unsigned long addr, unsigned long frame, struct domain *d); + #endif /* __ASM_X86_MM_H__ */ diff -r 40b887fa79d0 -r 29aab159846c xen/include/asm-x86/shadow.h --- a/xen/include/asm-x86/shadow.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/asm-x86/shadow.h Mon Aug 15 18:32:29 2005 @@ -483,9 +483,9 @@ #ifndef NDEBUG else if ( mfn < max_page ) { - SH_LOG("mark_dirty OOR! mfn=%x pfn=%lx max=%x (dom %p)", + SH_VLOG("mark_dirty OOR! mfn=%x pfn=%lx max=%x (dom %p)", mfn, pfn, d->arch.shadow_dirty_bitmap_size, d); - SH_LOG("dom=%p caf=%08x taf=%" PRtype_info, + SH_VLOG("dom=%p caf=%08x taf=%" PRtype_info, page_get_owner(&frame_table[mfn]), frame_table[mfn].count_info, frame_table[mfn].u.inuse.type_info ); @@ -736,7 +736,7 @@ if ( unlikely(!VALID_MFN(gmfn)) ) { - SH_LOG("l1pte_write_fault: invalid gpfn=%lx", gpfn); + SH_VLOG("l1pte_write_fault: invalid gpfn=%lx", gpfn); *spte_p = l1e_empty(); return 0; } @@ -770,7 +770,7 @@ if ( unlikely(!VALID_MFN(mfn)) ) { - SH_LOG("l1pte_read_fault: invalid gpfn=%lx", pfn); + SH_VLOG("l1pte_read_fault: invalid gpfn=%lx", pfn); *spte_p = l1e_empty(); return 0; } @@ -1472,7 +1472,7 @@ /* We need to allocate a new node. Ensure the quicklist is non-empty. */ if ( unlikely(d->arch.shadow_ht_free == NULL) ) { - SH_LOG("Allocate more shadow hashtable blocks."); + SH_VLOG("Allocate more shadow hashtable blocks."); extra = xmalloc_bytes( sizeof(void *) + (shadow_ht_extra_size * sizeof(*x))); diff -r 40b887fa79d0 -r 29aab159846c xen/include/public/dom0_ops.h --- a/xen/include/public/dom0_ops.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/public/dom0_ops.h Mon Aug 15 18:32:29 2005 @@ -133,12 +133,11 @@ /* * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC, * 1 January, 1970 if the current system time was <system_time>. - * NB. <secs> can be negative, but <nsecs> must always be non-negative. */ #define DOM0_SETTIME 17 typedef struct { /* IN variables. */ - s64 secs; + u32 secs; u32 nsecs; u64 system_time; } dom0_settime_t; diff -r 40b887fa79d0 -r 29aab159846c xen/include/public/grant_table.h --- a/xen/include/public/grant_table.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/public/grant_table.h Mon Aug 15 18:32:29 2005 @@ -142,7 +142,10 @@ * 1. If GNTPIN_map_for_dev is specified then <dev_bus_addr> is the address * via which I/O devices may access the granted frame. * 2. If GNTPIN_map_for_host is specified then a mapping will be added at - * virtual address <host_virt_addr> in the current address space. + * either a host virtual address in the current address space, or at + * a PTE at the specified machine address. The type of mapping to + * perform is selected through the GNTMAP_contains_pte flag, and the + * address is specified in <host_addr>. * 3. Mappings should only be destroyed via GNTTABOP_unmap_grant_ref. If a * host mapping is destroyed by other means then it is *NOT* guaranteed * to be accounted to the correct grant reference! @@ -150,7 +153,7 @@ #define GNTTABOP_map_grant_ref 0 typedef struct gnttab_map_grant_ref { /* IN parameters. */ - memory_t host_virt_addr; + memory_t host_addr; domid_t dom; grant_ref_t ref; u16 flags; /* GNTMAP_* */ @@ -161,7 +164,7 @@ /* * GNTTABOP_unmap_grant_ref: Destroy one or more grant-reference mappings - * tracked by <handle>. If <host_virt_addr> or <dev_bus_addr> is zero, that + * tracked by <handle>. If <host_addr> or <dev_bus_addr> is zero, that * field is ignored. If non-zero, they must refer to a device/host mapping * that is tracked by <handle> * NOTES: @@ -173,7 +176,7 @@ #define GNTTABOP_unmap_grant_ref 1 typedef struct gnttab_unmap_grant_ref { /* IN parameters. */ - memory_t host_virt_addr; + memory_t host_addr; memory_t dev_bus_addr; u16 handle; /* OUT parameters. */ @@ -247,10 +250,18 @@ #define _GNTMAP_application_map (3) #define GNTMAP_application_map (1<<_GNTMAP_application_map) + /* + * GNTMAP_contains_pte subflag: + * 0 => This map request contains a host virtual address. + * 1 => This map request contains the machine addess of the PTE to update. + */ +#define _GNTMAP_contains_pte (4) +#define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) + /* * Values for error status returns. All errors are -ve. */ -#define GNTST_okay (0) +#define GNTST_okay (0) /* Normal return. */ #define GNTST_general_error (-1) /* General undefined error. */ #define GNTST_bad_domain (-2) /* Unrecognsed domain id. */ #define GNTST_bad_gntref (-3) /* Unrecognised or inappropriate gntref. */ diff -r 40b887fa79d0 -r 29aab159846c xen/include/public/io/domain_controller.h --- a/xen/include/public/io/domain_controller.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/public/io/domain_controller.h Mon Aug 15 18:32:29 2005 @@ -365,8 +365,10 @@ */ typedef struct netif_fe_interface_connect { u32 handle; - memory_t tx_shmem_frame; + memory_t tx_shmem_frame; + int tx_shmem_ref; memory_t rx_shmem_frame; + int rx_shmem_ref; } netif_fe_interface_connect_t; /* @@ -487,7 +489,9 @@ domid_t domid; /* Domain attached to new interface. */ u32 netif_handle; /* Domain-specific interface handle. */ memory_t tx_shmem_frame; /* Page cont. tx shared comms window. */ + int tx_shmem_ref; /* Grant reference for above */ memory_t rx_shmem_frame; /* Page cont. rx shared comms window. */ + int rx_shmem_ref; /* Grant reference for above */ u16 evtchn; /* Event channel for notifications. */ /* OUT */ u32 status; diff -r 40b887fa79d0 -r 29aab159846c xen/include/public/xen.h --- a/xen/include/public/xen.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/public/xen.h Mon Aug 15 18:32:29 2005 @@ -399,12 +399,11 @@ /* * Wallclock time: updated only by control software. Guests should base - * their gettimeofday() syscall on this wallclock-base value, which - * indicates UTC when system_time == 0 (i.e., at boot). + * their gettimeofday() syscall on this wallclock-base value. */ u32 wc_version; /* Version counter: see vcpu_time_info_t. */ - u32 wc_nsec; /* Nsecs since 00:00:00 UTC, Jan 1, 1970. */ - s64 wc_sec; /* Secs since 00:00:00 UTC, Jan 1, 1970. */ + u32 wc_sec; /* Secs 00:00:00 UTC, Jan 1, 1970. */ + u32 wc_nsec; /* Nsecs 00:00:00 UTC, Jan 1, 1970. */ arch_shared_info_t arch; diff -r 40b887fa79d0 -r 29aab159846c xen/include/xen/grant_table.h --- a/xen/include/xen/grant_table.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/xen/grant_table.h Mon Aug 15 18:32:29 2005 @@ -53,19 +53,20 @@ #define ORDER_GRANT_FRAMES 2 #define NR_GRANT_FRAMES (1U << ORDER_GRANT_FRAMES) -#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t)) - +#define NR_GRANT_ENTRIES \ + ((NR_GRANT_FRAMES << PAGE_SHIFT) / sizeof(grant_entry_t)) /* * Tracks a mapping of another domain's grant reference. Each domain has a * table of these, indexes into which are returned as a 'mapping handle'. */ typedef struct { - u16 ref_and_flags; /* 0-2: GNTMAP_* ; 3-15: grant ref */ + u16 ref_and_flags; /* 0-4: GNTMAP_* ; 5-15: grant ref */ domid_t domid; /* granting domain */ } grant_mapping_t; -#define MAPTRACK_GNTMAP_MASK 7 -#define MAPTRACK_REF_SHIFT 3 +#define MAPTRACK_GNTMAP_MASK 0x1f +#define MAPTRACK_REF_SHIFT 5 +#define MAPTRACK_MAX_ENTRIES (1 << (16 - MAPTRACK_REF_SHIFT)) /* Per-domain grant information. */ typedef struct { @@ -108,10 +109,15 @@ /* Notify 'rd' of a completed transfer via an already-locked grant entry. */ void gnttab_notify_transfer( - struct domain *rd, struct domain *ld, grant_ref_t ref, unsigned long frame); + struct domain *rd, struct domain *ld, + grant_ref_t ref, unsigned long frame); -/* Pre-domain destruction release of granted device mappings of other domains.*/ +/* Domain death release of granted device mappings of other domains.*/ void gnttab_release_dev_mappings(grant_table_t *gt); +/* Extra GNTST_ values, for internal use only. */ +#define GNTST_flush_all (2) /* Success, need to flush entire TLB. */ +#define GNTST_flush_one (1) /* Success, need to flush a vaddr. */ + #endif /* __XEN_GRANT_H__ */ diff -r 40b887fa79d0 -r 29aab159846c xen/include/xen/time.h --- a/xen/include/xen/time.h Fri Aug 12 17:35:15 2005 +++ b/xen/include/xen/time.h Mon Aug 15 18:32:29 2005 @@ -56,7 +56,8 @@ #define MICROSECS(_us) ((s_time_t)((_us) * 1000ULL)) extern void update_dom_time(struct vcpu *v); -extern void do_settime(s64 secs, u32 nsecs, u64 system_time_base); +extern void do_settime( + unsigned long secs, unsigned long nsecs, u64 system_time_base); #endif /* __XEN_TIME_H__ */ diff -r 40b887fa79d0 -r 29aab159846c patches/linux-2.6.12/patch-2.6.12.5 --- /dev/null Fri Aug 12 17:35:15 2005 +++ b/patches/linux-2.6.12/patch-2.6.12.5 Mon Aug 15 18:32:29 2005 @@ -0,0 +1,1614 @@ +diff --git a/Makefile b/Makefile +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + VERSION = 2 + PATCHLEVEL = 6 + SUBLEVEL = 12 +-EXTRAVERSION = ++EXTRAVERSION = .5 + NAME=Woozy Numbat + + # *DOCUMENTATION* +@@ -1149,7 +1149,7 @@ endif # KBUILD_EXTMOD + #(which is the most common case IMHO) to avoid unneeded clutter in the big tags file. + #Adding $(srctree) adds about 20M on i386 to the size of the output file! + +-ifeq ($(KBUILD_OUTPUT),) ++ifeq ($(src),$(obj)) + __srctree = + else + __srctree = $(srctree)/ +diff --git a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c +--- a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c ++++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c +@@ -44,7 +44,7 @@ + + #define PFX "powernow-k8: " + #define BFX PFX "BIOS error: " +-#define VERSION "version 1.40.2" ++#define VERSION "version 1.40.4" + #include "powernow-k8.h" + + /* serialize freq changes */ +@@ -978,7 +978,7 @@ static int __init powernowk8_cpu_init(st + { + struct powernow_k8_data *data; + cpumask_t oldmask = CPU_MASK_ALL; +- int rc; ++ int rc, i; + + if (!check_supported_cpu(pol->cpu)) + return -ENODEV; +@@ -1064,7 +1064,9 @@ static int __init powernowk8_cpu_init(st + printk("cpu_init done, current fid 0x%x, vid 0x%x\n", + data->currfid, data->currvid); + +- powernow_data[pol->cpu] = data; ++ for_each_cpu_mask(i, cpu_core_map[pol->cpu]) { ++ powernow_data[i] = data; ++ } + + return 0; + +diff --git a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c +--- a/arch/i386/kernel/process.c ++++ b/arch/i386/kernel/process.c +@@ -827,6 +827,8 @@ asmlinkage int sys_get_thread_area(struc + if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) + return -EINVAL; + ++ memset(&info, 0, sizeof(info)); ++ + desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN; + + info.entry_number = idx; +diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c +--- a/arch/ia64/kernel/ptrace.c ++++ b/arch/ia64/kernel/ptrace.c +@@ -945,6 +945,13 @@ access_uarea (struct task_struct *child, + *data = (pt->cr_ipsr & IPSR_MASK); + return 0; + ++ case PT_AR_RSC: ++ if (write_access) ++ pt->ar_rsc = *data | (3 << 2); /* force PL3 */ ++ else ++ *data = pt->ar_rsc; ++ return 0; ++ + case PT_AR_RNAT: + urbs_end = ia64_get_user_rbs_end(child, pt, NULL); + rnat_addr = (long) ia64_rse_rnat_addr((long *) +@@ -996,9 +1003,6 @@ access_uarea (struct task_struct *child, + case PT_AR_BSPSTORE: + ptr = pt_reg_addr(pt, ar_bspstore); + break; +- case PT_AR_RSC: +- ptr = pt_reg_addr(pt, ar_rsc); +- break; + case PT_AR_UNAT: + ptr = pt_reg_addr(pt, ar_unat); + break; +@@ -1234,7 +1238,7 @@ ptrace_getregs (struct task_struct *chil + static long + ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) + { +- unsigned long psr, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; ++ unsigned long psr, rsc, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; + struct unw_frame_info info; + struct switch_stack *sw; + struct ia64_fpreg fpval; +@@ -1267,7 +1271,7 @@ ptrace_setregs (struct task_struct *chil + /* app regs */ + + retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); +- retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]); ++ retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]); + retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); + retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); + retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); +@@ -1365,6 +1369,7 @@ ptrace_setregs (struct task_struct *chil + retval |= __get_user(nat_bits, &ppr->nat); + + retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); ++ retval |= access_uarea(child, PT_AR_RSC, &rsc, 1); + retval |= access_uarea(child, PT_AR_EC, &ec, 1); + retval |= access_uarea(child, PT_AR_LC, &lc, 1); + retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); +diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c +--- a/arch/ia64/kernel/signal.c ++++ b/arch/ia64/kernel/signal.c +@@ -94,7 +94,7 @@ sys_sigaltstack (const stack_t __user *u + static long + restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) + { +- unsigned long ip, flags, nat, um, cfm; ++ unsigned long ip, flags, nat, um, cfm, rsc; + long err; + + /* Always make any pending restarted system calls return -EINTR */ +@@ -106,7 +106,7 @@ restore_sigcontext (struct sigcontext __ + err |= __get_user(ip, &sc->sc_ip); /* instruction pointer */ + err |= __get_user(cfm, &sc->sc_cfm); + err |= __get_user(um, &sc->sc_um); /* user mask */ +- err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc); ++ err |= __get_user(rsc, &sc->sc_ar_rsc); + err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat); + err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); + err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs); +@@ -119,6 +119,7 @@ restore_sigcontext (struct sigcontext __ + err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8); /* r15 */ + + scr->pt.cr_ifs = cfm | (1UL << 63); ++ scr->pt.ar_rsc = rsc | (3 << 2); /* force PL3 */ + + /* establish new instruction pointer: */ + scr->pt.cr_iip = ip & ~0x3UL; +diff --git a/arch/ppc/kernel/time.c b/arch/ppc/kernel/time.c +--- a/arch/ppc/kernel/time.c ++++ b/arch/ppc/kernel/time.c +@@ -89,6 +89,9 @@ unsigned long tb_to_ns_scale; + + extern unsigned long wall_jiffies; + ++/* used for timezone offset */ ++static long timezone_offset; ++ + DEFINE_SPINLOCK(rtc_lock); + + EXPORT_SYMBOL(rtc_lock); +@@ -170,7 +173,7 @@ void timer_interrupt(struct pt_regs * re + xtime.tv_sec - last_rtc_update >= 659 && + abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ && + jiffies - wall_jiffies == 1) { +- if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0) ++ if (ppc_md.set_rtc_time(xtime.tv_sec+1 + timezone_offset) == 0) + last_rtc_update = xtime.tv_sec+1; + else + /* Try again one minute later */ +@@ -286,7 +289,7 @@ void __init time_init(void) + unsigned old_stamp, stamp, elapsed; + + if (ppc_md.time_init != NULL) +- time_offset = ppc_md.time_init(); ++ timezone_offset = ppc_md.time_init(); + + if (__USE_RTC()) { + /* 601 processor: dec counts down by 128 every 128ns */ +@@ -331,10 +334,10 @@ void __init time_init(void) + set_dec(tb_ticks_per_jiffy); + + /* If platform provided a timezone (pmac), we correct the time */ +- if (time_offset) { +- sys_tz.tz_minuteswest = -time_offset / 60; ++ if (timezone_offset) { ++ sys_tz.tz_minuteswest = -timezone_offset / 60; + sys_tz.tz_dsttime = 0; +- xtime.tv_sec -= time_offset; ++ xtime.tv_sec -= timezone_offset; + } + set_normalized_timespec(&wall_to_monotonic, + -xtime.tv_sec, -xtime.tv_nsec); +diff --git a/arch/ppc64/boot/zlib.c b/arch/ppc64/boot/zlib.c +--- a/arch/ppc64/boot/zlib.c ++++ b/arch/ppc64/boot/zlib.c +@@ -1307,7 +1307,7 @@ local int huft_build( + { + *t = (inflate_huft *)Z_NULL; + *m = 0; +- return Z_OK; ++ return Z_DATA_ERROR; + } + + +@@ -1351,6 +1351,7 @@ local int huft_build( + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); ++ n = x[g]; /* set n to length of v */ + + + /* Generate the Huffman codes and for each, make the table entries */ +diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c +--- a/arch/um/kernel/process.c ++++ b/arch/um/kernel/process.c +@@ -130,7 +130,7 @@ int start_fork_tramp(void *thread_arg, u + return(arg.pid); + } + +-static int ptrace_child(void) ++static int ptrace_child(void *arg) + { + int ret; + int pid = os_getpid(), ppid = getppid(); +@@ -159,16 +159,20 @@ static int ptrace_child(void) + _exit(ret); + } + +-static int start_ptraced_child(void) ++static int start_ptraced_child(void **stack_out) + { ++ void *stack; ++ unsigned long sp; + int pid, n, status; + +- pid = fork(); +- if(pid == 0) +- ptrace_child(); +- ++ stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, ++ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); ++ if(stack == MAP_FAILED) ++ panic("check_ptrace : mmap failed, errno = %d", errno); ++ sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); ++ pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); + if(pid < 0) +- panic("check_ptrace : fork failed, errno = %d", errno); ++ panic("check_ptrace : clone failed, errno = %d", errno); + CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0) + panic("check_ptrace : wait failed, errno = %d", errno); +@@ -176,6 +180,7 @@ static int start_ptraced_child(void) + panic("check_ptrace : expected SIGSTOP, got status = %d", + status); + ++ *stack_out = stack; + return(pid); + } + +@@ -183,12 +188,12 @@ static int start_ptraced_child(void) + * just avoid using sysemu, not panic, but only if SYSEMU features are broken. + * So only for SYSEMU features we test mustpanic, while normal host features + * must work anyway!*/ +-static int stop_ptraced_child(int pid, int exitcode, int mustexit) ++static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic) + { + int status, n, ret = 0; + + if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) +- panic("stop_ptraced_child : ptrace failed, errno = %d", errno); ++ panic("check_ptrace : ptrace failed, errno = %d", errno); + CATCH_EINTR(n = waitpid(pid, &status, 0)); + if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { + int exit_with = WEXITSTATUS(status); +@@ -199,13 +204,15 @@ static int stop_ptraced_child(int pid, i + printk("check_ptrace : child exited with exitcode %d, while " + "expecting %d; status 0x%x", exit_with, + exitcode, status); +- if (mustexit) ++ if (mustpanic) + panic("\n"); + else + printk("\n"); + ret = -1; + } + ++ if(munmap(stack, PAGE_SIZE) < 0) ++ panic("check_ptrace : munmap failed, errno = %d", errno); + return ret; + } + +@@ -227,11 +234,12 @@ __uml_setup("nosysemu", nosysemu_cmd_par + + static void __init check_sysemu(void) + { ++ void *stack; + int pid, syscall, n, status, count=0; + + printk("Checking syscall emulation patch for ptrace..."); + sysemu_supported = 0; +- pid = start_ptraced_child(); ++ pid = start_ptraced_child(&stack); + + if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0) + goto fail; +@@ -249,7 +257,7 @@ static void __init check_sysemu(void) + panic("check_sysemu : failed to modify system " + "call return, errno = %d", errno); + +- if (stop_ptraced_child(pid, 0, 0) < 0) ++ if (stop_ptraced_child(pid, stack, 0, 0) < 0) + goto fail_stopped; + + sysemu_supported = 1; +@@ -257,7 +265,7 @@ static void __init check_sysemu(void) + set_using_sysemu(!force_sysemu_disabled); + + printk("Checking advanced syscall emulation patch for ptrace..."); +- pid = start_ptraced_child(); ++ pid = start_ptraced_child(&stack); + while(1){ + count++; + if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0) +@@ -282,7 +290,7 @@ static void __init check_sysemu(void) + break; + } + } +- if (stop_ptraced_child(pid, 0, 0) < 0) ++ if (stop_ptraced_child(pid, stack, 0, 0) < 0) + goto fail_stopped; + + sysemu_supported = 2; +@@ -293,17 +301,18 @@ static void __init check_sysemu(void) + return; + + fail: +- stop_ptraced_child(pid, 1, 0); ++ stop_ptraced_child(pid, stack, 1, 0); + fail_stopped: + printk("missing\n"); + } + + void __init check_ptrace(void) + { ++ void *stack; + int pid, syscall, n, status; + + printk("Checking that ptrace can change system call numbers..."); +- pid = start_ptraced_child(); ++ pid = start_ptraced_child(&stack); + + if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) + panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno); +@@ -330,7 +339,7 @@ void __init check_ptrace(void) + break; + } + } +- stop_ptraced_child(pid, 0, 1); ++ stop_ptraced_child(pid, stack, 0, 1); + printk("OK\n"); + check_sysemu(); + } +@@ -362,10 +371,11 @@ void forward_pending_sigio(int target) + static inline int check_skas3_ptrace_support(void) + { + struct ptrace_faultinfo fi; ++ void *stack; + int pid, n, ret = 1; + + printf("Checking for the skas3 patch in the host..."); +- pid = start_ptraced_child(); ++ pid = start_ptraced_child(&stack); + + n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); + if (n < 0) { +@@ -380,7 +390,7 @@ static inline int check_skas3_ptrace_sup + } + + init_registers(pid); +- stop_ptraced_child(pid, 1, 1); ++ stop_ptraced_child(pid, stack, 1, 1); + + return(ret); + } +diff --git a/arch/x86_64/ia32/syscall32.c b/arch/x86_64/ia32/syscall32.c +--- a/arch/x86_64/ia32/syscall32.c ++++ b/arch/x86_64/ia32/syscall32.c +@@ -57,6 +57,7 @@ int syscall32_setup_pages(struct linux_b + int npages = (VSYSCALL32_END - VSYSCALL32_BASE) >> PAGE_SHIFT; + struct vm_area_struct *vma; + struct mm_struct *mm = current->mm; ++ int ret; + + vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); + if (!vma) +@@ -78,7 +79,11 @@ int syscall32_setup_pages(struct linux_b + vma->vm_mm = mm; + + down_write(&mm->mmap_sem); +- insert_vm_struct(mm, vma); ++ if ((ret = insert_vm_struct(mm, vma))) { ++ up_write(&mm->mmap_sem); ++ kmem_cache_free(vm_area_cachep, vma); ++ return ret; ++ } + mm->total_vm += npages; + up_write(&mm->mmap_sem); + return 0; +diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c +--- a/arch/x86_64/kernel/setup.c ++++ b/arch/x86_64/kernel/setup.c +@@ -729,8 +729,6 @@ static void __init amd_detect_cmp(struct + int cpu = smp_processor_id(); + int node = 0; + unsigned bits; +- if (c->x86_num_cores == 1) +- return; + + bits = 0; + while ((1 << bits) < c->x86_num_cores) +diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c +--- a/arch/x86_64/kernel/smp.c ++++ b/arch/x86_64/kernel/smp.c +@@ -284,6 +284,71 @@ struct call_data_struct { + static struct call_data_struct * call_data; + + /* ++ * this function sends a 'generic call function' IPI to one other CPU ++ * in the system. ++ */ ++static void __smp_call_function_single (int cpu, void (*func) (void *info), void *info, ++ int nonatomic, int wait) ++{ ++ struct call_data_struct data; ++ int cpus = 1; ++ ++ data.func = func; ++ data.info = info; ++ atomic_set(&data.started, 0); ++ data.wait = wait; ++ if (wait) ++ atomic_set(&data.finished, 0); ++ ++ call_data = &data; ++ wmb(); ++ /* Send a message to all other CPUs and wait for them to respond */ ++ send_IPI_mask(cpumask_of_cpu(cpu), CALL_FUNCTION_VECTOR); ++ ++ /* Wait for response */ ++ while (atomic_read(&data.started) != cpus) ++ cpu_relax(); ++ ++ if (!wait) ++ return; ++ ++ while (atomic_read(&data.finished) != cpus) ++ cpu_relax(); ++} ++ ++/* ++ * Run a function on another CPU ++ * <func> The function to run. This must be fast and non-blocking. ++ * <info> An arbitrary pointer to pass to the function. ++ * <nonatomic> Currently unused. ++ * <wait> If true, wait until function has completed on other CPUs. ++ * [RETURNS] 0 on success, else a negative status code. ++ * ++ * Does not return until the remote CPU is nearly ready to execute <func> ++ * or is or has executed. ++ */ ++ ++int smp_call_function_single (int cpu, void (*func) (void *info), void *info, ++ int nonatomic, int wait) ++{ ++ ++ int me = get_cpu(); /* prevent preemption and reschedule on another processor */ ++ ++ if (cpu == me) { ++ printk("%s: trying to call self\n", __func__); ++ put_cpu(); ++ return -EBUSY; ++ } ++ spin_lock_bh(&call_lock); ++ ++ __smp_call_function_single(cpu, func,info,nonatomic,wait); ++ ++ spin_unlock_bh(&call_lock); ++ put_cpu(); ++ return 0; ++} ++ ++/* + * this function sends a 'generic call function' IPI to all other CPUs + * in the system. + */ +diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c +--- a/arch/x86_64/kernel/smpboot.c ++++ b/arch/x86_64/kernel/smpboot.c +@@ -202,9 +202,6 @@ static __cpuinit void sync_master(void * + { + unsigned long flags, i; + +- if (smp_processor_id() != boot_cpu_id) +- return; +- + go[MASTER] = 0; + + local_irq_save(flags); +@@ -253,7 +250,7 @@ get_delta(long *rt, long *master) + return tcenter - best_tm; + } + +-static __cpuinit void sync_tsc(void) ++static __cpuinit void sync_tsc(unsigned int master) + { + int i, done = 0; + long delta, adj, adjust_latency = 0; +@@ -267,9 +264,17 @@ static __cpuinit void sync_tsc(void) + } t[NUM_ROUNDS] __cpuinitdata; + #endif + ++ printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", ++ smp_processor_id(), master); ++ + go[MASTER] = 1; + +- smp_call_function(sync_master, NULL, 1, 0); ++ /* It is dangerous to broadcast IPI as cpus are coming up, ++ * as they may not be ready to accept them. So since ++ * we only need to send the ipi to the boot cpu direct ++ * the message, and avoid the race. ++ */ ++ smp_call_function_single(master, sync_master, NULL, 1, 0); + + while (go[MASTER]) /* wait for master to be ready */ + no_cpu_relax(); +@@ -313,16 +318,14 @@ static __cpuinit void sync_tsc(void) + printk(KERN_INFO + "CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, " + "maxerr %lu cycles)\n", +- smp_processor_id(), boot_cpu_id, delta, rt); ++ smp_processor_id(), master, delta, rt); + } + + static void __cpuinit tsc_sync_wait(void) + { + if (notscsync || !cpu_has_tsc) + return; +- printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", smp_processor_id(), +- boot_cpu_id); +- sync_tsc(); ++ sync_tsc(0); + } + + static __init int notscsync_setup(char *s) +diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c +--- a/drivers/acpi/pci_irq.c ++++ b/drivers/acpi/pci_irq.c +@@ -433,8 +433,9 @@ acpi_pci_irq_enable ( + printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: no GSI", + pci_name(dev), ('A' + pin)); + /* Interrupt Line values above 0xF are forbidden */ +- if (dev->irq >= 0 && (dev->irq <= 0xF)) { ++ if (dev->irq > 0 && (dev->irq <= 0xF)) { + printk(" - using IRQ %d\n", dev->irq); ++ acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW); + return_VALUE(0); + } + else { +diff --git a/drivers/char/rocket.c b/drivers/char/rocket.c +--- a/drivers/char/rocket.c ++++ b/drivers/char/rocket.c +@@ -277,7 +277,7 @@ static void rp_do_receive(struct r_port + ToRecv = space; + + if (ToRecv <= 0) +- return; ++ goto done; + + /* + * if status indicates there are errored characters in the +@@ -359,6 +359,7 @@ static void rp_do_receive(struct r_port + } + /* Push the data up to the tty layer */ + ld->receive_buf(tty, tty->flip.char_buf, tty->flip.flag_buf, count); ++done: + tty_ldisc_deref(ld); + } + +diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c +--- a/drivers/char/tpm/tpm.c ++++ b/drivers/char/tpm/tpm.c +@@ -32,12 +32,6 @@ + + #define TPM_BUFSIZE 2048 + +-/* PCI configuration addresses */ +-#define PCI_GEN_PMCON_1 0xA0 +-#define PCI_GEN1_DEC 0xE4 +-#define PCI_LPC_EN 0xE6 +-#define PCI_GEN2_DEC 0xEC +- + static LIST_HEAD(tpm_chip_list); + static DEFINE_SPINLOCK(driver_lock); + static int dev_mask[32]; +@@ -61,72 +55,6 @@ void tpm_time_expired(unsigned long ptr) + EXPORT_SYMBOL_GPL(tpm_time_expired); + + /* +- * Initialize the LPC bus and enable the TPM ports +- */ +-int tpm_lpc_bus_init(struct pci_dev *pci_dev, u16 base) +-{ +- u32 lpcenable, tmp; +- int is_lpcm = 0; +- +- switch (pci_dev->vendor) { +- case PCI_VENDOR_ID_INTEL: +- switch (pci_dev->device) { +- case PCI_DEVICE_ID_INTEL_82801CA_12: +- case PCI_DEVICE_ID_INTEL_82801DB_12: +- is_lpcm = 1; +- break; +- } +- /* init ICH (enable LPC) */ +- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, &lpcenable); +- lpcenable |= 0x20000000; +- pci_write_config_dword(pci_dev, PCI_GEN1_DEC, lpcenable); +- +- if (is_lpcm) { +- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, +- &lpcenable); +- if ((lpcenable & 0x20000000) == 0) { +- dev_err(&pci_dev->dev, +- "cannot enable LPC\n"); +- return -ENODEV; +- } +- } +- +- /* initialize TPM registers */ +- pci_read_config_dword(pci_dev, PCI_GEN2_DEC, &tmp); +- +- if (!is_lpcm) +- tmp = (tmp & 0xFFFF0000) | (base & 0xFFF0); +- else +- tmp = +- (tmp & 0xFFFF0000) | (base & 0xFFF0) | +- 0x00000001; +- +- pci_write_config_dword(pci_dev, PCI_GEN2_DEC, tmp); +- +- if (is_lpcm) { +- pci_read_config_dword(pci_dev, PCI_GEN_PMCON_1, +- &tmp); +- tmp |= 0x00000004; /* enable CLKRUN */ +- pci_write_config_dword(pci_dev, PCI_GEN_PMCON_1, +- tmp); +- } +- tpm_write_index(0x0D, 0x55); /* unlock 4F */ +- tpm_write_index(0x0A, 0x00); /* int disable */ +- tpm_write_index(0x08, base); /* base addr lo */ +- tpm_write_index(0x09, (base & 0xFF00) >> 8); /* base addr hi */ +- tpm_write_index(0x0D, 0xAA); /* lock 4F */ +- break; +- case PCI_VENDOR_ID_AMD: +- /* nothing yet */ +- break; +- } +- +- return 0; +-} +- +-EXPORT_SYMBOL_GPL(tpm_lpc_bus_init); +- +-/* + * Internal kernel interface to transmit TPM commands + */ + static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, +@@ -590,10 +518,6 @@ int tpm_pm_resume(struct pci_dev *pci_de + if (chip == NULL) + return -ENODEV; + +- spin_lock(&driver_lock); +- tpm_lpc_bus_init(pci_dev, chip->vendor->base); +- spin_unlock(&driver_lock); +- + return 0; + } + +diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h +--- a/drivers/char/tpm/tpm.h ++++ b/drivers/char/tpm/tpm.h +@@ -79,8 +79,6 @@ static inline void tpm_write_index(int i + } + + extern void tpm_time_expired(unsigned long); +-extern int tpm_lpc_bus_init(struct pci_dev *, u16); +- + extern int tpm_register_hardware(struct pci_dev *, + struct tpm_vendor_specific *); + extern int tpm_open(struct inode *, struct file *); +diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c +--- a/drivers/char/tpm/tpm_atmel.c ++++ b/drivers/char/tpm/tpm_atmel.c +@@ -22,7 +22,10 @@ + #include "tpm.h" + + /* Atmel definitions */ +-#define TPM_ATML_BASE 0x400 ++enum tpm_atmel_addr { ++ TPM_ATMEL_BASE_ADDR_LO = 0x08, ++ TPM_ATMEL_BASE_ADDR_HI = 0x09 ++}; + + /* write status bits */ + #define ATML_STATUS_ABORT 0x01 +@@ -127,7 +130,6 @@ static struct tpm_vendor_specific tpm_at + .cancel = tpm_atml_cancel, + .req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL, + .req_complete_val = ATML_STATUS_DATA_AVAIL, +- .base = TPM_ATML_BASE, + .miscdev = { .fops = &atmel_ops, }, + }; + +@@ -136,14 +138,16 @@ static int __devinit tpm_atml_init(struc + { + u8 version[4]; + int rc = 0; ++ int lo, hi; + + if (pci_enable_device(pci_dev)) + return -EIO; + +- if (tpm_lpc_bus_init(pci_dev, TPM_ATML_BASE)) { +- rc = -ENODEV; +- goto out_err; +- } ++ lo = tpm_read_index( TPM_ATMEL_BASE_ADDR_LO ); ++ hi = tpm_read_index( TPM_ATMEL_BASE_ADDR_HI ); ++ ++ tpm_atmel.base = (hi<<8)|lo; ++ dev_dbg( &pci_dev->dev, "Operating with base: 0x%x\n", tpm_atmel.base); + + /* verify that it is an Atmel part */ + if (tpm_read_index(4) != 'A' || tpm_read_index(5) != 'T' +diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c +--- a/drivers/char/tpm/tpm_nsc.c ++++ b/drivers/char/tpm/tpm_nsc.c +@@ -24,6 +24,10 @@ + /* National definitions */ + #define TPM_NSC_BASE 0x360 + #define TPM_NSC_IRQ 0x07 ++#define TPM_NSC_BASE0_HI 0x60 ++#define TPM_NSC_BASE0_LO 0x61 ++#define TPM_NSC_BASE1_HI 0x62 ++#define TPM_NSC_BASE1_LO 0x63 + + #define NSC_LDN_INDEX 0x07 + #define NSC_SID_INDEX 0x20 +@@ -234,7 +238,6 @@ static struct tpm_vendor_specific tpm_ns + .cancel = tpm_nsc_cancel, + .req_complete_mask = NSC_STATUS_OBF, + .req_complete_val = NSC_STATUS_OBF, +- .base = TPM_NSC_BASE, + .miscdev = { .fops = &nsc_ops, }, + + }; +@@ -243,15 +246,16 @@ static int __devinit tpm_nsc_init(struct + const struct pci_device_id *pci_id) + { + int rc = 0; ++ int lo, hi; ++ ++ hi = tpm_read_index(TPM_NSC_BASE0_HI); ++ lo = tpm_read_index(TPM_NSC_BASE0_LO); ++ ++ tpm_nsc.base = (hi<<8) | lo; + + if (pci_enable_device(pci_dev)) + return -EIO; + +- if (tpm_lpc_bus_init(pci_dev, TPM_NSC_BASE)) { +- rc = -ENODEV; +- goto out_err; +- } +- + /* verify that it is a National part (SID) */ + if (tpm_read_index(NSC_SID_INDEX) != 0xEF) { + rc = -ENODEV; +diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c +--- a/drivers/char/tty_ioctl.c ++++ b/drivers/char/tty_ioctl.c +@@ -476,11 +476,11 @@ int n_tty_ioctl(struct tty_struct * tty, + ld = tty_ldisc_ref(tty); + switch (arg) { + case TCIFLUSH: +- if (ld->flush_buffer) ++ if (ld && ld->flush_buffer) + ld->flush_buffer(tty); + break; + case TCIOFLUSH: +- if (ld->flush_buffer) ++ if (ld && ld->flush_buffer) + ld->flush_buffer(tty); + /* fall through */ + case TCOFLUSH: +diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c +--- a/drivers/media/video/cx88/cx88-video.c ++++ b/drivers/media/video/cx88/cx88-video.c +@@ -261,7 +261,7 @@ static struct cx88_ctrl cx8800_ctls[] = + .default_value = 0, + .type = V4L2_CTRL_TYPE_INTEGER, + }, +- .off = 0, ++ .off = 128, + .reg = MO_HUE, + .mask = 0x00ff, + .shift = 0, +diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c +--- a/drivers/net/e1000/e1000_main.c ++++ b/drivers/net/e1000/e1000_main.c +@@ -2307,6 +2307,7 @@ e1000_xmit_frame(struct sk_buff *skb, st + tso = e1000_tso(adapter, skb); + if (tso < 0) { + dev_kfree_skb_any(skb); ++ spin_unlock_irqrestore(&adapter->tx_lock, flags); + return NETDEV_TX_OK; + } + +diff --git a/drivers/net/hamradio/Kconfig b/drivers/net/hamradio/Kconfig +--- a/drivers/net/hamradio/Kconfig ++++ b/drivers/net/hamradio/Kconfig +@@ -17,7 +17,7 @@ config MKISS + + config 6PACK + tristate "Serial port 6PACK driver" +- depends on AX25 && BROKEN_ON_SMP ++ depends on AX25 + ---help--- + 6pack is a transmission protocol for the data exchange between your + PC and your TNC (the Terminal Node Controller acts as a kind of +diff --git a/drivers/net/shaper.c b/drivers/net/shaper.c +--- a/drivers/net/shaper.c ++++ b/drivers/net/shaper.c +@@ -135,10 +135,8 @@ static int shaper_start_xmit(struct sk_b + { + struct shaper *shaper = dev->priv; + struct sk_buff *ptr; +- +- if (down_trylock(&shaper->sem)) +- return -1; + ++ spin_lock(&shaper->lock); + ptr=shaper->sendq.prev; + + /* +@@ -232,7 +230,7 @@ static int shaper_start_xmit(struct sk_b + shaper->stats.collisions++; + } + shaper_kick(shaper); +- up(&shaper->sem); ++ spin_unlock(&shaper->lock); + return 0; + } + +@@ -271,11 +269,9 @@ static void shaper_timer(unsigned long d + { + struct shaper *shaper = (struct shaper *)data; + +- if (!down_trylock(&shaper->sem)) { +- shaper_kick(shaper); +- up(&shaper->sem); +- } else +- mod_timer(&shaper->timer, jiffies); ++ spin_lock(&shaper->lock); ++ shaper_kick(shaper); ++ spin_unlock(&shaper->lock); + } + + /* +@@ -332,21 +328,6 @@ static void shaper_kick(struct shaper *s + + + /* +- * Flush the shaper queues on a closedown +- */ +- +-static void shaper_flush(struct shaper *shaper) +-{ +- struct sk_buff *skb; +- +- down(&shaper->sem); +- while((skb=skb_dequeue(&shaper->sendq))!=NULL) +- dev_kfree_skb(skb); +- shaper_kick(shaper); +- up(&shaper->sem); +-} +- +-/* + * Bring the interface up. We just disallow this until a + * bind. + */ +@@ -375,7 +356,15 @@ static int shaper_open(struct net_device + static int shaper_close(struct net_device *dev) + { + struct shaper *shaper=dev->priv; +- shaper_flush(shaper); ++ struct sk_buff *skb; ++ ++ while ((skb = skb_dequeue(&shaper->sendq)) != NULL) ++ dev_kfree_skb(skb); ++ ++ spin_lock_bh(&shaper->lock); ++ shaper_kick(shaper); ++ spin_unlock_bh(&shaper->lock); ++ + del_timer_sync(&shaper->timer); + return 0; + } +@@ -576,6 +565,7 @@ static void shaper_init_priv(struct net_ + init_timer(&sh->timer); + sh->timer.function=shaper_timer; + sh->timer.data=(unsigned long)sh; ++ spin_lock_init(&sh->lock); + } + + /* +diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c +--- a/drivers/pci/pci-driver.c ++++ b/drivers/pci/pci-driver.c +@@ -396,7 +396,7 @@ int pci_register_driver(struct pci_drive + /* FIXME, once all of the existing PCI drivers have been fixed to set + * the pci shutdown function, this test can go away. */ + if (!drv->driver.shutdown) +- drv->driver.shutdown = pci_device_shutdown, ++ drv->driver.shutdown = pci_device_shutdown; + drv->driver.owner = drv->owner; + drv->driver.kobj.ktype = &pci_driver_kobj_type; + pci_init_dynids(&drv->dynids); +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -1914,9 +1914,11 @@ qla2x00_reg_remote_port(scsi_qla_host_t + rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET; + + fcport->rport = rport = fc_remote_port_add(ha->host, 0, &rport_ids); +- if (!rport) ++ if (!rport) { + qla_printk(KERN_WARNING, ha, + "Unable to allocate fc remote port!\n"); ++ return; ++ } + + if (rport->scsi_target_id != -1 && rport->scsi_target_id < MAX_TARGETS) + fcport->os_target_id = rport->scsi_target_id; +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -1150,7 +1150,7 @@ iospace_error_exit: + */ + int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) + { +- int ret; ++ int ret = -ENODEV; + device_reg_t __iomem *reg; + struct Scsi_Host *host; + scsi_qla_host_t *ha; +@@ -1161,7 +1161,7 @@ int qla2x00_probe_one(struct pci_dev *pd + fc_port_t *fcport; + + if (pci_enable_device(pdev)) +- return -1; ++ goto probe_out; + + host = scsi_host_alloc(&qla2x00_driver_template, + sizeof(scsi_qla_host_t)); +@@ -1183,9 +1183,8 @@ int qla2x00_probe_one(struct pci_dev *pd + + /* Configure PCI I/O space */ + ret = qla2x00_iospace_config(ha); +- if (ret != 0) { +- goto probe_alloc_failed; +- } ++ if (ret) ++ goto probe_failed; + + /* Sanitize the information from PCI BIOS. */ + host->irq = pdev->irq; +@@ -1258,23 +1257,10 @@ int qla2x00_probe_one(struct pci_dev *pd + qla_printk(KERN_WARNING, ha, + "[ERROR] Failed to allocate memory for adapter\n"); + +- goto probe_alloc_failed; ++ ret = -ENOMEM; ++ goto probe_failed; + } + +- pci_set_drvdata(pdev, ha); +- host->this_id = 255; +- host->cmd_per_lun = 3; +- host->unique_id = ha->instance; +- host->max_cmd_len = MAX_CMDSZ; +- host->max_channel = ha->ports - 1; +- host->max_id = ha->max_targets; +- host->max_lun = ha->max_luns; +- host->transportt = qla2xxx_transport_template; +- if (scsi_add_host(host, &pdev->dev)) +- goto probe_alloc_failed; +- +- qla2x00_alloc_sysfs_attr(ha); +- + if (qla2x00_initialize_adapter(ha) && + !(ha->device_flags & DFLG_NO_CABLE)) { + +@@ -1285,11 +1271,10 @@ int qla2x00_probe_one(struct pci_dev *pd + "Adapter flags %x.\n", + ha->host_no, ha->device_flags)); + ++ ret = -ENODEV; + goto probe_failed; + } + +- qla2x00_init_host_attr(ha); +- + /* + * Startup the kernel thread for this host adapter + */ +@@ -1299,17 +1284,26 @@ int qla2x00_probe_one(struct pci_dev *pd + qla_printk(KERN_WARNING, ha, + "Unable to start DPC thread!\n"); + ++ ret = -ENODEV; + goto probe_failed; + } + wait_for_completion(&ha->dpc_inited); + ++ host->this_id = 255; ++ host->cmd_per_lun = 3; ++ host->unique_id = ha->instance; ++ host->max_cmd_len = MAX_CMDSZ; ++ host->max_channel = ha->ports - 1; ++ host->max_lun = MAX_LUNS; ++ host->transportt = qla2xxx_transport_template; ++ + if (IS_QLA2100(ha) || IS_QLA2200(ha)) + ret = request_irq(host->irq, qla2100_intr_handler, + SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); + else + ret = request_irq(host->irq, qla2300_intr_handler, + SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); +- if (ret != 0) { ++ if (ret) { + qla_printk(KERN_WARNING, ha, + "Failed to reserve interrupt %d already in use.\n", + host->irq); +@@ -1363,9 +1357,18 @@ int qla2x00_probe_one(struct pci_dev *pd + msleep(10); + } + ++ pci_set_drvdata(pdev, ha); + ha->flags.init_done = 1; + num_hosts++; + ++ ret = scsi_add_host(host, &pdev->dev); ++ if (ret) ++ goto probe_failed; ++ ++ qla2x00_alloc_sysfs_attr(ha); ++ ++ qla2x00_init_host_attr(ha); ++ + qla_printk(KERN_INFO, ha, "\n" + " QLogic Fibre Channel HBA Driver: %s\n" + " QLogic %s - %s\n" +@@ -1384,9 +1387,6 @@ int qla2x00_probe_one(struct pci_dev *pd + probe_failed: + fc_remove_host(ha->host); + +- scsi_remove_host(host); +- +-probe_alloc_failed: + qla2x00_free_device(ha); + + scsi_host_put(host); +@@ -1394,7 +1394,8 @@ probe_alloc_failed: + probe_disable_device: + pci_disable_device(pdev); + +- return -1; ++probe_out: ++ return ret; + } + EXPORT_SYMBOL_GPL(qla2x00_probe_one); + +diff --git a/fs/bio.c b/fs/bio.c +--- a/fs/bio.c ++++ b/fs/bio.c +@@ -261,6 +261,7 @@ inline void __bio_clone(struct bio *bio, + */ + bio->bi_vcnt = bio_src->bi_vcnt; + bio->bi_size = bio_src->bi_size; ++ bio->bi_idx = bio_src->bi_idx; + bio_phys_segments(q, bio); + bio_hw_segments(q, bio); + } +diff --git a/fs/char_dev.c b/fs/char_dev.c +--- a/fs/char_dev.c ++++ b/fs/char_dev.c +@@ -139,7 +139,7 @@ __unregister_chrdev_region(unsigned majo + struct char_device_struct *cd = NULL, **cp; + int i = major_to_index(major); + +- up(&chrdevs_lock); ++ down(&chrdevs_lock); + for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next) + if ((*cp)->major == major && + (*cp)->baseminor == baseminor && +diff --git a/fs/exec.c b/fs/exec.c +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -649,6 +649,7 @@ static inline int de_thread(struct task_ + } + sig->group_exit_task = NULL; + sig->notify_count = 0; ++ sig->real_timer.data = (unsigned long)current; + spin_unlock_irq(lock); + + /* +diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c +--- a/fs/isofs/compress.c ++++ b/fs/isofs/compress.c +@@ -129,8 +129,14 @@ static int zisofs_readpage(struct file * + cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask))); + brelse(bh); + ++ if (cstart > cend) ++ goto eio; ++ + csize = cend-cstart; + ++ if (csize > deflateBound(1UL << zisofs_block_shift)) ++ goto eio; ++ + /* Now page[] contains an array of pages, any of which can be NULL, + and the locks on which we hold. We should now read the data and + release the pages. If the pages are NULL the decompressed data +diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h +--- a/include/asm-i386/string.h ++++ b/include/asm-i386/string.h +@@ -116,7 +116,8 @@ __asm__ __volatile__( + "orb $1,%%al\n" + "3:" + :"=a" (__res), "=&S" (d0), "=&D" (d1) +- :"1" (cs),"2" (ct)); ++ :"1" (cs),"2" (ct) ++ :"memory"); + return __res; + } + +@@ -138,8 +139,9 @@ __asm__ __volatile__( + "3:\tsbbl %%eax,%%eax\n\t" + "orb $1,%%al\n" + "4:" +- :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) +- :"1" (cs),"2" (ct),"3" (count)); ++ :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) ++ :"1" (cs),"2" (ct),"3" (count) ++ :"memory"); + return __res; + } + +@@ -158,7 +160,9 @@ __asm__ __volatile__( + "movl $1,%1\n" + "2:\tmovl %1,%0\n\t" + "decl %0" +- :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c)); ++ :"=a" (__res), "=&S" (d0) ++ :"1" (s),"0" (c) ++ :"memory"); + return __res; + } + +@@ -175,7 +179,9 @@ __asm__ __volatile__( + "leal -1(%%esi),%0\n" + "2:\ttestb %%al,%%al\n\t" + "jne 1b" +- :"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c)); ++ :"=g" (__res), "=&S" (d0), "=&a" (d1) ++ :"0" (0),"1" (s),"2" (c) ++ :"memory"); + return __res; + } + +@@ -189,7 +195,9 @@ __asm__ __volatile__( + "scasb\n\t" + "notl %0\n\t" + "decl %0" +- :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffu)); ++ :"=c" (__res), "=&D" (d0) ++ :"1" (s),"a" (0), "0" (0xffffffffu) ++ :"memory"); + return __res; + } + +@@ -333,7 +341,9 @@ __asm__ __volatile__( + "je 1f\n\t" + "movl $1,%0\n" + "1:\tdecl %0" +- :"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count)); ++ :"=D" (__res), "=&c" (d0) ++ :"a" (c),"0" (cs),"1" (count) ++ :"memory"); + return __res; + } + +@@ -369,7 +379,7 @@ __asm__ __volatile__( + "je 2f\n\t" + "stosb\n" + "2:" +- : "=&c" (d0), "=&D" (d1) ++ :"=&c" (d0), "=&D" (d1) + :"a" (c), "q" (count), "0" (count/4), "1" ((long) s) + :"memory"); + return (s); +@@ -392,7 +402,8 @@ __asm__ __volatile__( + "jne 1b\n" + "3:\tsubl %2,%0" + :"=a" (__res), "=&d" (d0) +- :"c" (s),"1" (count)); ++ :"c" (s),"1" (count) ++ :"memory"); + return __res; + } + /* end of additional stuff */ +@@ -473,7 +484,8 @@ static inline void * memscan(void * addr + "dec %%edi\n" + "1:" + : "=D" (addr), "=c" (size) +- : "0" (addr), "1" (size), "a" (c)); ++ : "0" (addr), "1" (size), "a" (c) ++ : "memory"); + return addr; + } + +diff --git a/include/asm-x86_64/smp.h b/include/asm-x86_64/smp.h +--- a/include/asm-x86_64/smp.h ++++ b/include/asm-x86_64/smp.h +@@ -46,6 +46,8 @@ extern int pic_mode; + extern int smp_num_siblings; + extern void smp_flush_tlb(void); + extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); ++extern int smp_call_function_single (int cpuid, void (*func) (void *info), void *info, ++ int retry, int wait); + extern void smp_send_reschedule(int cpu); + extern void smp_invalidate_rcv(void); /* Process an NMI */ + extern void zap_low_mappings(void); +diff --git a/include/linux/if_shaper.h b/include/linux/if_shaper.h +--- a/include/linux/if_shaper.h ++++ b/include/linux/if_shaper.h +@@ -23,7 +23,7 @@ struct shaper + __u32 shapeclock; + unsigned long recovery; /* Time we can next clock a packet out on + an empty queue */ +- struct semaphore sem; ++ spinlock_t lock; + struct net_device_stats stats; + struct net_device *dev; + int (*hard_start_xmit) (struct sk_buff *skb, +diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -1192,7 +1192,7 @@ static inline void *skb_header_pointer(c + { + int hlen = skb_headlen(skb); + +- if (offset + len <= hlen) ++ if (hlen - offset >= len) + return skb->data + offset; + + if (skb_copy_bits(skb, offset, buffer, len) < 0) +diff --git a/include/linux/zlib.h b/include/linux/zlib.h +--- a/include/linux/zlib.h ++++ b/include/linux/zlib.h +@@ -506,6 +506,11 @@ extern int zlib_deflateReset (z_streamp + stream state was inconsistent (such as zalloc or state being NULL). + */ + ++static inline unsigned long deflateBound(unsigned long s) ++{ ++ return s + ((s + 7) >> 3) + ((s + 63) >> 6) + 11; ++} ++ + extern int zlib_deflateParams (z_streamp strm, int level, int strategy); + /* + Dynamically update the compression level and compression strategy. The +diff --git a/kernel/module.c b/kernel/module.c +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -249,13 +249,18 @@ static inline unsigned int block_size(in + /* Created by linker magic */ + extern char __per_cpu_start[], __per_cpu_end[]; + +-static void *percpu_modalloc(unsigned long size, unsigned long align) ++static void *percpu_modalloc(unsigned long size, unsigned long align, ++ const char *name) + { + unsigned long extra; + unsigned int i; + void *ptr; + +- BUG_ON(align > SMP_CACHE_BYTES); ++ if (align > SMP_CACHE_BYTES) { ++ printk(KERN_WARNING "%s: per-cpu alignment %li > %i\n", ++ name, align, SMP_CACHE_BYTES); ++ align = SMP_CACHE_BYTES; ++ } + + ptr = __per_cpu_start; + for (i = 0; i < pcpu_num_used; ptr += block_size(pcpu_size[i]), i++) { +@@ -347,7 +352,8 @@ static int percpu_modinit(void) + } + __initcall(percpu_modinit); + #else /* ... !CONFIG_SMP */ +-static inline void *percpu_modalloc(unsigned long size, unsigned long align) ++static inline void *percpu_modalloc(unsigned long size, unsigned long align, ++ const char *name) + { + return NULL; + } +@@ -1554,7 +1560,8 @@ static struct module *load_module(void _ + if (pcpuindex) { + /* We have a special allocation for this section. */ + percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, +- sechdrs[pcpuindex].sh_addralign); ++ sechdrs[pcpuindex].sh_addralign, ++ mod->name); + if (!percpu) { + err = -ENOMEM; + goto free_mod; +diff --git a/lib/inflate.c b/lib/inflate.c +--- a/lib/inflate.c ++++ b/lib/inflate.c +@@ -326,7 +326,7 @@ DEBG("huft1 "); + { + *t = (struct huft *)NULL; + *m = 0; +- return 0; ++ return 2; + } + + DEBG("huft2 "); +@@ -374,6 +374,7 @@ DEBG("huft5 "); + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); ++ n = x[g]; /* set n to length of v */ + + DEBG("h6 "); + +@@ -410,12 +411,13 @@ DEBG1("1 "); + DEBG1("2 "); + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; +- while (++j < z) /* try smaller tables up to z bits */ +- { +- if ((f <<= 1) <= *++xp) +- break; /* enough codes to use up j bits */ +- f -= *xp; /* else deduct codes from patterns */ +- } ++ if (j < z) ++ while (++j < z) /* try smaller tables up to z bits */ ++ { ++ if ((f <<= 1) <= *++xp) ++ break; /* enough codes to use up j bits */ ++ f -= *xp; /* else deduct codes from patterns */ ++ } + } + DEBG1("3 "); + z = 1 << j; /* table entries for j-bit table */ +diff --git a/lib/zlib_inflate/inftrees.c b/lib/zlib_inflate/inftrees.c +--- a/lib/zlib_inflate/inftrees.c ++++ b/lib/zlib_inflate/inftrees.c +@@ -141,7 +141,7 @@ static int huft_build( + { + *t = NULL; + *m = 0; +- return Z_OK; ++ return Z_DATA_ERROR; + } + + +diff --git a/mm/memory.c b/mm/memory.c +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -1164,7 +1164,7 @@ int remap_pfn_range(struct vm_area_struc + { + pgd_t *pgd; + unsigned long next; +- unsigned long end = addr + size; ++ unsigned long end = addr + PAGE_ALIGN(size); + struct mm_struct *mm = vma->vm_mm; + int err; + +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -409,7 +409,7 @@ asmlinkage long sys_set_mempolicy(int mo + struct mempolicy *new; + DECLARE_BITMAP(nodes, MAX_NUMNODES); + +- if (mode > MPOL_MAX) ++ if (mode < 0 || mode > MPOL_MAX) + return -EINVAL; + err = get_nodes(nodes, nmask, maxnode, mode); + if (err) +diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c +--- a/net/8021q/vlan.c ++++ b/net/8021q/vlan.c +@@ -578,6 +578,14 @@ static int vlan_device_event(struct noti + if (!vlandev) + continue; + ++ if (netif_carrier_ok(dev)) { ++ if (!netif_carrier_ok(vlandev)) ++ netif_carrier_on(vlandev); ++ } else { ++ if (netif_carrier_ok(vlandev)) ++ netif_carrier_off(vlandev); ++ } ++ + if ((vlandev->state & VLAN_LINK_STATE_MASK) != flgs) { + vlandev->state = (vlandev->state &~ VLAN_LINK_STATE_MASK) + | flgs; +diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c +--- a/net/ipv4/ip_output.c ++++ b/net/ipv4/ip_output.c +@@ -111,7 +111,6 @@ static int ip_dev_loopback_xmit(struct s + #ifdef CONFIG_NETFILTER_DEBUG + nf_debug_ip_loopback_xmit(newskb); + #endif +- nf_reset(newskb); + netif_rx(newskb); + return 0; + } +@@ -196,8 +195,6 @@ static inline int ip_finish_output2(stru + nf_debug_ip_finish_output2(skb); + #endif /*CONFIG_NETFILTER_DEBUG*/ + +- nf_reset(skb); +- + if (hh) { + int hh_alen; + +diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c +--- a/net/ipv4/netfilter/ip_conntrack_core.c ++++ b/net/ipv4/netfilter/ip_conntrack_core.c +@@ -1124,6 +1124,9 @@ void ip_conntrack_cleanup(void) + schedule(); + goto i_see_dead_people; + } ++ /* wait until all references to ip_conntrack_untracked are dropped */ ++ while (atomic_read(&ip_conntrack_untracked.ct_general.use) > 1) ++ schedule(); + + kmem_cache_destroy(ip_conntrack_cachep); + kmem_cache_destroy(ip_conntrack_expect_cachep); +diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c +--- a/net/ipv4/netfilter/ip_conntrack_standalone.c ++++ b/net/ipv4/netfilter/ip_conntrack_standalone.c +@@ -432,6 +432,13 @@ static unsigned int ip_conntrack_defrag( + const struct net_device *out, + int (*okfn)(struct sk_buff *)) + { ++#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE) ++ /* Previously seen (loopback)? Ignore. Do this before ++ fragment check. */ ++ if ((*pskb)->nfct) ++ return NF_ACCEPT; ++#endif ++ + /* Gather fragments. */ + if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { + *pskb = ip_ct_gather_frags(*pskb, +diff --git a/net/ipv4/netfilter/ip_nat_proto_tcp.c b/net/ipv4/netfilter/ip_nat_proto_tcp.c +--- a/net/ipv4/netfilter/ip_nat_proto_tcp.c ++++ b/net/ipv4/netfilter/ip_nat_proto_tcp.c +@@ -40,7 +40,8 @@ tcp_unique_tuple(struct ip_conntrack_tup + enum ip_nat_manip_type maniptype, + const struct ip_conntrack *conntrack) + { +- static u_int16_t port, *portptr; ++ static u_int16_t port; ++ u_int16_t *portptr; + unsigned int range_size, min, i; + + if (maniptype == IP_NAT_MANIP_SRC) +diff --git a/net/ipv4/netfilter/ip_nat_proto_udp.c b/net/ipv4/netfilter/ip_nat_proto_udp.c +--- a/net/ipv4/netfilter/ip_nat_proto_udp.c ++++ b/net/ipv4/netfilter/ip_nat_proto_udp.c +@@ -41,7 +41,8 @@ udp_unique_tuple(struct ip_conntrack_tup + enum ip_nat_manip_type maniptype, + const struct ip_conntrack *conntrack) + { +- static u_int16_t port, *portptr; ++ static u_int16_t port; ++ u_int16_t *portptr; + unsigned int range_size, min, i; + + if (maniptype == IP_NAT_MANIP_SRC) +diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c +--- a/net/ipv6/netfilter/ip6_queue.c ++++ b/net/ipv6/netfilter/ip6_queue.c +@@ -76,7 +76,9 @@ static DECLARE_MUTEX(ipqnl_sem); + static void + ipq_issue_verdict(struct ipq_queue_entry *entry, int verdict) + { ++ local_bh_disable(); + nf_reinject(entry->skb, entry->info, verdict); ++ local_bh_enable(); + kfree(entry); + } + +diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c +--- a/net/netlink/af_netlink.c ++++ b/net/netlink/af_netlink.c +@@ -315,8 +315,8 @@ err: + static void netlink_remove(struct sock *sk) + { + netlink_table_grab(); +- nl_table[sk->sk_protocol].hash.entries--; +- sk_del_node_init(sk); ++ if (sk_del_node_init(sk)) ++ nl_table[sk->sk_protocol].hash.entries--; + if (nlk_sk(sk)->groups) + __sk_del_bind_node(sk); + netlink_table_ungrab(); +@@ -429,7 +429,12 @@ retry: + err = netlink_insert(sk, pid); + if (err == -EADDRINUSE) + goto retry; +- return 0; ++ ++ /* If 2 threads race to autobind, that is fine. */ ++ if (err == -EBUSY) ++ err = 0; ++ ++ return err; + } + + static inline int netlink_capable(struct socket *sock, unsigned int flag) +diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c +--- a/net/packet/af_packet.c ++++ b/net/packet/af_packet.c +@@ -274,6 +274,9 @@ static int packet_rcv_spkt(struct sk_buf + dst_release(skb->dst); + skb->dst = NULL; + ++ /* drop conntrack reference */ ++ nf_reset(skb); ++ + spkt = (struct sockaddr_pkt*)skb->cb; + + skb_push(skb, skb->data-skb->mac.raw); +@@ -517,6 +520,9 @@ static int packet_rcv(struct sk_buff *sk + dst_release(skb->dst); + skb->dst = NULL; + ++ /* drop conntrack reference */ ++ nf_reset(skb); ++ + spin_lock(&sk->sk_receive_queue.lock); + po->stats.tp_packets++; + __skb_queue_tail(&sk->sk_receive_queue, skb); +diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c +--- a/net/xfrm/xfrm_user.c ++++ b/net/xfrm/xfrm_user.c +@@ -1180,6 +1180,9 @@ static struct xfrm_policy *xfrm_compile_ + if (nr > XFRM_MAX_DEPTH) + return NULL; + ++ if (p->dir > XFRM_POLICY_OUT) ++ return NULL; ++ + xp = xfrm_policy_alloc(GFP_KERNEL); + if (xp == NULL) { + *dir = -ENOBUFS; +diff --git a/security/keys/keyring.c b/security/keys/keyring.c +--- a/security/keys/keyring.c ++++ b/security/keys/keyring.c +@@ -188,7 +188,11 @@ static void keyring_destroy(struct key * + + if (keyring->description) { + write_lock(&keyring_name_lock); +- list_del(&keyring->type_data.link); ++ ++ if (keyring->type_data.link.next != NULL && ++ !list_empty(&keyring->type_data.link)) ++ list_del(&keyring->type_data.link); ++ + write_unlock(&keyring_name_lock); + } + +diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c +--- a/security/keys/process_keys.c ++++ b/security/keys/process_keys.c +@@ -641,7 +641,7 @@ long join_session_keyring(const char *na + keyring = keyring_alloc(name, tsk->uid, tsk->gid, 0, NULL); + if (IS_ERR(keyring)) { + ret = PTR_ERR(keyring); +- goto error; ++ goto error2; + } + } + else if (IS_ERR(keyring)) { diff -r 40b887fa79d0 -r 29aab159846c tools/examples/network-bridge --- /dev/null Fri Aug 12 17:35:15 2005 +++ b/tools/examples/network-bridge Mon Aug 15 18:32:29 2005 @@ -0,0 +1,260 @@ +#!/bin/sh -x +#============================================================================ +# Default Xen network start/stop script. +# Xend calls a network script when it starts. +# The script name to use is defined in /etc/xen/xend-config.sxp +# in the network-script field. +# +# This script creates a bridge (default xen-br0), adds a device +# (default eth0) to it, copies the IP addresses from the device +# to the bridge and adjusts the routes accordingly. +# +# If all goes well, this should ensure that networking stays up. +# However, some configurations are upset by this, especially +# NFS roots. If the bridged setup does not meet your needs, +# configure a different script, for example using routing instead. +# +# Usage: +# +# network (start|stop|status) {VAR=VAL}* +# +# Vars: +# +# bridge The bridge to use (default xen-br0). +# netdev The interface to add to the bridge (default eth0). +# antispoof Whether to use iptables to prevent spoofing (default yes). +# +# start: +# Creates the bridge and enslaves netdev to it. +# Copies the IP addresses from netdev to the bridge. +# Deletes the routes to netdev and adds them on bridge. +# +# stop: +# Removes netdev from the bridge. +# Deletes the routes to bridge and adds them to netdev. +# +# status: +# Print ifconfig for netdev and bridge. +# Print routes. +# +#============================================================================ + +# Exit if anything goes wrong. +set -e + +# First arg is the operation. +OP=$1 +shift + +# Pull variables in args in to environment. +for arg ; do export "${arg}" ; done + +bridge=${bridge:-xen-br0} +netdev=${netdev:-eth0} +antispoof=${antispoof:-yes} + +echo "*network $OP bridge=$bridge netdev=$netdev antispoof=$antispoof" >&2 + +# Usage: transfer_addrs src dst +# Copy all IP addresses (including aliases) from device $src to device $dst. +transfer_addrs () { + local src=$1 + local dst=$2 + # Don't bother if $dst already has IP addresses. + if ip addr show dev ${dst} | egrep -q '^ *inet ' ; then + return + fi + # Address lines start with 'inet' and have the device in them. + # Replace 'inet' with 'ip addr add' and change the device name $src + # to 'dev $src'. + ip addr show dev ${src} | egrep '^ *inet ' | sed -e " +s/inet/ip addr add/ +s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\1@ +s/${src}/dev ${dst}/ +" | sh -e + # Remove automatic routes on destionation device + ip route list | sed -ne " +/dev ${dst}\( \|$\)/ { + s/^/ip route del / + p +}" | sh -e +} + +# Usage: del_addrs src +del_addrs () { + local src=$1 + ip addr show dev ${src} | egrep '^ *inet ' | sed -e " +s/inet/ip addr del/ +s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)/[0-9]\+@\1@ +s/${src}/dev ${src}/ +" | sh -e +} + +# Usage: transfer_routes src dst +# Get all IP routes to device $src, delete them, and +# add the same routes to device $dst. +# The original routes have to be deleted, otherwise adding them +# for $dst fails (duplicate routes). +transfer_routes () { + local src=$1 + local dst=$2 + # List all routes and grep the ones with $src in. + # Stick 'ip route del' on the front to delete. + # Change $src to $dst and use 'ip route add' to add. + ip route list | sed -ne " +/dev ${src}\( \|$\)/ { + h + s/^/ip route del / + P + g + s/${src}/${dst}/ + s/^/ip route add / + P + d +}" | sh -e +} + +# Usage: create_bridge bridge +create_bridge () { + local bridge=$1 + + # Don't create the bridge if it already exists. + if ! brctl show | grep -q ${bridge} ; then + brctl addbr ${bridge} + brctl stp ${bridge} off + brctl setfd ${bridge} 0 + fi + ifconfig ${bridge} up +} + +# Usage: add_to_bridge bridge dev +add_to_bridge () { + local bridge=$1 + local dev=$2 + # Don't add $dev to $bridge if it's already on a bridge. + if ! brctl show | grep -q ${dev} ; then + brctl addif ${bridge} ${dev} + fi +} + +# Usage: antispoofing dev bridge +# Set the default forwarding policy for $dev to drop. +# Allow forwarding to the bridge. +antispoofing () { + local dev=$1 + local bridge=$2 + + iptables -P FORWARD DROP + iptables -A FORWARD -m physdev --physdev-in ${dev} -j ACCEPT +} + +# Usage: show_status dev bridge +# Print ifconfig and routes. +show_status () { + local dev=$1 + local bridge=$2 + + echo '============================================================' + ifconfig ${dev} + ifconfig ${bridge} + echo ' ' + ip route list + echo ' ' + route -n + echo '============================================================' +} + +op_start () { + if [ "${bridge}" == "null" ] ; then + return + fi + + create_bridge ${bridge} + + if ifconfig 2>/dev/null | grep -q veth0 ; then + return + fi + + if ifconfig veth0 2>/dev/null | grep -q veth0 ; then + mac=`ifconfig ${netdev} | grep HWadd | sed -e 's/.*\(..:..:..:..:..:..\).*/\1/'` + if ! ifdown ${netdev} ; then + # if ifup didn't work, see if we have an ip= on cmd line + if egrep 'ip=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:' /proc/cmdline ; + then + kip=`sed -e 's!.*ip=\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\):.*!\1!' /proc/cmdline` + kmask=`sed -e 's!.*ip=[^:]*:[^:]*:[^:]*:\([^:]*\):.*!\1!' /proc/cmdline` + kgate=`sed -e 's!.*ip=[^:]*:[^:]*:\([^:]*\):.*!\1!' /proc/cmdline` + ifconfig ${netdev} 0.0.0.0 down + fi + fi + ip link set ${netdev} name p${netdev} + ip link set veth0 name eth0 + ifconfig p${netdev} -arp down + ifconfig p${netdev} hw ether fe:ff:ff:ff:ff:ff + ifconfig ${netdev} hw ether ${mac} + add_to_bridge ${bridge} vif0.0 + add_to_bridge ${bridge} p${netdev} + ip link set vif0.0 up + ip link set p${netdev} up + if ! ifup ${netdev} ; then + if [ ${kip} ] ; then + # use the addresses we grocked from /proc/cmdline + ifconfig ${netdev} ${kip} + [ ${kmask} ] && ifconfig ${netdev} netmask ${kmask} + ifconfig ${netdev} up + [ ${kgate} ] && ip route add default via ${kgate} + fi + fi + else + # old style without veth0 + transfer_addrs ${netdev} ${bridge} + transfer_routes ${netdev} ${bridge} + fi + + if [ ${antispoof} == 'yes' ] ; then + antispoofing ${netdev} ${bridge} + fi +} + +op_stop () { + if [ "${bridge}" == "null" ] ; then + return + fi + + brctl delif ${bridge} ${netdev} + + if ifconfig veth0 2>/dev/null | grep -q veth0 ; then + brctl delif ${bridge} vif0.0 + ifconfig vif0.0 down + mac=`ifconfig veth0 | grep HWadd | sed -e 's/.*\(..:..:..:..:..:..\).*/\1/'` + ifconfig ${netdev} down + ifconfig ${netdev} hw ether ${mac} + ifconfig ${netdev} arp up + transfer_addrs veth0 ${netdev} + transfer_routes veth0 ${netdev} + del_addrs veth0 + ifconfig veth0 -arp down + ifconfig veth0 hw ether 00:00:00:00:00:00 + else + transfer_routes ${bridge} ${netdev} + fi +} + +case ${OP} in + start) + op_start + ;; + + stop) + op_stop + ;; + + status) + show_status ${netdev} ${bridge} + ;; + + *) + echo 'Unknown command: ' ${OP} >&2 + echo 'Valid commands are: start, stop, status' >&2 + exit 1 +esac diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/asm-offsets.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/asm-offsets.c Fri Aug 12 17:35:15 2005 +++ /dev/null Mon Aug 15 18:32:29 2005 @@ -1,70 +0,0 @@ -/* - * Generate definitions needed by assembly language modules. - * This code generates raw asm output which is post-processed to extract - * and format the required data. - */ - -#include <linux/sched.h> -#include <linux/stddef.h> -#include <linux/errno.h> -#include <linux/hardirq.h> -#include <linux/suspend.h> -#include <asm/pda.h> -#include <asm/processor.h> -#include <asm/segment.h> -#include <asm/thread_info.h> -#include <asm/ia32.h> - -#define DEFINE(sym, val) \ - asm volatile("\n->" #sym " %0 " #val : : "i" (val)) - -#define BLANK() asm volatile("\n->" : : ) - -int main(void) -{ -#define ENTRY(entry) DEFINE(tsk_ ## entry, offsetof(struct task_struct, entry)) - ENTRY(state); - ENTRY(flags); - ENTRY(thread); - ENTRY(pid); - BLANK(); -#undef ENTRY -#define ENTRY(entry) DEFINE(threadinfo_ ## entry, offsetof(struct thread_info, entry)) - ENTRY(flags); - ENTRY(addr_limit); - ENTRY(preempt_count); - BLANK(); -#undef ENTRY -#define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry)) - ENTRY(kernelstack); - ENTRY(oldrsp); - ENTRY(pcurrent); - ENTRY(irqrsp); - ENTRY(irqcount); - ENTRY(cpunumber); - ENTRY(irqstackptr); - ENTRY(kernel_mode); - BLANK(); -#undef ENTRY -#ifdef CONFIG_IA32_EMULATION -#define ENTRY(entry) DEFINE(IA32_SIGCONTEXT_ ## entry, offsetof(struct sigcontext_ia32, entry)) - ENTRY(eax); - ENTRY(ebx); - ENTRY(ecx); - ENTRY(edx); - ENTRY(esi); - ENTRY(edi); - ENTRY(ebp); - ENTRY(esp); - ENTRY(eip); - BLANK(); -#undef ENTRY - DEFINE(IA32_RT_SIGFRAME_sigcontext, - offsetof (struct rt_sigframe32, uc.uc_mcontext)); - BLANK(); -#endif - DEFINE(pbe_address, offsetof(struct pbe, address)); - DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address)); - DEFINE(pbe_next, offsetof(struct pbe, next)); - return 0; -} diff -r 40b887fa79d0 -r 29aab159846c linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pda.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pda.h Fri Aug 12 17:35:15 2005 +++ /dev/null Mon Aug 15 18:32:29 2005 @@ -1,85 +0,0 @@ -#ifndef X86_64_PDA_H -#define X86_64_PDA_H - -#ifndef __ASSEMBLY__ -#include <linux/stddef.h> -#include <linux/types.h> -#include <linux/cache.h> - -/* Per processor datastructure. %gs points to it while the kernel runs */ -struct x8664_pda { - struct task_struct *pcurrent; /* Current process */ - unsigned long data_offset; /* Per cpu data offset from linker address */ - struct x8664_pda *me; /* Pointer to itself */ - unsigned long kernelstack; /* top of kernel stack for current */ - unsigned long oldrsp; /* user rsp for system call */ - unsigned long irqrsp; /* Old rsp for interrupts. */ - int irqcount; /* Irq nesting counter. Starts with -1 */ - int cpunumber; /* Logical CPU number */ - char *irqstackptr; /* top of irqstack */ - unsigned int __softirq_pending; - unsigned int __nmi_count; /* number of NMI on this CPUs */ - unsigned long idle_timestamp; - struct mm_struct *active_mm; - int mmu_state; - unsigned apic_timer_irqs; - int kernel_mode; /* kernel or user mode */ -} ____cacheline_aligned; - - -#define IRQSTACK_ORDER 2 -#define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER) - -extern struct x8664_pda cpu_pda[]; - -/* - * There is no fast way to get the base address of the PDA, all the accesses - * have to mention %fs/%gs. So it needs to be done this Torvaldian way. - */ -#define sizeof_field(type,field) (sizeof(((type *)0)->field)) -#define typeof_field(type,field) typeof(((type *)0)->field) - -extern void __bad_pda_field(void); - -#define pda_offset(field) offsetof(struct x8664_pda, field) - -#define pda_to_op(op,field,val) do { \ - switch (sizeof_field(struct x8664_pda, field)) { \ -case 2: \ -asm volatile(op "w %0,%%gs:%P1"::"r" (val),"i"(pda_offset(field)):"memory"); break; \ -case 4: \ -asm volatile(op "l %0,%%gs:%P1"::"r" (val),"i"(pda_offset(field)):"memory"); break; \ -case 8: \ -asm volatile(op "q %0,%%gs:%P1"::"r" (val),"i"(pda_offset(field)):"memory"); break; \ - default: __bad_pda_field(); \ - } \ - } while (0) - -/* - * AK: PDA read accesses should be neither volatile nor have an memory clobber. - * Unfortunately removing them causes all hell to break lose currently. - */ -#define pda_from_op(op,field) ({ \ - typedef typeof_field(struct x8664_pda, field) T__; T__ ret__; \ - switch (sizeof_field(struct x8664_pda, field)) { \ -case 2: \ -asm volatile(op "w %%gs:%P1,%0":"=r" (ret__):"i"(pda_offset(field)):"memory"); break;\ -case 4: \ -asm volatile(op "l %%gs:%P1,%0":"=r" (ret__):"i"(pda_offset(field)):"memory"); break;\ -case 8: \ -asm volatile(op "q %%gs:%P1,%0":"=r" (ret__):"i"(pda_offset(field)):"memory"); break;\ - default: __bad_pda_field(); \ - } \ - ret__; }) - - -#define read_pda(field) pda_from_op("mov",field) -#define write_pda(field,val) pda_to_op("mov",field,val) -#define add_pda(field,val) pda_to_op("add",field,val) -#define sub_pda(field,val) pda_to_op("sub",field,val) - -#endif - -#define PDA_STACKOFFSET (5*8) - -#endif diff -r 40b887fa79d0 -r 29aab159846c patches/linux-2.6.12/linux-2.6.12.3.patch --- a/patches/linux-2.6.12/linux-2.6.12.3.patch Fri Aug 12 17:35:15 2005 +++ /dev/null Mon Aug 15 18:32:29 2005 @@ -1,1047 +0,0 @@ -diff --git a/Makefile b/Makefile ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - VERSION = 2 - PATCHLEVEL = 6 - SUBLEVEL = 12 --EXTRAVERSION = -+EXTRAVERSION = .3 - NAME=Woozy Numbat - - # *DOCUMENTATION* -diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c ---- a/arch/ia64/kernel/ptrace.c -+++ b/arch/ia64/kernel/ptrace.c -@@ -945,6 +945,13 @@ access_uarea (struct task_struct *child, - *data = (pt->cr_ipsr & IPSR_MASK); - return 0; - -+ case PT_AR_RSC: -+ if (write_access) -+ pt->ar_rsc = *data | (3 << 2); /* force PL3 */ -+ else -+ *data = pt->ar_rsc; -+ return 0; -+ - case PT_AR_RNAT: - urbs_end = ia64_get_user_rbs_end(child, pt, NULL); - rnat_addr = (long) ia64_rse_rnat_addr((long *) -@@ -996,9 +1003,6 @@ access_uarea (struct task_struct *child, - case PT_AR_BSPSTORE: - ptr = pt_reg_addr(pt, ar_bspstore); - break; -- case PT_AR_RSC: -- ptr = pt_reg_addr(pt, ar_rsc); -- break; - case PT_AR_UNAT: - ptr = pt_reg_addr(pt, ar_unat); - break; -@@ -1234,7 +1238,7 @@ ptrace_getregs (struct task_struct *chil - static long - ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) - { -- unsigned long psr, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; -+ unsigned long psr, rsc, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; - struct unw_frame_info info; - struct switch_stack *sw; - struct ia64_fpreg fpval; -@@ -1267,7 +1271,7 @@ ptrace_setregs (struct task_struct *chil - /* app regs */ - - retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); -- retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]); -+ retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]); - retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); - retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); - retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); -@@ -1365,6 +1369,7 @@ ptrace_setregs (struct task_struct *chil - retval |= __get_user(nat_bits, &ppr->nat); - - retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); -+ retval |= access_uarea(child, PT_AR_RSC, &rsc, 1); - retval |= access_uarea(child, PT_AR_EC, &ec, 1); - retval |= access_uarea(child, PT_AR_LC, &lc, 1); - retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); -diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c ---- a/arch/ia64/kernel/signal.c -+++ b/arch/ia64/kernel/signal.c -@@ -94,7 +94,7 @@ sys_sigaltstack (const stack_t __user *u - static long - restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) - { -- unsigned long ip, flags, nat, um, cfm; -+ unsigned long ip, flags, nat, um, cfm, rsc; - long err; - - /* Always make any pending restarted system calls return -EINTR */ -@@ -106,7 +106,7 @@ restore_sigcontext (struct sigcontext __ - err |= __get_user(ip, &sc->sc_ip); /* instruction pointer */ - err |= __get_user(cfm, &sc->sc_cfm); - err |= __get_user(um, &sc->sc_um); /* user mask */ -- err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc); -+ err |= __get_user(rsc, &sc->sc_ar_rsc); - err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat); - err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); - err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs); -@@ -119,6 +119,7 @@ restore_sigcontext (struct sigcontext __ - err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8); /* r15 */ - - scr->pt.cr_ifs = cfm | (1UL << 63); -+ scr->pt.ar_rsc = rsc | (3 << 2); /* force PL3 */ - - /* establish new instruction pointer: */ - scr->pt.cr_iip = ip & ~0x3UL; -diff --git a/arch/ppc/kernel/time.c b/arch/ppc/kernel/time.c ---- a/arch/ppc/kernel/time.c -+++ b/arch/ppc/kernel/time.c -@@ -89,6 +89,9 @@ unsigned long tb_to_ns_scale; - - extern unsigned long wall_jiffies; - -+/* used for timezone offset */ -+static long timezone_offset; -+ - DEFINE_SPINLOCK(rtc_lock); - - EXPORT_SYMBOL(rtc_lock); -@@ -170,7 +173,7 @@ void timer_interrupt(struct pt_regs * re - xtime.tv_sec - last_rtc_update >= 659 && - abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ && - jiffies - wall_jiffies == 1) { -- if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0) -+ if (ppc_md.set_rtc_time(xtime.tv_sec+1 + timezone_offset) == 0) - last_rtc_update = xtime.tv_sec+1; - else - /* Try again one minute later */ -@@ -286,7 +289,7 @@ void __init time_init(void) - unsigned old_stamp, stamp, elapsed; - - if (ppc_md.time_init != NULL) -- time_offset = ppc_md.time_init(); -+ timezone_offset = ppc_md.time_init(); - - if (__USE_RTC()) { - /* 601 processor: dec counts down by 128 every 128ns */ -@@ -331,10 +334,10 @@ void __init time_init(void) - set_dec(tb_ticks_per_jiffy); - - /* If platform provided a timezone (pmac), we correct the time */ -- if (time_offset) { -- sys_tz.tz_minuteswest = -time_offset / 60; -+ if (timezone_offset) { -+ sys_tz.tz_minuteswest = -timezone_offset / 60; - sys_tz.tz_dsttime = 0; -- xtime.tv_sec -= time_offset; -+ xtime.tv_sec -= timezone_offset; - } - set_normalized_timespec(&wall_to_monotonic, - -xtime.tv_sec, -xtime.tv_nsec); -diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c ---- a/arch/um/kernel/process.c -+++ b/arch/um/kernel/process.c -@@ -130,7 +130,7 @@ int start_fork_tramp(void *thread_arg, u - return(arg.pid); - } - --static int ptrace_child(void) -+static int ptrace_child(void *arg) - { - int ret; - int pid = os_getpid(), ppid = getppid(); -@@ -159,16 +159,20 @@ static int ptrace_child(void) - _exit(ret); - } - --static int start_ptraced_child(void) -+static int start_ptraced_child(void **stack_out) - { -+ void *stack; -+ unsigned long sp; - int pid, n, status; - -- pid = fork(); -- if(pid == 0) -- ptrace_child(); -- -+ stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ if(stack == MAP_FAILED) -+ panic("check_ptrace : mmap failed, errno = %d", errno); -+ sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); -+ pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); - if(pid < 0) -- panic("check_ptrace : fork failed, errno = %d", errno); -+ panic("check_ptrace : clone failed, errno = %d", errno); - CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); - if(n < 0) - panic("check_ptrace : wait failed, errno = %d", errno); -@@ -176,6 +180,7 @@ static int start_ptraced_child(void) - panic("check_ptrace : expected SIGSTOP, got status = %d", - status); - -+ *stack_out = stack; - return(pid); - } - -@@ -183,12 +188,12 @@ static int start_ptraced_child(void) - * just avoid using sysemu, not panic, but only if SYSEMU features are broken. - * So only for SYSEMU features we test mustpanic, while normal host features - * must work anyway!*/ --static int stop_ptraced_child(int pid, int exitcode, int mustexit) -+static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic) - { - int status, n, ret = 0; - - if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) -- panic("stop_ptraced_child : ptrace failed, errno = %d", errno); -+ panic("check_ptrace : ptrace failed, errno = %d", errno); - CATCH_EINTR(n = waitpid(pid, &status, 0)); - if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) { - int exit_with = WEXITSTATUS(status); -@@ -199,13 +204,15 @@ static int stop_ptraced_child(int pid, i - printk("check_ptrace : child exited with exitcode %d, while " - "expecting %d; status 0x%x", exit_with, - exitcode, status); -- if (mustexit) -+ if (mustpanic) - panic("\n"); - else - printk("\n"); - ret = -1; - } - -+ if(munmap(stack, PAGE_SIZE) < 0) -+ panic("check_ptrace : munmap failed, errno = %d", errno); - return ret; - } - -@@ -227,11 +234,12 @@ __uml_setup("nosysemu", nosysemu_cmd_par - - static void __init check_sysemu(void) - { -+ void *stack; - int pid, syscall, n, status, count=0; - - printk("Checking syscall emulation patch for ptrace..."); - sysemu_supported = 0; -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - - if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0) - goto fail; -@@ -249,7 +257,7 @@ static void __init check_sysemu(void) - panic("check_sysemu : failed to modify system " - "call return, errno = %d", errno); - -- if (stop_ptraced_child(pid, 0, 0) < 0) -+ if (stop_ptraced_child(pid, stack, 0, 0) < 0) - goto fail_stopped; - - sysemu_supported = 1; -@@ -257,7 +265,7 @@ static void __init check_sysemu(void) - set_using_sysemu(!force_sysemu_disabled); - - printk("Checking advanced syscall emulation patch for ptrace..."); -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - while(1){ - count++; - if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0) -@@ -282,7 +290,7 @@ static void __init check_sysemu(void) - break; - } - } -- if (stop_ptraced_child(pid, 0, 0) < 0) -+ if (stop_ptraced_child(pid, stack, 0, 0) < 0) - goto fail_stopped; - - sysemu_supported = 2; -@@ -293,17 +301,18 @@ static void __init check_sysemu(void) - return; - - fail: -- stop_ptraced_child(pid, 1, 0); -+ stop_ptraced_child(pid, stack, 1, 0); - fail_stopped: - printk("missing\n"); - } - - void __init check_ptrace(void) - { -+ void *stack; - int pid, syscall, n, status; - - printk("Checking that ptrace can change system call numbers..."); -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - - if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) - panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno); -@@ -330,7 +339,7 @@ void __init check_ptrace(void) - break; - } - } -- stop_ptraced_child(pid, 0, 1); -+ stop_ptraced_child(pid, stack, 0, 1); - printk("OK\n"); - check_sysemu(); - } -@@ -362,10 +371,11 @@ void forward_pending_sigio(int target) - static inline int check_skas3_ptrace_support(void) - { - struct ptrace_faultinfo fi; -+ void *stack; - int pid, n, ret = 1; - - printf("Checking for the skas3 patch in the host..."); -- pid = start_ptraced_child(); -+ pid = start_ptraced_child(&stack); - - n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); - if (n < 0) { -@@ -380,7 +390,7 @@ static inline int check_skas3_ptrace_sup - } - - init_registers(pid); -- stop_ptraced_child(pid, 1, 1); -+ stop_ptraced_child(pid, stack, 1, 1); - - return(ret); - } -diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c ---- a/drivers/acpi/pci_irq.c -+++ b/drivers/acpi/pci_irq.c -@@ -433,8 +433,9 @@ acpi_pci_irq_enable ( - printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: no GSI", - pci_name(dev), ('A' + pin)); - /* Interrupt Line values above 0xF are forbidden */ -- if (dev->irq >= 0 && (dev->irq <= 0xF)) { -+ if (dev->irq > 0 && (dev->irq <= 0xF)) { - printk(" - using IRQ %d\n", dev->irq); -+ acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW); - return_VALUE(0); - } - else { -diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c ---- a/drivers/char/tpm/tpm.c -+++ b/drivers/char/tpm/tpm.c -@@ -32,12 +32,6 @@ - - #define TPM_BUFSIZE 2048 - --/* PCI configuration addresses */ --#define PCI_GEN_PMCON_1 0xA0 --#define PCI_GEN1_DEC 0xE4 --#define PCI_LPC_EN 0xE6 --#define PCI_GEN2_DEC 0xEC -- - static LIST_HEAD(tpm_chip_list); - static DEFINE_SPINLOCK(driver_lock); - static int dev_mask[32]; -@@ -61,72 +55,6 @@ void tpm_time_expired(unsigned long ptr) - EXPORT_SYMBOL_GPL(tpm_time_expired); - - /* -- * Initialize the LPC bus and enable the TPM ports -- */ --int tpm_lpc_bus_init(struct pci_dev *pci_dev, u16 base) --{ -- u32 lpcenable, tmp; -- int is_lpcm = 0; -- -- switch (pci_dev->vendor) { -- case PCI_VENDOR_ID_INTEL: -- switch (pci_dev->device) { -- case PCI_DEVICE_ID_INTEL_82801CA_12: -- case PCI_DEVICE_ID_INTEL_82801DB_12: -- is_lpcm = 1; -- break; -- } -- /* init ICH (enable LPC) */ -- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, &lpcenable); -- lpcenable |= 0x20000000; -- pci_write_config_dword(pci_dev, PCI_GEN1_DEC, lpcenable); -- -- if (is_lpcm) { -- pci_read_config_dword(pci_dev, PCI_GEN1_DEC, -- &lpcenable); -- if ((lpcenable & 0x20000000) == 0) { -- dev_err(&pci_dev->dev, -- "cannot enable LPC\n"); -- return -ENODEV; -- } -- } -- -- /* initialize TPM registers */ -- pci_read_config_dword(pci_dev, PCI_GEN2_DEC, &tmp); -- -- if (!is_lpcm) -- tmp = (tmp & 0xFFFF0000) | (base & 0xFFF0); -- else -- tmp = -- (tmp & 0xFFFF0000) | (base & 0xFFF0) | -- 0x00000001; -- -- pci_write_config_dword(pci_dev, PCI_GEN2_DEC, tmp); -- -- if (is_lpcm) { -- pci_read_config_dword(pci_dev, PCI_GEN_PMCON_1, -- &tmp); -- tmp |= 0x00000004; /* enable CLKRUN */ -- pci_write_config_dword(pci_dev, PCI_GEN_PMCON_1, -- tmp); -- } -- tpm_write_index(0x0D, 0x55); /* unlock 4F */ -- tpm_write_index(0x0A, 0x00); /* int disable */ -- tpm_write_index(0x08, base); /* base addr lo */ -- tpm_write_index(0x09, (base & 0xFF00) >> 8); /* base addr hi */ -- tpm_write_index(0x0D, 0xAA); /* lock 4F */ -- break; -- case PCI_VENDOR_ID_AMD: -- /* nothing yet */ -- break; -- } -- -- return 0; --} -- --EXPORT_SYMBOL_GPL(tpm_lpc_bus_init); -- --/* - * Internal kernel interface to transmit TPM commands - */ - static ssize_t tpm_transmit(struct tpm_chip *chip, const char *buf, -@@ -590,10 +518,6 @@ int tpm_pm_resume(struct pci_dev *pci_de - if (chip == NULL) - return -ENODEV; - -- spin_lock(&driver_lock); -- tpm_lpc_bus_init(pci_dev, chip->vendor->base); -- spin_unlock(&driver_lock); -- - return 0; - } - -diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h ---- a/drivers/char/tpm/tpm.h -+++ b/drivers/char/tpm/tpm.h -@@ -79,8 +79,6 @@ static inline void tpm_write_index(int i - } - - extern void tpm_time_expired(unsigned long); --extern int tpm_lpc_bus_init(struct pci_dev *, u16); -- - extern int tpm_register_hardware(struct pci_dev *, - struct tpm_vendor_specific *); - extern int tpm_open(struct inode *, struct file *); -diff --git a/drivers/char/tpm/tpm_atmel.c b/drivers/char/tpm/tpm_atmel.c ---- a/drivers/char/tpm/tpm_atmel.c -+++ b/drivers/char/tpm/tpm_atmel.c -@@ -22,7 +22,10 @@ - #include "tpm.h" - - /* Atmel definitions */ --#define TPM_ATML_BASE 0x400 -+enum tpm_atmel_addr { -+ TPM_ATMEL_BASE_ADDR_LO = 0x08, -+ TPM_ATMEL_BASE_ADDR_HI = 0x09 -+}; - - /* write status bits */ - #define ATML_STATUS_ABORT 0x01 -@@ -127,7 +130,6 @@ static struct tpm_vendor_specific tpm_at - .cancel = tpm_atml_cancel, - .req_complete_mask = ATML_STATUS_BUSY | ATML_STATUS_DATA_AVAIL, - .req_complete_val = ATML_STATUS_DATA_AVAIL, -- .base = TPM_ATML_BASE, - .miscdev = { .fops = &atmel_ops, }, - }; - -@@ -136,14 +138,16 @@ static int __devinit tpm_atml_init(struc - { - u8 version[4]; - int rc = 0; -+ int lo, hi; - - if (pci_enable_device(pci_dev)) - return -EIO; - -- if (tpm_lpc_bus_init(pci_dev, TPM_ATML_BASE)) { -- rc = -ENODEV; -- goto out_err; -- } -+ lo = tpm_read_index( TPM_ATMEL_BASE_ADDR_LO ); -+ hi = tpm_read_index( TPM_ATMEL_BASE_ADDR_HI ); -+ -+ tpm_atmel.base = (hi<<8)|lo; -+ dev_dbg( &pci_dev->dev, "Operating with base: 0x%x\n", tpm_atmel.base); - - /* verify that it is an Atmel part */ - if (tpm_read_index(4) != 'A' || tpm_read_index(5) != 'T' -diff --git a/drivers/char/tpm/tpm_nsc.c b/drivers/char/tpm/tpm_nsc.c ---- a/drivers/char/tpm/tpm_nsc.c -+++ b/drivers/char/tpm/tpm_nsc.c -@@ -24,6 +24,10 @@ - /* National definitions */ - #define TPM_NSC_BASE 0x360 - #define TPM_NSC_IRQ 0x07 -+#define TPM_NSC_BASE0_HI 0x60 -+#define TPM_NSC_BASE0_LO 0x61 -+#define TPM_NSC_BASE1_HI 0x62 -+#define TPM_NSC_BASE1_LO 0x63 - - #define NSC_LDN_INDEX 0x07 - #define NSC_SID_INDEX 0x20 -@@ -234,7 +238,6 @@ static struct tpm_vendor_specific tpm_ns - .cancel = tpm_nsc_cancel, - .req_complete_mask = NSC_STATUS_OBF, - .req_complete_val = NSC_STATUS_OBF, -- .base = TPM_NSC_BASE, - .miscdev = { .fops = &nsc_ops, }, - - }; -@@ -243,15 +246,16 @@ static int __devinit tpm_nsc_init(struct - const struct pci_device_id *pci_id) - { - int rc = 0; -+ int lo, hi; -+ -+ hi = tpm_read_index(TPM_NSC_BASE0_HI); -+ lo = tpm_read_index(TPM_NSC_BASE0_LO); -+ -+ tpm_nsc.base = (hi<<8) | lo; - - if (pci_enable_device(pci_dev)) - return -EIO; - -- if (tpm_lpc_bus_init(pci_dev, TPM_NSC_BASE)) { -- rc = -ENODEV; -- goto out_err; -- } -- - /* verify that it is a National part (SID) */ - if (tpm_read_index(NSC_SID_INDEX) != 0xEF) { - rc = -ENODEV; -diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c ---- a/drivers/char/tty_ioctl.c -+++ b/drivers/char/tty_ioctl.c -@@ -476,11 +476,11 @@ int n_tty_ioctl(struct tty_struct * tty, - ld = tty_ldisc_ref(tty); - switch (arg) { - case TCIFLUSH: -- if (ld->flush_buffer) -+ if (ld && ld->flush_buffer) - ld->flush_buffer(tty); - break; - case TCIOFLUSH: -- if (ld->flush_buffer) -+ if (ld && ld->flush_buffer) - ld->flush_buffer(tty); - /* fall through */ - case TCOFLUSH: -diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c ---- a/drivers/media/video/cx88/cx88-video.c -+++ b/drivers/media/video/cx88/cx88-video.c -@@ -261,7 +261,7 @@ static struct cx88_ctrl cx8800_ctls[] = - .default_value = 0, - .type = V4L2_CTRL_TYPE_INTEGER, - }, -- .off = 0, -+ .off = 128, - .reg = MO_HUE, - .mask = 0x00ff, - .shift = 0, -diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c ---- a/drivers/net/e1000/e1000_main.c -+++ b/drivers/net/e1000/e1000_main.c -@@ -2307,6 +2307,7 @@ e1000_xmit_frame(struct sk_buff *skb, st - tso = e1000_tso(adapter, skb); - if (tso < 0) { - dev_kfree_skb_any(skb); -+ spin_unlock_irqrestore(&adapter->tx_lock, flags); - return NETDEV_TX_OK; - } - -diff --git a/drivers/net/hamradio/Kconfig b/drivers/net/hamradio/Kconfig ---- a/drivers/net/hamradio/Kconfig -+++ b/drivers/net/hamradio/Kconfig -@@ -17,7 +17,7 @@ config MKISS - - config 6PACK - tristate "Serial port 6PACK driver" -- depends on AX25 && BROKEN_ON_SMP -+ depends on AX25 - ---help--- - 6pack is a transmission protocol for the data exchange between your - PC and your TNC (the Terminal Node Controller acts as a kind of -diff --git a/drivers/net/shaper.c b/drivers/net/shaper.c ---- a/drivers/net/shaper.c -+++ b/drivers/net/shaper.c -@@ -135,10 +135,8 @@ static int shaper_start_xmit(struct sk_b - { - struct shaper *shaper = dev->priv; - struct sk_buff *ptr; -- -- if (down_trylock(&shaper->sem)) -- return -1; - -+ spin_lock(&shaper->lock); - ptr=shaper->sendq.prev; - - /* -@@ -232,7 +230,7 @@ static int shaper_start_xmit(struct sk_b - shaper->stats.collisions++; - } - shaper_kick(shaper); -- up(&shaper->sem); -+ spin_unlock(&shaper->lock); - return 0; - } - -@@ -271,11 +269,9 @@ static void shaper_timer(unsigned long d - { - struct shaper *shaper = (struct shaper *)data; - -- if (!down_trylock(&shaper->sem)) { -- shaper_kick(shaper); -- up(&shaper->sem); -- } else -- mod_timer(&shaper->timer, jiffies); -+ spin_lock(&shaper->lock); -+ shaper_kick(shaper); -+ spin_unlock(&shaper->lock); - } - - /* -@@ -332,21 +328,6 @@ static void shaper_kick(struct shaper *s - - - /* -- * Flush the shaper queues on a closedown -- */ -- --static void shaper_flush(struct shaper *shaper) --{ -- struct sk_buff *skb; -- -- down(&shaper->sem); -- while((skb=skb_dequeue(&shaper->sendq))!=NULL) -- dev_kfree_skb(skb); -- shaper_kick(shaper); -- up(&shaper->sem); --} -- --/* - * Bring the interface up. We just disallow this until a - * bind. - */ -@@ -375,7 +356,15 @@ static int shaper_open(struct net_device - static int shaper_close(struct net_device *dev) - { - struct shaper *shaper=dev->priv; -- shaper_flush(shaper); -+ struct sk_buff *skb; -+ -+ while ((skb = skb_dequeue(&shaper->sendq)) != NULL) -+ dev_kfree_skb(skb); -+ -+ spin_lock_bh(&shaper->lock); -+ shaper_kick(shaper); -+ spin_unlock_bh(&shaper->lock); -+ - del_timer_sync(&shaper->timer); - return 0; - } -@@ -576,6 +565,7 @@ static void shaper_init_priv(struct net_ - init_timer(&sh->timer); - sh->timer.function=shaper_timer; - sh->timer.data=(unsigned long)sh; -+ spin_lock_init(&sh->lock); - } - - /* -diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c ---- a/drivers/pci/pci-driver.c -+++ b/drivers/pci/pci-driver.c -@@ -396,7 +396,7 @@ int pci_register_driver(struct pci_drive - /* FIXME, once all of the existing PCI drivers have been fixed to set - * the pci shutdown function, this test can go away. */ - if (!drv->driver.shutdown) -- drv->driver.shutdown = pci_device_shutdown, -+ drv->driver.shutdown = pci_device_shutdown; - drv->driver.owner = drv->owner; - drv->driver.kobj.ktype = &pci_driver_kobj_type; - pci_init_dynids(&drv->dynids); -diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c ---- a/drivers/scsi/qla2xxx/qla_os.c -+++ b/drivers/scsi/qla2xxx/qla_os.c -@@ -1150,7 +1150,7 @@ iospace_error_exit: - */ - int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) - { -- int ret; -+ int ret = -ENODEV; - device_reg_t __iomem *reg; - struct Scsi_Host *host; - scsi_qla_host_t *ha; -@@ -1161,7 +1161,7 @@ int qla2x00_probe_one(struct pci_dev *pd - fc_port_t *fcport; - - if (pci_enable_device(pdev)) -- return -1; -+ goto probe_out; - - host = scsi_host_alloc(&qla2x00_driver_template, - sizeof(scsi_qla_host_t)); -@@ -1183,9 +1183,8 @@ int qla2x00_probe_one(struct pci_dev *pd - - /* Configure PCI I/O space */ - ret = qla2x00_iospace_config(ha); -- if (ret != 0) { -- goto probe_alloc_failed; -- } -+ if (ret) -+ goto probe_failed; - - /* Sanitize the information from PCI BIOS. */ - host->irq = pdev->irq; -@@ -1258,23 +1257,10 @@ int qla2x00_probe_one(struct pci_dev *pd - qla_printk(KERN_WARNING, ha, - "[ERROR] Failed to allocate memory for adapter\n"); - -- goto probe_alloc_failed; -+ ret = -ENOMEM; -+ goto probe_failed; - } - -- pci_set_drvdata(pdev, ha); -- host->this_id = 255; -- host->cmd_per_lun = 3; -- host->unique_id = ha->instance; -- host->max_cmd_len = MAX_CMDSZ; -- host->max_channel = ha->ports - 1; -- host->max_id = ha->max_targets; -- host->max_lun = ha->max_luns; -- host->transportt = qla2xxx_transport_template; -- if (scsi_add_host(host, &pdev->dev)) -- goto probe_alloc_failed; -- -- qla2x00_alloc_sysfs_attr(ha); -- - if (qla2x00_initialize_adapter(ha) && - !(ha->device_flags & DFLG_NO_CABLE)) { - -@@ -1285,11 +1271,10 @@ int qla2x00_probe_one(struct pci_dev *pd - "Adapter flags %x.\n", - ha->host_no, ha->device_flags)); - -+ ret = -ENODEV; - goto probe_failed; - } - -- qla2x00_init_host_attr(ha); -- - /* - * Startup the kernel thread for this host adapter - */ -@@ -1299,17 +1284,26 @@ int qla2x00_probe_one(struct pci_dev *pd - qla_printk(KERN_WARNING, ha, - "Unable to start DPC thread!\n"); - -+ ret = -ENODEV; - goto probe_failed; - } - wait_for_completion(&ha->dpc_inited); - -+ host->this_id = 255; -+ host->cmd_per_lun = 3; -+ host->unique_id = ha->instance; -+ host->max_cmd_len = MAX_CMDSZ; -+ host->max_channel = ha->ports - 1; -+ host->max_lun = MAX_LUNS; -+ host->transportt = qla2xxx_transport_template; -+ - if (IS_QLA2100(ha) || IS_QLA2200(ha)) - ret = request_irq(host->irq, qla2100_intr_handler, - SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); - else - ret = request_irq(host->irq, qla2300_intr_handler, - SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); -- if (ret != 0) { -+ if (ret) { - qla_printk(KERN_WARNING, ha, - "Failed to reserve interrupt %d already in use.\n", - host->irq); -@@ -1363,9 +1357,18 @@ int qla2x00_probe_one(struct pci_dev *pd - msleep(10); - } - -+ pci_set_drvdata(pdev, ha); - ha->flags.init_done = 1; - num_hosts++; - -+ ret = scsi_add_host(host, &pdev->dev); -+ if (ret) -+ goto probe_failed; -+ -+ qla2x00_alloc_sysfs_attr(ha); -+ -+ qla2x00_init_host_attr(ha); -+ - qla_printk(KERN_INFO, ha, "\n" - " QLogic Fibre Channel HBA Driver: %s\n" - " QLogic %s - %s\n" -@@ -1384,9 +1387,6 @@ int qla2x00_probe_one(struct pci_dev *pd - probe_failed: - fc_remove_host(ha->host); - -- scsi_remove_host(host); -- --probe_alloc_failed: - qla2x00_free_device(ha); - - scsi_host_put(host); -@@ -1394,7 +1394,8 @@ probe_alloc_failed: - probe_disable_device: - pci_disable_device(pdev); - -- return -1; -+probe_out: -+ return ret; - } - EXPORT_SYMBOL_GPL(qla2x00_probe_one); - -diff --git a/fs/char_dev.c b/fs/char_dev.c ---- a/fs/char_dev.c -+++ b/fs/char_dev.c -@@ -139,7 +139,7 @@ __unregister_chrdev_region(unsigned majo - struct char_device_struct *cd = NULL, **cp; - int i = major_to_index(major); - -- up(&chrdevs_lock); -+ down(&chrdevs_lock); - for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next) - if ((*cp)->major == major && - (*cp)->baseminor == baseminor && -diff --git a/fs/exec.c b/fs/exec.c ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -649,6 +649,7 @@ static inline int de_thread(struct task_ - } - sig->group_exit_task = NULL; - sig->notify_count = 0; -+ sig->real_timer.data = (unsigned long)current; - spin_unlock_irq(lock); - - /* -diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h ---- a/include/asm-i386/string.h -+++ b/include/asm-i386/string.h -@@ -116,7 +116,8 @@ __asm__ __volatile__( - "orb $1,%%al\n" - "3:" - :"=a" (__res), "=&S" (d0), "=&D" (d1) -- :"1" (cs),"2" (ct)); -+ :"1" (cs),"2" (ct) -+ :"memory"); - return __res; - } - -@@ -138,8 +139,9 @@ __asm__ __volatile__( - "3:\tsbbl %%eax,%%eax\n\t" - "orb $1,%%al\n" - "4:" -- :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) -- :"1" (cs),"2" (ct),"3" (count)); -+ :"=a" (__res), "=&S" (d0), "=&D" (d1), "=&c" (d2) -+ :"1" (cs),"2" (ct),"3" (count) -+ :"memory"); - return __res; - } - -@@ -158,7 +160,9 @@ __asm__ __volatile__( - "movl $1,%1\n" - "2:\tmovl %1,%0\n\t" - "decl %0" -- :"=a" (__res), "=&S" (d0) : "1" (s),"0" (c)); -+ :"=a" (__res), "=&S" (d0) -+ :"1" (s),"0" (c) -+ :"memory"); - return __res; - } - -@@ -175,7 +179,9 @@ __asm__ __volatile__( - "leal -1(%%esi),%0\n" - "2:\ttestb %%al,%%al\n\t" - "jne 1b" -- :"=g" (__res), "=&S" (d0), "=&a" (d1) :"0" (0),"1" (s),"2" (c)); -+ :"=g" (__res), "=&S" (d0), "=&a" (d1) -+ :"0" (0),"1" (s),"2" (c) -+ :"memory"); - return __res; - } - -@@ -189,7 +195,9 @@ __asm__ __volatile__( - "scasb\n\t" - "notl %0\n\t" - "decl %0" -- :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffu)); -+ :"=c" (__res), "=&D" (d0) -+ :"1" (s),"a" (0), "0" (0xffffffffu) -+ :"memory"); - return __res; - } - -@@ -333,7 +341,9 @@ __asm__ __volatile__( - "je 1f\n\t" - "movl $1,%0\n" - "1:\tdecl %0" -- :"=D" (__res), "=&c" (d0) : "a" (c),"0" (cs),"1" (count)); -+ :"=D" (__res), "=&c" (d0) -+ :"a" (c),"0" (cs),"1" (count) -+ :"memory"); - return __res; - } - -@@ -369,7 +379,7 @@ __asm__ __volatile__( - "je 2f\n\t" - "stosb\n" - "2:" -- : "=&c" (d0), "=&D" (d1) -+ :"=&c" (d0), "=&D" (d1) - :"a" (c), "q" (count), "0" (count/4), "1" ((long) s) - :"memory"); - return (s); -@@ -392,7 +402,8 @@ __asm__ __volatile__( - "jne 1b\n" - "3:\tsubl %2,%0" - :"=a" (__res), "=&d" (d0) -- :"c" (s),"1" (count)); -+ :"c" (s),"1" (count) -+ :"memory"); - return __res; - } - /* end of additional stuff */ -@@ -473,7 +484,8 @@ static inline void * memscan(void * addr - "dec %%edi\n" - "1:" - : "=D" (addr), "=c" (size) -- : "0" (addr), "1" (size), "a" (c)); -+ : "0" (addr), "1" (size), "a" (c) -+ : "memory"); - return addr; - } - -diff --git a/include/linux/if_shaper.h b/include/linux/if_shaper.h ---- a/include/linux/if_shaper.h -+++ b/include/linux/if_shaper.h -@@ -23,7 +23,7 @@ struct shaper - __u32 shapeclock; - unsigned long recovery; /* Time we can next clock a packet out on - an empty queue */ -- struct semaphore sem; -+ spinlock_t lock; - struct net_device_stats stats; - struct net_device *dev; - int (*hard_start_xmit) (struct sk_buff *skb, -diff --git a/mm/memory.c b/mm/memory.c ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -1164,7 +1164,7 @@ int remap_pfn_range(struct vm_area_struc - { - pgd_t *pgd; - unsigned long next; -- unsigned long end = addr + size; -+ unsigned long end = addr + PAGE_ALIGN(size); - struct mm_struct *mm = vma->vm_mm; - int err; - -diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c ---- a/net/ipv4/ip_output.c -+++ b/net/ipv4/ip_output.c -@@ -111,7 +111,6 @@ static int ip_dev_loopback_xmit(struct s - #ifdef CONFIG_NETFILTER_DEBUG - nf_debug_ip_loopback_xmit(newskb); - #endif -- nf_reset(newskb); - netif_rx(newskb); - return 0; - } -@@ -196,8 +195,6 @@ static inline int ip_finish_output2(stru - nf_debug_ip_finish_output2(skb); - #endif /*CONFIG_NETFILTER_DEBUG*/ - -- nf_reset(skb); -- - if (hh) { - int hh_alen; - -diff --git a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c ---- a/net/ipv4/netfilter/ip_conntrack_standalone.c -+++ b/net/ipv4/netfilter/ip_conntrack_standalone.c -@@ -432,6 +432,13 @@ static unsigned int ip_conntrack_defrag( - const struct net_device *out, - int (*okfn)(struct sk_buff *)) - { -+#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE) -+ /* Previously seen (loopback)? Ignore. Do this before -+ fragment check. */ -+ if ((*pskb)->nfct) -+ return NF_ACCEPT; -+#endif -+ - /* Gather fragments. */ - if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { - *pskb = ip_ct_gather_frags(*pskb, -diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c ---- a/net/netlink/af_netlink.c -+++ b/net/netlink/af_netlink.c -@@ -315,8 +315,8 @@ err: - static void netlink_remove(struct sock *sk) - { - netlink_table_grab(); -- nl_table[sk->sk_protocol].hash.entries--; -- sk_del_node_init(sk); -+ if (sk_del_node_init(sk)) -+ nl_table[sk->sk_protocol].hash.entries--; - if (nlk_sk(sk)->groups) - __sk_del_bind_node(sk); - netlink_table_ungrab(); -@@ -429,7 +429,12 @@ retry: - err = netlink_insert(sk, pid); - if (err == -EADDRINUSE) - goto retry; -- return 0; -+ -+ /* If 2 threads race to autobind, that is fine. */ -+ if (err == -EBUSY) -+ err = 0; -+ -+ return err; - } - - static inline int netlink_capable(struct socket *sock, unsigned int flag) -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -274,6 +274,9 @@ static int packet_rcv_spkt(struct sk_buf - dst_release(skb->dst); - skb->dst = NULL; - -+ /* drop conntrack reference */ -+ nf_reset(skb); -+ - spkt = (struct sockaddr_pkt*)skb->cb; - - skb_push(skb, skb->data-skb->mac.raw); -@@ -517,6 +520,9 @@ static int packet_rcv(struct sk_buff *sk - dst_release(skb->dst); - skb->dst = NULL; - -+ /* drop conntrack reference */ -+ nf_reset(skb); -+ - spin_lock(&sk->sk_receive_queue.lock); - po->stats.tp_packets++; - __skb_queue_tail(&sk->sk_receive_queue, skb); diff -r 40b887fa79d0 -r 29aab159846c tools/examples/network --- a/tools/examples/network Fri Aug 12 17:35:15 2005 +++ /dev/null Mon Aug 15 18:32:29 2005 @@ -1,246 +0,0 @@ -#!/bin/sh -#============================================================================ -# Default Xen network start/stop script. -# Xend calls a network script when it starts. -# The script name to use is defined in /etc/xen/xend-config.sxp -# in the network-script field. -# -# This script creates a bridge (default xen-br0), adds a device -# (default eth0) to it, copies the IP addresses from the device -# to the bridge and adjusts the routes accordingly. -# -# If all goes well, this should ensure that networking stays up. -# However, some configurations are upset by this, especially -# NFS roots. If the bridged setup does not meet your needs, -# configure a different script, for example using routing instead. -# -# Usage: -# -# network (start|stop|status) {VAR=VAL}* -# -# Vars: -# -# bridge The bridge to use (default xen-br0). -# netdev The interface to add to the bridge (default eth0). -# antispoof Whether to use iptables to prevent spoofing (default yes). -# -# start: -# Creates the bridge and enslaves netdev to it. -# Copies the IP addresses from netdev to the bridge. -# Deletes the routes to netdev and adds them on bridge. -# -# stop: -# Removes netdev from the bridge. -# Deletes the routes to bridge and adds them to netdev. -# -# status: -# Print ifconfig for netdev and bridge. -# Print routes. -# -#============================================================================ - -# Exit if anything goes wrong. -set -e - -# First arg is the operation. -OP=$1 -shift - -# Pull variables in args in to environment. -for arg ; do export "${arg}" ; done - -bridge=${bridge:-xen-br0} -netdev=${netdev:-eth0} -antispoof=${antispoof:-yes} - -echo "*network $OP bridge=$bridge netdev=$netdev antispoof=$antispoof" >&2 - -# Usage: transfer_addrs src dst -# Copy all IP addresses (including aliases) from device $src to device $dst. -transfer_addrs () { - local src=$1 - local dst=$2 - # Don't bother if $dst already has IP addresses. - if ip addr show dev ${dst} | egrep -q '^ *inet ' ; then - return - fi - # Address lines start with 'inet' and have the device in them. - # Replace 'inet' with 'ip addr add' and change the device name $src - # to 'dev $src'. - ip addr show dev ${src} | egrep '^ *inet ' | sed -e " -s/inet/ip addr add/ -s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\1@ -s/${src}/dev ${dst}/ -" | sh -e - # Remove automatic routes on destionation device - ip route list | sed -ne " -/dev ${dst}\( \|$\)/ { - s/^/ip route del / - p -}" | sh -e -} - -# Usage: del_addrs src -del_addrs () { - local src=$1 - ip addr show dev ${src} | egrep '^ *inet ' | sed -e " -s/inet/ip addr del/ -s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)/[0-9]\+@\1@ -s/${src}/dev ${src}/ -" | sh -e -} - -# Usage: transfer_routes src dst -# Get all IP routes to device $src, delete them, and -# add the same routes to device $dst. -# The original routes have to be deleted, otherwise adding them -# for $dst fails (duplicate routes). -transfer_routes () { - local src=$1 - local dst=$2 - # List all routes and grep the ones with $src in. - # Stick 'ip route del' on the front to delete. - # Change $src to $dst and use 'ip route add' to add. - ip route list | sed -ne " -/dev ${src}\( \|$\)/ { - h - s/^/ip route del / - P - g - s/${src}/${dst}/ - s/^/ip route add / - P - d -}" | sh -e -} - -# Usage: create_bridge bridge -create_bridge () { - local bridge=$1 - - # Don't create the bridge if it already exists. - if ! brctl show | grep -q ${bridge} ; then - brctl addbr ${bridge} - brctl stp ${bridge} off - brctl setfd ${bridge} 0 - fi - ifconfig ${bridge} up -} - -# Usage: add_to_bridge bridge dev -add_to_bridge () { - local bridge=$1 - local dev=$2 - # Don't add $dev to $bridge if it's already on a bridge. - if ! brctl show | grep -q ${dev} ; then - brctl addif ${bridge} ${dev} - fi -} - -# Usage: antispoofing dev bridge -# Set the default forwarding policy for $dev to drop. -# Allow forwarding to the bridge. -antispoofing () { - local dev=$1 - local bridge=$2 - - iptables -P FORWARD DROP - iptables -A FORWARD -m physdev --physdev-in ${dev} -j ACCEPT -} - -# Usage: show_status dev bridge -# Print ifconfig and routes. -show_status () { - local dev=$1 - local bridge=$2 - - echo '============================================================' - ifconfig ${dev} - ifconfig ${bridge} - echo ' ' - ip route list - echo ' ' - route -n - echo '============================================================' -} - -op_start () { - if [ "${bridge}" == "null" ] ; then - return - fi - - create_bridge ${bridge} - - if ifconfig 2>/dev/null | grep -q veth0 ; then - return - fi - - if ifconfig veth0 2>/dev/null | grep -q veth0 ; then - # Propagate MAC address and ARP responsibilities to virtual interface. - mac=`ifconfig ${netdev} | grep HWadd | sed -e 's/.*\(..:..:..:..:..:..\).*/\1/'` - ifconfig veth0 down - ifconfig veth0 hw ether ${mac} - ifconfig veth0 arp up - transfer_addrs ${netdev} veth0 - transfer_routes ${netdev} veth0 - del_addrs ${netdev} - ifconfig ${netdev} -arp down - ifconfig ${netdev} hw ether fe:ff:ff:ff:ff:ff up - # Bring up second half of virtual device and attach it to the bridge. - ifconfig vif0.0 up - add_to_bridge ${bridge} vif0.0 - else - transfer_addrs ${netdev} ${bridge} - transfer_routes ${netdev} ${bridge} - fi - - # Attach the real interface to the bridge. - add_to_bridge ${bridge} ${netdev} - - if [ ${antispoof} == 'yes' ] ; then - antispoofing ${netdev} ${bridge} - fi -} - -op_stop () { - if [ "${bridge}" == "null" ] ; then - return - fi - - brctl delif ${bridge} ${netdev} - - if ifconfig veth0 2>/dev/null | grep -q veth0 ; then - brctl delif ${bridge} vif0.0 - ifconfig vif0.0 down - mac=`ifconfig veth0 | grep HWadd | sed -e 's/.*\(..:..:..:..:..:..\).*/\1/'` - ifconfig ${netdev} down - ifconfig ${netdev} hw ether ${mac} - ifconfig ${netdev} arp up - transfer_addrs veth0 ${netdev} - transfer_routes veth0 ${netdev} - del_addrs veth0 - ifconfig veth0 -arp down - ifconfig veth0 hw ether 00:00:00:00:00:00 - else - transfer_routes ${bridge} ${netdev} - fi -} - -case ${OP} in - start) - op_start - ;; - - stop) - op_stop - ;; - - status) - show_status ${netdev} ${bridge} - ;; - - *) - echo 'Unknown command: ' ${OP} >&2 - echo 'Valid commands are: start, stop, status' >&2 - exit 1 -esac _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |