mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
[POWERPC][XEN] Merge with xen-unstable.hg.
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
This commit is contained in:
commit
4c03b0792e
949 files changed
+68821
-30599
No files matched your search
@@ -20,6 +20,7 @@
|
||||
^\.config$
|
||||
^TAGS$
|
||||
^tags$
|
||||
^build.*$
|
||||
^dist/.*$
|
||||
^docs/.*\.aux$
|
||||
^docs/.*\.dvi$
|
||||
@@ -57,7 +58,7 @@
|
||||
^docs/xen-api/xenapi-datamodel-graph.eps$
|
||||
^extras/mini-os/h/hypervisor-ifs$
|
||||
^extras/mini-os/h/xen-public$
|
||||
^extras/mini-os/mini-os\..*$
|
||||
^extras/mini-os/mini-os.*$
|
||||
^install/.*$
|
||||
^linux-[^/]*-native/.*$
|
||||
^linux-[^/]*-xen/.*$
|
||||
@@ -141,6 +142,8 @@
|
||||
^tools/python/build/.*$
|
||||
^tools/security/secpol_tool$
|
||||
^tools/security/xen/.*$
|
||||
^tools/tests/blowfish\.bin$
|
||||
^tools/tests/blowfish\.h$
|
||||
^tools/tests/test_x86_emulator$
|
||||
^tools/vnet/Make.local$
|
||||
^tools/vnet/build/.*$
|
||||
@@ -205,7 +208,10 @@
|
||||
^xen/ddb/.*$
|
||||
^xen/include/asm$
|
||||
^xen/include/asm-.*/asm-offsets\.h$
|
||||
^xen/include/compat/.*$
|
||||
^xen/include/hypervisor-ifs/arch$
|
||||
^xen/include/public/foreign/.*\.(c|h|size)$
|
||||
^xen/include/public/foreign/checker$
|
||||
^xen/include/public/public$
|
||||
^xen/include/xen/.*\.new$
|
||||
^xen/include/xen/acm_policy\.h$
|
||||
|
||||
@@ -6,11 +6,16 @@ debug ?= n
|
||||
XEN_COMPILE_ARCH ?= $(shell uname -m | sed -e s/i.86/x86_32/ \
|
||||
-e s/ppc/powerpc/ -e s/i86pc/x86_32/)
|
||||
XEN_TARGET_ARCH ?= $(XEN_COMPILE_ARCH)
|
||||
XEN_TARGET_X86_PAE ?= n
|
||||
XEN_OS ?= $(shell uname -s)
|
||||
|
||||
ifeq ($(XEN_TARGET_ARCH),x86_32)
|
||||
XEN_TARGET_X86_PAE ?= y
|
||||
endif
|
||||
|
||||
CONFIG_$(XEN_OS) := y
|
||||
|
||||
SHELL ?= /bin/sh
|
||||
|
||||
# Tools to run on system hosting the build
|
||||
HOSTCC = gcc
|
||||
HOSTCFLAGS = -Wall -Werror -Wstrict-prototypes -O2 -fomit-frame-pointer
|
||||
|
||||
@@ -2,18 +2,15 @@
|
||||
# Grand Unified Makefile for Xen.
|
||||
#
|
||||
|
||||
# Export target architecture overrides to Xen and Linux sub-trees.
|
||||
ifneq ($(XEN_TARGET_ARCH),)
|
||||
SUBARCH := $(subst x86_32,i386,$(XEN_TARGET_ARCH))
|
||||
export XEN_TARGET_ARCH SUBARCH XEN_SYSTYPE
|
||||
endif
|
||||
|
||||
# Default target must appear before any include lines
|
||||
.PHONY: all
|
||||
all: dist
|
||||
|
||||
export XEN_ROOT=$(CURDIR)
|
||||
include Config.mk
|
||||
|
||||
SUBARCH := $(subst x86_32,i386,$(XEN_TARGET_ARCH))
|
||||
export XEN_TARGET_ARCH SUBARCH XEN_SYSTYPE
|
||||
include buildconfigs/Rules.mk
|
||||
|
||||
ifeq ($(XEN_TARGET_X86_PAE),y)
|
||||
|
||||
@@ -1512,10 +1512,7 @@ CONFIG_CRYPTO_DES=y
|
||||
# Hardware crypto devices
|
||||
#
|
||||
# CONFIG_XEN_UTIL is not set
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_SKBUFF=y
|
||||
# CONFIG_XEN_DEVMEM is not set
|
||||
CONFIG_XEN_REBOOT=y
|
||||
# CONFIG_XEN_SMPBOOT is not set
|
||||
@@ -1539,7 +1536,7 @@ CONFIG_XEN_PCIDEV_BACKEND=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND_SLOT=y
|
||||
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
|
||||
# CONFIG_XEN_TPMDEV_BACKEND is not set
|
||||
CONFIG_XEN_TPMDEV_BACKEND=m
|
||||
CONFIG_XEN_BLKDEV_FRONTEND=y
|
||||
CONFIG_XEN_NETDEV_FRONTEND=y
|
||||
# CONFIG_XEN_SCRUB_PAGES is not set
|
||||
|
||||
@@ -1,22 +1,27 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16.13-xen0
|
||||
# Thu May 11 17:06:31 2006
|
||||
# Linux kernel version: 2.6.18-xen0
|
||||
# Wed Jan 17 18:35:52 2007
|
||||
#
|
||||
CONFIG_X86_32=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_SEMAPHORE_SLEEPERS=y
|
||||
CONFIG_X86=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_DMI=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
@@ -28,14 +33,16 @@ CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
CONFIG_VM86=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
@@ -47,11 +54,9 @@ CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
@@ -62,15 +67,17 @@ CONFIG_BASE_SMALL=0
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
CONFIG_LSF=y
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
@@ -88,6 +95,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
#
|
||||
# Processor type and features
|
||||
#
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_X86_PC is not set
|
||||
CONFIG_X86_XEN=y
|
||||
# CONFIG_X86_ELAN is not set
|
||||
@@ -135,14 +143,14 @@ CONFIG_X86_CMPXCHG64=y
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
CONFIG_X86_USE_PPRO_CHECKSUM=y
|
||||
CONFIG_X86_TSC=y
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_NR_CPUS=8
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_X86_UP_APIC=y
|
||||
CONFIG_X86_UP_IOAPIC=y
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
CONFIG_X86_LOCAL_APIC=y
|
||||
CONFIG_X86_IO_APIC=y
|
||||
CONFIG_VM86=y
|
||||
# CONFIG_TOSHIBA is not set
|
||||
# CONFIG_I8K is not set
|
||||
# CONFIG_X86_REBOOTFIXUPS is not set
|
||||
@@ -158,10 +166,6 @@ CONFIG_SWIOTLB=y
|
||||
# CONFIG_NOHIGHMEM is not set
|
||||
CONFIG_HIGHMEM4G=y
|
||||
# CONFIG_HIGHMEM64G is not set
|
||||
CONFIG_VMSPLIT_3G=y
|
||||
# CONFIG_VMSPLIT_3G_OPT is not set
|
||||
# CONFIG_VMSPLIT_2G is not set
|
||||
# CONFIG_VMSPLIT_1G is not set
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
@@ -172,6 +176,8 @@ CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
CONFIG_MTRR=y
|
||||
# CONFIG_REGPARM is not set
|
||||
CONFIG_SECCOMP=y
|
||||
@@ -182,6 +188,8 @@ CONFIG_HZ=100
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
|
||||
#
|
||||
# Power management options (ACPI, APM)
|
||||
@@ -198,6 +206,7 @@ CONFIG_ACPI_BUTTON=m
|
||||
CONFIG_ACPI_VIDEO=m
|
||||
CONFIG_ACPI_HOTKEY=m
|
||||
CONFIG_ACPI_FAN=m
|
||||
CONFIG_ACPI_DOCK=m
|
||||
CONFIG_ACPI_PROCESSOR=m
|
||||
CONFIG_ACPI_THERMAL=m
|
||||
CONFIG_ACPI_ASUS=m
|
||||
@@ -230,10 +239,10 @@ CONFIG_PCI_MMCONFIG=y
|
||||
CONFIG_XEN_PCIDEV_FRONTEND=y
|
||||
# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
|
||||
# CONFIG_PCIEPORTBUS is not set
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
CONFIG_ISA_DMA_API=y
|
||||
# CONFIG_SCx200 is not set
|
||||
CONFIG_K8_NB=y
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
@@ -264,6 +273,8 @@ CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
# CONFIG_XFRM_USER is not set
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
@@ -280,7 +291,10 @@ CONFIG_IP_PNP_DHCP=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
@@ -290,6 +304,9 @@ CONFIG_TCP_CONG_BIC=y
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
CONFIG_BRIDGE_NETFILTER=y
|
||||
@@ -314,6 +331,8 @@ CONFIG_IP_NF_FTP=m
|
||||
# CONFIG_IP_NF_TFTP is not set
|
||||
# CONFIG_IP_NF_AMANDA is not set
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
# CONFIG_IP_NF_SIP is not set
|
||||
# CONFIG_IP_NF_QUEUE is not set
|
||||
|
||||
#
|
||||
@@ -339,12 +358,12 @@ CONFIG_IP_NF_FTP=m
|
||||
CONFIG_BRIDGE=y
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
CONFIG_LLC=y
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
@@ -373,6 +392,7 @@ CONFIG_BRIDGE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
@@ -418,6 +438,7 @@ CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
@@ -542,17 +563,19 @@ CONFIG_AIC79XX_DEBUG_ENABLE=y
|
||||
CONFIG_AIC79XX_DEBUG_MASK=0
|
||||
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
|
||||
# CONFIG_SCSI_DPT_I2O is not set
|
||||
CONFIG_SCSI_ADVANSYS=y
|
||||
CONFIG_MEGARAID_NEWGEN=y
|
||||
# CONFIG_MEGARAID_MM is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
CONFIG_SCSI_SATA=y
|
||||
# CONFIG_SCSI_SATA_AHCI is not set
|
||||
CONFIG_SCSI_SATA_AHCI=y
|
||||
# CONFIG_SCSI_SATA_SVW is not set
|
||||
CONFIG_SCSI_ATA_PIIX=y
|
||||
# CONFIG_SCSI_SATA_MV is not set
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
# CONFIG_SCSI_PDC_ADMA is not set
|
||||
# CONFIG_SCSI_HPTIOP is not set
|
||||
# CONFIG_SCSI_SATA_QSTOR is not set
|
||||
CONFIG_SCSI_SATA_PROMISE=y
|
||||
CONFIG_SCSI_SATA_SX4=y
|
||||
@@ -573,7 +596,6 @@ CONFIG_SCSI_SATA_INTEL_COMBINED=y
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
# CONFIG_SCSI_QLA_FC is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
@@ -591,8 +613,7 @@ CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_RAID0=y
|
||||
CONFIG_MD_RAID1=y
|
||||
# CONFIG_MD_RAID10 is not set
|
||||
CONFIG_MD_RAID5=y
|
||||
# CONFIG_MD_RAID6 is not set
|
||||
# CONFIG_MD_RAID456 is not set
|
||||
# CONFIG_MD_MULTIPATH is not set
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
@@ -692,6 +713,7 @@ CONFIG_8139TOO_PIO=y
|
||||
# CONFIG_TLAN is not set
|
||||
CONFIG_VIA_RHINE=y
|
||||
# CONFIG_VIA_RHINE_MMIO is not set
|
||||
# CONFIG_VIA_RHINE_NAPI is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
@@ -712,7 +734,7 @@ CONFIG_E1000=y
|
||||
CONFIG_SK98LIN=y
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
CONFIG_TIGON3=y
|
||||
# CONFIG_BNX2 is not set
|
||||
CONFIG_BNX2=y
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
@@ -720,6 +742,7 @@ CONFIG_TIGON3=y
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
@@ -807,6 +830,7 @@ CONFIG_SERIO_LIBPS2=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
@@ -842,7 +866,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_FTAPE is not set
|
||||
CONFIG_AGP=m
|
||||
CONFIG_AGP_ALI=m
|
||||
CONFIG_AGP_ATI=m
|
||||
@@ -866,6 +889,8 @@ CONFIG_DRM_SIS=m
|
||||
# CONFIG_DRM_VIA is not set
|
||||
# CONFIG_DRM_SAVAGE is not set
|
||||
# CONFIG_MWAVE is not set
|
||||
# CONFIG_PC8736x_GPIO is not set
|
||||
# CONFIG_NSC_GPIO is not set
|
||||
# CONFIG_CS5535_GPIO is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HPET is not set
|
||||
@@ -891,7 +916,6 @@ CONFIG_DRM_SIS=m
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
@@ -904,31 +928,31 @@ CONFIG_DRM_SIS=m
|
||||
#
|
||||
# CONFIG_IBM_ASM is not set
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
CONFIG_VIDEO_V4L2=y
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_VIDEO_SELECT is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
@@ -940,6 +964,7 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
CONFIG_USB=y
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
|
||||
@@ -992,9 +1017,7 @@ CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
# CONFIG_USB_KBTAB is not set
|
||||
# CONFIG_USB_POWERMATE is not set
|
||||
# CONFIG_USB_MTOUCH is not set
|
||||
# CONFIG_USB_ITMTOUCH is not set
|
||||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_TOUCHSCREEN is not set
|
||||
# CONFIG_USB_YEALINK is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
@@ -1008,15 +1031,6 @@ CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_MDC800 is not set
|
||||
# CONFIG_USB_MICROTEK is not set
|
||||
|
||||
#
|
||||
# USB Multimedia devices
|
||||
#
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Video4Linux support is needed for USB Multimedia device support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Network Adapters
|
||||
#
|
||||
@@ -1046,10 +1060,12 @@ CONFIG_USB_MON=y
|
||||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CYPRESS_CY7C63 is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_APPLEDISPLAY is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
|
||||
#
|
||||
@@ -1066,6 +1082,19 @@ CONFIG_USB_MON=y
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
@@ -1076,6 +1105,42 @@ CONFIG_USB_MON=y
|
||||
#
|
||||
# CONFIG_EDAC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
CONFIG_RTC_LIB=m
|
||||
CONFIG_RTC_CLASS=m
|
||||
|
||||
#
|
||||
# RTC interfaces
|
||||
#
|
||||
CONFIG_RTC_INTF_SYSFS=m
|
||||
CONFIG_RTC_INTF_PROC=m
|
||||
CONFIG_RTC_INTF_DEV=m
|
||||
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
|
||||
|
||||
#
|
||||
# RTC drivers
|
||||
#
|
||||
# CONFIG_RTC_DRV_DS1553 is not set
|
||||
# CONFIG_RTC_DRV_DS1742 is not set
|
||||
CONFIG_RTC_DRV_M48T86=m
|
||||
CONFIG_RTC_DRV_TEST=m
|
||||
# CONFIG_RTC_DRV_V3020 is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
@@ -1100,6 +1165,7 @@ CONFIG_REISERFS_FS=y
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
@@ -1134,7 +1200,6 @@ CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
@@ -1241,23 +1306,32 @@ CONFIG_NLS_ISO8859_1=y
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_HIGHMEM is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@@ -1310,25 +1384,27 @@ CONFIG_CRYPTO_CRC32C=m
|
||||
#
|
||||
# CONFIG_CRYPTO_DEV_PADLOCK is not set
|
||||
CONFIG_XEN=y
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030202
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030203
|
||||
|
||||
#
|
||||
# XEN
|
||||
#
|
||||
CONFIG_XEN_PRIVILEGED_GUEST=y
|
||||
# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
|
||||
CONFIG_XEN_PRIVCMD=y
|
||||
CONFIG_XEN_XENBUS_DEV=y
|
||||
CONFIG_XEN_BACKEND=y
|
||||
CONFIG_XEN_PCIDEV_BACKEND=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
|
||||
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
|
||||
CONFIG_XEN_BLKDEV_BACKEND=y
|
||||
CONFIG_XEN_BLKDEV_TAP=y
|
||||
CONFIG_XEN_NETDEV_BACKEND=y
|
||||
# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
|
||||
CONFIG_XEN_NETDEV_LOOPBACK=y
|
||||
# CONFIG_XEN_TPMDEV_BACKEND is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
|
||||
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
|
||||
CONFIG_XEN_TPMDEV_BACKEND=m
|
||||
CONFIG_XEN_BLKDEV_FRONTEND=y
|
||||
CONFIG_XEN_NETDEV_FRONTEND=y
|
||||
CONFIG_XEN_SCRUB_PAGES=y
|
||||
@@ -1337,9 +1413,13 @@ CONFIG_XEN_SYSFS=y
|
||||
CONFIG_XEN_COMPAT_030002_AND_LATER=y
|
||||
# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
|
||||
CONFIG_XEN_COMPAT_030002=y
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_XEN_UTIL=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_DEVMEM=y
|
||||
CONFIG_XEN_REBOOT=y
|
||||
CONFIG_XEN_SMPBOOT=y
|
||||
|
||||
#
|
||||
# Library routines
|
||||
@@ -1349,9 +1429,13 @@ CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_PENDING_IRQ=y
|
||||
CONFIG_X86_SMP=y
|
||||
CONFIG_X86_BIOS_REBOOT=y
|
||||
CONFIG_X86_TRAMPOLINE=y
|
||||
CONFIG_X86_NO_TSS=y
|
||||
CONFIG_X86_NO_IDT=y
|
||||
CONFIG_KTIME_SCALAR=y
|
||||
@@ -1,14 +1,17 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16.13-xen0
|
||||
# Thu May 11 17:17:19 2006
|
||||
# Linux kernel version: 2.6.18-xen0
|
||||
# Wed Jan 17 18:26:35 2007
|
||||
#
|
||||
CONFIG_X86_64=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_X86=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_SEMAPHORE_SLEEPERS=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_X86_CMPXCHG=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@@ -16,6 +19,8 @@ CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_DMI=y
|
||||
CONFIG_AUDIT_ARCH=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
@@ -33,14 +38,15 @@ CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
CONFIG_VM86=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
@@ -52,11 +58,9 @@ CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
@@ -67,7 +71,6 @@ CONFIG_BASE_SMALL=0
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
@@ -76,6 +79,8 @@ CONFIG_KMOD=y
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
CONFIG_LSF=y
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
@@ -103,6 +108,7 @@ CONFIG_X86_NO_TSS=y
|
||||
CONFIG_X86_NO_IDT=y
|
||||
CONFIG_X86_L1_CACHE_BYTES=128
|
||||
CONFIG_X86_L1_CACHE_SHIFT=7
|
||||
CONFIG_X86_INTERNODE_CACHE_BYTES=128
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
CONFIG_MICROCODE=y
|
||||
# CONFIG_X86_MSR is not set
|
||||
@@ -115,7 +121,6 @@ CONFIG_MTRR=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
@@ -125,15 +130,20 @@ CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
# CONFIG_CALGARY_IOMMU is not set
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
CONFIG_PHYSICAL_START=0x200000
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_HZ_250 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=100
|
||||
# CONFIG_REORDER is not set
|
||||
CONFIG_K8_NB=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
@@ -153,6 +163,7 @@ CONFIG_ACPI_BUTTON=m
|
||||
CONFIG_ACPI_VIDEO=m
|
||||
# CONFIG_ACPI_HOTKEY is not set
|
||||
CONFIG_ACPI_FAN=m
|
||||
CONFIG_ACPI_DOCK=m
|
||||
CONFIG_ACPI_PROCESSOR=m
|
||||
CONFIG_ACPI_THERMAL=m
|
||||
CONFIG_ACPI_ASUS=m
|
||||
@@ -178,9 +189,7 @@ CONFIG_PCI_DIRECT=y
|
||||
# CONFIG_PCI_MMCONFIG is not set
|
||||
CONFIG_XEN_PCIDEV_FRONTEND=y
|
||||
# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
|
||||
# CONFIG_UNORDERED_IO is not set
|
||||
# CONFIG_PCIEPORTBUS is not set
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
@@ -231,7 +240,10 @@ CONFIG_IP_PNP_DHCP=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
@@ -241,6 +253,9 @@ CONFIG_TCP_CONG_BIC=y
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
CONFIG_BRIDGE_NETFILTER=y
|
||||
@@ -265,6 +280,8 @@ CONFIG_IP_NF_FTP=m
|
||||
# CONFIG_IP_NF_TFTP is not set
|
||||
# CONFIG_IP_NF_AMANDA is not set
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
# CONFIG_IP_NF_SIP is not set
|
||||
# CONFIG_IP_NF_QUEUE is not set
|
||||
|
||||
#
|
||||
@@ -290,12 +307,12 @@ CONFIG_IP_NF_FTP=m
|
||||
CONFIG_BRIDGE=y
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
CONFIG_LLC=y
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
@@ -324,6 +341,7 @@ CONFIG_STANDALONE=y
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
@@ -369,6 +387,7 @@ CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
@@ -466,7 +485,7 @@ CONFIG_BLK_DEV_SD=y
|
||||
#
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
CONFIG_SCSI_ISCSI_ATTRS=y
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
|
||||
#
|
||||
@@ -498,12 +517,13 @@ CONFIG_MEGARAID_NEWGEN=y
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
CONFIG_SCSI_SATA=y
|
||||
# CONFIG_SCSI_SATA_AHCI is not set
|
||||
CONFIG_SCSI_SATA_AHCI=y
|
||||
# CONFIG_SCSI_SATA_SVW is not set
|
||||
CONFIG_SCSI_ATA_PIIX=y
|
||||
# CONFIG_SCSI_SATA_MV is not set
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
# CONFIG_SCSI_PDC_ADMA is not set
|
||||
# CONFIG_SCSI_HPTIOP is not set
|
||||
# CONFIG_SCSI_SATA_QSTOR is not set
|
||||
CONFIG_SCSI_SATA_PROMISE=y
|
||||
CONFIG_SCSI_SATA_SX4=y
|
||||
@@ -525,7 +545,6 @@ CONFIG_SCSI_BUSLOGIC=y
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
# CONFIG_SCSI_QLA_FC is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
@@ -542,8 +561,8 @@ 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_RAID456=y
|
||||
# CONFIG_MD_RAID5_RESHAPE is not set
|
||||
CONFIG_MD_MULTIPATH=y
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
@@ -643,6 +662,7 @@ CONFIG_8139TOO_PIO=y
|
||||
# CONFIG_SUNDANCE is not set
|
||||
CONFIG_VIA_RHINE=y
|
||||
# CONFIG_VIA_RHINE_MMIO is not set
|
||||
# CONFIG_VIA_RHINE_NAPI is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
@@ -663,7 +683,7 @@ CONFIG_E1000=y
|
||||
CONFIG_SK98LIN=y
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
CONFIG_TIGON3=y
|
||||
# CONFIG_BNX2 is not set
|
||||
CONFIG_BNX2=y
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
@@ -671,6 +691,7 @@ CONFIG_TIGON3=y
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
@@ -758,6 +779,7 @@ CONFIG_SERIO_LIBPS2=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
@@ -795,6 +817,8 @@ CONFIG_RTC=y
|
||||
CONFIG_AGP=m
|
||||
CONFIG_AGP_AMD64=m
|
||||
# CONFIG_AGP_INTEL is not set
|
||||
CONFIG_AGP_SIS=m
|
||||
CONFIG_AGP_VIA=m
|
||||
CONFIG_DRM=m
|
||||
CONFIG_DRM_TDFX=m
|
||||
CONFIG_DRM_R128=m
|
||||
@@ -804,6 +828,7 @@ CONFIG_DRM_SIS=m
|
||||
# CONFIG_DRM_VIA is not set
|
||||
# CONFIG_DRM_SAVAGE is not set
|
||||
# CONFIG_MWAVE is not set
|
||||
# CONFIG_PC8736x_GPIO is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HPET is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
@@ -828,7 +853,6 @@ CONFIG_DRM_SIS=m
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
@@ -841,31 +865,31 @@ CONFIG_DRM_SIS=m
|
||||
#
|
||||
# CONFIG_IBM_ASM is not set
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
CONFIG_VIDEO_V4L2=y
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_VIDEO_SELECT is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
@@ -877,6 +901,7 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
CONFIG_USB=y
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
|
||||
@@ -929,9 +954,7 @@ CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
# CONFIG_USB_KBTAB is not set
|
||||
# CONFIG_USB_POWERMATE is not set
|
||||
# CONFIG_USB_MTOUCH is not set
|
||||
# CONFIG_USB_ITMTOUCH is not set
|
||||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_TOUCHSCREEN is not set
|
||||
# CONFIG_USB_YEALINK is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
@@ -945,15 +968,6 @@ CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_MDC800 is not set
|
||||
# CONFIG_USB_MICROTEK is not set
|
||||
|
||||
#
|
||||
# USB Multimedia devices
|
||||
#
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Video4Linux support is needed for USB Multimedia device support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Network Adapters
|
||||
#
|
||||
@@ -983,10 +997,12 @@ CONFIG_USB_MON=y
|
||||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CYPRESS_CY7C63 is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_APPLEDISPLAY is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
|
||||
#
|
||||
@@ -1003,24 +1019,80 @@ CONFIG_USB_MON=y
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=m
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_IDE_DISK=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
CONFIG_INFINIBAND=y
|
||||
# CONFIG_INFINIBAND_USER_MAD is not set
|
||||
# CONFIG_INFINIBAND_USER_ACCESS is not set
|
||||
CONFIG_INFINIBAND_ADDR_TRANS=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
|
||||
CONFIG_INFINIBAND_SRP=y
|
||||
CONFIG_INFINIBAND_ISER=y
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_EDAC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
CONFIG_RTC_LIB=m
|
||||
CONFIG_RTC_CLASS=m
|
||||
|
||||
#
|
||||
# RTC interfaces
|
||||
#
|
||||
CONFIG_RTC_INTF_SYSFS=m
|
||||
CONFIG_RTC_INTF_PROC=m
|
||||
CONFIG_RTC_INTF_DEV=m
|
||||
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
|
||||
|
||||
#
|
||||
# RTC drivers
|
||||
#
|
||||
CONFIG_RTC_DRV_DS1553=m
|
||||
CONFIG_RTC_DRV_DS1742=m
|
||||
CONFIG_RTC_DRV_M48T86=m
|
||||
CONFIG_RTC_DRV_TEST=m
|
||||
CONFIG_RTC_DRV_V3020=m
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
#
|
||||
@@ -1051,6 +1123,7 @@ CONFIG_REISERFS_FS=y
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
@@ -1085,7 +1158,6 @@ CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
@@ -1192,24 +1264,35 @@ CONFIG_NLS_ISO8859_1=y
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=15
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_DEBUG_RODATA is not set
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
@@ -1251,25 +1334,27 @@ CONFIG_CRYPTO_CRC32C=m
|
||||
# Hardware crypto devices
|
||||
#
|
||||
CONFIG_XEN=y
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030202
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030203
|
||||
|
||||
#
|
||||
# XEN
|
||||
#
|
||||
CONFIG_XEN_PRIVILEGED_GUEST=y
|
||||
# CONFIG_XEN_UNPRIVILEGED_GUEST is not set
|
||||
CONFIG_XEN_PRIVCMD=y
|
||||
CONFIG_XEN_XENBUS_DEV=y
|
||||
CONFIG_XEN_BACKEND=y
|
||||
CONFIG_XEN_PCIDEV_BACKEND=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
|
||||
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
|
||||
CONFIG_XEN_BLKDEV_BACKEND=y
|
||||
CONFIG_XEN_BLKDEV_TAP=y
|
||||
CONFIG_XEN_NETDEV_BACKEND=y
|
||||
# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
|
||||
CONFIG_XEN_NETDEV_LOOPBACK=y
|
||||
# CONFIG_XEN_TPMDEV_BACKEND is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_VPCI is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND_PASS=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
|
||||
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
|
||||
CONFIG_XEN_TPMDEV_BACKEND=m
|
||||
CONFIG_XEN_BLKDEV_FRONTEND=y
|
||||
CONFIG_XEN_NETDEV_FRONTEND=y
|
||||
CONFIG_XEN_SCRUB_PAGES=y
|
||||
@@ -1278,9 +1363,12 @@ CONFIG_XEN_SYSFS=y
|
||||
CONFIG_XEN_COMPAT_030002_AND_LATER=y
|
||||
# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
|
||||
CONFIG_XEN_COMPAT_030002=y
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_XEN_UTIL=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_DEVMEM=y
|
||||
CONFIG_XEN_REBOOT=y
|
||||
|
||||
#
|
||||
# Library routines
|
||||
@@ -1290,3 +1378,4 @@ CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_PLIST=y
|
||||
@@ -1386,10 +1386,7 @@ CONFIG_CRYPTO_DES=y
|
||||
# Hardware crypto devices
|
||||
#
|
||||
# CONFIG_XEN_UTIL is not set
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_SKBUFF=y
|
||||
# CONFIG_XEN_DEVMEM is not set
|
||||
CONFIG_XEN_REBOOT=y
|
||||
# CONFIG_XEN_SMPBOOT is not set
|
||||
|
||||
@@ -1,16 +1,21 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16.13-xenU
|
||||
# Thu May 11 17:08:12 2006
|
||||
# Linux kernel version: 2.6.18-xenU
|
||||
# Wed Jan 17 18:36:21 2007
|
||||
#
|
||||
CONFIG_X86_32=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_SEMAPHORE_SLEEPERS=y
|
||||
CONFIG_X86=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_DMI=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
@@ -28,15 +33,16 @@ CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
CONFIG_VM86=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
@@ -48,11 +54,9 @@ CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
@@ -63,7 +67,6 @@ CONFIG_BASE_SMALL=0
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
@@ -73,6 +76,8 @@ CONFIG_STOP_MACHINE=y
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
CONFIG_LSF=y
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
@@ -90,6 +95,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
#
|
||||
# Processor type and features
|
||||
#
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_X86_PC is not set
|
||||
CONFIG_X86_XEN=y
|
||||
# CONFIG_X86_ELAN is not set
|
||||
@@ -137,13 +143,12 @@ CONFIG_X86_CMPXCHG64=y
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
CONFIG_X86_USE_PPRO_CHECKSUM=y
|
||||
CONFIG_X86_TSC=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_SMP_ALTERNATIVES=y
|
||||
CONFIG_NR_CPUS=8
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
CONFIG_VM86=y
|
||||
# CONFIG_TOSHIBA is not set
|
||||
# CONFIG_I8K is not set
|
||||
# CONFIG_X86_REBOOTFIXUPS is not set
|
||||
@@ -158,10 +163,6 @@ CONFIG_SWIOTLB=y
|
||||
# CONFIG_NOHIGHMEM is not set
|
||||
CONFIG_HIGHMEM4G=y
|
||||
# CONFIG_HIGHMEM64G is not set
|
||||
CONFIG_VMSPLIT_3G=y
|
||||
# CONFIG_VMSPLIT_3G_OPT is not set
|
||||
# CONFIG_VMSPLIT_2G is not set
|
||||
# CONFIG_VMSPLIT_1G is not set
|
||||
CONFIG_PAGE_OFFSET=0xC0000000
|
||||
CONFIG_HIGHMEM=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
@@ -172,6 +173,8 @@ CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
# CONFIG_HIGHPTE is not set
|
||||
# CONFIG_REGPARM is not set
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_HZ_100=y
|
||||
@@ -181,6 +184,7 @@ CONFIG_HZ=100
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
|
||||
#
|
||||
# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
|
||||
@@ -217,6 +221,8 @@ CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
# CONFIG_XFRM_USER is not set
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
@@ -233,11 +239,17 @@ CONFIG_IP_PNP=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
@@ -263,7 +275,6 @@ CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
@@ -292,6 +303,7 @@ CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
@@ -323,6 +335,7 @@ CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
@@ -492,6 +505,7 @@ CONFIG_SERIO_SERPORT=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
@@ -514,6 +528,8 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_VIA=y
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
@@ -523,8 +539,9 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_MWAVE is not set
|
||||
# CONFIG_PC8736x_GPIO is not set
|
||||
# CONFIG_NSC_GPIO is not set
|
||||
# CONFIG_CS5535_GPIO is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
@@ -549,7 +566,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
@@ -561,14 +577,11 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
CONFIG_VIDEO_V4L2=y
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
@@ -578,14 +591,16 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_VIDEO_SELECT is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
@@ -597,6 +612,7 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
@@ -612,6 +628,19 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
@@ -621,6 +650,24 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
# CONFIG_EDAC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
@@ -645,6 +692,7 @@ CONFIG_REISERFS_FS=y
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
@@ -679,7 +727,6 @@ CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
@@ -781,23 +828,32 @@ CONFIG_NLS_ISO8859_1=y
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_HIGHMEM is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@@ -848,13 +904,15 @@ CONFIG_CRYPTO_CRC32C=m
|
||||
#
|
||||
# CONFIG_CRYPTO_DEV_PADLOCK is not set
|
||||
CONFIG_XEN=y
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030202
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030203
|
||||
|
||||
#
|
||||
# XEN
|
||||
#
|
||||
# CONFIG_XEN_PRIVILEGED_GUEST is not set
|
||||
CONFIG_XEN_UNPRIVILEGED_GUEST=y
|
||||
CONFIG_XEN_PRIVCMD=y
|
||||
CONFIG_XEN_XENBUS_DEV=y
|
||||
# CONFIG_XEN_BACKEND is not set
|
||||
CONFIG_XEN_BLKDEV_FRONTEND=y
|
||||
CONFIG_XEN_NETDEV_FRONTEND=y
|
||||
@@ -864,9 +922,13 @@ CONFIG_XEN_SYSFS=y
|
||||
CONFIG_XEN_COMPAT_030002_AND_LATER=y
|
||||
# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
|
||||
CONFIG_XEN_COMPAT_030002=y
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_XEN_UTIL=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_DEVMEM=y
|
||||
CONFIG_XEN_REBOOT=y
|
||||
CONFIG_XEN_SMPBOOT=y
|
||||
|
||||
#
|
||||
# Library routines
|
||||
@@ -876,6 +938,7 @@ CONFIG_NO_IDLE_HZ=y
|
||||
# CONFIG_CRC32 is not set
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_PENDING_IRQ=y
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16.13-xenU
|
||||
# Thu May 11 17:17:57 2006
|
||||
# Linux kernel version: 2.6.18-xenU
|
||||
# Wed Jan 17 18:28:53 2007
|
||||
#
|
||||
CONFIG_X86_64=y
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_X86=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_SEMAPHORE_SLEEPERS=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_X86_CMPXCHG=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@@ -16,6 +19,8 @@ CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_GENERIC_IOMAP=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_DMI=y
|
||||
CONFIG_AUDIT_ARCH=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
@@ -34,16 +39,17 @@ CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_TASKSTATS is not set
|
||||
CONFIG_AUDIT=y
|
||||
CONFIG_AUDITSYSCALL=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_UID16=y
|
||||
CONFIG_VM86=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
CONFIG_KALLSYMS_EXTRA_PASS=y
|
||||
@@ -55,11 +61,9 @@ CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
@@ -70,7 +74,6 @@ CONFIG_BASE_SMALL=0
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
@@ -80,6 +83,8 @@ CONFIG_STOP_MACHINE=y
|
||||
# Block layer
|
||||
#
|
||||
CONFIG_LBD=y
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
CONFIG_LSF=y
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
@@ -107,6 +112,7 @@ CONFIG_X86_NO_TSS=y
|
||||
CONFIG_X86_NO_IDT=y
|
||||
CONFIG_X86_L1_CACHE_BYTES=128
|
||||
CONFIG_X86_L1_CACHE_SHIFT=7
|
||||
CONFIG_X86_INTERNODE_CACHE_BYTES=128
|
||||
CONFIG_X86_GOOD_APIC=y
|
||||
# CONFIG_MICROCODE is not set
|
||||
# CONFIG_X86_MSR is not set
|
||||
@@ -117,7 +123,6 @@ CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
@@ -127,16 +132,19 @@ CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_NR_CPUS=8
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_NR_CPUS=16
|
||||
# CONFIG_HOTPLUG_CPU is not set
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
CONFIG_SWIOTLB=y
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
CONFIG_PHYSICAL_START=0x200000
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_HZ_250 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=100
|
||||
# CONFIG_REORDER is not set
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
@@ -146,7 +154,6 @@ CONFIG_GENERIC_PENDING_IRQ=y
|
||||
# Bus options (PCI etc.)
|
||||
#
|
||||
# CONFIG_PCI is not set
|
||||
# CONFIG_UNORDERED_IO is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
@@ -208,7 +215,10 @@ CONFIG_SYN_COOKIES=y
|
||||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
CONFIG_INET_XFRM_TUNNEL=m
|
||||
CONFIG_INET_TUNNEL=m
|
||||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
@@ -248,11 +258,16 @@ CONFIG_IP_VS_NQ=m
|
||||
CONFIG_IP_VS_FTP=m
|
||||
CONFIG_IPV6=m
|
||||
CONFIG_IPV6_PRIVACY=y
|
||||
# CONFIG_IPV6_ROUTER_PREF is not set
|
||||
CONFIG_INET6_AH=m
|
||||
CONFIG_INET6_ESP=m
|
||||
CONFIG_INET6_IPCOMP=m
|
||||
CONFIG_INET6_XFRM_TUNNEL=m
|
||||
CONFIG_INET6_TUNNEL=m
|
||||
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
|
||||
CONFIG_INET6_XFRM_MODE_TUNNEL=m
|
||||
CONFIG_IPV6_TUNNEL=m
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
CONFIG_BRIDGE_NETFILTER=y
|
||||
@@ -277,6 +292,8 @@ CONFIG_IP_NF_IRC=m
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
# CONFIG_IP_NF_SIP is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
|
||||
#
|
||||
@@ -342,13 +359,12 @@ CONFIG_LLC=m
|
||||
CONFIG_IPX=m
|
||||
# CONFIG_IPX_INTERN is not set
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_DEV_APPLETALK=y
|
||||
CONFIG_DEV_APPLETALK=m
|
||||
CONFIG_IPDDP=m
|
||||
CONFIG_IPDDP_ENCAP=y
|
||||
CONFIG_IPDDP_DECAP=y
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
CONFIG_NET_DIVERT=y
|
||||
# CONFIG_ECONET is not set
|
||||
CONFIG_WAN_ROUTER=m
|
||||
|
||||
@@ -435,6 +451,7 @@ CONFIG_DONGLE=y
|
||||
CONFIG_ESI_DONGLE=m
|
||||
CONFIG_ACTISYS_DONGLE=m
|
||||
CONFIG_TEKRAM_DONGLE=m
|
||||
# CONFIG_TOIM3232_DONGLE is not set
|
||||
CONFIG_LITELINK_DONGLE=m
|
||||
CONFIG_MA600_DONGLE=m
|
||||
CONFIG_GIRBIL_DONGLE=m
|
||||
@@ -476,6 +493,7 @@ CONFIG_BT_HCIUART_H4=y
|
||||
CONFIG_BT_HCIUART_BCSP=y
|
||||
CONFIG_BT_HCIVHCI=m
|
||||
# CONFIG_IEEE80211 is not set
|
||||
CONFIG_WIRELESS_EXT=y
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
@@ -488,6 +506,7 @@ CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
@@ -519,6 +538,7 @@ CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
@@ -577,8 +597,7 @@ CONFIG_MD_LINEAR=m
|
||||
CONFIG_MD_RAID0=m
|
||||
CONFIG_MD_RAID1=m
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=m
|
||||
CONFIG_MD_RAID6=m
|
||||
# CONFIG_MD_RAID456 is not set
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
@@ -637,12 +656,12 @@ CONFIG_MII=m
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
CONFIG_NET_RADIO=y
|
||||
# CONFIG_NET_WIRELESS_RTNETLINK is not set
|
||||
|
||||
#
|
||||
# Obsolete Wireless cards support (pre-802.11)
|
||||
#
|
||||
# CONFIG_STRIP is not set
|
||||
CONFIG_ATMEL=m
|
||||
# CONFIG_HOSTAP is not set
|
||||
|
||||
#
|
||||
@@ -731,6 +750,7 @@ CONFIG_SERIO_LIBPS2=y
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
@@ -753,6 +773,7 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
@@ -762,8 +783,8 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_MWAVE is not set
|
||||
# CONFIG_PC8736x_GPIO is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
||||
@@ -787,7 +808,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
@@ -799,14 +819,11 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
CONFIG_VIDEO_V4L2=y
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
@@ -816,14 +833,16 @@ CONFIG_LEGACY_PTY_COUNT=256
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_VIDEO_SELECT is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
@@ -835,6 +854,7 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
@@ -850,6 +870,19 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
@@ -859,6 +892,24 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
# CONFIG_EDAC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
#
|
||||
@@ -893,7 +944,6 @@ CONFIG_JFS_POSIX_ACL=y
|
||||
# CONFIG_JFS_STATISTICS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_XFS_FS=m
|
||||
CONFIG_XFS_EXPORT=y
|
||||
# CONFIG_XFS_QUOTA is not set
|
||||
CONFIG_XFS_SECURITY=y
|
||||
CONFIG_XFS_POSIX_ACL=y
|
||||
@@ -902,6 +952,7 @@ CONFIG_XFS_POSIX_ACL=y
|
||||
CONFIG_MINIX_FS=m
|
||||
CONFIG_ROMFS_FS=m
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
CONFIG_QUOTA=y
|
||||
# CONFIG_QFMT_V1 is not set
|
||||
CONFIG_QFMT_V2=y
|
||||
@@ -940,7 +991,6 @@ CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
@@ -960,6 +1010,8 @@ CONFIG_VXFS_FS=m
|
||||
CONFIG_QNX4FS_FS=m
|
||||
CONFIG_SYSV_FS=m
|
||||
CONFIG_UFS_FS=m
|
||||
# CONFIG_UFS_FS_WRITE is not set
|
||||
# CONFIG_UFS_DEBUG is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
@@ -986,8 +1038,10 @@ CONFIG_SMB_FS=m
|
||||
# CONFIG_SMB_NLS_DEFAULT is not set
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
# CONFIG_CIFS_WEAK_PW_HASH is not set
|
||||
CONFIG_CIFS_XATTR=y
|
||||
CONFIG_CIFS_POSIX=y
|
||||
# CONFIG_CIFS_DEBUG2 is not set
|
||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
||||
CONFIG_NCP_FS=m
|
||||
CONFIG_NCPFS_PACKET_SIGNING=y
|
||||
@@ -1076,24 +1130,35 @@ CONFIG_NLS_UTF8=m
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=15
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_RWSEMS is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_UNWIND_INFO is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_DEBUG_RODATA is not set
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
@@ -1135,13 +1200,15 @@ CONFIG_CRYPTO_CRC32C=m
|
||||
# Hardware crypto devices
|
||||
#
|
||||
CONFIG_XEN=y
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030202
|
||||
CONFIG_XEN_INTERFACE_VERSION=0x00030203
|
||||
|
||||
#
|
||||
# XEN
|
||||
#
|
||||
# CONFIG_XEN_PRIVILEGED_GUEST is not set
|
||||
CONFIG_XEN_UNPRIVILEGED_GUEST=y
|
||||
CONFIG_XEN_PRIVCMD=y
|
||||
CONFIG_XEN_XENBUS_DEV=y
|
||||
# CONFIG_XEN_BACKEND is not set
|
||||
CONFIG_XEN_BLKDEV_FRONTEND=y
|
||||
CONFIG_XEN_NETDEV_FRONTEND=y
|
||||
@@ -1151,9 +1218,13 @@ CONFIG_XEN_SYSFS=y
|
||||
CONFIG_XEN_COMPAT_030002_AND_LATER=y
|
||||
# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
|
||||
CONFIG_XEN_COMPAT_030002=y
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y
|
||||
CONFIG_NO_IDLE_HZ=y
|
||||
CONFIG_XEN_UTIL=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_DEVMEM=y
|
||||
CONFIG_XEN_REBOOT=y
|
||||
CONFIG_XEN_SMPBOOT=y
|
||||
|
||||
#
|
||||
# Library routines
|
||||
@@ -1164,3 +1235,6 @@ CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_TEXTSEARCH=y
|
||||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_PLIST=y
|
||||
@@ -1518,10 +1518,7 @@ CONFIG_CRYPTO_DES=y
|
||||
# Hardware crypto devices
|
||||
#
|
||||
# CONFIG_XEN_UTIL is not set
|
||||
CONFIG_HAVE_ARCH_ALLOC_SKB=y
|
||||
CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y
|
||||
CONFIG_XEN_BALLOON=y
|
||||
CONFIG_XEN_SKBUFF=y
|
||||
# CONFIG_XEN_DEVMEM is not set
|
||||
CONFIG_XEN_REBOOT=y
|
||||
# CONFIG_XEN_SMPBOOT is not set
|
||||
@@ -1545,7 +1542,7 @@ CONFIG_XEN_PCIDEV_BACKEND=y
|
||||
# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
|
||||
CONFIG_XEN_PCIDEV_BACKEND_SLOT=y
|
||||
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
|
||||
# CONFIG_XEN_TPMDEV_BACKEND is not set
|
||||
CONFIG_XEN_TPMDEV_BACKEND=m
|
||||
CONFIG_XEN_BLKDEV_FRONTEND=y
|
||||
CONFIG_XEN_NETDEV_FRONTEND=y
|
||||
CONFIG_XEN_FRAMEBUFFER=y
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,13 +1,18 @@
|
||||
LINUX_SERIES = 2.6
|
||||
LINUX_VER = 2.6.16.33
|
||||
LINUX_VER = 2.6.18
|
||||
|
||||
EXTRAVERSION ?= xen
|
||||
|
||||
LINUX_DIR = linux-$(LINUX_VER)-$(EXTRAVERSION)
|
||||
LINUX_SRCDIR = linux-$(LINUX_VER)-xen
|
||||
LINUX_DIR = build-linux-$(LINUX_VER)-$(EXTRAVERSION)_$(XEN_TARGET_ARCH)
|
||||
|
||||
IMAGE_TARGET ?= vmlinuz
|
||||
INSTALL_BOOT_PATH ?= $(DESTDIR)
|
||||
|
||||
ifeq ($(XEN_TARGET_ARCH),ia64)
|
||||
INSTALL_BOOT_PATH := $(DESTDIR)/boot
|
||||
endif
|
||||
|
||||
LINUX_VER3 := $(LINUX_SERIES).$(word 3, $(subst ., ,$(LINUX_VER)))
|
||||
|
||||
include buildconfigs/Rules.mk
|
||||
@@ -23,24 +28,31 @@ build: $(LINUX_DIR)/include/linux/autoconf.h
|
||||
mkdir -p $(INSTALL_BOOT_PATH)
|
||||
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) INSTALL_PATH=$(INSTALL_BOOT_PATH) install
|
||||
|
||||
$(LINUX_DIR)/include/linux/autoconf.h: ref-linux-$(LINUX_VER)/.valid-ref
|
||||
rm -rf $(LINUX_DIR)
|
||||
cp -al $(<D) $(LINUX_DIR)
|
||||
$(LINUX_SRCDIR)/.valid-src: ref-linux-$(LINUX_VER)/.valid-ref
|
||||
rm -rf $(LINUX_SRCDIR)
|
||||
cp -al $(<D) $(LINUX_SRCDIR)
|
||||
# Apply arch-xen patches
|
||||
( cd linux-$(LINUX_SERIES)-xen-sparse && \
|
||||
LINUX_ARCH=$(LINUX_ARCH) bash ./mkbuildtree ../$(LINUX_DIR) )
|
||||
LINUX_ARCH=$(LINUX_ARCH) bash ./mkbuildtree ../$(LINUX_SRCDIR) )
|
||||
# Patch kernel Makefile to set EXTRAVERSION
|
||||
( cd $(LINUX_SRCDIR) ; \
|
||||
sed -e 's,^EXTRAVERSION.*,&$$(XENGUEST),' \
|
||||
-e 's,^KERNELRELEASE,XENGUEST := $$(shell [ -r $$(objtree)/.xenguest ] \&\& cat $$(objtree)/.xenguest)\n&,' Makefile >Mk.tmp ; \
|
||||
rm -f Makefile ; mv Mk.tmp Makefile )
|
||||
touch $@
|
||||
|
||||
$(LINUX_DIR)/include/linux/autoconf.h: $(LINUX_SRCDIR)/.valid-src
|
||||
rm -rf $(LINUX_DIR)
|
||||
mkdir -p $(LINUX_DIR)
|
||||
# Re-use config from install dir if one exits else use default config
|
||||
CONFIG_VERSION=$$(sed -ne 's/^EXTRAVERSION = //p' $(LINUX_DIR)/Makefile); \
|
||||
CONFIG_VERSION=$$(sed -ne 's/$$(XENGUEST)//; s/^EXTRAVERSION = //p' $(LINUX_SRCDIR)/Makefile); \
|
||||
[ -r $(DESTDIR)/boot/config-$(LINUX_VER3)$$CONFIG_VERSION-$(EXTRAVERSION) ] && \
|
||||
cp $(DESTDIR)/boot/config-$(LINUX_VER3)$$CONFIG_VERSION-$(EXTRAVERSION) $(LINUX_DIR)/.config \
|
||||
|| sh buildconfigs/create_config.sh $(LINUX_DIR)/.config $(EXTRAVERSION) $(XEN_TARGET_ARCH) $(XEN_SYSTYPE)
|
||||
# See if we need to munge config to enable PAE
|
||||
$(MAKE) CONFIG_FILE=$(LINUX_DIR)/.config -f buildconfigs/Rules.mk config-update-pae
|
||||
# Patch kernel Makefile to set EXTRAVERSION
|
||||
( cd $(LINUX_DIR) ; \
|
||||
sed -e 's/^EXTRAVERSION.*/&$$(XENGUEST)\nXENGUEST = -$(EXTRAVERSION)/' Makefile >Mk.tmp ; \
|
||||
rm -f Makefile ; mv Mk.tmp Makefile )
|
||||
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_ARCH) oldconfig
|
||||
echo "-$(EXTRAVERSION)" >$(LINUX_DIR)/.xenguest
|
||||
$(MAKE) -C $(LINUX_SRCDIR) ARCH=$(LINUX_ARCH) oldconfig O=$$(/bin/pwd)/$(LINUX_DIR)
|
||||
|
||||
.PHONY: prep
|
||||
prep: $(LINUX_DIR)/include/linux/autoconf.h
|
||||
@@ -62,4 +74,5 @@ delete:
|
||||
|
||||
.PHONY: mrpropper
|
||||
mrpropper:
|
||||
rm -rf $(LINUX_SRCDIR)
|
||||
rm -f linux-$(LINUX_VER).tar.bz2
|
||||
@@ -2,6 +2,7 @@ CONFIG_X86 := y
|
||||
CONFIG_X86_64 := y
|
||||
CONFIG_X86_$(XEN_OS) := y
|
||||
|
||||
CONFIG_COMPAT := y
|
||||
CONFIG_HVM := y
|
||||
CONFIG_MIGRATE := y
|
||||
CONFIG_XCUTILS := y
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
PS2PDF := ps2pdf
|
||||
DVIPS := dvips
|
||||
LATEX := latex
|
||||
FIG2DEV := fig2dev
|
||||
LATEX2HTML := latex2html
|
||||
DOXYGEN := doxygen
|
||||
POD2MAN := pod2man
|
||||
DOT := dot
|
||||
|
||||
pkgdocdir := /usr/share/doc/xen
|
||||
mandir := /usr/share/man
|
||||
|
||||
+8
-11
@@ -2,20 +2,10 @@
|
||||
|
||||
XEN_ROOT=..
|
||||
include $(XEN_ROOT)/Config.mk
|
||||
include $(XEN_ROOT)/docs/Docs.mk
|
||||
|
||||
VERSION = xen-unstable
|
||||
|
||||
PS2PDF := ps2pdf
|
||||
DVIPS := dvips
|
||||
LATEX := latex
|
||||
FIG2DEV := fig2dev
|
||||
LATEX2HTML := latex2html
|
||||
DOXYGEN := doxygen
|
||||
POD2MAN := pod2man
|
||||
|
||||
pkgdocdir := /usr/share/doc/xen
|
||||
mandir := /usr/share/man
|
||||
|
||||
DOC_MAN5SRC := $(wildcard man/*.pod.5)
|
||||
DOC_MAN1SRC := $(wildcard man/*.pod.1)
|
||||
DOC_MAN1 := $(patsubst man/%.pod.1,man1/%.1,$(DOC_MAN1SRC))
|
||||
@@ -32,6 +22,9 @@ all: build
|
||||
|
||||
.PHONY: build
|
||||
build: ps pdf html man-pages
|
||||
@if which $(DOT) 1>/dev/null 2>/dev/null ; then \
|
||||
$(MAKE) -C xen-api build ; else \
|
||||
echo "Graphviz (dot) not installed; skipping xen-api." ; fi
|
||||
rm -f *.aux *.dvi *.bbl *.blg *.glo *.idx *.ilg *.log *.ind *.toc
|
||||
|
||||
.PHONY: dev-docs
|
||||
@@ -74,6 +67,7 @@ man5/%.5: man/%.pod.5 Makefile
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(MAKE) -C xen-api clean
|
||||
rm -rf .word_count *.aux *.dvi *.bbl *.blg *.glo *.idx *~
|
||||
rm -rf *.ilg *.log *.ind *.toc *.bak core
|
||||
rm -rf $(GFX) ps pdf html
|
||||
@@ -88,6 +82,9 @@ distclean: clean
|
||||
install: all
|
||||
rm -rf $(DESTDIR)$(pkgdocdir)
|
||||
$(INSTALL_DIR) $(DESTDIR)$(pkgdocdir)
|
||||
|
||||
$(MAKE) -C xen-api install
|
||||
|
||||
cp -dR ps $(DESTDIR)$(pkgdocdir)
|
||||
cp -dR pdf $(DESTDIR)$(pkgdocdir)
|
||||
$(INSTALL_DIR) $(DESTDIR)$(mandir)
|
||||
|
||||
+2
-1
@@ -451,6 +451,7 @@ make the man page more readable):
|
||||
xen_minor : 0
|
||||
xen_extra : -devel
|
||||
xen_caps : xen-3.0-x86_32
|
||||
xen_scheduler : credit
|
||||
xen_pagesize : 4096
|
||||
platform_params : virt_start=0xfc000000
|
||||
xen_changeset : Mon Nov 14 18:13:38 2005 +0100
|
||||
@@ -460,7 +461,7 @@ make the man page more readable):
|
||||
cc_compile_by : sdague
|
||||
cc_compile_domain : (none)
|
||||
cc_compile_date : Mon Nov 14 14:16:48 EST 2005
|
||||
xend_config_format : 2
|
||||
xend_config_format : 3
|
||||
|
||||
B<FIELDS>
|
||||
|
||||
|
||||
@@ -135,6 +135,55 @@ one will be randomly chosen by xen with the 00:16:3e vendor id prefix.
|
||||
|
||||
=back
|
||||
|
||||
=item B<vfb>
|
||||
|
||||
A virtual frame buffer stanza in the form:
|
||||
|
||||
vfb = [ "stanza" ]
|
||||
|
||||
The stanza specifies a set of I<name = value> options separated by
|
||||
commas, in the form: "name1=value1, name2=value2, ..."
|
||||
|
||||
B<OPTIONS>
|
||||
|
||||
=over 4
|
||||
|
||||
=item I<type>
|
||||
|
||||
There are currently two valid options: I<vnc> starts a VNC server that
|
||||
lets you connect an external VNC viewer, and I<sdl> starts an internal
|
||||
viewer.
|
||||
|
||||
=item I<vncdisplay>
|
||||
|
||||
The VNC display number to use, defaults to the domain ID. The
|
||||
VNC server listens on port 5900 + display number.
|
||||
|
||||
=item I<vnclisten>
|
||||
|
||||
The listening address for the VNC server, default 127.0.0.1.
|
||||
|
||||
=item I<vncunused>
|
||||
|
||||
If non-zero, the VNC server listens on the first unused port above
|
||||
5900.
|
||||
|
||||
=item I<vncpasswd>
|
||||
|
||||
Overrides the XenD configured default password.
|
||||
|
||||
=item I<display>
|
||||
|
||||
Display to use for the internal viewer, defaults to environment
|
||||
variable I<DISPLAY>.
|
||||
|
||||
=item I<xauthority>
|
||||
|
||||
Authority file to use for the internal viewer, defaults to environment
|
||||
variable I<XAUTHORITY>.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
=head1 ADDITIONAL OPTIONS
|
||||
|
||||
+25
-6
@@ -1,22 +1,41 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
XEN_ROOT=../..
|
||||
include $(XEN_ROOT)/Config.mk
|
||||
include $(XEN_ROOT)/docs/Docs.mk
|
||||
|
||||
|
||||
TEX := $(wildcard *.tex)
|
||||
EPS := $(wildcard *.eps)
|
||||
EPSDOT := $(patsubst %.dot,%.eps,$(wildcard *.dot))
|
||||
|
||||
.PHONY: all
|
||||
all: xenapi.pdf xenapi.ps
|
||||
all: build
|
||||
|
||||
.PHONY: build
|
||||
build: xenapi.pdf xenapi.ps
|
||||
|
||||
install:
|
||||
$(INSTALL_DIR) $(DESTDIR)$(pkgdocdir)/ps
|
||||
$(INSTALL_DIR) $(DESTDIR)$(pkgdocdir)/pdf
|
||||
|
||||
cp xenapi.ps $(DESTDIR)$(pkgdocdir)/ps
|
||||
cp xenapi.pdf $(DESTDIR)$(pkgdocdir)/pdf
|
||||
|
||||
|
||||
xenapi.dvi: $(TEX) $(EPS) $(EPSDOT)
|
||||
latex xenapi.tex
|
||||
latex xenapi.tex
|
||||
$(LATEX) xenapi.tex
|
||||
$(LATEX) xenapi.tex
|
||||
rm -f *.aux *.log
|
||||
|
||||
%.pdf: %.ps
|
||||
ps2pdf $< $@
|
||||
$(PS2PDF) $< $@
|
||||
|
||||
%.ps: %.dvi
|
||||
dvips $< -o $@
|
||||
$(DVIPS) $< -o $@
|
||||
|
||||
%.eps: %.dot
|
||||
dot -Tps $< >$@
|
||||
$(DOT) -Tps $< >$@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
|
||||
@@ -149,16 +149,16 @@ We ought to support at least
|
||||
The XML-RPC interface is session-based; before you can make arbitrary RPC calls
|
||||
you must login and initiate a session. For example:
|
||||
\begin{verbatim}
|
||||
session_id Session.login_with_password(string uname, string pwd)
|
||||
session_id session.login_with_password(string uname, string pwd)
|
||||
\end{verbatim}
|
||||
Where {\tt uname} and {\tt password} refer to your username and password
|
||||
respectively, as defined by the Xen administrator.
|
||||
The {\tt session\_id} returned by {\tt Session.Login} is passed to subequent
|
||||
RPC calls as an authentication token.
|
||||
The {\tt session\_id} returned by {\tt session.login\_with\_password} is passed
|
||||
to subequent RPC calls as an authentication token.
|
||||
|
||||
A session can be terminated with the {\tt Session.Logout} function:
|
||||
A session can be terminated with the {\tt session.logout} function:
|
||||
\begin{verbatim}
|
||||
void Session.Logout(session_id session)
|
||||
void session.logout(session_id session)
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{Synchronous and Asynchronous invocation}
|
||||
@@ -251,14 +251,20 @@ call takes the session token as the only parameter)
|
||||
'2045dbc0-0734-4eea-9cb2-b8218c6b5bf2', '3202ae18-a046-4c32-9fda-e32e9631866e']
|
||||
\end{verbatim}
|
||||
|
||||
Note the VM references are internally UUIDs. Once a reference to a VM has been acquired a lifecycle operation may be invoked:
|
||||
The VM references here are UUIDs, though they may not be that simple in the
|
||||
future, and you should treat them as opaque strings. Once a reference to a VM
|
||||
has been acquired a lifecycle operation may be invoked:
|
||||
|
||||
\begin{verbatim}
|
||||
>>> xen.VM.start(session, all_vms[3], False)
|
||||
{'Status': 'Failure', 'ErrorDescription': 'Operation not implemented'}
|
||||
{'Status': 'Failure', 'ErrorDescription': ['VM_BAD_POWER_STATE', 'Halted', 'Running']}
|
||||
\end{verbatim}
|
||||
|
||||
In this case the {\tt start} message has not been implemented and an error response has been returned. Currently these high-level errors are returned as structured data (rather than as XMLRPC faults), allowing for internationalised errors in future. Finally, here are some examples of using accessors for object fields:
|
||||
In this case the {\tt start} message has been rejected, because the VM is
|
||||
already running, and so an error response has been returned. These high-level
|
||||
errors are returned as structured data (rather than as XML-RPC faults),
|
||||
allowing them to be internationalised. Finally, here are some examples of
|
||||
using accessors for object fields:
|
||||
|
||||
\begin{verbatim}
|
||||
>>> xen.VM.get_name_label(session, all_vms[3])['Value']
|
||||
|
||||
+2977
-1622
File diff suppressed because it is too large.
Load diff
+72
-86
@@ -1,106 +1,88 @@
|
||||
debug ?= y
|
||||
# Common Makefile for mini-os.
|
||||
#
|
||||
# Every architecture directory below mini-os/arch has to have a
|
||||
# Makefile and a arch.mk.
|
||||
#
|
||||
|
||||
pae ?= n
|
||||
|
||||
XEN_ROOT = ../..
|
||||
include $(XEN_ROOT)/Config.mk
|
||||
|
||||
XEN_INTERFACE_VERSION := 0x00030205
|
||||
export XEN_INTERFACE_VERSION
|
||||
|
||||
# Set TARGET_ARCH
|
||||
override TARGET_ARCH := $(XEN_TARGET_ARCH)
|
||||
override TARGET_ARCH := $(XEN_TARGET_ARCH)
|
||||
|
||||
XEN_INTERFACE_VERSION := 0x00030203
|
||||
# Set mini-os root path, used in mini-os.mk.
|
||||
MINI-OS_ROOT=$(PWD)
|
||||
export MINI-OS_ROOT
|
||||
|
||||
# NB. '-Wcast-qual' is nasty, so I omitted it.
|
||||
CFLAGS := -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
|
||||
CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
|
||||
CFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
|
||||
# Try to find out the architecture family TARGET_ARCH_FAM.
|
||||
# First check whether x86_... is contained (for x86_32, x86_32y, x86_64).
|
||||
# If not x86 then use $(TARGET_ARCH) -> for ia64, ...
|
||||
ifeq ($(findstring x86_,$(TARGET_ARCH)),x86_)
|
||||
TARGET_ARCH_FAM = x86
|
||||
else
|
||||
TARGET_ARCH_FAM = $(TARGET_ARCH)
|
||||
endif
|
||||
|
||||
ASFLAGS = -D__ASSEMBLY__
|
||||
# The architecture family directory below mini-os.
|
||||
TARGET_ARCH_DIR := arch/$(TARGET_ARCH_FAM)
|
||||
|
||||
LDLIBS = -L. -lminios
|
||||
LDFLAGS := -N -T minios-$(TARGET_ARCH).lds
|
||||
# Export these variables for possible use in architecture dependent makefiles.
|
||||
export TARGET_ARCH
|
||||
export TARGET_ARCH_DIR
|
||||
export TARGET_ARCH_FAM
|
||||
|
||||
# For possible special source directories.
|
||||
EXTRA_SRC =
|
||||
# For possible special header directories.
|
||||
EXTRA_INC =
|
||||
|
||||
# Standard name for architecture specific subdirectories.
|
||||
TARGET_ARCH_DIR = $(TARGET_ARCH)
|
||||
# This is used for architecture specific links.
|
||||
# This can be overwritten from arch specific rules.
|
||||
ARCH_LINKS =
|
||||
|
||||
ifeq ($(TARGET_ARCH),x86_32)
|
||||
CFLAGS += -m32 -march=i686
|
||||
LDFLAGS += -m elf_i386
|
||||
TARGET_ARCH_DIR = x86
|
||||
EXTRA_INC += $(TARGET_ARCH_DIR)/$(TARGET_ARCH)
|
||||
EXTRA_SRC += arch/$(EXTRA_INC)
|
||||
endif
|
||||
# For possible special header directories.
|
||||
# This can be overwritten from arch specific rules.
|
||||
EXTRA_INC =
|
||||
|
||||
ifeq ($(TARGET_ARCH)$(pae),x86_32y)
|
||||
CFLAGS += -DCONFIG_X86_PAE=1
|
||||
ASFLAGS += -DCONFIG_X86_PAE=1
|
||||
TARGET_ARCH_DIR = x86
|
||||
EXTRA_INC += $(TARGET_ARCH_DIR)/$(TARGET_ARCH)
|
||||
EXTRA_SRC += arch/$(EXTRA_INC)
|
||||
endif
|
||||
# Special build dependencies.
|
||||
# Build all after touching this/these file(s) (see minios.mk)
|
||||
SPEC_DEPENDS = minios.mk
|
||||
|
||||
ifeq ($(TARGET_ARCH),x86_64)
|
||||
CFLAGS += -m64 -mno-red-zone -fpic -fno-reorder-blocks
|
||||
CFLAGS += -fno-asynchronous-unwind-tables
|
||||
LDFLAGS += -m elf_x86_64
|
||||
TARGET_ARCH_DIR = x86
|
||||
EXTRA_INC += $(TARGET_ARCH_DIR)/$(TARGET_ARCH)
|
||||
EXTRA_SRC += arch/$(EXTRA_INC)
|
||||
endif
|
||||
# Include the architecture family's special makerules.
|
||||
# This must be before include minios.mk!
|
||||
include $(TARGET_ARCH_DIR)/arch.mk
|
||||
|
||||
ifeq ($(TARGET_ARCH),ia64)
|
||||
CFLAGS += -mfixed-range=f2-f5,f12-f15,f32-f127 -mconstant-gp
|
||||
ASFLAGS += -x assembler-with-cpp -Wall
|
||||
ASFLAGS += -mfixed-range=f2-f5,f12-f15,f32-f127 -fomit-frame-pointer
|
||||
ASFLAGS += -fno-builtin -fno-common -fno-strict-aliasing -mconstant-gp
|
||||
ARCH_LINKS = IA64_LINKS # Special link on ia64 needed
|
||||
define arch_links
|
||||
[ -e include/ia64/asm-xsi-offsets.h ] || ln -sf ../../../../xen/include/asm-ia64/asm-xsi-offsets.h include/ia64/asm-xsi-offsets.h
|
||||
endef
|
||||
endif
|
||||
# Include common mini-os makerules.
|
||||
include minios.mk
|
||||
|
||||
ifeq ($(debug),y)
|
||||
CFLAGS += -g
|
||||
else
|
||||
CFLAGS += -O3
|
||||
endif
|
||||
# Define some default flags for linking.
|
||||
LDLIBS :=
|
||||
LDFLAGS :=
|
||||
LDARCHLIB := -L$(TARGET_ARCH_DIR) -l$(ARCH_LIB_NAME)
|
||||
LDFLAGS_FINAL := -N -T $(TARGET_ARCH_DIR)/minios-$(TARGET_ARCH).lds
|
||||
|
||||
# Add the special header directories to the include paths.
|
||||
extra_incl := $(foreach dir,$(EXTRA_INC),-Iinclude/$(dir))
|
||||
override CPPFLAGS := -Iinclude $(CPPFLAGS) -Iinclude/$(TARGET_ARCH_DIR) $(extra_incl)
|
||||
# Prefix for global API names. All other symbols are localised before
|
||||
# linking with EXTRA_OBJS.
|
||||
GLOBAL_PREFIX := xenos_
|
||||
EXTRA_OBJS =
|
||||
|
||||
TARGET := mini-os
|
||||
|
||||
HEAD := $(TARGET_ARCH).o
|
||||
# Subdirectories common to mini-os
|
||||
SUBDIRS := lib xenbus console
|
||||
|
||||
# The common mini-os objects to build.
|
||||
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
|
||||
OBJS += $(patsubst %.c,%.o,$(wildcard lib/*.c))
|
||||
OBJS += $(patsubst %.c,%.o,$(wildcard xenbus/*.c))
|
||||
OBJS += $(patsubst %.c,%.o,$(wildcard console/*.c))
|
||||
OBJS += $(patsubst %.S,%.o,$(wildcard arch/$(TARGET_ARCH_DIR)/*.S))
|
||||
OBJS += $(patsubst %.c,%.o,$(wildcard arch/$(TARGET_ARCH_DIR)/*.c))
|
||||
# For special wanted source directories.
|
||||
extra_objs := $(foreach dir,$(EXTRA_SRC),$(patsubst %.c,%.o,$(wildcard $(dir)/*.c)))
|
||||
OBJS += $(extra_objs)
|
||||
extra_objs := $(foreach dir,$(EXTRA_SRC),$(patsubst %.S,%.o,$(wildcard $(dir)/*.S)))
|
||||
OBJS += $(extra_objs)
|
||||
|
||||
HDRS := $(wildcard include/*.h)
|
||||
HDRS += $(wildcard include/xen/*.h)
|
||||
HDRS += $(wildcard include/$(TARGET_ARCH_DIR)/*.h)
|
||||
# For special wanted header directories.
|
||||
extra_heads := $(foreach dir,$(EXTRA_INC),$(wildcard $(dir)/*.h))
|
||||
HDRS += $(extra_heads)
|
||||
|
||||
.PHONY: default
|
||||
default: $(TARGET)
|
||||
|
||||
# Create special architecture specific links.
|
||||
# Create special architecture specific links. The function arch_links
|
||||
# has to be defined in arch.mk (see include above).
|
||||
ifneq ($(ARCH_LINKS),)
|
||||
$(ARCH_LINKS):
|
||||
$(arch_links)
|
||||
@@ -110,26 +92,29 @@ endif
|
||||
links: $(ARCH_LINKS)
|
||||
[ -e include/xen ] || ln -sf ../../../xen/include/public include/xen
|
||||
|
||||
libminios.a: links $(OBJS) $(HEAD)
|
||||
$(AR) r libminios.a $(HEAD) $(OBJS)
|
||||
.PHONY: arch_lib
|
||||
arch_lib:
|
||||
$(MAKE) --directory=$(TARGET_ARCH_DIR) || exit 1;
|
||||
|
||||
$(TARGET): libminios.a $(HEAD)
|
||||
$(LD) $(LDFLAGS) $(HEAD) $(LDLIBS) -o $@.elf
|
||||
gzip -f -9 -c $@.elf >$@.gz
|
||||
$(TARGET): links $(OBJS) arch_lib
|
||||
$(LD) -r $(LDFLAGS) $(HEAD_OBJ) $(OBJS) $(LDARCHLIB) -o $@.o
|
||||
$(OBJCOPY) -w -G $(GLOBAL_PREFIX)* -G _start $@.o $@.o
|
||||
$(LD) $(LDFLAGS) $(LDFLAGS_FINAL) $@.o $(EXTRA_OBJS) -o $@
|
||||
gzip -f -9 -c $@ >$@.gz
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
find . -type f -name '*.o' | xargs rm -f
|
||||
.PHONY: clean arch_clean
|
||||
|
||||
arch_clean:
|
||||
$(MAKE) --directory=$(TARGET_ARCH_DIR) clean || exit 1;
|
||||
|
||||
clean: arch_clean
|
||||
for dir in $(SUBDIRS); do \
|
||||
rm -f $$dir/*.o; \
|
||||
done
|
||||
rm -f *.o *~ core $(TARGET).elf $(TARGET).raw $(TARGET) $(TARGET).gz
|
||||
rm -f libminios.a
|
||||
find . -type l | xargs rm -f
|
||||
rm -f tags TAGS
|
||||
|
||||
%.o: %.c $(HDRS) Makefile
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
%.o: %.S $(HDRS) Makefile
|
||||
$(CC) $(ASFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
define all_sources
|
||||
( find . -follow -name SCCS -prune -o -name '*.[chS]' -print )
|
||||
@@ -143,3 +128,4 @@ cscope:
|
||||
.PHONY: tags
|
||||
tags:
|
||||
$(all_sources) | xargs ctags
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#
|
||||
# x86 architecture specific makefiles.
|
||||
# It's is used for x86_32, x86_32y and x86_64
|
||||
#
|
||||
|
||||
# Rebuild all after touching this/these extra file(s) (see mini-os.mk)
|
||||
SPEC_DEP = arch.mk
|
||||
|
||||
# include arch.mk has to be before mini-os.mk!
|
||||
include arch.mk
|
||||
include ../../minios.mk
|
||||
|
||||
# Sources here are all *.c *.S without $(TARGET_ARCH).S
|
||||
# This is handled in $(HEAD_ARCH_OBJ)
|
||||
ARCH_SRCS := $(wildcard *.c)
|
||||
|
||||
# The objects built from the sources.
|
||||
ARCH_OBJS := $(patsubst %.c,%.o,$(ARCH_SRCS))
|
||||
|
||||
all: $(ARCH_LIB)
|
||||
|
||||
# $(HEAD_ARCH_OBJ) is only build here, needed on linking
|
||||
# in ../../Makefile.
|
||||
$(ARCH_LIB): $(ARCH_OBJS) $(HEAD_ARCH_OBJ)
|
||||
$(AR) rv $(ARCH_LIB) $(ARCH_OBJS)
|
||||
|
||||
clean:
|
||||
rm -f $(ARCH_LIB) $(ARCH_OBJS)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
#
|
||||
# Architecture special makerules for x86 family
|
||||
# (including x86_32, x86_32y and x86_64).
|
||||
#
|
||||
|
||||
ifeq ($(TARGET_ARCH),x86_32)
|
||||
ARCH_CFLAGS := -m32 -march=i686
|
||||
ARCH_LDFLAGS := -m elf_i386
|
||||
EXTRA_INC += $(TARGET_ARCH_FAM)/$(TARGET_ARCH)
|
||||
EXTRA_SRC += arch/$(EXTRA_INC)
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH)$(pae),x86_32y)
|
||||
ARCH_CFLAGS := -DCONFIG_X86_PAE=1
|
||||
ARCH_ASFLAGS := -DCONFIG_X86_PAE=1
|
||||
EXTRA_INC += $(TARGET_ARCH_FAM)/$(TARGET_ARCH)
|
||||
EXTRA_SRC += arch/$(EXTRA_INC)
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_ARCH),x86_64)
|
||||
ARCH_CFLAGS := -m64 -mno-red-zone -fpic -fno-reorder-blocks
|
||||
ARCH_CFLAGS := -fno-asynchronous-unwind-tables
|
||||
ARCH_LDFLAGS := -m elf_x86_64
|
||||
EXTRA_INC += $(TARGET_ARCH_FAM)/$(TARGET_ARCH)
|
||||
EXTRA_SRC += arch/$(EXTRA_INC)
|
||||
endif
|
||||
|
||||
|
||||
File renamed without changes.
File renamed without changes.
@@ -61,6 +61,7 @@ void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn,
|
||||
mmu_update_t mmu_updates[1];
|
||||
struct mmuext_op pin_request;
|
||||
|
||||
prot_e = prot_t = pincmd = 0;
|
||||
DEBUG("Allocating new L%d pt frame for pt_pfn=%lx, "
|
||||
"prev_l_mfn=%lx, offset=%lx",
|
||||
level, *pt_pfn, prev_l_mfn, offset);
|
||||
|
||||
@@ -91,10 +91,11 @@ static void stack_push(struct thread *thread, unsigned long value)
|
||||
*((unsigned long *)thread->sp) = value;
|
||||
}
|
||||
|
||||
struct thread* create_thread(char *name, void (*function)(void *), void *data)
|
||||
/* Architecture specific setup of thread creation */
|
||||
struct thread* arch_create_thread(char *name, void (*function)(void *),
|
||||
void *data)
|
||||
{
|
||||
struct thread *thread;
|
||||
unsigned long flags;
|
||||
|
||||
thread = xmalloc(struct thread);
|
||||
/* Allocate 2 pages for stack, stack will be 2pages aligned */
|
||||
@@ -110,24 +111,9 @@ struct thread* create_thread(char *name, void (*function)(void *), void *data)
|
||||
stack_push(thread, (unsigned long) function);
|
||||
stack_push(thread, (unsigned long) data);
|
||||
thread->ip = (unsigned long) thread_starter;
|
||||
|
||||
/* Not runable, not exited, not sleeping */
|
||||
thread->flags = 0;
|
||||
thread->wakeup_time = 0LL;
|
||||
set_runnable(thread);
|
||||
local_irq_save(flags);
|
||||
if(idle_thread != NULL) {
|
||||
list_add_tail(&thread->thread_list, &idle_thread->thread_list);
|
||||
} else if(function != idle_thread_fn)
|
||||
{
|
||||
printk("BUG: Not allowed to create thread before initialising scheduler.\n");
|
||||
BUG();
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return thread;
|
||||
}
|
||||
|
||||
|
||||
void run_idle_thread(void)
|
||||
{
|
||||
/* Switch stacks and run the thread */
|
||||
|
||||
File renamed without changes.
@@ -69,7 +69,7 @@ CS = 0x2C
|
||||
popl %ds; \
|
||||
popl %es; \
|
||||
addl $4,%esp; \
|
||||
iret; \
|
||||
iret;
|
||||
|
||||
ENTRY(divide_error)
|
||||
pushl $0 # no error code
|
||||
@@ -101,10 +101,9 @@ do_exception:
|
||||
jmp ret_from_exception
|
||||
|
||||
ret_from_exception:
|
||||
movb CS(%esp),%cl
|
||||
test $2,%cl # slow return to ring 2 or 3
|
||||
jne safesti
|
||||
RESTORE_ALL
|
||||
movb CS(%esp),%cl
|
||||
addl $8,%esp
|
||||
RESTORE_ALL
|
||||
|
||||
# A note on the "critical region" in our callback handler.
|
||||
# We want to avoid stacking callback handlers due to events occurring
|
||||
File renamed without changes.
+15
-23
@@ -23,31 +23,24 @@
|
||||
|
||||
#define NR_GRANT_FRAMES 4
|
||||
#define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t))
|
||||
#define GNTTAB_LIST_END (NR_GRANT_ENTRIES + 1)
|
||||
|
||||
static grant_entry_t *gnttab_table;
|
||||
static grant_ref_t gnttab_list[NR_GRANT_ENTRIES];
|
||||
static grant_ref_t gnttab_free_head;
|
||||
|
||||
static grant_ref_t
|
||||
get_free_entries(int count)
|
||||
{
|
||||
grant_ref_t ref;
|
||||
grant_ref_t head;
|
||||
|
||||
ref = head = gnttab_free_head;
|
||||
while (count-- > 1)
|
||||
head = gnttab_list[head];
|
||||
gnttab_free_head = gnttab_list[head];
|
||||
gnttab_list[head] = GNTTAB_LIST_END;
|
||||
return ref;
|
||||
}
|
||||
|
||||
static void
|
||||
put_free_entry(grant_ref_t gref)
|
||||
put_free_entry(grant_ref_t ref)
|
||||
{
|
||||
gnttab_list[gref] = gnttab_free_head;
|
||||
gnttab_free_head = gref;
|
||||
gnttab_list[ref] = gnttab_list[0];
|
||||
gnttab_list[0] = ref;
|
||||
|
||||
}
|
||||
|
||||
static grant_ref_t
|
||||
get_free_entry(void)
|
||||
{
|
||||
unsigned int ref = gnttab_list[0];
|
||||
gnttab_list[0] = gnttab_list[ref];
|
||||
return ref;
|
||||
}
|
||||
|
||||
grant_ref_t
|
||||
@@ -55,7 +48,7 @@ gnttab_grant_access(domid_t domid, unsigned long frame, int readonly)
|
||||
{
|
||||
grant_ref_t ref;
|
||||
|
||||
ref = get_free_entries(1);
|
||||
ref = get_free_entry();
|
||||
gnttab_table[ref].frame = frame;
|
||||
gnttab_table[ref].domid = domid;
|
||||
wmb();
|
||||
@@ -70,7 +63,7 @@ gnttab_grant_transfer(domid_t domid, unsigned long pfn)
|
||||
{
|
||||
grant_ref_t ref;
|
||||
|
||||
ref = get_free_entries(1);
|
||||
ref = get_free_entry();
|
||||
gnttab_table[ref].frame = pfn;
|
||||
gnttab_table[ref].domid = domid;
|
||||
wmb();
|
||||
@@ -157,8 +150,7 @@ init_gnttab(void)
|
||||
int i;
|
||||
|
||||
for (i = NR_RESERVED_ENTRIES; i < NR_GRANT_ENTRIES; i++)
|
||||
gnttab_list[i] = i + 1;
|
||||
gnttab_free_head = NR_RESERVED_ENTRIES;
|
||||
put_free_entry(i);
|
||||
|
||||
setup.dom = DOMID_SELF;
|
||||
setup.nr_frames = NR_GRANT_FRAMES;
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
|
||||
#include <types.h>
|
||||
#include <xen/xen.h>
|
||||
#include <xen/dom0_ops.h>
|
||||
#if defined(__i386__)
|
||||
#include <hypercall-x86_32.h>
|
||||
#elif defined(__x86_64__)
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
void init_netfront(void*);
|
||||
void netfront_xmit(unsigned char* data,int len);
|
||||
@@ -31,6 +31,9 @@ void idle_thread_fn(void *unused);
|
||||
|
||||
#define switch_threads(prev, next) arch_switch_threads(prev, next)
|
||||
|
||||
/* Architecture specific setup of thread creation. */
|
||||
struct thread* arch_create_thread(char *name, void (*function)(void *),
|
||||
void *data);
|
||||
|
||||
void init_sched(void);
|
||||
void run_idle_thread(void);
|
||||
|
||||
@@ -181,14 +181,6 @@ HYPERVISOR_set_timer_op(
|
||||
return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_dom0_op(
|
||||
dom0_op_t *dom0_op)
|
||||
{
|
||||
dom0_op->interface_version = DOM0_INTERFACE_VERSION;
|
||||
return _hypercall1(int, dom0_op, dom0_op);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_set_debugreg(
|
||||
int reg, unsigned long value)
|
||||
@@ -313,6 +305,20 @@ HYPERVISOR_nmi_op(
|
||||
return _hypercall2(int, nmi_op, op, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_sysctl(
|
||||
unsigned long op)
|
||||
{
|
||||
return _hypercall1(int, sysctl, op);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_domctl(
|
||||
unsigned long op)
|
||||
{
|
||||
return _hypercall1(int, domctl, op);
|
||||
}
|
||||
|
||||
#endif /* __HYPERCALL_X86_32_H__ */
|
||||
|
||||
/*
|
||||
|
||||
@@ -183,14 +183,6 @@ HYPERVISOR_set_timer_op(
|
||||
return _hypercall1(long, set_timer_op, timeout);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_dom0_op(
|
||||
dom0_op_t *dom0_op)
|
||||
{
|
||||
dom0_op->interface_version = DOM0_INTERFACE_VERSION;
|
||||
return _hypercall1(int, dom0_op, dom0_op);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_set_debugreg(
|
||||
int reg, unsigned long value)
|
||||
@@ -313,6 +305,20 @@ HYPERVISOR_nmi_op(
|
||||
return _hypercall2(int, nmi_op, op, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_sysctl(
|
||||
unsigned long op)
|
||||
{
|
||||
return _hypercall1(int, sysctl, op);
|
||||
}
|
||||
|
||||
static inline int
|
||||
HYPERVISOR_domctl(
|
||||
unsigned long op)
|
||||
{
|
||||
return _hypercall1(int, domctl, op);
|
||||
}
|
||||
|
||||
#endif /* __HYPERCALL_X86_64_H__ */
|
||||
|
||||
/*
|
||||
|
||||
@@ -12,6 +12,9 @@ void init_xenbus(void);
|
||||
set to a malloc'd copy of the value. */
|
||||
char *xenbus_read(xenbus_transaction_t xbt, const char *path, char **value);
|
||||
|
||||
char *xenbus_watch_path(xenbus_transaction_t xbt, const char *path);
|
||||
char* xenbus_wait_for_value(const char*,const char*);
|
||||
|
||||
/* Associates a value with a path. Returns a malloc'd error string on
|
||||
failure. */
|
||||
char *xenbus_write(xenbus_transaction_t xbt, const char *path, const char *value);
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <sched.h>
|
||||
#include <xenbus.h>
|
||||
#include <gnttab.h>
|
||||
#include <netfront.h>
|
||||
#include <xen/features.h>
|
||||
#include <xen/version.h>
|
||||
|
||||
@@ -61,13 +62,13 @@ void setup_xen_features(void)
|
||||
|
||||
void test_xenbus(void);
|
||||
|
||||
void xenbus_tester(void *p)
|
||||
static void xenbus_tester(void *p)
|
||||
{
|
||||
printk("Xenbus tests disabled, because of a Xend bug.\n");
|
||||
/* test_xenbus(); */
|
||||
}
|
||||
|
||||
void periodic_thread(void *p)
|
||||
static void periodic_thread(void *p)
|
||||
{
|
||||
struct timeval tv;
|
||||
printk("Periodic thread started.\n");
|
||||
@@ -79,12 +80,18 @@ void periodic_thread(void *p)
|
||||
}
|
||||
}
|
||||
|
||||
static void netfront_thread(void *p)
|
||||
{
|
||||
init_netfront(&start_info);
|
||||
}
|
||||
|
||||
/* This should be overridden by the application we are linked against. */
|
||||
__attribute__((weak)) int app_main(start_info_t *si)
|
||||
{
|
||||
printk("Dummy main: start_info=%p\n", si);
|
||||
create_thread("xenbus_tester", xenbus_tester, si);
|
||||
create_thread("periodic_thread", periodic_thread, si);
|
||||
create_thread("netfront", netfront_thread, si);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,10 @@
|
||||
|
||||
#include <types.h>
|
||||
|
||||
/* On ia64 these functions lead to crashes. These are replaced by
|
||||
* assembler functions. */
|
||||
#if !defined(__ia64__)
|
||||
|
||||
/*
|
||||
* Depending on the desired operation, we view a `long long' (aka quad_t) in
|
||||
* one or more of the following formats.
|
||||
@@ -380,3 +384,4 @@ __umoddi3(u_quad_t a, u_quad_t b)
|
||||
return (r);
|
||||
}
|
||||
|
||||
#endif /* !defined(__ia64__) */
|
||||
@@ -48,6 +48,12 @@ struct xmalloc_hdr
|
||||
/* Total including this hdr. */
|
||||
size_t size;
|
||||
struct list_head freelist;
|
||||
#if defined(__ia64__)
|
||||
// Needed for ia64 as long as the align parameter in _xmalloc()
|
||||
// is not supported.
|
||||
uint64_t pad;
|
||||
#endif
|
||||
|
||||
} __cacheline_aligned;
|
||||
|
||||
static void maybe_split(struct xmalloc_hdr *hdr, size_t size, size_t block)
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
#
|
||||
# The file contains the common make rules for building mini-os.
|
||||
#
|
||||
|
||||
debug = y
|
||||
|
||||
# Define some default flags.
|
||||
# NB. '-Wcast-qual' is nasty, so I omitted it.
|
||||
DEF_CFLAGS := -fno-builtin -Wall -Werror -Wredundant-decls -Wno-format
|
||||
DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
|
||||
DEF_CFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
|
||||
|
||||
DEF_ASFLAGS = -D__ASSEMBLY__
|
||||
|
||||
ifeq ($(debug),y)
|
||||
DEF_CFLAGS += -g
|
||||
else
|
||||
DEF_CFLAGS += -O3
|
||||
endif
|
||||
|
||||
# Build the CFLAGS and ASFLAGS for compiling and assembling.
|
||||
# DEF_... flags are the common mini-os flags,
|
||||
# ARCH_... flags may be defined in arch/$(TARGET_ARCH_FAM/rules.mk
|
||||
CFLAGS := $(DEF_CFLAGS) $(ARCH_CFLAGS)
|
||||
ASFLAGS := $(DEF_ASFLAGS) $(ARCH_ASFLAGS)
|
||||
|
||||
# The path pointing to the architecture specific header files.
|
||||
ARCH_SPEC_INC := $(MINI-OS_ROOT)/include/$(TARGET_ARCH_FAM)
|
||||
|
||||
# Find all header files for checking dependencies.
|
||||
HDRS := $(wildcard $(MINI-OS_ROOT)/include/*.h)
|
||||
HDRS += $(wildcard $(MINI-OS_ROOT)/include/xen/*.h)
|
||||
HDRS += $(wildcard $(ARCH_SPEC_INC)/*.h)
|
||||
# For special wanted header directories.
|
||||
extra_heads := $(foreach dir,$(EXTRA_INC),$(wildcard $(dir)/*.h))
|
||||
HDRS += $(extra_heads)
|
||||
|
||||
# Add the special header directories to the include paths.
|
||||
extra_incl := $(foreach dir,$(EXTRA_INC),-I$(MINI-OS_ROOT)/include/$(dir))
|
||||
override CPPFLAGS := -I$(MINI-OS_ROOT)/include $(CPPFLAGS) -I$(ARCH_SPEC_INC) $(extra_incl)
|
||||
|
||||
# The name of the architecture specific library.
|
||||
# This is on x86_32: libx86_32.a
|
||||
# $(ARCH_LIB) has to built in the architecture specific directory.
|
||||
ARCH_LIB_NAME = $(TARGET_ARCH)
|
||||
ARCH_LIB := lib$(ARCH_LIB_NAME).a
|
||||
|
||||
# This object contains the entrypoint for startup from Xen.
|
||||
# $(HEAD_ARCH_OBJ) has to be built in the architecture specific directory.
|
||||
HEAD_ARCH_OBJ := $(TARGET_ARCH).o
|
||||
HEAD_OBJ := $(TARGET_ARCH_DIR)/$(HEAD_ARCH_OBJ)
|
||||
|
||||
|
||||
%.o: %.c $(HDRS) Makefile $(SPEC_DEPENDS)
|
||||
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
%.o: %.S $(HDRS) Makefile $(SPEC_DEPENDS)
|
||||
$(CC) $(ASFLAGS) $(CPPFLAGS) -c $< -o $@
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,454 @@
|
||||
/* Minimal network driver for Mini-OS.
|
||||
* Copyright (c) 2006-2007 Jacob Gorm Hansen, University of Copenhagen.
|
||||
* Based on netfront.c from Xen Linux.
|
||||
*
|
||||
* Does not handle fragments or extras.
|
||||
*/
|
||||
|
||||
#include <os.h>
|
||||
#include <xenbus.h>
|
||||
#include <events.h>
|
||||
#include <errno.h>
|
||||
#include <xen/io/netif.h>
|
||||
#include <gnttab.h>
|
||||
#include <xmalloc.h>
|
||||
#include <time.h>
|
||||
|
||||
void init_rx_buffers(void);
|
||||
|
||||
struct net_info {
|
||||
struct netif_tx_front_ring tx;
|
||||
struct netif_rx_front_ring rx;
|
||||
int tx_ring_ref;
|
||||
int rx_ring_ref;
|
||||
unsigned int evtchn, local_port;
|
||||
|
||||
} net_info;
|
||||
|
||||
|
||||
char* xenbus_printf(xenbus_transaction_t xbt,
|
||||
char* node,char* path,
|
||||
char* fmt,unsigned int arg)
|
||||
{
|
||||
char fullpath[256];
|
||||
char val[256];
|
||||
|
||||
sprintf(fullpath,"%s/%s",node,path);
|
||||
sprintf(val,fmt,arg);
|
||||
xenbus_write(xbt,fullpath,val);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
|
||||
#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
|
||||
#define GRANT_INVALID_REF 0
|
||||
|
||||
|
||||
unsigned short rx_freelist[NET_RX_RING_SIZE];
|
||||
unsigned short tx_freelist[NET_TX_RING_SIZE];
|
||||
|
||||
struct net_buffer {
|
||||
void* page;
|
||||
int gref;
|
||||
};
|
||||
struct net_buffer rx_buffers[NET_RX_RING_SIZE];
|
||||
struct net_buffer tx_buffers[NET_TX_RING_SIZE];
|
||||
|
||||
static inline void add_id_to_freelist(unsigned int id,unsigned short* freelist)
|
||||
{
|
||||
freelist[id] = freelist[0];
|
||||
freelist[0] = id;
|
||||
}
|
||||
|
||||
static inline unsigned short get_id_from_freelist(unsigned short* freelist)
|
||||
{
|
||||
unsigned int id = freelist[0];
|
||||
freelist[0] = freelist[id];
|
||||
return id;
|
||||
}
|
||||
|
||||
__attribute__((weak)) void netif_rx(unsigned char* data,int len)
|
||||
{
|
||||
printk("%d bytes incoming at %p\n",len,data);
|
||||
}
|
||||
|
||||
__attribute__((weak)) void net_app_main(void*si,unsigned char*mac) {}
|
||||
|
||||
static inline int xennet_rxidx(RING_IDX idx)
|
||||
{
|
||||
return idx & (NET_RX_RING_SIZE - 1);
|
||||
}
|
||||
|
||||
void network_rx(void)
|
||||
{
|
||||
struct net_info *np = &net_info;
|
||||
RING_IDX rp,cons;
|
||||
struct netif_rx_response *rx;
|
||||
|
||||
|
||||
moretodo:
|
||||
rp = np->rx.sring->rsp_prod;
|
||||
rmb(); /* Ensure we see queued responses up to 'rp'. */
|
||||
cons = np->rx.rsp_cons;
|
||||
|
||||
int nr_consumed=0;
|
||||
while ((cons != rp))
|
||||
{
|
||||
struct net_buffer* buf;
|
||||
unsigned char* page;
|
||||
|
||||
rx = RING_GET_RESPONSE(&np->rx, cons);
|
||||
|
||||
if (rx->flags & NETRXF_extra_info)
|
||||
{
|
||||
printk("+++++++++++++++++++++ we have extras!\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (rx->status == NETIF_RSP_NULL) continue;
|
||||
|
||||
int id = rx->id;
|
||||
|
||||
buf = &rx_buffers[id];
|
||||
page = (unsigned char*)buf->page;
|
||||
gnttab_end_access(buf->gref);
|
||||
|
||||
if(rx->status>0)
|
||||
{
|
||||
netif_rx(page+rx->offset,rx->status);
|
||||
}
|
||||
|
||||
add_id_to_freelist(id,rx_freelist);
|
||||
|
||||
nr_consumed++;
|
||||
|
||||
++cons;
|
||||
}
|
||||
np->rx.rsp_cons=rp;
|
||||
|
||||
int more;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES(&np->rx,more);
|
||||
if(more) goto moretodo;
|
||||
|
||||
RING_IDX req_prod = np->rx.req_prod_pvt;
|
||||
|
||||
int i;
|
||||
netif_rx_request_t *req;
|
||||
|
||||
for(i=0; i<nr_consumed; i++)
|
||||
{
|
||||
int id = xennet_rxidx(req_prod + i);
|
||||
req = RING_GET_REQUEST(&np->rx, req_prod + i);
|
||||
struct net_buffer* buf = &rx_buffers[id];
|
||||
void* page = buf->page;
|
||||
|
||||
buf->gref = req->gref =
|
||||
gnttab_grant_access(0,virt_to_mfn(page),0);
|
||||
|
||||
req->id = id;
|
||||
}
|
||||
|
||||
wmb();
|
||||
|
||||
np->rx.req_prod_pvt = req_prod + i;
|
||||
|
||||
int notify;
|
||||
RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->rx, notify);
|
||||
if (notify)
|
||||
notify_remote_via_evtchn(np->evtchn);
|
||||
|
||||
}
|
||||
|
||||
void network_tx_buf_gc(void)
|
||||
{
|
||||
|
||||
|
||||
RING_IDX cons, prod;
|
||||
unsigned short id;
|
||||
struct net_info *np = &net_info;
|
||||
|
||||
do {
|
||||
prod = np->tx.sring->rsp_prod;
|
||||
rmb(); /* Ensure we see responses up to 'rp'. */
|
||||
|
||||
for (cons = np->tx.rsp_cons; cons != prod; cons++)
|
||||
{
|
||||
struct netif_tx_response *txrsp;
|
||||
|
||||
txrsp = RING_GET_RESPONSE(&np->tx, cons);
|
||||
if (txrsp->status == NETIF_RSP_NULL)
|
||||
continue;
|
||||
|
||||
id = txrsp->id;
|
||||
struct net_buffer* buf = &tx_buffers[id];
|
||||
gnttab_end_access(buf->gref);
|
||||
buf->gref=GRANT_INVALID_REF;
|
||||
|
||||
add_id_to_freelist(id,tx_freelist);
|
||||
}
|
||||
|
||||
np->tx.rsp_cons = prod;
|
||||
|
||||
/*
|
||||
* Set a new event, then check for race with update of tx_cons.
|
||||
* Note that it is essential to schedule a callback, no matter
|
||||
* how few tx_buffers are pending. Even if there is space in the
|
||||
* transmit ring, higher layers may be blocked because too much
|
||||
* data is outstanding: in such cases notification from Xen is
|
||||
* likely to be the only kick that we'll get.
|
||||
*/
|
||||
np->tx.sring->rsp_event =
|
||||
prod + ((np->tx.sring->req_prod - prod) >> 1) + 1;
|
||||
mb();
|
||||
} while ((cons == prod) && (prod != np->tx.sring->rsp_prod));
|
||||
|
||||
|
||||
}
|
||||
|
||||
void netfront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
|
||||
{
|
||||
int flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
network_tx_buf_gc();
|
||||
network_rx();
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
char* backend;
|
||||
|
||||
void init_netfront(void* si)
|
||||
{
|
||||
xenbus_transaction_t xbt;
|
||||
struct net_info* info = &net_info;
|
||||
char* err;
|
||||
char* message=NULL;
|
||||
char nodename[] = "device/vif/0";
|
||||
struct netif_tx_sring *txs;
|
||||
struct netif_rx_sring *rxs;
|
||||
int retry=0;
|
||||
int i;
|
||||
char* mac;
|
||||
char* msg;
|
||||
|
||||
printk("************************ NETFRONT **********\n\n\n");
|
||||
|
||||
for(i=0;i<NET_TX_RING_SIZE;i++)
|
||||
{
|
||||
add_id_to_freelist(i,tx_freelist);
|
||||
tx_buffers[i].page = (char*)alloc_page();
|
||||
}
|
||||
|
||||
for(i=0;i<NET_RX_RING_SIZE;i++)
|
||||
{
|
||||
add_id_to_freelist(i,rx_freelist);
|
||||
rx_buffers[i].page = (char*)alloc_page();
|
||||
}
|
||||
|
||||
txs = (struct netif_tx_sring*) alloc_page();
|
||||
rxs = (struct netif_rx_sring *) alloc_page();
|
||||
memset(txs,0,PAGE_SIZE);
|
||||
memset(rxs,0,PAGE_SIZE);
|
||||
|
||||
|
||||
SHARED_RING_INIT(txs);
|
||||
SHARED_RING_INIT(rxs);
|
||||
FRONT_RING_INIT(&info->tx, txs, PAGE_SIZE);
|
||||
FRONT_RING_INIT(&info->rx, rxs, PAGE_SIZE);
|
||||
|
||||
info->tx_ring_ref = gnttab_grant_access(0,virt_to_mfn(txs),0);
|
||||
info->rx_ring_ref = gnttab_grant_access(0,virt_to_mfn(rxs),0);
|
||||
|
||||
evtchn_alloc_unbound_t op;
|
||||
op.dom = DOMID_SELF;
|
||||
op.remote_dom = 0;
|
||||
HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound, &op);
|
||||
clear_evtchn(op.port); /* Without, handler gets invoked now! */
|
||||
info->local_port = bind_evtchn(op.port, netfront_handler, NULL);
|
||||
info->evtchn=op.port;
|
||||
|
||||
again:
|
||||
err = xenbus_transaction_start(&xbt);
|
||||
if (err) {
|
||||
printk("starting transaction\n");
|
||||
}
|
||||
|
||||
err = xenbus_printf(xbt, nodename, "tx-ring-ref","%u",
|
||||
info->tx_ring_ref);
|
||||
if (err) {
|
||||
message = "writing tx ring-ref";
|
||||
goto abort_transaction;
|
||||
}
|
||||
err = xenbus_printf(xbt, nodename, "rx-ring-ref","%u",
|
||||
info->rx_ring_ref);
|
||||
if (err) {
|
||||
message = "writing rx ring-ref";
|
||||
goto abort_transaction;
|
||||
}
|
||||
err = xenbus_printf(xbt, nodename,
|
||||
"event-channel", "%u", info->evtchn);
|
||||
if (err) {
|
||||
message = "writing event-channel";
|
||||
goto abort_transaction;
|
||||
}
|
||||
|
||||
err = xenbus_printf(xbt, nodename, "request-rx-copy", "%u", 1);
|
||||
|
||||
if (err) {
|
||||
message = "writing request-rx-copy";
|
||||
goto abort_transaction;
|
||||
}
|
||||
|
||||
err = xenbus_printf(xbt, nodename, "state", "%u",
|
||||
4); /* connected */
|
||||
|
||||
|
||||
err = xenbus_transaction_end(xbt, 0, &retry);
|
||||
if (retry) {
|
||||
goto again;
|
||||
printk("completing transaction\n");
|
||||
}
|
||||
|
||||
goto done;
|
||||
|
||||
abort_transaction:
|
||||
xenbus_transaction_end(xbt, 1, &retry);
|
||||
|
||||
done:
|
||||
|
||||
msg = xenbus_read(XBT_NIL, "device/vif/0/backend", &backend);
|
||||
msg = xenbus_read(XBT_NIL, "device/vif/0/mac", &mac);
|
||||
|
||||
if ((backend == NULL) || (mac == NULL)) {
|
||||
struct evtchn_close op = { info->local_port };
|
||||
printk("%s: backend/mac failed\n", __func__);
|
||||
unbind_evtchn(info->local_port);
|
||||
HYPERVISOR_event_channel_op(EVTCHNOP_close, &op);
|
||||
return;
|
||||
}
|
||||
|
||||
printk("backend at %s\n",backend);
|
||||
printk("mac is %s\n",mac);
|
||||
|
||||
char path[256];
|
||||
sprintf(path,"%s/state",backend);
|
||||
|
||||
xenbus_watch_path(XBT_NIL, path);
|
||||
|
||||
xenbus_wait_for_value(path,"4");
|
||||
|
||||
//free(backend);
|
||||
|
||||
printk("**************************\n");
|
||||
|
||||
init_rx_buffers();
|
||||
|
||||
unsigned char rawmac[6];
|
||||
sscanf(mac,"%x:%x:%x:%x:%x:%x",
|
||||
&rawmac[0],
|
||||
&rawmac[1],
|
||||
&rawmac[2],
|
||||
&rawmac[3],
|
||||
&rawmac[4],
|
||||
&rawmac[5]);
|
||||
|
||||
net_app_main(si,rawmac);
|
||||
}
|
||||
|
||||
void shutdown_netfront(void)
|
||||
{
|
||||
//xenbus_transaction_t xbt;
|
||||
char* err;
|
||||
char nodename[] = "device/vif/0";
|
||||
|
||||
char path[256];
|
||||
|
||||
printk("close network: backend at %s\n",backend);
|
||||
|
||||
err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 6); /* closing */
|
||||
sprintf(path,"%s/state",backend);
|
||||
|
||||
xenbus_wait_for_value(path,"6");
|
||||
|
||||
err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 1);
|
||||
|
||||
xenbus_wait_for_value(path,"2");
|
||||
|
||||
unbind_all_ports();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void init_rx_buffers(void)
|
||||
{
|
||||
struct net_info* np = &net_info;
|
||||
int i, requeue_idx;
|
||||
netif_rx_request_t *req;
|
||||
int notify;
|
||||
|
||||
/* Rebuild the RX buffer freelist and the RX ring itself. */
|
||||
for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++)
|
||||
{
|
||||
struct net_buffer* buf = &rx_buffers[requeue_idx];
|
||||
req = RING_GET_REQUEST(&np->rx, requeue_idx);
|
||||
|
||||
buf->gref = req->gref =
|
||||
gnttab_grant_access(0,virt_to_mfn(buf->page),0);
|
||||
|
||||
req->id = requeue_idx;
|
||||
|
||||
requeue_idx++;
|
||||
}
|
||||
|
||||
np->rx.req_prod_pvt = requeue_idx;
|
||||
|
||||
RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->rx, notify);
|
||||
|
||||
if (notify)
|
||||
notify_remote_via_evtchn(np->evtchn);
|
||||
|
||||
np->rx.sring->rsp_event = np->rx.rsp_cons + 1;
|
||||
}
|
||||
|
||||
|
||||
void netfront_xmit(unsigned char* data,int len)
|
||||
{
|
||||
int flags;
|
||||
local_irq_save(flags);
|
||||
|
||||
struct net_info* info = &net_info;
|
||||
struct netif_tx_request *tx;
|
||||
RING_IDX i = info->tx.req_prod_pvt;
|
||||
int notify;
|
||||
int id = get_id_from_freelist(tx_freelist);
|
||||
struct net_buffer* buf = &tx_buffers[id];
|
||||
void* page = buf->page;
|
||||
|
||||
tx = RING_GET_REQUEST(&info->tx, i);
|
||||
|
||||
memcpy(page,data,len);
|
||||
|
||||
buf->gref =
|
||||
tx->gref = gnttab_grant_access(0,virt_to_mfn(page),0);
|
||||
|
||||
tx->offset=0;
|
||||
tx->size = len;
|
||||
tx->flags=0;
|
||||
tx->id = id;
|
||||
info->tx.req_prod_pvt = i + 1;
|
||||
|
||||
wmb();
|
||||
|
||||
RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->tx, notify);
|
||||
|
||||
if(notify) notify_remote_via_evtchn(info->evtchn);
|
||||
|
||||
network_tx_buf_gc();
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
+21
-5
@@ -155,11 +155,27 @@ void schedule(void)
|
||||
if(prev != next) switch_threads(prev, next);
|
||||
}
|
||||
|
||||
|
||||
/* Gets run when a new thread is scheduled the first time ever,
|
||||
defined in x86_[32/64].S */
|
||||
extern void thread_starter(void);
|
||||
|
||||
struct thread* create_thread(char *name, void (*function)(void *), void *data)
|
||||
{
|
||||
struct thread *thread;
|
||||
unsigned long flags;
|
||||
/* Call architecture specific setup. */
|
||||
thread = arch_create_thread(name, function, data);
|
||||
/* Not runable, not exited, not sleeping */
|
||||
thread->flags = 0;
|
||||
thread->wakeup_time = 0LL;
|
||||
set_runnable(thread);
|
||||
local_irq_save(flags);
|
||||
if(idle_thread != NULL) {
|
||||
list_add_tail(&thread->thread_list, &idle_thread->thread_list);
|
||||
} else if(function != idle_thread_fn)
|
||||
{
|
||||
printk("BUG: Not allowed to create thread before initialising scheduler.\n");
|
||||
BUG();
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
return thread;
|
||||
}
|
||||
|
||||
void exit_thread(void)
|
||||
{
|
||||
|
||||
@@ -45,9 +45,9 @@
|
||||
#define DEBUG(_f, _a...) ((void)0)
|
||||
#endif
|
||||
|
||||
|
||||
static struct xenstore_domain_interface *xenstore_buf;
|
||||
static DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
|
||||
static DECLARE_WAIT_QUEUE_HEAD(watch_queue);
|
||||
struct xenbus_req_info
|
||||
{
|
||||
int in_use:1;
|
||||
@@ -72,10 +72,38 @@ static void memcpy_from_ring(const void *Ring,
|
||||
memcpy(dest + c1, ring, c2);
|
||||
}
|
||||
|
||||
static inline void wait_for_watch(void)
|
||||
{
|
||||
DEFINE_WAIT(w);
|
||||
add_waiter(w,watch_queue);
|
||||
schedule();
|
||||
wake(current);
|
||||
}
|
||||
|
||||
char* xenbus_wait_for_value(const char* path,const char* value)
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
char *res, *msg;
|
||||
int r;
|
||||
|
||||
msg = xenbus_read(XBT_NIL, path, &res);
|
||||
if(msg) return msg;
|
||||
|
||||
r = strcmp(value,res);
|
||||
free(res);
|
||||
|
||||
if(r==0) break;
|
||||
else wait_for_watch();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void xenbus_thread_func(void *ign)
|
||||
{
|
||||
struct xsd_sockmsg msg;
|
||||
unsigned prod;
|
||||
unsigned prod = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@@ -101,13 +129,35 @@ static void xenbus_thread_func(void *ign)
|
||||
break;
|
||||
|
||||
DEBUG("Message is good.\n");
|
||||
req_info[msg.req_id].reply = malloc(sizeof(msg) + msg.len);
|
||||
memcpy_from_ring(xenstore_buf->rsp,
|
||||
|
||||
if(msg.type == XS_WATCH_EVENT)
|
||||
{
|
||||
char* payload = (char*)malloc(sizeof(msg) + msg.len);
|
||||
char *path,*token;
|
||||
|
||||
memcpy_from_ring(xenstore_buf->rsp,
|
||||
payload,
|
||||
MASK_XENSTORE_IDX(xenstore_buf->rsp_cons),
|
||||
msg.len + sizeof(msg));
|
||||
|
||||
path = payload + sizeof(msg);
|
||||
token = path + strlen(path) + 1;
|
||||
|
||||
xenstore_buf->rsp_cons += msg.len + sizeof(msg);
|
||||
free(payload);
|
||||
wake_up(&watch_queue);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
req_info[msg.req_id].reply = malloc(sizeof(msg) + msg.len);
|
||||
memcpy_from_ring(xenstore_buf->rsp,
|
||||
req_info[msg.req_id].reply,
|
||||
MASK_XENSTORE_IDX(xenstore_buf->rsp_cons),
|
||||
msg.len + sizeof(msg));
|
||||
wake_up(&req_info[msg.req_id].waitq);
|
||||
xenstore_buf->rsp_cons += msg.len + sizeof(msg);
|
||||
xenstore_buf->rsp_cons += msg.len + sizeof(msg);
|
||||
wake_up(&req_info[msg.req_id].waitq);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -128,6 +178,7 @@ static void release_xenbus_id(int id)
|
||||
BUG_ON(!req_info[id].in_use);
|
||||
spin_lock(&req_lock);
|
||||
nr_live_reqs--;
|
||||
req_info[id].in_use = 0;
|
||||
if (nr_live_reqs == NR_REQS - 1)
|
||||
wake_up(&req_wq);
|
||||
spin_unlock(&req_lock);
|
||||
@@ -162,6 +213,7 @@ static int allocate_xenbus_id(void)
|
||||
probe = o_probe + 1;
|
||||
spin_unlock(&req_lock);
|
||||
init_waitqueue_head(&req_info[o_probe].waitq);
|
||||
|
||||
return o_probe;
|
||||
}
|
||||
|
||||
@@ -381,12 +433,32 @@ char *xenbus_write(xenbus_transaction_t xbt, const char *path, const char *value
|
||||
struct xsd_sockmsg *rep;
|
||||
rep = xenbus_msg_reply(XS_WRITE, xbt, req, ARRAY_SIZE(req));
|
||||
char *msg = errmsg(rep);
|
||||
if (msg)
|
||||
return msg;
|
||||
if (msg) return msg;
|
||||
free(rep);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char* xenbus_watch_path( xenbus_transaction_t xbt, const char *path)
|
||||
{
|
||||
/* in the future one could have multiple watch queues, and use
|
||||
* the token for demuxing. For now the token is 0. */
|
||||
|
||||
struct xsd_sockmsg *rep;
|
||||
|
||||
struct write_req req[] = {
|
||||
{path, strlen(path) + 1},
|
||||
{"0",2 },
|
||||
};
|
||||
|
||||
rep = xenbus_msg_reply(XS_WATCH, xbt, req, ARRAY_SIZE(req));
|
||||
|
||||
char *msg = errmsg(rep);
|
||||
if (msg) return msg;
|
||||
free(rep);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *xenbus_rm(xenbus_transaction_t xbt, const char *path)
|
||||
{
|
||||
struct write_req req[] = { {path, strlen(path) + 1} };
|
||||
|
||||
@@ -14,6 +14,19 @@ config X86_32
|
||||
486, 586, Pentiums, and various instruction-set-compatible chips by
|
||||
AMD, Cyrix, and others.
|
||||
|
||||
config GENERIC_TIME
|
||||
bool
|
||||
depends on !X86_XEN
|
||||
default y
|
||||
|
||||
config LOCKDEP_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
||||
config STACKTRACE_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
||||
config SEMAPHORE_SLEEPERS
|
||||
bool
|
||||
default y
|
||||
@@ -37,6 +50,10 @@ config GENERIC_IOMAP
|
||||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_HWEIGHT
|
||||
bool
|
||||
default y
|
||||
|
||||
config ARCH_MAY_HAVE_PC_FDC
|
||||
bool
|
||||
default y
|
||||
@@ -49,6 +66,35 @@ source "init/Kconfig"
|
||||
|
||||
menu "Processor type and features"
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
This enables support for systems with more than one CPU. If you have
|
||||
a system with only one CPU, like most personal computers, say N. If
|
||||
you have a system with more than one CPU, say Y.
|
||||
|
||||
If you say N here, the kernel will run on single and multiprocessor
|
||||
machines, but will use only one CPU of a multiprocessor machine. If
|
||||
you say Y here, the kernel will run on many, but not all,
|
||||
singleprocessor machines. On a singleprocessor machine, the kernel
|
||||
will run faster if you say N here.
|
||||
|
||||
Note that if you say Y here and choose architecture "586" or
|
||||
"Pentium" under "Processor family", the kernel will not work on 486
|
||||
architectures. Similarly, multiprocessor kernels for the "PPro"
|
||||
architecture may not work on all Pentium based boards.
|
||||
|
||||
People using multiprocessor machines who say Y here should also say
|
||||
Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
|
||||
Management" code will be disabled if you say Y here.
|
||||
|
||||
See also the <file:Documentation/smp.txt>,
|
||||
<file:Documentation/i386/IO-APIC.txt>,
|
||||
<file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
choice
|
||||
prompt "Subarchitecture Type"
|
||||
default X86_PC
|
||||
@@ -89,6 +135,7 @@ config X86_VOYAGER
|
||||
|
||||
config X86_NUMAQ
|
||||
bool "NUMAQ (IBM/Sequent)"
|
||||
select SMP
|
||||
select NUMA
|
||||
help
|
||||
This option is used for getting Linux to run on a (IBM/Sequent) NUMA
|
||||
@@ -105,6 +152,7 @@ config X86_SUMMIT
|
||||
In particular, it is needed for the x440.
|
||||
|
||||
If you don't have one of these computers, you should say N here.
|
||||
If you want to build a NUMA kernel, you must select ACPI.
|
||||
|
||||
config X86_BIGSMP
|
||||
bool "Support for other sub-arch SMP systems with more than 8 CPUs"
|
||||
@@ -132,6 +180,7 @@ config X86_GENERICARCH
|
||||
help
|
||||
This option compiles in the Summit, bigsmp, ES7000, default subarchitectures.
|
||||
It is intended for a generic binary kernel.
|
||||
If you want a NUMA kernel, select ACPI. We need SRAT for NUMA.
|
||||
|
||||
config X86_ES7000
|
||||
bool "Support for Unisys ES7000 IA32 series"
|
||||
@@ -147,7 +196,13 @@ endchoice
|
||||
config ACPI_SRAT
|
||||
bool
|
||||
default y
|
||||
depends on NUMA && (X86_SUMMIT || X86_GENERICARCH)
|
||||
depends on ACPI && NUMA && (X86_SUMMIT || X86_GENERICARCH)
|
||||
select ACPI_NUMA
|
||||
|
||||
config HAVE_ARCH_PARSE_SRAT
|
||||
bool
|
||||
default y
|
||||
depends on ACPI_SRAT
|
||||
|
||||
config X86_SUMMIT_NUMA
|
||||
bool
|
||||
@@ -183,48 +238,6 @@ config HPET_EMULATE_RTC
|
||||
depends on HPET_TIMER && RTC=y
|
||||
default y
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
This enables support for systems with more than one CPU. If you have
|
||||
a system with only one CPU, like most personal computers, say N. If
|
||||
you have a system with more than one CPU, say Y.
|
||||
|
||||
If you say N here, the kernel will run on single and multiprocessor
|
||||
machines, but will use only one CPU of a multiprocessor machine. If
|
||||
you say Y here, the kernel will run on many, but not all,
|
||||
singleprocessor machines. On a singleprocessor machine, the kernel
|
||||
will run faster if you say N here.
|
||||
|
||||
Note that if you say Y here and choose architecture "586" or
|
||||
"Pentium" under "Processor family", the kernel will not work on 486
|
||||
architectures. Similarly, multiprocessor kernels for the "PPro"
|
||||
architecture may not work on all Pentium based boards.
|
||||
|
||||
People using multiprocessor machines who say Y here should also say
|
||||
Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
|
||||
Management" code will be disabled if you say Y here.
|
||||
|
||||
See also the <file:Documentation/smp.txt>,
|
||||
<file:Documentation/i386/IO-APIC.txt>,
|
||||
<file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
config SMP_ALTERNATIVES
|
||||
bool "SMP alternatives support (EXPERIMENTAL)"
|
||||
depends on SMP && EXPERIMENTAL
|
||||
help
|
||||
Try to reduce the overhead of running an SMP kernel on a uniprocessor
|
||||
host slightly by replacing certain key instruction sequences
|
||||
according to whether we currently have more than one CPU available.
|
||||
This should provide a noticeable boost to performance when
|
||||
running SMP kernels on UP machines, and have negligible impact
|
||||
when running on an true SMP host.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config NR_CPUS
|
||||
int "Maximum number of CPUs (2-255)"
|
||||
range 2 255
|
||||
@@ -241,14 +254,23 @@ config NR_CPUS
|
||||
|
||||
config SCHED_SMT
|
||||
bool "SMT (Hyperthreading) scheduler support"
|
||||
depends on SMP && !X86_XEN
|
||||
default off
|
||||
depends on X86_HT
|
||||
depends on !X86_XEN
|
||||
help
|
||||
SMT scheduler support improves the CPU scheduler's decision making
|
||||
when dealing with Intel Pentium 4 chips with HyperThreading at a
|
||||
cost of slightly increased overhead in some places. If unsure say
|
||||
N here.
|
||||
|
||||
config SCHED_MC
|
||||
bool "Multi-core scheduler support"
|
||||
depends on X86_HT
|
||||
default y
|
||||
help
|
||||
Multi-core scheduler support improves the CPU scheduler's decision
|
||||
making when dealing with multi-core CPU chips at a cost of slightly
|
||||
increased overhead in some places. If unsure say N here.
|
||||
|
||||
source "kernel/Kconfig.preempt"
|
||||
|
||||
config X86_UP_APIC
|
||||
@@ -333,6 +355,15 @@ config X86_MCE_P4THERMAL
|
||||
Enabling this feature will cause a message to be printed when the P4
|
||||
enters thermal throttling.
|
||||
|
||||
config VM86
|
||||
default y
|
||||
bool "Enable VM86 support" if EMBEDDED
|
||||
help
|
||||
This option is required by programs like DOSEMU to run 16-bit legacy
|
||||
code on X86 processors. It also may be needed by software like
|
||||
XFree86 to initialize some video cards via BIOS. Disabling this
|
||||
option saves about 6k.
|
||||
|
||||
config TOSHIBA
|
||||
tristate "Toshiba Laptop support"
|
||||
---help---
|
||||
@@ -434,6 +465,7 @@ choice
|
||||
|
||||
config NOHIGHMEM
|
||||
bool "off"
|
||||
depends on !X86_NUMAQ
|
||||
---help---
|
||||
Linux can use up to 64 Gigabytes of physical memory on x86 systems.
|
||||
However, the address space of 32-bit x86 processors is only 4
|
||||
@@ -470,6 +502,7 @@ config NOHIGHMEM
|
||||
|
||||
config HIGHMEM4G
|
||||
bool "4GB"
|
||||
depends on !X86_NUMAQ
|
||||
help
|
||||
Select this if you have a 32-bit processor and between 1 and 4
|
||||
gigabytes of physical RAM.
|
||||
@@ -485,7 +518,7 @@ endchoice
|
||||
|
||||
choice
|
||||
depends on EXPERIMENTAL && !X86_PAE
|
||||
prompt "Memory split"
|
||||
prompt "Memory split" if EMBEDDED
|
||||
default VMSPLIT_3G
|
||||
help
|
||||
Select the desired split between kernel and user memory.
|
||||
@@ -529,21 +562,24 @@ config X86_PAE
|
||||
bool
|
||||
depends on HIGHMEM64G
|
||||
default y
|
||||
select RESOURCES_64BIT
|
||||
|
||||
# Common NUMA Features
|
||||
config NUMA
|
||||
bool "Numa Memory Allocation and Scheduler Support"
|
||||
depends on SMP && HIGHMEM64G && (X86_NUMAQ || X86_GENERICARCH || (X86_SUMMIT && ACPI))
|
||||
depends on SMP && HIGHMEM64G && (X86_NUMAQ || (X86_SUMMIT || X86_GENERICARCH) && ACPI)
|
||||
default n if X86_PC
|
||||
default y if (X86_NUMAQ || X86_SUMMIT)
|
||||
|
||||
# Need comments to help the hapless user trying to turn on NUMA support
|
||||
comment "NUMA (NUMA-Q) requires SMP, 64GB highmem support"
|
||||
depends on X86_NUMAQ && (!HIGHMEM64G || !SMP)
|
||||
|
||||
comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI"
|
||||
depends on X86_SUMMIT && (!HIGHMEM64G || !ACPI)
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "4" if X86_NUMAQ
|
||||
default "3"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
config HAVE_ARCH_BOOTMEM_NODE
|
||||
bool
|
||||
depends on NUMA
|
||||
@@ -594,7 +630,7 @@ config HAVE_ARCH_EARLY_PFN_TO_NID
|
||||
|
||||
config HIGHPTE
|
||||
bool "Allocate 3rd-level pagetables from highmem"
|
||||
depends on (HIGHMEM4G || HIGHMEM64G) && !X86_XEN
|
||||
depends on HIGHMEM4G || HIGHMEM64G
|
||||
help
|
||||
The VM uses one page table entry for each page of physical memory.
|
||||
For systems with a lot of RAM, this can be wasteful of precious
|
||||
@@ -664,7 +700,7 @@ config MTRR
|
||||
See <file:Documentation/mtrr.txt> for more information.
|
||||
|
||||
config EFI
|
||||
bool "Boot from EFI support (EXPERIMENTAL)"
|
||||
bool "Boot from EFI support"
|
||||
depends on ACPI && !X86_XEN
|
||||
default n
|
||||
---help---
|
||||
@@ -697,13 +733,18 @@ config BOOT_IOREMAP
|
||||
default y
|
||||
|
||||
config REGPARM
|
||||
bool "Use register arguments (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
default n
|
||||
bool "Use register arguments"
|
||||
default y
|
||||
help
|
||||
Compile the kernel with -mregparm=3. This uses a different ABI
|
||||
and passes the first three arguments of a function call in registers.
|
||||
This will probably break binary only modules.
|
||||
Compile the kernel with -mregparm=3. This instructs gcc to use
|
||||
a more efficient function call ABI which passes the first three
|
||||
arguments of a function call via registers, which results in denser
|
||||
and faster code.
|
||||
|
||||
If this option is disabled, then the default ABI of passing
|
||||
arguments via the stack is used.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config SECCOMP
|
||||
bool "Enable seccomp to safely compute untrusted bytecode"
|
||||
@@ -730,10 +771,10 @@ config KEXEC
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
but it is indepedent of the system firmware. And like a reboot
|
||||
but it is independent of the system firmware. And like a reboot
|
||||
you can start any kernel with it, not just Linux.
|
||||
|
||||
The name comes from the similiarity to the exec system call.
|
||||
The name comes from the similarity to the exec system call.
|
||||
|
||||
It is an ongoing process to be certain the hardware in a machine
|
||||
is properly shutdown, so do not be surprised if this code does not
|
||||
@@ -772,20 +813,22 @@ config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||
depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER
|
||||
---help---
|
||||
Say Y here to experiment with turning CPUs off and on. CPUs
|
||||
can be controlled through /sys/devices/system/cpu.
|
||||
Say Y here to experiment with turning CPUs off and on, and to
|
||||
enable suspend on SMP systems. CPUs can be controlled through
|
||||
/sys/devices/system/cpu.
|
||||
|
||||
Say N.
|
||||
|
||||
config DOUBLEFAULT
|
||||
config COMPAT_VDSO
|
||||
bool "Compat VDSO support"
|
||||
depends on !X86_XEN
|
||||
default y
|
||||
bool "Enable doublefault exception handler" if EMBEDDED
|
||||
depends on !X86_NO_TSS
|
||||
help
|
||||
This option allows trapping of rare doublefault exceptions that
|
||||
would otherwise cause a system to silently reboot. Disabling this
|
||||
option saves about 4k and might cause you much additional grey
|
||||
hair.
|
||||
Map the VDSO to the predictable old-style address too.
|
||||
---help---
|
||||
Say N here if you are running a sufficiently recent glibc
|
||||
version (2.3.3 or later), to remove the high-mapped
|
||||
VDSO mapping and to exclusively use the randomized VDSO.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -1090,13 +1133,27 @@ config SCx200
|
||||
tristate "NatSemi SCx200 support"
|
||||
depends on !X86_VOYAGER
|
||||
help
|
||||
This provides basic support for the National Semiconductor SCx200
|
||||
processor. Right now this is just a driver for the GPIO pins.
|
||||
This provides basic support for National Semiconductor's
|
||||
(now AMD's) Geode processors. The driver probes for the
|
||||
PCI-IDs of several on-chip devices, so its a good dependency
|
||||
for other scx200_* drivers.
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
If compiled as a module, the driver is named scx200.
|
||||
|
||||
This support is also available as a module. If compiled as a
|
||||
module, it will be called scx200.
|
||||
config SCx200HR_TIMER
|
||||
tristate "NatSemi SCx200 27MHz High-Resolution Timer Support"
|
||||
depends on SCx200 && GENERIC_TIME
|
||||
default y
|
||||
help
|
||||
This driver provides a clocksource built upon the on-chip
|
||||
27MHz high-resolution timer. Its also a workaround for
|
||||
NSC Geode SC-1100's buggy TSC, which loses time when the
|
||||
processor goes idle (as is done by the scheduler). The
|
||||
other workaround is idle=poll boot option.
|
||||
|
||||
config K8_NB
|
||||
def_bool y
|
||||
depends on AGP_AMD64
|
||||
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ config M386
|
||||
- "GeodeGX1" for Geode GX1 (Cyrix MediaGX).
|
||||
- "Geode GX/LX" For AMD Geode GX and LX processors.
|
||||
- "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3.
|
||||
- "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
|
||||
- "VIA C3-2" for VIA C3-2 "Nehemiah" (model 9 and above).
|
||||
|
||||
If you don't know what to do, choose "386".
|
||||
|
||||
@@ -311,5 +311,5 @@ config X86_OOSTORE
|
||||
|
||||
config X86_TSC
|
||||
bool
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1) && !X86_NUMAQ
|
||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1 || MGEODE_LX) && !X86_NUMAQ
|
||||
default y
|
||||
@@ -0,0 +1,89 @@
|
||||
menu "Kernel hacking"
|
||||
|
||||
config TRACE_IRQFLAGS_SUPPORT
|
||||
bool
|
||||
default y
|
||||
|
||||
source "lib/Kconfig.debug"
|
||||
|
||||
config EARLY_PRINTK
|
||||
bool "Early printk" if EMBEDDED && DEBUG_KERNEL
|
||||
default y
|
||||
help
|
||||
Write kernel log output directly into the VGA buffer or to a serial
|
||||
port.
|
||||
|
||||
This is useful for kernel debugging when your machine crashes very
|
||||
early before the console code is initialized. For normal operation
|
||||
it is not recommended because it looks ugly and doesn't cooperate
|
||||
with klogd/syslogd or the X server. You should normally N here,
|
||||
unless you want to debug such a crash.
|
||||
|
||||
config DEBUG_STACKOVERFLOW
|
||||
bool "Check for stack overflows"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
This option will cause messages to be printed if free stack space
|
||||
drops below a certain limit.
|
||||
|
||||
config DEBUG_STACK_USAGE
|
||||
bool "Stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Enables the display of the minimum amount of free stack which each
|
||||
task has ever had available in the sysrq-T and sysrq-P debug output.
|
||||
|
||||
This option will slow down process creation somewhat.
|
||||
|
||||
comment "Page alloc debug is incompatible with Software Suspend on i386"
|
||||
depends on DEBUG_KERNEL && SOFTWARE_SUSPEND
|
||||
|
||||
config DEBUG_PAGEALLOC
|
||||
bool "Debug page memory allocations"
|
||||
depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND && !HUGETLBFS
|
||||
help
|
||||
Unmap pages from the kernel linear mapping after free_pages().
|
||||
This results in a large slowdown, but helps to find certain types
|
||||
of memory corruptions.
|
||||
|
||||
config DEBUG_RODATA
|
||||
bool "Write protect kernel read-only data structures"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Mark the kernel read-only data as write-protected in the pagetables,
|
||||
in order to catch accidental (and incorrect) writes to such const
|
||||
data. This option may have a slight performance impact because a
|
||||
portion of the kernel code won't be covered by a 2MB TLB anymore.
|
||||
If in doubt, say "N".
|
||||
|
||||
config 4KSTACKS
|
||||
bool "Use 4Kb for kernel stacks instead of 8Kb"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
If you say Y here the kernel will use a 4Kb stacksize for the
|
||||
kernel stack attached to each process/thread. This facilitates
|
||||
running more threads on a system and also reduces the pressure
|
||||
on the VM subsystem for higher order allocations. This option
|
||||
will also use IRQ stacks to compensate for the reduced stackspace.
|
||||
|
||||
config X86_FIND_SMP_CONFIG
|
||||
bool
|
||||
depends on X86_LOCAL_APIC || X86_VOYAGER
|
||||
default y
|
||||
|
||||
config X86_MPPARSE
|
||||
bool
|
||||
depends on X86_LOCAL_APIC && !X86_VISWS
|
||||
default y
|
||||
|
||||
config DOUBLEFAULT
|
||||
default y
|
||||
bool "Enable doublefault exception handler" if EMBEDDED
|
||||
depends on !X86_NO_TSS
|
||||
help
|
||||
This option allows trapping of rare doublefault exceptions that
|
||||
would otherwise cause a system to silently reboot. Disabling this
|
||||
option saves about 4k and might cause you much additional grey
|
||||
hair.
|
||||
|
||||
endmenu
|
||||
@@ -39,6 +39,9 @@ include $(srctree)/arch/i386/Makefile.cpu
|
||||
|
||||
cflags-$(CONFIG_REGPARM) += -mregparm=3
|
||||
|
||||
# temporary until string.h is fixed
|
||||
cflags-y += -ffreestanding
|
||||
|
||||
# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
|
||||
# a lot more stack due to the lack of sharing of stacklots:
|
||||
CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then echo $(call cc-option,-fno-unit-at-a-time); fi ;)
|
||||
@@ -108,8 +111,8 @@ AFLAGS += $(mflags-y)
|
||||
|
||||
boot := arch/i386/boot
|
||||
|
||||
.PHONY: zImage bzImage compressed zlilo bzlilo \
|
||||
zdisk bzdisk fdimage fdimage144 fdimage288 install
|
||||
PHONY += zImage bzImage compressed zlilo bzlilo \
|
||||
zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install
|
||||
|
||||
ifdef CONFIG_XEN
|
||||
CPPFLAGS := -Iinclude$(if $(KBUILD_SRC),2)/asm/mach-xen $(CPPFLAGS)
|
||||
@@ -141,7 +144,7 @@ zlilo bzlilo: vmlinux
|
||||
zdisk bzdisk: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) zdisk
|
||||
|
||||
fdimage fdimage144 fdimage288: vmlinux
|
||||
fdimage fdimage144 fdimage288 isoimage: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
|
||||
|
||||
install:
|
||||
@@ -159,7 +162,10 @@ define archhelp
|
||||
echo ' install to $$(INSTALL_PATH) and run lilo'
|
||||
echo ' bzdisk - Create a boot floppy in /dev/fd0'
|
||||
echo ' fdimage - Create a boot floppy image'
|
||||
echo ' isoimage - Create a boot CD-ROM image'
|
||||
endef
|
||||
|
||||
CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf
|
||||
CLEAN_FILES += arch/$(ARCH)/boot/fdimage \
|
||||
arch/$(ARCH)/boot/image.iso \
|
||||
arch/$(ARCH)/boot/mtools.conf
|
||||
CLEAN_FILES += vmlinuz vmlinux-stripped
|
||||
@@ -6,11 +6,11 @@ extra-y := head.o init_task.o vmlinux.lds
|
||||
|
||||
obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
|
||||
ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
|
||||
pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
|
||||
quirks.o i8237.o topology.o
|
||||
pci-dma.o i386_ksyms.o i387.o bootflag.o \
|
||||
quirks.o i8237.o topology.o alternative.o i8253.o tsc.o
|
||||
|
||||
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
||||
obj-y += cpu/
|
||||
obj-y += timers/
|
||||
obj-y += acpi/
|
||||
obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
|
||||
obj-$(CONFIG_MCA) += mca.o
|
||||
@@ -37,7 +37,8 @@ obj-$(CONFIG_EFI) += efi.o efi_stub.o
|
||||
obj-$(CONFIG_DOUBLEFAULT) += doublefault.o
|
||||
obj-$(CONFIG_VM86) += vm86.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
obj-$(CONFIG_SMP_ALTERNATIVES) += smpalts.o
|
||||
obj-$(CONFIG_HPET_TIMER) += hpet.o
|
||||
obj-$(CONFIG_K8_NB) += k8.o
|
||||
|
||||
EXTRA_AFLAGS := -traditional
|
||||
|
||||
@@ -63,7 +64,8 @@ quiet_cmd_syscall = SYSCALL $@
|
||||
|
||||
export CPPFLAGS_vsyscall.lds += -P -C -U$(ARCH)
|
||||
|
||||
vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1
|
||||
vsyscall-flags = -shared -s -Wl,-soname=linux-gate.so.1 \
|
||||
$(call ld-option, -Wl$(comma)--hash-style=sysv)
|
||||
SYSCFLAGS_vsyscall-sysenter.so = $(vsyscall-flags)
|
||||
SYSCFLAGS_vsyscall-int80.so = $(vsyscall-flags)
|
||||
|
||||
@@ -84,6 +86,8 @@ $(obj)/vsyscall-syms.o: $(src)/vsyscall.lds \
|
||||
$(obj)/vsyscall-sysenter.o $(obj)/$(vsyscall_note) FORCE
|
||||
$(call if_changed,syscall)
|
||||
|
||||
k8-y += ../../x86_64/kernel/k8.o
|
||||
|
||||
ifdef CONFIG_XEN
|
||||
include $(srctree)/scripts/Makefile.xen
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/module.h>
|
||||
@@ -60,7 +59,7 @@ static inline int gsi_irq_sharing(int gsi) { return gsi; }
|
||||
|
||||
#define BAD_MADT_ENTRY(entry, end) ( \
|
||||
(!entry) || (unsigned long)entry + sizeof(*entry) > end || \
|
||||
((acpi_table_entry_header *)entry)->length != sizeof(*entry))
|
||||
((acpi_table_entry_header *)entry)->length < sizeof(*entry))
|
||||
|
||||
#define PREFIX "ACPI: "
|
||||
|
||||
@@ -204,6 +203,8 @@ int __init acpi_parse_mcfg(unsigned long phys_addr, unsigned long size)
|
||||
if (mcfg->config[i].base_reserved) {
|
||||
printk(KERN_ERR PREFIX
|
||||
"MMCONFIG not in low 4GB of memory\n");
|
||||
kfree(pci_mmcfg_config);
|
||||
pci_mmcfg_config_num = 0;
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@@ -217,7 +218,7 @@ static int __init acpi_parse_madt(unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
struct acpi_table_madt *madt = NULL;
|
||||
|
||||
if (!phys_addr || !size)
|
||||
if (!phys_addr || !size || !cpu_has_apic)
|
||||
return -EINVAL;
|
||||
|
||||
madt = (struct acpi_table_madt *)__acpi_map_table(phys_addr, size);
|
||||
@@ -624,9 +625,9 @@ extern u32 pmtmr_ioport;
|
||||
|
||||
static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
|
||||
{
|
||||
struct fadt_descriptor_rev2 *fadt = NULL;
|
||||
struct fadt_descriptor *fadt = NULL;
|
||||
|
||||
fadt = (struct fadt_descriptor_rev2 *)__acpi_map_table(phys, size);
|
||||
fadt = (struct fadt_descriptor *)__acpi_map_table(phys, size);
|
||||
if (!fadt) {
|
||||
printk(KERN_WARNING PREFIX "Unable to map FADT\n");
|
||||
return 0;
|
||||
@@ -671,10 +672,10 @@ unsigned long __init acpi_find_rsdp(void)
|
||||
unsigned long rsdp_phys = 0;
|
||||
|
||||
if (efi_enabled) {
|
||||
if (efi.acpi20)
|
||||
return __pa(efi.acpi20);
|
||||
else if (efi.acpi)
|
||||
return __pa(efi.acpi);
|
||||
if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
|
||||
return efi.acpi20;
|
||||
else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
|
||||
return efi.acpi;
|
||||
}
|
||||
/*
|
||||
* Scan memory looking for the RSDP signature. First search EBDA (low
|
||||
@@ -696,6 +697,9 @@ static int __init acpi_parse_madt_lapic_entries(void)
|
||||
{
|
||||
int count;
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* Note that the LAPIC address is obtained from the MADT (32-bit value)
|
||||
* and (optionally) overriden by a LAPIC_ADDR_OVR entry (64-bit value).
|
||||
@@ -754,6 +758,9 @@ static int __init acpi_parse_madt_ioapic_entries(void)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!cpu_has_apic)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* if "noapic" boot option, don't look for IO-APICs
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,389 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/list.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
static int no_replacement = 0;
|
||||
static int smp_alt_once = 0;
|
||||
static int debug_alternative = 0;
|
||||
|
||||
static int __init noreplacement_setup(char *s)
|
||||
{
|
||||
no_replacement = 1;
|
||||
return 1;
|
||||
}
|
||||
static int __init bootonly(char *str)
|
||||
{
|
||||
smp_alt_once = 1;
|
||||
return 1;
|
||||
}
|
||||
static int __init debug_alt(char *str)
|
||||
{
|
||||
debug_alternative = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("noreplacement", noreplacement_setup);
|
||||
__setup("smp-alt-boot", bootonly);
|
||||
__setup("debug-alternative", debug_alt);
|
||||
|
||||
#define DPRINTK(fmt, args...) if (debug_alternative) \
|
||||
printk(KERN_DEBUG fmt, args)
|
||||
|
||||
#ifdef GENERIC_NOP1
|
||||
/* Use inline assembly to define this because the nops are defined
|
||||
as inline assembly strings in the include files and we cannot
|
||||
get them easily into strings. */
|
||||
asm("\t.data\nintelnops: "
|
||||
GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6
|
||||
GENERIC_NOP7 GENERIC_NOP8);
|
||||
extern unsigned char intelnops[];
|
||||
static unsigned char *intel_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
intelnops,
|
||||
intelnops + 1,
|
||||
intelnops + 1 + 2,
|
||||
intelnops + 1 + 2 + 3,
|
||||
intelnops + 1 + 2 + 3 + 4,
|
||||
intelnops + 1 + 2 + 3 + 4 + 5,
|
||||
intelnops + 1 + 2 + 3 + 4 + 5 + 6,
|
||||
intelnops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef K8_NOP1
|
||||
asm("\t.data\nk8nops: "
|
||||
K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6
|
||||
K8_NOP7 K8_NOP8);
|
||||
extern unsigned char k8nops[];
|
||||
static unsigned char *k8_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
k8nops,
|
||||
k8nops + 1,
|
||||
k8nops + 1 + 2,
|
||||
k8nops + 1 + 2 + 3,
|
||||
k8nops + 1 + 2 + 3 + 4,
|
||||
k8nops + 1 + 2 + 3 + 4 + 5,
|
||||
k8nops + 1 + 2 + 3 + 4 + 5 + 6,
|
||||
k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef K7_NOP1
|
||||
asm("\t.data\nk7nops: "
|
||||
K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6
|
||||
K7_NOP7 K7_NOP8);
|
||||
extern unsigned char k7nops[];
|
||||
static unsigned char *k7_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
k7nops,
|
||||
k7nops + 1,
|
||||
k7nops + 1 + 2,
|
||||
k7nops + 1 + 2 + 3,
|
||||
k7nops + 1 + 2 + 3 + 4,
|
||||
k7nops + 1 + 2 + 3 + 4 + 5,
|
||||
k7nops + 1 + 2 + 3 + 4 + 5 + 6,
|
||||
k7nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
extern char __vsyscall_0;
|
||||
static inline unsigned char** find_nop_table(void)
|
||||
{
|
||||
return k8_nops;
|
||||
}
|
||||
|
||||
#else /* CONFIG_X86_64 */
|
||||
|
||||
static struct nop {
|
||||
int cpuid;
|
||||
unsigned char **noptable;
|
||||
} noptypes[] = {
|
||||
{ X86_FEATURE_K8, k8_nops },
|
||||
{ X86_FEATURE_K7, k7_nops },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
static unsigned char** find_nop_table(void)
|
||||
{
|
||||
unsigned char **noptable = intel_nops;
|
||||
int i;
|
||||
|
||||
for (i = 0; noptypes[i].cpuid >= 0; i++) {
|
||||
if (boot_cpu_has(noptypes[i].cpuid)) {
|
||||
noptable = noptypes[i].noptable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return noptable;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
|
||||
extern struct alt_instr __smp_alt_instructions[], __smp_alt_instructions_end[];
|
||||
extern u8 *__smp_locks[], *__smp_locks_end[];
|
||||
|
||||
extern u8 __smp_alt_begin[], __smp_alt_end[];
|
||||
|
||||
/* Replace instructions with better alternatives for this CPU type.
|
||||
This runs before SMP is initialized to avoid SMP problems with
|
||||
self modifying code. This implies that assymetric systems where
|
||||
APs have less capabilities than the boot processor are not handled.
|
||||
Tough. Make sure you disable such features by hand. */
|
||||
|
||||
void apply_alternatives(struct alt_instr *start, struct alt_instr *end)
|
||||
{
|
||||
unsigned char **noptable = find_nop_table();
|
||||
struct alt_instr *a;
|
||||
u8 *instr;
|
||||
int diff, i, k;
|
||||
|
||||
DPRINTK("%s: alt table %p -> %p\n", __FUNCTION__, start, end);
|
||||
for (a = start; a < end; a++) {
|
||||
BUG_ON(a->replacementlen > a->instrlen);
|
||||
if (!boot_cpu_has(a->cpuid))
|
||||
continue;
|
||||
instr = a->instr;
|
||||
#ifdef CONFIG_X86_64
|
||||
/* vsyscall code is not mapped yet. resolve it manually. */
|
||||
if (instr >= (u8 *)VSYSCALL_START && instr < (u8*)VSYSCALL_END) {
|
||||
instr -= VSYSCALL_START - (unsigned long)&__vsyscall_0;
|
||||
DPRINTK("%s: vsyscall fixup: %p => %p\n",
|
||||
__FUNCTION__, a->instr, instr);
|
||||
}
|
||||
#endif
|
||||
memcpy(instr, a->replacement, a->replacementlen);
|
||||
diff = a->instrlen - a->replacementlen;
|
||||
/* Pad the rest with nops */
|
||||
for (i = a->replacementlen; diff > 0; diff -= k, i += k) {
|
||||
k = diff;
|
||||
if (k > ASM_NOP_MAX)
|
||||
k = ASM_NOP_MAX;
|
||||
memcpy(a->instr + i, noptable[k], k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
static void alternatives_smp_save(struct alt_instr *start, struct alt_instr *end)
|
||||
{
|
||||
struct alt_instr *a;
|
||||
|
||||
DPRINTK("%s: alt table %p-%p\n", __FUNCTION__, start, end);
|
||||
for (a = start; a < end; a++) {
|
||||
memcpy(a->replacement + a->replacementlen,
|
||||
a->instr,
|
||||
a->instrlen);
|
||||
}
|
||||
}
|
||||
|
||||
static void alternatives_smp_apply(struct alt_instr *start, struct alt_instr *end)
|
||||
{
|
||||
struct alt_instr *a;
|
||||
|
||||
for (a = start; a < end; a++) {
|
||||
memcpy(a->instr,
|
||||
a->replacement + a->replacementlen,
|
||||
a->instrlen);
|
||||
}
|
||||
}
|
||||
|
||||
static void alternatives_smp_lock(u8 **start, u8 **end, u8 *text, u8 *text_end)
|
||||
{
|
||||
u8 **ptr;
|
||||
|
||||
for (ptr = start; ptr < end; ptr++) {
|
||||
if (*ptr < text)
|
||||
continue;
|
||||
if (*ptr > text_end)
|
||||
continue;
|
||||
**ptr = 0xf0; /* lock prefix */
|
||||
};
|
||||
}
|
||||
|
||||
static void alternatives_smp_unlock(u8 **start, u8 **end, u8 *text, u8 *text_end)
|
||||
{
|
||||
unsigned char **noptable = find_nop_table();
|
||||
u8 **ptr;
|
||||
|
||||
for (ptr = start; ptr < end; ptr++) {
|
||||
if (*ptr < text)
|
||||
continue;
|
||||
if (*ptr > text_end)
|
||||
continue;
|
||||
**ptr = noptable[1][0];
|
||||
};
|
||||
}
|
||||
|
||||
struct smp_alt_module {
|
||||
/* what is this ??? */
|
||||
struct module *mod;
|
||||
char *name;
|
||||
|
||||
/* ptrs to lock prefixes */
|
||||
u8 **locks;
|
||||
u8 **locks_end;
|
||||
|
||||
/* .text segment, needed to avoid patching init code ;) */
|
||||
u8 *text;
|
||||
u8 *text_end;
|
||||
|
||||
struct list_head next;
|
||||
};
|
||||
static LIST_HEAD(smp_alt_modules);
|
||||
static DEFINE_SPINLOCK(smp_alt);
|
||||
|
||||
void alternatives_smp_module_add(struct module *mod, char *name,
|
||||
void *locks, void *locks_end,
|
||||
void *text, void *text_end)
|
||||
{
|
||||
struct smp_alt_module *smp;
|
||||
unsigned long flags;
|
||||
|
||||
if (no_replacement)
|
||||
return;
|
||||
|
||||
if (smp_alt_once) {
|
||||
if (boot_cpu_has(X86_FEATURE_UP))
|
||||
alternatives_smp_unlock(locks, locks_end,
|
||||
text, text_end);
|
||||
return;
|
||||
}
|
||||
|
||||
smp = kzalloc(sizeof(*smp), GFP_KERNEL);
|
||||
if (NULL == smp)
|
||||
return; /* we'll run the (safe but slow) SMP code then ... */
|
||||
|
||||
smp->mod = mod;
|
||||
smp->name = name;
|
||||
smp->locks = locks;
|
||||
smp->locks_end = locks_end;
|
||||
smp->text = text;
|
||||
smp->text_end = text_end;
|
||||
DPRINTK("%s: locks %p -> %p, text %p -> %p, name %s\n",
|
||||
__FUNCTION__, smp->locks, smp->locks_end,
|
||||
smp->text, smp->text_end, smp->name);
|
||||
|
||||
spin_lock_irqsave(&smp_alt, flags);
|
||||
list_add_tail(&smp->next, &smp_alt_modules);
|
||||
if (boot_cpu_has(X86_FEATURE_UP))
|
||||
alternatives_smp_unlock(smp->locks, smp->locks_end,
|
||||
smp->text, smp->text_end);
|
||||
spin_unlock_irqrestore(&smp_alt, flags);
|
||||
}
|
||||
|
||||
void alternatives_smp_module_del(struct module *mod)
|
||||
{
|
||||
struct smp_alt_module *item;
|
||||
unsigned long flags;
|
||||
|
||||
if (no_replacement || smp_alt_once)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&smp_alt, flags);
|
||||
list_for_each_entry(item, &smp_alt_modules, next) {
|
||||
if (mod != item->mod)
|
||||
continue;
|
||||
list_del(&item->next);
|
||||
spin_unlock_irqrestore(&smp_alt, flags);
|
||||
DPRINTK("%s: %s\n", __FUNCTION__, item->name);
|
||||
kfree(item);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irqrestore(&smp_alt, flags);
|
||||
}
|
||||
|
||||
void alternatives_smp_switch(int smp)
|
||||
{
|
||||
struct smp_alt_module *mod;
|
||||
unsigned long flags;
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
/*
|
||||
* A not yet fixed binutils section handling bug prevents
|
||||
* alternatives-replacement from working reliably, so turn
|
||||
* it off:
|
||||
*/
|
||||
printk("lockdep: not fixing up alternatives.\n");
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (no_replacement || smp_alt_once)
|
||||
return;
|
||||
BUG_ON(!smp && (num_online_cpus() > 1));
|
||||
|
||||
spin_lock_irqsave(&smp_alt, flags);
|
||||
if (smp) {
|
||||
printk(KERN_INFO "SMP alternatives: switching to SMP code\n");
|
||||
clear_bit(X86_FEATURE_UP, boot_cpu_data.x86_capability);
|
||||
clear_bit(X86_FEATURE_UP, cpu_data[0].x86_capability);
|
||||
alternatives_smp_apply(__smp_alt_instructions,
|
||||
__smp_alt_instructions_end);
|
||||
list_for_each_entry(mod, &smp_alt_modules, next)
|
||||
alternatives_smp_lock(mod->locks, mod->locks_end,
|
||||
mod->text, mod->text_end);
|
||||
} else {
|
||||
printk(KERN_INFO "SMP alternatives: switching to UP code\n");
|
||||
set_bit(X86_FEATURE_UP, boot_cpu_data.x86_capability);
|
||||
set_bit(X86_FEATURE_UP, cpu_data[0].x86_capability);
|
||||
apply_alternatives(__smp_alt_instructions,
|
||||
__smp_alt_instructions_end);
|
||||
list_for_each_entry(mod, &smp_alt_modules, next)
|
||||
alternatives_smp_unlock(mod->locks, mod->locks_end,
|
||||
mod->text, mod->text_end);
|
||||
}
|
||||
spin_unlock_irqrestore(&smp_alt, flags);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void __init alternative_instructions(void)
|
||||
{
|
||||
if (no_replacement) {
|
||||
printk(KERN_INFO "(SMP-)alternatives turned off\n");
|
||||
free_init_pages("SMP alternatives",
|
||||
(unsigned long)__smp_alt_begin,
|
||||
(unsigned long)__smp_alt_end);
|
||||
return;
|
||||
}
|
||||
apply_alternatives(__alt_instructions, __alt_instructions_end);
|
||||
|
||||
/* switch to patch-once-at-boottime-only mode and free the
|
||||
* tables in case we know the number of CPUs will never ever
|
||||
* change */
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (num_possible_cpus() < 2)
|
||||
smp_alt_once = 1;
|
||||
#else
|
||||
smp_alt_once = 1;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
if (smp_alt_once) {
|
||||
if (1 == num_possible_cpus()) {
|
||||
printk(KERN_INFO "SMP alternatives: switching to UP code\n");
|
||||
set_bit(X86_FEATURE_UP, boot_cpu_data.x86_capability);
|
||||
set_bit(X86_FEATURE_UP, cpu_data[0].x86_capability);
|
||||
apply_alternatives(__smp_alt_instructions,
|
||||
__smp_alt_instructions_end);
|
||||
alternatives_smp_unlock(__smp_locks, __smp_locks_end,
|
||||
_text, _etext);
|
||||
}
|
||||
free_init_pages("SMP alternatives",
|
||||
(unsigned long)__smp_alt_begin,
|
||||
(unsigned long)__smp_alt_end);
|
||||
} else {
|
||||
alternatives_smp_save(__smp_alt_instructions,
|
||||
__smp_alt_instructions_end);
|
||||
alternatives_smp_module_add(NULL, "core kernel",
|
||||
__smp_locks, __smp_locks_end,
|
||||
_text, _etext);
|
||||
alternatives_smp_switch(0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -14,7 +14,6 @@
|
||||
* Mikael Pettersson : PM converted to driver model.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <linux/mm.h>
|
||||
@@ -36,8 +35,10 @@
|
||||
#include <asm/arch_hooks.h>
|
||||
#include <asm/hpet.h>
|
||||
#include <asm/i8253.h>
|
||||
#include <asm/nmi.h>
|
||||
|
||||
#include <mach_apic.h>
|
||||
#include <mach_apicdef.h>
|
||||
#include <mach_ipi.h>
|
||||
|
||||
#include "io_ports.h"
|
||||
@@ -60,6 +61,20 @@ int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */
|
||||
*/
|
||||
int apic_verbosity;
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
static int modern_apic(void)
|
||||
{
|
||||
unsigned int lvr, version;
|
||||
/* AMD systems use old APIC versions, so check the CPU */
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
|
||||
boot_cpu_data.x86 >= 0xf)
|
||||
return 1;
|
||||
lvr = apic_read(APIC_LVR);
|
||||
version = GET_APIC_VERSION(lvr);
|
||||
return version >= 0x14;
|
||||
}
|
||||
#endif /* !CONFIG_XEN */
|
||||
|
||||
/*
|
||||
* 'what should we do if we get a hw irq event on an illegal vector'.
|
||||
* each architecture has to answer this themselves.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* to extract and format the required data.
|
||||
*/
|
||||
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/personality.h>
|
||||
@@ -54,6 +55,7 @@ void foo(void)
|
||||
OFFSET(TI_preempt_count, thread_info, preempt_count);
|
||||
OFFSET(TI_addr_limit, thread_info, addr_limit);
|
||||
OFFSET(TI_restart_block, thread_info, restart_block);
|
||||
OFFSET(TI_sysenter_return, thread_info, sysenter_return);
|
||||
BLANK();
|
||||
|
||||
OFFSET(EXEC_DOMAIN_handler, exec_domain, handler);
|
||||
@@ -74,5 +76,7 @@ void foo(void)
|
||||
#endif
|
||||
|
||||
DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
|
||||
DEFINE(VSYSCALL_BASE, VSYSCALL_BASE);
|
||||
DEFINE(VDSO_PRELINK, VDSO_PRELINK);
|
||||
|
||||
OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
|
||||
}
|
||||
@@ -11,10 +11,16 @@
|
||||
#include <asm/msr.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/mce.h>
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
#include <asm/mpspec.h>
|
||||
#include <asm/apic.h>
|
||||
#include <mach_apic.h>
|
||||
#else
|
||||
#ifdef CONFIG_XEN
|
||||
#define phys_pkg_id(a,b) a
|
||||
#endif
|
||||
#endif
|
||||
#include <asm/hypervisor.h>
|
||||
|
||||
@@ -28,9 +34,10 @@ DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
|
||||
EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
|
||||
#endif
|
||||
|
||||
static int cachesize_override __devinitdata = -1;
|
||||
static int disable_x86_fxsr __devinitdata = 0;
|
||||
static int disable_x86_serial_nr __devinitdata = 1;
|
||||
static int cachesize_override __cpuinitdata = -1;
|
||||
static int disable_x86_fxsr __cpuinitdata;
|
||||
static int disable_x86_serial_nr __cpuinitdata = 1;
|
||||
static int disable_x86_sep __cpuinitdata;
|
||||
|
||||
struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
|
||||
|
||||
@@ -62,7 +69,7 @@ static int __init cachesize_setup(char *str)
|
||||
}
|
||||
__setup("cachesize=", cachesize_setup);
|
||||
|
||||
int __devinit get_model_name(struct cpuinfo_x86 *c)
|
||||
int __cpuinit get_model_name(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int *v;
|
||||
char *p, *q;
|
||||
@@ -92,7 +99,7 @@ int __devinit get_model_name(struct cpuinfo_x86 *c)
|
||||
}
|
||||
|
||||
|
||||
void __devinit display_cacheinfo(struct cpuinfo_x86 *c)
|
||||
void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int n, dummy, ecx, edx, l2size;
|
||||
|
||||
@@ -133,7 +140,7 @@ void __devinit display_cacheinfo(struct cpuinfo_x86 *c)
|
||||
/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
|
||||
|
||||
/* Look up CPU names by table lookup. */
|
||||
static char __devinit *table_lookup_model(struct cpuinfo_x86 *c)
|
||||
static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
|
||||
{
|
||||
struct cpu_model_info *info;
|
||||
|
||||
@@ -154,7 +161,7 @@ static char __devinit *table_lookup_model(struct cpuinfo_x86 *c)
|
||||
}
|
||||
|
||||
|
||||
static void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
|
||||
static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
|
||||
{
|
||||
char *v = c->x86_vendor_id;
|
||||
int i;
|
||||
@@ -190,6 +197,14 @@ static int __init x86_fxsr_setup(char * s)
|
||||
__setup("nofxsr", x86_fxsr_setup);
|
||||
|
||||
|
||||
static int __init x86_sep_setup(char * s)
|
||||
{
|
||||
disable_x86_sep = 1;
|
||||
return 1;
|
||||
}
|
||||
__setup("nosep", x86_sep_setup);
|
||||
|
||||
|
||||
/* Standard macro to see if a specific flag is changeable */
|
||||
static inline int flag_is_changeable_p(u32 flag)
|
||||
{
|
||||
@@ -213,7 +228,7 @@ static inline int flag_is_changeable_p(u32 flag)
|
||||
|
||||
|
||||
/* Probe for the CPUID instruction */
|
||||
static int __devinit have_cpuid_p(void)
|
||||
static int __cpuinit have_cpuid_p(void)
|
||||
{
|
||||
return flag_is_changeable_p(X86_EFLAGS_ID);
|
||||
}
|
||||
@@ -257,10 +272,10 @@ static void __init early_cpu_detect(void)
|
||||
}
|
||||
}
|
||||
|
||||
void __devinit generic_identify(struct cpuinfo_x86 * c)
|
||||
void __cpuinit generic_identify(struct cpuinfo_x86 * c)
|
||||
{
|
||||
u32 tfms, xlvl;
|
||||
int junk;
|
||||
int ebx;
|
||||
|
||||
if (have_cpuid_p()) {
|
||||
/* Get vendor name */
|
||||
@@ -276,7 +291,7 @@ void __devinit generic_identify(struct cpuinfo_x86 * c)
|
||||
/* Intel-defined flags: level 0x00000001 */
|
||||
if ( c->cpuid_level >= 0x00000001 ) {
|
||||
u32 capability, excap;
|
||||
cpuid(0x00000001, &tfms, &junk, &excap, &capability);
|
||||
cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
|
||||
c->x86_capability[0] = capability;
|
||||
c->x86_capability[4] = excap;
|
||||
c->x86 = (tfms >> 8) & 15;
|
||||
@@ -286,6 +301,11 @@ void __devinit generic_identify(struct cpuinfo_x86 * c)
|
||||
if (c->x86 >= 0x6)
|
||||
c->x86_model += ((tfms >> 16) & 0xF) << 4;
|
||||
c->x86_mask = tfms & 15;
|
||||
#ifdef CONFIG_X86_HT
|
||||
c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
|
||||
#else
|
||||
c->apicid = (ebx >> 24) & 0xFF;
|
||||
#endif
|
||||
} else {
|
||||
/* Have CPUID level 0 only - unheard of */
|
||||
c->x86 = 4;
|
||||
@@ -306,11 +326,11 @@ void __devinit generic_identify(struct cpuinfo_x86 * c)
|
||||
early_intel_workaround(c);
|
||||
|
||||
#ifdef CONFIG_X86_HT
|
||||
phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff;
|
||||
c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __devinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
||||
static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
|
||||
{
|
||||
if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) {
|
||||
/* Disable processor serial number */
|
||||
@@ -338,7 +358,7 @@ __setup("serialnumber", x86_serial_nr_setup);
|
||||
/*
|
||||
* This does the hard work of actually picking apart the CPU stuff...
|
||||
*/
|
||||
void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -408,6 +428,10 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
clear_bit(X86_FEATURE_XMM, c->x86_capability);
|
||||
}
|
||||
|
||||
/* SEP disabled? */
|
||||
if (disable_x86_sep)
|
||||
clear_bit(X86_FEATURE_SEP, c->x86_capability);
|
||||
|
||||
if (disable_pse)
|
||||
clear_bit(X86_FEATURE_PSE, c->x86_capability);
|
||||
|
||||
@@ -420,7 +444,7 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
else
|
||||
/* Last resort... */
|
||||
sprintf(c->x86_model_id, "%02x/%02x",
|
||||
c->x86_vendor, c->x86_model);
|
||||
c->x86, c->x86_model);
|
||||
}
|
||||
|
||||
/* Now the feature flags better reflect actual CPU features! */
|
||||
@@ -456,16 +480,13 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_HT
|
||||
void __devinit detect_ht(struct cpuinfo_x86 *c)
|
||||
void __cpuinit detect_ht(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 eax, ebx, ecx, edx;
|
||||
int index_msb, core_bits;
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
|
||||
|
||||
if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
|
||||
return;
|
||||
|
||||
@@ -476,16 +497,17 @@ void __devinit detect_ht(struct cpuinfo_x86 *c)
|
||||
} else if (smp_num_siblings > 1 ) {
|
||||
|
||||
if (smp_num_siblings > NR_CPUS) {
|
||||
printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
|
||||
printk(KERN_WARNING "CPU: Unsupported number of the "
|
||||
"siblings %d", smp_num_siblings);
|
||||
smp_num_siblings = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
index_msb = get_count_order(smp_num_siblings);
|
||||
phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
|
||||
c->phys_proc_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
|
||||
|
||||
printk(KERN_INFO "CPU: Physical Processor ID: %d\n",
|
||||
phys_proc_id[cpu]);
|
||||
c->phys_proc_id);
|
||||
|
||||
smp_num_siblings = smp_num_siblings / c->x86_max_cores;
|
||||
|
||||
@@ -493,17 +515,17 @@ void __devinit detect_ht(struct cpuinfo_x86 *c)
|
||||
|
||||
core_bits = get_count_order(c->x86_max_cores);
|
||||
|
||||
cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) &
|
||||
c->cpu_core_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) &
|
||||
((1 << core_bits) - 1);
|
||||
|
||||
if (c->x86_max_cores > 1)
|
||||
printk(KERN_INFO "CPU: Processor Core ID: %d\n",
|
||||
cpu_core_id[cpu]);
|
||||
c->cpu_core_id);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void __devinit print_cpu_info(struct cpuinfo_x86 *c)
|
||||
void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
|
||||
{
|
||||
char *vendor = NULL;
|
||||
|
||||
@@ -617,6 +639,12 @@ void __cpuinit cpu_init(void)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
/* The CPU hotplug case */
|
||||
if (cpu_gdt_descr->address) {
|
||||
gdt = (struct desc_struct *)cpu_gdt_descr->address;
|
||||
memset(gdt, 0, PAGE_SIZE);
|
||||
goto old_gdt;
|
||||
}
|
||||
/*
|
||||
* This is a horrible hack to allocate the GDT. The problem
|
||||
* is that cpu_init() is called really early for the boot CPU
|
||||
@@ -635,7 +663,7 @@ void __cpuinit cpu_init(void)
|
||||
local_irq_enable();
|
||||
}
|
||||
}
|
||||
|
||||
old_gdt:
|
||||
/*
|
||||
* Initialize the per-CPU GDT with the boot GDT,
|
||||
* and set up the GDT descriptor:
|
||||
@@ -703,7 +731,7 @@ void __cpuinit cpu_init(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
void __devinit cpu_uninit(void)
|
||||
void __cpuinit cpu_uninit(void)
|
||||
{
|
||||
int cpu = raw_smp_processor_id();
|
||||
cpu_clear(cpu, cpu_initialized);
|
||||
|
||||
@@ -0,0 +1,774 @@
|
||||
/*
|
||||
* Routines to indentify caches on Intel CPU.
|
||||
*
|
||||
* Changes:
|
||||
* Venkatesh Pallipadi : Adding cache identification through cpuid(4)
|
||||
* Ashok Raj <ashok.raj@intel.com>: Work with CPU hotplug infrastructure.
|
||||
* Andi Kleen : CPUID4 emulation on AMD.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#define LVL_1_INST 1
|
||||
#define LVL_1_DATA 2
|
||||
#define LVL_2 3
|
||||
#define LVL_3 4
|
||||
#define LVL_TRACE 5
|
||||
|
||||
struct _cache_table
|
||||
{
|
||||
unsigned char descriptor;
|
||||
char cache_type;
|
||||
short size;
|
||||
};
|
||||
|
||||
/* all the cache descriptor types we care about (no TLB or trace cache entries) */
|
||||
static struct _cache_table cache_table[] __cpuinitdata =
|
||||
{
|
||||
{ 0x06, LVL_1_INST, 8 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x08, LVL_1_INST, 16 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x0a, LVL_1_DATA, 8 }, /* 2 way set assoc, 32 byte line size */
|
||||
{ 0x0c, LVL_1_DATA, 16 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x22, LVL_3, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x23, LVL_3, 1024 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x25, LVL_3, 2048 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x29, LVL_3, 4096 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x2c, LVL_1_DATA, 32 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x30, LVL_1_INST, 32 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x39, LVL_2, 128 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3a, LVL_2, 192 }, /* 6-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3b, LVL_2, 128 }, /* 2-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3c, LVL_2, 256 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3d, LVL_2, 384 }, /* 6-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3e, LVL_2, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x41, LVL_2, 128 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x42, LVL_2, 256 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x43, LVL_2, 512 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x44, LVL_2, 1024 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x45, LVL_2, 2048 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x46, LVL_3, 4096 }, /* 4-way set assoc, 64 byte line size */
|
||||
{ 0x47, LVL_3, 8192 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x49, LVL_3, 4096 }, /* 16-way set assoc, 64 byte line size */
|
||||
{ 0x4a, LVL_3, 6144 }, /* 12-way set assoc, 64 byte line size */
|
||||
{ 0x4b, LVL_3, 8192 }, /* 16-way set assoc, 64 byte line size */
|
||||
{ 0x4c, LVL_3, 12288 }, /* 12-way set assoc, 64 byte line size */
|
||||
{ 0x4d, LVL_3, 16384 }, /* 16-way set assoc, 64 byte line size */
|
||||
{ 0x60, LVL_1_DATA, 16 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x66, LVL_1_DATA, 8 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x67, LVL_1_DATA, 16 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x68, LVL_1_DATA, 32 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x70, LVL_TRACE, 12 }, /* 8-way set assoc */
|
||||
{ 0x71, LVL_TRACE, 16 }, /* 8-way set assoc */
|
||||
{ 0x72, LVL_TRACE, 32 }, /* 8-way set assoc */
|
||||
{ 0x73, LVL_TRACE, 64 }, /* 8-way set assoc */
|
||||
{ 0x78, LVL_2, 1024 }, /* 4-way set assoc, 64 byte line size */
|
||||
{ 0x79, LVL_2, 128 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x7a, LVL_2, 256 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x7b, LVL_2, 512 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x7c, LVL_2, 1024 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x7d, LVL_2, 2048 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x7f, LVL_2, 512 }, /* 2-way set assoc, 64 byte line size */
|
||||
{ 0x82, LVL_2, 256 }, /* 8-way set assoc, 32 byte line size */
|
||||
{ 0x83, LVL_2, 512 }, /* 8-way set assoc, 32 byte line size */
|
||||
{ 0x84, LVL_2, 1024 }, /* 8-way set assoc, 32 byte line size */
|
||||
{ 0x85, LVL_2, 2048 }, /* 8-way set assoc, 32 byte line size */
|
||||
{ 0x86, LVL_2, 512 }, /* 4-way set assoc, 64 byte line size */
|
||||
{ 0x87, LVL_2, 1024 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x00, 0, 0}
|
||||
};
|
||||
|
||||
|
||||
enum _cache_type
|
||||
{
|
||||
CACHE_TYPE_NULL = 0,
|
||||
CACHE_TYPE_DATA = 1,
|
||||
CACHE_TYPE_INST = 2,
|
||||
CACHE_TYPE_UNIFIED = 3
|
||||
};
|
||||
|
||||
union _cpuid4_leaf_eax {
|
||||
struct {
|
||||
enum _cache_type type:5;
|
||||
unsigned int level:3;
|
||||
unsigned int is_self_initializing:1;
|
||||
unsigned int is_fully_associative:1;
|
||||
unsigned int reserved:4;
|
||||
unsigned int num_threads_sharing:12;
|
||||
unsigned int num_cores_on_die:6;
|
||||
} split;
|
||||
u32 full;
|
||||
};
|
||||
|
||||
union _cpuid4_leaf_ebx {
|
||||
struct {
|
||||
unsigned int coherency_line_size:12;
|
||||
unsigned int physical_line_partition:10;
|
||||
unsigned int ways_of_associativity:10;
|
||||
} split;
|
||||
u32 full;
|
||||
};
|
||||
|
||||
union _cpuid4_leaf_ecx {
|
||||
struct {
|
||||
unsigned int number_of_sets:32;
|
||||
} split;
|
||||
u32 full;
|
||||
};
|
||||
|
||||
struct _cpuid4_info {
|
||||
union _cpuid4_leaf_eax eax;
|
||||
union _cpuid4_leaf_ebx ebx;
|
||||
union _cpuid4_leaf_ecx ecx;
|
||||
unsigned long size;
|
||||
cpumask_t shared_cpu_map;
|
||||
};
|
||||
|
||||
unsigned short num_cache_leaves;
|
||||
|
||||
/* AMD doesn't have CPUID4. Emulate it here to report the same
|
||||
information to the user. This makes some assumptions about the machine:
|
||||
No L3, L2 not shared, no SMT etc. that is currently true on AMD CPUs.
|
||||
|
||||
In theory the TLBs could be reported as fake type (they are in "dummy").
|
||||
Maybe later */
|
||||
union l1_cache {
|
||||
struct {
|
||||
unsigned line_size : 8;
|
||||
unsigned lines_per_tag : 8;
|
||||
unsigned assoc : 8;
|
||||
unsigned size_in_kb : 8;
|
||||
};
|
||||
unsigned val;
|
||||
};
|
||||
|
||||
union l2_cache {
|
||||
struct {
|
||||
unsigned line_size : 8;
|
||||
unsigned lines_per_tag : 4;
|
||||
unsigned assoc : 4;
|
||||
unsigned size_in_kb : 16;
|
||||
};
|
||||
unsigned val;
|
||||
};
|
||||
|
||||
static const unsigned short assocs[] = {
|
||||
[1] = 1, [2] = 2, [4] = 4, [6] = 8,
|
||||
[8] = 16,
|
||||
[0xf] = 0xffff // ??
|
||||
};
|
||||
static const unsigned char levels[] = { 1, 1, 2 };
|
||||
static const unsigned char types[] = { 1, 2, 3 };
|
||||
|
||||
static void __cpuinit amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax,
|
||||
union _cpuid4_leaf_ebx *ebx,
|
||||
union _cpuid4_leaf_ecx *ecx)
|
||||
{
|
||||
unsigned dummy;
|
||||
unsigned line_size, lines_per_tag, assoc, size_in_kb;
|
||||
union l1_cache l1i, l1d;
|
||||
union l2_cache l2;
|
||||
|
||||
eax->full = 0;
|
||||
ebx->full = 0;
|
||||
ecx->full = 0;
|
||||
|
||||
cpuid(0x80000005, &dummy, &dummy, &l1d.val, &l1i.val);
|
||||
cpuid(0x80000006, &dummy, &dummy, &l2.val, &dummy);
|
||||
|
||||
if (leaf > 2 || !l1d.val || !l1i.val || !l2.val)
|
||||
return;
|
||||
|
||||
eax->split.is_self_initializing = 1;
|
||||
eax->split.type = types[leaf];
|
||||
eax->split.level = levels[leaf];
|
||||
eax->split.num_threads_sharing = 0;
|
||||
eax->split.num_cores_on_die = current_cpu_data.x86_max_cores - 1;
|
||||
|
||||
if (leaf <= 1) {
|
||||
union l1_cache *l1 = leaf == 0 ? &l1d : &l1i;
|
||||
assoc = l1->assoc;
|
||||
line_size = l1->line_size;
|
||||
lines_per_tag = l1->lines_per_tag;
|
||||
size_in_kb = l1->size_in_kb;
|
||||
} else {
|
||||
assoc = l2.assoc;
|
||||
line_size = l2.line_size;
|
||||
lines_per_tag = l2.lines_per_tag;
|
||||
/* cpu_data has errata corrections for K7 applied */
|
||||
size_in_kb = current_cpu_data.x86_cache_size;
|
||||
}
|
||||
|
||||
if (assoc == 0xf)
|
||||
eax->split.is_fully_associative = 1;
|
||||
ebx->split.coherency_line_size = line_size - 1;
|
||||
ebx->split.ways_of_associativity = assocs[assoc] - 1;
|
||||
ebx->split.physical_line_partition = lines_per_tag - 1;
|
||||
ecx->split.number_of_sets = (size_in_kb * 1024) / line_size /
|
||||
(ebx->split.ways_of_associativity + 1) - 1;
|
||||
}
|
||||
|
||||
static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
|
||||
{
|
||||
union _cpuid4_leaf_eax eax;
|
||||
union _cpuid4_leaf_ebx ebx;
|
||||
union _cpuid4_leaf_ecx ecx;
|
||||
unsigned edx;
|
||||
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
|
||||
amd_cpuid4(index, &eax, &ebx, &ecx);
|
||||
else
|
||||
cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx);
|
||||
if (eax.split.type == CACHE_TYPE_NULL)
|
||||
return -EIO; /* better error ? */
|
||||
|
||||
this_leaf->eax = eax;
|
||||
this_leaf->ebx = ebx;
|
||||
this_leaf->ecx = ecx;
|
||||
this_leaf->size = (ecx.split.number_of_sets + 1) *
|
||||
(ebx.split.coherency_line_size + 1) *
|
||||
(ebx.split.physical_line_partition + 1) *
|
||||
(ebx.split.ways_of_associativity + 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* will only be called once; __init is safe here */
|
||||
static int __init find_num_cache_leaves(void)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
union _cpuid4_leaf_eax cache_eax;
|
||||
int i = -1;
|
||||
|
||||
do {
|
||||
++i;
|
||||
/* Do cpuid(4) loop to find out num_cache_leaves */
|
||||
cpuid_count(4, i, &eax, &ebx, &ecx, &edx);
|
||||
cache_eax.full = eax;
|
||||
} while (cache_eax.split.type != CACHE_TYPE_NULL);
|
||||
return i;
|
||||
}
|
||||
|
||||
unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)
|
||||
{
|
||||
unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
|
||||
unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */
|
||||
unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */
|
||||
unsigned int l2_id = 0, l3_id = 0, num_threads_sharing, index_msb;
|
||||
#ifdef CONFIG_X86_HT
|
||||
unsigned int cpu = (c == &boot_cpu_data) ? 0 : (c - cpu_data);
|
||||
#endif
|
||||
|
||||
if (c->cpuid_level > 3) {
|
||||
static int is_initialized;
|
||||
|
||||
if (is_initialized == 0) {
|
||||
/* Init num_cache_leaves from boot CPU */
|
||||
num_cache_leaves = find_num_cache_leaves();
|
||||
is_initialized++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Whenever possible use cpuid(4), deterministic cache
|
||||
* parameters cpuid leaf to find the cache details
|
||||
*/
|
||||
for (i = 0; i < num_cache_leaves; i++) {
|
||||
struct _cpuid4_info this_leaf;
|
||||
|
||||
int retval;
|
||||
|
||||
retval = cpuid4_cache_lookup(i, &this_leaf);
|
||||
if (retval >= 0) {
|
||||
switch(this_leaf.eax.split.level) {
|
||||
case 1:
|
||||
if (this_leaf.eax.split.type ==
|
||||
CACHE_TYPE_DATA)
|
||||
new_l1d = this_leaf.size/1024;
|
||||
else if (this_leaf.eax.split.type ==
|
||||
CACHE_TYPE_INST)
|
||||
new_l1i = this_leaf.size/1024;
|
||||
break;
|
||||
case 2:
|
||||
new_l2 = this_leaf.size/1024;
|
||||
num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
|
||||
index_msb = get_count_order(num_threads_sharing);
|
||||
l2_id = c->apicid >> index_msb;
|
||||
break;
|
||||
case 3:
|
||||
new_l3 = this_leaf.size/1024;
|
||||
num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
|
||||
index_msb = get_count_order(num_threads_sharing);
|
||||
l3_id = c->apicid >> index_msb;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Don't use cpuid2 if cpuid4 is supported. For P4, we use cpuid2 for
|
||||
* trace cache
|
||||
*/
|
||||
if ((num_cache_leaves == 0 || c->x86 == 15) && c->cpuid_level > 1) {
|
||||
/* supports eax=2 call */
|
||||
int i, j, n;
|
||||
int regs[4];
|
||||
unsigned char *dp = (unsigned char *)regs;
|
||||
int only_trace = 0;
|
||||
|
||||
if (num_cache_leaves != 0 && c->x86 == 15)
|
||||
only_trace = 1;
|
||||
|
||||
/* Number of times to iterate */
|
||||
n = cpuid_eax(2) & 0xFF;
|
||||
|
||||
for ( i = 0 ; i < n ; i++ ) {
|
||||
cpuid(2, ®s[0], ®s[1], ®s[2], ®s[3]);
|
||||
|
||||
/* If bit 31 is set, this is an unknown format */
|
||||
for ( j = 0 ; j < 3 ; j++ ) {
|
||||
if ( regs[j] < 0 ) regs[j] = 0;
|
||||
}
|
||||
|
||||
/* Byte 0 is level count, not a descriptor */
|
||||
for ( j = 1 ; j < 16 ; j++ ) {
|
||||
unsigned char des = dp[j];
|
||||
unsigned char k = 0;
|
||||
|
||||
/* look up this descriptor in the table */
|
||||
while (cache_table[k].descriptor != 0)
|
||||
{
|
||||
if (cache_table[k].descriptor == des) {
|
||||
if (only_trace && cache_table[k].cache_type != LVL_TRACE)
|
||||
break;
|
||||
switch (cache_table[k].cache_type) {
|
||||
case LVL_1_INST:
|
||||
l1i += cache_table[k].size;
|
||||
break;
|
||||
case LVL_1_DATA:
|
||||
l1d += cache_table[k].size;
|
||||
break;
|
||||
case LVL_2:
|
||||
l2 += cache_table[k].size;
|
||||
break;
|
||||
case LVL_3:
|
||||
l3 += cache_table[k].size;
|
||||
break;
|
||||
case LVL_TRACE:
|
||||
trace += cache_table[k].size;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (new_l1d)
|
||||
l1d = new_l1d;
|
||||
|
||||
if (new_l1i)
|
||||
l1i = new_l1i;
|
||||
|
||||
if (new_l2) {
|
||||
l2 = new_l2;
|
||||
#ifdef CONFIG_X86_HT
|
||||
cpu_llc_id[cpu] = l2_id;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (new_l3) {
|
||||
l3 = new_l3;
|
||||
#ifdef CONFIG_X86_HT
|
||||
cpu_llc_id[cpu] = l3_id;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (trace)
|
||||
printk (KERN_INFO "CPU: Trace cache: %dK uops", trace);
|
||||
else if ( l1i )
|
||||
printk (KERN_INFO "CPU: L1 I cache: %dK", l1i);
|
||||
|
||||
if (l1d)
|
||||
printk(", L1 D cache: %dK\n", l1d);
|
||||
else
|
||||
printk("\n");
|
||||
|
||||
if (l2)
|
||||
printk(KERN_INFO "CPU: L2 cache: %dK\n", l2);
|
||||
|
||||
if (l3)
|
||||
printk(KERN_INFO "CPU: L3 cache: %dK\n", l3);
|
||||
|
||||
c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
|
||||
|
||||
return l2;
|
||||
}
|
||||
|
||||
/* pointer to _cpuid4_info array (for each cache leaf) */
|
||||
static struct _cpuid4_info *cpuid4_info[NR_CPUS];
|
||||
#define CPUID4_INFO_IDX(x,y) (&((cpuid4_info[x])[y]))
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
||||
{
|
||||
struct _cpuid4_info *this_leaf, *sibling_leaf;
|
||||
unsigned long num_threads_sharing;
|
||||
int index_msb, i;
|
||||
struct cpuinfo_x86 *c = cpu_data;
|
||||
|
||||
this_leaf = CPUID4_INFO_IDX(cpu, index);
|
||||
num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
|
||||
|
||||
if (num_threads_sharing == 1)
|
||||
cpu_set(cpu, this_leaf->shared_cpu_map);
|
||||
else {
|
||||
index_msb = get_count_order(num_threads_sharing);
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
if (c[i].apicid >> index_msb ==
|
||||
c[cpu].apicid >> index_msb) {
|
||||
cpu_set(i, this_leaf->shared_cpu_map);
|
||||
if (i != cpu && cpuid4_info[i]) {
|
||||
sibling_leaf = CPUID4_INFO_IDX(i, index);
|
||||
cpu_set(cpu, sibling_leaf->shared_cpu_map);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
|
||||
{
|
||||
struct _cpuid4_info *this_leaf, *sibling_leaf;
|
||||
int sibling;
|
||||
|
||||
this_leaf = CPUID4_INFO_IDX(cpu, index);
|
||||
for_each_cpu_mask(sibling, this_leaf->shared_cpu_map) {
|
||||
sibling_leaf = CPUID4_INFO_IDX(sibling, index);
|
||||
cpu_clear(cpu, sibling_leaf->shared_cpu_map);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void __init cache_shared_cpu_map_setup(unsigned int cpu, int index) {}
|
||||
static void __init cache_remove_shared_cpu_map(unsigned int cpu, int index) {}
|
||||
#endif
|
||||
|
||||
static void free_cache_attributes(unsigned int cpu)
|
||||
{
|
||||
kfree(cpuid4_info[cpu]);
|
||||
cpuid4_info[cpu] = NULL;
|
||||
}
|
||||
|
||||
static int __cpuinit detect_cache_attributes(unsigned int cpu)
|
||||
{
|
||||
struct _cpuid4_info *this_leaf;
|
||||
unsigned long j;
|
||||
int retval;
|
||||
cpumask_t oldmask;
|
||||
|
||||
if (num_cache_leaves == 0)
|
||||
return -ENOENT;
|
||||
|
||||
cpuid4_info[cpu] = kmalloc(
|
||||
sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL);
|
||||
if (unlikely(cpuid4_info[cpu] == NULL))
|
||||
return -ENOMEM;
|
||||
memset(cpuid4_info[cpu], 0,
|
||||
sizeof(struct _cpuid4_info) * num_cache_leaves);
|
||||
|
||||
oldmask = current->cpus_allowed;
|
||||
retval = set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||
if (retval)
|
||||
goto out;
|
||||
|
||||
/* Do cpuid and store the results */
|
||||
retval = 0;
|
||||
for (j = 0; j < num_cache_leaves; j++) {
|
||||
this_leaf = CPUID4_INFO_IDX(cpu, j);
|
||||
retval = cpuid4_cache_lookup(j, this_leaf);
|
||||
if (unlikely(retval < 0))
|
||||
break;
|
||||
cache_shared_cpu_map_setup(cpu, j);
|
||||
}
|
||||
set_cpus_allowed(current, oldmask);
|
||||
|
||||
out:
|
||||
if (retval)
|
||||
free_cache_attributes(cpu);
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
extern struct sysdev_class cpu_sysdev_class; /* from drivers/base/cpu.c */
|
||||
|
||||
/* pointer to kobject for cpuX/cache */
|
||||
static struct kobject * cache_kobject[NR_CPUS];
|
||||
|
||||
struct _index_kobject {
|
||||
struct kobject kobj;
|
||||
unsigned int cpu;
|
||||
unsigned short index;
|
||||
};
|
||||
|
||||
/* pointer to array of kobjects for cpuX/cache/indexY */
|
||||
static struct _index_kobject *index_kobject[NR_CPUS];
|
||||
#define INDEX_KOBJECT_PTR(x,y) (&((index_kobject[x])[y]))
|
||||
|
||||
#define show_one_plus(file_name, object, val) \
|
||||
static ssize_t show_##file_name \
|
||||
(struct _cpuid4_info *this_leaf, char *buf) \
|
||||
{ \
|
||||
return sprintf (buf, "%lu\n", (unsigned long)this_leaf->object + val); \
|
||||
}
|
||||
|
||||
show_one_plus(level, eax.split.level, 0);
|
||||
show_one_plus(coherency_line_size, ebx.split.coherency_line_size, 1);
|
||||
show_one_plus(physical_line_partition, ebx.split.physical_line_partition, 1);
|
||||
show_one_plus(ways_of_associativity, ebx.split.ways_of_associativity, 1);
|
||||
show_one_plus(number_of_sets, ecx.split.number_of_sets, 1);
|
||||
|
||||
static ssize_t show_size(struct _cpuid4_info *this_leaf, char *buf)
|
||||
{
|
||||
return sprintf (buf, "%luK\n", this_leaf->size / 1024);
|
||||
}
|
||||
|
||||
static ssize_t show_shared_cpu_map(struct _cpuid4_info *this_leaf, char *buf)
|
||||
{
|
||||
char mask_str[NR_CPUS];
|
||||
cpumask_scnprintf(mask_str, NR_CPUS, this_leaf->shared_cpu_map);
|
||||
return sprintf(buf, "%s\n", mask_str);
|
||||
}
|
||||
|
||||
static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) {
|
||||
switch(this_leaf->eax.split.type) {
|
||||
case CACHE_TYPE_DATA:
|
||||
return sprintf(buf, "Data\n");
|
||||
break;
|
||||
case CACHE_TYPE_INST:
|
||||
return sprintf(buf, "Instruction\n");
|
||||
break;
|
||||
case CACHE_TYPE_UNIFIED:
|
||||
return sprintf(buf, "Unified\n");
|
||||
break;
|
||||
default:
|
||||
return sprintf(buf, "Unknown\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
struct _cache_attr {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct _cpuid4_info *, char *);
|
||||
ssize_t (*store)(struct _cpuid4_info *, const char *, size_t count);
|
||||
};
|
||||
|
||||
#define define_one_ro(_name) \
|
||||
static struct _cache_attr _name = \
|
||||
__ATTR(_name, 0444, show_##_name, NULL)
|
||||
|
||||
define_one_ro(level);
|
||||
define_one_ro(type);
|
||||
define_one_ro(coherency_line_size);
|
||||
define_one_ro(physical_line_partition);
|
||||
define_one_ro(ways_of_associativity);
|
||||
define_one_ro(number_of_sets);
|
||||
define_one_ro(size);
|
||||
define_one_ro(shared_cpu_map);
|
||||
|
||||
static struct attribute * default_attrs[] = {
|
||||
&type.attr,
|
||||
&level.attr,
|
||||
&coherency_line_size.attr,
|
||||
&physical_line_partition.attr,
|
||||
&ways_of_associativity.attr,
|
||||
&number_of_sets.attr,
|
||||
&size.attr,
|
||||
&shared_cpu_map.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
#define to_object(k) container_of(k, struct _index_kobject, kobj)
|
||||
#define to_attr(a) container_of(a, struct _cache_attr, attr)
|
||||
|
||||
static ssize_t show(struct kobject * kobj, struct attribute * attr, char * buf)
|
||||
{
|
||||
struct _cache_attr *fattr = to_attr(attr);
|
||||
struct _index_kobject *this_leaf = to_object(kobj);
|
||||
ssize_t ret;
|
||||
|
||||
ret = fattr->show ?
|
||||
fattr->show(CPUID4_INFO_IDX(this_leaf->cpu, this_leaf->index),
|
||||
buf) :
|
||||
0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t store(struct kobject * kobj, struct attribute * attr,
|
||||
const char * buf, size_t count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysfs_ops sysfs_ops = {
|
||||
.show = show,
|
||||
.store = store,
|
||||
};
|
||||
|
||||
static struct kobj_type ktype_cache = {
|
||||
.sysfs_ops = &sysfs_ops,
|
||||
.default_attrs = default_attrs,
|
||||
};
|
||||
|
||||
static struct kobj_type ktype_percpu_entry = {
|
||||
.sysfs_ops = &sysfs_ops,
|
||||
};
|
||||
|
||||
static void cpuid4_cache_sysfs_exit(unsigned int cpu)
|
||||
{
|
||||
kfree(cache_kobject[cpu]);
|
||||
kfree(index_kobject[cpu]);
|
||||
cache_kobject[cpu] = NULL;
|
||||
index_kobject[cpu] = NULL;
|
||||
free_cache_attributes(cpu);
|
||||
}
|
||||
|
||||
static int __cpuinit cpuid4_cache_sysfs_init(unsigned int cpu)
|
||||
{
|
||||
|
||||
if (num_cache_leaves == 0)
|
||||
return -ENOENT;
|
||||
|
||||
detect_cache_attributes(cpu);
|
||||
if (cpuid4_info[cpu] == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
/* Allocate all required memory */
|
||||
cache_kobject[cpu] = kmalloc(sizeof(struct kobject), GFP_KERNEL);
|
||||
if (unlikely(cache_kobject[cpu] == NULL))
|
||||
goto err_out;
|
||||
memset(cache_kobject[cpu], 0, sizeof(struct kobject));
|
||||
|
||||
index_kobject[cpu] = kmalloc(
|
||||
sizeof(struct _index_kobject ) * num_cache_leaves, GFP_KERNEL);
|
||||
if (unlikely(index_kobject[cpu] == NULL))
|
||||
goto err_out;
|
||||
memset(index_kobject[cpu], 0,
|
||||
sizeof(struct _index_kobject) * num_cache_leaves);
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
cpuid4_cache_sysfs_exit(cpu);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Add/Remove cache interface for CPU device */
|
||||
static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
|
||||
{
|
||||
unsigned int cpu = sys_dev->id;
|
||||
unsigned long i, j;
|
||||
struct _index_kobject *this_object;
|
||||
int retval = 0;
|
||||
|
||||
retval = cpuid4_cache_sysfs_init(cpu);
|
||||
if (unlikely(retval < 0))
|
||||
return retval;
|
||||
|
||||
cache_kobject[cpu]->parent = &sys_dev->kobj;
|
||||
kobject_set_name(cache_kobject[cpu], "%s", "cache");
|
||||
cache_kobject[cpu]->ktype = &ktype_percpu_entry;
|
||||
retval = kobject_register(cache_kobject[cpu]);
|
||||
|
||||
for (i = 0; i < num_cache_leaves; i++) {
|
||||
this_object = INDEX_KOBJECT_PTR(cpu,i);
|
||||
this_object->cpu = cpu;
|
||||
this_object->index = i;
|
||||
this_object->kobj.parent = cache_kobject[cpu];
|
||||
kobject_set_name(&(this_object->kobj), "index%1lu", i);
|
||||
this_object->kobj.ktype = &ktype_cache;
|
||||
retval = kobject_register(&(this_object->kobj));
|
||||
if (unlikely(retval)) {
|
||||
for (j = 0; j < i; j++) {
|
||||
kobject_unregister(
|
||||
&(INDEX_KOBJECT_PTR(cpu,j)->kobj));
|
||||
}
|
||||
kobject_unregister(cache_kobject[cpu]);
|
||||
cpuid4_cache_sysfs_exit(cpu);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void __cpuexit cache_remove_dev(struct sys_device * sys_dev)
|
||||
{
|
||||
unsigned int cpu = sys_dev->id;
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < num_cache_leaves; i++) {
|
||||
cache_remove_shared_cpu_map(cpu, i);
|
||||
kobject_unregister(&(INDEX_KOBJECT_PTR(cpu,i)->kobj));
|
||||
}
|
||||
kobject_unregister(cache_kobject[cpu]);
|
||||
cpuid4_cache_sysfs_exit(cpu);
|
||||
return;
|
||||
}
|
||||
|
||||
static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
struct sys_device *sys_dev;
|
||||
|
||||
sys_dev = get_cpu_sysdev(cpu);
|
||||
switch (action) {
|
||||
case CPU_ONLINE:
|
||||
cache_add_dev(sys_dev);
|
||||
break;
|
||||
case CPU_DEAD:
|
||||
cache_remove_dev(sys_dev);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata cacheinfo_cpu_notifier =
|
||||
{
|
||||
.notifier_call = cacheinfo_cpu_callback,
|
||||
};
|
||||
|
||||
static int __cpuinit cache_sysfs_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (num_cache_leaves == 0)
|
||||
return 0;
|
||||
|
||||
register_hotcpu_notifier(&cacheinfo_cpu_notifier);
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
cacheinfo_cpu_callback(&cacheinfo_cpu_notifier, CPU_ONLINE,
|
||||
(void *)(long)i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(cache_sysfs_init);
|
||||
|
||||
#endif
|
||||
@@ -4,11 +4,12 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/mtrr.h>
|
||||
#include "mtrr.h"
|
||||
|
||||
static DECLARE_MUTEX(mtrr_sem);
|
||||
static DEFINE_MUTEX(mtrr_mutex);
|
||||
|
||||
void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
unsigned int *size, mtrr_type * type)
|
||||
@@ -65,7 +66,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
||||
int error;
|
||||
dom0_op_t op;
|
||||
|
||||
down(&mtrr_sem);
|
||||
mutex_lock(&mtrr_mutex);
|
||||
|
||||
op.cmd = DOM0_ADD_MEMTYPE;
|
||||
op.u.add_memtype.mfn = base;
|
||||
@@ -73,7 +74,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
||||
op.u.add_memtype.type = type;
|
||||
error = HYPERVISOR_dom0_op(&op);
|
||||
if (error) {
|
||||
up(&mtrr_sem);
|
||||
mutex_unlock(&mtrr_mutex);
|
||||
BUG_ON(error > 0);
|
||||
return error;
|
||||
}
|
||||
@@ -81,7 +82,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
||||
if (increment)
|
||||
++usage_table[op.u.add_memtype.reg];
|
||||
|
||||
up(&mtrr_sem);
|
||||
mutex_unlock(&mtrr_mutex);
|
||||
|
||||
return op.u.add_memtype.reg;
|
||||
}
|
||||
@@ -118,7 +119,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
||||
int error = -EINVAL;
|
||||
dom0_op_t op;
|
||||
|
||||
down(&mtrr_sem);
|
||||
mutex_lock(&mtrr_mutex);
|
||||
|
||||
if (reg < 0) {
|
||||
/* Search for existing MTRR */
|
||||
@@ -151,7 +152,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
||||
}
|
||||
error = reg;
|
||||
out:
|
||||
up(&mtrr_sem);
|
||||
mutex_unlock(&mtrr_mutex);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu)
|
||||
* for the data I pass, and I need tags
|
||||
* on the data to indicate what information I have
|
||||
* squirrelled away. ELF notes happen to provide
|
||||
* all of that that no need to invent something new.
|
||||
* all of that, so there is no need to invent something new.
|
||||
*/
|
||||
buf = (u32*)per_cpu_ptr(crash_notes, cpu);
|
||||
if (!buf)
|
||||
@@ -91,7 +91,7 @@ static void crash_save_self(struct pt_regs *regs)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
#ifdef CONFIG_SMP
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC)
|
||||
static atomic_t waiting_for_crash_ipi;
|
||||
|
||||
static int crash_nmi_callback(struct pt_regs *regs, int cpu)
|
||||
@@ -106,7 +106,7 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu)
|
||||
return 1;
|
||||
local_irq_disable();
|
||||
|
||||
if (!user_mode(regs)) {
|
||||
if (!user_mode_vm(regs)) {
|
||||
crash_fixup_ss_esp(&fixed_regs, regs);
|
||||
regs = &fixed_regs;
|
||||
}
|
||||
@@ -115,19 +115,15 @@ static int crash_nmi_callback(struct pt_regs *regs, int cpu)
|
||||
atomic_dec(&waiting_for_crash_ipi);
|
||||
/* Assume hlt works */
|
||||
halt();
|
||||
for(;;);
|
||||
for (;;)
|
||||
cpu_relax();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* By using the NMI code instead of a vector we just sneak thru the
|
||||
* word generator coming out with just what we want. AND it does
|
||||
* not matter if clustered_apic_mode is set or not.
|
||||
*/
|
||||
static void smp_send_nmi_allbutself(void)
|
||||
{
|
||||
send_IPI_allbutself(APIC_DM_NMI);
|
||||
send_IPI_allbutself(NMI_VECTOR);
|
||||
}
|
||||
|
||||
static void nmi_shootdown_cpus(void)
|
||||
@@ -164,7 +160,7 @@ static void nmi_shootdown_cpus(void)
|
||||
void machine_crash_shutdown(struct pt_regs *regs)
|
||||
{
|
||||
/* This function is only called after the system
|
||||
* has paniced or is otherwise in a critical state.
|
||||
* has panicked or is otherwise in a critical state.
|
||||
* The minimum amount of code to allow a kexec'd kernel
|
||||
* to run successfully needs to happen here.
|
||||
*
|
||||
|
||||
@@ -40,14 +40,15 @@
|
||||
* "current" is in register %ebx during any slow entries.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/irqflags.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/dwarf2.h>
|
||||
#include "irq_vectors.h"
|
||||
#include <xen/interface/xen.h>
|
||||
|
||||
@@ -106,40 +107,91 @@ NMI_MASK = 0x80000000
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PREEMPT
|
||||
#define preempt_stop cli
|
||||
#define preempt_stop cli; TRACE_IRQS_OFF
|
||||
#else
|
||||
#define preempt_stop
|
||||
#define resume_kernel restore_nocheck
|
||||
#endif
|
||||
|
||||
.macro TRACE_IRQS_IRET
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
testl $IF_MASK,EFLAGS(%esp) # interrupts off?
|
||||
jz 1f
|
||||
TRACE_IRQS_ON
|
||||
1:
|
||||
#endif
|
||||
.endm
|
||||
|
||||
#ifdef CONFIG_VM86
|
||||
#define resume_userspace_sig check_userspace
|
||||
#else
|
||||
#define resume_userspace_sig resume_userspace
|
||||
#endif
|
||||
|
||||
#define SAVE_ALL \
|
||||
cld; \
|
||||
pushl %es; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
/*CFI_REL_OFFSET es, 0;*/\
|
||||
pushl %ds; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
/*CFI_REL_OFFSET ds, 0;*/\
|
||||
pushl %eax; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET eax, 0;\
|
||||
pushl %ebp; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET ebp, 0;\
|
||||
pushl %edi; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET edi, 0;\
|
||||
pushl %esi; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET esi, 0;\
|
||||
pushl %edx; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET edx, 0;\
|
||||
pushl %ecx; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET ecx, 0;\
|
||||
pushl %ebx; \
|
||||
CFI_ADJUST_CFA_OFFSET 4;\
|
||||
CFI_REL_OFFSET ebx, 0;\
|
||||
movl $(__USER_DS), %edx; \
|
||||
movl %edx, %ds; \
|
||||
movl %edx, %es;
|
||||
|
||||
#define RESTORE_INT_REGS \
|
||||
popl %ebx; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE ebx;\
|
||||
popl %ecx; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE ecx;\
|
||||
popl %edx; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE edx;\
|
||||
popl %esi; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE esi;\
|
||||
popl %edi; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE edi;\
|
||||
popl %ebp; \
|
||||
popl %eax
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE ebp;\
|
||||
popl %eax; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
CFI_RESTORE eax
|
||||
|
||||
#define RESTORE_REGS \
|
||||
RESTORE_INT_REGS; \
|
||||
1: popl %ds; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
/*CFI_RESTORE ds;*/\
|
||||
2: popl %es; \
|
||||
CFI_ADJUST_CFA_OFFSET -4;\
|
||||
/*CFI_RESTORE es;*/\
|
||||
.section .fixup,"ax"; \
|
||||
3: movl $0,(%esp); \
|
||||
jmp 1b; \
|
||||
@@ -152,13 +204,47 @@ NMI_MASK = 0x80000000
|
||||
.long 2b,4b; \
|
||||
.previous
|
||||
|
||||
#define RING0_INT_FRAME \
|
||||
CFI_STARTPROC simple;\
|
||||
CFI_DEF_CFA esp, 3*4;\
|
||||
/*CFI_OFFSET cs, -2*4;*/\
|
||||
CFI_OFFSET eip, -3*4
|
||||
|
||||
#define RING0_EC_FRAME \
|
||||
CFI_STARTPROC simple;\
|
||||
CFI_DEF_CFA esp, 4*4;\
|
||||
/*CFI_OFFSET cs, -2*4;*/\
|
||||
CFI_OFFSET eip, -3*4
|
||||
|
||||
#define RING0_PTREGS_FRAME \
|
||||
CFI_STARTPROC simple;\
|
||||
CFI_DEF_CFA esp, OLDESP-EBX;\
|
||||
/*CFI_OFFSET cs, CS-OLDESP;*/\
|
||||
CFI_OFFSET eip, EIP-OLDESP;\
|
||||
/*CFI_OFFSET es, ES-OLDESP;*/\
|
||||
/*CFI_OFFSET ds, DS-OLDESP;*/\
|
||||
CFI_OFFSET eax, EAX-OLDESP;\
|
||||
CFI_OFFSET ebp, EBP-OLDESP;\
|
||||
CFI_OFFSET edi, EDI-OLDESP;\
|
||||
CFI_OFFSET esi, ESI-OLDESP;\
|
||||
CFI_OFFSET edx, EDX-OLDESP;\
|
||||
CFI_OFFSET ecx, ECX-OLDESP;\
|
||||
CFI_OFFSET ebx, EBX-OLDESP
|
||||
|
||||
ENTRY(ret_from_fork)
|
||||
CFI_STARTPROC
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
call schedule_tail
|
||||
GET_THREAD_INFO(%ebp)
|
||||
popl %eax
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
pushl $0x0202 # Reset kernel eflags
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
popfl
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
jmp syscall_exit
|
||||
CFI_ENDPROC
|
||||
|
||||
/*
|
||||
* Return to user mode is not as complex as all this looks,
|
||||
@@ -169,10 +255,12 @@ ENTRY(ret_from_fork)
|
||||
|
||||
# userspace resumption stub bypassing syscall exit tracing
|
||||
ALIGN
|
||||
RING0_PTREGS_FRAME
|
||||
ret_from_exception:
|
||||
preempt_stop
|
||||
ret_from_intr:
|
||||
GET_THREAD_INFO(%ebp)
|
||||
check_userspace:
|
||||
movl EFLAGS(%esp), %eax # mix EFLAGS and CS
|
||||
movb CS(%esp), %al
|
||||
testl $(VM_MASK | 2), %eax
|
||||
@@ -201,20 +289,42 @@ need_resched:
|
||||
call preempt_schedule_irq
|
||||
jmp need_resched
|
||||
#endif
|
||||
CFI_ENDPROC
|
||||
|
||||
/* SYSENTER_RETURN points to after the "sysenter" instruction in
|
||||
the vsyscall page. See vsyscall-sysentry.S, which defines the symbol. */
|
||||
|
||||
# sysenter call handler stub
|
||||
ENTRY(sysenter_entry)
|
||||
CFI_STARTPROC simple
|
||||
CFI_DEF_CFA esp, 0
|
||||
CFI_REGISTER esp, ebp
|
||||
movl SYSENTER_stack_esp0(%esp),%esp
|
||||
sysenter_past_esp:
|
||||
/*
|
||||
* No need to follow this irqs on/off section: the syscall
|
||||
* disabled irqs and here we enable it straight after entry:
|
||||
*/
|
||||
sti
|
||||
pushl $(__USER_DS)
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
/*CFI_REL_OFFSET ss, 0*/
|
||||
pushl %ebp
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET esp, 0
|
||||
pushfl
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $(__USER_CS)
|
||||
pushl $SYSENTER_RETURN
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
/*CFI_REL_OFFSET cs, 0*/
|
||||
/*
|
||||
* Push current_thread_info()->sysenter_return to the stack.
|
||||
* A tiny bit of offset fixup is necessary - 4*4 means the 4 words
|
||||
* pushed above; +8 corresponds to copy_thread's esp0 setting.
|
||||
*/
|
||||
pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET eip, 0
|
||||
|
||||
/*
|
||||
* Load the potential sixth argument from user stack.
|
||||
@@ -229,6 +339,7 @@ sysenter_past_esp:
|
||||
.previous
|
||||
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
GET_THREAD_INFO(%ebp)
|
||||
|
||||
@@ -240,6 +351,7 @@ sysenter_past_esp:
|
||||
call *sys_call_table(,%eax,4)
|
||||
movl %eax,EAX(%esp)
|
||||
DISABLE_INTERRUPTS
|
||||
TRACE_IRQS_OFF
|
||||
movl TI_flags(%ebp), %ecx
|
||||
testw $_TIF_ALLWORK_MASK, %cx
|
||||
jne syscall_exit_work
|
||||
@@ -248,6 +360,7 @@ sysenter_past_esp:
|
||||
movl OLDESP(%esp), %ecx
|
||||
xorl %ebp,%ebp
|
||||
#ifdef CONFIG_XEN
|
||||
TRACE_IRQS_ON
|
||||
__ENABLE_INTERRUPTS
|
||||
sysexit_scrit: /**** START OF SYSEXIT CRITICAL REGION ****/
|
||||
__TEST_PENDING
|
||||
@@ -261,16 +374,24 @@ sysexit_ecrit: /**** END OF SYSEXIT CRITICAL REGION ****/
|
||||
add $4,%esp
|
||||
jmp ret_from_intr
|
||||
#else
|
||||
TRACE_IRQS_ON
|
||||
sti
|
||||
sysexit
|
||||
#endif /* !CONFIG_XEN */
|
||||
CFI_ENDPROC
|
||||
|
||||
|
||||
# system call handler stub
|
||||
ENTRY(system_call)
|
||||
RING0_INT_FRAME # can't unwind into user space anyway
|
||||
pushl %eax # save orig_eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
GET_THREAD_INFO(%ebp)
|
||||
testl $TF_MASK,EFLAGS(%esp)
|
||||
jz no_singlestep
|
||||
orl $_TIF_SINGLESTEP,TI_flags(%ebp)
|
||||
no_singlestep:
|
||||
# system call tracing in operation / emulation
|
||||
/* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
|
||||
testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
|
||||
@@ -284,6 +405,7 @@ syscall_exit:
|
||||
DISABLE_INTERRUPTS # make sure we don't miss an interrupt
|
||||
# setting need_resched or sigpending
|
||||
# between sampling and the iret
|
||||
TRACE_IRQS_OFF
|
||||
movl TI_flags(%ebp), %ecx
|
||||
testw $_TIF_ALLWORK_MASK, %cx # current->work
|
||||
jne syscall_exit_work
|
||||
@@ -298,6 +420,7 @@ restore_all:
|
||||
movb CS(%esp), %al
|
||||
andl $(VM_MASK | (4 << 8) | 3), %eax
|
||||
cmpl $((4 << 8) | 3), %eax
|
||||
CFI_REMEMBER_STATE
|
||||
je ldt_ss # returning to user-space with LDT SS
|
||||
restore_nocheck:
|
||||
#else
|
||||
@@ -311,12 +434,16 @@ restore_nocheck:
|
||||
andb $1,%al # EAX[0] == IRET_EFLAGS.IF & event_mask
|
||||
jnz restore_all_enable_events # != 0 => enable event delivery
|
||||
#endif
|
||||
TRACE_IRQS_IRET
|
||||
restore_nocheck_notrace:
|
||||
RESTORE_REGS
|
||||
addl $4, %esp
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
1: iret
|
||||
.section .fixup,"ax"
|
||||
iret_exc:
|
||||
#ifndef CONFIG_XEN
|
||||
TRACE_IRQS_ON
|
||||
sti
|
||||
#endif
|
||||
pushl $0 # no error code
|
||||
@@ -329,6 +456,7 @@ iret_exc:
|
||||
.previous
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
CFI_RESTORE_STATE
|
||||
ldt_ss:
|
||||
larl OLDSS(%esp), %eax
|
||||
jnz restore_nocheck
|
||||
@@ -341,11 +469,15 @@ ldt_ss:
|
||||
* CPUs, which we can try to work around to make
|
||||
* dosemu and wine happy. */
|
||||
subl $8, %esp # reserve space for switch16 pointer
|
||||
CFI_ADJUST_CFA_OFFSET 8
|
||||
cli
|
||||
TRACE_IRQS_OFF
|
||||
movl %esp, %eax
|
||||
/* Set up the 16bit stack frame with switch32 pointer on top,
|
||||
* and a switch16 pointer on top of the current frame. */
|
||||
call setup_x86_bogus_stack
|
||||
CFI_ADJUST_CFA_OFFSET -8 # frame has moved
|
||||
TRACE_IRQS_IRET
|
||||
RESTORE_REGS
|
||||
lss 20+4(%esp), %esp # switch to 16bit stack
|
||||
1: iret
|
||||
@@ -353,6 +485,7 @@ ldt_ss:
|
||||
.align 4
|
||||
.long 1b,iret_exc
|
||||
.previous
|
||||
CFI_ENDPROC
|
||||
#else
|
||||
hypervisor_iret:
|
||||
andl $~NMI_MASK, EFLAGS(%esp)
|
||||
@@ -363,6 +496,7 @@ hypervisor_iret:
|
||||
|
||||
# perform work that needs to be done immediately before resumption
|
||||
ALIGN
|
||||
RING0_PTREGS_FRAME # can't unwind into user space anyway
|
||||
work_pending:
|
||||
testb $_TIF_NEED_RESCHED, %cl
|
||||
jz work_notifysig
|
||||
@@ -371,6 +505,7 @@ work_resched:
|
||||
DISABLE_INTERRUPTS # make sure we don't miss an interrupt
|
||||
# setting need_resched or sigpending
|
||||
# between sampling and the iret
|
||||
TRACE_IRQS_OFF
|
||||
movl TI_flags(%ebp), %ecx
|
||||
andl $_TIF_WORK_MASK, %ecx # is there any work to be done other
|
||||
# than syscall tracing?
|
||||
@@ -386,18 +521,20 @@ work_notifysig: # deal with pending signals and
|
||||
# vm86-space
|
||||
xorl %edx, %edx
|
||||
call do_notify_resume
|
||||
jmp resume_userspace
|
||||
jmp resume_userspace_sig
|
||||
|
||||
ALIGN
|
||||
work_notifysig_v86:
|
||||
#ifdef CONFIG_VM86
|
||||
pushl %ecx # save ti_flags for do_notify_resume
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
call save_v86_state # %eax contains pt_regs pointer
|
||||
popl %ecx
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
movl %eax, %esp
|
||||
xorl %edx, %edx
|
||||
call do_notify_resume
|
||||
jmp resume_userspace
|
||||
jmp resume_userspace_sig
|
||||
#endif
|
||||
|
||||
# perform syscall exit tracing
|
||||
@@ -420,25 +557,28 @@ syscall_trace_entry:
|
||||
syscall_exit_work:
|
||||
testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl
|
||||
jz work_pending
|
||||
TRACE_IRQS_ON
|
||||
ENABLE_INTERRUPTS # could let do_syscall_trace() call
|
||||
# schedule() instead
|
||||
movl %esp, %eax
|
||||
movl $1, %edx
|
||||
call do_syscall_trace
|
||||
jmp resume_userspace
|
||||
CFI_ENDPROC
|
||||
|
||||
ALIGN
|
||||
RING0_INT_FRAME # can't unwind into user space anyway
|
||||
syscall_fault:
|
||||
pushl %eax # save orig_eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
GET_THREAD_INFO(%ebp)
|
||||
movl $-EFAULT,EAX(%esp)
|
||||
jmp resume_userspace
|
||||
|
||||
ALIGN
|
||||
syscall_badsys:
|
||||
movl $-ENOSYS,EAX(%esp)
|
||||
jmp resume_userspace
|
||||
CFI_ENDPROC
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
#define FIXUP_ESPFIX_STACK \
|
||||
@@ -451,16 +591,21 @@ syscall_badsys:
|
||||
movl %eax, %esp;
|
||||
#define UNWIND_ESPFIX_STACK \
|
||||
pushl %eax; \
|
||||
CFI_ADJUST_CFA_OFFSET 4; \
|
||||
movl %ss, %eax; \
|
||||
/* see if on 16bit stack */ \
|
||||
cmpw $__ESPFIX_SS, %ax; \
|
||||
jne 28f; \
|
||||
movl $__KERNEL_DS, %edx; \
|
||||
movl %edx, %ds; \
|
||||
movl %edx, %es; \
|
||||
je 28f; \
|
||||
27: popl %eax; \
|
||||
CFI_ADJUST_CFA_OFFSET -4; \
|
||||
.section .fixup,"ax"; \
|
||||
28: movl $__KERNEL_DS, %eax; \
|
||||
movl %eax, %ds; \
|
||||
movl %eax, %es; \
|
||||
/* switch to 32bit stack */ \
|
||||
FIXUP_ESPFIX_STACK \
|
||||
28: popl %eax;
|
||||
FIXUP_ESPFIX_STACK; \
|
||||
jmp 27b; \
|
||||
.previous
|
||||
|
||||
/*
|
||||
* Build the entry stubs and pointer table with
|
||||
@@ -472,9 +617,14 @@ ENTRY(interrupt)
|
||||
|
||||
vector=0
|
||||
ENTRY(irq_entries_start)
|
||||
RING0_INT_FRAME
|
||||
.rept NR_IRQS
|
||||
ALIGN
|
||||
.if vector
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
.endif
|
||||
1: pushl $~(vector)
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp common_interrupt
|
||||
.data
|
||||
.long 1b
|
||||
@@ -482,20 +632,30 @@ ENTRY(irq_entries_start)
|
||||
vector=vector+1
|
||||
.endr
|
||||
|
||||
/*
|
||||
* the CPU automatically disables interrupts when executing an IRQ vector,
|
||||
* so IRQ-flags tracing has to follow that:
|
||||
*/
|
||||
ALIGN
|
||||
common_interrupt:
|
||||
SAVE_ALL
|
||||
TRACE_IRQS_OFF
|
||||
movl %esp,%eax
|
||||
call do_IRQ
|
||||
jmp ret_from_intr
|
||||
CFI_ENDPROC
|
||||
|
||||
#define BUILD_INTERRUPT(name, nr) \
|
||||
ENTRY(name) \
|
||||
RING0_INT_FRAME; \
|
||||
pushl $~(nr); \
|
||||
SAVE_ALL \
|
||||
CFI_ADJUST_CFA_OFFSET 4; \
|
||||
SAVE_ALL; \
|
||||
TRACE_IRQS_OFF \
|
||||
movl %esp,%eax; \
|
||||
call smp_/**/name; \
|
||||
jmp ret_from_intr;
|
||||
jmp ret_from_intr; \
|
||||
CFI_ENDPROC
|
||||
|
||||
/* The include is where all of the SMP etc. interrupts come from */
|
||||
#include "entry_arch.h"
|
||||
@@ -504,34 +664,59 @@ ENTRY(name) \
|
||||
#endif
|
||||
|
||||
ENTRY(divide_error)
|
||||
RING0_INT_FRAME
|
||||
pushl $0 # no error code
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_divide_error
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
ALIGN
|
||||
error_code:
|
||||
pushl %ds
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
/*CFI_REL_OFFSET ds, 0*/
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET eax, 0
|
||||
xorl %eax, %eax
|
||||
pushl %ebp
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET ebp, 0
|
||||
pushl %edi
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET edi, 0
|
||||
pushl %esi
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET esi, 0
|
||||
pushl %edx
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET edx, 0
|
||||
decl %eax # eax = -1
|
||||
pushl %ecx
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET ecx, 0
|
||||
pushl %ebx
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
CFI_REL_OFFSET ebx, 0
|
||||
cld
|
||||
pushl %es
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
/*CFI_REL_OFFSET es, 0*/
|
||||
UNWIND_ESPFIX_STACK
|
||||
popl %ecx
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
/*CFI_REGISTER es, ecx*/
|
||||
movl ES(%esp), %edi # get the function address
|
||||
movl ORIG_EAX(%esp), %edx # get the error code
|
||||
movl %eax, ORIG_EAX(%esp)
|
||||
movl %ecx, ES(%esp)
|
||||
/*CFI_REL_OFFSET es, ES*/
|
||||
movl $(__USER_DS), %ecx
|
||||
movl %ecx, %ds
|
||||
movl %ecx, %es
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call *%edi
|
||||
jmp ret_from_exception
|
||||
CFI_ENDPROC
|
||||
|
||||
#ifdef CONFIG_XEN
|
||||
# A note on the "critical region" in our callback handler.
|
||||
@@ -680,31 +865,44 @@ ENTRY(failsafe_callback)
|
||||
#endif
|
||||
|
||||
ENTRY(coprocessor_error)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_coprocessor_error
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(simd_coprocessor_error)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_simd_coprocessor_error
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(device_not_available)
|
||||
RING0_INT_FRAME
|
||||
pushl $-1 # mark this as an int
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
#ifndef CONFIG_XEN
|
||||
movl %cr0, %eax
|
||||
testl $0x4, %eax # EM (math emulation bit)
|
||||
je device_available_emulate
|
||||
pushl $0 # temporary storage for ORIG_EIP
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
call math_emulate
|
||||
addl $4, %esp
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
jmp ret_from_exception
|
||||
device_available_emulate:
|
||||
#endif
|
||||
preempt_stop
|
||||
call math_state_restore
|
||||
jmp ret_from_exception
|
||||
CFI_ENDPROC
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
/*
|
||||
@@ -731,6 +929,7 @@ label: \
|
||||
#endif /* CONFIG_XEN */
|
||||
|
||||
KPROBE_ENTRY(debug)
|
||||
RING0_INT_FRAME
|
||||
#ifndef CONFIG_XEN
|
||||
cmpl $sysenter_entry,(%esp)
|
||||
jne debug_stack_correct
|
||||
@@ -738,13 +937,14 @@ KPROBE_ENTRY(debug)
|
||||
debug_stack_correct:
|
||||
#endif /* !CONFIG_XEN */
|
||||
pushl $-1 # mark this as an int
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
xorl %edx,%edx # error code 0
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_debug
|
||||
jmp ret_from_exception
|
||||
CFI_ENDPROC
|
||||
.previous .text
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
/*
|
||||
* NMI is doubly nasty. It can happen _while_ we're handling
|
||||
@@ -755,14 +955,18 @@ debug_stack_correct:
|
||||
* fault happened on the sysenter path.
|
||||
*/
|
||||
ENTRY(nmi)
|
||||
RING0_INT_FRAME
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
movl %ss, %eax
|
||||
cmpw $__ESPFIX_SS, %ax
|
||||
popl %eax
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
je nmi_16bit_stack
|
||||
cmpl $sysenter_entry,(%esp)
|
||||
je nmi_stack_fixup
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
movl %esp,%eax
|
||||
/* Do not access memory above the end of our stack page,
|
||||
* it might not exist.
|
||||
@@ -770,16 +974,19 @@ ENTRY(nmi)
|
||||
andl $(THREAD_SIZE-1),%eax
|
||||
cmpl $(THREAD_SIZE-20),%eax
|
||||
popl %eax
|
||||
CFI_ADJUST_CFA_OFFSET -4
|
||||
jae nmi_stack_correct
|
||||
cmpl $sysenter_entry,12(%esp)
|
||||
je nmi_debug_stack_check
|
||||
nmi_stack_correct:
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
xorl %edx,%edx # zero error code
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_nmi
|
||||
jmp restore_all
|
||||
jmp restore_nocheck_notrace
|
||||
CFI_ENDPROC
|
||||
|
||||
nmi_stack_fixup:
|
||||
FIX_STACK(12,nmi_stack_correct, 1)
|
||||
@@ -795,98 +1002,191 @@ nmi_debug_stack_check:
|
||||
jmp nmi_stack_correct
|
||||
|
||||
nmi_16bit_stack:
|
||||
RING0_INT_FRAME
|
||||
/* create the pointer to lss back */
|
||||
pushl %ss
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl %esp
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
movzwl %sp, %esp
|
||||
addw $4, (%esp)
|
||||
/* copy the iret frame of 12 bytes */
|
||||
.rept 3
|
||||
pushl 16(%esp)
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
.endr
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
FIXUP_ESPFIX_STACK # %eax == %esp
|
||||
CFI_ADJUST_CFA_OFFSET -20 # the frame has now moved
|
||||
xorl %edx,%edx # zero error code
|
||||
call do_nmi
|
||||
RESTORE_REGS
|
||||
lss 12+4(%esp), %esp # back to 16bit stack
|
||||
1: iret
|
||||
CFI_ENDPROC
|
||||
.section __ex_table,"a"
|
||||
.align 4
|
||||
.long 1b,iret_exc
|
||||
.previous
|
||||
#else
|
||||
ENTRY(nmi)
|
||||
RING0_INT_FRAME
|
||||
pushl %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
xorl %edx,%edx # zero error code
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_nmi
|
||||
orl $NMI_MASK, EFLAGS(%esp)
|
||||
jmp restore_all
|
||||
CFI_ENDPROC
|
||||
#endif
|
||||
|
||||
KPROBE_ENTRY(int3)
|
||||
RING0_INT_FRAME
|
||||
pushl $-1 # mark this as an int
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
SAVE_ALL
|
||||
xorl %edx,%edx # zero error code
|
||||
movl %esp,%eax # pt_regs pointer
|
||||
call do_int3
|
||||
jmp ret_from_exception
|
||||
CFI_ENDPROC
|
||||
.previous .text
|
||||
|
||||
ENTRY(overflow)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_overflow
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(bounds)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_bounds
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(invalid_op)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_invalid_op
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(coprocessor_segment_overrun)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_coprocessor_segment_overrun
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(invalid_TSS)
|
||||
RING0_EC_FRAME
|
||||
pushl $do_invalid_TSS
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(segment_not_present)
|
||||
RING0_EC_FRAME
|
||||
pushl $do_segment_not_present
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
ENTRY(stack_segment)
|
||||
RING0_EC_FRAME
|
||||
pushl $do_stack_segment
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
KPROBE_ENTRY(general_protection)
|
||||
RING0_EC_FRAME
|
||||
pushl $do_general_protection
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
.previous .text
|
||||
|
||||
ENTRY(alignment_check)
|
||||
RING0_EC_FRAME
|
||||
pushl $do_alignment_check
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
|
||||
KPROBE_ENTRY(page_fault)
|
||||
RING0_EC_FRAME
|
||||
pushl $do_page_fault
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
.previous .text
|
||||
|
||||
#ifdef CONFIG_X86_MCE
|
||||
ENTRY(machine_check)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl machine_check_vector
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
ENTRY(spurious_interrupt_bug)
|
||||
RING0_INT_FRAME
|
||||
pushl $0
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
pushl $do_spurious_interrupt_bug
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
jmp error_code
|
||||
CFI_ENDPROC
|
||||
#endif /* !CONFIG_XEN */
|
||||
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
ENTRY(arch_unwind_init_running)
|
||||
CFI_STARTPROC
|
||||
movl 4(%esp), %edx
|
||||
movl (%esp), %ecx
|
||||
leal 4(%esp), %eax
|
||||
movl %ebx, EBX(%edx)
|
||||
xorl %ebx, %ebx
|
||||
movl %ebx, ECX(%edx)
|
||||
movl %ebx, EDX(%edx)
|
||||
movl %esi, ESI(%edx)
|
||||
movl %edi, EDI(%edx)
|
||||
movl %ebp, EBP(%edx)
|
||||
movl %ebx, EAX(%edx)
|
||||
movl $__USER_DS, DS(%edx)
|
||||
movl $__USER_DS, ES(%edx)
|
||||
movl %ebx, ORIG_EAX(%edx)
|
||||
movl %ecx, EIP(%edx)
|
||||
movl 12(%esp), %ecx
|
||||
movl $__KERNEL_CS, CS(%edx)
|
||||
movl %ebx, EFLAGS(%edx)
|
||||
movl %eax, OLDESP(%edx)
|
||||
movl 8(%esp), %eax
|
||||
movl %ecx, 8(%esp)
|
||||
movl EBX(%edx), %ebx
|
||||
movl $__KERNEL_DS, OLDSS(%edx)
|
||||
jmpl *%eax
|
||||
CFI_ENDPROC
|
||||
ENDPROC(arch_unwind_init_running)
|
||||
#endif
|
||||
|
||||
ENTRY(fixup_4gb_segment)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
|
||||
|
||||
.text
|
||||
#include <linux/config.h>
|
||||
#include <linux/elfnote.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <xen/interface/xen.h>
|
||||
@@ -61,7 +61,8 @@ ENTRY(startup_32)
|
||||
movl %eax,%gs
|
||||
cld # gcc2 wants the direction flag cleared at all times
|
||||
|
||||
call start_kernel
|
||||
pushl %eax # fake return address
|
||||
jmp start_kernel
|
||||
L6:
|
||||
jmp L6 # main should never return here, but
|
||||
# just in case, we know what happens.
|
||||
@@ -92,6 +93,7 @@ ENTRY(empty_zero_page)
|
||||
/*
|
||||
* The Global Descriptor Table contains 28 quadwords, per-CPU.
|
||||
*/
|
||||
.align L1_CACHE_BYTES
|
||||
ENTRY(cpu_gdt_table)
|
||||
.quad 0x0000000000000000 /* NULL descriptor */
|
||||
.quad 0x0000000000000000 /* 0x0b reserved */
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/compiler.h>
|
||||
@@ -38,6 +37,7 @@
|
||||
#include <asm/desc.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/i8259.h>
|
||||
#include <asm/nmi.h>
|
||||
|
||||
#include <mach_apic.h>
|
||||
|
||||
@@ -90,6 +90,7 @@ atomic_t irq_mis_count;
|
||||
static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
|
||||
|
||||
static DEFINE_SPINLOCK(ioapic_lock);
|
||||
static DEFINE_SPINLOCK(vector_lock);
|
||||
|
||||
int timer_over_8254 __initdata = 1;
|
||||
|
||||
@@ -310,7 +311,7 @@ static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
|
||||
# include <linux/slab.h> /* kmalloc() */
|
||||
# include <linux/timer.h> /* time_after() */
|
||||
|
||||
# ifdef CONFIG_BALANCED_IRQ_DEBUG
|
||||
#ifdef CONFIG_BALANCED_IRQ_DEBUG
|
||||
# define TDprintk(x...) do { printk("<%ld:%s:%d>: ", jiffies, __FILE__, __LINE__); printk(x); } while (0)
|
||||
# define Dprintk(x...) do { TDprintk(x); } while (0)
|
||||
# else
|
||||
@@ -318,10 +319,15 @@ static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
|
||||
# define Dprintk(x...)
|
||||
# endif
|
||||
|
||||
|
||||
#define IRQBALANCE_CHECK_ARCH -999
|
||||
static int irqbalance_disabled = IRQBALANCE_CHECK_ARCH;
|
||||
static int physical_balance = 0;
|
||||
#define MAX_BALANCED_IRQ_INTERVAL (5*HZ)
|
||||
#define MIN_BALANCED_IRQ_INTERVAL (HZ/2)
|
||||
#define BALANCED_IRQ_MORE_DELTA (HZ/10)
|
||||
#define BALANCED_IRQ_LESS_DELTA (HZ)
|
||||
|
||||
static int irqbalance_disabled __read_mostly = IRQBALANCE_CHECK_ARCH;
|
||||
static int physical_balance __read_mostly;
|
||||
static long balanced_irq_interval __read_mostly = MAX_BALANCED_IRQ_INTERVAL;
|
||||
|
||||
static struct irq_cpu_info {
|
||||
unsigned long * last_irq;
|
||||
@@ -340,12 +346,14 @@ static struct irq_cpu_info {
|
||||
|
||||
#define CPU_TO_PACKAGEINDEX(i) (first_cpu(cpu_sibling_map[i]))
|
||||
|
||||
#define MAX_BALANCED_IRQ_INTERVAL (5*HZ)
|
||||
#define MIN_BALANCED_IRQ_INTERVAL (HZ/2)
|
||||
#define BALANCED_IRQ_MORE_DELTA (HZ/10)
|
||||
#define BALANCED_IRQ_LESS_DELTA (HZ)
|
||||
static cpumask_t balance_irq_affinity[NR_IRQS] = {
|
||||
[0 ... NR_IRQS-1] = CPU_MASK_ALL
|
||||
};
|
||||
|
||||
static long balanced_irq_interval = MAX_BALANCED_IRQ_INTERVAL;
|
||||
void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
|
||||
{
|
||||
balance_irq_affinity[irq] = mask;
|
||||
}
|
||||
|
||||
static unsigned long move(int curr_cpu, cpumask_t allowed_mask,
|
||||
unsigned long now, int direction)
|
||||
@@ -383,7 +391,7 @@ static inline void balance_irq(int cpu, int irq)
|
||||
if (irqbalance_disabled)
|
||||
return;
|
||||
|
||||
cpus_and(allowed_mask, cpu_online_map, irq_affinity[irq]);
|
||||
cpus_and(allowed_mask, cpu_online_map, balance_irq_affinity[irq]);
|
||||
new_cpu = move(cpu, allowed_mask, now, 1);
|
||||
if (cpu != new_cpu) {
|
||||
set_pending_irq(irq, cpumask_of_cpu(new_cpu));
|
||||
@@ -394,8 +402,8 @@ static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold)
|
||||
{
|
||||
int i, j;
|
||||
Dprintk("Rotating IRQs among CPUs.\n");
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
for (j = 0; cpu_online(i) && (j < NR_IRQS); j++) {
|
||||
for_each_online_cpu(i) {
|
||||
for (j = 0; j < NR_IRQS; j++) {
|
||||
if (!irq_desc[j].action)
|
||||
continue;
|
||||
/* Is it a significant load ? */
|
||||
@@ -424,7 +432,7 @@ static void do_irq_balance(void)
|
||||
unsigned long imbalance = 0;
|
||||
cpumask_t allowed_mask, target_cpu_mask, tmp;
|
||||
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
for_each_possible_cpu(i) {
|
||||
int package_index;
|
||||
CPU_IRQ(i) = 0;
|
||||
if (!cpu_online(i))
|
||||
@@ -465,9 +473,7 @@ static void do_irq_balance(void)
|
||||
}
|
||||
}
|
||||
/* Find the least loaded processor package */
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_online(i))
|
||||
continue;
|
||||
for_each_online_cpu(i) {
|
||||
if (i != CPU_TO_PACKAGEINDEX(i))
|
||||
continue;
|
||||
if (min_cpu_irq > CPU_IRQ(i)) {
|
||||
@@ -484,9 +490,7 @@ tryanothercpu:
|
||||
*/
|
||||
tmp_cpu_irq = 0;
|
||||
tmp_loaded = -1;
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_online(i))
|
||||
continue;
|
||||
for_each_online_cpu(i) {
|
||||
if (i != CPU_TO_PACKAGEINDEX(i))
|
||||
continue;
|
||||
if (max_cpu_irq <= CPU_IRQ(i))
|
||||
@@ -576,7 +580,9 @@ tryanotherirq:
|
||||
}
|
||||
}
|
||||
|
||||
cpus_and(allowed_mask, cpu_online_map, irq_affinity[selected_irq]);
|
||||
cpus_and(allowed_mask,
|
||||
cpu_online_map,
|
||||
balance_irq_affinity[selected_irq]);
|
||||
target_cpu_mask = cpumask_of_cpu(min_loaded);
|
||||
cpus_and(tmp, target_cpu_mask, allowed_mask);
|
||||
|
||||
@@ -617,7 +623,7 @@ static int balanced_irq(void *unused)
|
||||
|
||||
/* push everything to CPU 0 to give us a starting point. */
|
||||
for (i = 0 ; i < NR_IRQS ; i++) {
|
||||
pending_irq_cpumask[i] = cpumask_of_cpu(0);
|
||||
irq_desc[i].pending_mask = cpumask_of_cpu(0);
|
||||
set_pending_irq(i, cpumask_of_cpu(0));
|
||||
}
|
||||
|
||||
@@ -662,9 +668,7 @@ static int __init balanced_irq_init(void)
|
||||
if (smp_num_siblings > 1 && !cpus_empty(tmp))
|
||||
physical_balance = 1;
|
||||
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
if (!cpu_online(i))
|
||||
continue;
|
||||
for_each_online_cpu(i) {
|
||||
irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
|
||||
irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
|
||||
if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) {
|
||||
@@ -681,9 +685,11 @@ static int __init balanced_irq_init(void)
|
||||
else
|
||||
printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq");
|
||||
failed:
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
for_each_possible_cpu(i) {
|
||||
kfree(irq_cpu_data[i].irq_delta);
|
||||
irq_cpu_data[i].irq_delta = NULL;
|
||||
kfree(irq_cpu_data[i].last_irq);
|
||||
irq_cpu_data[i].last_irq = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -691,7 +697,7 @@ failed:
|
||||
int __init irqbalance_disable(char *str)
|
||||
{
|
||||
irqbalance_disabled = 1;
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("noirqbalance", irqbalance_disable);
|
||||
@@ -1203,21 +1209,33 @@ u8 irq_vector[NR_IRQ_VECTORS] __read_mostly; /* = { FIRST_DEVICE_VECTOR , 0 }; *
|
||||
|
||||
int assign_irq_vector(int irq)
|
||||
{
|
||||
unsigned long flags;
|
||||
int vector;
|
||||
struct physdev_irq irq_op;
|
||||
|
||||
BUG_ON(irq >= NR_IRQ_VECTORS);
|
||||
if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0)
|
||||
BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
|
||||
|
||||
spin_lock_irqsave(&vector_lock, flags);
|
||||
|
||||
if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
return IO_APIC_VECTOR(irq);
|
||||
}
|
||||
|
||||
irq_op.irq = irq;
|
||||
if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op))
|
||||
if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
vector_irq[irq_op.vector] = irq;
|
||||
vector = irq_op.vector;
|
||||
vector_irq[vector] = irq;
|
||||
if (irq != AUTO_ASSIGN)
|
||||
IO_APIC_VECTOR(irq) = irq_op.vector;
|
||||
IO_APIC_VECTOR(irq) = vector;
|
||||
|
||||
return irq_op.vector;
|
||||
spin_unlock_irqrestore(&vector_lock, flags);
|
||||
|
||||
return vector;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
@@ -1228,23 +1246,18 @@ static struct hw_interrupt_type ioapic_edge_type;
|
||||
#define IOAPIC_EDGE 0
|
||||
#define IOAPIC_LEVEL 1
|
||||
|
||||
static inline void ioapic_register_intr(int irq, int vector, unsigned long trigger)
|
||||
static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
|
||||
{
|
||||
if (use_pci_vector() && !platform_legacy_irq(irq)) {
|
||||
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
|
||||
trigger == IOAPIC_LEVEL)
|
||||
irq_desc[vector].handler = &ioapic_level_type;
|
||||
else
|
||||
irq_desc[vector].handler = &ioapic_edge_type;
|
||||
set_intr_gate(vector, interrupt[vector]);
|
||||
} else {
|
||||
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
|
||||
trigger == IOAPIC_LEVEL)
|
||||
irq_desc[irq].handler = &ioapic_level_type;
|
||||
else
|
||||
irq_desc[irq].handler = &ioapic_edge_type;
|
||||
set_intr_gate(vector, interrupt[irq]);
|
||||
}
|
||||
unsigned idx;
|
||||
|
||||
idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq;
|
||||
|
||||
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
|
||||
trigger == IOAPIC_LEVEL)
|
||||
irq_desc[idx].chip = &ioapic_level_type;
|
||||
else
|
||||
irq_desc[idx].chip = &ioapic_edge_type;
|
||||
set_intr_gate(vector, interrupt[idx]);
|
||||
}
|
||||
#else
|
||||
#define ioapic_register_intr(_irq,_vector,_trigger) ((void)0)
|
||||
@@ -1359,7 +1372,7 @@ static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, in
|
||||
* The timer IRQ doesn't have to know that behind the
|
||||
* scene we have a 8259A-master in AEOI mode ...
|
||||
*/
|
||||
irq_desc[0].handler = &ioapic_edge_type;
|
||||
irq_desc[0].chip = &ioapic_edge_type;
|
||||
|
||||
/*
|
||||
* Add it to the IO-APIC irq-routing table:
|
||||
@@ -1813,7 +1826,8 @@ static void __init setup_ioapic_ids_from_mpc(void)
|
||||
* Don't check I/O APIC IDs for xAPIC systems. They have
|
||||
* no meaning without the serial APIC bus.
|
||||
*/
|
||||
if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 < 15))
|
||||
if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
|| APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
|
||||
return;
|
||||
/*
|
||||
* This is broken; anything with a real cpu count has to
|
||||
@@ -2109,6 +2123,13 @@ static void set_ioapic_affinity_vector (unsigned int vector,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static int ioapic_retrigger(unsigned int irq)
|
||||
{
|
||||
send_IPI_self(IO_APIC_VECTOR(irq));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Level and edge triggered IO-APIC interrupts need different handling,
|
||||
* so we use two separate IRQ descriptors. Edge triggered IRQs can be
|
||||
@@ -2128,6 +2149,7 @@ static struct hw_interrupt_type ioapic_edge_type __read_mostly = {
|
||||
#ifdef CONFIG_SMP
|
||||
.set_affinity = set_ioapic_affinity,
|
||||
#endif
|
||||
.retrigger = ioapic_retrigger,
|
||||
};
|
||||
|
||||
static struct hw_interrupt_type ioapic_level_type __read_mostly = {
|
||||
@@ -2141,6 +2163,7 @@ static struct hw_interrupt_type ioapic_level_type __read_mostly = {
|
||||
#ifdef CONFIG_SMP
|
||||
.set_affinity = set_ioapic_affinity,
|
||||
#endif
|
||||
.retrigger = ioapic_retrigger,
|
||||
};
|
||||
#endif /* !CONFIG_XEN */
|
||||
|
||||
@@ -2177,7 +2200,7 @@ static inline void init_IO_APIC_traps(void)
|
||||
#ifndef CONFIG_XEN
|
||||
else
|
||||
/* Strange. Oh, well.. */
|
||||
irq_desc[irq].handler = &no_irq_type;
|
||||
irq_desc[irq].chip = &no_irq_type;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -2298,6 +2321,8 @@ static inline void unlock_ExtINT_logic(void)
|
||||
spin_unlock_irqrestore(&ioapic_lock, flags);
|
||||
}
|
||||
|
||||
int timer_uses_ioapic_pin_0;
|
||||
|
||||
/*
|
||||
* This code may look a bit paranoid, but it's supposed to cooperate with
|
||||
* a wide range of boards and BIOS bugs. Fortunately only the timer IRQ
|
||||
@@ -2334,6 +2359,9 @@ static inline void check_timer(void)
|
||||
pin2 = ioapic_i8259.pin;
|
||||
apic2 = ioapic_i8259.apic;
|
||||
|
||||
if (pin1 == 0)
|
||||
timer_uses_ioapic_pin_0 = 1;
|
||||
|
||||
printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
|
||||
vector, apic1, pin1, apic2, pin2);
|
||||
|
||||
@@ -2390,7 +2418,7 @@ static inline void check_timer(void)
|
||||
printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
|
||||
|
||||
disable_8259A_irq(0);
|
||||
irq_desc[0].handler = &lapic_irq_type;
|
||||
irq_desc[0].chip = &lapic_irq_type;
|
||||
apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */
|
||||
enable_8259A_irq(0);
|
||||
|
||||
@@ -2419,6 +2447,7 @@ static inline void check_timer(void)
|
||||
"report. Then try booting with the 'noapic' option");
|
||||
}
|
||||
#else
|
||||
int timer_uses_ioapic_pin_0 = 0;
|
||||
#define check_timer() ((void)0)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -79,6 +79,7 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
|
||||
|
||||
memset(bitmap, 0xff, IO_BITMAP_BYTES);
|
||||
t->io_bitmap_ptr = bitmap;
|
||||
set_thread_flag(TIF_IO_BITMAP);
|
||||
|
||||
set_iobitmap.bitmap = (char *)bitmap;
|
||||
set_iobitmap.nr_ports = IO_BITMAP_BITS;
|
||||
|
||||
@@ -42,8 +42,8 @@ union irq_ctx {
|
||||
u32 stack[THREAD_SIZE/sizeof(u32)];
|
||||
};
|
||||
|
||||
static union irq_ctx *hardirq_ctx[NR_CPUS];
|
||||
static union irq_ctx *softirq_ctx[NR_CPUS];
|
||||
static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly;
|
||||
static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -60,6 +60,12 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs)
|
||||
u32 *isp;
|
||||
#endif
|
||||
|
||||
if (unlikely((unsigned)irq >= NR_IRQS)) {
|
||||
printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
|
||||
__FUNCTION__, irq);
|
||||
BUG();
|
||||
}
|
||||
|
||||
irq_enter();
|
||||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
/* Debugging check for stack overflow: is there less than 1KB free? */
|
||||
@@ -95,6 +101,14 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs)
|
||||
irqctx->tinfo.task = curctx->tinfo.task;
|
||||
irqctx->tinfo.previous_esp = current_stack_pointer;
|
||||
|
||||
/*
|
||||
* Copy the softirq bits in preempt_count so that the
|
||||
* softirq checks work in the hardirq context.
|
||||
*/
|
||||
irqctx->tinfo.preempt_count =
|
||||
(irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK) |
|
||||
(curctx->tinfo.preempt_count & SOFTIRQ_MASK);
|
||||
|
||||
asm volatile(
|
||||
" xchgl %%ebx,%%esp \n"
|
||||
" call __do_IRQ \n"
|
||||
@@ -147,7 +161,7 @@ void irq_ctx_init(int cpu)
|
||||
irqctx->tinfo.task = NULL;
|
||||
irqctx->tinfo.exec_domain = NULL;
|
||||
irqctx->tinfo.cpu = cpu;
|
||||
irqctx->tinfo.preempt_count = SOFTIRQ_OFFSET;
|
||||
irqctx->tinfo.preempt_count = 0;
|
||||
irqctx->tinfo.addr_limit = MAKE_MM_SEG(0);
|
||||
|
||||
softirq_ctx[cpu] = irqctx;
|
||||
@@ -192,6 +206,10 @@ asmlinkage void do_softirq(void)
|
||||
: "0"(isp)
|
||||
: "memory", "cc", "edx", "ecx", "eax"
|
||||
);
|
||||
/*
|
||||
* Shouldnt happen, we returned above if in_interrupt():
|
||||
*/
|
||||
WARN_ON_ONCE(softirq_count());
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
@@ -219,7 +237,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
||||
if (i == 0) {
|
||||
seq_printf(p, " ");
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "CPU%d ",j);
|
||||
seq_printf(p, "CPU%-8d",j);
|
||||
seq_putc(p, '\n');
|
||||
}
|
||||
|
||||
@@ -235,7 +253,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
||||
#endif
|
||||
seq_printf(p, " %14s", irq_desc[i].handler->typename);
|
||||
seq_printf(p, " %14s", irq_desc[i].chip->typename);
|
||||
seq_printf(p, " %s", action->name);
|
||||
|
||||
for (action=action->next; action; action = action->next)
|
||||
@@ -276,13 +294,13 @@ void fixup_irqs(cpumask_t map)
|
||||
if (irq == 2)
|
||||
continue;
|
||||
|
||||
cpus_and(mask, irq_affinity[irq], map);
|
||||
cpus_and(mask, irq_desc[irq].affinity, map);
|
||||
if (any_online_cpu(mask) == NR_CPUS) {
|
||||
/*printk("Breaking affinity for irq %i\n", irq);*/
|
||||
mask = map;
|
||||
}
|
||||
if (irq_desc[irq].handler->set_affinity)
|
||||
irq_desc[irq].handler->set_affinity(irq, mask);
|
||||
if (irq_desc[irq].chip->set_affinity)
|
||||
irq_desc[irq].chip->set_affinity(irq, mask);
|
||||
else if (irq_desc[irq].action && !(warned++))
|
||||
printk("Cannot set affinity for irq %i\n", irq);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/syscalls.h>
|
||||
|
||||
#include <asm/msr.h>
|
||||
@@ -42,14 +43,17 @@ MODULE_DESCRIPTION("Intel CPU (IA-32) Microcode Update Driver");
|
||||
MODULE_AUTHOR("Tigran Aivazian <tigran@veritas.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define MICROCODE_VERSION "1.14-xen"
|
||||
static int verbose;
|
||||
module_param(verbose, int, 0644);
|
||||
|
||||
#define MICROCODE_VERSION "1.14a-xen"
|
||||
|
||||
#define DEFAULT_UCODE_DATASIZE (2000) /* 2000 bytes */
|
||||
#define MC_HEADER_SIZE (sizeof (microcode_header_t)) /* 48 bytes */
|
||||
#define DEFAULT_UCODE_TOTALSIZE (DEFAULT_UCODE_DATASIZE + MC_HEADER_SIZE) /* 2048 bytes */
|
||||
|
||||
/* no concurrent ->write()s are allowed on /dev/cpu/microcode */
|
||||
static DECLARE_MUTEX(microcode_sem);
|
||||
static DEFINE_MUTEX(microcode_mutex);
|
||||
|
||||
static int microcode_open (struct inode *unused1, struct file *unused2)
|
||||
{
|
||||
@@ -85,49 +89,31 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_
|
||||
{
|
||||
ssize_t ret;
|
||||
|
||||
if (len < DEFAULT_UCODE_TOTALSIZE) {
|
||||
if (len < MC_HEADER_SIZE) {
|
||||
printk(KERN_ERR "microcode: not enough data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
down(µcode_sem);
|
||||
mutex_lock(µcode_mutex);
|
||||
|
||||
ret = do_microcode_update(buf, len);
|
||||
if (!ret)
|
||||
ret = (ssize_t)len;
|
||||
|
||||
up(µcode_sem);
|
||||
mutex_unlock(µcode_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int microcode_ioctl (struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
switch (cmd) {
|
||||
/*
|
||||
* XXX: will be removed after microcode_ctl
|
||||
* is updated to ignore failure of this ioctl()
|
||||
*/
|
||||
case MICROCODE_IOCFREE:
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct file_operations microcode_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.write = microcode_write,
|
||||
.ioctl = microcode_ioctl,
|
||||
.open = microcode_open,
|
||||
};
|
||||
|
||||
static struct miscdevice microcode_dev = {
|
||||
.minor = MICROCODE_MINOR,
|
||||
.name = "microcode",
|
||||
.devfs_name = "cpu/microcode",
|
||||
.fops = µcode_fops,
|
||||
};
|
||||
|
||||
@@ -151,7 +137,6 @@ static int __init microcode_init (void)
|
||||
static void __exit microcode_exit (void)
|
||||
{
|
||||
misc_deregister(µcode_dev);
|
||||
printk(KERN_INFO "IA-32 Microcode Update Driver v" MICROCODE_VERSION " unregistered\n");
|
||||
}
|
||||
|
||||
module_init(microcode_init)
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
@@ -38,12 +37,6 @@
|
||||
int smp_found_config;
|
||||
unsigned int __initdata maxcpus = NR_CPUS;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#define CPU_HOTPLUG_ENABLED (1)
|
||||
#else
|
||||
#define CPU_HOTPLUG_ENABLED (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Various Linux-internal data structures created from the
|
||||
* MP-table.
|
||||
@@ -110,21 +103,6 @@ static int __init mpf_checksum(unsigned char *mp, int len)
|
||||
static int mpc_record;
|
||||
static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
|
||||
|
||||
#ifdef CONFIG_X86_NUMAQ
|
||||
static int MP_valid_apicid(int apicid, int version)
|
||||
{
|
||||
return hweight_long(apicid & 0xf) == 1 && (apicid >> 4) != 0xf;
|
||||
}
|
||||
#elif !defined(CONFIG_XEN)
|
||||
static int MP_valid_apicid(int apicid, int version)
|
||||
{
|
||||
if (version >= 0x14)
|
||||
return apicid < 0xff;
|
||||
else
|
||||
return apicid < 0xf;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_XEN
|
||||
static void __devinit MP_processor_info (struct mpc_config_processor *m)
|
||||
{
|
||||
@@ -191,12 +169,6 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
|
||||
|
||||
ver = m->mpc_apicver;
|
||||
|
||||
if (!MP_valid_apicid(apicid, ver)) {
|
||||
printk(KERN_WARNING "Processor #%d INVALID. (Max ID: %d).\n",
|
||||
m->mpc_apicid, MAX_APICS);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate version
|
||||
*/
|
||||
@@ -226,7 +198,14 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m)
|
||||
cpu_set(num_processors, cpu_possible_map);
|
||||
num_processors++;
|
||||
|
||||
if (CPU_HOTPLUG_ENABLED || (num_processors > 8)) {
|
||||
/*
|
||||
* Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y
|
||||
* but we need to work other dependencies like SMP_SUSPEND etc
|
||||
* before this can be done without some confusion.
|
||||
* if (CPU_HOTPLUG_ENABLED || num_processors > 8)
|
||||
* - Ashok Raj <ashok.raj@intel.com>
|
||||
*/
|
||||
if (num_processors > 8) {
|
||||
switch (boot_cpu_data.x86_vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
if (!APIC_XAPIC(ver)) {
|
||||
@@ -256,6 +235,13 @@ static void __init MP_bus_info (struct mpc_config_bus *m)
|
||||
|
||||
mpc_oem_bus_info(m, str, translation_table[mpc_record]);
|
||||
|
||||
if (m->mpc_busid >= MAX_MP_BUSSES) {
|
||||
printk(KERN_WARNING "MP table busid value (%d) for bustype %s "
|
||||
" is too large, max. supported is %d\n",
|
||||
m->mpc_busid, str, MAX_MP_BUSSES - 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
|
||||
mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
|
||||
} else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {
|
||||
@@ -844,6 +830,8 @@ void __init find_smp_config (void)
|
||||
#endif
|
||||
}
|
||||
|
||||
int es7000_plat;
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
ACPI-based MP Configuration
|
||||
-------------------------------------------------------------------------- */
|
||||
@@ -957,7 +945,8 @@ void __init mp_register_ioapic (
|
||||
#ifndef CONFIG_XEN
|
||||
set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
|
||||
#endif
|
||||
if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 < 15))
|
||||
if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
&& !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
|
||||
tmpid = io_apic_get_unique_id(idx, id);
|
||||
else
|
||||
tmpid = id;
|
||||
@@ -1033,8 +1022,6 @@ void __init mp_override_legacy_irq (
|
||||
return;
|
||||
}
|
||||
|
||||
int es7000_plat;
|
||||
|
||||
void __init mp_config_acpi_legacy_irqs (void)
|
||||
{
|
||||
struct mpc_config_intsrc intsrc;
|
||||
@@ -1164,7 +1151,17 @@ int mp_register_gsi (u32 gsi, int triggering, int polarity)
|
||||
*/
|
||||
int irq = gsi;
|
||||
if (gsi < MAX_GSI_NUM) {
|
||||
if (gsi > 15)
|
||||
/*
|
||||
* Retain the VIA chipset work-around (gsi > 15), but
|
||||
* avoid a problem where the 8254 timer (IRQ0) is setup
|
||||
* via an override (so it's not on pin 0 of the ioapic),
|
||||
* and at the same time, the pin 0 interrupt is a PCI
|
||||
* type. The gsi > 15 test could cause these two pins
|
||||
* to be shared as IRQ0, and they are not shareable.
|
||||
* So test for this condition, and if necessary, avoid
|
||||
* the pin collision.
|
||||
*/
|
||||
if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
|
||||
gsi = pci_irq++;
|
||||
/*
|
||||
* Don't assign IRQ used by ACPI SCI
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
#include <asm/bug.h>
|
||||
|
||||
#ifdef __x86_64__
|
||||
#include <asm/proto.h>
|
||||
|
||||
int iommu_merge __read_mostly = 0;
|
||||
EXPORT_SYMBOL(iommu_merge);
|
||||
|
||||
@@ -32,10 +34,28 @@ EXPORT_SYMBOL(bad_dma_address);
|
||||
int iommu_bio_merge __read_mostly = 0;
|
||||
EXPORT_SYMBOL(iommu_bio_merge);
|
||||
|
||||
int force_iommu __read_mostly= 0;
|
||||
|
||||
__init int iommu_setup(char *p)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void __init pci_iommu_alloc(void)
|
||||
{
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
pci_swiotlb_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __init pci_iommu_init(void)
|
||||
{
|
||||
no_iommu_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Must execute after PCI subsystem */
|
||||
fs_initcall(pci_iommu_init);
|
||||
#endif
|
||||
|
||||
struct dma_coherent_mem {
|
||||
@@ -94,13 +114,7 @@ dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
|
||||
}
|
||||
EXPORT_SYMBOL(dma_unmap_sg);
|
||||
|
||||
/*
|
||||
* XXX This file is also used by xenLinux/ia64.
|
||||
* "defined(__i386__) || defined (__x86_64__)" means "!defined(__ia64__)".
|
||||
* This #if work around should be removed once this file is merbed back into
|
||||
* i386' pci-dma or is moved to drivers/xen/core.
|
||||
*/
|
||||
#if defined(__i386__) || defined(__x86_64__)
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
dma_addr_t
|
||||
dma_map_page(struct device *dev, struct page *page, unsigned long offset,
|
||||
size_t size, enum dma_data_direction direction)
|
||||
@@ -130,7 +144,7 @@ dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
|
||||
swiotlb_unmap_page(dev, dma_address, size, direction);
|
||||
}
|
||||
EXPORT_SYMBOL(dma_unmap_page);
|
||||
#endif /* defined(__i386__) || defined(__x86_64__) */
|
||||
#endif /* CONFIG_HIGHMEM */
|
||||
|
||||
int
|
||||
dma_mapping_error(dma_addr_t dma_addr)
|
||||
@@ -161,6 +175,8 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
|
||||
unsigned int order = get_order(size);
|
||||
unsigned long vstart;
|
||||
u64 mask;
|
||||
|
||||
/* ignore region specifiers */
|
||||
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
|
||||
|
||||
@@ -183,9 +199,14 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
|
||||
vstart = __get_free_pages(gfp, order);
|
||||
ret = (void *)vstart;
|
||||
|
||||
if (dev != NULL && dev->coherent_dma_mask)
|
||||
mask = dev->coherent_dma_mask;
|
||||
else
|
||||
mask = 0xffffffff;
|
||||
|
||||
if (ret != NULL) {
|
||||
if (xen_create_contiguous_region(vstart, order,
|
||||
dma_bits) != 0) {
|
||||
fls64(mask)) != 0) {
|
||||
free_pages(vstart, order);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#include <linux/user.h>
|
||||
#include <linux/a.out.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/reboot.h>
|
||||
@@ -38,7 +37,6 @@
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/pgtable.h>
|
||||
@@ -101,18 +99,34 @@ void enable_hlt(void)
|
||||
|
||||
EXPORT_SYMBOL(enable_hlt);
|
||||
|
||||
/* XXX XEN doesn't use default_idle(), poll_idle(). Use xen_idle() instead. */
|
||||
void xen_idle(void)
|
||||
/*
|
||||
* On SMP it's slightly faster (but much more power-consuming!)
|
||||
* to poll the ->work.need_resched flag instead of waiting for the
|
||||
* cross-CPU IPI to arrive. Use this option with caution.
|
||||
*/
|
||||
static void poll_idle(void)
|
||||
{
|
||||
local_irq_enable();
|
||||
|
||||
asm volatile(
|
||||
"2:"
|
||||
"testl %0, %1;"
|
||||
"rep; nop;"
|
||||
"je 2b;"
|
||||
: : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags));
|
||||
}
|
||||
|
||||
static void xen_idle(void)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
||||
if (need_resched())
|
||||
local_irq_enable();
|
||||
else {
|
||||
clear_thread_flag(TIF_POLLING_NRFLAG);
|
||||
current_thread_info()->status &= ~TS_POLLING;
|
||||
smp_mb__after_clear_bit();
|
||||
safe_halt();
|
||||
set_thread_flag(TIF_POLLING_NRFLAG);
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_APM_MODULE
|
||||
@@ -147,22 +161,27 @@ void cpu_idle(void)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
|
||||
set_thread_flag(TIF_POLLING_NRFLAG);
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
|
||||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
while (!need_resched()) {
|
||||
void (*idle)(void);
|
||||
|
||||
if (__get_cpu_var(cpu_idle_state))
|
||||
__get_cpu_var(cpu_idle_state) = 0;
|
||||
|
||||
rmb();
|
||||
idle = pm_idle;
|
||||
|
||||
if (!idle)
|
||||
idle = xen_idle;
|
||||
|
||||
if (cpu_is_offline(cpu))
|
||||
play_dead();
|
||||
|
||||
__get_cpu_var(irq_stat).idle_timestamp = jiffies;
|
||||
xen_idle();
|
||||
idle();
|
||||
}
|
||||
preempt_enable_no_resched();
|
||||
schedule();
|
||||
@@ -198,9 +217,22 @@ void cpu_idle_wait(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpu_idle_wait);
|
||||
|
||||
/* XXX XEN doesn't use mwait_idle(), select_idle_routine(), idle_setup(). */
|
||||
/* Always use xen_idle() instead. */
|
||||
void __devinit select_idle_routine(const struct cpuinfo_x86 *c) {}
|
||||
void __devinit select_idle_routine(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
}
|
||||
|
||||
static int __init idle_setup (char *str)
|
||||
{
|
||||
if (!strncmp(str, "poll", 4)) {
|
||||
printk("using polling idle threads.\n");
|
||||
pm_idle = poll_idle;
|
||||
}
|
||||
|
||||
boot_option_idle_override = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("idle=", idle_setup);
|
||||
|
||||
void show_regs(struct pt_regs * regs)
|
||||
{
|
||||
@@ -211,7 +243,7 @@ void show_regs(struct pt_regs * regs)
|
||||
printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id());
|
||||
print_symbol("EIP is at %s\n", regs->eip);
|
||||
|
||||
if (user_mode(regs))
|
||||
if (user_mode_vm(regs))
|
||||
printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);
|
||||
printk(" EFLAGS: %08lx %s (%s %.*s)\n",
|
||||
regs->eflags, print_tainted(), system_utsname.release,
|
||||
@@ -229,7 +261,7 @@ void show_regs(struct pt_regs * regs)
|
||||
cr3 = read_cr3();
|
||||
cr4 = read_cr4_safe();
|
||||
printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4);
|
||||
show_trace(NULL, ®s->esp);
|
||||
show_trace(NULL, regs, ®s->esp);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -277,22 +309,15 @@ EXPORT_SYMBOL(kernel_thread);
|
||||
*/
|
||||
void exit_thread(void)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
struct thread_struct *t = &tsk->thread;
|
||||
|
||||
/*
|
||||
* Remove function-return probe instances associated with this task
|
||||
* and put them back on the free list. Do not insert an exit probe for
|
||||
* this function, it will be disabled by kprobe_flush_task if you do.
|
||||
*/
|
||||
kprobe_flush_task(tsk);
|
||||
|
||||
/* The process may have allocated an io port bitmap... nuke it. */
|
||||
if (unlikely(NULL != t->io_bitmap_ptr)) {
|
||||
if (unlikely(test_thread_flag(TIF_IO_BITMAP))) {
|
||||
struct task_struct *tsk = current;
|
||||
struct thread_struct *t = &tsk->thread;
|
||||
struct physdev_set_iobitmap set_iobitmap = { 0 };
|
||||
HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap, &set_iobitmap);
|
||||
kfree(t->io_bitmap_ptr);
|
||||
t->io_bitmap_ptr = NULL;
|
||||
clear_thread_flag(TIF_IO_BITMAP);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -302,6 +327,7 @@ void flush_thread(void)
|
||||
|
||||
memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
|
||||
memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
|
||||
clear_tsk_thread_flag(tsk, TIF_DEBUG);
|
||||
/*
|
||||
* Forget coprocessor state..
|
||||
*/
|
||||
@@ -346,7 +372,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
||||
savesegment(gs,p->thread.gs);
|
||||
|
||||
tsk = current;
|
||||
if (unlikely(NULL != tsk->thread.io_bitmap_ptr)) {
|
||||
if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
|
||||
p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
|
||||
if (!p->thread.io_bitmap_ptr) {
|
||||
p->thread.io_bitmap_max = 0;
|
||||
@@ -354,6 +380,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
||||
}
|
||||
memcpy(p->thread.io_bitmap_ptr, tsk->thread.io_bitmap_ptr,
|
||||
IO_BITMAP_BYTES);
|
||||
set_tsk_thread_flag(p, TIF_IO_BITMAP);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -450,6 +477,23 @@ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static noinline void __switch_to_xtra(struct task_struct *next_p)
|
||||
{
|
||||
struct thread_struct *next;
|
||||
|
||||
next = &next_p->thread;
|
||||
|
||||
if (test_tsk_thread_flag(next_p, TIF_DEBUG)) {
|
||||
set_debugreg(next->debugreg[0], 0);
|
||||
set_debugreg(next->debugreg[1], 1);
|
||||
set_debugreg(next->debugreg[2], 2);
|
||||
set_debugreg(next->debugreg[3], 3);
|
||||
/* no 4 and 5 */
|
||||
set_debugreg(next->debugreg[6], 6);
|
||||
set_debugreg(next->debugreg[7], 7);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This function selects if the context switch from prev to next
|
||||
* has to tweak the TSC disable bit in the cr4.
|
||||
@@ -591,17 +635,10 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
|
||||
loadsegment(gs, next->gs);
|
||||
|
||||
/*
|
||||
* Now maybe reload the debug registers
|
||||
* Now maybe handle debug registers
|
||||
*/
|
||||
if (unlikely(next->debugreg[7])) {
|
||||
set_debugreg(next->debugreg[0], 0);
|
||||
set_debugreg(next->debugreg[1], 1);
|
||||
set_debugreg(next->debugreg[2], 2);
|
||||
set_debugreg(next->debugreg[3], 3);
|
||||
/* no 4 and 5 */
|
||||
set_debugreg(next->debugreg[6], 6);
|
||||
set_debugreg(next->debugreg[7], 7);
|
||||
}
|
||||
if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW))
|
||||
__switch_to_xtra(next_p);
|
||||
|
||||
disable_tsc(prev_p, next_p);
|
||||
|
||||
@@ -697,7 +734,6 @@ unsigned long get_wchan(struct task_struct *p)
|
||||
} while (count++ < 16);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(get_wchan);
|
||||
|
||||
/*
|
||||
* sys_alloc_thread_area: get a yet unused TLS descriptor index.
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* This file contains work-arounds for x86 and x86_64 platform bugs.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
|
||||
@@ -23,17 +23,17 @@
|
||||
* This file handles the architecture-dependent parts of initialization
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/apm_bios.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mca.h>
|
||||
#include <linux/root_dev.h>
|
||||
@@ -49,6 +49,7 @@
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/pfn.h>
|
||||
|
||||
#include <video/edid.h>
|
||||
|
||||
@@ -66,7 +67,7 @@
|
||||
#include <xen/interface/memory.h>
|
||||
#include <xen/features.h>
|
||||
#include <xen/xencons.h>
|
||||
#include "setup_arch_pre.h"
|
||||
#include <setup_arch.h>
|
||||
#include <bios_ebda.h>
|
||||
|
||||
#ifdef CONFIG_XEN
|
||||
@@ -402,8 +403,8 @@ EXPORT_SYMBOL(phys_to_machine_mapping);
|
||||
start_info_t *xen_start_info;
|
||||
EXPORT_SYMBOL(xen_start_info);
|
||||
|
||||
static void __init add_memory_region(unsigned long long start,
|
||||
unsigned long long size, int type)
|
||||
void __init add_memory_region(unsigned long long start,
|
||||
unsigned long long size, int type)
|
||||
{
|
||||
int x;
|
||||
|
||||
@@ -524,7 +525,7 @@ static struct change_member *change_point[2*E820MAX] __initdata;
|
||||
static struct e820entry *overlap_list[E820MAX] __initdata;
|
||||
static struct e820entry new_bios[E820MAX] __initdata;
|
||||
|
||||
static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
|
||||
int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
|
||||
{
|
||||
struct change_member *change_tmp;
|
||||
unsigned long current_type, last_type;
|
||||
@@ -693,7 +694,7 @@ static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
|
||||
* thinkpad 560x, for example, does not cooperate with the memory
|
||||
* detection code.)
|
||||
*/
|
||||
static int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
|
||||
int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
|
||||
{
|
||||
#ifndef CONFIG_XEN
|
||||
/* Only one memory region (or negative)? Ignore it */
|
||||
@@ -757,12 +758,6 @@ static inline void copy_edd(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Do NOT EVER look at the BIOS memory size location.
|
||||
* It does not work on many machines.
|
||||
*/
|
||||
#define LOWMEMSIZE() (0x9f000)
|
||||
|
||||
static void __init parse_cmdline_early (char ** cmdline_p)
|
||||
{
|
||||
char c = ' ', *to = command_line, *from = saved_command_line;
|
||||
@@ -1027,6 +1022,38 @@ efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function checks if the entire range <start,end> is mapped with type.
|
||||
*
|
||||
* Note: this function only works correct if the e820 table is sorted and
|
||||
* not-overlapping, which is the case
|
||||
*/
|
||||
int __init
|
||||
e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
|
||||
{
|
||||
u64 start = s;
|
||||
u64 end = e;
|
||||
int i;
|
||||
for (i = 0; i < e820.nr_map; i++) {
|
||||
struct e820entry *ei = &e820.map[i];
|
||||
if (type && ei->type != type)
|
||||
continue;
|
||||
/* is the region (part) in overlap with the current region ?*/
|
||||
if (ei->addr >= end || ei->addr + ei->size <= start)
|
||||
continue;
|
||||
/* if the region is at the beginning of <start,end> we move
|
||||
* start to the end of the region since it's ok until there
|
||||
*/
|
||||
if (ei->addr <= start)
|
||||
start = ei->addr + ei->size;
|
||||
/* if start is now at or beyond end, we're done, full
|
||||
* coverage */
|
||||
if (start >= end)
|
||||
return 1; /* we're done */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the highest page frame number we have available
|
||||
*/
|
||||
@@ -1124,10 +1151,10 @@ static int __init
|
||||
free_available_memory(unsigned long start, unsigned long end, void *arg)
|
||||
{
|
||||
/* check max_low_pfn */
|
||||
if (start >= ((max_low_pfn + 1) << PAGE_SHIFT))
|
||||
if (start >= (max_low_pfn << PAGE_SHIFT))
|
||||
return 0;
|
||||
if (end >= ((max_low_pfn + 1) << PAGE_SHIFT))
|
||||
end = (max_low_pfn + 1) << PAGE_SHIFT;
|
||||
if (end >= (max_low_pfn << PAGE_SHIFT))
|
||||
end = max_low_pfn << PAGE_SHIFT;
|
||||
if (start < end)
|
||||
free_bootmem(start, end - start);
|
||||
|
||||
@@ -1378,9 +1405,11 @@ legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
|
||||
|
||||
for (i = 0; i < nr_map; i++) {
|
||||
struct resource *res;
|
||||
#ifndef CONFIG_RESOURCES_64BIT
|
||||
if (e820[i].addr + e820[i].size > 0x100000000ULL)
|
||||
continue;
|
||||
res = alloc_bootmem_low(sizeof(struct resource));
|
||||
#endif
|
||||
res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
|
||||
switch (e820[i].type) {
|
||||
case E820_RAM: res->name = "System RAM"; break;
|
||||
case E820_ACPI: res->name = "ACPI Tables"; break;
|
||||
@@ -1390,7 +1419,10 @@ legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
|
||||
res->start = e820[i].addr;
|
||||
res->end = res->start + e820[i].size - 1;
|
||||
res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
request_resource(&iomem_resource, res);
|
||||
if (request_resource(&iomem_resource, res)) {
|
||||
kfree(res);
|
||||
continue;
|
||||
}
|
||||
if (e820[i].type == E820_RAM) {
|
||||
/*
|
||||
* We don't know which RAM region contains kernel data,
|
||||
@@ -1467,8 +1499,11 @@ e820_setup_gap(struct e820entry *e820, int nr_map)
|
||||
|
||||
/*
|
||||
* Request address space for all standard resources
|
||||
*
|
||||
* This is called just before pcibios_init(), which is also a
|
||||
* subsys_initcall, but is linked in later (in arch/i386/pci/common.c).
|
||||
*/
|
||||
static void __init register_memory(void)
|
||||
static int __init request_standard_resources(void)
|
||||
{
|
||||
#ifdef CONFIG_XEN
|
||||
struct xen_memory_map memmap;
|
||||
@@ -1477,8 +1512,9 @@ static void __init register_memory(void)
|
||||
|
||||
/* Nothing to do if not running in dom0. */
|
||||
if (!is_initial_xendomain())
|
||||
return;
|
||||
return 0;
|
||||
|
||||
printk("Setting up standard PCI resources\n");
|
||||
#ifdef CONFIG_XEN
|
||||
memmap.nr_entries = E820MAX;
|
||||
set_xen_guest_handle(memmap.buffer, machine_e820.map);
|
||||
@@ -1503,6 +1539,13 @@ static void __init register_memory(void)
|
||||
/* request I/O space for devices used on all i[345]86 PCs */
|
||||
for (i = 0; i < STANDARD_IO_RESOURCES; i++)
|
||||
request_resource(&ioport_resource, &standard_io_resources[i]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(request_standard_resources);
|
||||
|
||||
static void __init register_memory(void)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_XEN
|
||||
e820_setup_gap(machine_e820.map, machine_e820.nr_map);
|
||||
@@ -1511,103 +1554,6 @@ static void __init register_memory(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Use inline assembly to define this because the nops are defined
|
||||
as inline assembly strings in the include files and we cannot
|
||||
get them easily into strings. */
|
||||
asm("\t.data\nintelnops: "
|
||||
GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6
|
||||
GENERIC_NOP7 GENERIC_NOP8);
|
||||
asm("\t.data\nk8nops: "
|
||||
K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6
|
||||
K8_NOP7 K8_NOP8);
|
||||
asm("\t.data\nk7nops: "
|
||||
K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6
|
||||
K7_NOP7 K7_NOP8);
|
||||
|
||||
extern unsigned char intelnops[], k8nops[], k7nops[];
|
||||
static unsigned char *intel_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
intelnops,
|
||||
intelnops + 1,
|
||||
intelnops + 1 + 2,
|
||||
intelnops + 1 + 2 + 3,
|
||||
intelnops + 1 + 2 + 3 + 4,
|
||||
intelnops + 1 + 2 + 3 + 4 + 5,
|
||||
intelnops + 1 + 2 + 3 + 4 + 5 + 6,
|
||||
intelnops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
|
||||
};
|
||||
static unsigned char *k8_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
k8nops,
|
||||
k8nops + 1,
|
||||
k8nops + 1 + 2,
|
||||
k8nops + 1 + 2 + 3,
|
||||
k8nops + 1 + 2 + 3 + 4,
|
||||
k8nops + 1 + 2 + 3 + 4 + 5,
|
||||
k8nops + 1 + 2 + 3 + 4 + 5 + 6,
|
||||
k8nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
|
||||
};
|
||||
static unsigned char *k7_nops[ASM_NOP_MAX+1] = {
|
||||
NULL,
|
||||
k7nops,
|
||||
k7nops + 1,
|
||||
k7nops + 1 + 2,
|
||||
k7nops + 1 + 2 + 3,
|
||||
k7nops + 1 + 2 + 3 + 4,
|
||||
k7nops + 1 + 2 + 3 + 4 + 5,
|
||||
k7nops + 1 + 2 + 3 + 4 + 5 + 6,
|
||||
k7nops + 1 + 2 + 3 + 4 + 5 + 6 + 7,
|
||||
};
|
||||
static struct nop {
|
||||
int cpuid;
|
||||
unsigned char **noptable;
|
||||
} noptypes[] = {
|
||||
{ X86_FEATURE_K8, k8_nops },
|
||||
{ X86_FEATURE_K7, k7_nops },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
/* Replace instructions with better alternatives for this CPU type.
|
||||
|
||||
This runs before SMP is initialized to avoid SMP problems with
|
||||
self modifying code. This implies that assymetric systems where
|
||||
APs have less capabilities than the boot processor are not handled.
|
||||
Tough. Make sure you disable such features by hand. */
|
||||
void apply_alternatives(void *start, void *end)
|
||||
{
|
||||
struct alt_instr *a;
|
||||
int diff, i, k;
|
||||
unsigned char **noptable = intel_nops;
|
||||
for (i = 0; noptypes[i].cpuid >= 0; i++) {
|
||||
if (boot_cpu_has(noptypes[i].cpuid)) {
|
||||
noptable = noptypes[i].noptable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (a = start; (void *)a < end; a++) {
|
||||
if (!boot_cpu_has(a->cpuid))
|
||||
continue;
|
||||
BUG_ON(a->replacementlen > a->instrlen);
|
||||
memcpy(a->instr, a->replacement, a->replacementlen);
|
||||
diff = a->instrlen - a->replacementlen;
|
||||
/* Pad the rest with nops */
|
||||
for (i = a->replacementlen; diff > 0; diff -= k, i += k) {
|
||||
k = diff;
|
||||
if (k > ASM_NOP_MAX)
|
||||
k = ASM_NOP_MAX;
|
||||
memcpy(a->instr + i, noptable[k], k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __init alternative_instructions(void)
|
||||
{
|
||||
extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
|
||||
apply_alternatives(__alt_instructions, __alt_instructions_end);
|
||||
}
|
||||
|
||||
static char * __init machine_specific_memory_setup(void);
|
||||
|
||||
#ifdef CONFIG_MCA
|
||||
static void set_mca_bus(int x)
|
||||
{
|
||||
@@ -1636,7 +1582,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
panic_timeout = 1;
|
||||
|
||||
/* Register a call for panic conditions. */
|
||||
notifier_chain_register(&panic_notifier_list, &xen_panic_block);
|
||||
atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
|
||||
|
||||
HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
|
||||
HYPERVISOR_vm_assist(VMASST_CMD_enable,
|
||||
@@ -1644,6 +1590,9 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
|
||||
early_cpu_init();
|
||||
#ifdef CONFIG_SMP
|
||||
prefill_possible_map();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FIXME: This isn't an official loader_type right
|
||||
@@ -1731,6 +1680,16 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
parse_cmdline_early(cmdline_p);
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
{
|
||||
char *s = strstr(*cmdline_p, "earlyprintk=");
|
||||
if (s) {
|
||||
setup_early_printk(strchr(s, '=') + 1);
|
||||
printk("early console enabled\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
max_low_pfn = setup_memory();
|
||||
|
||||
/*
|
||||
@@ -1777,8 +1736,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
* frames that make up the p2m table. Used by save/restore
|
||||
*/
|
||||
pfn_to_mfn_frame_list_list = alloc_bootmem_low_pages(PAGE_SIZE);
|
||||
HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
|
||||
virt_to_mfn(pfn_to_mfn_frame_list_list);
|
||||
|
||||
fpp = PAGE_SIZE/sizeof(unsigned long);
|
||||
for (i=0, j=0, k=-1; i< max_pfn; i+=fpp, j++) {
|
||||
@@ -1795,24 +1752,14 @@ void __init setup_arch(char **cmdline_p)
|
||||
virt_to_mfn(&phys_to_machine_mapping[i]);
|
||||
}
|
||||
HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
|
||||
HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
|
||||
virt_to_mfn(pfn_to_mfn_frame_list_list);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: at this point the bootmem allocator is fully available.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
{
|
||||
char *s = strstr(*cmdline_p, "earlyprintk=");
|
||||
if (s) {
|
||||
extern void setup_early_printk(char *);
|
||||
|
||||
setup_early_printk(strchr(s, '=') + 1);
|
||||
printk("early console enabled\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (is_initial_xendomain())
|
||||
dmi_scan_machine();
|
||||
|
||||
@@ -1825,10 +1772,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
set_iopl.iopl = 1;
|
||||
HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl);
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
check_acpi_pci(); /* Checks more than just ACPI actually */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
if (!is_initial_xendomain()) {
|
||||
printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
|
||||
@@ -1840,6 +1783,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
* Parse the ACPI tables for possible boot-time SMP configuration.
|
||||
*/
|
||||
acpi_boot_table_init();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
check_acpi_pci(); /* Checks more than just ACPI actually */
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
acpi_boot_init();
|
||||
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_X86_PC)
|
||||
@@ -1871,6 +1821,8 @@ void __init setup_arch(char **cmdline_p)
|
||||
conswitchp = &dummy_con;
|
||||
#endif
|
||||
}
|
||||
tsc_init();
|
||||
|
||||
xencons_early_setup();
|
||||
}
|
||||
|
||||
@@ -1882,7 +1834,23 @@ xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
#include "setup_arch_post.h"
|
||||
static __init int add_pcspkr(void)
|
||||
{
|
||||
struct platform_device *pd;
|
||||
int ret;
|
||||
|
||||
pd = platform_device_alloc("pcspkr", -1);
|
||||
if (!pd)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add(pd);
|
||||
if (ret)
|
||||
platform_device_put(pd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
device_initcall(add_pcspkr);
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
|
||||
@@ -117,7 +117,17 @@ DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) ____cacheline_aligned = { &init_m
|
||||
|
||||
static inline int __prepare_ICR (unsigned int shortcut, int vector)
|
||||
{
|
||||
return APIC_DM_FIXED | shortcut | vector | APIC_DEST_LOGICAL;
|
||||
unsigned int icr = shortcut | APIC_DEST_LOGICAL;
|
||||
|
||||
switch (vector) {
|
||||
default:
|
||||
icr |= APIC_DM_FIXED | vector;
|
||||
break;
|
||||
case NMI_VECTOR:
|
||||
icr |= APIC_DM_NMI;
|
||||
break;
|
||||
}
|
||||
return icr;
|
||||
}
|
||||
|
||||
static inline int __prepare_ICR2 (unsigned int mask)
|
||||
@@ -483,27 +493,23 @@ void unlock_ipi_call_lock(void)
|
||||
spin_unlock_irq(&call_lock);
|
||||
}
|
||||
|
||||
static struct call_data_struct * call_data;
|
||||
static struct call_data_struct *call_data;
|
||||
|
||||
/*
|
||||
* this function sends a 'generic call function' IPI to all other CPUs
|
||||
* in the system.
|
||||
*/
|
||||
|
||||
int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
||||
int wait)
|
||||
/*
|
||||
* [SUMMARY] Run a function on all other CPUs.
|
||||
* <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 (atomically) until function has completed on other CPUs.
|
||||
* [RETURNS] 0 on success, else a negative status code. Does not return until
|
||||
/**
|
||||
* smp_call_function(): Run a function on all other CPUs.
|
||||
* @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 (atomically) until function has completed on other CPUs.
|
||||
*
|
||||
* Returns 0 on success, else a negative status code. Does not return until
|
||||
* remote CPUs are nearly ready to execute <<func>> or are or have executed.
|
||||
*
|
||||
* You must not call this function with disabled interrupts or from a
|
||||
* hardware interrupt handler or from a bottom half handler.
|
||||
*/
|
||||
int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
||||
int wait)
|
||||
{
|
||||
struct call_data_struct data;
|
||||
int cpus;
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/smp_alt.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/string.h>
|
||||
|
||||
struct smp_replacement_record {
|
||||
unsigned char targ_size;
|
||||
unsigned char smp1_size;
|
||||
unsigned char smp2_size;
|
||||
unsigned char up_size;
|
||||
unsigned char feature;
|
||||
unsigned char data[0];
|
||||
};
|
||||
|
||||
struct smp_alternative_record {
|
||||
void *targ_start;
|
||||
struct smp_replacement_record *repl;
|
||||
};
|
||||
|
||||
extern struct smp_alternative_record __start_smp_alternatives_table,
|
||||
__stop_smp_alternatives_table;
|
||||
extern unsigned long __init_begin, __init_end;
|
||||
|
||||
void prepare_for_smp(void)
|
||||
{
|
||||
struct smp_alternative_record *r;
|
||||
printk(KERN_INFO "Enabling SMP...\n");
|
||||
for (r = &__start_smp_alternatives_table;
|
||||
r != &__stop_smp_alternatives_table;
|
||||
r++) {
|
||||
BUG_ON(r->repl->targ_size < r->repl->smp1_size);
|
||||
BUG_ON(r->repl->targ_size < r->repl->smp2_size);
|
||||
BUG_ON(r->repl->targ_size < r->repl->up_size);
|
||||
if (system_state == SYSTEM_RUNNING &&
|
||||
r->targ_start >= (void *)&__init_begin &&
|
||||
r->targ_start < (void *)&__init_end)
|
||||
continue;
|
||||
if (r->repl->feature != (unsigned char)-1 &&
|
||||
boot_cpu_has(r->repl->feature)) {
|
||||
memcpy(r->targ_start,
|
||||
r->repl->data + r->repl->smp1_size,
|
||||
r->repl->smp2_size);
|
||||
memset(r->targ_start + r->repl->smp2_size,
|
||||
0x90,
|
||||
r->repl->targ_size - r->repl->smp2_size);
|
||||
} else {
|
||||
memcpy(r->targ_start,
|
||||
r->repl->data,
|
||||
r->repl->smp1_size);
|
||||
memset(r->targ_start + r->repl->smp1_size,
|
||||
0x90,
|
||||
r->repl->targ_size - r->repl->smp1_size);
|
||||
}
|
||||
}
|
||||
/* Paranoia */
|
||||
asm volatile ("jmp 1f\n1:");
|
||||
mb();
|
||||
}
|
||||
|
||||
void unprepare_for_smp(void)
|
||||
{
|
||||
struct smp_alternative_record *r;
|
||||
printk(KERN_INFO "Disabling SMP...\n");
|
||||
for (r = &__start_smp_alternatives_table;
|
||||
r != &__stop_smp_alternatives_table;
|
||||
r++) {
|
||||
BUG_ON(r->repl->targ_size < r->repl->smp1_size);
|
||||
BUG_ON(r->repl->targ_size < r->repl->smp2_size);
|
||||
BUG_ON(r->repl->targ_size < r->repl->up_size);
|
||||
if (system_state == SYSTEM_RUNNING &&
|
||||
r->targ_start >= (void *)&__init_begin &&
|
||||
r->targ_start < (void *)&__init_end)
|
||||
continue;
|
||||
memcpy(r->targ_start,
|
||||
r->repl->data + r->repl->smp1_size + r->repl->smp2_size,
|
||||
r->repl->up_size);
|
||||
memset(r->targ_start + r->repl->up_size,
|
||||
0x90,
|
||||
r->repl->targ_size - r->repl->up_size);
|
||||
}
|
||||
/* Paranoia */
|
||||
asm volatile ("jmp 1f\n1:");
|
||||
mb();
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -47,10 +47,8 @@ EXPORT_SYMBOL(swiotlb);
|
||||
*/
|
||||
#define IO_TLB_SHIFT 11
|
||||
|
||||
/* Width of DMA addresses. 30 bits is a b44 limitation. */
|
||||
#define DEFAULT_DMA_BITS 30
|
||||
int swiotlb_force;
|
||||
|
||||
static int swiotlb_force;
|
||||
static char *iotlb_virt_start;
|
||||
static unsigned long iotlb_nslabs;
|
||||
|
||||
@@ -98,11 +96,12 @@ static struct phys_addr {
|
||||
*/
|
||||
static DEFINE_SPINLOCK(io_tlb_lock);
|
||||
|
||||
unsigned int dma_bits = DEFAULT_DMA_BITS;
|
||||
static unsigned int dma_bits;
|
||||
static unsigned int __initdata max_dma_bits = 32;
|
||||
static int __init
|
||||
setup_dma_bits(char *str)
|
||||
{
|
||||
dma_bits = simple_strtoul(str, NULL, 0);
|
||||
max_dma_bits = simple_strtoul(str, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
__setup("dma_bits=", setup_dma_bits);
|
||||
@@ -143,6 +142,7 @@ void
|
||||
swiotlb_init_with_default_size (size_t default_size)
|
||||
{
|
||||
unsigned long i, bytes;
|
||||
int rc;
|
||||
|
||||
if (!iotlb_nslabs) {
|
||||
iotlb_nslabs = (default_size >> IO_TLB_SHIFT);
|
||||
@@ -159,16 +159,33 @@ swiotlb_init_with_default_size (size_t default_size)
|
||||
*/
|
||||
iotlb_virt_start = alloc_bootmem_low_pages(bytes);
|
||||
if (!iotlb_virt_start)
|
||||
panic("Cannot allocate SWIOTLB buffer!\n"
|
||||
"Use dom0_mem Xen boot parameter to reserve\n"
|
||||
"some DMA memory (e.g., dom0_mem=-128M).\n");
|
||||
panic("Cannot allocate SWIOTLB buffer!\n");
|
||||
|
||||
dma_bits = get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT) + PAGE_SHIFT;
|
||||
for (i = 0; i < iotlb_nslabs; i += IO_TLB_SEGSIZE) {
|
||||
int rc = xen_create_contiguous_region(
|
||||
(unsigned long)iotlb_virt_start + (i << IO_TLB_SHIFT),
|
||||
get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT),
|
||||
dma_bits);
|
||||
BUG_ON(rc);
|
||||
do {
|
||||
rc = xen_create_contiguous_region(
|
||||
(unsigned long)iotlb_virt_start + (i << IO_TLB_SHIFT),
|
||||
get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT),
|
||||
dma_bits);
|
||||
} while (rc && dma_bits++ < max_dma_bits);
|
||||
if (rc) {
|
||||
if (i == 0)
|
||||
panic("No suitable physical memory available for SWIOTLB buffer!\n"
|
||||
"Use dom0_mem Xen boot parameter to reserve\n"
|
||||
"some DMA memory (e.g., dom0_mem=-128M).\n");
|
||||
iotlb_nslabs = i;
|
||||
i <<= IO_TLB_SHIFT;
|
||||
free_bootmem(__pa(iotlb_virt_start + i), bytes - i);
|
||||
bytes = i;
|
||||
for (dma_bits = 0; i > 0; i -= IO_TLB_SEGSIZE << IO_TLB_SHIFT) {
|
||||
unsigned int bits = fls64(virt_to_bus(iotlb_virt_start + i - 1));
|
||||
|
||||
if (bits > dma_bits)
|
||||
dma_bits = bits;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -186,17 +203,27 @@ swiotlb_init_with_default_size (size_t default_size)
|
||||
* Get the overflow emergency buffer
|
||||
*/
|
||||
io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow);
|
||||
if (!io_tlb_overflow_buffer)
|
||||
panic("Cannot allocate SWIOTLB overflow buffer!\n");
|
||||
|
||||
do {
|
||||
rc = xen_create_contiguous_region(
|
||||
(unsigned long)io_tlb_overflow_buffer,
|
||||
get_order(io_tlb_overflow),
|
||||
dma_bits);
|
||||
} while (rc && dma_bits++ < max_dma_bits);
|
||||
if (rc)
|
||||
panic("No suitable physical memory available for SWIOTLB overflow buffer!\n");
|
||||
|
||||
iotlb_pfn_start = __pa(iotlb_virt_start) >> PAGE_SHIFT;
|
||||
iotlb_pfn_end = iotlb_pfn_start + (bytes >> PAGE_SHIFT);
|
||||
|
||||
printk(KERN_INFO "Software IO TLB enabled: \n"
|
||||
" Aperture: %lu megabytes\n"
|
||||
" Kernel range: 0x%016lx - 0x%016lx\n"
|
||||
" Kernel range: %p - %p\n"
|
||||
" Address size: %u bits\n",
|
||||
bytes >> 20,
|
||||
(unsigned long)iotlb_virt_start,
|
||||
(unsigned long)iotlb_virt_start + bytes,
|
||||
iotlb_virt_start, iotlb_virt_start + bytes,
|
||||
dma_bits);
|
||||
}
|
||||
|
||||
@@ -238,9 +265,12 @@ __sync_single(struct phys_addr buffer, char *dma_addr, size_t size, int dir)
|
||||
char *dev, *host, *kmp;
|
||||
len = size;
|
||||
while (len != 0) {
|
||||
unsigned long flags;
|
||||
|
||||
if (((bytes = len) + buffer.offset) > PAGE_SIZE)
|
||||
bytes = PAGE_SIZE - buffer.offset;
|
||||
kmp = kmap_atomic(buffer.page, KM_SWIOTLB);
|
||||
local_irq_save(flags); /* protects KM_BOUNCE_READ */
|
||||
kmp = kmap_atomic(buffer.page, KM_BOUNCE_READ);
|
||||
dev = dma_addr + size - len;
|
||||
host = kmp + buffer.offset;
|
||||
if (dir == DMA_FROM_DEVICE) {
|
||||
@@ -248,7 +278,8 @@ __sync_single(struct phys_addr buffer, char *dma_addr, size_t size, int dir)
|
||||
/* inaccessible */;
|
||||
} else
|
||||
memcpy(dev, host, bytes);
|
||||
kunmap_atomic(kmp, KM_SWIOTLB);
|
||||
kunmap_atomic(kmp, KM_BOUNCE_READ);
|
||||
local_irq_restore(flags);
|
||||
len -= bytes;
|
||||
buffer.page++;
|
||||
buffer.offset = 0;
|
||||
@@ -617,6 +648,8 @@ swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,
|
||||
sg->dma_length, dir);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
|
||||
dma_addr_t
|
||||
swiotlb_map_page(struct device *hwdev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
@@ -650,6 +683,8 @@ swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address,
|
||||
unmap_single(hwdev, bus_to_virt(dma_address), size, direction);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
swiotlb_dma_mapping_error(dma_addr_t dma_addr)
|
||||
{
|
||||
@@ -677,7 +712,5 @@ EXPORT_SYMBOL(swiotlb_sync_single_for_cpu);
|
||||
EXPORT_SYMBOL(swiotlb_sync_single_for_device);
|
||||
EXPORT_SYMBOL(swiotlb_sync_sg_for_cpu);
|
||||
EXPORT_SYMBOL(swiotlb_sync_sg_for_device);
|
||||
EXPORT_SYMBOL(swiotlb_map_page);
|
||||
EXPORT_SYMBOL(swiotlb_unmap_page);
|
||||
EXPORT_SYMBOL(swiotlb_dma_mapping_error);
|
||||
EXPORT_SYMBOL(swiotlb_dma_supported);
|
||||
@@ -2,6 +2,8 @@
|
||||
* linux/arch/i386/kernel/sysenter.c
|
||||
*
|
||||
* (C) Copyright 2002 Linus Torvalds
|
||||
* Portions based on the vdso-randomization code from exec-shield:
|
||||
* Copyright(C) 2005-2006, Red Hat, Inc., Ingo Molnar
|
||||
*
|
||||
* This file contains the needed initializations to support sysenter.
|
||||
*/
|
||||
@@ -14,6 +16,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/elf.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/msr.h>
|
||||
@@ -24,6 +27,23 @@
|
||||
#include <xen/interface/callback.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Should the kernel map a VDSO page into processes and pass its
|
||||
* address down to glibc upon exec()?
|
||||
*/
|
||||
unsigned int __read_mostly vdso_enabled = 1;
|
||||
|
||||
EXPORT_SYMBOL_GPL(vdso_enabled);
|
||||
|
||||
static int __init vdso_setup(char *s)
|
||||
{
|
||||
vdso_enabled = simple_strtoul(s, NULL, 0);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("vdso=", vdso_setup);
|
||||
|
||||
extern asmlinkage void sysenter_entry(void);
|
||||
|
||||
void enable_sep_cpu(void)
|
||||
@@ -70,22 +90,32 @@ int __init sysenter_setup(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_SEP)) {
|
||||
#ifdef CONFIG_COMPAT_VDSO
|
||||
__set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
|
||||
printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
|
||||
#else
|
||||
/*
|
||||
* In the non-compat case the ELF coredumping code needs the fixmap:
|
||||
*/
|
||||
__set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_KERNEL_RO);
|
||||
#endif
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_SEP)) {
|
||||
memcpy(syscall_page,
|
||||
&vsyscall_sysenter_start,
|
||||
&vsyscall_sysenter_end - &vsyscall_sysenter_start);
|
||||
&vsyscall_int80_start,
|
||||
&vsyscall_int80_end - &vsyscall_int80_start);
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy(syscall_page,
|
||||
&vsyscall_int80_start,
|
||||
&vsyscall_int80_end - &vsyscall_int80_start);
|
||||
&vsyscall_sysenter_start,
|
||||
&vsyscall_sysenter_end - &vsyscall_sysenter_start);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct page*
|
||||
syscall_nopage(struct vm_area_struct *vma, unsigned long adr, int *type)
|
||||
static struct page *syscall_nopage(struct vm_area_struct *vma,
|
||||
unsigned long adr, int *type)
|
||||
{
|
||||
struct page *p = virt_to_page(adr - vma->vm_start + syscall_page);
|
||||
get_page(p);
|
||||
@@ -102,21 +132,32 @@ static struct vm_operations_struct syscall_vm_ops = {
|
||||
.nopage = syscall_nopage,
|
||||
};
|
||||
|
||||
/* Defined in vsyscall-sysenter.S */
|
||||
extern void SYSENTER_RETURN;
|
||||
|
||||
/* Setup a VMA at program startup for the vsyscall page */
|
||||
int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
|
||||
{
|
||||
struct vm_area_struct *vma;
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long addr;
|
||||
int ret;
|
||||
|
||||
vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
|
||||
if (!vma)
|
||||
return -ENOMEM;
|
||||
down_write(&mm->mmap_sem);
|
||||
addr = get_unmapped_area(NULL, 0, PAGE_SIZE, 0, 0);
|
||||
if (IS_ERR_VALUE(addr)) {
|
||||
ret = addr;
|
||||
goto up_fail;
|
||||
}
|
||||
|
||||
memset(vma, 0, sizeof(struct vm_area_struct));
|
||||
/* Could randomize here */
|
||||
vma->vm_start = VSYSCALL_BASE;
|
||||
vma->vm_end = VSYSCALL_BASE + PAGE_SIZE;
|
||||
vma = kmem_cache_zalloc(vm_area_cachep, SLAB_KERNEL);
|
||||
if (!vma) {
|
||||
ret = -ENOMEM;
|
||||
goto up_fail;
|
||||
}
|
||||
|
||||
vma->vm_start = addr;
|
||||
vma->vm_end = addr + PAGE_SIZE;
|
||||
/* MAYWRITE to allow gdb to COW and set breakpoints */
|
||||
vma->vm_flags = VM_READ|VM_EXEC|VM_MAYREAD|VM_MAYEXEC|VM_MAYWRITE;
|
||||
vma->vm_flags |= mm->def_flags;
|
||||
@@ -124,15 +165,26 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int exstack)
|
||||
vma->vm_ops = &syscall_vm_ops;
|
||||
vma->vm_mm = mm;
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
if ((ret = insert_vm_struct(mm, vma))) {
|
||||
up_write(&mm->mmap_sem);
|
||||
ret = insert_vm_struct(mm, vma);
|
||||
if (unlikely(ret)) {
|
||||
kmem_cache_free(vm_area_cachep, vma);
|
||||
return ret;
|
||||
goto up_fail;
|
||||
}
|
||||
|
||||
current->mm->context.vdso = (void *)addr;
|
||||
current_thread_info()->sysenter_return =
|
||||
(void *)VDSO_SYM(&SYSENTER_RETURN);
|
||||
mm->total_vm++;
|
||||
up_fail:
|
||||
up_write(&mm->mmap_sem);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
const char *arch_vma_name(struct vm_area_struct *vma)
|
||||
{
|
||||
if (vma->vm_mm && vma->vm_start == (long)vma->vm_mm->context.vdso)
|
||||
return "[vdso]";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
|
||||
|
||||
@@ -65,7 +65,6 @@
|
||||
#include "mach_time.h"
|
||||
|
||||
#include <linux/timex.h>
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <asm/hpet.h>
|
||||
|
||||
@@ -97,17 +96,9 @@ extern unsigned long wall_jiffies;
|
||||
DEFINE_SPINLOCK(rtc_lock);
|
||||
EXPORT_SYMBOL(rtc_lock);
|
||||
|
||||
#if defined (__i386__)
|
||||
#include <asm/i8253.h>
|
||||
#endif
|
||||
|
||||
DEFINE_SPINLOCK(i8253_lock);
|
||||
EXPORT_SYMBOL(i8253_lock);
|
||||
|
||||
extern struct init_timer_opts timer_tsc_init;
|
||||
extern struct timer_opts timer_tsc;
|
||||
#define timer_none timer_tsc
|
||||
struct timer_opts *cur_timer __read_mostly = &timer_tsc;
|
||||
|
||||
/* These are peridically updated in shared_info, and then copied here. */
|
||||
struct shadow_time_info {
|
||||
@@ -166,8 +157,7 @@ static int __init __permitted_clock_jitter(char *str)
|
||||
}
|
||||
__setup("permitted_clock_jitter=", __permitted_clock_jitter);
|
||||
|
||||
int tsc_disable __devinitdata = 0;
|
||||
|
||||
#if 0
|
||||
static void delay_tsc(unsigned long loops)
|
||||
{
|
||||
unsigned long bclock, now;
|
||||
@@ -183,6 +173,7 @@ struct timer_opts timer_tsc = {
|
||||
.name = "tsc",
|
||||
.delay = delay_tsc,
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
|
||||
@@ -220,7 +211,7 @@ static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
|
||||
return product;
|
||||
}
|
||||
|
||||
#if defined (__i386__)
|
||||
#if 0 /* defined (__i386__) */
|
||||
int read_current_timer(unsigned long *timer_val)
|
||||
{
|
||||
rdtscl(*timer_val);
|
||||
@@ -527,19 +518,19 @@ static void sync_xen_wallclock(unsigned long dummy)
|
||||
static int set_rtc_mmss(unsigned long nowtime)
|
||||
{
|
||||
int retval;
|
||||
|
||||
WARN_ON(irqs_disabled());
|
||||
unsigned long flags;
|
||||
|
||||
if (independent_wallclock || !is_initial_xendomain())
|
||||
return 0;
|
||||
|
||||
/* gets recalled with irq locally disabled */
|
||||
spin_lock_irq(&rtc_lock);
|
||||
/* XXX - does irqsave resolve this? -johnstul */
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
if (efi_enabled)
|
||||
retval = efi_set_rtc_mmss(nowtime);
|
||||
else
|
||||
retval = mach_set_rtc_mmss(nowtime);
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -570,10 +561,12 @@ unsigned long long monotonic_clock(void)
|
||||
}
|
||||
EXPORT_SYMBOL(monotonic_clock);
|
||||
|
||||
#ifdef __x86_64__
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
return monotonic_clock();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
|
||||
unsigned long profile_pc(struct pt_regs *regs)
|
||||
@@ -587,7 +580,7 @@ unsigned long profile_pc(struct pt_regs *regs)
|
||||
is just accounted to the spinlock function.
|
||||
Better would be to write these functions in assembler again
|
||||
and check exactly. */
|
||||
if (in_lock_functions(pc)) {
|
||||
if (!user_mode_vm(regs) && in_lock_functions(pc)) {
|
||||
char *v = *(char **)regs->rsp;
|
||||
if ((v >= _stext && v <= _etext) ||
|
||||
(v >= _sinittext && v <= _einittext) ||
|
||||
@@ -596,7 +589,7 @@ unsigned long profile_pc(struct pt_regs *regs)
|
||||
return ((unsigned long *)regs->rsp)[1];
|
||||
}
|
||||
#else
|
||||
if (in_lock_functions(pc))
|
||||
if (!user_mode_vm(regs) && in_lock_functions(pc))
|
||||
return *(unsigned long *)(regs->ebp + 4);
|
||||
#endif
|
||||
|
||||
@@ -605,6 +598,11 @@ unsigned long profile_pc(struct pt_regs *regs)
|
||||
EXPORT_SYMBOL(profile_pc);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is the same as the above, except we _also_ save the current
|
||||
* Time Stamp Counter value at the time of the timer interrupt, so that
|
||||
* we later on can estimate the time of day more exactly.
|
||||
*/
|
||||
irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
s64 delta, delta_cpu, stolen, blocked;
|
||||
@@ -613,6 +611,13 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
|
||||
struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu);
|
||||
|
||||
/*
|
||||
* Here we are in the timer irq handler. We just have irqs locally
|
||||
* disabled but we don't know if the timer_bh is running on the other
|
||||
* CPU. We need to avoid to SMP race with it. NOTE: we don' t need
|
||||
* the irq version of write_lock because as just said we have irq
|
||||
* locally disabled. -arca
|
||||
*/
|
||||
write_seqlock(&xtime_lock);
|
||||
|
||||
do {
|
||||
@@ -746,15 +751,16 @@ static void init_missing_ticks_accounting(int cpu)
|
||||
unsigned long get_cmos_time(void)
|
||||
{
|
||||
unsigned long retval;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&rtc_lock);
|
||||
spin_lock_irqsave(&rtc_lock, flags);
|
||||
|
||||
if (efi_enabled)
|
||||
retval = efi_get_time();
|
||||
else
|
||||
retval = mach_get_cmos_time();
|
||||
|
||||
spin_unlock(&rtc_lock);
|
||||
spin_unlock_irqrestore(&rtc_lock, flags);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -812,7 +818,6 @@ void notify_arch_cmos_timer(void)
|
||||
|
||||
static long clock_cmos_diff, sleep_start;
|
||||
|
||||
static struct timer_opts *last_timer;
|
||||
static int timer_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
/*
|
||||
@@ -821,10 +826,6 @@ static int timer_suspend(struct sys_device *dev, pm_message_t state)
|
||||
clock_cmos_diff = -get_cmos_time();
|
||||
clock_cmos_diff += get_seconds();
|
||||
sleep_start = get_cmos_time();
|
||||
last_timer = cur_timer;
|
||||
cur_timer = &timer_none;
|
||||
if (last_timer->suspend)
|
||||
last_timer->suspend(state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -846,10 +847,6 @@ static int timer_resume(struct sys_device *dev)
|
||||
jiffies_64 += sleep_length;
|
||||
wall_jiffies += sleep_length;
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
if (last_timer->resume)
|
||||
last_timer->resume();
|
||||
cur_timer = last_timer;
|
||||
last_timer = NULL;
|
||||
touch_softlockup_watchdog();
|
||||
return 0;
|
||||
}
|
||||
@@ -891,9 +888,6 @@ static void __init hpet_time_init(void)
|
||||
printk("Using HPET for base-timer\n");
|
||||
}
|
||||
|
||||
cur_timer = select_timer();
|
||||
printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
|
||||
|
||||
time_init_hook();
|
||||
}
|
||||
#endif
|
||||
@@ -1014,14 +1008,14 @@ static void start_hz_timer(void)
|
||||
cpu_clear(smp_processor_id(), nohz_cpu_mask);
|
||||
}
|
||||
|
||||
void safe_halt(void)
|
||||
void raw_safe_halt(void)
|
||||
{
|
||||
stop_hz_timer();
|
||||
/* Blocking includes an implicit local_irq_enable(). */
|
||||
HYPERVISOR_block();
|
||||
start_hz_timer();
|
||||
}
|
||||
EXPORT_SYMBOL(safe_halt);
|
||||
EXPORT_SYMBOL(raw_safe_halt);
|
||||
|
||||
void halt(void)
|
||||
{
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
* 'Traps.c' handles hardware traps and faults after we have saved some
|
||||
* state in 'asm.s'.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
@@ -28,6 +27,7 @@
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/unwind.h>
|
||||
|
||||
#ifdef CONFIG_EISA
|
||||
#include <linux/ioport.h>
|
||||
@@ -47,7 +47,7 @@
|
||||
#include <asm/desc.h>
|
||||
#include <asm/i387.h>
|
||||
#include <asm/nmi.h>
|
||||
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/arch_hooks.h>
|
||||
#include <asm/kdebug.h>
|
||||
@@ -98,19 +98,25 @@ asmlinkage void fixup_4gb_segment(void);
|
||||
asmlinkage void machine_check(void);
|
||||
|
||||
static int kstack_depth_to_print = 24;
|
||||
struct notifier_block *i386die_chain;
|
||||
static DEFINE_SPINLOCK(die_notifier_lock);
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
static int call_trace = 1;
|
||||
#else
|
||||
#define call_trace (-1)
|
||||
#endif
|
||||
ATOMIC_NOTIFIER_HEAD(i386die_chain);
|
||||
|
||||
int register_die_notifier(struct notifier_block *nb)
|
||||
{
|
||||
int err = 0;
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&die_notifier_lock, flags);
|
||||
err = notifier_chain_register(&i386die_chain, nb);
|
||||
spin_unlock_irqrestore(&die_notifier_lock, flags);
|
||||
return err;
|
||||
vmalloc_sync_all();
|
||||
return atomic_notifier_chain_register(&i386die_chain, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(register_die_notifier);
|
||||
EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */
|
||||
|
||||
int unregister_die_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return atomic_notifier_chain_unregister(&i386die_chain, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */
|
||||
|
||||
static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
|
||||
{
|
||||
@@ -118,12 +124,14 @@ static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
|
||||
p < (void *)tinfo + THREAD_SIZE - 3;
|
||||
}
|
||||
|
||||
static void print_addr_and_symbol(unsigned long addr, char *log_lvl)
|
||||
/*
|
||||
* Print one address/symbol entries per line.
|
||||
*/
|
||||
static inline void print_addr_and_symbol(unsigned long addr, char *log_lvl)
|
||||
{
|
||||
printk(log_lvl);
|
||||
printk(" [<%08lx>] ", addr);
|
||||
print_symbol("%s", addr);
|
||||
printk("\n");
|
||||
|
||||
print_symbol("%s\n", addr);
|
||||
}
|
||||
|
||||
static inline unsigned long print_context_stack(struct thread_info *tinfo,
|
||||
@@ -136,6 +144,12 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,
|
||||
while (valid_stack_ptr(tinfo, (void *)ebp)) {
|
||||
addr = *(unsigned long *)(ebp + 4);
|
||||
print_addr_and_symbol(addr, log_lvl);
|
||||
/*
|
||||
* break out of recursive entries (such as
|
||||
* end_of_stack_stop_unwind_function):
|
||||
*/
|
||||
if (ebp == *(unsigned long *)ebp)
|
||||
break;
|
||||
ebp = *(unsigned long *)ebp;
|
||||
}
|
||||
#else
|
||||
@@ -148,7 +162,21 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,
|
||||
return ebp;
|
||||
}
|
||||
|
||||
static void show_trace_log_lvl(struct task_struct *task,
|
||||
static asmlinkage int
|
||||
show_trace_unwind(struct unwind_frame_info *info, void *log_lvl)
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
while (unwind(info) == 0 && UNW_PC(info)) {
|
||||
n++;
|
||||
print_addr_and_symbol(UNW_PC(info), log_lvl);
|
||||
if (arch_unw_user_mode(info))
|
||||
break;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *stack, char *log_lvl)
|
||||
{
|
||||
unsigned long ebp;
|
||||
@@ -156,6 +184,36 @@ static void show_trace_log_lvl(struct task_struct *task,
|
||||
if (!task)
|
||||
task = current;
|
||||
|
||||
if (call_trace >= 0) {
|
||||
int unw_ret = 0;
|
||||
struct unwind_frame_info info;
|
||||
|
||||
if (regs) {
|
||||
if (unwind_init_frame_info(&info, task, regs) == 0)
|
||||
unw_ret = show_trace_unwind(&info, log_lvl);
|
||||
} else if (task == current)
|
||||
unw_ret = unwind_init_running(&info, show_trace_unwind, log_lvl);
|
||||
else {
|
||||
if (unwind_init_blocked(&info, task) == 0)
|
||||
unw_ret = show_trace_unwind(&info, log_lvl);
|
||||
}
|
||||
if (unw_ret > 0) {
|
||||
if (call_trace == 1 && !arch_unw_user_mode(&info)) {
|
||||
print_symbol("DWARF2 unwinder stuck at %s\n",
|
||||
UNW_PC(&info));
|
||||
if (UNW_SP(&info) >= PAGE_OFFSET) {
|
||||
printk("Leftover inexact backtrace:\n");
|
||||
stack = (void *)UNW_SP(&info);
|
||||
} else
|
||||
printk("Full inexact backtrace again:\n");
|
||||
} else if (call_trace >= 1)
|
||||
return;
|
||||
else
|
||||
printk("Full inexact backtrace again:\n");
|
||||
} else
|
||||
printk("Inexact backtrace:\n");
|
||||
}
|
||||
|
||||
if (task == current) {
|
||||
/* Grab ebp right from our regs */
|
||||
asm ("movl %%ebp, %0" : "=r" (ebp) : );
|
||||
@@ -172,18 +230,17 @@ static void show_trace_log_lvl(struct task_struct *task,
|
||||
stack = (unsigned long*)context->previous_esp;
|
||||
if (!stack)
|
||||
break;
|
||||
printk(log_lvl);
|
||||
printk(" =======================\n");
|
||||
printk("%s =======================\n", log_lvl);
|
||||
}
|
||||
}
|
||||
|
||||
void show_trace(struct task_struct *task, unsigned long * stack)
|
||||
void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long * stack)
|
||||
{
|
||||
show_trace_log_lvl(task, stack, "");
|
||||
show_trace_log_lvl(task, regs, stack, "");
|
||||
}
|
||||
|
||||
static void show_stack_log_lvl(struct task_struct *task, unsigned long *esp,
|
||||
char *log_lvl)
|
||||
static void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long *esp, char *log_lvl)
|
||||
{
|
||||
unsigned long *stack;
|
||||
int i;
|
||||
@@ -196,26 +253,21 @@ static void show_stack_log_lvl(struct task_struct *task, unsigned long *esp,
|
||||
}
|
||||
|
||||
stack = esp;
|
||||
printk(log_lvl);
|
||||
for(i = 0; i < kstack_depth_to_print; i++) {
|
||||
if (kstack_end(stack))
|
||||
break;
|
||||
if (i && ((i % 8) == 0)) {
|
||||
printk("\n");
|
||||
printk(log_lvl);
|
||||
printk(" ");
|
||||
}
|
||||
if (i && ((i % 8) == 0))
|
||||
printk("\n%s ", log_lvl);
|
||||
printk("%08lx ", *stack++);
|
||||
}
|
||||
printk("\n");
|
||||
printk(log_lvl);
|
||||
printk("Call Trace:\n");
|
||||
show_trace_log_lvl(task, esp, log_lvl);
|
||||
printk("\n%sCall Trace:\n", log_lvl);
|
||||
show_trace_log_lvl(task, regs, esp, log_lvl);
|
||||
}
|
||||
|
||||
void show_stack(struct task_struct *task, unsigned long *esp)
|
||||
{
|
||||
show_stack_log_lvl(task, esp, "");
|
||||
printk(" ");
|
||||
show_stack_log_lvl(task, NULL, esp, "");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -225,7 +277,7 @@ void dump_stack(void)
|
||||
{
|
||||
unsigned long stack;
|
||||
|
||||
show_trace(current, &stack);
|
||||
show_trace(current, NULL, &stack);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
@@ -239,7 +291,7 @@ void show_registers(struct pt_regs *regs)
|
||||
|
||||
esp = (unsigned long) (®s->esp);
|
||||
savesegment(ss, ss);
|
||||
if (user_mode(regs)) {
|
||||
if (user_mode_vm(regs)) {
|
||||
in_kernel = 0;
|
||||
esp = regs->esp;
|
||||
ss = regs->xss & 0xffff;
|
||||
@@ -258,8 +310,9 @@ void show_registers(struct pt_regs *regs)
|
||||
regs->esi, regs->edi, regs->ebp, esp);
|
||||
printk(KERN_EMERG "ds: %04x es: %04x ss: %04x\n",
|
||||
regs->xds & 0xffff, regs->xes & 0xffff, ss);
|
||||
printk(KERN_EMERG "Process %s (pid: %d, threadinfo=%p task=%p)",
|
||||
current->comm, current->pid, current_thread_info(), current);
|
||||
printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)",
|
||||
TASK_COMM_LEN, current->comm, current->pid,
|
||||
current_thread_info(), current, current->thread_info);
|
||||
/*
|
||||
* When in-kernel, we also print out the stack and code at the
|
||||
* time of the fault..
|
||||
@@ -268,7 +321,7 @@ void show_registers(struct pt_regs *regs)
|
||||
u8 __user *eip;
|
||||
|
||||
printk("\n" KERN_EMERG "Stack: ");
|
||||
show_stack_log_lvl(NULL, (unsigned long *)esp, KERN_EMERG);
|
||||
show_stack_log_lvl(NULL, regs, (unsigned long *)esp, KERN_EMERG);
|
||||
|
||||
printk(KERN_EMERG "Code: ");
|
||||
|
||||
@@ -291,35 +344,35 @@ void show_registers(struct pt_regs *regs)
|
||||
|
||||
static void handle_BUG(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long eip = regs->eip;
|
||||
unsigned short ud2;
|
||||
unsigned short line;
|
||||
char *file;
|
||||
char c;
|
||||
unsigned long eip;
|
||||
|
||||
eip = regs->eip;
|
||||
|
||||
if (eip < PAGE_OFFSET)
|
||||
goto no_bug;
|
||||
return;
|
||||
if (__get_user(ud2, (unsigned short __user *)eip))
|
||||
goto no_bug;
|
||||
return;
|
||||
if (ud2 != 0x0b0f)
|
||||
goto no_bug;
|
||||
if (__get_user(line, (unsigned short __user *)(eip + 2)))
|
||||
goto bug;
|
||||
if (__get_user(file, (char * __user *)(eip + 4)) ||
|
||||
(unsigned long)file < PAGE_OFFSET || __get_user(c, file))
|
||||
file = "<bad filename>";
|
||||
return;
|
||||
|
||||
printk(KERN_EMERG "------------[ cut here ]------------\n");
|
||||
printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line);
|
||||
|
||||
no_bug:
|
||||
return;
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
do {
|
||||
unsigned short line;
|
||||
char *file;
|
||||
char c;
|
||||
|
||||
/* Here we know it was a BUG but file-n-line is unavailable */
|
||||
bug:
|
||||
printk(KERN_EMERG "Kernel BUG\n");
|
||||
if (__get_user(line, (unsigned short __user *)(eip + 2)))
|
||||
break;
|
||||
if (__get_user(file, (char * __user *)(eip + 4)) ||
|
||||
(unsigned long)file < PAGE_OFFSET || __get_user(c, file))
|
||||
file = "<bad filename>";
|
||||
|
||||
printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line);
|
||||
return;
|
||||
} while (0);
|
||||
#endif
|
||||
printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n");
|
||||
}
|
||||
|
||||
/* This is gone through when something in the kernel
|
||||
@@ -339,6 +392,8 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
static int die_counter;
|
||||
unsigned long flags;
|
||||
|
||||
oops_enter();
|
||||
|
||||
if (die.lock_owner != raw_smp_processor_id()) {
|
||||
console_verbose();
|
||||
spin_lock_irqsave(&die.lock, flags);
|
||||
@@ -351,6 +406,9 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
|
||||
if (++die.lock_owner_depth < 3) {
|
||||
int nl = 0;
|
||||
unsigned long esp;
|
||||
unsigned short ss;
|
||||
|
||||
handle_BUG(regs);
|
||||
printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
|
||||
#ifdef CONFIG_PREEMPT
|
||||
@@ -371,8 +429,23 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
#endif
|
||||
if (nl)
|
||||
printk("\n");
|
||||
notify_die(DIE_OOPS, (char *)str, regs, err, 255, SIGSEGV);
|
||||
show_registers(regs);
|
||||
if (notify_die(DIE_OOPS, str, regs, err,
|
||||
current->thread.trap_no, SIGSEGV) !=
|
||||
NOTIFY_STOP) {
|
||||
show_registers(regs);
|
||||
/* Executive summary in case the oops scrolled away */
|
||||
esp = (unsigned long) (®s->esp);
|
||||
savesegment(ss, ss);
|
||||
if (user_mode(regs)) {
|
||||
esp = regs->esp;
|
||||
ss = regs->xss & 0xffff;
|
||||
}
|
||||
printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
|
||||
print_symbol("%s", regs->eip);
|
||||
printk(" SS:ESP %04x:%08lx\n", ss, esp);
|
||||
}
|
||||
else
|
||||
regs = NULL;
|
||||
} else
|
||||
printk(KERN_EMERG "Recursive die() failure, output suppressed\n");
|
||||
|
||||
@@ -380,17 +453,19 @@ void die(const char * str, struct pt_regs * regs, long err)
|
||||
die.lock_owner = -1;
|
||||
spin_unlock_irqrestore(&die.lock, flags);
|
||||
|
||||
if (!regs)
|
||||
return;
|
||||
|
||||
if (kexec_should_crash(current))
|
||||
crash_kexec(regs);
|
||||
|
||||
if (in_interrupt())
|
||||
panic("Fatal exception in interrupt");
|
||||
|
||||
if (panic_on_oops) {
|
||||
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
|
||||
ssleep(5);
|
||||
if (panic_on_oops)
|
||||
panic("Fatal exception");
|
||||
}
|
||||
|
||||
oops_exit();
|
||||
do_exit(SIGSEGV);
|
||||
}
|
||||
|
||||
@@ -569,7 +644,7 @@ static DEFINE_SPINLOCK(nmi_print_lock);
|
||||
|
||||
void die_nmi (struct pt_regs *regs, const char *msg)
|
||||
{
|
||||
if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 0, SIGINT) ==
|
||||
if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 2, SIGINT) ==
|
||||
NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
@@ -591,7 +666,7 @@ void die_nmi (struct pt_regs *regs, const char *msg)
|
||||
/* If we are in kernel we are probably nested up pretty bad
|
||||
* and might aswell get out now while we still can.
|
||||
*/
|
||||
if (!user_mode(regs)) {
|
||||
if (!user_mode_vm(regs)) {
|
||||
current->thread.trap_no = 2;
|
||||
crash_kexec(regs);
|
||||
}
|
||||
@@ -608,7 +683,7 @@ static void default_do_nmi(struct pt_regs * regs)
|
||||
reason = get_nmi_reason();
|
||||
|
||||
if (!(reason & 0xc0)) {
|
||||
if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 0, SIGINT)
|
||||
if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
|
||||
== NOTIFY_STOP)
|
||||
return;
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
@@ -624,7 +699,7 @@ static void default_do_nmi(struct pt_regs * regs)
|
||||
unknown_nmi_error(reason, regs);
|
||||
return;
|
||||
}
|
||||
if (notify_die(DIE_NMI, "nmi", regs, reason, 0, SIGINT) == NOTIFY_STOP)
|
||||
if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
|
||||
return;
|
||||
if (reason & 0x80)
|
||||
mem_parity_error(reason, regs);
|
||||
@@ -662,6 +737,7 @@ fastcall void do_nmi(struct pt_regs * regs, long error_code)
|
||||
|
||||
void set_nmi_callback(nmi_callback_t callback)
|
||||
{
|
||||
vmalloc_sync_all();
|
||||
rcu_assign_pointer(nmi_callback, callback);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_nmi_callback);
|
||||
@@ -1089,6 +1165,22 @@ void smp_trap_init(trap_info_t *trap_ctxt)
|
||||
static int __init kstack_setup(char *s)
|
||||
{
|
||||
kstack_depth_to_print = simple_strtoul(s, NULL, 0);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
__setup("kstack=", kstack_setup);
|
||||
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
static int __init call_trace_setup(char *s)
|
||||
{
|
||||
if (strcmp(s, "old") == 0)
|
||||
call_trace = -1;
|
||||
else if (strcmp(s, "both") == 0)
|
||||
call_trace = 0;
|
||||
else if (strcmp(s, "newfallback") == 0)
|
||||
call_trace = 1;
|
||||
else if (strcmp(s, "new") == 2)
|
||||
call_trace = 2;
|
||||
return 1;
|
||||
}
|
||||
__setup("call_trace=", call_trace_setup);
|
||||
#endif
|
||||
File diff suppressed because it is too large.
Load diff
@@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/capability.h>
|
||||
#include <linux/config.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
@@ -324,7 +323,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk
|
||||
|
||||
/*call audit_syscall_exit since we do not exit via the normal paths */
|
||||
if (unlikely(current->audit_context))
|
||||
audit_syscall_exit(current, AUDITSC_RESULT(eax), eax);
|
||||
audit_syscall_exit(AUDITSC_RESULT(eax), eax);
|
||||
|
||||
__asm__ __volatile__(
|
||||
"movl %0,%%esp\n\t"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
||||
OUTPUT_ARCH(i386)
|
||||
@@ -40,16 +41,17 @@ SECTIONS
|
||||
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { *(__ex_table) }
|
||||
__stop___ex_table = .;
|
||||
|
||||
. = ALIGN(16);
|
||||
__start_smp_alternatives_table = .;
|
||||
__smp_alternatives : AT(ADDR(__smp_alternatives) - LOAD_OFFSET) { *(__smp_alternatives) }
|
||||
__stop_smp_alternatives_table = .;
|
||||
|
||||
__smp_replacements : AT(ADDR(__smp_replacements) - LOAD_OFFSET) { *(__smp_replacements) }
|
||||
|
||||
RODATA
|
||||
|
||||
. = ALIGN(4);
|
||||
__tracedata_start = .;
|
||||
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
|
||||
*(.tracedata)
|
||||
}
|
||||
__tracedata_end = .;
|
||||
|
||||
/* writeable */
|
||||
. = ALIGN(4096);
|
||||
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
|
||||
*(.data)
|
||||
CONSTRUCTORS
|
||||
@@ -76,11 +78,40 @@ SECTIONS
|
||||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) }
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
. = ALIGN(4);
|
||||
.eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) {
|
||||
__start_unwind = .;
|
||||
*(.eh_frame)
|
||||
__end_unwind = .;
|
||||
}
|
||||
#endif
|
||||
|
||||
. = ALIGN(THREAD_SIZE); /* init_task */
|
||||
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
||||
*(.data.init_task)
|
||||
}
|
||||
|
||||
/* might get freed after init */
|
||||
. = ALIGN(4096);
|
||||
__smp_alt_begin = .;
|
||||
__smp_alt_instructions = .;
|
||||
.smp_altinstructions : AT(ADDR(.smp_altinstructions) - LOAD_OFFSET) {
|
||||
*(.smp_altinstructions)
|
||||
}
|
||||
__smp_alt_instructions_end = .;
|
||||
. = ALIGN(4);
|
||||
__smp_locks = .;
|
||||
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
|
||||
*(.smp_locks)
|
||||
}
|
||||
__smp_locks_end = .;
|
||||
.smp_altinstr_replacement : AT(ADDR(.smp_altinstr_replacement) - LOAD_OFFSET) {
|
||||
*(.smp_altinstr_replacement)
|
||||
}
|
||||
. = ALIGN(4096);
|
||||
__smp_alt_end = .;
|
||||
|
||||
/* will be freed after init */
|
||||
. = ALIGN(4096); /* Init code and data */
|
||||
__init_begin = .;
|
||||
@@ -128,7 +159,7 @@ SECTIONS
|
||||
__initramfs_start = .;
|
||||
.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) }
|
||||
__initramfs_end = .;
|
||||
. = ALIGN(32);
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
__per_cpu_start = .;
|
||||
.data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) }
|
||||
__per_cpu_end = .;
|
||||
|
||||
@@ -2,12 +2,18 @@
|
||||
* Machine specific setup for generic
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/arch_hooks.h>
|
||||
#include <asm/e820.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/fixmap.h>
|
||||
|
||||
#include <xen/interface/callback.h>
|
||||
#include <xen/interface/memory.h>
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#define DEFAULT_SEND_IPI (1)
|
||||
@@ -35,3 +41,107 @@ static int __init print_ipi_mode(void)
|
||||
}
|
||||
|
||||
late_initcall(print_ipi_mode);
|
||||
|
||||
/**
|
||||
* machine_specific_memory_setup - Hook for machine specific memory setup.
|
||||
*
|
||||
* Description:
|
||||
* This is included late in kernel/setup.c so that it can make
|
||||
* use of all of the static functions.
|
||||
**/
|
||||
|
||||
char * __init machine_specific_memory_setup(void)
|
||||
{
|
||||
int rc;
|
||||
struct xen_memory_map memmap;
|
||||
/*
|
||||
* This is rather large for a stack variable but this early in
|
||||
* the boot process we know we have plenty slack space.
|
||||
*/
|
||||
struct e820entry map[E820MAX];
|
||||
|
||||
memmap.nr_entries = E820MAX;
|
||||
set_xen_guest_handle(memmap.buffer, map);
|
||||
|
||||
rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
|
||||
if ( rc == -ENOSYS ) {
|
||||
memmap.nr_entries = 1;
|
||||
map[0].addr = 0ULL;
|
||||
map[0].size = PFN_PHYS(xen_start_info->nr_pages);
|
||||
/* 8MB slack (to balance backend allocations). */
|
||||
map[0].size += 8ULL << 20;
|
||||
map[0].type = E820_RAM;
|
||||
rc = 0;
|
||||
}
|
||||
BUG_ON(rc);
|
||||
|
||||
sanitize_e820_map(map, (char *)&memmap.nr_entries);
|
||||
|
||||
BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0);
|
||||
|
||||
return "Xen";
|
||||
}
|
||||
|
||||
|
||||
extern void hypervisor_callback(void);
|
||||
extern void failsafe_callback(void);
|
||||
extern void nmi(void);
|
||||
|
||||
unsigned long *machine_to_phys_mapping;
|
||||
EXPORT_SYMBOL(machine_to_phys_mapping);
|
||||
unsigned int machine_to_phys_order;
|
||||
EXPORT_SYMBOL(machine_to_phys_order);
|
||||
|
||||
void __init machine_specific_arch_setup(void)
|
||||
{
|
||||
int ret;
|
||||
struct xen_machphys_mapping mapping;
|
||||
unsigned long machine_to_phys_nr_ents;
|
||||
struct xen_platform_parameters pp;
|
||||
static struct callback_register __initdata event = {
|
||||
.type = CALLBACKTYPE_event,
|
||||
.address = { __KERNEL_CS, (unsigned long)hypervisor_callback },
|
||||
};
|
||||
static struct callback_register __initdata failsafe = {
|
||||
.type = CALLBACKTYPE_failsafe,
|
||||
.address = { __KERNEL_CS, (unsigned long)failsafe_callback },
|
||||
};
|
||||
static struct callback_register __initdata nmi_cb = {
|
||||
.type = CALLBACKTYPE_nmi,
|
||||
.address = { __KERNEL_CS, (unsigned long)nmi },
|
||||
};
|
||||
|
||||
ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
|
||||
if (ret == 0)
|
||||
ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
|
||||
#ifdef CONFIG_XEN_COMPAT_030002
|
||||
if (ret == -ENOSYS)
|
||||
ret = HYPERVISOR_set_callbacks(
|
||||
event.address.cs, event.address.eip,
|
||||
failsafe.address.cs, failsafe.address.eip);
|
||||
#endif
|
||||
BUG_ON(ret);
|
||||
|
||||
ret = HYPERVISOR_callback_op(CALLBACKOP_register, &nmi_cb);
|
||||
#ifdef CONFIG_XEN_COMPAT_030002
|
||||
if (ret == -ENOSYS) {
|
||||
static struct xennmi_callback __initdata cb = {
|
||||
.handler_address = (unsigned long)nmi
|
||||
};
|
||||
|
||||
HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (HYPERVISOR_xen_version(XENVER_platform_parameters, &pp) == 0)
|
||||
set_fixaddr_top(pp.virt_start);
|
||||
|
||||
machine_to_phys_mapping = (unsigned long *)MACH2PHYS_VIRT_START;
|
||||
machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES;
|
||||
if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) {
|
||||
machine_to_phys_mapping = (unsigned long *)mapping.v_start;
|
||||
machine_to_phys_nr_ents = mapping.max_mfn + 1;
|
||||
}
|
||||
while ((1UL << machine_to_phys_order) < machine_to_phys_nr_ents )
|
||||
machine_to_phys_order++;
|
||||
}
|
||||
@@ -30,6 +30,40 @@
|
||||
|
||||
extern void die(const char *,struct pt_regs *,long);
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain);
|
||||
int register_page_fault_notifier(struct notifier_block *nb)
|
||||
{
|
||||
vmalloc_sync_all();
|
||||
return atomic_notifier_chain_register(¬ify_page_fault_chain, nb);
|
||||
}
|
||||
|
||||
int unregister_page_fault_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return atomic_notifier_chain_unregister(¬ify_page_fault_chain, nb);
|
||||
}
|
||||
|
||||
static inline int notify_page_fault(enum die_val val, const char *str,
|
||||
struct pt_regs *regs, long err, int trap, int sig)
|
||||
{
|
||||
struct die_args args = {
|
||||
.regs = regs,
|
||||
.str = str,
|
||||
.err = err,
|
||||
.trapnr = trap,
|
||||
.signr = sig
|
||||
};
|
||||
return atomic_notifier_call_chain(¬ify_page_fault_chain, val, &args);
|
||||
}
|
||||
#else
|
||||
static inline int notify_page_fault(enum die_val val, const char *str,
|
||||
struct pt_regs *regs, long err, int trap, int sig)
|
||||
{
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Unlock any spinlocks which will prevent us from getting the
|
||||
* message out
|
||||
@@ -77,12 +111,15 @@ static inline unsigned long get_segment_eip(struct pt_regs *regs,
|
||||
unsigned seg = regs->xcs & 0xffff;
|
||||
u32 seg_ar, seg_limit, base, *desc;
|
||||
|
||||
/* Unlikely, but must come before segment checks. */
|
||||
if (unlikely(regs->eflags & VM_MASK)) {
|
||||
base = seg << 4;
|
||||
*eip_limit = base + 0xffff;
|
||||
return base + (eip & 0xffff);
|
||||
}
|
||||
|
||||
/* The standard kernel/user address space limit. */
|
||||
*eip_limit = (seg & 2) ? USER_DS.seg : KERNEL_DS.seg;
|
||||
|
||||
/* Unlikely, but must come before segment checks. */
|
||||
if (unlikely((regs->eflags & VM_MASK) != 0))
|
||||
return eip + (seg << 4);
|
||||
|
||||
/* By far the most common cases. */
|
||||
if (likely(seg == __USER_CS || seg == GET_KERNEL_CS()))
|
||||
@@ -225,16 +262,19 @@ static void dump_fault_path(unsigned long address)
|
||||
p += (address >> 30) * 2;
|
||||
printk(KERN_ALERT "%08lx -> *pde = %08lx:%08lx\n", page, p[1], p[0]);
|
||||
if (p[0] & 1) {
|
||||
mfn = (p[0] >> PAGE_SHIFT) | ((p[1] & 0x7) << 20);
|
||||
mfn = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
|
||||
page = mfn_to_pfn(mfn) << PAGE_SHIFT;
|
||||
p = (unsigned long *)__va(page);
|
||||
address &= 0x3fffffff;
|
||||
p += (address >> 21) * 2;
|
||||
printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n",
|
||||
page, p[1], p[0]);
|
||||
#ifndef CONFIG_HIGHPTE
|
||||
mfn = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
|
||||
#ifdef CONFIG_HIGHPTE
|
||||
if (mfn_to_pfn(mfn) >= highstart_pfn)
|
||||
return;
|
||||
#endif
|
||||
if (p[0] & 1) {
|
||||
mfn = (p[0] >> PAGE_SHIFT) | ((p[1] & 0x7) << 20);
|
||||
page = mfn_to_pfn(mfn) << PAGE_SHIFT;
|
||||
p = (unsigned long *) __va(page);
|
||||
address &= 0x001fffff;
|
||||
@@ -242,7 +282,6 @@ static void dump_fault_path(unsigned long address)
|
||||
printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n",
|
||||
page, p[1], p[0]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#else
|
||||
@@ -252,16 +291,20 @@ static void dump_fault_path(unsigned long address)
|
||||
|
||||
page = read_cr3();
|
||||
page = ((unsigned long *) __va(page))[address >> 22];
|
||||
printk(KERN_ALERT "*pde = ma %08lx pa %08lx\n", page,
|
||||
machine_to_phys(page));
|
||||
if (oops_may_print())
|
||||
printk(KERN_ALERT "*pde = ma %08lx pa %08lx\n", page,
|
||||
machine_to_phys(page));
|
||||
/*
|
||||
* We must not directly access the pte in the highpte
|
||||
* case, the page table might be allocated in highmem.
|
||||
* case if the page table is located in highmem.
|
||||
* And lets rather not kmap-atomic the pte, just in case
|
||||
* it's allocated already.
|
||||
*/
|
||||
#ifndef CONFIG_HIGHPTE
|
||||
if (page & 1) {
|
||||
#ifdef CONFIG_HIGHPTE
|
||||
if ((page >> PAGE_SHIFT) >= highstart_pfn)
|
||||
return;
|
||||
#endif
|
||||
if ((page & 1) && oops_may_print()) {
|
||||
page &= PAGE_MASK;
|
||||
address &= 0x003ff000;
|
||||
page = machine_to_phys(page);
|
||||
@@ -269,7 +312,6 @@ static void dump_fault_path(unsigned long address)
|
||||
printk(KERN_ALERT "*pte = ma %08lx pa %08lx\n", page,
|
||||
machine_to_phys(page));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -311,6 +353,76 @@ static int spurious_fault(struct pt_regs *regs,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
|
||||
{
|
||||
unsigned index = pgd_index(address);
|
||||
pgd_t *pgd_k;
|
||||
pud_t *pud, *pud_k;
|
||||
pmd_t *pmd, *pmd_k;
|
||||
|
||||
pgd += index;
|
||||
pgd_k = init_mm.pgd + index;
|
||||
|
||||
if (!pgd_present(*pgd_k))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* set_pgd(pgd, *pgd_k); here would be useless on PAE
|
||||
* and redundant with the set_pmd() on non-PAE. As would
|
||||
* set_pud.
|
||||
*/
|
||||
|
||||
pud = pud_offset(pgd, address);
|
||||
pud_k = pud_offset(pgd_k, address);
|
||||
if (!pud_present(*pud_k))
|
||||
return NULL;
|
||||
|
||||
pmd = pmd_offset(pud, address);
|
||||
pmd_k = pmd_offset(pud_k, address);
|
||||
if (!pmd_present(*pmd_k))
|
||||
return NULL;
|
||||
if (!pmd_present(*pmd))
|
||||
#ifndef CONFIG_XEN
|
||||
set_pmd(pmd, *pmd_k);
|
||||
#else
|
||||
/*
|
||||
* When running on Xen we must launder *pmd_k through
|
||||
* pmd_val() to ensure that _PAGE_PRESENT is correctly set.
|
||||
*/
|
||||
set_pmd(pmd, __pmd(pmd_val(*pmd_k)));
|
||||
#endif
|
||||
else
|
||||
BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k));
|
||||
return pmd_k;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle a fault on the vmalloc or module mapping area
|
||||
*
|
||||
* This assumes no large pages in there.
|
||||
*/
|
||||
static inline int vmalloc_fault(unsigned long address)
|
||||
{
|
||||
unsigned long pgd_paddr;
|
||||
pmd_t *pmd_k;
|
||||
pte_t *pte_k;
|
||||
/*
|
||||
* Synchronize this task's top level page-table
|
||||
* with the 'reference' page table.
|
||||
*
|
||||
* Do _not_ use "current" here. We might be inside
|
||||
* an interrupt in the middle of a task switch..
|
||||
*/
|
||||
pgd_paddr = read_cr3();
|
||||
pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
|
||||
if (!pmd_k)
|
||||
return -1;
|
||||
pte_k = pte_offset_kernel(pmd_k, address);
|
||||
if (!pte_present(*pte_k))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine handles page faults. It determines the address,
|
||||
* and the problem, and then passes it off to one of the appropriate
|
||||
@@ -320,6 +432,8 @@ static int spurious_fault(struct pt_regs *regs,
|
||||
* bit 0 == 0 means no page found, 1 means protection fault
|
||||
* bit 1 == 0 means read, 1 means write
|
||||
* bit 2 == 0 means kernel, 1 means user-mode
|
||||
* bit 3 == 1 means use of reserved bit detected
|
||||
* bit 4 == 1 means fault was an instruction fetch
|
||||
*/
|
||||
fastcall void __kprobes do_page_fault(struct pt_regs *regs,
|
||||
unsigned long error_code)
|
||||
@@ -339,13 +453,6 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
|
||||
if (regs->eflags & X86_EFLAGS_VM)
|
||||
error_code |= 4;
|
||||
|
||||
if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
|
||||
SIGSEGV) == NOTIFY_STOP)
|
||||
return;
|
||||
/* It's safe to allow irq's after cr2 has been saved */
|
||||
if (regs->eflags & (X86_EFLAGS_IF|VM_MASK))
|
||||
local_irq_enable();
|
||||
|
||||
tsk = current;
|
||||
|
||||
si_code = SEGV_MAPERR;
|
||||
@@ -361,25 +468,37 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
|
||||
*
|
||||
* This verifies that the fault happens in kernel space
|
||||
* (error_code & 4) == 0, and that the fault was not a
|
||||
* protection error (error_code & 1) == 0.
|
||||
* protection error (error_code & 9) == 0.
|
||||
*/
|
||||
if (unlikely(address >= TASK_SIZE)) {
|
||||
if (unlikely(address >= TASK_SIZE)) {
|
||||
#ifdef CONFIG_XEN
|
||||
/* Faults in hypervisor area can never be patched up. */
|
||||
if (address >= hypervisor_virt_start)
|
||||
goto bad_area_nosemaphore;
|
||||
#endif
|
||||
if (!(error_code & 5))
|
||||
goto vmalloc_fault;
|
||||
if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0)
|
||||
return;
|
||||
/* Can take a spurious fault if mapping changes R/O -> R/W. */
|
||||
if (spurious_fault(regs, address, error_code))
|
||||
return;
|
||||
if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
|
||||
SIGSEGV) == NOTIFY_STOP)
|
||||
return;
|
||||
/*
|
||||
* Don't take the mm semaphore here. If we fixup a prefetch
|
||||
* fault we could otherwise deadlock.
|
||||
*/
|
||||
goto bad_area_nosemaphore;
|
||||
}
|
||||
}
|
||||
|
||||
if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
|
||||
SIGSEGV) == NOTIFY_STOP)
|
||||
return;
|
||||
|
||||
/* It's safe to allow irq's after cr2 has been saved and the vmalloc
|
||||
fault has been handled. */
|
||||
if (regs->eflags & (X86_EFLAGS_IF|VM_MASK))
|
||||
local_irq_enable();
|
||||
|
||||
mm = tsk->mm;
|
||||
|
||||
@@ -393,7 +512,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
|
||||
/* When running in the kernel we expect faults to occur only to
|
||||
* addresses in user space. All other faults represent errors in the
|
||||
* kernel and should generate an OOPS. Unfortunatly, in the case of an
|
||||
* erroneous fault occuring in a code path which already holds mmap_sem
|
||||
* erroneous fault occurring in a code path which already holds mmap_sem
|
||||
* we will deadlock attempting to validate the fault against the
|
||||
* address space. Luckily the kernel only validly references user
|
||||
* space from well defined areas of code, which are listed in the
|
||||
@@ -421,12 +540,12 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
|
||||
goto bad_area;
|
||||
if (error_code & 4) {
|
||||
/*
|
||||
* accessing the stack below %esp is always a bug.
|
||||
* The "+ 32" is there due to some instructions (like
|
||||
* pusha) doing post-decrement on the stack and that
|
||||
* doesn't show up until later..
|
||||
* Accessing the stack below %esp is always a bug.
|
||||
* The large cushion allows instructions like enter
|
||||
* and pusha to work. ("enter $65535,$31" pushes
|
||||
* 32 pointers and then decrements %esp by 65535.)
|
||||
*/
|
||||
if (address + 32 < regs->esp)
|
||||
if (address + 65536 + 32 * sizeof(unsigned long) < regs->esp)
|
||||
goto bad_area;
|
||||
}
|
||||
if (expand_stack(vma, address))
|
||||
@@ -550,21 +669,27 @@ no_context:
|
||||
|
||||
bust_spinlocks(1);
|
||||
|
||||
#ifdef CONFIG_X86_PAE
|
||||
if (error_code & 16) {
|
||||
pte_t *pte = lookup_address(address);
|
||||
if (oops_may_print()) {
|
||||
#ifdef CONFIG_X86_PAE
|
||||
if (error_code & 16) {
|
||||
pte_t *pte = lookup_address(address);
|
||||
|
||||
if (pte && pte_present(*pte) && !pte_exec_kernel(*pte))
|
||||
printk(KERN_CRIT "kernel tried to execute NX-protected page - exploit attempt? (uid: %d)\n", current->uid);
|
||||
if (pte && pte_present(*pte) && !pte_exec_kernel(*pte))
|
||||
printk(KERN_CRIT "kernel tried to execute "
|
||||
"NX-protected page - exploit attempt? "
|
||||
"(uid: %d)\n", current->uid);
|
||||
}
|
||||
#endif
|
||||
if (address < PAGE_SIZE)
|
||||
printk(KERN_ALERT "BUG: unable to handle kernel NULL "
|
||||
"pointer dereference");
|
||||
else
|
||||
printk(KERN_ALERT "BUG: unable to handle kernel paging"
|
||||
" request");
|
||||
printk(" at virtual address %08lx\n",address);
|
||||
printk(KERN_ALERT " printing eip:\n");
|
||||
printk("%08lx\n", regs->eip);
|
||||
}
|
||||
#endif
|
||||
if (address < PAGE_SIZE)
|
||||
printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
|
||||
else
|
||||
printk(KERN_ALERT "Unable to handle kernel paging request");
|
||||
printk(" at virtual address %08lx\n",address);
|
||||
printk(KERN_ALERT " printing eip:\n");
|
||||
printk("%08lx\n", regs->eip);
|
||||
dump_fault_path(address);
|
||||
tsk->thread.cr2 = address;
|
||||
tsk->thread.trap_no = 14;
|
||||
@@ -604,59 +729,41 @@ do_sigbus:
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_no = 14;
|
||||
force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk);
|
||||
return;
|
||||
}
|
||||
|
||||
vmalloc_fault:
|
||||
{
|
||||
/*
|
||||
* Synchronize this task's top level page-table
|
||||
* with the 'reference' page table.
|
||||
*
|
||||
* Do _not_ use "tsk" here. We might be inside
|
||||
* an interrupt in the middle of a task switch..
|
||||
*/
|
||||
int index = pgd_index(address);
|
||||
unsigned long pgd_paddr;
|
||||
pgd_t *pgd, *pgd_k;
|
||||
pud_t *pud, *pud_k;
|
||||
pmd_t *pmd, *pmd_k;
|
||||
pte_t *pte_k;
|
||||
#ifndef CONFIG_X86_PAE
|
||||
void vmalloc_sync_all(void)
|
||||
{
|
||||
/*
|
||||
* Note that races in the updates of insync and start aren't
|
||||
* problematic: insync can only get set bits added, and updates to
|
||||
* start are only improving performance (without affecting correctness
|
||||
* if undone).
|
||||
*/
|
||||
static DECLARE_BITMAP(insync, PTRS_PER_PGD);
|
||||
static unsigned long start = TASK_SIZE;
|
||||
unsigned long address;
|
||||
|
||||
pgd_paddr = read_cr3();
|
||||
pgd = index + (pgd_t *)__va(pgd_paddr);
|
||||
pgd_k = init_mm.pgd + index;
|
||||
BUILD_BUG_ON(TASK_SIZE & ~PGDIR_MASK);
|
||||
for (address = start; address >= TASK_SIZE; address += PGDIR_SIZE) {
|
||||
if (!test_bit(pgd_index(address), insync)) {
|
||||
unsigned long flags;
|
||||
struct page *page;
|
||||
|
||||
if (!pgd_present(*pgd_k))
|
||||
goto no_context;
|
||||
|
||||
/*
|
||||
* set_pgd(pgd, *pgd_k); here would be useless on PAE
|
||||
* and redundant with the set_pmd() on non-PAE. As would
|
||||
* set_pud.
|
||||
*/
|
||||
|
||||
pud = pud_offset(pgd, address);
|
||||
pud_k = pud_offset(pgd_k, address);
|
||||
if (!pud_present(*pud_k))
|
||||
goto no_context;
|
||||
|
||||
pmd = pmd_offset(pud, address);
|
||||
pmd_k = pmd_offset(pud_k, address);
|
||||
if (!pmd_present(*pmd_k))
|
||||
goto no_context;
|
||||
#ifndef CONFIG_XEN
|
||||
set_pmd(pmd, *pmd_k);
|
||||
#else
|
||||
/*
|
||||
* When running on Xen we must launder *pmd_k through
|
||||
* pmd_val() to ensure that _PAGE_PRESENT is correctly set.
|
||||
*/
|
||||
set_pmd(pmd, __pmd(pmd_val(*pmd_k)));
|
||||
#endif
|
||||
|
||||
pte_k = pte_offset_kernel(pmd_k, address);
|
||||
if (!pte_present(*pte_k))
|
||||
goto no_context;
|
||||
return;
|
||||
spin_lock_irqsave(&pgd_lock, flags);
|
||||
for (page = pgd_list; page; page =
|
||||
(struct page *)page->index)
|
||||
if (!vmalloc_sync_one(page_address(page),
|
||||
address)) {
|
||||
BUG_ON(page != pgd_list);
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&pgd_lock, flags);
|
||||
if (!page)
|
||||
set_bit(pgd_index(address), insync);
|
||||
}
|
||||
if (address == start && test_bit(pgd_index(address), insync))
|
||||
start = address + PGDIR_SIZE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -55,7 +55,9 @@ void *kmap_atomic(struct page *page, enum km_type type)
|
||||
/* Same as kmap_atomic but with PAGE_KERNEL_RO page protection. */
|
||||
void *kmap_atomic_pte(struct page *page, enum km_type type)
|
||||
{
|
||||
return __kmap_atomic(page, type, PAGE_KERNEL_RO);
|
||||
return __kmap_atomic(page, type,
|
||||
test_bit(PG_pinned, &page->flags)
|
||||
? PAGE_KERNEL_RO : kmap_prot);
|
||||
}
|
||||
|
||||
void kunmap_atomic(void *kvaddr, enum km_type type)
|
||||
@@ -129,5 +131,6 @@ struct page *kmap_atomic_to_page(void *ptr)
|
||||
EXPORT_SYMBOL(kmap);
|
||||
EXPORT_SYMBOL(kunmap);
|
||||
EXPORT_SYMBOL(kmap_atomic);
|
||||
EXPORT_SYMBOL(kmap_atomic_pte);
|
||||
EXPORT_SYMBOL(kunmap_atomic);
|
||||
EXPORT_SYMBOL(kmap_atomic_to_page);
|
||||
@@ -6,7 +6,6 @@
|
||||
* Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
@@ -23,12 +22,14 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/poison.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/memory_hotplug.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
@@ -313,7 +314,7 @@ static void __init permanent_kmaps_init(pgd_t *pgd_base)
|
||||
|
||||
static void __meminit free_new_highpage(struct page *page, int pfn)
|
||||
{
|
||||
set_page_count(page, 1);
|
||||
init_page_count(page);
|
||||
if (pfn < xen_start_info->nr_pages)
|
||||
__free_page(page);
|
||||
totalhigh_pages++;
|
||||
@@ -415,7 +416,7 @@ static void __init pagetable_init (void)
|
||||
permanent_kmaps_init(pgd_base);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOFTWARE_SUSPEND
|
||||
#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_ACPI_SLEEP)
|
||||
/*
|
||||
* Swap suspend & friends need this for resume because things like the intel-agp
|
||||
* driver might have split up a kernel 4MB mapping.
|
||||
@@ -664,7 +665,7 @@ void __init mem_init(void)
|
||||
/* XEN: init and count low-mem pages outside initial allocation. */
|
||||
for (pfn = xen_start_info->nr_pages; pfn < max_low_pfn; pfn++) {
|
||||
ClearPageReserved(pfn_to_page(pfn));
|
||||
set_page_count(pfn_to_page(pfn), 1);
|
||||
init_page_count(pfn_to_page(pfn));
|
||||
totalram_pages++;
|
||||
}
|
||||
|
||||
@@ -721,8 +722,9 @@ void __init mem_init(void)
|
||||
* Specifically, in the case of x86, we will always add
|
||||
* memory to the highmem for now.
|
||||
*/
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
int add_memory(u64 start, u64 size)
|
||||
int arch_add_memory(int nid, u64 start, u64 size)
|
||||
{
|
||||
struct pglist_data *pgdata = &contig_page_data;
|
||||
struct zone *zone = pgdata->node_zones + MAX_NR_ZONES-1;
|
||||
@@ -737,6 +739,7 @@ int remove_memory(u64 start, u64 size)
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
kmem_cache_t *pgd_cache;
|
||||
kmem_cache_t *pmd_cache;
|
||||
@@ -795,33 +798,17 @@ static int noinline do_test_wp_bit(void)
|
||||
return flag;
|
||||
}
|
||||
|
||||
void free_initmem(void)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
addr = (unsigned long)(&__init_begin);
|
||||
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
|
||||
ClearPageReserved(virt_to_page(addr));
|
||||
set_page_count(virt_to_page(addr), 1);
|
||||
memset((void *)addr, 0xcc, PAGE_SIZE);
|
||||
free_page(addr);
|
||||
totalram_pages++;
|
||||
}
|
||||
printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (__init_end - __init_begin) >> 10);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_RODATA
|
||||
|
||||
extern char __start_rodata, __end_rodata;
|
||||
void mark_rodata_ro(void)
|
||||
{
|
||||
unsigned long addr = (unsigned long)&__start_rodata;
|
||||
unsigned long addr = (unsigned long)__start_rodata;
|
||||
|
||||
for (; addr < (unsigned long)&__end_rodata; addr += PAGE_SIZE)
|
||||
for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE)
|
||||
change_page_attr(virt_to_page(addr), 1, PAGE_KERNEL_RO);
|
||||
|
||||
printk ("Write protecting the kernel read-only data: %luk\n",
|
||||
(unsigned long)(&__end_rodata - &__start_rodata) >> 10);
|
||||
printk("Write protecting the kernel read-only data: %uk\n",
|
||||
(__end_rodata - __start_rodata) >> 10);
|
||||
|
||||
/*
|
||||
* change_page_attr() requires a global_flush_tlb() call after it.
|
||||
@@ -833,17 +820,31 @@ void mark_rodata_ro(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void free_init_pages(char *what, unsigned long begin, unsigned long end)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
for (addr = begin; addr < end; addr += PAGE_SIZE) {
|
||||
ClearPageReserved(virt_to_page(addr));
|
||||
init_page_count(virt_to_page(addr));
|
||||
memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
|
||||
free_page(addr);
|
||||
totalram_pages++;
|
||||
}
|
||||
printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
|
||||
}
|
||||
|
||||
void free_initmem(void)
|
||||
{
|
||||
free_init_pages("unused kernel memory",
|
||||
(unsigned long)(&__init_begin),
|
||||
(unsigned long)(&__init_end));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
void free_initrd_mem(unsigned long start, unsigned long end)
|
||||
{
|
||||
if (start < end)
|
||||
printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
|
||||
for (; start < end; start += PAGE_SIZE) {
|
||||
ClearPageReserved(virt_to_page(start));
|
||||
set_page_count(virt_to_page(start), 1);
|
||||
free_page(start);
|
||||
totalram_pages++;
|
||||
}
|
||||
free_init_pages("initrd memory", start, end);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
* linux/arch/i386/mm/pgtable.c
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
@@ -26,7 +25,6 @@
|
||||
#include <asm/mmu_context.h>
|
||||
|
||||
#include <xen/features.h>
|
||||
#include <xen/foreign_page.h>
|
||||
#include <asm/hypervisor.h>
|
||||
|
||||
static void pgd_test_and_unpin(pgd_t *pgd);
|
||||
@@ -39,13 +37,12 @@ void show_mem(void)
|
||||
struct page *page;
|
||||
pg_data_t *pgdat;
|
||||
unsigned long i;
|
||||
struct page_state ps;
|
||||
unsigned long flags;
|
||||
|
||||
printk(KERN_INFO "Mem-info:\n");
|
||||
show_free_areas();
|
||||
printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
for_each_pgdat(pgdat) {
|
||||
for_each_online_pgdat(pgdat) {
|
||||
pgdat_resize_lock(pgdat, &flags);
|
||||
for (i = 0; i < pgdat->node_spanned_pages; ++i) {
|
||||
page = pgdat_page_nr(pgdat, i);
|
||||
@@ -67,12 +64,13 @@ void show_mem(void)
|
||||
printk(KERN_INFO "%d pages shared\n", shared);
|
||||
printk(KERN_INFO "%d pages swap cached\n", cached);
|
||||
|
||||
get_page_state(&ps);
|
||||
printk(KERN_INFO "%lu pages dirty\n", ps.nr_dirty);
|
||||
printk(KERN_INFO "%lu pages writeback\n", ps.nr_writeback);
|
||||
printk(KERN_INFO "%lu pages mapped\n", ps.nr_mapped);
|
||||
printk(KERN_INFO "%lu pages slab\n", ps.nr_slab);
|
||||
printk(KERN_INFO "%lu pages pagetables\n", ps.nr_page_table_pages);
|
||||
printk(KERN_INFO "%lu pages dirty\n", global_page_state(NR_FILE_DIRTY));
|
||||
printk(KERN_INFO "%lu pages writeback\n",
|
||||
global_page_state(NR_WRITEBACK));
|
||||
printk(KERN_INFO "%lu pages mapped\n", global_page_state(NR_FILE_MAPPED));
|
||||
printk(KERN_INFO "%lu pages slab\n", global_page_state(NR_SLAB));
|
||||
printk(KERN_INFO "%lu pages pagetables\n",
|
||||
global_page_state(NR_PAGETABLE));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -196,9 +194,10 @@ unsigned long hypervisor_virt_start = HYPERVISOR_VIRT_START;
|
||||
unsigned long __FIXADDR_TOP = (HYPERVISOR_VIRT_START - 2 * PAGE_SIZE);
|
||||
EXPORT_SYMBOL(__FIXADDR_TOP);
|
||||
|
||||
void __init set_fixaddr_top()
|
||||
void __init set_fixaddr_top(unsigned long top)
|
||||
{
|
||||
BUG_ON(nr_fixmaps > 0);
|
||||
hypervisor_virt_start = top;
|
||||
__FIXADDR_TOP = hypervisor_virt_start - 2 * PAGE_SIZE;
|
||||
}
|
||||
|
||||
@@ -215,6 +214,7 @@ void __set_fixmap (enum fixed_addresses idx, maddr_t phys, pgprot_t flags)
|
||||
#ifdef CONFIG_X86_F00F_BUG
|
||||
case FIX_F00F_IDT:
|
||||
#endif
|
||||
case FIX_VDSO:
|
||||
set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
|
||||
break;
|
||||
default:
|
||||
@@ -240,24 +240,29 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||
pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT|__GFP_ZERO, 0);
|
||||
#else
|
||||
pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
|
||||
#endif
|
||||
if (pte) {
|
||||
SetPageForeign(pte, pte_free);
|
||||
set_page_count(pte, 1);
|
||||
init_page_count(pte);
|
||||
}
|
||||
#endif
|
||||
return pte;
|
||||
}
|
||||
|
||||
void pte_free(struct page *pte)
|
||||
{
|
||||
unsigned long va = (unsigned long)__va(page_to_pfn(pte)<<PAGE_SHIFT);
|
||||
unsigned long pfn = page_to_pfn(pte);
|
||||
|
||||
if (!pte_write(*virt_to_ptep(va)))
|
||||
BUG_ON(HYPERVISOR_update_va_mapping(
|
||||
va, pfn_pte(page_to_pfn(pte), PAGE_KERNEL), 0));
|
||||
if (!PageHighMem(pte)) {
|
||||
unsigned long va = (unsigned long)__va(pfn << PAGE_SHIFT);
|
||||
|
||||
if (!pte_write(*virt_to_ptep(va)))
|
||||
BUG_ON(HYPERVISOR_update_va_mapping(
|
||||
va, pfn_pte(pfn, PAGE_KERNEL), 0));
|
||||
} else
|
||||
clear_bit(PG_pinned, &pte->flags);
|
||||
|
||||
ClearPageForeign(pte);
|
||||
set_page_count(pte, 1);
|
||||
init_page_count(pte);
|
||||
|
||||
__free_page(pte);
|
||||
}
|
||||
@@ -568,46 +573,48 @@ void make_pages_writable(void *va, unsigned int nr, unsigned int feature)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void pgd_walk_set_prot(void *pt, pgprot_t flags)
|
||||
static inline int pgd_walk_set_prot(struct page *page, pgprot_t flags)
|
||||
{
|
||||
struct page *page = virt_to_page(pt);
|
||||
unsigned long pfn = page_to_pfn(page);
|
||||
|
||||
if (PageHighMem(page))
|
||||
return;
|
||||
return pgprot_val(flags) & _PAGE_RW
|
||||
? test_and_clear_bit(PG_pinned, &page->flags)
|
||||
: !test_and_set_bit(PG_pinned, &page->flags);
|
||||
|
||||
BUG_ON(HYPERVISOR_update_va_mapping(
|
||||
(unsigned long)__va(pfn << PAGE_SHIFT),
|
||||
pfn_pte(pfn, flags), 0));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pgd_walk(pgd_t *pgd_base, pgprot_t flags)
|
||||
static int pgd_walk(pgd_t *pgd_base, pgprot_t flags)
|
||||
{
|
||||
pgd_t *pgd = pgd_base;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
int g, u, m;
|
||||
int g, u, m, flush;
|
||||
|
||||
if (xen_feature(XENFEAT_auto_translated_physmap))
|
||||
return;
|
||||
return 0;
|
||||
|
||||
for (g = 0; g < USER_PTRS_PER_PGD; g++, pgd++) {
|
||||
for (g = 0, flush = 0; g < USER_PTRS_PER_PGD; g++, pgd++) {
|
||||
if (pgd_none(*pgd))
|
||||
continue;
|
||||
pud = pud_offset(pgd, 0);
|
||||
if (PTRS_PER_PUD > 1) /* not folded */
|
||||
pgd_walk_set_prot(pud,flags);
|
||||
flush |= pgd_walk_set_prot(virt_to_page(pud),flags);
|
||||
for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
|
||||
if (pud_none(*pud))
|
||||
continue;
|
||||
pmd = pmd_offset(pud, 0);
|
||||
if (PTRS_PER_PMD > 1) /* not folded */
|
||||
pgd_walk_set_prot(pmd,flags);
|
||||
flush |= pgd_walk_set_prot(virt_to_page(pmd),flags);
|
||||
for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
|
||||
if (pmd_none(*pmd))
|
||||
continue;
|
||||
pte = pte_offset_kernel(pmd,0);
|
||||
pgd_walk_set_prot(pte,flags);
|
||||
flush |= pgd_walk_set_prot(pmd_page(*pmd),flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -616,11 +623,14 @@ static void pgd_walk(pgd_t *pgd_base, pgprot_t flags)
|
||||
(unsigned long)pgd_base,
|
||||
pfn_pte(virt_to_phys(pgd_base)>>PAGE_SHIFT, flags),
|
||||
UVMF_TLB_FLUSH));
|
||||
|
||||
return flush;
|
||||
}
|
||||
|
||||
static void __pgd_pin(pgd_t *pgd)
|
||||
{
|
||||
pgd_walk(pgd, PAGE_KERNEL_RO);
|
||||
if (pgd_walk(pgd, PAGE_KERNEL_RO))
|
||||
kmap_flush_unused();
|
||||
xen_pgd_pin(__pa(pgd));
|
||||
set_bit(PG_pinned, &virt_to_page(pgd)->flags);
|
||||
}
|
||||
@@ -628,7 +638,8 @@ static void __pgd_pin(pgd_t *pgd)
|
||||
static void __pgd_unpin(pgd_t *pgd)
|
||||
{
|
||||
xen_pgd_unpin(__pa(pgd));
|
||||
pgd_walk(pgd, PAGE_KERNEL);
|
||||
if (pgd_walk(pgd, PAGE_KERNEL))
|
||||
kmap_flush_unused();
|
||||
clear_bit(PG_pinned, &virt_to_page(pgd)->flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,283 +0,0 @@
|
||||
/*
|
||||
* linux/arch/i386/mm/pgtable.c
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/e820.h>
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
void show_mem(void)
|
||||
{
|
||||
int total = 0, reserved = 0;
|
||||
int shared = 0, cached = 0;
|
||||
int highmem = 0;
|
||||
struct page *page;
|
||||
pg_data_t *pgdat;
|
||||
unsigned long i;
|
||||
struct page_state ps;
|
||||
unsigned long flags;
|
||||
|
||||
printk(KERN_INFO "Mem-info:\n");
|
||||
show_free_areas();
|
||||
printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
for_each_pgdat(pgdat) {
|
||||
pgdat_resize_lock(pgdat, &flags);
|
||||
for (i = 0; i < pgdat->node_spanned_pages; ++i) {
|
||||
page = pgdat_page_nr(pgdat, i);
|
||||
total++;
|
||||
if (PageHighMem(page))
|
||||
highmem++;
|
||||
if (PageReserved(page))
|
||||
reserved++;
|
||||
else if (PageSwapCache(page))
|
||||
cached++;
|
||||
else if (page_count(page))
|
||||
shared += page_count(page) - 1;
|
||||
}
|
||||
pgdat_resize_unlock(pgdat, &flags);
|
||||
}
|
||||
printk(KERN_INFO "%d pages of RAM\n", total);
|
||||
printk(KERN_INFO "%d pages of HIGHMEM\n", highmem);
|
||||
printk(KERN_INFO "%d reserved pages\n", reserved);
|
||||
printk(KERN_INFO "%d pages shared\n", shared);
|
||||
printk(KERN_INFO "%d pages swap cached\n", cached);
|
||||
|
||||
get_page_state(&ps);
|
||||
printk(KERN_INFO "%lu pages dirty\n", ps.nr_dirty);
|
||||
printk(KERN_INFO "%lu pages writeback\n", ps.nr_writeback);
|
||||
printk(KERN_INFO "%lu pages mapped\n", ps.nr_mapped);
|
||||
printk(KERN_INFO "%lu pages slab\n", ps.nr_slab);
|
||||
printk(KERN_INFO "%lu pages pagetables\n", ps.nr_page_table_pages);
|
||||
}
|
||||
|
||||
/*
|
||||
* Associate a virtual page frame with a given physical page frame
|
||||
* and protection flags for that frame.
|
||||
*/
|
||||
static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
pgd = swapper_pg_dir + pgd_index(vaddr);
|
||||
if (pgd_none(*pgd)) {
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
if (pud_none(*pud)) {
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
pmd = pmd_offset(pud, vaddr);
|
||||
if (pmd_none(*pmd)) {
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
pte = pte_offset_kernel(pmd, vaddr);
|
||||
/* <pfn,flags> stored as-is, to permit clearing entries */
|
||||
set_pte(pte, pfn_pte(pfn, flags));
|
||||
|
||||
/*
|
||||
* It's enough to flush this one mapping.
|
||||
* (PGE mappings get flushed as well)
|
||||
*/
|
||||
__flush_tlb_one(vaddr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Associate a large virtual page frame with a given physical page frame
|
||||
* and protection flags for that frame. pfn is for the base of the page,
|
||||
* vaddr is what the page gets mapped to - both must be properly aligned.
|
||||
* The pmd must already be instantiated. Assumes PAE mode.
|
||||
*/
|
||||
void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
pmd_t *pmd;
|
||||
|
||||
if (vaddr & (PMD_SIZE-1)) { /* vaddr is misaligned */
|
||||
printk(KERN_WARNING "set_pmd_pfn: vaddr misaligned\n");
|
||||
return; /* BUG(); */
|
||||
}
|
||||
if (pfn & (PTRS_PER_PTE-1)) { /* pfn is misaligned */
|
||||
printk(KERN_WARNING "set_pmd_pfn: pfn misaligned\n");
|
||||
return; /* BUG(); */
|
||||
}
|
||||
pgd = swapper_pg_dir + pgd_index(vaddr);
|
||||
if (pgd_none(*pgd)) {
|
||||
printk(KERN_WARNING "set_pmd_pfn: pgd_none\n");
|
||||
return; /* BUG(); */
|
||||
}
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
pmd = pmd_offset(pud, vaddr);
|
||||
set_pmd(pmd, pfn_pmd(pfn, flags));
|
||||
/*
|
||||
* It's enough to flush this one mapping.
|
||||
* (PGE mappings get flushed as well)
|
||||
*/
|
||||
__flush_tlb_one(vaddr);
|
||||
}
|
||||
|
||||
static int nr_fixmaps = 0;
|
||||
unsigned long __FIXADDR_TOP = 0xfffff000;
|
||||
EXPORT_SYMBOL(__FIXADDR_TOP);
|
||||
|
||||
void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
|
||||
{
|
||||
unsigned long address = __fix_to_virt(idx);
|
||||
|
||||
if (idx >= __end_of_fixed_addresses) {
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
|
||||
nr_fixmaps++;
|
||||
}
|
||||
|
||||
void set_fixaddr_top(unsigned long top)
|
||||
{
|
||||
BUG_ON(nr_fixmaps > 0);
|
||||
__FIXADDR_TOP = top - PAGE_SIZE;
|
||||
}
|
||||
|
||||
pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
|
||||
{
|
||||
return (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
|
||||
}
|
||||
|
||||
struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
|
||||
{
|
||||
struct page *pte;
|
||||
|
||||
#ifdef CONFIG_HIGHPTE
|
||||
pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT|__GFP_ZERO, 0);
|
||||
#else
|
||||
pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
|
||||
#endif
|
||||
return pte;
|
||||
}
|
||||
|
||||
void pmd_ctor(void *pmd, kmem_cache_t *cache, unsigned long flags)
|
||||
{
|
||||
memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
|
||||
}
|
||||
|
||||
/*
|
||||
* List of all pgd's needed for non-PAE so it can invalidate entries
|
||||
* in both cached and uncached pgd's; not needed for PAE since the
|
||||
* kernel pmd is shared. If PAE were not to share the pmd a similar
|
||||
* tactic would be needed. This is essentially codepath-based locking
|
||||
* against pageattr.c; it is the unique case in which a valid change
|
||||
* of kernel pagetables can't be lazily synchronized by vmalloc faults.
|
||||
* vmalloc faults work because attached pagetables are never freed.
|
||||
* The locking scheme was chosen on the basis of manfred's
|
||||
* recommendations and having no core impact whatsoever.
|
||||
* -- wli
|
||||
*/
|
||||
DEFINE_SPINLOCK(pgd_lock);
|
||||
struct page *pgd_list;
|
||||
|
||||
static inline void pgd_list_add(pgd_t *pgd)
|
||||
{
|
||||
struct page *page = virt_to_page(pgd);
|
||||
page->index = (unsigned long)pgd_list;
|
||||
if (pgd_list)
|
||||
set_page_private(pgd_list, (unsigned long)&page->index);
|
||||
pgd_list = page;
|
||||
set_page_private(page, (unsigned long)&pgd_list);
|
||||
}
|
||||
|
||||
static inline void pgd_list_del(pgd_t *pgd)
|
||||
{
|
||||
struct page *next, **pprev, *page = virt_to_page(pgd);
|
||||
next = (struct page *)page->index;
|
||||
pprev = (struct page **)page_private(page);
|
||||
*pprev = next;
|
||||
if (next)
|
||||
set_page_private(next, (unsigned long)pprev);
|
||||
}
|
||||
|
||||
void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (PTRS_PER_PMD == 1) {
|
||||
memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
|
||||
spin_lock_irqsave(&pgd_lock, flags);
|
||||
}
|
||||
|
||||
clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
|
||||
swapper_pg_dir + USER_PTRS_PER_PGD,
|
||||
KERNEL_PGD_PTRS);
|
||||
if (PTRS_PER_PMD > 1)
|
||||
return;
|
||||
|
||||
pgd_list_add(pgd);
|
||||
spin_unlock_irqrestore(&pgd_lock, flags);
|
||||
}
|
||||
|
||||
/* never called when PTRS_PER_PMD > 1 */
|
||||
void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
|
||||
{
|
||||
unsigned long flags; /* can be called from interrupt context */
|
||||
|
||||
spin_lock_irqsave(&pgd_lock, flags);
|
||||
pgd_list_del(pgd);
|
||||
spin_unlock_irqrestore(&pgd_lock, flags);
|
||||
}
|
||||
|
||||
pgd_t *pgd_alloc(struct mm_struct *mm)
|
||||
{
|
||||
int i;
|
||||
pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
|
||||
|
||||
if (PTRS_PER_PMD == 1 || !pgd)
|
||||
return pgd;
|
||||
|
||||
for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
|
||||
pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
|
||||
if (!pmd)
|
||||
goto out_oom;
|
||||
set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
|
||||
}
|
||||
return pgd;
|
||||
|
||||
out_oom:
|
||||
for (i--; i >= 0; i--)
|
||||
kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
|
||||
kmem_cache_free(pgd_cache, pgd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void pgd_free(pgd_t *pgd)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* in the PAE case user pgd entries are overwritten before usage */
|
||||
if (PTRS_PER_PMD > 1)
|
||||
for (i = 0; i < USER_PTRS_PER_PGD; ++i)
|
||||
kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
|
||||
/* in the non-PAE case, free_pgtables() clears user pgd entries */
|
||||
kmem_cache_free(pgd_cache, pgd);
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
obj-y := i386.o
|
||||
obj-y := i386.o init.o
|
||||
|
||||
obj-$(CONFIG_PCI_BIOS) += pcbios.o
|
||||
obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
* (c) 1999--2000 Martin Mares <mj@ucw.cz>
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
@@ -110,7 +109,6 @@ static struct irq_routing_table * __init pirq_find_routing_table(void)
|
||||
if (rt)
|
||||
return rt;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -203,14 +201,14 @@ static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigne
|
||||
*/
|
||||
static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
|
||||
{
|
||||
static unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
|
||||
static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
|
||||
|
||||
return irqmap[read_config_nybble(router, 0x48, pirq-1)];
|
||||
}
|
||||
|
||||
static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
|
||||
{
|
||||
static unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
|
||||
static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
|
||||
unsigned int val = irqmap[irq];
|
||||
|
||||
if (val) {
|
||||
@@ -261,13 +259,13 @@ static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, i
|
||||
*/
|
||||
static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
|
||||
{
|
||||
static unsigned int pirqmap[4] = { 3, 2, 5, 1 };
|
||||
static const unsigned int pirqmap[4] = { 3, 2, 5, 1 };
|
||||
return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
|
||||
}
|
||||
|
||||
static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
|
||||
{
|
||||
static unsigned int pirqmap[4] = { 3, 2, 5, 1 };
|
||||
static const unsigned int pirqmap[4] = { 3, 2, 5, 1 };
|
||||
write_config_nybble(router, 0x55, pirqmap[pirq-1], irq);
|
||||
return 1;
|
||||
}
|
||||
@@ -279,13 +277,13 @@ static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq
|
||||
*/
|
||||
static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
|
||||
{
|
||||
static unsigned char pirqmap[4] = { 1, 0, 2, 3 };
|
||||
static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
|
||||
return read_config_nybble(router,0x43, pirqmap[pirq-1]);
|
||||
}
|
||||
|
||||
static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
|
||||
{
|
||||
static unsigned char pirqmap[4] = { 1, 0, 2, 3 };
|
||||
static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
|
||||
write_config_nybble(router, 0x43, pirqmap[pirq-1], irq);
|
||||
return 1;
|
||||
}
|
||||
@@ -510,7 +508,7 @@ static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
|
||||
|
||||
static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
|
||||
{
|
||||
static struct pci_device_id pirq_440gx[] = {
|
||||
static struct pci_device_id __initdata pirq_440gx[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) },
|
||||
{ },
|
||||
@@ -593,7 +591,9 @@ static __init int via_router_probe(struct irq_router *r,
|
||||
case PCI_DEVICE_ID_VIA_82C596:
|
||||
case PCI_DEVICE_ID_VIA_82C686:
|
||||
case PCI_DEVICE_ID_VIA_8231:
|
||||
case PCI_DEVICE_ID_VIA_8233A:
|
||||
case PCI_DEVICE_ID_VIA_8235:
|
||||
case PCI_DEVICE_ID_VIA_8237:
|
||||
/* FIXME: add new ones for 8233/5 */
|
||||
r->name = "VIA";
|
||||
r->get = pirq_via_get;
|
||||
@@ -868,7 +868,7 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
|
||||
for (i = 0; i < 16; i++) {
|
||||
if (!(mask & (1 << i)))
|
||||
continue;
|
||||
if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, SA_SHIRQ))
|
||||
if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, IRQF_SHARED))
|
||||
newirq = i;
|
||||
}
|
||||
}
|
||||
@@ -883,6 +883,7 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
|
||||
((!(pci_probe & PCI_USE_PIRQ_MASK)) || ((1 << irq) & mask)) ) {
|
||||
DBG(" -> got IRQ %d\n", irq);
|
||||
msg = "Found";
|
||||
eisa_set_level_irq(irq);
|
||||
} else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
|
||||
DBG(" -> assigning IRQ %d", newirq);
|
||||
if (r->set(pirq_router_dev, dev, pirq, newirq)) {
|
||||
|
||||
@@ -34,6 +34,10 @@ config RWSEM_XCHGADD_ALGORITHM
|
||||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_FIND_NEXT_BIT
|
||||
bool
|
||||
default y
|
||||
|
||||
config GENERIC_CALIBRATE_DELAY
|
||||
bool
|
||||
default y
|
||||
@@ -42,6 +46,10 @@ config TIME_INTERPOLATION
|
||||
bool
|
||||
default y
|
||||
|
||||
config DMI
|
||||
bool
|
||||
default y
|
||||
|
||||
config EFI
|
||||
bool
|
||||
default y
|
||||
@@ -90,6 +98,15 @@ config DMA_IS_DMA32
|
||||
bool
|
||||
default y
|
||||
|
||||
config DMA_IS_NORMAL
|
||||
bool
|
||||
depends on IA64_SGI_SN2
|
||||
default y
|
||||
|
||||
config AUDIT_ARCH
|
||||
bool
|
||||
default y
|
||||
|
||||
choice
|
||||
prompt "System type"
|
||||
default IA64_GENERIC
|
||||
@@ -97,6 +114,7 @@ choice
|
||||
config IA64_GENERIC
|
||||
bool "generic"
|
||||
select ACPI
|
||||
select PCI
|
||||
select NUMA
|
||||
select ACPI_NUMA
|
||||
help
|
||||
@@ -272,7 +290,7 @@ config NR_CPUS
|
||||
int "Maximum number of CPUs (2-1024)"
|
||||
range 2 1024
|
||||
depends on SMP
|
||||
default "64"
|
||||
default "1024"
|
||||
help
|
||||
You should set this to the number of CPUs in your system, but
|
||||
keep in mind that a kernel compiled for, e.g., 2 CPUs will boot but
|
||||
@@ -296,12 +314,30 @@ config ARCH_ENABLE_MEMORY_HOTPLUG
|
||||
config SCHED_SMT
|
||||
bool "SMT scheduler support"
|
||||
depends on SMP
|
||||
default off
|
||||
help
|
||||
Improves the CPU scheduler's decision making when dealing with
|
||||
Intel IA64 chips with MultiThreading at a cost of slightly increased
|
||||
overhead in some places. If unsure say N here.
|
||||
|
||||
config PERMIT_BSP_REMOVE
|
||||
bool "Support removal of Bootstrap Processor"
|
||||
depends on HOTPLUG_CPU
|
||||
default n
|
||||
---help---
|
||||
Say Y here if your platform SAL will support removal of BSP with HOTPLUG_CPU
|
||||
support.
|
||||
|
||||
config FORCE_CPEI_RETARGET
|
||||
bool "Force assumption that CPEI can be re-targetted"
|
||||
depends on PERMIT_BSP_REMOVE
|
||||
default n
|
||||
---help---
|
||||
Say Y if you need to force the assumption that CPEI can be re-targetted to
|
||||
any cpu in the system. This hint is available via ACPI 3.0 specifications.
|
||||
Tiger4 systems are capable of re-directing CPEI to any CPU other than BSP.
|
||||
This option it useful to enable this feature on older BIOS's as well.
|
||||
You can also enable this by using boot command line option force_cpei=1.
|
||||
|
||||
config PREEMPT
|
||||
bool "Preemptible Kernel"
|
||||
help
|
||||
@@ -347,6 +383,16 @@ config NUMA
|
||||
Access). This option is for configuring high-end multiprocessor
|
||||
server systems. If in doubt, say N.
|
||||
|
||||
config NODES_SHIFT
|
||||
int "Max num nodes shift(3-10)"
|
||||
range 3 10
|
||||
default "10"
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
help
|
||||
This option specifies the maximum number of nodes in your SSI system.
|
||||
MAX_NUMNODES will be 2^(This value).
|
||||
If in doubt, use the default.
|
||||
|
||||
# VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.
|
||||
# VIRTUAL_MEM_MAP has been retained for historical reasons.
|
||||
config VIRTUAL_MEM_MAP
|
||||
@@ -368,6 +414,10 @@ config HAVE_ARCH_EARLY_PFN_TO_NID
|
||||
def_bool y
|
||||
depends on NEED_MULTIPLE_NODES
|
||||
|
||||
config HAVE_ARCH_NODEDATA_EXTENSION
|
||||
def_bool y
|
||||
depends on NUMA
|
||||
|
||||
config IA32_SUPPORT
|
||||
bool "Support for Linux/x86 binaries"
|
||||
help
|
||||
@@ -407,6 +457,8 @@ config IA64_PALINFO
|
||||
config SGI_SN
|
||||
def_bool y if (IA64_SGI_SN2 || IA64_GENERIC)
|
||||
|
||||
source "drivers/sn/Kconfig"
|
||||
|
||||
source "drivers/firmware/Kconfig"
|
||||
|
||||
source "fs/Kconfig.binfmt"
|
||||
@@ -456,6 +508,8 @@ config XEN_PCIDEV_FE_DEBUG
|
||||
help
|
||||
Enables some debug statements within the PCI Frontend.
|
||||
|
||||
source "drivers/pci/pcie/Kconfig"
|
||||
|
||||
source "drivers/pci/Kconfig"
|
||||
|
||||
source "drivers/pci/hotplug/Kconfig"
|
||||
@@ -490,6 +544,10 @@ config GENERIC_PENDING_IRQ
|
||||
depends on GENERIC_HARDIRQS && SMP
|
||||
default y
|
||||
|
||||
config IRQ_PER_CPU
|
||||
bool
|
||||
default y
|
||||
|
||||
source "arch/ia64/hp/sim/Kconfig"
|
||||
|
||||
menu "Instrumentation Support"
|
||||
@@ -521,19 +579,9 @@ if XEN
|
||||
config XEN_UTIL
|
||||
default n
|
||||
|
||||
config HAVE_ARCH_ALLOC_SKB
|
||||
default y
|
||||
|
||||
config HAVE_ARCH_DEV_ALLOC_SKB
|
||||
default y
|
||||
|
||||
config XEN_BALLOON
|
||||
default y
|
||||
|
||||
config XEN_SKBUFF
|
||||
default y
|
||||
depends on NET
|
||||
|
||||
config XEN_REBOOT
|
||||
default y
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#
|
||||
# ia64/Makefile
|
||||
#
|
||||
# This file is included by the global makefile so that you can add your own
|
||||
# architecture-specific flags and dependencies.
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
@@ -74,7 +77,7 @@ drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/
|
||||
|
||||
boot := arch/ia64/hp/sim/boot
|
||||
|
||||
.PHONY: boot compressed check
|
||||
PHONY += boot compressed check
|
||||
|
||||
all: compressed unwcheck
|
||||
|
||||
|
||||
@@ -8,14 +8,13 @@
|
||||
* Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
|
||||
* Copyright (C) 1999 Vijay Chander <vijay@engr.sgi.com>
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kdev_t.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/sched.h>
|
||||
@@ -86,8 +85,3 @@ dig_setup (char **cmdline_p)
|
||||
xen_start_info->console.domU.evtchn = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init
|
||||
dig_irq_init (void)
|
||||
{
|
||||
}
|
||||
@@ -29,6 +29,7 @@ obj-$(CONFIG_CPU_FREQ) += cpufreq/
|
||||
obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o
|
||||
obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o
|
||||
obj-$(CONFIG_AUDIT) += audit.o
|
||||
mca_recovery-y += mca_drv.o mca_drv_asm.o
|
||||
|
||||
# The gate DSO image is built using a special linker script.
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
*/
|
||||
|
||||
#define ASM_OFFSETS_C 1
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <linux/sched.h>
|
||||
|
||||
@@ -217,16 +216,24 @@ void foo(void)
|
||||
DEFINE(IA64_MCA_CPU_INIT_STACK_OFFSET,
|
||||
offsetof (struct ia64_mca_cpu, init_stack));
|
||||
BLANK();
|
||||
DEFINE(IA64_SAL_OS_STATE_COMMON_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, sal_ra));
|
||||
DEFINE(IA64_SAL_OS_STATE_OS_GP_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, os_gp));
|
||||
DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, pal_min_state));
|
||||
DEFINE(IA64_SAL_OS_STATE_PROC_STATE_PARAM_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, proc_state_param));
|
||||
DEFINE(IA64_SAL_OS_STATE_SAL_RA_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, sal_ra));
|
||||
DEFINE(IA64_SAL_OS_STATE_SAL_GP_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, sal_gp));
|
||||
DEFINE(IA64_SAL_OS_STATE_PAL_MIN_STATE_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, pal_min_state));
|
||||
DEFINE(IA64_SAL_OS_STATE_OS_STATUS_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, os_status));
|
||||
DEFINE(IA64_SAL_OS_STATE_CONTEXT_OFFSET,
|
||||
offsetof (struct ia64_sal_os_state, context));
|
||||
DEFINE(IA64_SAL_OS_STATE_SIZE,
|
||||
sizeof (struct ia64_sal_os_state));
|
||||
BLANK();
|
||||
|
||||
DEFINE(IA64_PMSA_GR_OFFSET,
|
||||
offsetof (struct pal_min_state_area_s, pmsa_gr));
|
||||
DEFINE(IA64_PMSA_BANK1_GR_OFFSET,
|
||||
@@ -280,7 +287,6 @@ void foo(void)
|
||||
DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha);
|
||||
DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir);
|
||||
DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled);
|
||||
DEFINE_MAPPED_REG_OFS(XSI_INCOMPL_REGFR_OFS, incomplete_regframe);
|
||||
DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum);
|
||||
DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]);
|
||||
DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]);
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
* pNonSys: !pSys
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/cache.h>
|
||||
@@ -1108,9 +1107,6 @@ skip_rbs_switch:
|
||||
st8 [r2]=r8
|
||||
st8 [r3]=r10
|
||||
.work_pending:
|
||||
tbit.nz p6,p0=r31,TIF_SIGDELAYED // signal delayed from MCA/INIT/NMI/PMI context?
|
||||
(p6) br.cond.sptk.few .sigdelayed
|
||||
;;
|
||||
tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0?
|
||||
(p6) br.cond.sptk.few .notify
|
||||
#ifdef CONFIG_PREEMPT
|
||||
@@ -1137,17 +1133,6 @@ skip_rbs_switch:
|
||||
(pLvSys)br.cond.sptk.few .work_pending_syscall_end
|
||||
br.cond.sptk.many .work_processed_kernel // don't re-check
|
||||
|
||||
// There is a delayed signal that was detected in MCA/INIT/NMI/PMI context where
|
||||
// it could not be delivered. Deliver it now. The signal might be for us and
|
||||
// may set TIF_SIGPENDING, so redrive ia64_leave_* after processing the delayed
|
||||
// signal.
|
||||
|
||||
.sigdelayed:
|
||||
br.call.sptk.many rp=do_sigdelayed
|
||||
cmp.eq p6,p0=r0,r0 // p6 <- 1, always re-check
|
||||
(pLvSys)br.cond.sptk.few .work_pending_syscall_end
|
||||
br.cond.sptk.many .work_processed_kernel // re-check
|
||||
|
||||
.work_pending_syscall_end:
|
||||
adds r2=PT(R8)+16,r12
|
||||
adds r3=PT(R10)+16,r12
|
||||
@@ -1604,7 +1589,7 @@ sys_call_table:
|
||||
data8 sys_keyctl
|
||||
data8 sys_ioprio_set
|
||||
data8 sys_ioprio_get // 1275
|
||||
data8 sys_ni_syscall
|
||||
data8 sys_move_pages
|
||||
data8 sys_inotify_init
|
||||
data8 sys_inotify_add_watch
|
||||
data8 sys_inotify_rm_watch
|
||||
@@ -1625,5 +1610,11 @@ sys_call_table:
|
||||
data8 sys_ni_syscall // reserved for pselect
|
||||
data8 sys_ni_syscall // 1295 reserved for ppoll
|
||||
data8 sys_unshare
|
||||
data8 sys_splice
|
||||
data8 sys_ni_syscall // reserved for set_robust_list
|
||||
data8 sys_ni_syscall // reserved for get_robust_list
|
||||
data8 sys_sync_file_range // 1300
|
||||
data8 sys_tee
|
||||
data8 sys_vmsplice
|
||||
|
||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||
@@ -0,0 +1,925 @@
|
||||
/*
|
||||
* This file contains the light-weight system call handlers (fsyscall-handlers).
|
||||
*
|
||||
* Copyright (C) 2003 Hewlett-Packard Co
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>
|
||||
*
|
||||
* 25-Sep-03 davidm Implement fsys_rt_sigprocmask().
|
||||
* 18-Feb-03 louisk Implement fsys_gettimeofday().
|
||||
* 28-Feb-03 davidm Fixed several bugs in fsys_gettimeofday(). Tuned it some more,
|
||||
* probably broke it along the way... ;-)
|
||||
* 13-Jul-04 clameter Implement fsys_clock_gettime and revise fsys_gettimeofday to make
|
||||
* it capable of using memory based clocks without falling back to C code.
|
||||
*/
|
||||
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/errno.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/sal.h>
|
||||
#include <asm/signal.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#include "entry.h"
|
||||
|
||||
/*
|
||||
* See Documentation/ia64/fsys.txt for details on fsyscalls.
|
||||
*
|
||||
* On entry to an fsyscall handler:
|
||||
* r10 = 0 (i.e., defaults to "successful syscall return")
|
||||
* r11 = saved ar.pfs (a user-level value)
|
||||
* r15 = system call number
|
||||
* r16 = "current" task pointer (in normal kernel-mode, this is in r13)
|
||||
* r32-r39 = system call arguments
|
||||
* b6 = return address (a user-level value)
|
||||
* ar.pfs = previous frame-state (a user-level value)
|
||||
* PSR.be = cleared to zero (i.e., little-endian byte order is in effect)
|
||||
* all other registers may contain values passed in from user-mode
|
||||
*
|
||||
* On return from an fsyscall handler:
|
||||
* r11 = saved ar.pfs (as passed into the fsyscall handler)
|
||||
* r15 = system call number (as passed into the fsyscall handler)
|
||||
* r32-r39 = system call arguments (as passed into the fsyscall handler)
|
||||
* b6 = return address (as passed into the fsyscall handler)
|
||||
* ar.pfs = previous frame-state (as passed into the fsyscall handler)
|
||||
*/
|
||||
|
||||
ENTRY(fsys_ni_syscall)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
mov r8=ENOSYS
|
||||
mov r10=-1
|
||||
FSYS_RETURN
|
||||
END(fsys_ni_syscall)
|
||||
|
||||
ENTRY(fsys_getpid)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
add r9=TI_FLAGS+IA64_TASK_SIZE,r16
|
||||
;;
|
||||
ld4 r9=[r9]
|
||||
add r8=IA64_TASK_TGID_OFFSET,r16
|
||||
;;
|
||||
and r9=TIF_ALLWORK_MASK,r9
|
||||
ld4 r8=[r8] // r8 = current->tgid
|
||||
;;
|
||||
cmp.ne p8,p0=0,r9
|
||||
(p8) br.spnt.many fsys_fallback_syscall
|
||||
FSYS_RETURN
|
||||
END(fsys_getpid)
|
||||
|
||||
ENTRY(fsys_getppid)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
add r17=IA64_TASK_GROUP_LEADER_OFFSET,r16
|
||||
;;
|
||||
ld8 r17=[r17] // r17 = current->group_leader
|
||||
add r9=TI_FLAGS+IA64_TASK_SIZE,r16
|
||||
;;
|
||||
|
||||
ld4 r9=[r9]
|
||||
add r17=IA64_TASK_REAL_PARENT_OFFSET,r17 // r17 = ¤t->group_leader->real_parent
|
||||
;;
|
||||
and r9=TIF_ALLWORK_MASK,r9
|
||||
|
||||
1: ld8 r18=[r17] // r18 = current->group_leader->real_parent
|
||||
;;
|
||||
cmp.ne p8,p0=0,r9
|
||||
add r8=IA64_TASK_TGID_OFFSET,r18 // r8 = ¤t->group_leader->real_parent->tgid
|
||||
;;
|
||||
|
||||
/*
|
||||
* The .acq is needed to ensure that the read of tgid has returned its data before
|
||||
* we re-check "real_parent".
|
||||
*/
|
||||
ld4.acq r8=[r8] // r8 = current->group_leader->real_parent->tgid
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* Re-read current->group_leader->real_parent.
|
||||
*/
|
||||
ld8 r19=[r17] // r19 = current->group_leader->real_parent
|
||||
(p8) br.spnt.many fsys_fallback_syscall
|
||||
;;
|
||||
cmp.ne p6,p0=r18,r19 // did real_parent change?
|
||||
mov r19=0 // i must not leak kernel bits...
|
||||
(p6) br.cond.spnt.few 1b // yes -> redo the read of tgid and the check
|
||||
;;
|
||||
mov r17=0 // i must not leak kernel bits...
|
||||
mov r18=0 // i must not leak kernel bits...
|
||||
#else
|
||||
mov r17=0 // i must not leak kernel bits...
|
||||
mov r18=0 // i must not leak kernel bits...
|
||||
mov r19=0 // i must not leak kernel bits...
|
||||
#endif
|
||||
FSYS_RETURN
|
||||
END(fsys_getppid)
|
||||
|
||||
ENTRY(fsys_set_tid_address)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
add r9=TI_FLAGS+IA64_TASK_SIZE,r16
|
||||
;;
|
||||
ld4 r9=[r9]
|
||||
tnat.z p6,p7=r32 // check argument register for being NaT
|
||||
;;
|
||||
and r9=TIF_ALLWORK_MASK,r9
|
||||
add r8=IA64_TASK_PID_OFFSET,r16
|
||||
add r18=IA64_TASK_CLEAR_CHILD_TID_OFFSET,r16
|
||||
;;
|
||||
ld4 r8=[r8]
|
||||
cmp.ne p8,p0=0,r9
|
||||
mov r17=-1
|
||||
;;
|
||||
(p6) st8 [r18]=r32
|
||||
(p7) st8 [r18]=r17
|
||||
(p8) br.spnt.many fsys_fallback_syscall
|
||||
;;
|
||||
mov r17=0 // i must not leak kernel bits...
|
||||
mov r18=0 // i must not leak kernel bits...
|
||||
FSYS_RETURN
|
||||
END(fsys_set_tid_address)
|
||||
|
||||
/*
|
||||
* Ensure that the time interpolator structure is compatible with the asm code
|
||||
*/
|
||||
#if IA64_TIME_INTERPOLATOR_SOURCE_OFFSET !=0 || IA64_TIME_INTERPOLATOR_SHIFT_OFFSET != 2 \
|
||||
|| IA64_TIME_INTERPOLATOR_JITTER_OFFSET != 3 || IA64_TIME_INTERPOLATOR_NSEC_OFFSET != 4
|
||||
#error fsys_gettimeofday incompatible with changes to struct time_interpolator
|
||||
#endif
|
||||
#define CLOCK_REALTIME 0
|
||||
#define CLOCK_MONOTONIC 1
|
||||
#define CLOCK_DIVIDE_BY_1000 0x4000
|
||||
#define CLOCK_ADD_MONOTONIC 0x8000
|
||||
|
||||
ENTRY(fsys_gettimeofday)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
mov r31 = r32
|
||||
tnat.nz p6,p0 = r33 // guard against NaT argument
|
||||
(p6) br.cond.spnt.few .fail_einval
|
||||
mov r30 = CLOCK_DIVIDE_BY_1000
|
||||
;;
|
||||
.gettime:
|
||||
// Register map
|
||||
// Incoming r31 = pointer to address where to place result
|
||||
// r30 = flags determining how time is processed
|
||||
// r2,r3 = temp r4-r7 preserved
|
||||
// r8 = result nanoseconds
|
||||
// r9 = result seconds
|
||||
// r10 = temporary storage for clock difference
|
||||
// r11 = preserved: saved ar.pfs
|
||||
// r12 = preserved: memory stack
|
||||
// r13 = preserved: thread pointer
|
||||
// r14 = address of mask / mask
|
||||
// r15 = preserved: system call number
|
||||
// r16 = preserved: current task pointer
|
||||
// r17 = wall to monotonic use
|
||||
// r18 = time_interpolator->offset
|
||||
// r19 = address of wall_to_monotonic
|
||||
// r20 = pointer to struct time_interpolator / pointer to time_interpolator->address
|
||||
// r21 = shift factor
|
||||
// r22 = address of time interpolator->last_counter
|
||||
// r23 = address of time_interpolator->last_cycle
|
||||
// r24 = adress of time_interpolator->offset
|
||||
// r25 = last_cycle value
|
||||
// r26 = last_counter value
|
||||
// r27 = pointer to xtime
|
||||
// r28 = sequence number at the beginning of critcal section
|
||||
// r29 = address of seqlock
|
||||
// r30 = time processing flags / memory address
|
||||
// r31 = pointer to result
|
||||
// Predicates
|
||||
// p6,p7 short term use
|
||||
// p8 = timesource ar.itc
|
||||
// p9 = timesource mmio64
|
||||
// p10 = timesource mmio32
|
||||
// p11 = timesource not to be handled by asm code
|
||||
// p12 = memory time source ( = p9 | p10)
|
||||
// p13 = do cmpxchg with time_interpolator_last_cycle
|
||||
// p14 = Divide by 1000
|
||||
// p15 = Add monotonic
|
||||
//
|
||||
// Note that instructions are optimized for McKinley. McKinley can process two
|
||||
// bundles simultaneously and therefore we continuously try to feed the CPU
|
||||
// two bundles and then a stop.
|
||||
tnat.nz p6,p0 = r31 // branch deferred since it does not fit into bundle structure
|
||||
mov pr = r30,0xc000 // Set predicates according to function
|
||||
add r2 = TI_FLAGS+IA64_TASK_SIZE,r16
|
||||
movl r20 = time_interpolator
|
||||
;;
|
||||
ld8 r20 = [r20] // get pointer to time_interpolator structure
|
||||
movl r29 = xtime_lock
|
||||
ld4 r2 = [r2] // process work pending flags
|
||||
movl r27 = xtime
|
||||
;; // only one bundle here
|
||||
ld8 r21 = [r20] // first quad with control information
|
||||
and r2 = TIF_ALLWORK_MASK,r2
|
||||
(p6) br.cond.spnt.few .fail_einval // deferred branch
|
||||
;;
|
||||
add r10 = IA64_TIME_INTERPOLATOR_ADDRESS_OFFSET,r20
|
||||
extr r3 = r21,32,32 // time_interpolator->nsec_per_cyc
|
||||
extr r8 = r21,0,16 // time_interpolator->source
|
||||
cmp.ne p6, p0 = 0, r2 // Fallback if work is scheduled
|
||||
(p6) br.cond.spnt.many fsys_fallback_syscall
|
||||
;;
|
||||
cmp.eq p8,p12 = 0,r8 // Check for cpu timer
|
||||
cmp.eq p9,p0 = 1,r8 // MMIO64 ?
|
||||
extr r2 = r21,24,8 // time_interpolator->jitter
|
||||
cmp.eq p10,p0 = 2,r8 // MMIO32 ?
|
||||
cmp.ltu p11,p0 = 2,r8 // function or other clock
|
||||
(p11) br.cond.spnt.many fsys_fallback_syscall
|
||||
;;
|
||||
setf.sig f7 = r3 // Setup for scaling of counter
|
||||
(p15) movl r19 = wall_to_monotonic
|
||||
(p12) ld8 r30 = [r10]
|
||||
cmp.ne p13,p0 = r2,r0 // need jitter compensation?
|
||||
extr r21 = r21,16,8 // shift factor
|
||||
;;
|
||||
.time_redo:
|
||||
.pred.rel.mutex p8,p9,p10
|
||||
ld4.acq r28 = [r29] // xtime_lock.sequence. Must come first for locking purposes
|
||||
(p8) mov r2 = ar.itc // CPU_TIMER. 36 clocks latency!!!
|
||||
add r22 = IA64_TIME_INTERPOLATOR_LAST_COUNTER_OFFSET,r20
|
||||
(p9) ld8 r2 = [r30] // readq(ti->address). Could also have latency issues..
|
||||
(p10) ld4 r2 = [r30] // readw(ti->address)
|
||||
(p13) add r23 = IA64_TIME_INTERPOLATOR_LAST_CYCLE_OFFSET,r20
|
||||
;; // could be removed by moving the last add upward
|
||||
ld8 r26 = [r22] // time_interpolator->last_counter
|
||||
(p13) ld8 r25 = [r23] // time interpolator->last_cycle
|
||||
add r24 = IA64_TIME_INTERPOLATOR_OFFSET_OFFSET,r20
|
||||
(p15) ld8 r17 = [r19],IA64_TIMESPEC_TV_NSEC_OFFSET
|
||||
ld8 r9 = [r27],IA64_TIMESPEC_TV_NSEC_OFFSET
|
||||
add r14 = IA64_TIME_INTERPOLATOR_MASK_OFFSET, r20
|
||||
;;
|
||||
ld8 r18 = [r24] // time_interpolator->offset
|
||||
ld8 r8 = [r27],-IA64_TIMESPEC_TV_NSEC_OFFSET // xtime.tv_nsec
|
||||
(p13) sub r3 = r25,r2 // Diff needed before comparison (thanks davidm)
|
||||
;;
|
||||
ld8 r14 = [r14] // time_interpolator->mask
|
||||
(p13) cmp.gt.unc p6,p7 = r3,r0 // check if it is less than last. p6,p7 cleared
|
||||
sub r10 = r2,r26 // current_counter - last_counter
|
||||
;;
|
||||
(p6) sub r10 = r25,r26 // time we got was less than last_cycle
|
||||
(p7) mov ar.ccv = r25 // more than last_cycle. Prep for cmpxchg
|
||||
;;
|
||||
and r10 = r10,r14 // Apply mask
|
||||
;;
|
||||
setf.sig f8 = r10
|
||||
nop.i 123
|
||||
;;
|
||||
(p7) cmpxchg8.rel r3 = [r23],r2,ar.ccv
|
||||
EX(.fail_efault, probe.w.fault r31, 3) // This takes 5 cycles and we have spare time
|
||||
xmpy.l f8 = f8,f7 // nsec_per_cyc*(counter-last_counter)
|
||||
(p15) add r9 = r9,r17 // Add wall to monotonic.secs to result secs
|
||||
;;
|
||||
(p15) ld8 r17 = [r19],-IA64_TIMESPEC_TV_NSEC_OFFSET
|
||||
(p7) cmp.ne p7,p0 = r25,r3 // if cmpxchg not successful redo
|
||||
// simulate tbit.nz.or p7,p0 = r28,0
|
||||
and r28 = ~1,r28 // Make sequence even to force retry if odd
|
||||
getf.sig r2 = f8
|
||||
mf
|
||||
add r8 = r8,r18 // Add time interpolator offset
|
||||
;;
|
||||
ld4 r10 = [r29] // xtime_lock.sequence
|
||||
(p15) add r8 = r8, r17 // Add monotonic.nsecs to nsecs
|
||||
shr.u r2 = r2,r21
|
||||
;; // overloaded 3 bundles!
|
||||
// End critical section.
|
||||
add r8 = r8,r2 // Add xtime.nsecs
|
||||
cmp4.ne.or p7,p0 = r28,r10
|
||||
(p7) br.cond.dpnt.few .time_redo // sequence number changed ?
|
||||
// Now r8=tv->tv_nsec and r9=tv->tv_sec
|
||||
mov r10 = r0
|
||||
movl r2 = 1000000000
|
||||
add r23 = IA64_TIMESPEC_TV_NSEC_OFFSET, r31
|
||||
(p14) movl r3 = 2361183241434822607 // Prep for / 1000 hack
|
||||
;;
|
||||
.time_normalize:
|
||||
mov r21 = r8
|
||||
cmp.ge p6,p0 = r8,r2
|
||||
(p14) shr.u r20 = r8, 3 // We can repeat this if necessary just wasting some time
|
||||
;;
|
||||
(p14) setf.sig f8 = r20
|
||||
(p6) sub r8 = r8,r2
|
||||
(p6) add r9 = 1,r9 // two nops before the branch.
|
||||
(p14) setf.sig f7 = r3 // Chances for repeats are 1 in 10000 for gettod
|
||||
(p6) br.cond.dpnt.few .time_normalize
|
||||
;;
|
||||
// Divided by 8 though shift. Now divide by 125
|
||||
// The compiler was able to do that with a multiply
|
||||
// and a shift and we do the same
|
||||
EX(.fail_efault, probe.w.fault r23, 3) // This also costs 5 cycles
|
||||
(p14) xmpy.hu f8 = f8, f7 // xmpy has 5 cycles latency so use it...
|
||||
;;
|
||||
mov r8 = r0
|
||||
(p14) getf.sig r2 = f8
|
||||
;;
|
||||
(p14) shr.u r21 = r2, 4
|
||||
;;
|
||||
EX(.fail_efault, st8 [r31] = r9)
|
||||
EX(.fail_efault, st8 [r23] = r21)
|
||||
FSYS_RETURN
|
||||
.fail_einval:
|
||||
mov r8 = EINVAL
|
||||
mov r10 = -1
|
||||
FSYS_RETURN
|
||||
.fail_efault:
|
||||
mov r8 = EFAULT
|
||||
mov r10 = -1
|
||||
FSYS_RETURN
|
||||
END(fsys_gettimeofday)
|
||||
|
||||
ENTRY(fsys_clock_gettime)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
cmp4.ltu p6, p0 = CLOCK_MONOTONIC, r32
|
||||
// Fallback if this is not CLOCK_REALTIME or CLOCK_MONOTONIC
|
||||
(p6) br.spnt.few fsys_fallback_syscall
|
||||
mov r31 = r33
|
||||
shl r30 = r32,15
|
||||
br.many .gettime
|
||||
END(fsys_clock_gettime)
|
||||
|
||||
/*
|
||||
* long fsys_rt_sigprocmask (int how, sigset_t *set, sigset_t *oset, size_t sigsetsize).
|
||||
*/
|
||||
#if _NSIG_WORDS != 1
|
||||
# error Sorry, fsys_rt_sigprocmask() needs to be updated for _NSIG_WORDS != 1.
|
||||
#endif
|
||||
ENTRY(fsys_rt_sigprocmask)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
|
||||
add r2=IA64_TASK_BLOCKED_OFFSET,r16
|
||||
add r9=TI_FLAGS+IA64_TASK_SIZE,r16
|
||||
cmp4.ltu p6,p0=SIG_SETMASK,r32
|
||||
|
||||
cmp.ne p15,p0=r0,r34 // oset != NULL?
|
||||
tnat.nz p8,p0=r34
|
||||
add r31=IA64_TASK_SIGHAND_OFFSET,r16
|
||||
;;
|
||||
ld8 r3=[r2] // read/prefetch current->blocked
|
||||
ld4 r9=[r9]
|
||||
tnat.nz.or p6,p0=r35
|
||||
|
||||
cmp.ne.or p6,p0=_NSIG_WORDS*8,r35
|
||||
tnat.nz.or p6,p0=r32
|
||||
(p6) br.spnt.few .fail_einval // fail with EINVAL
|
||||
;;
|
||||
#ifdef CONFIG_SMP
|
||||
ld8 r31=[r31] // r31 <- current->sighand
|
||||
#endif
|
||||
and r9=TIF_ALLWORK_MASK,r9
|
||||
tnat.nz.or p8,p0=r33
|
||||
;;
|
||||
cmp.ne p7,p0=0,r9
|
||||
cmp.eq p6,p0=r0,r33 // set == NULL?
|
||||
add r31=IA64_SIGHAND_SIGLOCK_OFFSET,r31 // r31 <- current->sighand->siglock
|
||||
(p8) br.spnt.few .fail_efault // fail with EFAULT
|
||||
(p7) br.spnt.many fsys_fallback_syscall // got pending kernel work...
|
||||
(p6) br.dpnt.many .store_mask // -> short-circuit to just reading the signal mask
|
||||
|
||||
/* Argh, we actually have to do some work and _update_ the signal mask: */
|
||||
|
||||
EX(.fail_efault, probe.r.fault r33, 3) // verify user has read-access to *set
|
||||
EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
|
||||
mov r17=(1 << (SIGKILL - 1)) | (1 << (SIGSTOP - 1))
|
||||
;;
|
||||
|
||||
rsm psr.i // mask interrupt delivery
|
||||
mov ar.ccv=0
|
||||
andcm r14=r14,r17 // filter out SIGKILL & SIGSTOP
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mov r17=1
|
||||
;;
|
||||
cmpxchg4.acq r18=[r31],r17,ar.ccv // try to acquire the lock
|
||||
mov r8=EINVAL // default to EINVAL
|
||||
;;
|
||||
ld8 r3=[r2] // re-read current->blocked now that we hold the lock
|
||||
cmp4.ne p6,p0=r18,r0
|
||||
(p6) br.cond.spnt.many .lock_contention
|
||||
;;
|
||||
#else
|
||||
ld8 r3=[r2] // re-read current->blocked now that we hold the lock
|
||||
mov r8=EINVAL // default to EINVAL
|
||||
#endif
|
||||
add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16
|
||||
add r19=IA64_TASK_SIGNAL_OFFSET,r16
|
||||
cmp4.eq p6,p0=SIG_BLOCK,r32
|
||||
;;
|
||||
ld8 r19=[r19] // r19 <- current->signal
|
||||
cmp4.eq p7,p0=SIG_UNBLOCK,r32
|
||||
cmp4.eq p8,p0=SIG_SETMASK,r32
|
||||
;;
|
||||
ld8 r18=[r18] // r18 <- current->pending.signal
|
||||
.pred.rel.mutex p6,p7,p8
|
||||
(p6) or r14=r3,r14 // SIG_BLOCK
|
||||
(p7) andcm r14=r3,r14 // SIG_UNBLOCK
|
||||
|
||||
(p8) mov r14=r14 // SIG_SETMASK
|
||||
(p6) mov r8=0 // clear error code
|
||||
// recalc_sigpending()
|
||||
add r17=IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,r19
|
||||
|
||||
add r19=IA64_SIGNAL_SHARED_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r19
|
||||
;;
|
||||
ld4 r17=[r17] // r17 <- current->signal->group_stop_count
|
||||
(p7) mov r8=0 // clear error code
|
||||
|
||||
ld8 r19=[r19] // r19 <- current->signal->shared_pending
|
||||
;;
|
||||
cmp4.gt p6,p7=r17,r0 // p6/p7 <- (current->signal->group_stop_count > 0)?
|
||||
(p8) mov r8=0 // clear error code
|
||||
|
||||
or r18=r18,r19 // r18 <- current->pending | current->signal->shared_pending
|
||||
;;
|
||||
// r18 <- (current->pending | current->signal->shared_pending) & ~current->blocked:
|
||||
andcm r18=r18,r14
|
||||
add r9=TI_FLAGS+IA64_TASK_SIZE,r16
|
||||
;;
|
||||
|
||||
(p7) cmp.ne.or.andcm p6,p7=r18,r0 // p6/p7 <- signal pending
|
||||
mov r19=0 // i must not leak kernel bits...
|
||||
(p6) br.cond.dpnt.many .sig_pending
|
||||
;;
|
||||
|
||||
1: ld4 r17=[r9] // r17 <- current->thread_info->flags
|
||||
;;
|
||||
mov ar.ccv=r17
|
||||
and r18=~_TIF_SIGPENDING,r17 // r18 <- r17 & ~(1 << TIF_SIGPENDING)
|
||||
;;
|
||||
|
||||
st8 [r2]=r14 // update current->blocked with new mask
|
||||
cmpxchg4.acq r8=[r9],r18,ar.ccv // current->thread_info->flags <- r18
|
||||
;;
|
||||
cmp.ne p6,p0=r17,r8 // update failed?
|
||||
(p6) br.cond.spnt.few 1b // yes -> retry
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
st4.rel [r31]=r0 // release the lock
|
||||
#endif
|
||||
ssm psr.i
|
||||
;;
|
||||
|
||||
srlz.d // ensure psr.i is set again
|
||||
mov r18=0 // i must not leak kernel bits...
|
||||
|
||||
.store_mask:
|
||||
EX(.fail_efault, (p15) probe.w.fault r34, 3) // verify user has write-access to *oset
|
||||
EX(.fail_efault, (p15) st8 [r34]=r3)
|
||||
mov r2=0 // i must not leak kernel bits...
|
||||
mov r3=0 // i must not leak kernel bits...
|
||||
mov r8=0 // return 0
|
||||
mov r9=0 // i must not leak kernel bits...
|
||||
mov r14=0 // i must not leak kernel bits...
|
||||
mov r17=0 // i must not leak kernel bits...
|
||||
mov r31=0 // i must not leak kernel bits...
|
||||
FSYS_RETURN
|
||||
|
||||
.sig_pending:
|
||||
#ifdef CONFIG_SMP
|
||||
st4.rel [r31]=r0 // release the lock
|
||||
#endif
|
||||
ssm psr.i
|
||||
;;
|
||||
srlz.d
|
||||
br.sptk.many fsys_fallback_syscall // with signal pending, do the heavy-weight syscall
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
.lock_contention:
|
||||
/* Rather than spinning here, fall back on doing a heavy-weight syscall. */
|
||||
ssm psr.i
|
||||
;;
|
||||
srlz.d
|
||||
br.sptk.many fsys_fallback_syscall
|
||||
#endif
|
||||
END(fsys_rt_sigprocmask)
|
||||
|
||||
ENTRY(fsys_fallback_syscall)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
/*
|
||||
* We only get here from light-weight syscall handlers. Thus, we already
|
||||
* know that r15 contains a valid syscall number. No need to re-check.
|
||||
*/
|
||||
adds r17=-1024,r15
|
||||
movl r14=sys_call_table
|
||||
;;
|
||||
#ifdef CONFIG_XEN
|
||||
movl r18=running_on_xen;;
|
||||
ld4 r18=[r18];;
|
||||
// p14 = running_on_xen
|
||||
// p15 = !running_on_xen
|
||||
cmp.ne p14,p15=r0,r18
|
||||
;;
|
||||
(p14) movl r18=XSI_PSR_I_ADDR;;
|
||||
(p14) ld8 r18=[r18]
|
||||
(p14) mov r29=1;;
|
||||
(p14) st1 [r18]=r29
|
||||
(p15) rsm psr.i
|
||||
#else
|
||||
rsm psr.i
|
||||
#endif
|
||||
shladd r18=r17,3,r14
|
||||
;;
|
||||
ld8 r18=[r18] // load normal (heavy-weight) syscall entry-point
|
||||
#ifdef CONFIG_XEN
|
||||
(p14) mov r27=r8
|
||||
(p14) XEN_HYPER_GET_PSR
|
||||
;;
|
||||
(p14) mov r29=r8
|
||||
(p14) mov r8=r27
|
||||
(p15) mov r29=psr // read psr (12 cyc load latency)
|
||||
#else
|
||||
mov r29=psr // read psr (12 cyc load latency)
|
||||
#endif
|
||||
mov r27=ar.rsc
|
||||
mov r21=ar.fpsr
|
||||
mov r26=ar.pfs
|
||||
END(fsys_fallback_syscall)
|
||||
/* FALL THROUGH */
|
||||
GLOBAL_ENTRY(fsys_bubble_down)
|
||||
.prologue
|
||||
.altrp b6
|
||||
.body
|
||||
/*
|
||||
* We get here for syscalls that don't have a lightweight
|
||||
* handler. For those, we need to bubble down into the kernel
|
||||
* and that requires setting up a minimal pt_regs structure,
|
||||
* and initializing the CPU state more or less as if an
|
||||
* interruption had occurred. To make syscall-restarts work,
|
||||
* we setup pt_regs such that cr_iip points to the second
|
||||
* instruction in syscall_via_break. Decrementing the IP
|
||||
* hence will restart the syscall via break and not
|
||||
* decrementing IP will return us to the caller, as usual.
|
||||
* Note that we preserve the value of psr.pp rather than
|
||||
* initializing it from dcr.pp. This makes it possible to
|
||||
* distinguish fsyscall execution from other privileged
|
||||
* execution.
|
||||
*
|
||||
* On entry:
|
||||
* - normal fsyscall handler register usage, except
|
||||
* that we also have:
|
||||
* - r18: address of syscall entry point
|
||||
* - r21: ar.fpsr
|
||||
* - r26: ar.pfs
|
||||
* - r27: ar.rsc
|
||||
* - r29: psr
|
||||
*
|
||||
* We used to clear some PSR bits here but that requires slow
|
||||
* serialization. Fortuntely, that isn't really necessary.
|
||||
* The rationale is as follows: we used to clear bits
|
||||
* ~PSR_PRESERVED_BITS in PSR.L. Since
|
||||
* PSR_PRESERVED_BITS==PSR.{UP,MFL,MFH,PK,DT,PP,SP,RT,IC}, we
|
||||
* ended up clearing PSR.{BE,AC,I,DFL,DFH,DI,DB,SI,TB}.
|
||||
* However,
|
||||
*
|
||||
* PSR.BE : already is turned off in __kernel_syscall_via_epc()
|
||||
* PSR.AC : don't care (kernel normally turns PSR.AC on)
|
||||
* PSR.I : already turned off by the time fsys_bubble_down gets
|
||||
* invoked
|
||||
* PSR.DFL: always 0 (kernel never turns it on)
|
||||
* PSR.DFH: don't care --- kernel never touches f32-f127 on its own
|
||||
* initiative
|
||||
* PSR.DI : always 0 (kernel never turns it on)
|
||||
* PSR.SI : always 0 (kernel never turns it on)
|
||||
* PSR.DB : don't care --- kernel never enables kernel-level
|
||||
* breakpoints
|
||||
* PSR.TB : must be 0 already; if it wasn't zero on entry to
|
||||
* __kernel_syscall_via_epc, the branch to fsys_bubble_down
|
||||
* will trigger a taken branch; the taken-trap-handler then
|
||||
* converts the syscall into a break-based system-call.
|
||||
*/
|
||||
/*
|
||||
* Reading psr.l gives us only bits 0-31, psr.it, and psr.mc.
|
||||
* The rest we have to synthesize.
|
||||
*/
|
||||
# define PSR_ONE_BITS ((3 << IA64_PSR_CPL0_BIT) \
|
||||
| (0x1 << IA64_PSR_RI_BIT) \
|
||||
| IA64_PSR_BN | IA64_PSR_I)
|
||||
|
||||
invala // M0|1
|
||||
movl r14=ia64_ret_from_syscall // X
|
||||
|
||||
nop.m 0
|
||||
movl r28=__kernel_syscall_via_break // X create cr.iip
|
||||
;;
|
||||
|
||||
mov r2=r16 // A get task addr to addl-addressable register
|
||||
adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16 // A
|
||||
mov r31=pr // I0 save pr (2 cyc)
|
||||
;;
|
||||
st1 [r16]=r0 // M2|3 clear current->thread.on_ustack flag
|
||||
addl r22=IA64_RBS_OFFSET,r2 // A compute base of RBS
|
||||
add r3=TI_FLAGS+IA64_TASK_SIZE,r2 // A
|
||||
;;
|
||||
ld4 r3=[r3] // M0|1 r3 = current_thread_info()->flags
|
||||
lfetch.fault.excl.nt1 [r22] // M0|1 prefetch register backing-store
|
||||
nop.i 0
|
||||
;;
|
||||
mov ar.rsc=0 // M2 set enforced lazy mode, pl 0, LE, loadrs=0
|
||||
nop.m 0
|
||||
nop.i 0
|
||||
;;
|
||||
mov r23=ar.bspstore // M2 (12 cyc) save ar.bspstore
|
||||
mov.m r24=ar.rnat // M2 (5 cyc) read ar.rnat (dual-issues!)
|
||||
nop.i 0
|
||||
;;
|
||||
mov ar.bspstore=r22 // M2 (6 cyc) switch to kernel RBS
|
||||
movl r8=PSR_ONE_BITS // X
|
||||
;;
|
||||
mov r25=ar.unat // M2 (5 cyc) save ar.unat
|
||||
mov r19=b6 // I0 save b6 (2 cyc)
|
||||
mov r20=r1 // A save caller's gp in r20
|
||||
;;
|
||||
or r29=r8,r29 // A construct cr.ipsr value to save
|
||||
mov b6=r18 // I0 copy syscall entry-point to b6 (7 cyc)
|
||||
addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r2 // A compute base of memory stack
|
||||
|
||||
mov r18=ar.bsp // M2 save (kernel) ar.bsp (12 cyc)
|
||||
cmp.ne pKStk,pUStk=r0,r0 // A set pKStk <- 0, pUStk <- 1
|
||||
br.call.sptk.many b7=ia64_syscall_setup // B
|
||||
;;
|
||||
mov ar.rsc=0x3 // M2 set eager mode, pl 0, LE, loadrs=0
|
||||
mov rp=r14 // I0 set the real return addr
|
||||
and r3=_TIF_SYSCALL_TRACEAUDIT,r3 // A
|
||||
;;
|
||||
#ifdef CONFIG_XEN
|
||||
movl r14=running_on_xen;;
|
||||
ld4 r14=[r14];;
|
||||
// p14 = running_on_xen
|
||||
// p15 = !running_on_xen
|
||||
cmp.ne p14,p15=r0,r14
|
||||
;;
|
||||
(p14) movl r28=XSI_PSR_I_ADDR;;
|
||||
(p14) ld8 r28=[r28];;
|
||||
(p14) adds r28=-1,r28;; // event_pending
|
||||
(p14) ld1 r14=[r28];;
|
||||
(p14) cmp.ne.unc p13,p14=r14,r0;;
|
||||
(p13) XEN_HYPER_SSM_I
|
||||
(p14) adds r28=1,r28;; // event_mask
|
||||
(p14) st1 [r28]=r0;;
|
||||
(p15) ssm psr.i
|
||||
#else
|
||||
ssm psr.i // M2 we're on kernel stacks now, reenable irqs
|
||||
#endif
|
||||
cmp.eq p8,p0=r3,r0 // A
|
||||
(p10) br.cond.spnt.many ia64_ret_from_syscall // B return if bad call-frame or r15 is a NaT
|
||||
|
||||
nop.m 0
|
||||
(p8) br.call.sptk.many b6=b6 // B (ignore return address)
|
||||
br.cond.spnt ia64_trace_syscall // B
|
||||
END(fsys_bubble_down)
|
||||
|
||||
.rodata
|
||||
.align 8
|
||||
.globl fsyscall_table
|
||||
|
||||
data8 fsys_bubble_down
|
||||
fsyscall_table:
|
||||
data8 fsys_ni_syscall
|
||||
data8 0 // exit // 1025
|
||||
data8 0 // read
|
||||
data8 0 // write
|
||||
data8 0 // open
|
||||
data8 0 // close
|
||||
data8 0 // creat // 1030
|
||||
data8 0 // link
|
||||
data8 0 // unlink
|
||||
data8 0 // execve
|
||||
data8 0 // chdir
|
||||
data8 0 // fchdir // 1035
|
||||
data8 0 // utimes
|
||||
data8 0 // mknod
|
||||
data8 0 // chmod
|
||||
data8 0 // chown
|
||||
data8 0 // lseek // 1040
|
||||
data8 fsys_getpid // getpid
|
||||
data8 fsys_getppid // getppid
|
||||
data8 0 // mount
|
||||
data8 0 // umount
|
||||
data8 0 // setuid // 1045
|
||||
data8 0 // getuid
|
||||
data8 0 // geteuid
|
||||
data8 0 // ptrace
|
||||
data8 0 // access
|
||||
data8 0 // sync // 1050
|
||||
data8 0 // fsync
|
||||
data8 0 // fdatasync
|
||||
data8 0 // kill
|
||||
data8 0 // rename
|
||||
data8 0 // mkdir // 1055
|
||||
data8 0 // rmdir
|
||||
data8 0 // dup
|
||||
data8 0 // pipe
|
||||
data8 0 // times
|
||||
data8 0 // brk // 1060
|
||||
data8 0 // setgid
|
||||
data8 0 // getgid
|
||||
data8 0 // getegid
|
||||
data8 0 // acct
|
||||
data8 0 // ioctl // 1065
|
||||
data8 0 // fcntl
|
||||
data8 0 // umask
|
||||
data8 0 // chroot
|
||||
data8 0 // ustat
|
||||
data8 0 // dup2 // 1070
|
||||
data8 0 // setreuid
|
||||
data8 0 // setregid
|
||||
data8 0 // getresuid
|
||||
data8 0 // setresuid
|
||||
data8 0 // getresgid // 1075
|
||||
data8 0 // setresgid
|
||||
data8 0 // getgroups
|
||||
data8 0 // setgroups
|
||||
data8 0 // getpgid
|
||||
data8 0 // setpgid // 1080
|
||||
data8 0 // setsid
|
||||
data8 0 // getsid
|
||||
data8 0 // sethostname
|
||||
data8 0 // setrlimit
|
||||
data8 0 // getrlimit // 1085
|
||||
data8 0 // getrusage
|
||||
data8 fsys_gettimeofday // gettimeofday
|
||||
data8 0 // settimeofday
|
||||
data8 0 // select
|
||||
data8 0 // poll // 1090
|
||||
data8 0 // symlink
|
||||
data8 0 // readlink
|
||||
data8 0 // uselib
|
||||
data8 0 // swapon
|
||||
data8 0 // swapoff // 1095
|
||||
data8 0 // reboot
|
||||
data8 0 // truncate
|
||||
data8 0 // ftruncate
|
||||
data8 0 // fchmod
|
||||
data8 0 // fchown // 1100
|
||||
data8 0 // getpriority
|
||||
data8 0 // setpriority
|
||||
data8 0 // statfs
|
||||
data8 0 // fstatfs
|
||||
data8 0 // gettid // 1105
|
||||
data8 0 // semget
|
||||
data8 0 // semop
|
||||
data8 0 // semctl
|
||||
data8 0 // msgget
|
||||
data8 0 // msgsnd // 1110
|
||||
data8 0 // msgrcv
|
||||
data8 0 // msgctl
|
||||
data8 0 // shmget
|
||||
data8 0 // shmat
|
||||
data8 0 // shmdt // 1115
|
||||
data8 0 // shmctl
|
||||
data8 0 // syslog
|
||||
data8 0 // setitimer
|
||||
data8 0 // getitimer
|
||||
data8 0 // 1120
|
||||
data8 0
|
||||
data8 0
|
||||
data8 0 // vhangup
|
||||
data8 0 // lchown
|
||||
data8 0 // remap_file_pages // 1125
|
||||
data8 0 // wait4
|
||||
data8 0 // sysinfo
|
||||
data8 0 // clone
|
||||
data8 0 // setdomainname
|
||||
data8 0 // newuname // 1130
|
||||
data8 0 // adjtimex
|
||||
data8 0
|
||||
data8 0 // init_module
|
||||
data8 0 // delete_module
|
||||
data8 0 // 1135
|
||||
data8 0
|
||||
data8 0 // quotactl
|
||||
data8 0 // bdflush
|
||||
data8 0 // sysfs
|
||||
data8 0 // personality // 1140
|
||||
data8 0 // afs_syscall
|
||||
data8 0 // setfsuid
|
||||
data8 0 // setfsgid
|
||||
data8 0 // getdents
|
||||
data8 0 // flock // 1145
|
||||
data8 0 // readv
|
||||
data8 0 // writev
|
||||
data8 0 // pread64
|
||||
data8 0 // pwrite64
|
||||
data8 0 // sysctl // 1150
|
||||
data8 0 // mmap
|
||||
data8 0 // munmap
|
||||
data8 0 // mlock
|
||||
data8 0 // mlockall
|
||||
data8 0 // mprotect // 1155
|
||||
data8 0 // mremap
|
||||
data8 0 // msync
|
||||
data8 0 // munlock
|
||||
data8 0 // munlockall
|
||||
data8 0 // sched_getparam // 1160
|
||||
data8 0 // sched_setparam
|
||||
data8 0 // sched_getscheduler
|
||||
data8 0 // sched_setscheduler
|
||||
data8 0 // sched_yield
|
||||
data8 0 // sched_get_priority_max // 1165
|
||||
data8 0 // sched_get_priority_min
|
||||
data8 0 // sched_rr_get_interval
|
||||
data8 0 // nanosleep
|
||||
data8 0 // nfsservctl
|
||||
data8 0 // prctl // 1170
|
||||
data8 0 // getpagesize
|
||||
data8 0 // mmap2
|
||||
data8 0 // pciconfig_read
|
||||
data8 0 // pciconfig_write
|
||||
data8 0 // perfmonctl // 1175
|
||||
data8 0 // sigaltstack
|
||||
data8 0 // rt_sigaction
|
||||
data8 0 // rt_sigpending
|
||||
data8 fsys_rt_sigprocmask // rt_sigprocmask
|
||||
data8 0 // rt_sigqueueinfo // 1180
|
||||
data8 0 // rt_sigreturn
|
||||
data8 0 // rt_sigsuspend
|
||||
data8 0 // rt_sigtimedwait
|
||||
data8 0 // getcwd
|
||||
data8 0 // capget // 1185
|
||||
data8 0 // capset
|
||||
data8 0 // sendfile
|
||||
data8 0
|
||||
data8 0
|
||||
data8 0 // socket // 1190
|
||||
data8 0 // bind
|
||||
data8 0 // connect
|
||||
data8 0 // listen
|
||||
data8 0 // accept
|
||||
data8 0 // getsockname // 1195
|
||||
data8 0 // getpeername
|
||||
data8 0 // socketpair
|
||||
data8 0 // send
|
||||
data8 0 // sendto
|
||||
data8 0 // recv // 1200
|
||||
data8 0 // recvfrom
|
||||
data8 0 // shutdown
|
||||
data8 0 // setsockopt
|
||||
data8 0 // getsockopt
|
||||
data8 0 // sendmsg // 1205
|
||||
data8 0 // recvmsg
|
||||
data8 0 // pivot_root
|
||||
data8 0 // mincore
|
||||
data8 0 // madvise
|
||||
data8 0 // newstat // 1210
|
||||
data8 0 // newlstat
|
||||
data8 0 // newfstat
|
||||
data8 0 // clone2
|
||||
data8 0 // getdents64
|
||||
data8 0 // getunwind // 1215
|
||||
data8 0 // readahead
|
||||
data8 0 // setxattr
|
||||
data8 0 // lsetxattr
|
||||
data8 0 // fsetxattr
|
||||
data8 0 // getxattr // 1220
|
||||
data8 0 // lgetxattr
|
||||
data8 0 // fgetxattr
|
||||
data8 0 // listxattr
|
||||
data8 0 // llistxattr
|
||||
data8 0 // flistxattr // 1225
|
||||
data8 0 // removexattr
|
||||
data8 0 // lremovexattr
|
||||
data8 0 // fremovexattr
|
||||
data8 0 // tkill
|
||||
data8 0 // futex // 1230
|
||||
data8 0 // sched_setaffinity
|
||||
data8 0 // sched_getaffinity
|
||||
data8 fsys_set_tid_address // set_tid_address
|
||||
data8 0 // fadvise64_64
|
||||
data8 0 // tgkill // 1235
|
||||
data8 0 // exit_group
|
||||
data8 0 // lookup_dcookie
|
||||
data8 0 // io_setup
|
||||
data8 0 // io_destroy
|
||||
data8 0 // io_getevents // 1240
|
||||
data8 0 // io_submit
|
||||
data8 0 // io_cancel
|
||||
data8 0 // epoll_create
|
||||
data8 0 // epoll_ctl
|
||||
data8 0 // epoll_wait // 1245
|
||||
data8 0 // restart_syscall
|
||||
data8 0 // semtimedop
|
||||
data8 0 // timer_create
|
||||
data8 0 // timer_settime
|
||||
data8 0 // timer_gettime // 1250
|
||||
data8 0 // timer_getoverrun
|
||||
data8 0 // timer_delete
|
||||
data8 0 // clock_settime
|
||||
data8 fsys_clock_gettime // clock_gettime
|
||||
|
||||
// fill in zeros for the remaining entries
|
||||
.zero:
|
||||
.space fsyscall_table + 8*NR_syscalls - .zero, 0
|
||||
@@ -6,7 +6,6 @@
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/errno.h>
|
||||
@@ -57,18 +56,6 @@
|
||||
[1:] movl reg=0; \
|
||||
.xdata4 ".data.patch.running_on_xen", 1b-.
|
||||
|
||||
.section ".data.patch.brl_xen_rsm_be_i", "a"
|
||||
.previous
|
||||
#define BRL_COND_XEN_RSM_BE_I(pr) \
|
||||
[1:](pr)brl.cond.sptk 0; \
|
||||
.xdata4 ".data.patch.brl_xen_rsm_be_i", 1b-.
|
||||
|
||||
.section ".data.patch.brl_xen_get_psr", "a"
|
||||
.previous
|
||||
#define BRL_COND_XEN_GET_PSR(pr) \
|
||||
[1:](pr)brl.cond.sptk 0; \
|
||||
.xdata4 ".data.patch.brl_xen_get_psr", 1b-.
|
||||
|
||||
.section ".data.patch.brl_xen_ssm_i_0", "a"
|
||||
.previous
|
||||
#define BRL_COND_XEN_SSM_I_0(pr) \
|
||||
@@ -156,9 +143,9 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
|
||||
cmp.ne isXen,isRaw=r0,r30
|
||||
;;
|
||||
(isRaw) rsm psr.be | psr.i
|
||||
BRL_COND_XEN_RSM_BE_I(isXen)
|
||||
.global .vdso_rsm_be_i_ret
|
||||
.vdso_rsm_be_i_ret:
|
||||
(isXen) st1 [r22]=r20
|
||||
(isXen) rum psr.be
|
||||
;;
|
||||
#else
|
||||
rsm psr.be | psr.i // M2 (5 cyc to srlz.d)
|
||||
#endif
|
||||
@@ -171,9 +158,9 @@ GLOBAL_ENTRY(__kernel_syscall_via_epc)
|
||||
lfetch [r18] // M0|1
|
||||
#ifdef CONFIG_XEN_IA64_VDSO_PARAVIRT
|
||||
(isRaw) mov r29=psr
|
||||
BRL_COND_XEN_GET_PSR(isXen)
|
||||
.global .vdso_get_psr_ret
|
||||
.vdso_get_psr_ret:
|
||||
(isXen) XEN_HYPER_GET_PSR
|
||||
;;
|
||||
(isXen) mov r29=r8
|
||||
#else
|
||||
mov r29=psr // M2 (12 cyc)
|
||||
#endif
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
* in one page). This script controls its layout.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
|
||||
@@ -50,14 +49,6 @@ SECTIONS
|
||||
*(.data.patch.running_on_xen)
|
||||
__end_gate_running_on_xen_patchlist = .;
|
||||
|
||||
__start_gate_brl_xen_rsm_be_i_patchlist = .;
|
||||
*(.data.patch.brl_xen_rsm_be_i)
|
||||
__end_gate_brl_xen_rsm_be_i_patchlist = .;
|
||||
|
||||
__start_gate_brl_xen_get_psr_patchlist = .;
|
||||
*(.data.patch.brl_xen_get_psr)
|
||||
__end_gate_brl_xen_get_psr_patchlist = .;
|
||||
|
||||
__start_gate_brl_xen_ssm_i_0_patchlist = .;
|
||||
*(.data.patch.brl_xen_ssm_i_0)
|
||||
__end_gate_brl_xen_ssm_i_0_patchlist = .;
|
||||
@@ -82,6 +73,7 @@ SECTIONS
|
||||
*(.dynbss)
|
||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||
*(__ex_table)
|
||||
*(__mca_table)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
* Support for CPU Hotplug
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <asm/asmmacro.h>
|
||||
#include <asm/fpu.h>
|
||||
@@ -198,6 +197,11 @@ start_ap:
|
||||
;;
|
||||
srlz.i
|
||||
;;
|
||||
{
|
||||
flushrs // must be first insn in group
|
||||
srlz.i
|
||||
}
|
||||
;;
|
||||
/*
|
||||
* Save the region registers, predicate before they get clobbered
|
||||
*/
|
||||
@@ -860,7 +864,6 @@ END(__ia64_init_fpu)
|
||||
*/
|
||||
GLOBAL_ENTRY(ia64_switch_mode_phys)
|
||||
{
|
||||
alloc r2=ar.pfs,0,0,0,0
|
||||
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
||||
mov r15=ip
|
||||
}
|
||||
@@ -909,7 +912,6 @@ END(ia64_switch_mode_phys)
|
||||
*/
|
||||
GLOBAL_ENTRY(ia64_switch_mode_virt)
|
||||
{
|
||||
alloc r2=ar.pfs,0,0,0,0
|
||||
rsm psr.i | psr.ic // disable interrupts and interrupt collection
|
||||
mov r15=ip
|
||||
}
|
||||
|
||||
@@ -9,54 +9,65 @@
|
||||
* Copyright (C) 1999 VA Linux Systems
|
||||
* Copyright (C) 1999,2000 Walt Drummond <drummond@valinux.com>
|
||||
*
|
||||
* 00/04/19 D. Mosberger Rewritten to mirror more closely the x86 I/O APIC code.
|
||||
* In particular, we now have separate handlers for edge
|
||||
* and level triggered interrupts.
|
||||
* 00/10/27 Asit Mallick, Goutham Rao <goutham.rao@intel.com> IRQ vector allocation
|
||||
* PCI to vector mapping, shared PCI interrupts.
|
||||
* 00/10/27 D. Mosberger Document things a bit more to make them more understandable.
|
||||
* Clean up much of the old IOSAPIC cruft.
|
||||
* 01/07/27 J.I. Lee PCI irq routing, Platform/Legacy interrupts and fixes for
|
||||
* ACPI S5(SoftOff) support.
|
||||
* 00/04/19 D. Mosberger Rewritten to mirror more closely the x86 I/O
|
||||
* APIC code. In particular, we now have separate
|
||||
* handlers for edge and level triggered
|
||||
* interrupts.
|
||||
* 00/10/27 Asit Mallick, Goutham Rao <goutham.rao@intel.com> IRQ vector
|
||||
* allocation PCI to vector mapping, shared PCI
|
||||
* interrupts.
|
||||
* 00/10/27 D. Mosberger Document things a bit more to make them more
|
||||
* understandable. Clean up much of the old
|
||||
* IOSAPIC cruft.
|
||||
* 01/07/27 J.I. Lee PCI irq routing, Platform/Legacy interrupts
|
||||
* and fixes for ACPI S5(SoftOff) support.
|
||||
* 02/01/23 J.I. Lee iosapic pgm fixes for PCI irq routing from _PRT
|
||||
* 02/01/07 E. Focht <efocht@ess.nec.de> Redirectable interrupt vectors in
|
||||
* iosapic_set_affinity(), initializations for
|
||||
* /proc/irq/#/smp_affinity
|
||||
* 02/01/07 E. Focht <efocht@ess.nec.de> Redirectable interrupt
|
||||
* vectors in iosapic_set_affinity(),
|
||||
* initializations for /proc/irq/#/smp_affinity
|
||||
* 02/04/02 P. Diefenbaugh Cleaned up ACPI PCI IRQ routing.
|
||||
* 02/04/18 J.I. Lee bug fix in iosapic_init_pci_irq
|
||||
* 02/04/30 J.I. Lee bug fix in find_iosapic to fix ACPI PCI IRQ to IOSAPIC mapping
|
||||
* error
|
||||
* 02/04/30 J.I. Lee bug fix in find_iosapic to fix ACPI PCI IRQ to
|
||||
* IOSAPIC mapping error
|
||||
* 02/07/29 T. Kochi Allocate interrupt vectors dynamically
|
||||
* 02/08/04 T. Kochi Cleaned up terminology (irq, global system interrupt, vector, etc.)
|
||||
* 02/09/20 D. Mosberger Simplified by taking advantage of ACPI's pci_irq code.
|
||||
* 02/08/04 T. Kochi Cleaned up terminology (irq, global system
|
||||
* interrupt, vector, etc.)
|
||||
* 02/09/20 D. Mosberger Simplified by taking advantage of ACPI's
|
||||
* pci_irq code.
|
||||
* 03/02/19 B. Helgaas Make pcat_compat system-wide, not per-IOSAPIC.
|
||||
* Remove iosapic_address & gsi_base from external interfaces.
|
||||
* Rationalize __init/__devinit attributes.
|
||||
* Remove iosapic_address & gsi_base from
|
||||
* external interfaces. Rationalize
|
||||
* __init/__devinit attributes.
|
||||
* 04/12/04 Ashok Raj <ashok.raj@intel.com> Intel Corporation 2004
|
||||
* Updated to work with irq migration necessary for CPU Hotplug
|
||||
* Updated to work with irq migration necessary
|
||||
* for CPU Hotplug
|
||||
*/
|
||||
/*
|
||||
* Here is what the interrupt logic between a PCI device and the kernel looks like:
|
||||
* Here is what the interrupt logic between a PCI device and the kernel looks
|
||||
* like:
|
||||
*
|
||||
* (1) A PCI device raises one of the four interrupt pins (INTA, INTB, INTC, INTD). The
|
||||
* device is uniquely identified by its bus--, and slot-number (the function
|
||||
* number does not matter here because all functions share the same interrupt
|
||||
* lines).
|
||||
* (1) A PCI device raises one of the four interrupt pins (INTA, INTB, INTC,
|
||||
* INTD). The device is uniquely identified by its bus-, and slot-number
|
||||
* (the function number does not matter here because all functions share
|
||||
* the same interrupt lines).
|
||||
*
|
||||
* (2) The motherboard routes the interrupt line to a pin on a IOSAPIC controller.
|
||||
* Multiple interrupt lines may have to share the same IOSAPIC pin (if they're level
|
||||
* triggered and use the same polarity). Each interrupt line has a unique Global
|
||||
* System Interrupt (GSI) number which can be calculated as the sum of the controller's
|
||||
* base GSI number and the IOSAPIC pin number to which the line connects.
|
||||
* (2) The motherboard routes the interrupt line to a pin on a IOSAPIC
|
||||
* controller. Multiple interrupt lines may have to share the same
|
||||
* IOSAPIC pin (if they're level triggered and use the same polarity).
|
||||
* Each interrupt line has a unique Global System Interrupt (GSI) number
|
||||
* which can be calculated as the sum of the controller's base GSI number
|
||||
* and the IOSAPIC pin number to which the line connects.
|
||||
*
|
||||
* (3) The IOSAPIC uses an internal routing table entries (RTEs) to map the IOSAPIC pin
|
||||
* into the IA-64 interrupt vector. This interrupt vector is then sent to the CPU.
|
||||
* (3) The IOSAPIC uses an internal routing table entries (RTEs) to map the
|
||||
* IOSAPIC pin into the IA-64 interrupt vector. This interrupt vector is then
|
||||
* sent to the CPU.
|
||||
*
|
||||
* (4) The kernel recognizes an interrupt as an IRQ. The IRQ interface is used as
|
||||
* architecture-independent interrupt handling mechanism in Linux. As an
|
||||
* IRQ is a number, we have to have IA-64 interrupt vector number <-> IRQ number
|
||||
* mapping. On smaller systems, we use one-to-one mapping between IA-64 vector and
|
||||
* IRQ. A platform can implement platform_irq_to_vector(irq) and
|
||||
* (4) The kernel recognizes an interrupt as an IRQ. The IRQ interface is
|
||||
* used as architecture-independent interrupt handling mechanism in Linux.
|
||||
* As an IRQ is a number, we have to have
|
||||
* IA-64 interrupt vector number <-> IRQ number mapping. On smaller
|
||||
* systems, we use one-to-one mapping between IA-64 vector and IRQ. A
|
||||
* platform can implement platform_irq_to_vector(irq) and
|
||||
* platform_local_vector_to_irq(vector) APIs to differentiate the mapping.
|
||||
* Please see also include/asm-ia64/hw_irq.h for those APIs.
|
||||
*
|
||||
@@ -64,11 +75,10 @@
|
||||
*
|
||||
* PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ
|
||||
*
|
||||
* Note: The term "IRQ" is loosely used everywhere in Linux kernel to describe interrupts.
|
||||
* Now we use "IRQ" only for Linux IRQ's. ISA IRQ (isa_irq) is the only exception in this
|
||||
* source code.
|
||||
* Note: The term "IRQ" is loosely used everywhere in Linux kernel to
|
||||
* describeinterrupts. Now we use "IRQ" only for Linux IRQ's. ISA IRQ
|
||||
* (isa_irq) is the only exception in this source code.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/init.h>
|
||||
@@ -90,7 +100,6 @@
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
|
||||
#undef DEBUG_INTERRUPT_ROUTING
|
||||
|
||||
#ifdef DEBUG_INTERRUPT_ROUTING
|
||||
@@ -99,36 +108,46 @@
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
#define NR_PREALLOCATE_RTE_ENTRIES (PAGE_SIZE / sizeof(struct iosapic_rte_info))
|
||||
#define NR_PREALLOCATE_RTE_ENTRIES \
|
||||
(PAGE_SIZE / sizeof(struct iosapic_rte_info))
|
||||
#define RTE_PREALLOCATED (1)
|
||||
|
||||
static DEFINE_SPINLOCK(iosapic_lock);
|
||||
|
||||
/* These tables map IA-64 vectors to the IOSAPIC pin that generates this vector. */
|
||||
/*
|
||||
* These tables map IA-64 vectors to the IOSAPIC pin that generates this
|
||||
* vector.
|
||||
*/
|
||||
|
||||
struct iosapic_rte_info {
|
||||
struct list_head rte_list; /* node in list of RTEs sharing the same vector */
|
||||
struct list_head rte_list; /* node in list of RTEs sharing the
|
||||
* same vector */
|
||||
char __iomem *addr; /* base address of IOSAPIC */
|
||||
unsigned int gsi_base; /* first GSI assigned to this IOSAPIC */
|
||||
unsigned int gsi_base; /* first GSI assigned to this
|
||||
* IOSAPIC */
|
||||
char rte_index; /* IOSAPIC RTE index */
|
||||
int refcnt; /* reference counter */
|
||||
unsigned int flags; /* flags */
|
||||
} ____cacheline_aligned;
|
||||
|
||||
static struct iosapic_intr_info {
|
||||
struct list_head rtes; /* RTEs using this vector (empty => not an IOSAPIC interrupt) */
|
||||
struct list_head rtes; /* RTEs using this vector (empty =>
|
||||
* not an IOSAPIC interrupt) */
|
||||
int count; /* # of RTEs that shares this vector */
|
||||
u32 low32; /* current value of low word of Redirection table entry */
|
||||
u32 low32; /* current value of low word of
|
||||
* Redirection table entry */
|
||||
unsigned int dest; /* destination CPU physical ID */
|
||||
unsigned char dmode : 3; /* delivery mode (see iosapic.h) */
|
||||
unsigned char polarity: 1; /* interrupt polarity (see iosapic.h) */
|
||||
unsigned char polarity: 1; /* interrupt polarity
|
||||
* (see iosapic.h) */
|
||||
unsigned char trigger : 1; /* trigger mode (see iosapic.h) */
|
||||
} iosapic_intr_info[IA64_NUM_VECTORS];
|
||||
|
||||
static struct iosapic {
|
||||
char __iomem *addr; /* base address of IOSAPIC */
|
||||
unsigned int gsi_base; /* first GSI assigned to this IOSAPIC */
|
||||
unsigned short num_rte; /* number of RTE in this IOSAPIC */
|
||||
unsigned int gsi_base; /* first GSI assigned to this
|
||||
* IOSAPIC */
|
||||
unsigned short num_rte; /* # of RTEs on this IOSAPIC */
|
||||
int rtes_inuse; /* # of RTEs in use on this IOSAPIC */
|
||||
#ifdef CONFIG_NUMA
|
||||
unsigned short node; /* numa node association via pxm */
|
||||
@@ -218,7 +237,8 @@ find_iosapic (unsigned int gsi)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NR_IOSAPICS; i++) {
|
||||
if ((unsigned) (gsi - iosapic_lists[i].gsi_base) < iosapic_lists[i].num_rte)
|
||||
if ((unsigned) (gsi - iosapic_lists[i].gsi_base) <
|
||||
iosapic_lists[i].num_rte)
|
||||
return i;
|
||||
}
|
||||
|
||||
@@ -231,7 +251,8 @@ _gsi_to_vector (unsigned int gsi)
|
||||
struct iosapic_intr_info *info;
|
||||
struct iosapic_rte_info *rte;
|
||||
|
||||
for (info = iosapic_intr_info; info < iosapic_intr_info + IA64_NUM_VECTORS; ++info)
|
||||
for (info = iosapic_intr_info; info <
|
||||
iosapic_intr_info + IA64_NUM_VECTORS; ++info)
|
||||
list_for_each_entry(rte, &info->rtes, rte_list)
|
||||
if (rte->gsi_base + rte->rte_index == gsi)
|
||||
return info - iosapic_intr_info;
|
||||
@@ -254,8 +275,8 @@ gsi_to_irq (unsigned int gsi)
|
||||
unsigned long flags;
|
||||
int irq;
|
||||
/*
|
||||
* XXX fix me: this assumes an identity mapping vetween IA-64 vector and Linux irq
|
||||
* numbers...
|
||||
* XXX fix me: this assumes an identity mapping between IA-64 vector
|
||||
* and Linux irq numbers...
|
||||
*/
|
||||
spin_lock_irqsave(&iosapic_lock, flags);
|
||||
{
|
||||
@@ -266,7 +287,8 @@ gsi_to_irq (unsigned int gsi)
|
||||
return irq;
|
||||
}
|
||||
|
||||
static struct iosapic_rte_info *gsi_vector_to_rte(unsigned int gsi, unsigned int vec)
|
||||
static struct iosapic_rte_info *gsi_vector_to_rte(unsigned int gsi,
|
||||
unsigned int vec)
|
||||
{
|
||||
struct iosapic_rte_info *rte;
|
||||
|
||||
@@ -306,7 +328,9 @@ set_rte (unsigned int gsi, unsigned int vector, unsigned int dest, int mask)
|
||||
|
||||
for (irq = 0; irq < NR_IRQS; ++irq)
|
||||
if (irq_to_vector(irq) == vector) {
|
||||
set_irq_affinity_info(irq, (int)(dest & 0xffff), redir);
|
||||
set_irq_affinity_info(irq,
|
||||
(int)(dest & 0xffff),
|
||||
redir);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -328,7 +352,7 @@ set_rte (unsigned int gsi, unsigned int vector, unsigned int dest, int mask)
|
||||
}
|
||||
|
||||
static void
|
||||
nop (unsigned int vector)
|
||||
nop (unsigned int irq)
|
||||
{
|
||||
/* do nothing... */
|
||||
}
|
||||
@@ -350,7 +374,8 @@ mask_irq (unsigned int irq)
|
||||
{
|
||||
/* set only the mask bit */
|
||||
low32 = iosapic_intr_info[vec].low32 |= IOSAPIC_MASK;
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) {
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
|
||||
rte_list) {
|
||||
addr = rte->addr;
|
||||
rte_index = rte->rte_index;
|
||||
iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
|
||||
@@ -375,7 +400,8 @@ unmask_irq (unsigned int irq)
|
||||
spin_lock_irqsave(&iosapic_lock, flags);
|
||||
{
|
||||
low32 = iosapic_intr_info[vec].low32 &= ~IOSAPIC_MASK;
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) {
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
|
||||
rte_list) {
|
||||
addr = rte->addr;
|
||||
rte_index = rte->rte_index;
|
||||
iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
|
||||
@@ -415,21 +441,25 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask)
|
||||
|
||||
spin_lock_irqsave(&iosapic_lock, flags);
|
||||
{
|
||||
low32 = iosapic_intr_info[vec].low32 & ~(7 << IOSAPIC_DELIVERY_SHIFT);
|
||||
low32 = iosapic_intr_info[vec].low32 &
|
||||
~(7 << IOSAPIC_DELIVERY_SHIFT);
|
||||
|
||||
if (redir)
|
||||
/* change delivery mode to lowest priority */
|
||||
low32 |= (IOSAPIC_LOWEST_PRIORITY << IOSAPIC_DELIVERY_SHIFT);
|
||||
low32 |= (IOSAPIC_LOWEST_PRIORITY <<
|
||||
IOSAPIC_DELIVERY_SHIFT);
|
||||
else
|
||||
/* change delivery mode to fixed */
|
||||
low32 |= (IOSAPIC_FIXED << IOSAPIC_DELIVERY_SHIFT);
|
||||
|
||||
iosapic_intr_info[vec].low32 = low32;
|
||||
iosapic_intr_info[vec].dest = dest;
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list) {
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes,
|
||||
rte_list) {
|
||||
addr = rte->addr;
|
||||
rte_index = rte->rte_index;
|
||||
iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index), high32);
|
||||
iosapic_write(addr, IOSAPIC_RTE_HIGH(rte_index),
|
||||
high32);
|
||||
iosapic_write(addr, IOSAPIC_RTE_LOW(rte_index), low32);
|
||||
}
|
||||
}
|
||||
@@ -454,7 +484,7 @@ iosapic_end_level_irq (unsigned int irq)
|
||||
ia64_vector vec = irq_to_vector(irq);
|
||||
struct iosapic_rte_info *rte;
|
||||
|
||||
move_irq(irq);
|
||||
move_native_irq(irq);
|
||||
list_for_each_entry(rte, &iosapic_intr_info[vec].rtes, rte_list)
|
||||
iosapic_eoi(rte->addr, vec);
|
||||
}
|
||||
@@ -494,15 +524,16 @@ iosapic_startup_edge_irq (unsigned int irq)
|
||||
static void
|
||||
iosapic_ack_edge_irq (unsigned int irq)
|
||||
{
|
||||
irq_desc_t *idesc = irq_descp(irq);
|
||||
irq_desc_t *idesc = irq_desc + irq;
|
||||
|
||||
move_irq(irq);
|
||||
move_native_irq(irq);
|
||||
/*
|
||||
* Once we have recorded IRQ_PENDING already, we can mask the
|
||||
* interrupt for real. This prevents IRQ storms from unhandled
|
||||
* devices.
|
||||
*/
|
||||
if ((idesc->status & (IRQ_PENDING|IRQ_DISABLED)) == (IRQ_PENDING|IRQ_DISABLED))
|
||||
if ((idesc->status & (IRQ_PENDING|IRQ_DISABLED)) ==
|
||||
(IRQ_PENDING|IRQ_DISABLED))
|
||||
mask_irq(irq);
|
||||
}
|
||||
|
||||
@@ -536,7 +567,8 @@ iosapic_version (char __iomem *addr)
|
||||
return iosapic_read(addr, IOSAPIC_VERSION);
|
||||
}
|
||||
|
||||
static int iosapic_find_sharable_vector (unsigned long trigger, unsigned long pol)
|
||||
static int iosapic_find_sharable_vector (unsigned long trigger,
|
||||
unsigned long pol)
|
||||
{
|
||||
int i, vector = -1, min_count = -1;
|
||||
struct iosapic_intr_info *info;
|
||||
@@ -551,7 +583,8 @@ static int iosapic_find_sharable_vector (unsigned long trigger, unsigned long po
|
||||
for (i = IA64_FIRST_DEVICE_VECTOR; i <= IA64_LAST_DEVICE_VECTOR; i++) {
|
||||
info = &iosapic_intr_info[i];
|
||||
if (info->trigger == trigger && info->polarity == pol &&
|
||||
(info->dmode == IOSAPIC_FIXED || info->dmode == IOSAPIC_LOWEST_PRIORITY)) {
|
||||
(info->dmode == IOSAPIC_FIXED || info->dmode ==
|
||||
IOSAPIC_LOWEST_PRIORITY)) {
|
||||
if (min_count == -1 || info->count < min_count) {
|
||||
vector = i;
|
||||
min_count = info->count;
|
||||
@@ -575,12 +608,15 @@ iosapic_reassign_vector (int vector)
|
||||
new_vector = assign_irq_vector(AUTO_ASSIGN);
|
||||
if (new_vector < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __FUNCTION__);
|
||||
printk(KERN_INFO "Reassigning vector %d to %d\n", vector, new_vector);
|
||||
printk(KERN_INFO "Reassigning vector %d to %d\n",
|
||||
vector, new_vector);
|
||||
memcpy(&iosapic_intr_info[new_vector], &iosapic_intr_info[vector],
|
||||
sizeof(struct iosapic_intr_info));
|
||||
INIT_LIST_HEAD(&iosapic_intr_info[new_vector].rtes);
|
||||
list_move(iosapic_intr_info[vector].rtes.next, &iosapic_intr_info[new_vector].rtes);
|
||||
memset(&iosapic_intr_info[vector], 0, sizeof(struct iosapic_intr_info));
|
||||
list_move(iosapic_intr_info[vector].rtes.next,
|
||||
&iosapic_intr_info[new_vector].rtes);
|
||||
memset(&iosapic_intr_info[vector], 0,
|
||||
sizeof(struct iosapic_intr_info));
|
||||
iosapic_intr_info[vector].low32 = IOSAPIC_MASK;
|
||||
INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
|
||||
}
|
||||
@@ -593,7 +629,8 @@ static struct iosapic_rte_info *iosapic_alloc_rte (void)
|
||||
int preallocated = 0;
|
||||
|
||||
if (!iosapic_kmalloc_ok && list_empty(&free_rte_list)) {
|
||||
rte = alloc_bootmem(sizeof(struct iosapic_rte_info) * NR_PREALLOCATE_RTE_ENTRIES);
|
||||
rte = alloc_bootmem(sizeof(struct iosapic_rte_info) *
|
||||
NR_PREALLOCATE_RTE_ENTRIES);
|
||||
if (!rte)
|
||||
return NULL;
|
||||
for (i = 0; i < NR_PREALLOCATE_RTE_ENTRIES; i++, rte++)
|
||||
@@ -601,7 +638,8 @@ static struct iosapic_rte_info *iosapic_alloc_rte (void)
|
||||
}
|
||||
|
||||
if (!list_empty(&free_rte_list)) {
|
||||
rte = list_entry(free_rte_list.next, struct iosapic_rte_info, rte_list);
|
||||
rte = list_entry(free_rte_list.next, struct iosapic_rte_info,
|
||||
rte_list);
|
||||
list_del(&rte->rte_list);
|
||||
preallocated++;
|
||||
} else {
|
||||
@@ -644,7 +682,8 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
|
||||
|
||||
index = find_iosapic(gsi);
|
||||
if (index < 0) {
|
||||
printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", __FUNCTION__, gsi);
|
||||
printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
|
||||
__FUNCTION__, gsi);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -655,7 +694,8 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
|
||||
if (!rte) {
|
||||
rte = iosapic_alloc_rte();
|
||||
if (!rte) {
|
||||
printk(KERN_WARNING "%s: cannot allocate memory\n", __FUNCTION__);
|
||||
printk(KERN_WARNING "%s: cannot allocate memory\n",
|
||||
__FUNCTION__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -671,7 +711,9 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
|
||||
else if (vector_is_shared(vector)) {
|
||||
struct iosapic_intr_info *info = &iosapic_intr_info[vector];
|
||||
if (info->trigger != trigger || info->polarity != polarity) {
|
||||
printk (KERN_WARNING "%s: cannot override the interrupt\n", __FUNCTION__);
|
||||
printk (KERN_WARNING
|
||||
"%s: cannot override the interrupt\n",
|
||||
__FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@@ -688,12 +730,14 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
|
||||
else
|
||||
irq_type = &irq_type_iosapic_level;
|
||||
|
||||
idesc = irq_descp(vector);
|
||||
if (idesc->handler != irq_type) {
|
||||
if (idesc->handler != &no_irq_type)
|
||||
printk(KERN_WARNING "%s: changing vector %d from %s to %s\n",
|
||||
__FUNCTION__, vector, idesc->handler->typename, irq_type->typename);
|
||||
idesc->handler = irq_type;
|
||||
idesc = irq_desc + vector;
|
||||
if (idesc->chip != irq_type) {
|
||||
if (idesc->chip != &no_irq_type)
|
||||
printk(KERN_WARNING
|
||||
"%s: changing vector %d from %s to %s\n",
|
||||
__FUNCTION__, vector,
|
||||
idesc->chip->typename, irq_type->typename);
|
||||
idesc->chip = irq_type;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -703,6 +747,7 @@ get_target_cpu (unsigned int gsi, int vector)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
static int cpu = -1;
|
||||
extern int cpe_vector;
|
||||
|
||||
/*
|
||||
* In case of vector shared by multiple RTEs, all RTEs that
|
||||
@@ -725,6 +770,11 @@ get_target_cpu (unsigned int gsi, int vector)
|
||||
if (!cpu_online(smp_processor_id()))
|
||||
return cpu_physical_id(smp_processor_id());
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
if (cpe_vector > 0 && vector == IA64_CPEP_VECTOR)
|
||||
return get_cpei_target_cpu();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
{
|
||||
int num_cpus, cpu_index, iosapic_index, numa_cpu, i = 0;
|
||||
@@ -747,7 +797,7 @@ get_target_cpu (unsigned int gsi, int vector)
|
||||
if (!num_cpus)
|
||||
goto skip_numa_setup;
|
||||
|
||||
/* Use vector assigment to distribute across cpus in node */
|
||||
/* Use vector assignment to distribute across cpus in node */
|
||||
cpu_index = vector % num_cpus;
|
||||
|
||||
for (numa_cpu = first_cpu(cpu_mask) ; i < cpu_index ; i++)
|
||||
@@ -769,7 +819,7 @@ skip_numa_setup:
|
||||
} while (!cpu_online(cpu));
|
||||
|
||||
return cpu_physical_id(cpu);
|
||||
#else
|
||||
#else /* CONFIG_SMP */
|
||||
return cpu_physical_id(smp_processor_id());
|
||||
#endif
|
||||
}
|
||||
@@ -814,14 +864,15 @@ again:
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&irq_descp(vector)->lock, flags);
|
||||
spin_lock_irqsave(&irq_desc[vector].lock, flags);
|
||||
spin_lock(&iosapic_lock);
|
||||
{
|
||||
if (gsi_to_vector(gsi) > 0) {
|
||||
if (list_empty(&iosapic_intr_info[vector].rtes))
|
||||
free_irq_vector(vector);
|
||||
spin_unlock(&iosapic_lock);
|
||||
spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
|
||||
spin_unlock_irqrestore(&irq_desc[vector].lock,
|
||||
flags);
|
||||
goto again;
|
||||
}
|
||||
|
||||
@@ -830,7 +881,8 @@ again:
|
||||
polarity, trigger);
|
||||
if (err < 0) {
|
||||
spin_unlock(&iosapic_lock);
|
||||
spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
|
||||
spin_unlock_irqrestore(&irq_desc[vector].lock,
|
||||
flags);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -844,7 +896,7 @@ again:
|
||||
set_rte(gsi, vector, dest, mask);
|
||||
}
|
||||
spin_unlock(&iosapic_lock);
|
||||
spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
|
||||
spin_unlock_irqrestore(&irq_desc[vector].lock, flags);
|
||||
|
||||
printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n",
|
||||
gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
|
||||
@@ -872,18 +924,21 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||
*/
|
||||
irq = gsi_to_irq(gsi);
|
||||
if (irq < 0) {
|
||||
printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n", gsi);
|
||||
printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n",
|
||||
gsi);
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
vector = irq_to_vector(irq);
|
||||
|
||||
idesc = irq_descp(irq);
|
||||
idesc = irq_desc + irq;
|
||||
spin_lock_irqsave(&idesc->lock, flags);
|
||||
spin_lock(&iosapic_lock);
|
||||
{
|
||||
if ((rte = gsi_vector_to_rte(gsi, vector)) == NULL) {
|
||||
printk(KERN_ERR "iosapic_unregister_intr(%u) unbalanced\n", gsi);
|
||||
printk(KERN_ERR
|
||||
"iosapic_unregister_intr(%u) unbalanced\n",
|
||||
gsi);
|
||||
WARN_ON(1);
|
||||
goto out;
|
||||
}
|
||||
@@ -893,7 +948,8 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||
|
||||
/* Mask the interrupt */
|
||||
low32 = iosapic_intr_info[vector].low32 | IOSAPIC_MASK;
|
||||
iosapic_write(rte->addr, IOSAPIC_RTE_LOW(rte->rte_index), low32);
|
||||
iosapic_write(rte->addr, IOSAPIC_RTE_LOW(rte->rte_index),
|
||||
low32);
|
||||
|
||||
/* Remove the rte entry from the list */
|
||||
list_del(&rte->rte_list);
|
||||
@@ -906,7 +962,9 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||
trigger = iosapic_intr_info[vector].trigger;
|
||||
polarity = iosapic_intr_info[vector].polarity;
|
||||
dest = iosapic_intr_info[vector].dest;
|
||||
printk(KERN_INFO "GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d unregistered\n",
|
||||
printk(KERN_INFO
|
||||
"GSI %u (%s, %s) -> CPU %d (0x%04x)"
|
||||
" vector %d unregistered\n",
|
||||
gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
|
||||
(polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
|
||||
cpu_logical_id(dest), dest, vector);
|
||||
@@ -916,15 +974,18 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||
BUG_ON(iosapic_intr_info[vector].count);
|
||||
|
||||
/* Clear the interrupt controller descriptor */
|
||||
idesc->handler = &no_irq_type;
|
||||
idesc->chip = &no_irq_type;
|
||||
|
||||
/* Clear the interrupt information */
|
||||
memset(&iosapic_intr_info[vector], 0, sizeof(struct iosapic_intr_info));
|
||||
memset(&iosapic_intr_info[vector], 0,
|
||||
sizeof(struct iosapic_intr_info));
|
||||
iosapic_intr_info[vector].low32 |= IOSAPIC_MASK;
|
||||
INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
|
||||
|
||||
if (idesc->action) {
|
||||
printk(KERN_ERR "interrupt handlers still exist on IRQ %u\n", irq);
|
||||
printk(KERN_ERR
|
||||
"interrupt handlers still exist on"
|
||||
"IRQ %u\n", irq);
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
||||
@@ -939,7 +1000,6 @@ iosapic_unregister_intr (unsigned int gsi)
|
||||
|
||||
/*
|
||||
* ACPI calls this when it finds an entry for a platform interrupt.
|
||||
* Note that the irq_base and IOSAPIC address must be set in iosapic_init().
|
||||
*/
|
||||
int __init
|
||||
iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
|
||||
@@ -973,13 +1033,16 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
|
||||
mask = 1;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "iosapic_register_platform_irq(): invalid int type 0x%x\n", int_type);
|
||||
printk(KERN_ERR "%s: invalid int type 0x%x\n", __FUNCTION__,
|
||||
int_type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
register_intr(gsi, vector, delivery, polarity, trigger);
|
||||
|
||||
printk(KERN_INFO "PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x) vector %d\n",
|
||||
printk(KERN_INFO
|
||||
"PLATFORM int %s (0x%x): GSI %u (%s, %s) -> CPU %d (0x%04x)"
|
||||
" vector %d\n",
|
||||
int_type < ARRAY_SIZE(name) ? name[int_type] : "unknown",
|
||||
int_type, gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"),
|
||||
(polarity == IOSAPIC_POL_HIGH ? "high" : "low"),
|
||||
@@ -989,10 +1052,8 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
|
||||
return vector;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ACPI calls this when it finds an entry for a legacy ISA IRQ override.
|
||||
* Note that the gsi_base and IOSAPIC address must be set in iosapic_init().
|
||||
*/
|
||||
void __init
|
||||
iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
|
||||
@@ -1021,7 +1082,8 @@ iosapic_system_init (int system_pcat_compat)
|
||||
|
||||
for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) {
|
||||
iosapic_intr_info[vector].low32 = IOSAPIC_MASK;
|
||||
INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes); /* mark as unused */
|
||||
/* mark as unused */
|
||||
INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);
|
||||
}
|
||||
|
||||
pcat_compat = system_pcat_compat;
|
||||
@@ -1030,10 +1092,12 @@ iosapic_system_init (int system_pcat_compat)
|
||||
|
||||
if (pcat_compat) {
|
||||
/*
|
||||
* Disable the compatibility mode interrupts (8259 style), needs IN/OUT support
|
||||
* enabled.
|
||||
* Disable the compatibility mode interrupts (8259 style),
|
||||
* needs IN/OUT support enabled.
|
||||
*/
|
||||
printk(KERN_INFO "%s: Disabling PC-AT compatible 8259 interrupts\n", __FUNCTION__);
|
||||
printk(KERN_INFO
|
||||
"%s: Disabling PC-AT compatible 8259 interrupts\n",
|
||||
__FUNCTION__);
|
||||
outb(0xff, 0xA1);
|
||||
outb(0xff, 0x21);
|
||||
}
|
||||
@@ -1073,10 +1137,7 @@ iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)
|
||||
base = iosapic_lists[index].gsi_base;
|
||||
end = base + iosapic_lists[index].num_rte - 1;
|
||||
|
||||
if (gsi_base < base && gsi_end < base)
|
||||
continue;/* OK */
|
||||
|
||||
if (gsi_base > end && gsi_end > end)
|
||||
if (gsi_end < base || end < gsi_base)
|
||||
continue; /* OK */
|
||||
|
||||
return -EBUSY;
|
||||
@@ -1122,12 +1183,14 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)
|
||||
|
||||
if ((gsi_base == 0) && pcat_compat) {
|
||||
/*
|
||||
* Map the legacy ISA devices into the IOSAPIC data. Some of these may
|
||||
* get reprogrammed later on with data from the ACPI Interrupt Source
|
||||
* Override table.
|
||||
* Map the legacy ISA devices into the IOSAPIC data. Some of
|
||||
* these may get reprogrammed later on with data from the ACPI
|
||||
* Interrupt Source Override table.
|
||||
*/
|
||||
for (isa_irq = 0; isa_irq < 16; ++isa_irq)
|
||||
iosapic_override_isa_irq(isa_irq, isa_irq, IOSAPIC_POL_HIGH, IOSAPIC_EDGE);
|
||||
iosapic_override_isa_irq(isa_irq, isa_irq,
|
||||
IOSAPIC_POL_HIGH,
|
||||
IOSAPIC_EDGE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1150,7 +1213,8 @@ iosapic_remove (unsigned int gsi_base)
|
||||
|
||||
if (iosapic_lists[index].rtes_inuse) {
|
||||
err = -EBUSY;
|
||||
printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n",
|
||||
printk(KERN_WARNING
|
||||
"%s: IOSAPIC for GSI base %u is busy\n",
|
||||
__FUNCTION__, gsi_base);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
* Added CPU Hotplug handling for IPF.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/jiffies.h>
|
||||
@@ -49,6 +48,10 @@
|
||||
|
||||
#define IRQ_DEBUG 0
|
||||
|
||||
/* These can be overridden in platform_irq_init */
|
||||
int ia64_first_device_vector = IA64_DEF_FIRST_DEVICE_VECTOR;
|
||||
int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR;
|
||||
|
||||
/* default base addr of IPI table */
|
||||
void __iomem *ipi_base_addr = ((void __iomem *)
|
||||
(__IA64_UNCACHED_OFFSET | IA64_IPI_DEFAULT_BASE_ADDR));
|
||||
@@ -63,7 +66,7 @@ __u8 isa_irq_to_vector_map[16] = {
|
||||
};
|
||||
EXPORT_SYMBOL(isa_irq_to_vector_map);
|
||||
|
||||
static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_NUM_DEVICE_VECTORS)];
|
||||
static unsigned long ia64_vector_mask[BITS_TO_LONGS(IA64_MAX_DEVICE_VECTORS)];
|
||||
|
||||
int
|
||||
assign_irq_vector (int irq)
|
||||
@@ -106,6 +109,19 @@ free_irq_vector (int vector)
|
||||
printk(KERN_WARNING "%s: double free!\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
int
|
||||
reserve_irq_vector (int vector)
|
||||
{
|
||||
int pos;
|
||||
|
||||
if (vector < IA64_FIRST_DEVICE_VECTOR ||
|
||||
vector > IA64_LAST_DEVICE_VECTOR)
|
||||
return -EINVAL;
|
||||
|
||||
pos = vector - IA64_FIRST_DEVICE_VECTOR;
|
||||
return test_and_set_bit(pos, ia64_vector_mask);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
# define IS_RESCHEDULE(vec) (vec == IA64_IPI_RESCHEDULE)
|
||||
#else
|
||||
@@ -236,7 +252,7 @@ extern irqreturn_t handle_IPI (int irq, void *dev_id, struct pt_regs *regs);
|
||||
|
||||
static struct irqaction ipi_irqaction = {
|
||||
.handler = handle_IPI,
|
||||
.flags = SA_INTERRUPT,
|
||||
.flags = IRQF_DISABLED,
|
||||
.name = "IPI"
|
||||
};
|
||||
#endif
|
||||
@@ -501,9 +517,9 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
|
||||
|
||||
for (irq = 0; irq < NR_IRQS; ++irq)
|
||||
if (irq_to_vector(irq) == vec) {
|
||||
desc = irq_descp(irq);
|
||||
desc = irq_desc + irq;
|
||||
desc->status |= IRQ_PER_CPU;
|
||||
desc->handler = &irq_type_ia64_lsapic;
|
||||
desc->chip = &irq_type_ia64_lsapic;
|
||||
if (action)
|
||||
setup_irq(irq, action);
|
||||
}
|
||||
|
||||
@@ -218,12 +218,7 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
|
||||
.body
|
||||
;;
|
||||
ld8 loc2 = [loc2] // loc2 <- entry point
|
||||
mov out0 = in0 // first argument
|
||||
mov out1 = in1 // copy arg2
|
||||
mov out2 = in2 // copy arg3
|
||||
mov out3 = in3 // copy arg3
|
||||
;;
|
||||
mov loc3 = psr // save psr
|
||||
mov loc3 = psr // save psr
|
||||
;;
|
||||
mov loc4=ar.rsc // save RSE configuration
|
||||
dep.z loc2=loc2,0,61 // convert pal entry point to physical
|
||||
@@ -237,18 +232,23 @@ GLOBAL_ENTRY(ia64_pal_call_phys_stacked)
|
||||
;;
|
||||
andcm r16=loc3,r16 // removes bits to clear from psr
|
||||
br.call.sptk.many rp=ia64_switch_mode_phys
|
||||
.ret6:
|
||||
|
||||
mov out0 = in0 // first argument
|
||||
mov out1 = in1 // copy arg2
|
||||
mov out2 = in2 // copy arg3
|
||||
mov out3 = in3 // copy arg3
|
||||
mov loc5 = r19
|
||||
mov loc6 = r20
|
||||
|
||||
br.call.sptk.many rp=b7 // now make the call
|
||||
.ret7:
|
||||
|
||||
mov ar.rsc=0 // put RSE in enforced lazy, LE mode
|
||||
mov r16=loc3 // r16= original psr
|
||||
mov r19=loc5
|
||||
mov r20=loc6
|
||||
br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
|
||||
|
||||
.ret8: mov psr.l = loc3 // restore init PSR
|
||||
mov psr.l = loc3 // restore init PSR
|
||||
mov ar.pfs = loc1
|
||||
mov rp = loc0
|
||||
;;
|
||||
|
||||
Loaded 100 of 949 files, more files were not shown because too many files have changed in this diff.
Show more