Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
ac6a5f92
Commit
ac6a5f92
authored
Jun 18, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://lia64.bkbits.net/to-linus-2.5
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
66cafce6
4e4da02c
Changes
34
Hide whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
1003 additions
and
214 deletions
+1003
-214
arch/ia64/Kconfig
arch/ia64/Kconfig
+0
-14
arch/ia64/configs/sn2_defconfig
arch/ia64/configs/sn2_defconfig
+51
-55
arch/ia64/defconfig
arch/ia64/defconfig
+17
-6
arch/ia64/ia32/binfmt_elf32.c
arch/ia64/ia32/binfmt_elf32.c
+4
-0
arch/ia64/ia32/ia32_entry.S
arch/ia64/ia32/ia32_entry.S
+1
-1
arch/ia64/ia32/ia32_support.c
arch/ia64/ia32/ia32_support.c
+12
-0
arch/ia64/ia32/ia32priv.h
arch/ia64/ia32/ia32priv.h
+32
-4
arch/ia64/ia32/sys_ia32.c
arch/ia64/ia32/sys_ia32.c
+577
-5
arch/ia64/kernel/entry.S
arch/ia64/kernel/entry.S
+4
-2
arch/ia64/kernel/head.S
arch/ia64/kernel/head.S
+5
-1
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/iosapic.c
+0
-16
arch/ia64/kernel/irq.c
arch/ia64/kernel/irq.c
+16
-0
arch/ia64/kernel/mca.c
arch/ia64/kernel/mca.c
+79
-16
arch/ia64/kernel/palinfo.c
arch/ia64/kernel/palinfo.c
+2
-2
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon.c
+45
-42
arch/ia64/kernel/process.c
arch/ia64/kernel/process.c
+8
-0
arch/ia64/kernel/unwind.c
arch/ia64/kernel/unwind.c
+20
-15
arch/ia64/mm/discontig.c
arch/ia64/mm/discontig.c
+3
-0
arch/ia64/mm/hugetlbpage.c
arch/ia64/mm/hugetlbpage.c
+1
-1
arch/ia64/sn/io/machvec/pci_bus_cvlink.c
arch/ia64/sn/io/machvec/pci_bus_cvlink.c
+2
-2
arch/ia64/sn/io/sn2/klgraph.c
arch/ia64/sn/io/sn2/klgraph.c
+2
-2
arch/ia64/sn/io/sn2/ml_iograph.c
arch/ia64/sn/io/sn2/ml_iograph.c
+8
-8
arch/ia64/sn/io/sn2/module.c
arch/ia64/sn/io/sn2/module.c
+7
-7
arch/ia64/sn/kernel/irq.c
arch/ia64/sn/kernel/irq.c
+17
-0
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/setup.c
+22
-1
include/asm-ia64/gcc_intrin.h
include/asm-ia64/gcc_intrin.h
+10
-4
include/asm-ia64/ia32.h
include/asm-ia64/ia32.h
+9
-1
include/asm-ia64/irq.h
include/asm-ia64/irq.h
+6
-0
include/asm-ia64/pgtable.h
include/asm-ia64/pgtable.h
+1
-5
include/asm-ia64/processor.h
include/asm-ia64/processor.h
+4
-1
include/asm-ia64/sn/module.h
include/asm-ia64/sn/module.h
+1
-1
include/asm-ia64/sn/sn_sal.h
include/asm-ia64/sn/sn_sal.h
+34
-0
include/asm-ia64/system.h
include/asm-ia64/system.h
+1
-1
include/asm-ia64/unistd.h
include/asm-ia64/unistd.h
+2
-1
No files found.
arch/ia64/Kconfig
View file @
ac6a5f92
...
...
@@ -149,20 +149,6 @@ config IA64_L1_CACHE_SHIFT
default "6" if ITANIUM
# align cache-sensitive data to 64 bytes
config MCKINLEY_ASTEP_SPECIFIC
bool "McKinley A-step specific code"
depends on MCKINLEY
help
Select this option to build a kernel for an IA-64 McKinley prototype
system with any A-stepping CPU.
config MCKINLEY_A0_SPECIFIC
bool "McKinley A0/A1-step specific code"
depends on MCKINLEY_ASTEP_SPECIFIC
help
Select this option to build a kernel for an IA-64 McKinley prototype
system with an A0 or A1 stepping CPU.
config NUMA
bool "NUMA support"
depends on !IA64_HP_SIM
...
...
arch/ia64/configs/sn2_defconfig
View file @
ac6a5f92
...
...
@@ -14,18 +14,22 @@ CONFIG_STANDALONE=y
#
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=20
CONFIG_HOTPLUG=y
# CONFIG_IKCONFIG is not set
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
...
...
@@ -60,7 +64,6 @@ CONFIG_MCKINLEY=y
CONFIG_IA64_PAGE_SIZE_16KB=y
# CONFIG_IA64_PAGE_SIZE_64KB is not set
CONFIG_IA64_L1_CACHE_SHIFT=7
# CONFIG_MCKINLEY_ASTEP_SPECIFIC is not set
CONFIG_NUMA=y
CONFIG_VIRTUAL_MEM_MAP=y
CONFIG_DISCONTIGMEM=y
...
...
@@ -70,12 +73,17 @@ CONFIG_IA64_SGI_SN_SIM=y
CONFIG_FORCE_MAX_ZONEORDER=18
CONFIG_SMP=y
CONFIG_NR_CPUS=512
# CONFIG_HOTPLUG_CPU is not set
# CONFIG_PREEMPT is not set
CONFIG_HAVE_DEC_LOCK=y
CONFIG_IA32_SUPPORT=y
CONFIG_COMPAT=y
CONFIG_PERFMON=y
CONFIG_IA64_PALINFO=y
#
# Firmware Drivers
#
CONFIG_EFI_VARS=y
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
...
...
@@ -105,6 +113,7 @@ CONFIG_ACPI_SYSTEM=y
#
CONFIG_PCI=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_USE_VECTOR is not set
CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y
...
...
@@ -174,7 +183,6 @@ CONFIG_BLK_DEV_IDE=y
#
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
# CONFIG_IDEDISK_STROKE is not set
CONFIG_BLK_DEV_IDECD=m
CONFIG_BLK_DEV_IDETAPE=m
CONFIG_BLK_DEV_IDEFLOPPY=y
...
...
@@ -218,6 +226,7 @@ CONFIG_BLK_DEV_SGIIOC4=y
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not set
CONFIG_IDEDMA_AUTO=y
...
...
@@ -243,7 +252,6 @@ CONFIG_CHR_DEV_SG=m
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
CONFIG_SCSI_REPORT_LUNS=y
CONFIG_SCSI_CONSTANTS=y
# CONFIG_SCSI_LOGGING is not set
...
...
@@ -281,7 +289,9 @@ CONFIG_SCSI_SATA=y
CONFIG_SCSI_SATA_SVW=m
CONFIG_SCSI_ATA_PIIX=m
CONFIG_SCSI_SATA_PROMISE=m
# CONFIG_SCSI_SATA_SX4 is not set
# CONFIG_SCSI_SATA_SIL is not set
# CONFIG_SCSI_SATA_SIS is not set
CONFIG_SCSI_SATA_VIA=m
CONFIG_SCSI_SATA_VITESSE=y
# CONFIG_SCSI_BUSLOGIC is not set
...
...
@@ -298,6 +308,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_ISP is not set
# CONFIG_SCSI_QLOGIC_FC is not set
CONFIG_SCSI_QLOGIC_1280=y
...
...
@@ -343,6 +354,7 @@ CONFIG_FUSION_CTL=m
#
# I2O device support
#
# CONFIG_I2O is not set
#
# Networking support
...
...
@@ -389,8 +401,6 @@ CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_IPV6_TUNNEL=m
# CONFIG_DECNET is not set
CONFIG_BRIDGE=m
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_BRIDGE_NETFILTER=y
...
...
@@ -452,6 +462,7 @@ CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
# CONFIG_IP_NF_COMPAT_IPFWADM is not set
# CONFIG_IP_NF_RAW is not set
#
# IPv6: Netfilter Configuration
...
...
@@ -471,7 +482,9 @@ CONFIG_XFRM_USER=m
#
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
CONFIG_BRIDGE=m
CONFIG_VLAN_8021Q=m
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
...
...
@@ -516,18 +529,25 @@ CONFIG_NET_CLS_POLICE=y
# Network testing
#
# CONFIG_NET_PKTGEN is not set
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_RX is not set
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
CONFIG_DUMMY=m
CONFIG_BONDING=m
CONFIG_EQUALIZER=m
CONFIG_TUN=m
# CONFIG_ETHERTAP is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
#
# Ethernet (10 or 100Mbit)
#
...
...
@@ -582,7 +602,6 @@ CONFIG_NS83820=m
CONFIG_HAMACHI=m
CONFIG_YELLOWFIN=m
CONFIG_R8169=m
CONFIG_SIS190=m
CONFIG_SK98LIN=m
CONFIG_TIGON3=y
...
...
@@ -591,6 +610,22 @@ CONFIG_TIGON3=y
#
CONFIG_IXGB=m
# CONFIG_IXGB_NAPI is not set
# CONFIG_S2IO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
CONFIG_PPP=m
...
...
@@ -602,44 +637,10 @@ CONFIG_PPP_DEFLATE=m
# CONFIG_PPP_BSDCOMP is not set
# CONFIG_PPPOE is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
CONFIG_NET_FC=y
# CONFIG_SHAPER is not set
CONFIG_NETCONSOLE=y
#
# Wan interfaces
#
# CONFIG_WAN is not set
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# Bluetooth support
#
# CONFIG_BT is not set
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_RX is not set
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
#
# ISDN subsystem
#
...
...
@@ -703,6 +704,7 @@ CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_N_HDLC is not set
...
...
@@ -713,18 +715,11 @@ CONFIG_SGI_L1_SERIAL_CONSOLE=y
#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_HCDP=y
CONFIG_SERIAL_8250_ACPI=y
CONFIG_SERIAL_8250_NR_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250 is not set
#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
...
...
@@ -740,7 +735,6 @@ CONFIG_LEGACY_PTY_COUNT=256
#
# CONFIG_WATCHDOG is not set
# CONFIG_HW_RANDOM is not set
# CONFIG_GEN_RTC is not set
CONFIG_EFI_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
...
...
@@ -852,6 +846,7 @@ CONFIG_VFAT_FS=y
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y
...
...
@@ -897,7 +892,6 @@ CONFIG_SMB_FS=m
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
# CONFIG_AFS_FS is not set
#
...
...
@@ -968,6 +962,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# Library routines
#
CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m
...
...
@@ -1019,4 +1014,5 @@ CONFIG_CRYPTO_DES=m
# CONFIG_CRYPTO_ARC4 is not set
CONFIG_CRYPTO_DEFLATE=m
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set
arch/ia64/defconfig
View file @
ac6a5f92
...
...
@@ -26,6 +26,7 @@ CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
# CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y
...
...
@@ -66,7 +67,6 @@ CONFIG_MCKINLEY=y
CONFIG_IA64_PAGE_SIZE_16KB=y
# CONFIG_IA64_PAGE_SIZE_64KB is not set
CONFIG_IA64_L1_CACHE_SHIFT=7
# CONFIG_MCKINLEY_ASTEP_SPECIFIC is not set
# CONFIG_NUMA is not set
CONFIG_VIRTUAL_MEM_MAP=y
# CONFIG_IA64_CYCLONE is not set
...
...
@@ -74,6 +74,7 @@ CONFIG_IOSAPIC=y
CONFIG_FORCE_MAX_ZONEORDER=18
CONFIG_SMP=y
CONFIG_NR_CPUS=16
# CONFIG_HOTPLUG_CPU is not set
# CONFIG_PREEMPT is not set
CONFIG_HAVE_DEC_LOCK=y
CONFIG_IA32_SUPPORT=y
...
...
@@ -178,7 +179,6 @@ CONFIG_BLK_DEV_IDE=y
#
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
# CONFIG_IDEDISK_STROKE is not set
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set
CONFIG_BLK_DEV_IDEFLOPPY=m
...
...
@@ -220,6 +220,7 @@ CONFIG_BLK_DEV_SIIMAGE=y
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not set
CONFIG_IDEDMA_AUTO=y
...
...
@@ -245,7 +246,6 @@ CONFIG_CHR_DEV_SG=y
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_REPORT_LUNS=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
...
...
@@ -282,6 +282,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_PCI2000 is not set
# CONFIG_SCSI_PCI2220I is not set
# CONFIG_SCSI_QLOGIC_ISP is not set
...
...
@@ -328,6 +329,7 @@ CONFIG_FUSION_MAX_SGE=40
#
# I2O device support
#
# CONFIG_I2O is not set
#
# Networking support
...
...
@@ -573,7 +575,12 @@ CONFIG_LEGACY_PTY_COUNT=256
#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set
CONFIG_IPMI_HANDLER=m
CONFIG_IPMI_PANIC_EVENT=y
CONFIG_IPMI_PANIC_STRING=y
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
CONFIG_IPMI_WATCHDOG=m
#
# Watchdog Cards
...
...
@@ -651,6 +658,7 @@ CONFIG_I2C_ALGOBIT=y
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM85 is not set
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83L785TS is not set
...
...
@@ -662,6 +670,7 @@ CONFIG_I2C_ALGOBIT=y
# CONFIG_SENSORS_EEPROM is not set
# CONFIG_SENSORS_PCF8574 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_RTC8564 is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
...
...
@@ -688,6 +697,7 @@ CONFIG_FB=y
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
CONFIG_FB_RIVA=m
# CONFIG_FB_MATROX is not set
...
...
@@ -852,6 +862,7 @@ CONFIG_USB_HIDDEV=y
# CONFIG_USB_KBTAB is not set
# CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set
# CONFIG_USB_EGALAX is not set
# CONFIG_USB_XPAD is not set
# CONFIG_USB_ATI_REMOTE is not set
...
...
@@ -901,6 +912,7 @@ CONFIG_USB_HIDDEV=y
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGETSERVO is not set
# CONFIG_USB_TEST is not set
#
...
...
@@ -998,7 +1010,6 @@ CONFIG_RPCSEC_GSS_KRB5=y
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
# CONFIG_AFS_FS is not set
#
...
...
@@ -1083,7 +1094,7 @@ CONFIG_IA64_GRANULE_16MB=y
# CONFIG_IA64_GRANULE_64MB is not set
CONFIG_DEBUG_KERNEL=y
CONFIG_IA64_PRINT_HAZARDS=y
CONFIG_DISABLE_VHPT=y
# CONFIG_DISABLE_VHPT is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_IA64_EARLY_PRINTK_VGA is not set
# CONFIG_DEBUG_SLAB is not set
...
...
arch/ia64/ia32/binfmt_elf32.c
View file @
ac6a5f92
...
...
@@ -197,6 +197,10 @@ ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack)
}
up_write
(
&
current
->
mm
->
mmap_sem
);
/* Can't do it in ia64_elf32_init(). Needs to be done before calls to
elf32_map() */
current
->
thread
.
ppl
=
ia32_init_pp_list
();
return
0
;
}
...
...
arch/ia64/ia32/ia32_entry.S
View file @
ac6a5f92
...
...
@@ -371,7 +371,7 @@ ia32_syscall_table:
data8
sys_sched_get_priority_min
/*
160
*/
data8
sys32_sched_rr_get_interval
data8
compat_sys_nanosleep
data8
sys_mremap
data8
sys
32
_mremap
data8
sys_setresuid
/*
16
-
bit
version
*/
data8
sys32_getresuid16
/*
16
-
bit
version
*/
/*
165
*/
data8
sys_ni_syscall
/*
vm86
*/
...
...
arch/ia64/ia32/ia32_support.c
View file @
ac6a5f92
...
...
@@ -218,6 +218,18 @@ ia32_init (void)
ia32_exec_domain
.
signal_map
=
default_exec_domain
.
signal_map
;
ia32_exec_domain
.
signal_invmap
=
default_exec_domain
.
signal_invmap
;
register_exec_domain
(
&
ia32_exec_domain
);
#if PAGE_SHIFT > IA32_PAGE_SHIFT
{
extern
kmem_cache_t
*
partial_page_cachep
;
partial_page_cachep
=
kmem_cache_create
(
"partial_page_cache"
,
sizeof
(
struct
partial_page
),
0
,
0
,
NULL
,
NULL
);
if
(
!
partial_page_cachep
)
panic
(
"Cannot create partial page SLAB cache"
);
}
#endif
return
0
;
}
...
...
arch/ia64/ia32/ia32priv.h
View file @
ac6a5f92
#ifndef _ASM_IA64_IA32_H
#define _ASM_IA64_IA32_H
#ifndef _ASM_IA64_IA32_
PRIV_
H
#define _ASM_IA64_IA32_
PRIV_
H
#include <linux/config.h>
...
...
@@ -9,6 +9,7 @@
#include <linux/binfmts.h>
#include <linux/compat.h>
#include <linux/rbtree.h>
#include <asm/processor.h>
...
...
@@ -16,12 +17,39 @@
* 32 bit structures for IA32 support.
*/
#define IA32_PAGE_SHIFT 12
/* 4KB pages */
#define IA32_PAGE_SIZE (1UL << IA32_PAGE_SHIFT)
#define IA32_PAGE_MASK (~(IA32_PAGE_SIZE - 1))
#define IA32_PAGE_ALIGN(addr) (((addr) + IA32_PAGE_SIZE - 1) & IA32_PAGE_MASK)
#define IA32_CLOCKS_PER_SEC 100
/* Cast in stone for IA32 Linux */
/*
* partially mapped pages provide precise accounting of which 4k sub pages
* are mapped and which ones are not, thereby improving IA-32 compatibility.
*/
struct
partial_page
{
struct
partial_page
*
next
;
/* linked list, sorted by address */
struct
rb_node
pp_rb
;
/* 64K is the largest "normal" page supported by ia64 ABI. So 4K*32
* should suffice.*/
unsigned
int
bitmap
;
unsigned
int
base
;
};
struct
partial_page_list
{
struct
partial_page
*
pp_head
;
/* list head, points to the lowest
* addressed partial page */
struct
rb_root
ppl_rb
;
struct
partial_page
*
pp_hint
;
/* pp_hint->next is the last
* accessed partial page */
atomic_t
pp_count
;
/* reference count */
};
#if PAGE_SHIFT > IA32_PAGE_SHIFT
struct
partial_page_list
*
ia32_init_pp_list
(
void
);
#else
# define ia32_init_pp_list() 0
#endif
/* sigcontext.h */
/*
* As documented in the iBCS2 standard..
...
...
@@ -528,4 +556,4 @@ extern int save_ia32_fpxstate (struct task_struct *tsk, struct ia32_user_fxsr_st
#endif
/* !CONFIG_IA32_SUPPORT */
#endif
/* _ASM_IA64_IA32_H */
#endif
/* _ASM_IA64_IA32_
PRIV_
H */
arch/ia64/ia32/sys_ia32.c
View file @
ac6a5f92
...
...
@@ -8,6 +8,7 @@
* Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
* Copyright (C) 2000-2003 Hewlett-Packard Co
* David Mosberger-Tang <davidm@hpl.hp.com>
* Copyright (C) 2004 Gordon Jin <gordon.jin@intel.com>
*
* These routines maintain argument size conversion between 32bit and 64bit
* environment.
...
...
@@ -48,6 +49,7 @@
#include <linux/ipc.h>
#include <linux/compat.h>
#include <linux/vfs.h>
#include <linux/mman.h>
#include <asm/intrinsics.h>
#include <asm/semaphore.h>
...
...
@@ -250,6 +252,508 @@ mmap_subpage (struct file *file, unsigned long start, unsigned long end, int pro
return
ret
;
}
/* SLAB cache for partial_page structures */
kmem_cache_t
*
partial_page_cachep
;
/*
* init partial_page_list.
* return 0 means kmalloc fail.
*/
struct
partial_page_list
*
ia32_init_pp_list
(
void
)
{
struct
partial_page_list
*
p
;
if
((
p
=
kmalloc
(
sizeof
(
*
p
),
GFP_KERNEL
))
==
NULL
)
return
p
;
p
->
pp_head
=
0
;
p
->
ppl_rb
=
RB_ROOT
;
p
->
pp_hint
=
0
;
atomic_set
(
&
p
->
pp_count
,
1
);
return
p
;
}
/*
* Search for the partial page with @start in partial page list @ppl.
* If finds the partial page, return the found partial page.
* Else, return 0 and provide @pprev, @rb_link, @rb_parent to
* be used by later __ia32_insert_pp().
*/
static
struct
partial_page
*
__ia32_find_pp
(
struct
partial_page_list
*
ppl
,
unsigned
int
start
,
struct
partial_page
**
pprev
,
struct
rb_node
***
rb_link
,
struct
rb_node
**
rb_parent
)
{
struct
partial_page
*
pp
;
struct
rb_node
**
__rb_link
,
*
__rb_parent
,
*
rb_prev
;
pp
=
ppl
->
pp_hint
;
if
(
pp
&&
pp
->
base
==
start
)
return
pp
;
__rb_link
=
&
ppl
->
ppl_rb
.
rb_node
;
rb_prev
=
__rb_parent
=
NULL
;
while
(
*
__rb_link
)
{
__rb_parent
=
*
__rb_link
;
pp
=
rb_entry
(
__rb_parent
,
struct
partial_page
,
pp_rb
);
if
(
pp
->
base
==
start
)
{
ppl
->
pp_hint
=
pp
;
return
pp
;
}
else
if
(
pp
->
base
<
start
)
{
rb_prev
=
__rb_parent
;
__rb_link
=
&
__rb_parent
->
rb_right
;
}
else
{
__rb_link
=
&
__rb_parent
->
rb_left
;
}
}
*
rb_link
=
__rb_link
;
*
rb_parent
=
__rb_parent
;
*
pprev
=
NULL
;
if
(
rb_prev
)
*
pprev
=
rb_entry
(
rb_prev
,
struct
partial_page
,
pp_rb
);
return
NULL
;
}
/*
* insert @pp into @ppl.
*/
static
void
__ia32_insert_pp
(
struct
partial_page_list
*
ppl
,
struct
partial_page
*
pp
,
struct
partial_page
*
prev
,
struct
rb_node
**
rb_link
,
struct
rb_node
*
rb_parent
)
{
/* link list */
if
(
prev
)
{
pp
->
next
=
prev
->
next
;
prev
->
next
=
pp
;
}
else
{
ppl
->
pp_head
=
pp
;
if
(
rb_parent
)
pp
->
next
=
rb_entry
(
rb_parent
,
struct
partial_page
,
pp_rb
);
else
pp
->
next
=
NULL
;
}
/* link rb */
rb_link_node
(
&
pp
->
pp_rb
,
rb_parent
,
rb_link
);
rb_insert_color
(
&
pp
->
pp_rb
,
&
ppl
->
ppl_rb
);
ppl
->
pp_hint
=
pp
;
}
/*
* delete @pp from partial page list @ppl.
*/
static
void
__ia32_delete_pp
(
struct
partial_page_list
*
ppl
,
struct
partial_page
*
pp
,
struct
partial_page
*
prev
)
{
if
(
prev
)
{
prev
->
next
=
pp
->
next
;
if
(
ppl
->
pp_hint
==
pp
)
ppl
->
pp_hint
=
prev
;
}
else
{
ppl
->
pp_head
=
pp
->
next
;
if
(
ppl
->
pp_hint
==
pp
)
ppl
->
pp_hint
=
pp
->
next
;
}
rb_erase
(
&
pp
->
pp_rb
,
&
ppl
->
ppl_rb
);
kmem_cache_free
(
partial_page_cachep
,
pp
);
}
static
struct
partial_page
*
__pp_prev
(
struct
partial_page
*
pp
)
{
struct
rb_node
*
prev
=
rb_prev
(
&
pp
->
pp_rb
);
if
(
prev
)
return
rb_entry
(
prev
,
struct
partial_page
,
pp_rb
);
else
return
NULL
;
}
/*
* Delete partial pages with address between @start and @end.
* @start and @end are page aligned.
*/
static
void
__ia32_delete_pp_range
(
unsigned
int
start
,
unsigned
int
end
)
{
struct
partial_page
*
pp
,
*
prev
;
struct
rb_node
**
rb_link
,
*
rb_parent
;
if
(
start
>=
end
)
return
;
pp
=
__ia32_find_pp
(
current
->
thread
.
ppl
,
start
,
&
prev
,
&
rb_link
,
&
rb_parent
);
if
(
pp
)
prev
=
__pp_prev
(
pp
);
else
{
if
(
prev
)
pp
=
prev
->
next
;
else
pp
=
current
->
thread
.
ppl
->
pp_head
;
}
while
(
pp
&&
pp
->
base
<
end
)
{
struct
partial_page
*
tmp
=
pp
->
next
;
__ia32_delete_pp
(
current
->
thread
.
ppl
,
pp
,
prev
);
pp
=
tmp
;
}
}
/*
* Set the range between @start and @end in bitmap.
* @start and @end should be IA32 page aligned and in the same IA64 page.
*/
static
int
__ia32_set_pp
(
unsigned
int
start
,
unsigned
int
end
,
int
flags
)
{
struct
partial_page
*
pp
,
*
prev
;
struct
rb_node
**
rb_link
,
*
rb_parent
;
unsigned
int
pstart
,
start_bit
,
end_bit
,
i
;
pstart
=
PAGE_START
(
start
);
start_bit
=
(
start
%
PAGE_SIZE
)
/
IA32_PAGE_SIZE
;
end_bit
=
(
end
%
PAGE_SIZE
)
/
IA32_PAGE_SIZE
;
if
(
end_bit
==
0
)
end_bit
=
PAGE_SIZE
/
IA32_PAGE_SIZE
;
pp
=
__ia32_find_pp
(
current
->
thread
.
ppl
,
pstart
,
&
prev
,
&
rb_link
,
&
rb_parent
);
if
(
pp
)
{
for
(
i
=
start_bit
;
i
<
end_bit
;
i
++
)
set_bit
(
i
,
&
pp
->
bitmap
);
/*
* Check: if this partial page has been set to a full page,
* then delete it.
*/
if
(
find_first_zero_bit
(
&
pp
->
bitmap
,
sizeof
(
pp
->
bitmap
)
*
8
)
>=
PAGE_SIZE
/
IA32_PAGE_SIZE
)
{
__ia32_delete_pp
(
current
->
thread
.
ppl
,
pp
,
__pp_prev
(
pp
));
}
return
0
;
}
/*
* MAP_FIXED may lead to overlapping mmap.
* In this case, the requested mmap area may already mmaped as a full
* page. So check vma before adding a new partial page.
*/
if
(
flags
&
MAP_FIXED
)
{
struct
vm_area_struct
*
vma
=
find_vma
(
current
->
mm
,
pstart
);
if
(
vma
&&
vma
->
vm_start
<=
pstart
)
return
0
;
}
/* new a partial_page */
pp
=
kmem_cache_alloc
(
partial_page_cachep
,
GFP_KERNEL
);
if
(
!
pp
)
return
-
ENOMEM
;
pp
->
base
=
pstart
;
pp
->
bitmap
=
0
;
for
(
i
=
start_bit
;
i
<
end_bit
;
i
++
)
set_bit
(
i
,
&
(
pp
->
bitmap
));
pp
->
next
=
NULL
;
__ia32_insert_pp
(
current
->
thread
.
ppl
,
pp
,
prev
,
rb_link
,
rb_parent
);
return
0
;
}
/*
* @start and @end should be IA32 page aligned, but don't need to be in the
* same IA64 page. Split @start and @end to make sure they're in the same IA64
* page, then call __ia32_set_pp().
*/
static
void
ia32_set_pp
(
unsigned
int
start
,
unsigned
int
end
,
int
flags
)
{
down_write
(
&
current
->
mm
->
mmap_sem
);
if
(
flags
&
MAP_FIXED
)
{
/*
* MAP_FIXED may lead to overlapping mmap. When this happens,
* a series of complete IA64 pages results in deletion of
* old partial pages in that range.
*/
__ia32_delete_pp_range
(
PAGE_ALIGN
(
start
),
PAGE_START
(
end
));
}
if
(
end
<
PAGE_ALIGN
(
start
))
{
__ia32_set_pp
(
start
,
end
,
flags
);
}
else
{
if
(
offset_in_page
(
start
))
__ia32_set_pp
(
start
,
PAGE_ALIGN
(
start
),
flags
);
if
(
offset_in_page
(
end
))
__ia32_set_pp
(
PAGE_START
(
end
),
end
,
flags
);
}
up_write
(
&
current
->
mm
->
mmap_sem
);
}
/*
* Unset the range between @start and @end in bitmap.
* @start and @end should be IA32 page aligned and in the same IA64 page.
* After doing that, if the bitmap is 0, then free the page and return 1,
* else return 0;
* If not find the partial page in the list, then
* If the vma exists, then the full page is set to a partial page;
* Else return -ENOMEM.
*/
static
int
__ia32_unset_pp
(
unsigned
int
start
,
unsigned
int
end
)
{
struct
partial_page
*
pp
,
*
prev
;
struct
rb_node
**
rb_link
,
*
rb_parent
;
unsigned
int
pstart
,
start_bit
,
end_bit
,
i
;
struct
vm_area_struct
*
vma
;
pstart
=
PAGE_START
(
start
);
start_bit
=
(
start
%
PAGE_SIZE
)
/
IA32_PAGE_SIZE
;
end_bit
=
(
end
%
PAGE_SIZE
)
/
IA32_PAGE_SIZE
;
if
(
end_bit
==
0
)
end_bit
=
PAGE_SIZE
/
IA32_PAGE_SIZE
;
pp
=
__ia32_find_pp
(
current
->
thread
.
ppl
,
pstart
,
&
prev
,
&
rb_link
,
&
rb_parent
);
if
(
pp
)
{
for
(
i
=
start_bit
;
i
<
end_bit
;
i
++
)
clear_bit
(
i
,
&
pp
->
bitmap
);
if
(
pp
->
bitmap
==
0
)
{
__ia32_delete_pp
(
current
->
thread
.
ppl
,
pp
,
__pp_prev
(
pp
));
return
1
;
}
return
0
;
}
vma
=
find_vma
(
current
->
mm
,
pstart
);
if
(
!
vma
||
vma
->
vm_start
>
pstart
)
{
return
-
ENOMEM
;
}
/* new a partial_page */
pp
=
kmem_cache_alloc
(
partial_page_cachep
,
GFP_KERNEL
);
if
(
!
pp
)
return
-
ENOMEM
;
pp
->
base
=
pstart
;
pp
->
bitmap
=
0
;
for
(
i
=
0
;
i
<
start_bit
;
i
++
)
set_bit
(
i
,
&
(
pp
->
bitmap
));
for
(
i
=
end_bit
;
i
<
PAGE_SIZE
/
IA32_PAGE_SIZE
;
i
++
)
set_bit
(
i
,
&
(
pp
->
bitmap
));
pp
->
next
=
NULL
;
__ia32_insert_pp
(
current
->
thread
.
ppl
,
pp
,
prev
,
rb_link
,
rb_parent
);
return
0
;
}
/*
* Delete pp between PAGE_ALIGN(start) and PAGE_START(end) by calling
* __ia32_delete_pp_range(). Unset possible partial pages by calling
* __ia32_unset_pp().
* The returned value see __ia32_unset_pp().
*/
static
int
ia32_unset_pp
(
unsigned
int
*
startp
,
unsigned
int
*
endp
)
{
unsigned
int
start
=
*
startp
,
end
=
*
endp
;
int
ret
=
0
;
down_write
(
&
current
->
mm
->
mmap_sem
);
__ia32_delete_pp_range
(
PAGE_ALIGN
(
start
),
PAGE_START
(
end
));
if
(
end
<
PAGE_ALIGN
(
start
))
{
ret
=
__ia32_unset_pp
(
start
,
end
);
if
(
ret
==
1
)
{
*
startp
=
PAGE_START
(
start
);
*
endp
=
PAGE_ALIGN
(
end
);
}
if
(
ret
==
0
)
{
/* to shortcut sys_munmap() in sys32_munmap() */
*
startp
=
PAGE_START
(
start
);
*
endp
=
PAGE_START
(
end
);
}
}
else
{
if
(
offset_in_page
(
start
))
{
ret
=
__ia32_unset_pp
(
start
,
PAGE_ALIGN
(
start
));
if
(
ret
==
1
)
*
startp
=
PAGE_START
(
start
);
if
(
ret
==
0
)
*
startp
=
PAGE_ALIGN
(
start
);
if
(
ret
<
0
)
goto
out
;
}
if
(
offset_in_page
(
end
))
{
ret
=
__ia32_unset_pp
(
PAGE_START
(
end
),
end
);
if
(
ret
==
1
)
*
endp
=
PAGE_ALIGN
(
end
);
if
(
ret
==
0
)
*
endp
=
PAGE_START
(
end
);
}
}
out:
up_write
(
&
current
->
mm
->
mmap_sem
);
return
ret
;
}
/*
* Compare the range between @start and @end with bitmap in partial page.
* @start and @end should be IA32 page aligned and in the same IA64 page.
*/
static
int
__ia32_compare_pp
(
unsigned
int
start
,
unsigned
int
end
)
{
struct
partial_page
*
pp
,
*
prev
;
struct
rb_node
**
rb_link
,
*
rb_parent
;
unsigned
int
pstart
,
start_bit
,
end_bit
,
size
;
unsigned
int
first_bit
,
next_zero_bit
;
/* the first range in bitmap */
pstart
=
PAGE_START
(
start
);
pp
=
__ia32_find_pp
(
current
->
thread
.
ppl
,
pstart
,
&
prev
,
&
rb_link
,
&
rb_parent
);
if
(
!
pp
)
return
1
;
start_bit
=
(
start
%
PAGE_SIZE
)
/
IA32_PAGE_SIZE
;
end_bit
=
(
end
%
PAGE_SIZE
)
/
IA32_PAGE_SIZE
;
size
=
sizeof
(
pp
->
bitmap
)
*
8
;
first_bit
=
find_first_bit
(
&
pp
->
bitmap
,
size
);
next_zero_bit
=
find_next_zero_bit
(
&
pp
->
bitmap
,
size
,
first_bit
);
if
((
start_bit
<
first_bit
)
||
(
end_bit
>
next_zero_bit
))
{
/* exceeds the first range in bitmap */
return
-
ENOMEM
;
}
else
if
((
start_bit
==
first_bit
)
&&
(
end_bit
==
next_zero_bit
))
{
first_bit
=
find_next_bit
(
&
pp
->
bitmap
,
size
,
next_zero_bit
);
if
((
next_zero_bit
<
first_bit
)
&&
(
first_bit
<
size
))
return
1
;
/* has next range */
else
return
0
;
/* no next range */
}
else
return
1
;
}
/*
* @start and @end should be IA32 page aligned, but don't need to be in the
* same IA64 page. Split @start and @end to make sure they're in the same IA64
* page, then call __ia32_compare_pp().
*
* Take this as example: the range is the 1st and 2nd 4K page.
* Return 0 if they fit bitmap exactly, i.e. bitmap = 00000011;
* Return 1 if the range doesn't cover whole bitmap, e.g. bitmap = 00001111;
* Return -ENOMEM if the range exceeds the bitmap, e.g. bitmap = 00000001 or
* bitmap = 00000101.
*/
static
int
ia32_compare_pp
(
unsigned
int
*
startp
,
unsigned
int
*
endp
)
{
unsigned
int
start
=
*
startp
,
end
=
*
endp
;
int
retval
=
0
;
down_write
(
&
current
->
mm
->
mmap_sem
);
if
(
end
<
PAGE_ALIGN
(
start
))
{
retval
=
__ia32_compare_pp
(
start
,
end
);
if
(
retval
==
0
)
{
*
startp
=
PAGE_START
(
start
);
*
endp
=
PAGE_ALIGN
(
end
);
}
}
else
{
if
(
offset_in_page
(
start
))
{
retval
=
__ia32_compare_pp
(
start
,
PAGE_ALIGN
(
start
));
if
(
retval
==
0
)
*
startp
=
PAGE_START
(
start
);
if
(
retval
<
0
)
goto
out
;
}
if
(
offset_in_page
(
end
))
{
retval
=
__ia32_compare_pp
(
PAGE_START
(
end
),
end
);
if
(
retval
==
0
)
*
endp
=
PAGE_ALIGN
(
end
);
}
}
out:
up_write
(
&
current
->
mm
->
mmap_sem
);
return
retval
;
}
static
void
__ia32_drop_pp_list
(
struct
partial_page_list
*
ppl
)
{
struct
partial_page
*
pp
=
ppl
->
pp_head
;
while
(
pp
)
{
struct
partial_page
*
next
=
pp
->
next
;
kmem_cache_free
(
partial_page_cachep
,
pp
);
pp
=
next
;
}
kfree
(
ppl
);
}
void
ia32_drop_partial_page_list
(
struct
task_struct
*
task
)
{
struct
partial_page_list
*
ppl
=
task
->
thread
.
ppl
;
if
(
ppl
&&
atomic_dec_and_test
(
&
ppl
->
pp_count
))
__ia32_drop_pp_list
(
ppl
);
}
/*
* Copy current->thread.ppl to ppl (already initialized).
*/
static
int
__ia32_copy_pp_list
(
struct
partial_page_list
*
ppl
)
{
struct
partial_page
*
pp
,
*
tmp
,
*
prev
;
struct
rb_node
**
rb_link
,
*
rb_parent
;
ppl
->
pp_head
=
NULL
;
ppl
->
pp_hint
=
NULL
;
ppl
->
ppl_rb
=
RB_ROOT
;
rb_link
=
&
ppl
->
ppl_rb
.
rb_node
;
rb_parent
=
NULL
;
prev
=
NULL
;
for
(
pp
=
current
->
thread
.
ppl
->
pp_head
;
pp
;
pp
=
pp
->
next
)
{
tmp
=
kmem_cache_alloc
(
partial_page_cachep
,
GFP_KERNEL
);
if
(
!
tmp
)
return
-
ENOMEM
;
*
tmp
=
*
pp
;
__ia32_insert_pp
(
ppl
,
tmp
,
prev
,
rb_link
,
rb_parent
);
prev
=
tmp
;
rb_link
=
&
tmp
->
pp_rb
.
rb_right
;
rb_parent
=
&
tmp
->
pp_rb
;
}
return
0
;
}
int
ia32_copy_partial_page_list
(
struct
task_struct
*
p
,
unsigned
long
clone_flags
)
{
int
retval
=
0
;
if
(
clone_flags
&
CLONE_VM
)
{
atomic_inc
(
&
current
->
thread
.
ppl
->
pp_count
);
p
->
thread
.
ppl
=
current
->
thread
.
ppl
;
}
else
{
p
->
thread
.
ppl
=
ia32_init_pp_list
();
if
(
!
p
->
thread
.
ppl
)
return
-
ENOMEM
;
down_write
(
&
current
->
mm
->
mmap_sem
);
{
retval
=
__ia32_copy_pp_list
(
p
->
thread
.
ppl
);
}
up_write
(
&
current
->
mm
->
mmap_sem
);
}
return
retval
;
}
static
unsigned
long
emulate_mmap
(
struct
file
*
file
,
unsigned
long
start
,
unsigned
long
len
,
int
prot
,
int
flags
,
loff_t
off
)
...
...
@@ -263,6 +767,7 @@ emulate_mmap (struct file *file, unsigned long start, unsigned long len, int pro
pend
=
PAGE_ALIGN
(
end
);
if
(
flags
&
MAP_FIXED
)
{
ia32_set_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
end
,
flags
);
if
(
start
>
pstart
)
{
if
(
flags
&
MAP_SHARED
)
printk
(
KERN_INFO
...
...
@@ -274,7 +779,7 @@ emulate_mmap (struct file *file, unsigned long start, unsigned long len, int pro
return
ret
;
pstart
+=
PAGE_SIZE
;
if
(
pstart
>=
pend
)
return
star
t
;
/* done */
goto
ou
t
;
/* done */
}
if
(
end
<
pend
)
{
if
(
flags
&
MAP_SHARED
)
...
...
@@ -287,7 +792,7 @@ emulate_mmap (struct file *file, unsigned long start, unsigned long len, int pro
return
ret
;
pend
-=
PAGE_SIZE
;
if
(
pstart
>=
pend
)
return
star
t
;
/* done */
goto
ou
t
;
/* done */
}
}
else
{
/*
...
...
@@ -341,6 +846,10 @@ emulate_mmap (struct file *file, unsigned long start, unsigned long len, int pro
if
(
!
(
prot
&
PROT_WRITE
)
&&
sys_mprotect
(
pstart
,
pend
-
pstart
,
prot
)
<
0
)
return
-
EINVAL
;
}
if
(
!
(
flags
&
MAP_FIXED
))
ia32_set_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
end
,
flags
);
out:
return
start
;
}
...
...
@@ -478,11 +987,16 @@ sys32_munmap (unsigned int start, unsigned int len)
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
ret
=
sys_munmap
(
start
,
end
-
start
);
#else
if
(
OFFSET4K
(
start
))
return
-
EINVAL
;
end
=
IA32_PAGE_ALIGN
(
end
);
if
(
start
>=
end
)
return
-
EINVAL
;
start
=
PAGE_ALIGN
(
start
);
end
=
PAGE_START
(
end
);
ret
=
ia32_unset_pp
(
&
start
,
&
end
);
if
(
ret
<
0
)
return
ret
;
if
(
start
>=
end
)
return
0
;
...
...
@@ -521,7 +1035,7 @@ mprotect_subpage (unsigned long address, int new_prot)
asmlinkage
long
sys32_mprotect
(
unsigned
int
start
,
unsigned
int
len
,
int
prot
)
{
unsigned
long
end
=
start
+
len
;
unsigned
int
end
=
start
+
len
;
#if PAGE_SHIFT > IA32_PAGE_SHIFT
long
retval
=
0
;
#endif
...
...
@@ -538,6 +1052,11 @@ sys32_mprotect (unsigned int start, unsigned int len, int prot)
if
(
end
<
start
)
return
-
EINVAL
;
retval
=
ia32_compare_pp
(
&
start
,
&
end
);
if
(
retval
<
0
)
return
retval
;
down
(
&
ia32_mmap_sem
);
{
if
(
offset_in_page
(
start
))
{
...
...
@@ -567,6 +1086,59 @@ sys32_mprotect (unsigned int start, unsigned int len, int prot)
#endif
}
asmlinkage
long
sys32_mremap
(
unsigned
int
addr
,
unsigned
int
old_len
,
unsigned
int
new_len
,
unsigned
int
flags
,
unsigned
int
new_addr
)
{
long
ret
;
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
ret
=
sys_mremap
(
addr
,
old_len
,
new_len
,
flags
,
new_addr
);
#else
unsigned
int
old_end
,
new_end
;
if
(
OFFSET4K
(
addr
))
return
-
EINVAL
;
old_len
=
IA32_PAGE_ALIGN
(
old_len
);
new_len
=
IA32_PAGE_ALIGN
(
new_len
);
old_end
=
addr
+
old_len
;
new_end
=
addr
+
new_len
;
if
(
!
new_len
)
return
-
EINVAL
;
if
((
flags
&
MREMAP_FIXED
)
&&
(
OFFSET4K
(
new_addr
)))
return
-
EINVAL
;
if
(
old_len
>=
new_len
)
{
ret
=
sys32_munmap
(
addr
+
new_len
,
old_len
-
new_len
);
if
(
ret
&&
old_len
!=
new_len
)
return
ret
;
ret
=
addr
;
if
(
!
(
flags
&
MREMAP_FIXED
)
||
(
new_addr
==
addr
))
return
ret
;
old_len
=
new_len
;
}
addr
=
PAGE_START
(
addr
);
old_len
=
PAGE_ALIGN
(
old_end
)
-
addr
;
new_len
=
PAGE_ALIGN
(
new_end
)
-
addr
;
down
(
&
ia32_mmap_sem
);
{
ret
=
sys_mremap
(
addr
,
old_len
,
new_len
,
flags
,
new_addr
);
}
up
(
&
ia32_mmap_sem
);
if
((
ret
>=
0
)
&&
(
old_len
<
new_len
))
{
/* mremap expanded successfully */
ia32_set_pp
(
old_end
,
new_end
,
flags
);
}
#endif
return
ret
;
}
asmlinkage
long
sys32_pipe
(
int
*
fd
)
{
...
...
arch/ia64/kernel/entry.S
View file @
ac6a5f92
...
...
@@ -179,17 +179,19 @@ GLOBAL_ENTRY(ia64_switch_to)
.
body
adds
r22
=
IA64_TASK_THREAD_KSP_OFFSET
,
r13
movl
r25
=
init_task
mov
r27
=
IA64_KR
(
CURRENT_STACK
)
adds
r21
=
IA64_TASK_THREAD_KSP_OFFSET
,
in0
dep
r20
=
0
,
in0
,
61
,
3
//
physical
address
of
"current"
;;
st8
[
r22
]=
sp
//
save
kernel
stack
pointer
of
old
task
shr.u
r26
=
r20
,
IA64_GRANULE_SHIFT
adds
r21
=
IA64_TASK_THREAD_KSP_OFFSET
,
in0
cmp.eq
p7
,
p6
=
r25
,
in0
;;
/
*
*
If
we
've already mapped this task'
s
page
,
we
can
skip
doing
it
again
.
*/
cmp.eq
p7
,
p6
=
r26
,
r27
(
p6
)
cmp.eq
p7
,
p6
=
r26
,
r27
(
p6
)
br.cond.dpnt
.
map
;;
.
done
:
...
...
arch/ia64/kernel/head.S
View file @
ac6a5f92
...
...
@@ -154,6 +154,10 @@ start_ap:
#endif
;;
tpa
r3
=
r2
//
r3
==
phys
addr
of
task
struct
;;
shr.u
r16
=
r3
,
IA64_GRANULE_SHIFT
(
isBP
)
br.cond.dpnt
.
load_current
//
BP
stack
is
on
region
5
---
no
need
to
map
it
//
load
mapping
for
stack
(
virtaddr
in
r2
,
physaddr
in
r3
)
rsm
psr
.
ic
movl
r17
=
PAGE_KERNEL
...
...
@@ -165,7 +169,6 @@ start_ap:
dep
r2
=-
1
,
r3
,
61
,
3
//
IMVA
of
task
;;
mov
r17
=
rr
[
r2
]
shr.u
r16
=
r3
,
IA64_GRANULE_SHIFT
;;
dep
r17
=
0
,
r17
,
8
,
24
;;
...
...
@@ -180,6 +183,7 @@ start_ap:
srlz.d
;;
.
load_current
:
//
load
the
"current"
pointer
(
r13
)
and
ar
.
k6
with
the
current
task
mov
IA64_KR
(
CURRENT
)=
r2
//
virtual
address
mov
IA64_KR
(
CURRENT_STACK
)=
r16
...
...
arch/ia64/kernel/iosapic.c
View file @
ac6a5f92
...
...
@@ -100,7 +100,6 @@
#endif
static
spinlock_t
iosapic_lock
=
SPIN_LOCK_UNLOCKED
;
extern
cpumask_t
__cacheline_aligned
pending_irq_cpumask
[
NR_IRQS
];
/* These tables map IA-64 vectors to the IOSAPIC pin that generates this vector. */
...
...
@@ -335,21 +334,6 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask)
#endif
}
static
inline
void
move_irq
(
int
irq
)
{
/* note - we hold desc->lock */
cpumask_t
tmp
;
irq_desc_t
*
desc
=
irq_descp
(
irq
);
if
(
!
cpus_empty
(
pending_irq_cpumask
[
irq
]))
{
cpus_and
(
tmp
,
pending_irq_cpumask
[
irq
],
cpu_online_map
);
if
(
unlikely
(
!
cpus_empty
(
tmp
)))
{
desc
->
handler
->
set_affinity
(
irq
,
pending_irq_cpumask
[
irq
]);
}
cpus_clear
(
pending_irq_cpumask
[
irq
]);
}
}
/*
* Handlers for level-triggered interrupts.
*/
...
...
arch/ia64/kernel/irq.c
View file @
ac6a5f92
...
...
@@ -1018,6 +1018,22 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
return
full_count
;
}
void
move_irq
(
int
irq
)
{
/* note - we hold desc->lock */
cpumask_t
tmp
;
irq_desc_t
*
desc
=
irq_descp
(
irq
);
if
(
!
cpus_empty
(
pending_irq_cpumask
[
irq
]))
{
cpus_and
(
tmp
,
pending_irq_cpumask
[
irq
],
cpu_online_map
);
if
(
unlikely
(
!
cpus_empty
(
tmp
)))
{
desc
->
handler
->
set_affinity
(
irq
,
pending_irq_cpumask
[
irq
]);
}
cpus_clear
(
pending_irq_cpumask
[
irq
]);
}
}
#endif
/* CONFIG_SMP */
#ifdef CONFIG_HOTPLUG_CPU
...
...
arch/ia64/kernel/mca.c
View file @
ac6a5f92
...
...
@@ -108,6 +108,7 @@ struct ia64_mca_tlb_info ia64_mca_tlb_list[NR_CPUS];
#define MAX_CPE_POLL_INTERVAL (15*60*HZ)
/* 15 minutes */
#define MIN_CPE_POLL_INTERVAL (2*60*HZ)
/* 2 minutes */
#define CMC_POLL_INTERVAL (1*60*HZ)
/* 1 minute */
#define CPE_HISTORY_LENGTH 5
#define CMC_HISTORY_LENGTH 5
static
struct
timer_list
cpe_poll_timer
;
...
...
@@ -127,6 +128,8 @@ static int cmc_polling_enabled = 1;
*/
static
int
cpe_poll_enabled
=
1
;
static
int
cpe_vector
=
-
1
;
extern
void
salinfo_log_wakeup
(
int
type
,
u8
*
buffer
,
u64
size
,
int
irqsafe
);
/*
...
...
@@ -267,20 +270,65 @@ ia64_mca_log_sal_error_record(int sal_info_type)
*/
#ifndef PLATFORM_MCA_HANDLERS
#ifdef CONFIG_ACPI
static
irqreturn_t
ia64_mca_cpe_int_handler
(
int
cpe_irq
,
void
*
arg
,
struct
pt_regs
*
ptregs
)
{
IA64_MCA_DEBUG
(
"%s: received interrupt. CPU:%d vector = %#x
\n
"
,
__FUNCTION__
,
smp_processor_id
(),
cpe_irq
);
static
unsigned
long
cpe_history
[
CPE_HISTORY_LENGTH
];
static
int
index
;
static
spinlock_t
cpe_history_lock
=
SPIN_LOCK_UNLOCKED
;
IA64_MCA_DEBUG
(
"%s: received interrupt vector = %#x on CPU %d
\n
"
,
__FUNCTION__
,
cpe_irq
,
smp_processor_id
());
/* SAL spec states this should run w/ interrupts enabled */
local_irq_enable
();
/* Get the C
MC
error record and log it */
/* Get the C
PE
error record and log it */
ia64_mca_log_sal_error_record
(
SAL_INFO_TYPE_CPE
);
spin_lock
(
&
cpe_history_lock
);
if
(
!
cpe_poll_enabled
&&
cpe_vector
>=
0
)
{
int
i
,
count
=
1
;
/* we know 1 happened now */
unsigned
long
now
=
jiffies
;
for
(
i
=
0
;
i
<
CPE_HISTORY_LENGTH
;
i
++
)
{
if
(
now
-
cpe_history
[
i
]
<=
HZ
)
count
++
;
}
IA64_MCA_DEBUG
(
KERN_INFO
"CPE threshold %d/%d
\n
"
,
count
,
CPE_HISTORY_LENGTH
);
if
(
count
>=
CPE_HISTORY_LENGTH
)
{
cpe_poll_enabled
=
1
;
spin_unlock
(
&
cpe_history_lock
);
disable_irq_nosync
(
local_vector_to_irq
(
IA64_CPE_VECTOR
));
/*
* Corrected errors will still be corrected, but
* make sure there's a log somewhere that indicates
* something is generating more than we can handle.
*/
printk
(
KERN_WARNING
"WARNING: Switching to polling CPE handler; error records may be lost
\n
"
);
mod_timer
(
&
cpe_poll_timer
,
jiffies
+
MIN_CPE_POLL_INTERVAL
);
/* lock already released, get out now */
return
IRQ_HANDLED
;
}
else
{
cpe_history
[
index
++
]
=
now
;
if
(
index
==
CPE_HISTORY_LENGTH
)
index
=
0
;
}
}
spin_unlock
(
&
cpe_history_lock
);
return
IRQ_HANDLED
;
}
#endif
/* CONFIG_ACPI */
static
void
show_min_state
(
pal_min_state_area_t
*
minstate
)
{
...
...
@@ -901,7 +949,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs)
* handled
*/
static
irqreturn_t
ia64_mca_cmc_int_caller
(
int
c
pe
_irq
,
void
*
arg
,
struct
pt_regs
*
ptregs
)
ia64_mca_cmc_int_caller
(
int
c
mc
_irq
,
void
*
arg
,
struct
pt_regs
*
ptregs
)
{
static
int
start_count
=
-
1
;
unsigned
int
cpuid
;
...
...
@@ -912,7 +960,7 @@ ia64_mca_cmc_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
if
(
start_count
==
-
1
)
start_count
=
IA64_LOG_COUNT
(
SAL_INFO_TYPE_CMC
);
ia64_mca_cmc_int_handler
(
c
pe
_irq
,
arg
,
ptregs
);
ia64_mca_cmc_int_handler
(
c
mc
_irq
,
arg
,
ptregs
);
for
(
++
cpuid
;
cpuid
<
NR_CPUS
&&
!
cpu_online
(
cpuid
)
;
cpuid
++
);
...
...
@@ -967,11 +1015,13 @@ ia64_mca_cmc_poll (unsigned long dummy)
* Outputs
* handled
*/
#ifdef CONFIG_ACPI
static
irqreturn_t
ia64_mca_cpe_int_caller
(
int
cpe_irq
,
void
*
arg
,
struct
pt_regs
*
ptregs
)
{
static
int
start_count
=
-
1
;
static
int
poll_time
=
M
AX
_CPE_POLL_INTERVAL
;
static
int
poll_time
=
M
IN
_CPE_POLL_INTERVAL
;
unsigned
int
cpuid
;
cpuid
=
smp_processor_id
();
...
...
@@ -989,20 +1039,30 @@ ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
}
else
{
/*
* If a log was recorded, increase our polling frequency,
* otherwise, backoff.
* otherwise, backoff
or return to interrupt mode
.
*/
if
(
start_count
!=
IA64_LOG_COUNT
(
SAL_INFO_TYPE_CPE
))
{
poll_time
=
max
(
MIN_CPE_POLL_INTERVAL
,
poll_time
/
2
);
}
else
{
}
else
if
(
cpe_vector
<
0
)
{
poll_time
=
min
(
MAX_CPE_POLL_INTERVAL
,
poll_time
*
2
);
}
else
{
poll_time
=
MIN_CPE_POLL_INTERVAL
;
printk
(
KERN_WARNING
"Returning to interrupt driven CPE handler
\n
"
);
enable_irq
(
local_vector_to_irq
(
IA64_CPE_VECTOR
));
cpe_poll_enabled
=
0
;
}
if
(
cpe_poll_enabled
)
mod_timer
(
&
cpe_poll_timer
,
jiffies
+
poll_time
);
start_count
=
-
1
;
mod_timer
(
&
cpe_poll_timer
,
jiffies
+
poll_time
);
}
return
IRQ_HANDLED
;
}
#endif
/* CONFIG_ACPI */
/*
* ia64_mca_cpe_poll
*
...
...
@@ -1240,21 +1300,23 @@ ia64_mca_init(void)
register_percpu_irq
(
IA64_MCA_WAKEUP_VECTOR
,
&
mca_wkup_irqaction
);
#ifdef CONFIG_ACPI
/* Setup the CPE
interrupt vecto
r */
/* Setup the CPE
I/P vector and handle
r */
{
irq_desc_t
*
desc
;
unsigned
int
irq
;
int
cpev
=
acpi_request_vector
(
ACPI_INTERRUPT_CPEI
);
if
(
cpev
>=
0
)
{
cpe_vector
=
acpi_request_vector
(
ACPI_INTERRUPT_CPEI
);
if
(
cpe_vector
>=
0
)
{
for
(
irq
=
0
;
irq
<
NR_IRQS
;
++
irq
)
if
(
irq_to_vector
(
irq
)
==
cpe
v
)
{
if
(
irq_to_vector
(
irq
)
==
cpe
_vector
)
{
desc
=
irq_descp
(
irq
);
desc
->
status
|=
IRQ_PER_CPU
;
setup_irq
(
irq
,
&
mca_cpe_irqaction
);
}
ia64_mca_register_cpev
(
cpe
v
);
ia64_mca_register_cpev
(
cpe
_vector
);
}
register_percpu_irq
(
IA64_CPEP_VECTOR
,
&
mca_cpep_irqaction
);
}
#endif
...
...
@@ -1294,9 +1356,10 @@ ia64_mca_late_init(void)
#ifdef CONFIG_ACPI
/* If platform doesn't support CPEI, get the timer going. */
if
(
acpi_request_vector
(
ACPI_INTERRUPT_CPEI
)
<
0
&&
cpe_poll_enabled
)
{
register_percpu_irq
(
IA64_CPEP_VECTOR
,
&
mca_cpep_irqaction
);
if
(
cpe_vector
<
0
&&
cpe_poll_enabled
)
{
ia64_mca_cpe_poll
(
0UL
);
}
else
{
cpe_poll_enabled
=
0
;
}
#endif
...
...
arch/ia64/kernel/palinfo.c
View file @
ac6a5f92
...
...
@@ -515,10 +515,10 @@ static const char *bus_features[]={
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
"Enable Cache Line Repl. Exclusive"
,
"Enable Cache Line Repl. Shared"
,
"Enable Cache Line Repl. Exclusive"
,
"Disable Transaction Queuing"
,
"Disable Reponse Error Checking"
,
"Disable Re
s
ponse Error Checking"
,
"Disable Bus Error Checking"
,
"Disable Bus Requester Internal Error Signalling"
,
"Disable Bus Requester Error Signalling"
,
...
...
arch/ia64/kernel/perfmon.c
View file @
ac6a5f92
...
...
@@ -311,6 +311,7 @@ typedef struct pfm_context {
unsigned
int
ctx_cpu
;
/* cpu to which perfmon is applied (system wide) */
int
ctx_fd
;
/* file descriptor used my this context */
pfm_ovfl_arg_t
ctx_ovfl_arg
;
/* argument to custom buffer format handler */
pfm_buffer_fmt_t
*
ctx_buf_fmt
;
/* buffer format callbacks */
void
*
ctx_smpl_hdr
;
/* points to sampling buffer header kernel vaddr */
...
...
@@ -4584,31 +4585,6 @@ pfm_context_unload(pfm_context_t *ctx, void *arg, int count, struct pt_regs *reg
return
0
;
}
static
void
pfm_force_cleanup
(
pfm_context_t
*
ctx
,
struct
pt_regs
*
regs
)
{
struct
task_struct
*
task
=
ctx
->
ctx_task
;
ia64_psr
(
regs
)
->
up
=
0
;
ia64_psr
(
regs
)
->
sp
=
1
;
if
(
GET_PMU_OWNER
()
==
task
)
{
DPRINT
((
"cleared ownership for [%d]
\n
"
,
ctx
->
ctx_task
->
pid
));
SET_PMU_OWNER
(
NULL
,
NULL
);
}
/*
* disconnect the task from the context and vice-versa
*/
PFM_SET_WORK_PENDING
(
task
,
0
);
task
->
thread
.
pfm_context
=
NULL
;
task
->
thread
.
flags
&=
~
IA64_THREAD_PM_VALID
;
DPRINT
((
"force cleanupf for [%d]
\n
"
,
task
->
pid
));
}
/*
* called only from exit_thread(): task == current
...
...
@@ -5185,7 +5161,7 @@ pfm_end_notify_user(pfm_context_t *ctx)
static
void
pfm_overflow_handler
(
struct
task_struct
*
task
,
pfm_context_t
*
ctx
,
u64
pmc0
,
struct
pt_regs
*
regs
)
{
pfm_ovfl_arg_t
ovfl_arg
;
pfm_ovfl_arg_t
*
ovfl_arg
;
unsigned
long
mask
;
unsigned
long
old_val
,
ovfl_val
,
new_val
;
unsigned
long
ovfl_notify
=
0UL
,
ovfl_pmds
=
0UL
,
smpl_pmds
=
0UL
,
reset_pmds
;
...
...
@@ -5272,7 +5248,8 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
int
j
,
k
,
ret
=
0
;
int
this_cpu
=
smp_processor_id
();
pmd_mask
=
ovfl_pmds
>>
PMU_FIRST_COUNTER
;
pmd_mask
=
ovfl_pmds
>>
PMU_FIRST_COUNTER
;
ovfl_arg
=
&
ctx
->
ctx_ovfl_arg
;
prefetch
(
ctx
->
ctx_smpl_hdr
);
...
...
@@ -5282,15 +5259,15 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
if
((
pmd_mask
&
0x1
)
==
0
)
continue
;
ovfl_arg
.
ovfl_pmd
=
(
unsigned
char
)
i
;
ovfl_arg
.
ovfl_notify
=
ovfl_notify
&
mask
?
1
:
0
;
ovfl_arg
.
active_set
=
0
;
ovfl_arg
.
ovfl_ctrl
.
val
=
0
;
/* module must fill in all fields */
ovfl_arg
.
smpl_pmds
[
0
]
=
smpl_pmds
=
ctx
->
ctx_pmds
[
i
].
smpl_pmds
[
0
];
ovfl_arg
->
ovfl_pmd
=
(
unsigned
char
)
i
;
ovfl_arg
->
ovfl_notify
=
ovfl_notify
&
mask
?
1
:
0
;
ovfl_arg
->
active_set
=
0
;
ovfl_arg
->
ovfl_ctrl
.
val
=
0
;
/* module must fill in all fields */
ovfl_arg
->
smpl_pmds
[
0
]
=
smpl_pmds
=
ctx
->
ctx_pmds
[
i
].
smpl_pmds
[
0
];
ovfl_arg
.
pmd_value
=
ctx
->
ctx_pmds
[
i
].
val
;
ovfl_arg
.
pmd_last_reset
=
ctx
->
ctx_pmds
[
i
].
lval
;
ovfl_arg
.
pmd_eventid
=
ctx
->
ctx_pmds
[
i
].
eventid
;
ovfl_arg
->
pmd_value
=
ctx
->
ctx_pmds
[
i
].
val
;
ovfl_arg
->
pmd_last_reset
=
ctx
->
ctx_pmds
[
i
].
lval
;
ovfl_arg
->
pmd_eventid
=
ctx
->
ctx_pmds
[
i
].
eventid
;
/*
* copy values of pmds of interest. Sampling format may copy them
...
...
@@ -5299,8 +5276,8 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
if
(
smpl_pmds
)
{
for
(
j
=
0
,
k
=
0
;
smpl_pmds
;
j
++
,
smpl_pmds
>>=
1
)
{
if
((
smpl_pmds
&
0x1
)
==
0
)
continue
;
ovfl_arg
.
smpl_pmds_values
[
k
++
]
=
PMD_IS_COUNTING
(
j
)
?
pfm_read_soft_counter
(
ctx
,
j
)
:
ia64_get_pmd
(
j
);
DPRINT_ovfl
((
"smpl_pmd[%d]=pmd%u=0x%lx
\n
"
,
k
-
1
,
j
,
ovfl_arg
.
smpl_pmds_values
[
k
-
1
]));
ovfl_arg
->
smpl_pmds_values
[
k
++
]
=
PMD_IS_COUNTING
(
j
)
?
pfm_read_soft_counter
(
ctx
,
j
)
:
ia64_get_pmd
(
j
);
DPRINT_ovfl
((
"smpl_pmd[%d]=pmd%u=0x%lx
\n
"
,
k
-
1
,
j
,
ovfl_arg
->
smpl_pmds_values
[
k
-
1
]));
}
}
...
...
@@ -5311,7 +5288,7 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
/*
* call custom buffer format record (handler) routine
*/
ret
=
(
*
ctx
->
ctx_buf_fmt
->
fmt_handler
)(
task
,
ctx
->
ctx_smpl_hdr
,
&
ovfl_arg
,
regs
,
tstamp
);
ret
=
(
*
ctx
->
ctx_buf_fmt
->
fmt_handler
)(
task
,
ctx
->
ctx_smpl_hdr
,
ovfl_arg
,
regs
,
tstamp
);
end_cycles
=
ia64_get_itc
();
...
...
@@ -5319,13 +5296,13 @@ pfm_overflow_handler(struct task_struct *task, pfm_context_t *ctx, u64 pmc0, str
* For those controls, we take the union because they have
* an all or nothing behavior.
*/
ovfl_ctrl
.
bits
.
notify_user
|=
ovfl_arg
.
ovfl_ctrl
.
bits
.
notify_user
;
ovfl_ctrl
.
bits
.
block_task
|=
ovfl_arg
.
ovfl_ctrl
.
bits
.
block_task
;
ovfl_ctrl
.
bits
.
mask_monitoring
|=
ovfl_arg
.
ovfl_ctrl
.
bits
.
mask_monitoring
;
ovfl_ctrl
.
bits
.
notify_user
|=
ovfl_arg
->
ovfl_ctrl
.
bits
.
notify_user
;
ovfl_ctrl
.
bits
.
block_task
|=
ovfl_arg
->
ovfl_ctrl
.
bits
.
block_task
;
ovfl_ctrl
.
bits
.
mask_monitoring
|=
ovfl_arg
->
ovfl_ctrl
.
bits
.
mask_monitoring
;
/*
* build the bitmask of pmds to reset now
*/
if
(
ovfl_arg
.
ovfl_ctrl
.
bits
.
reset_ovfl_pmds
)
reset_pmds
|=
mask
;
if
(
ovfl_arg
->
ovfl_ctrl
.
bits
.
reset_ovfl_pmds
)
reset_pmds
|=
mask
;
pfm_stats
[
this_cpu
].
pfm_smpl_handler_cycles
+=
end_cycles
-
start_cycles
;
}
...
...
@@ -5793,6 +5770,32 @@ pfm_syst_wide_update_task(struct task_struct *task, unsigned long info, int is_c
}
#ifdef CONFIG_SMP
static
void
pfm_force_cleanup
(
pfm_context_t
*
ctx
,
struct
pt_regs
*
regs
)
{
struct
task_struct
*
task
=
ctx
->
ctx_task
;
ia64_psr
(
regs
)
->
up
=
0
;
ia64_psr
(
regs
)
->
sp
=
1
;
if
(
GET_PMU_OWNER
()
==
task
)
{
DPRINT
((
"cleared ownership for [%d]
\n
"
,
ctx
->
ctx_task
->
pid
));
SET_PMU_OWNER
(
NULL
,
NULL
);
}
/*
* disconnect the task from the context and vice-versa
*/
PFM_SET_WORK_PENDING
(
task
,
0
);
task
->
thread
.
pfm_context
=
NULL
;
task
->
thread
.
flags
&=
~
IA64_THREAD_PM_VALID
;
DPRINT
((
"force cleanup for [%d]
\n
"
,
task
->
pid
));
}
/*
* in 2.6, interrupts are masked when we come here and the runqueue lock is held
*/
...
...
arch/ia64/kernel/process.c
View file @
ac6a5f92
...
...
@@ -439,6 +439,10 @@ copy_thread (int nr, unsigned long clone_flags,
ia32_save_state
(
p
);
if
(
clone_flags
&
CLONE_SETTLS
)
retval
=
ia32_clone_tls
(
p
,
child_ptregs
);
/* Copy partially mapped page list */
if
(
!
retval
)
retval
=
ia32_copy_partial_page_list
(
p
,
clone_flags
);
}
#endif
...
...
@@ -672,6 +676,8 @@ flush_thread (void)
/* drop floating-point and debug-register state if it exists: */
current
->
thread
.
flags
&=
~
(
IA64_THREAD_FPH_VALID
|
IA64_THREAD_DBG_VALID
);
ia64_drop_fpu
(
current
);
if
(
IS_IA32_PROCESS
(
ia64_task_regs
(
current
)))
ia32_drop_partial_page_list
(
current
);
}
/*
...
...
@@ -691,6 +697,8 @@ exit_thread (void)
if
(
current
->
thread
.
flags
&
IA64_THREAD_DBG_VALID
)
pfm_release_debug_registers
(
current
);
#endif
if
(
IS_IA32_PROCESS
(
ia64_task_regs
(
current
)))
ia32_drop_partial_page_list
(
current
);
}
unsigned
long
...
...
arch/ia64/kernel/unwind.c
View file @
ac6a5f92
...
...
@@ -385,9 +385,10 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char
}
if
(
write
)
{
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
{
if
(
read_only
(
addr
))
{
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
,
__FUNCTION__
);
}
else
{
*
addr
=
*
val
;
if
(
*
nat
)
*
nat_addr
|=
nat_mask
;
...
...
@@ -432,9 +433,10 @@ unw_access_br (struct unw_frame_info *info, int regnum, unsigned long *val, int
return
-
1
;
}
if
(
write
)
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
if
(
read_only
(
addr
))
{
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
,
__FUNCTION__
);
}
else
*
addr
=
*
val
;
else
*
val
=
*
addr
;
...
...
@@ -480,9 +482,10 @@ unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val,
}
if
(
write
)
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
if
(
read_only
(
addr
))
{
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
,
__FUNCTION__
);
}
else
*
addr
=
*
val
;
else
*
val
=
*
addr
;
...
...
@@ -576,9 +579,10 @@ unw_access_ar (struct unw_frame_info *info, int regnum, unsigned long *val, int
}
if
(
write
)
{
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
if
(
read_only
(
addr
))
{
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
,
__FUNCTION__
);
}
else
*
addr
=
*
val
;
}
else
*
val
=
*
addr
;
...
...
@@ -596,9 +600,10 @@ unw_access_pr (struct unw_frame_info *info, unsigned long *val, int write)
addr
=
&
info
->
sw
->
pr
;
if
(
write
)
{
if
(
read_only
(
addr
))
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
);
else
if
(
read_only
(
addr
))
{
UNW_DPRINT
(
0
,
"unwind.%s: ignoring attempt to write read-only location
\n
"
,
__FUNCTION__
);
}
else
*
addr
=
*
val
;
}
else
*
val
=
*
addr
;
...
...
arch/ia64/mm/discontig.c
View file @
ac6a5f92
...
...
@@ -154,6 +154,9 @@ static void __init reassign_cpu_only_nodes(void)
memcpy
(
numa_slit
,
numa_slit_fix
,
sizeof
(
numa_slit
));
for
(
i
=
nnode
;
i
<
numnodes
;
i
++
)
node_set_offline
(
i
);
numnodes
=
nnode
;
return
;
...
...
arch/ia64/mm/hugetlbpage.c
View file @
ac6a5f92
...
...
@@ -297,7 +297,7 @@ int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
unlock_page
(
page
);
}
else
{
hugetlb_put_quota
(
mapping
);
free_huge_pag
e
(
page
);
page_cache_releas
e
(
page
);
goto
out
;
}
}
...
...
arch/ia64/sn/io/machvec/pci_bus_cvlink.c
View file @
ac6a5f92
...
...
@@ -741,7 +741,7 @@ pci_bus_to_hcl_cvlink(void)
/* Is this PCI bus associated with this moduleid? */
moduleid
=
NODE_MODULEID
(
nasid_to_cnodeid
(
pcibr_soft
->
bs_nasid
));
if
(
modules
[
i
]
->
id
==
moduleid
)
{
if
(
sn_
modules
[
i
]
->
id
==
moduleid
)
{
struct
pcibr_list_s
*
new_element
;
new_element
=
kmalloc
(
sizeof
(
struct
pcibr_soft_s
),
GFP_KERNEL
);
...
...
@@ -781,7 +781,7 @@ pci_bus_to_hcl_cvlink(void)
/*
* We now have a list of all the pci bridges associated with
* the module_id, modules[i]. Call pci_bus_map_create() for
* the module_id,
sn_
modules[i]. Call pci_bus_map_create() for
* each pci bridge
*/
softlistp
=
first_in_list
;
...
...
arch/ia64/sn/io/sn2/klgraph.c
View file @
ac6a5f92
...
...
@@ -527,7 +527,7 @@ klhwg_add_all_modules(vertex_hdl_t hwgraph_root)
/* Use module as module vertex fastinfo */
memset
(
buffer
,
0
,
16
);
format_module_id
(
buffer
,
modules
[
cm
]
->
id
,
MODULE_FORMAT_BRIEF
);
format_module_id
(
buffer
,
sn_
modules
[
cm
]
->
id
,
MODULE_FORMAT_BRIEF
);
sprintf
(
name
,
EDGE_LBL_MODULE
"/%s"
,
buffer
);
rc
=
hwgraph_path_add
(
hwgraph_root
,
name
,
&
module_vhdl
);
...
...
@@ -535,7 +535,7 @@ klhwg_add_all_modules(vertex_hdl_t hwgraph_root)
rc
=
rc
;
HWGRAPH_DEBUG
(
__FILE__
,
__FUNCTION__
,
__LINE__
,
module_vhdl
,
NULL
,
"Created module path.
\n
"
);
hwgraph_fastinfo_set
(
module_vhdl
,
(
arbitrary_info_t
)
modules
[
cm
]);
hwgraph_fastinfo_set
(
module_vhdl
,
(
arbitrary_info_t
)
sn_
modules
[
cm
]);
/* Add system controller */
sprintf
(
name
,
...
...
arch/ia64/sn/io/sn2/ml_iograph.c
View file @
ac6a5f92
...
...
@@ -517,6 +517,14 @@ io_init_node(cnodeid_t cnodeid)
ASSERT
(
hubv
!=
GRAPH_VERTEX_NONE
);
/*
* attach our hub_provider information to hubv,
* so we can use it as a crosstalk provider "master"
* vertex.
*/
xtalk_provider_register
(
hubv
,
&
hub_provider
);
xtalk_provider_startup
(
hubv
);
/*
* If nothing connected to this hub's xtalk port, we're done.
*/
...
...
@@ -527,14 +535,6 @@ io_init_node(cnodeid_t cnodeid)
/* NOTREACHED */
}
/*
* attach our hub_provider information to hubv,
* so we can use it as a crosstalk provider "master"
* vertex.
*/
xtalk_provider_register
(
hubv
,
&
hub_provider
);
xtalk_provider_startup
(
hubv
);
/*
* Create a vertex to represent the crosstalk bus
* attached to this hub, and a vertex to be used
...
...
arch/ia64/sn/io/sn2/module.c
View file @
ac6a5f92
...
...
@@ -33,7 +33,7 @@
#define DPRINTF(x...)
#endif
module_t
*
modules
[
MODULE_MAX
];
module_t
*
sn_
modules
[
MODULE_MAX
];
int
nummodules
;
#define SN00_SERIAL_FUDGE 0x3b1af409d513c2
...
...
@@ -59,9 +59,9 @@ module_lookup(moduleid_t id)
int
i
;
for
(
i
=
0
;
i
<
nummodules
;
i
++
)
if
(
modules
[
i
]
->
id
==
id
)
{
DPRINTF
(
"module_lookup: found m=0x%p
\n
"
,
modules
[
i
]);
return
modules
[
i
];
if
(
sn_
modules
[
i
]
->
id
==
id
)
{
DPRINTF
(
"module_lookup: found m=0x%p
\n
"
,
sn_
modules
[
i
]);
return
sn_
modules
[
i
];
}
return
NULL
;
...
...
@@ -104,10 +104,10 @@ module_add_node(geoid_t geoid, cnodeid_t cnodeid)
/* Insert in sorted order by module number */
for
(
i
=
nummodules
;
i
>
0
&&
modules
[
i
-
1
]
->
id
>
moduleid
;
i
--
)
modules
[
i
]
=
modules
[
i
-
1
];
for
(
i
=
nummodules
;
i
>
0
&&
sn_
modules
[
i
-
1
]
->
id
>
moduleid
;
i
--
)
sn_modules
[
i
]
=
sn_
modules
[
i
-
1
];
modules
[
i
]
=
m
;
sn_
modules
[
i
]
=
m
;
nummodules
++
;
}
...
...
arch/ia64/sn/kernel/irq.c
View file @
ac6a5f92
...
...
@@ -41,6 +41,7 @@ static void force_interrupt(int irq);
extern
void
pcibr_force_interrupt
(
pcibr_intr_t
intr
);
extern
int
sn_force_interrupt_flag
;
struct
irq_desc
*
sn_irq_desc
(
unsigned
int
irq
);
extern
cpumask_t
__cacheline_aligned
pending_irq_cpumask
[
NR_IRQS
];
struct
sn_intr_list_t
{
struct
sn_intr_list_t
*
next
;
...
...
@@ -71,6 +72,21 @@ sn_enable_irq(unsigned int irq)
{
}
static
inline
void
move_irq
(
int
irq
)
{
/* note - we hold desc->lock */
cpumask_t
tmp
;
irq_desc_t
*
desc
=
irq_descp
(
irq
);
if
(
!
cpus_empty
(
pending_irq_cpumask
[
irq
]))
{
cpus_and
(
tmp
,
pending_irq_cpumask
[
irq
],
cpu_online_map
);
if
(
unlikely
(
!
cpus_empty
(
tmp
)))
{
desc
->
handler
->
set_affinity
(
irq
,
pending_irq_cpumask
[
irq
]);
}
cpus_clear
(
pending_irq_cpumask
[
irq
]);
}
}
static
void
sn_ack_irq
(
unsigned
int
irq
)
{
...
...
@@ -94,6 +110,7 @@ sn_ack_irq(unsigned int irq)
}
HUB_S
((
unsigned
long
*
)
GLOBAL_MMR_ADDR
(
nasid
,
SH_EVENT_OCCURRED_ALIAS
),
mask
);
__set_bit
(
irq
,
(
volatile
void
*
)
pda
->
sn_in_service_ivecs
);
move_irq
(
irq
);
}
static
void
...
...
arch/ia64/sn/kernel/setup.c
View file @
ac6a5f92
...
...
@@ -226,7 +226,25 @@ sn_check_for_wars(void)
shub_1_1_found
=
1
;
}
/**
* sn_set_error_handling_features - Tell the SN prom how to handle certain
* error types.
*/
static
void
__init
sn_set_error_handling_features
(
void
)
{
u64
ret
;
u64
sn_ehf_bits
[
7
];
/* see ia64_sn_set_error_handling_features */
memset
(
sn_ehf_bits
,
0
,
sizeof
(
sn_ehf_bits
));
#define EHF(x) __set_bit(SN_SAL_EHF_ ## x, sn_ehf_bits)
EHF
(
MCA_SLV_TO_OS_INIT_SLV
);
EHF
(
NO_RZ_TLBC
);
// Uncomment once Jesse's code goes in - EHF(NO_RZ_IO_READ);
#undef EHF
ret
=
ia64_sn_set_error_handling_features
(
sn_ehf_bits
);
if
(
ret
)
printk
(
KERN_ERR
"%s: failed, return code %ld
\n
"
,
__FUNCTION__
,
ret
);
}
/**
* sn_setup - SN platform setup routine
...
...
@@ -318,6 +336,9 @@ sn_setup(char **cmdline_p)
master_node_bedrock_address
);
}
/* Tell the prom how to handle certain error types */
sn_set_error_handling_features
();
/*
* we set the default root device to /dev/hda
* to make simulation easy
...
...
include/asm-ia64/gcc_intrin.h
View file @
ac6a5f92
...
...
@@ -489,10 +489,16 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__;
#define ia64_ptce(addr) asm volatile ("ptc.e %0" :: "r"(addr))
#define ia64_ptcga(addr, size) \
asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory")
do { \
asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory"); \
ia64_dv_serialize_data(); \
} while (0)
#define ia64_ptcl(addr, size) \
asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory")
#define ia64_ptcl(addr, size) \
do { \
asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory"); \
ia64_dv_serialize_data(); \
} while (0)
#define ia64_ptri(addr, size) \
asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory")
...
...
@@ -581,7 +587,7 @@ register unsigned long ia64_r13 asm ("r13") __attribute_used__;
#define ia64_intrin_local_irq_restore(x) \
do { \
asm volatile ("
cmp.ne p6,p7=%0,r0;;" \
asm volatile ("
;;
cmp.ne p6,p7=%0,r0;;" \
"(p6) ssm psr.i;" \
"(p7) rsm psr.i;;" \
"(p6) srlz.d" \
...
...
include/asm-ia64/ia32.h
View file @
ac6a5f92
...
...
@@ -6,7 +6,8 @@
#include <asm/ptrace.h>
#include <asm/signal.h>
#define IA32_NR_syscalls 283
/* length of syscall table */
#define IA32_NR_syscalls 283
/* length of syscall table */
#define IA32_PAGE_SHIFT 12
/* 4KB pages */
#ifndef __ASSEMBLY__
...
...
@@ -24,6 +25,13 @@ extern int ia32_clone_tls (struct task_struct *child, struct pt_regs *childregs)
/* Declare this unconditionally, so we don't get warnings for unreachable code. */
extern
int
ia32_setup_frame1
(
int
sig
,
struct
k_sigaction
*
ka
,
siginfo_t
*
info
,
sigset_t
*
set
,
struct
pt_regs
*
regs
);
#if PAGE_SHIFT > IA32_PAGE_SHIFT
extern
int
ia32_copy_partial_page_list
(
struct
task_struct
*
,
unsigned
long
);
extern
void
ia32_drop_partial_page_list
(
struct
task_struct
*
);
#else
# define ia32_copy_partial_page_list(a1, a2) 0
# define ia32_drop_partial_page_list(a1) do { ; } while (0)
#endif
#endif
/* !__ASSEMBLY__ */
...
...
include/asm-ia64/irq.h
View file @
ac6a5f92
...
...
@@ -30,6 +30,12 @@ extern void disable_irq_nosync (unsigned int);
extern
void
enable_irq
(
unsigned
int
);
extern
void
set_irq_affinity_info
(
unsigned
int
irq
,
int
dest
,
int
redir
);
#ifdef CONFIG_SMP
extern
void
move_irq
(
int
irq
);
#else
#define move_irq(irq)
#endif
struct
irqaction
;
struct
pt_regs
;
int
handle_IRQ_event
(
unsigned
int
,
struct
pt_regs
*
,
struct
irqaction
*
);
...
...
include/asm-ia64/pgtable.h
View file @
ac6a5f92
...
...
@@ -297,11 +297,7 @@ ia64_phys_addr_valid (unsigned long addr)
* works bypasses the caches, but does allow for consecutive writes to
* be combined into single (but larger) write transactions.
*/
#ifdef CONFIG_MCKINLEY_A0_SPECIFIC
# define pgprot_writecombine(prot) prot
#else
# define pgprot_writecombine(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_WC)
#endif
#define pgprot_writecombine(prot) __pgprot((pgprot_val(prot) & ~_PAGE_MA_MASK) | _PAGE_MA_WC)
static
inline
unsigned
long
pgd_index
(
unsigned
long
address
)
...
...
include/asm-ia64/processor.h
View file @
ac6a5f92
...
...
@@ -230,6 +230,7 @@ struct desc_struct {
#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)
struct
partial_page_list
;
#endif
struct
thread_struct
{
...
...
@@ -251,6 +252,7 @@ struct thread_struct {
__u64
fdr
;
/* IA32 fp except. data reg */
__u64
old_k1
;
/* old value of ar.k1 */
__u64
old_iob
;
/* old IOBase value */
struct
partial_page_list
*
ppl
;
/* partial page list for 4K page size issue */
/* cached TLS descriptors. */
struct
desc_struct
tls_array
[
GDT_ENTRY_TLS_ENTRIES
];
...
...
@@ -260,7 +262,8 @@ struct thread_struct {
.fir = 0, \
.fdr = 0, \
.old_k1 = 0, \
.old_iob = 0,
.old_iob = 0, \
.ppl = 0,
#else
# define INIT_THREAD_IA32
#endif
/* CONFIG_IA32_SUPPORT */
...
...
include/asm-ia64/sn/module.h
View file @
ac6a5f92
...
...
@@ -180,7 +180,7 @@ struct module_s {
};
/* module.c */
extern
module_t
*
modules
[
MODULE_MAX
];
/* Indexed by cmoduleid_t */
extern
module_t
*
sn_
modules
[
MODULE_MAX
];
/* Indexed by cmoduleid_t */
extern
int
nummodules
;
extern
module_t
*
module_lookup
(
moduleid_t
id
);
...
...
include/asm-ia64/sn/sn_sal.h
View file @
ac6a5f92
...
...
@@ -33,6 +33,7 @@
#define SN_SAL_NO_FAULT_ZONE_VIRTUAL 0x02000010
#define SN_SAL_NO_FAULT_ZONE_PHYSICAL 0x02000011
#define SN_SAL_PRINT_ERROR 0x02000012
#define SN_SAL_SET_ERROR_HANDLING_FEATURES 0x0200001a // reentrant
#define SN_SAL_CONSOLE_PUTC 0x02000021
#define SN_SAL_CONSOLE_GETC 0x02000022
#define SN_SAL_CONSOLE_PUTS 0x02000023
...
...
@@ -92,6 +93,19 @@
#define SALRET_INVALID_ARG -2
#define SALRET_ERROR -3
/*
* SN_SAL_SET_ERROR_HANDLING_FEATURES bit settings
*/
enum
{
/* if "rz always" is set, have the mca slaves call os_init_slave */
SN_SAL_EHF_MCA_SLV_TO_OS_INIT_SLV
=
0
,
/* do not rz on tlb checks, even if "rz always" is set */
SN_SAL_EHF_NO_RZ_TLBC
,
/* do not rz on PIO reads to I/O space, even if "rz always" is set */
SN_SAL_EHF_NO_RZ_IO_READ
,
};
/**
* sn_sal_rev_major - get the major SGI SAL revision number
...
...
@@ -670,4 +684,24 @@ ia64_sn_sysctl_iobrick_pci_op(nasid_t n, u64 connection_type,
return
0
;
}
/*
* Tell the prom how the OS wants to handle specific error features.
* It takes an array of 7 u64.
*/
static
inline
u64
ia64_sn_set_error_handling_features
(
const
u64
*
feature_bits
)
{
struct
ia64_sal_retval
rv
=
{
0
,
0
,
0
,
0
};
SAL_CALL_REENTRANT
(
rv
,
SN_SAL_SET_ERROR_HANDLING_FEATURES
,
feature_bits
[
0
],
feature_bits
[
1
],
feature_bits
[
2
],
feature_bits
[
3
],
feature_bits
[
4
],
feature_bits
[
5
],
feature_bits
[
6
]);
return
rv
.
status
;
}
#endif
/* _ASM_IA64_SN_SN_SAL_H */
include/asm-ia64/system.h
View file @
ac6a5f92
...
...
@@ -171,7 +171,7 @@ do { \
# define local_irq_restore(x) __local_irq_restore(x)
#endif
/* !CONFIG_IA64_DEBUG_IRQ */
#define local_irq_enable() ({ ia64_ssm(IA64_PSR_I); ia64_srlz_d(); })
#define local_irq_enable() ({ ia64_s
top(); ia64_s
sm(IA64_PSR_I); ia64_srlz_d(); })
#define local_save_flags(flags) ({ ia64_stop(); (flags) = ia64_getreg(_IA64_REG_PSR); })
#define irqs_disabled() \
...
...
include/asm-ia64/unistd.h
View file @
ac6a5f92
...
...
@@ -266,6 +266,8 @@
#define NR_syscalls 256
/* length of syscall table */
#define __ARCH_WANT_SYS_RT_SIGACTION
#ifdef CONFIG_IA32_SUPPORT
# define __ARCH_WANT_SYS_FADVISE64
# define __ARCH_WANT_SYS_GETPGRP
...
...
@@ -275,7 +277,6 @@
# define __ARCH_WANT_SYS_OLDUMOUNT
# define __ARCH_WANT_SYS_SIGPENDING
# define __ARCH_WANT_SYS_SIGPROCMASK
# define __ARCH_WANT_SYS_RT_SIGACTION
#endif
#if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment