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
521f6006
Commit
521f6006
authored
Jun 16, 2004
by
David Mosberger
Browse files
Options
Browse Files
Download
Plain Diff
Merge tiger.hpl.hp.com:/data1/bk/vanilla/linux-2.5
into tiger.hpl.hp.com:/data1/bk/lia64/to-linus-2.5
parents
adf791bd
83454d6b
Changes
24
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
775 additions
and
124 deletions
+775
-124
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
+526
-4
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/mca.c
arch/ia64/kernel/mca.c
+8
-0
arch/ia64/kernel/palinfo.c
arch/ia64/kernel/palinfo.c
+2
-2
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/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/module.c
arch/ia64/sn/io/sn2/module.c
+7
-7
arch/ia64/sn/kernel/setup.c
arch/ia64/sn/kernel/setup.c
+22
-1
include/asm-ia64/ia32.h
include/asm-ia64/ia32.h
+9
-1
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
No files found.
arch/ia64/Kconfig
View file @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
#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 @
521f6006
...
...
@@ -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,376 @@ 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
;
}
/*
* 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
)
{
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
;
}
/* 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
;
}
/*
* locking version of ia32_set_pp().
* Use mm->mmap_sem to protect partial_page_list.
*/
static
void
ia32_set_pp
(
unsigned
int
start
,
unsigned
int
end
)
{
down_write
(
&
current
->
mm
->
mmap_sem
);
{
__ia32_set_pp
(
start
,
end
);
}
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
;
}
/*
* locking version of ia32_unset_pp().
* Use mm->mmap_sem to protect partial_page_list.
*/
static
int
ia32_unset_pp
(
unsigned
int
start
,
unsigned
int
end
)
{
int
ret
;
down_write
(
&
current
->
mm
->
mmap_sem
);
{
ret
=
__ia32_unset_pp
(
start
,
end
);
}
up_write
(
&
current
->
mm
->
mmap_sem
);
return
ret
;
}
/*
* Compare the range between @start and @end with bitmap in partial page:
* 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
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
;
}
static
void
ia32_do_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_do_drop_pp_list
(
ppl
);
}
/*
* Copy current->thread.ppl to ppl (already initialized).
*/
static
int
ia32_do_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_do_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
)
...
...
@@ -274,7 +646,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 +659,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 +713,19 @@ 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
;
}
out:
if
(
end
<
PAGE_ALIGN
(
start
))
{
ia32_set_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
end
);
}
else
{
if
(
start
>
PAGE_START
(
start
))
{
ia32_set_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
PAGE_ALIGN
(
start
));
}
if
(
end
<
PAGE_ALIGN
(
end
))
{
ia32_set_pp
((
unsigned
int
)
PAGE_START
(
end
),
(
unsigned
int
)
end
);
}
}
return
start
;
}
...
...
@@ -478,11 +863,45 @@ sys32_munmap (unsigned int start, unsigned int len)
#if PAGE_SHIFT <= IA32_PAGE_SHIFT
ret
=
sys_munmap
(
start
,
end
-
start
);
#else
unsigned
int
pstart
,
pend
;
if
(
OFFSET4K
(
start
))
return
-
EINVAL
;
end
=
IA32_PAGE_ALIGN
(
end
);
if
(
start
>=
end
)
return
-
EINVAL
;
start
=
PAGE_ALIGN
(
start
);
end
=
PAGE_START
(
end
);
pstart
=
PAGE_ALIGN
(
start
);
pend
=
PAGE_START
(
end
);
if
(
end
<
PAGE_ALIGN
(
start
))
{
ret
=
ia32_unset_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
end
);
if
(
ret
==
1
)
{
start
=
PAGE_START
(
start
);
end
=
PAGE_ALIGN
(
end
);
}
else
return
ret
;
}
else
{
if
(
offset_in_page
(
start
))
{
ret
=
ia32_unset_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
PAGE_ALIGN
(
start
));
if
(
ret
==
1
)
start
=
PAGE_START
(
start
);
else
if
(
ret
==
0
)
start
=
PAGE_ALIGN
(
start
);
else
return
ret
;
}
if
(
offset_in_page
(
end
))
{
ret
=
ia32_unset_pp
((
unsigned
int
)
PAGE_START
(
end
),
(
unsigned
int
)
end
);
if
(
ret
==
1
)
end
=
PAGE_ALIGN
(
end
);
else
if
(
ret
==
0
)
end
=
PAGE_START
(
end
);
else
return
ret
;
}
}
if
(
start
>=
end
)
return
0
;
...
...
@@ -540,6 +959,51 @@ sys32_mprotect (unsigned int start, unsigned int len, int prot)
down
(
&
ia32_mmap_sem
);
{
if
(
end
<
PAGE_ALIGN
(
start
))
{
/* start and end are in the same IA64 (partial) page */
retval
=
ia32_compare_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
end
);
if
(
retval
<
0
)
{
/* start~end beyond the mapped area */
goto
out
;
}
else
if
(
retval
==
0
)
{
/* start~end fits the mapped area well */
start
=
PAGE_START
(
start
);
end
=
PAGE_ALIGN
(
end
);
}
else
{
/* start~end doesn't cover all mapped area in this IA64 page */
/* So call mprotect_subpage to deal with new prot issue */
goto
subpage
;
}
}
else
{
if
(
offset_in_page
(
start
))
{
retval
=
ia32_compare_pp
((
unsigned
int
)
start
,
(
unsigned
int
)
PAGE_ALIGN
(
start
));
if
(
retval
<
0
)
{
goto
out
;
}
else
if
(
retval
==
0
)
{
start
=
PAGE_START
(
start
);
}
else
{
goto
subpage
;
}
}
if
(
offset_in_page
(
end
))
{
retval
=
ia32_compare_pp
((
unsigned
int
)
PAGE_START
(
end
),
(
unsigned
int
)
end
);
if
(
retval
<
0
)
{
goto
out
;
}
else
if
(
retval
==
0
)
{
end
=
PAGE_ALIGN
(
end
);
}
else
{
goto
subpage
;
}
}
}
subpage:
if
(
offset_in_page
(
start
))
{
/* start address is 4KB aligned but not page aligned. */
retval
=
mprotect_subpage
(
PAGE_START
(
start
),
prot
);
...
...
@@ -567,6 +1031,64 @@ 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 expand successfully */
if
(
new_end
<=
PAGE_ALIGN
(
old_end
))
{
/* old_end and new_end are in the same IA64 page */
ia32_set_pp
(
old_end
,
new_end
);
}
else
{
ia32_set_pp
((
unsigned
int
)
PAGE_START
(
new_end
),
new_end
);
ia32_set_pp
(
old_end
,
(
unsigned
int
)
PAGE_ALIGN
(
old_end
));
}
}
#endif
return
ret
;
}
asmlinkage
long
sys32_pipe
(
int
*
fd
)
{
...
...
arch/ia64/kernel/entry.S
View file @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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/mca.c
View file @
521f6006
...
...
@@ -267,6 +267,8 @@ 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
)
{
...
...
@@ -281,6 +283,8 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
return
IRQ_HANDLED
;
}
#endif
/* CONFIG_ACPI */
static
void
show_min_state
(
pal_min_state_area_t
*
minstate
)
{
...
...
@@ -967,6 +971,8 @@ 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
)
{
...
...
@@ -1003,6 +1009,8 @@ ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
return
IRQ_HANDLED
;
}
#endif
/* CONFIG_ACPI */
/*
* ia64_mca_cpe_poll
*
...
...
arch/ia64/kernel/palinfo.c
View file @
521f6006
...
...
@@ -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/process.c
View file @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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/sn/io/machvec/pci_bus_cvlink.c
View file @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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/module.c
View file @
521f6006
...
...
@@ -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/setup.c
View file @
521f6006
...
...
@@ -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/ia32.h
View file @
521f6006
...
...
@@ -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/pgtable.h
View file @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 @
521f6006
...
...
@@ -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 */
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