diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:38:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:38:30 -0400 |
commit | d67c6f869c0a7f275689855161c93d714197e052 (patch) | |
tree | 17024af84087d216c62144d21a41beb74eca80dc | |
parent | ec31b2124158f60c515ed84bd5e40db1a883c7b6 (diff) | |
parent | 1175cdc670f2d4197b033f823b32435031a6daa8 (diff) |
Merge branch 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.osdl.marist.edu/pub/scm/linux-2.6:
[S390] Update default configuration.
[S390] use generic sys_ptrace
[S390] Remove self ptrace IEEE_IP hack.
[S390] Convert to SPARSEMEM & SPARSEMEM_VMEMMAP
[S390] System z large page support.
[S390] Convert machine feature detection code to C.
[S390] vmemmap: use clear_table to initialise page tables.
[S390] Move stfl to system.h and delete duplicated version.
[S390] uaccess_mvcos: #ifdef config dependent code.
[S390] cpu topology: Fix possible deadlock.
[S390] Add topology_core_siblings to topology.h
[S390] cio: Make isc handling more robust.
[S390] remove -traditional
[S390] Automatically detect added cpus.
[S390] smp: Fix locking order.
[S390] Add missing ifndef/define to include/asm-s390/sysinfo.h.
[S390] Move show_regs to traps.c.
[S390] cio: Use strict_strtoul() for attributes.
46 files changed, 892 insertions, 501 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 8f5f02160ffc..29a7940f284f 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -300,6 +300,14 @@ comment "Kernel preemption" | |||
300 | 300 | ||
301 | source "kernel/Kconfig.preempt" | 301 | source "kernel/Kconfig.preempt" |
302 | 302 | ||
303 | config ARCH_SPARSEMEM_ENABLE | ||
304 | def_bool y | ||
305 | select SPARSEMEM_VMEMMAP_ENABLE | ||
306 | select SPARSEMEM_VMEMMAP | ||
307 | |||
308 | config ARCH_SPARSEMEM_DEFAULT | ||
309 | def_bool y | ||
310 | |||
303 | source "mm/Kconfig" | 311 | source "mm/Kconfig" |
304 | 312 | ||
305 | comment "I/O subsystem configuration" | 313 | comment "I/O subsystem configuration" |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index a72f208e62d0..aa341d0ea1e6 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.25-rc4 | 3 | # Linux kernel version: 2.6.25 |
4 | # Wed Mar 5 11:22:59 2008 | 4 | # Wed Apr 30 11:07:45 2008 |
5 | # | 5 | # |
6 | CONFIG_SCHED_MC=y | 6 | CONFIG_SCHED_MC=y |
7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
@@ -14,10 +14,12 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y | |||
14 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 14 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
15 | CONFIG_GENERIC_HWEIGHT=y | 15 | CONFIG_GENERIC_HWEIGHT=y |
16 | CONFIG_GENERIC_TIME=y | 16 | CONFIG_GENERIC_TIME=y |
17 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
17 | CONFIG_GENERIC_BUG=y | 18 | CONFIG_GENERIC_BUG=y |
18 | CONFIG_NO_IOMEM=y | 19 | CONFIG_NO_IOMEM=y |
19 | CONFIG_NO_DMA=y | 20 | CONFIG_NO_DMA=y |
20 | CONFIG_GENERIC_LOCKBREAK=y | 21 | CONFIG_GENERIC_LOCKBREAK=y |
22 | CONFIG_PGSTE=y | ||
21 | CONFIG_S390=y | 23 | CONFIG_S390=y |
22 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
23 | 25 | ||
@@ -43,6 +45,7 @@ CONFIG_LOG_BUF_SHIFT=17 | |||
43 | CONFIG_CGROUPS=y | 45 | CONFIG_CGROUPS=y |
44 | # CONFIG_CGROUP_DEBUG is not set | 46 | # CONFIG_CGROUP_DEBUG is not set |
45 | CONFIG_CGROUP_NS=y | 47 | CONFIG_CGROUP_NS=y |
48 | # CONFIG_CGROUP_DEVICE is not set | ||
46 | # CONFIG_CPUSETS is not set | 49 | # CONFIG_CPUSETS is not set |
47 | CONFIG_GROUP_SCHED=y | 50 | CONFIG_GROUP_SCHED=y |
48 | CONFIG_FAIR_GROUP_SCHED=y | 51 | CONFIG_FAIR_GROUP_SCHED=y |
@@ -65,6 +68,7 @@ CONFIG_INITRAMFS_SOURCE="" | |||
65 | CONFIG_SYSCTL=y | 68 | CONFIG_SYSCTL=y |
66 | # CONFIG_EMBEDDED is not set | 69 | # CONFIG_EMBEDDED is not set |
67 | CONFIG_SYSCTL_SYSCALL=y | 70 | CONFIG_SYSCTL_SYSCALL=y |
71 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
68 | CONFIG_KALLSYMS=y | 72 | CONFIG_KALLSYMS=y |
69 | # CONFIG_KALLSYMS_ALL is not set | 73 | # CONFIG_KALLSYMS_ALL is not set |
70 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 74 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -92,6 +96,7 @@ CONFIG_KPROBES=y | |||
92 | CONFIG_KRETPROBES=y | 96 | CONFIG_KRETPROBES=y |
93 | CONFIG_HAVE_KPROBES=y | 97 | CONFIG_HAVE_KPROBES=y |
94 | CONFIG_HAVE_KRETPROBES=y | 98 | CONFIG_HAVE_KRETPROBES=y |
99 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
95 | CONFIG_PROC_PAGE_MONITOR=y | 100 | CONFIG_PROC_PAGE_MONITOR=y |
96 | CONFIG_SLABINFO=y | 101 | CONFIG_SLABINFO=y |
97 | CONFIG_RT_MUTEXES=y | 102 | CONFIG_RT_MUTEXES=y |
@@ -121,8 +126,8 @@ CONFIG_DEFAULT_DEADLINE=y | |||
121 | # CONFIG_DEFAULT_CFQ is not set | 126 | # CONFIG_DEFAULT_CFQ is not set |
122 | # CONFIG_DEFAULT_NOOP is not set | 127 | # CONFIG_DEFAULT_NOOP is not set |
123 | CONFIG_DEFAULT_IOSCHED="deadline" | 128 | CONFIG_DEFAULT_IOSCHED="deadline" |
129 | CONFIG_PREEMPT_NOTIFIERS=y | ||
124 | CONFIG_CLASSIC_RCU=y | 130 | CONFIG_CLASSIC_RCU=y |
125 | # CONFIG_PREEMPT_RCU is not set | ||
126 | 131 | ||
127 | # | 132 | # |
128 | # Base setup | 133 | # Base setup |
@@ -131,6 +136,10 @@ CONFIG_CLASSIC_RCU=y | |||
131 | # | 136 | # |
132 | # Processor type and features | 137 | # Processor type and features |
133 | # | 138 | # |
139 | CONFIG_TICK_ONESHOT=y | ||
140 | CONFIG_NO_HZ=y | ||
141 | CONFIG_HIGH_RES_TIMERS=y | ||
142 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
134 | CONFIG_64BIT=y | 143 | CONFIG_64BIT=y |
135 | CONFIG_SMP=y | 144 | CONFIG_SMP=y |
136 | CONFIG_NR_CPUS=32 | 145 | CONFIG_NR_CPUS=32 |
@@ -161,15 +170,20 @@ CONFIG_ARCH_POPULATES_NODE_MAP=y | |||
161 | # CONFIG_PREEMPT_NONE is not set | 170 | # CONFIG_PREEMPT_NONE is not set |
162 | # CONFIG_PREEMPT_VOLUNTARY is not set | 171 | # CONFIG_PREEMPT_VOLUNTARY is not set |
163 | CONFIG_PREEMPT=y | 172 | CONFIG_PREEMPT=y |
164 | # CONFIG_RCU_TRACE is not set | 173 | # CONFIG_PREEMPT_RCU is not set |
174 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
175 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
165 | CONFIG_SELECT_MEMORY_MODEL=y | 176 | CONFIG_SELECT_MEMORY_MODEL=y |
166 | CONFIG_FLATMEM_MANUAL=y | 177 | # CONFIG_FLATMEM_MANUAL is not set |
167 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 178 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
168 | # CONFIG_SPARSEMEM_MANUAL is not set | 179 | CONFIG_SPARSEMEM_MANUAL=y |
169 | CONFIG_FLATMEM=y | 180 | CONFIG_SPARSEMEM=y |
170 | CONFIG_FLAT_NODE_MEM_MAP=y | 181 | CONFIG_HAVE_MEMORY_PRESENT=y |
171 | # CONFIG_SPARSEMEM_STATIC is not set | 182 | # CONFIG_SPARSEMEM_STATIC is not set |
172 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | 183 | CONFIG_SPARSEMEM_EXTREME=y |
184 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | ||
185 | CONFIG_SPARSEMEM_VMEMMAP=y | ||
186 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
173 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 187 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
174 | CONFIG_RESOURCES_64BIT=y | 188 | CONFIG_RESOURCES_64BIT=y |
175 | CONFIG_ZONE_DMA_FLAG=1 | 189 | CONFIG_ZONE_DMA_FLAG=1 |
@@ -205,11 +219,10 @@ CONFIG_HZ_100=y | |||
205 | # CONFIG_HZ_1000 is not set | 219 | # CONFIG_HZ_1000 is not set |
206 | CONFIG_HZ=100 | 220 | CONFIG_HZ=100 |
207 | # CONFIG_SCHED_HRTICK is not set | 221 | # CONFIG_SCHED_HRTICK is not set |
208 | CONFIG_NO_IDLE_HZ=y | ||
209 | CONFIG_NO_IDLE_HZ_INIT=y | ||
210 | CONFIG_S390_HYPFS_FS=y | 222 | CONFIG_S390_HYPFS_FS=y |
211 | CONFIG_KEXEC=y | 223 | CONFIG_KEXEC=y |
212 | # CONFIG_ZFCPDUMP is not set | 224 | # CONFIG_ZFCPDUMP is not set |
225 | CONFIG_S390_GUEST=y | ||
213 | 226 | ||
214 | # | 227 | # |
215 | # Networking | 228 | # Networking |
@@ -272,8 +285,10 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=y | |||
272 | CONFIG_INET6_XFRM_MODE_BEET=y | 285 | CONFIG_INET6_XFRM_MODE_BEET=y |
273 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | 286 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set |
274 | CONFIG_IPV6_SIT=y | 287 | CONFIG_IPV6_SIT=y |
288 | CONFIG_IPV6_NDISC_NODETYPE=y | ||
275 | # CONFIG_IPV6_TUNNEL is not set | 289 | # CONFIG_IPV6_TUNNEL is not set |
276 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | 290 | # CONFIG_IPV6_MULTIPLE_TABLES is not set |
291 | # CONFIG_IPV6_MROUTE is not set | ||
277 | # CONFIG_NETWORK_SECMARK is not set | 292 | # CONFIG_NETWORK_SECMARK is not set |
278 | CONFIG_NETFILTER=y | 293 | CONFIG_NETFILTER=y |
279 | # CONFIG_NETFILTER_DEBUG is not set | 294 | # CONFIG_NETFILTER_DEBUG is not set |
@@ -289,6 +304,7 @@ CONFIG_NF_CONNTRACK=m | |||
289 | # CONFIG_NF_CT_ACCT is not set | 304 | # CONFIG_NF_CT_ACCT is not set |
290 | # CONFIG_NF_CONNTRACK_MARK is not set | 305 | # CONFIG_NF_CONNTRACK_MARK is not set |
291 | # CONFIG_NF_CONNTRACK_EVENTS is not set | 306 | # CONFIG_NF_CONNTRACK_EVENTS is not set |
307 | # CONFIG_NF_CT_PROTO_DCCP is not set | ||
292 | # CONFIG_NF_CT_PROTO_SCTP is not set | 308 | # CONFIG_NF_CT_PROTO_SCTP is not set |
293 | # CONFIG_NF_CT_PROTO_UDPLITE is not set | 309 | # CONFIG_NF_CT_PROTO_UDPLITE is not set |
294 | # CONFIG_NF_CONNTRACK_AMANDA is not set | 310 | # CONFIG_NF_CONNTRACK_AMANDA is not set |
@@ -439,6 +455,7 @@ CONFIG_DASD_ECKD=y | |||
439 | CONFIG_DASD_FBA=y | 455 | CONFIG_DASD_FBA=y |
440 | CONFIG_DASD_DIAG=y | 456 | CONFIG_DASD_DIAG=y |
441 | CONFIG_DASD_EER=y | 457 | CONFIG_DASD_EER=y |
458 | CONFIG_VIRTIO_BLK=m | ||
442 | CONFIG_MISC_DEVICES=y | 459 | CONFIG_MISC_DEVICES=y |
443 | # CONFIG_EEPROM_93CX6 is not set | 460 | # CONFIG_EEPROM_93CX6 is not set |
444 | # CONFIG_ENCLOSURE_SERVICES is not set | 461 | # CONFIG_ENCLOSURE_SERVICES is not set |
@@ -533,7 +550,7 @@ CONFIG_NETDEV_10000=y | |||
533 | # S/390 network device drivers | 550 | # S/390 network device drivers |
534 | # | 551 | # |
535 | CONFIG_LCS=m | 552 | CONFIG_LCS=m |
536 | CONFIG_CTC=m | 553 | CONFIG_CTCM=m |
537 | # CONFIG_NETIUCV is not set | 554 | # CONFIG_NETIUCV is not set |
538 | # CONFIG_SMSGIUCV is not set | 555 | # CONFIG_SMSGIUCV is not set |
539 | # CONFIG_CLAW is not set | 556 | # CONFIG_CLAW is not set |
@@ -547,10 +564,12 @@ CONFIG_CCWGROUP=y | |||
547 | # CONFIG_NETCONSOLE is not set | 564 | # CONFIG_NETCONSOLE is not set |
548 | # CONFIG_NETPOLL is not set | 565 | # CONFIG_NETPOLL is not set |
549 | # CONFIG_NET_POLL_CONTROLLER is not set | 566 | # CONFIG_NET_POLL_CONTROLLER is not set |
567 | CONFIG_VIRTIO_NET=m | ||
550 | 568 | ||
551 | # | 569 | # |
552 | # Character devices | 570 | # Character devices |
553 | # | 571 | # |
572 | CONFIG_DEVKMEM=y | ||
554 | CONFIG_UNIX98_PTYS=y | 573 | CONFIG_UNIX98_PTYS=y |
555 | CONFIG_LEGACY_PTYS=y | 574 | CONFIG_LEGACY_PTYS=y |
556 | CONFIG_LEGACY_PTY_COUNT=256 | 575 | CONFIG_LEGACY_PTY_COUNT=256 |
@@ -600,6 +619,7 @@ CONFIG_S390_VMUR=m | |||
600 | # Sonics Silicon Backplane | 619 | # Sonics Silicon Backplane |
601 | # | 620 | # |
602 | # CONFIG_MEMSTICK is not set | 621 | # CONFIG_MEMSTICK is not set |
622 | # CONFIG_NEW_LEDS is not set | ||
603 | 623 | ||
604 | # | 624 | # |
605 | # File systems | 625 | # File systems |
@@ -652,6 +672,7 @@ CONFIG_PROC_SYSCTL=y | |||
652 | CONFIG_SYSFS=y | 672 | CONFIG_SYSFS=y |
653 | CONFIG_TMPFS=y | 673 | CONFIG_TMPFS=y |
654 | CONFIG_TMPFS_POSIX_ACL=y | 674 | CONFIG_TMPFS_POSIX_ACL=y |
675 | # CONFIG_HUGETLBFS is not set | ||
655 | # CONFIG_HUGETLB_PAGE is not set | 676 | # CONFIG_HUGETLB_PAGE is not set |
656 | CONFIG_CONFIGFS_FS=m | 677 | CONFIG_CONFIGFS_FS=m |
657 | 678 | ||
@@ -678,12 +699,10 @@ CONFIG_NFS_FS=y | |||
678 | CONFIG_NFS_V3=y | 699 | CONFIG_NFS_V3=y |
679 | # CONFIG_NFS_V3_ACL is not set | 700 | # CONFIG_NFS_V3_ACL is not set |
680 | # CONFIG_NFS_V4 is not set | 701 | # CONFIG_NFS_V4 is not set |
681 | # CONFIG_NFS_DIRECTIO is not set | ||
682 | CONFIG_NFSD=y | 702 | CONFIG_NFSD=y |
683 | CONFIG_NFSD_V3=y | 703 | CONFIG_NFSD_V3=y |
684 | # CONFIG_NFSD_V3_ACL is not set | 704 | # CONFIG_NFSD_V3_ACL is not set |
685 | # CONFIG_NFSD_V4 is not set | 705 | # CONFIG_NFSD_V4 is not set |
686 | CONFIG_NFSD_TCP=y | ||
687 | CONFIG_LOCKD=y | 706 | CONFIG_LOCKD=y |
688 | CONFIG_LOCKD_V4=y | 707 | CONFIG_LOCKD_V4=y |
689 | CONFIG_EXPORTFS=y | 708 | CONFIG_EXPORTFS=y |
@@ -731,6 +750,7 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y | |||
731 | # CONFIG_PRINTK_TIME is not set | 750 | # CONFIG_PRINTK_TIME is not set |
732 | CONFIG_ENABLE_WARN_DEPRECATED=y | 751 | CONFIG_ENABLE_WARN_DEPRECATED=y |
733 | CONFIG_ENABLE_MUST_CHECK=y | 752 | CONFIG_ENABLE_MUST_CHECK=y |
753 | CONFIG_FRAME_WARN=2048 | ||
734 | CONFIG_MAGIC_SYSRQ=y | 754 | CONFIG_MAGIC_SYSRQ=y |
735 | # CONFIG_UNUSED_SYMBOLS is not set | 755 | # CONFIG_UNUSED_SYMBOLS is not set |
736 | CONFIG_DEBUG_FS=y | 756 | CONFIG_DEBUG_FS=y |
@@ -754,6 +774,7 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y | |||
754 | CONFIG_DEBUG_BUGVERBOSE=y | 774 | CONFIG_DEBUG_BUGVERBOSE=y |
755 | # CONFIG_DEBUG_INFO is not set | 775 | # CONFIG_DEBUG_INFO is not set |
756 | # CONFIG_DEBUG_VM is not set | 776 | # CONFIG_DEBUG_VM is not set |
777 | # CONFIG_DEBUG_WRITECOUNT is not set | ||
757 | # CONFIG_DEBUG_LIST is not set | 778 | # CONFIG_DEBUG_LIST is not set |
758 | # CONFIG_DEBUG_SG is not set | 779 | # CONFIG_DEBUG_SG is not set |
759 | # CONFIG_FRAME_POINTER is not set | 780 | # CONFIG_FRAME_POINTER is not set |
@@ -775,58 +796,88 @@ CONFIG_SAMPLES=y | |||
775 | # CONFIG_SECURITY is not set | 796 | # CONFIG_SECURITY is not set |
776 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 797 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
777 | CONFIG_CRYPTO=y | 798 | CONFIG_CRYPTO=y |
799 | |||
800 | # | ||
801 | # Crypto core or helper | ||
802 | # | ||
778 | CONFIG_CRYPTO_ALGAPI=y | 803 | CONFIG_CRYPTO_ALGAPI=y |
779 | CONFIG_CRYPTO_AEAD=m | 804 | CONFIG_CRYPTO_AEAD=m |
780 | CONFIG_CRYPTO_BLKCIPHER=y | 805 | CONFIG_CRYPTO_BLKCIPHER=y |
781 | CONFIG_CRYPTO_SEQIV=m | ||
782 | CONFIG_CRYPTO_HASH=m | 806 | CONFIG_CRYPTO_HASH=m |
783 | CONFIG_CRYPTO_MANAGER=y | 807 | CONFIG_CRYPTO_MANAGER=y |
808 | CONFIG_CRYPTO_GF128MUL=m | ||
809 | # CONFIG_CRYPTO_NULL is not set | ||
810 | # CONFIG_CRYPTO_CRYPTD is not set | ||
811 | CONFIG_CRYPTO_AUTHENC=m | ||
812 | # CONFIG_CRYPTO_TEST is not set | ||
813 | |||
814 | # | ||
815 | # Authenticated Encryption with Associated Data | ||
816 | # | ||
817 | CONFIG_CRYPTO_CCM=m | ||
818 | CONFIG_CRYPTO_GCM=m | ||
819 | CONFIG_CRYPTO_SEQIV=m | ||
820 | |||
821 | # | ||
822 | # Block modes | ||
823 | # | ||
824 | CONFIG_CRYPTO_CBC=y | ||
825 | CONFIG_CRYPTO_CTR=m | ||
826 | CONFIG_CRYPTO_CTS=m | ||
827 | CONFIG_CRYPTO_ECB=m | ||
828 | # CONFIG_CRYPTO_LRW is not set | ||
829 | CONFIG_CRYPTO_PCBC=m | ||
830 | # CONFIG_CRYPTO_XTS is not set | ||
831 | |||
832 | # | ||
833 | # Hash modes | ||
834 | # | ||
784 | CONFIG_CRYPTO_HMAC=m | 835 | CONFIG_CRYPTO_HMAC=m |
785 | # CONFIG_CRYPTO_XCBC is not set | 836 | # CONFIG_CRYPTO_XCBC is not set |
786 | # CONFIG_CRYPTO_NULL is not set | 837 | |
838 | # | ||
839 | # Digest | ||
840 | # | ||
841 | # CONFIG_CRYPTO_CRC32C is not set | ||
787 | # CONFIG_CRYPTO_MD4 is not set | 842 | # CONFIG_CRYPTO_MD4 is not set |
788 | CONFIG_CRYPTO_MD5=m | 843 | CONFIG_CRYPTO_MD5=m |
844 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
789 | CONFIG_CRYPTO_SHA1=m | 845 | CONFIG_CRYPTO_SHA1=m |
790 | # CONFIG_CRYPTO_SHA256 is not set | 846 | # CONFIG_CRYPTO_SHA256 is not set |
791 | # CONFIG_CRYPTO_SHA512 is not set | 847 | # CONFIG_CRYPTO_SHA512 is not set |
792 | # CONFIG_CRYPTO_WP512 is not set | ||
793 | # CONFIG_CRYPTO_TGR192 is not set | 848 | # CONFIG_CRYPTO_TGR192 is not set |
794 | CONFIG_CRYPTO_GF128MUL=m | 849 | # CONFIG_CRYPTO_WP512 is not set |
795 | CONFIG_CRYPTO_ECB=m | 850 | |
796 | CONFIG_CRYPTO_CBC=y | 851 | # |
797 | CONFIG_CRYPTO_PCBC=m | 852 | # Ciphers |
798 | # CONFIG_CRYPTO_LRW is not set | 853 | # |
799 | # CONFIG_CRYPTO_XTS is not set | ||
800 | CONFIG_CRYPTO_CTR=m | ||
801 | CONFIG_CRYPTO_GCM=m | ||
802 | CONFIG_CRYPTO_CCM=m | ||
803 | # CONFIG_CRYPTO_CRYPTD is not set | ||
804 | # CONFIG_CRYPTO_DES is not set | ||
805 | CONFIG_CRYPTO_FCRYPT=m | ||
806 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
807 | # CONFIG_CRYPTO_TWOFISH is not set | ||
808 | # CONFIG_CRYPTO_SERPENT is not set | ||
809 | # CONFIG_CRYPTO_AES is not set | 854 | # CONFIG_CRYPTO_AES is not set |
855 | # CONFIG_CRYPTO_ANUBIS is not set | ||
856 | # CONFIG_CRYPTO_ARC4 is not set | ||
857 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
858 | CONFIG_CRYPTO_CAMELLIA=m | ||
810 | # CONFIG_CRYPTO_CAST5 is not set | 859 | # CONFIG_CRYPTO_CAST5 is not set |
811 | # CONFIG_CRYPTO_CAST6 is not set | 860 | # CONFIG_CRYPTO_CAST6 is not set |
812 | # CONFIG_CRYPTO_TEA is not set | 861 | # CONFIG_CRYPTO_DES is not set |
813 | # CONFIG_CRYPTO_ARC4 is not set | 862 | CONFIG_CRYPTO_FCRYPT=m |
814 | # CONFIG_CRYPTO_KHAZAD is not set | 863 | # CONFIG_CRYPTO_KHAZAD is not set |
815 | # CONFIG_CRYPTO_ANUBIS is not set | ||
816 | CONFIG_CRYPTO_SEED=m | ||
817 | CONFIG_CRYPTO_SALSA20=m | 864 | CONFIG_CRYPTO_SALSA20=m |
865 | CONFIG_CRYPTO_SEED=m | ||
866 | # CONFIG_CRYPTO_SERPENT is not set | ||
867 | # CONFIG_CRYPTO_TEA is not set | ||
868 | # CONFIG_CRYPTO_TWOFISH is not set | ||
869 | |||
870 | # | ||
871 | # Compression | ||
872 | # | ||
818 | # CONFIG_CRYPTO_DEFLATE is not set | 873 | # CONFIG_CRYPTO_DEFLATE is not set |
819 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
820 | # CONFIG_CRYPTO_CRC32C is not set | ||
821 | CONFIG_CRYPTO_CAMELLIA=m | ||
822 | # CONFIG_CRYPTO_TEST is not set | ||
823 | CONFIG_CRYPTO_AUTHENC=m | ||
824 | CONFIG_CRYPTO_LZO=m | 874 | CONFIG_CRYPTO_LZO=m |
825 | CONFIG_CRYPTO_HW=y | 875 | CONFIG_CRYPTO_HW=y |
826 | CONFIG_ZCRYPT=m | 876 | CONFIG_ZCRYPT=m |
827 | # CONFIG_ZCRYPT_MONOLITHIC is not set | 877 | # CONFIG_ZCRYPT_MONOLITHIC is not set |
828 | # CONFIG_CRYPTO_SHA1_S390 is not set | 878 | # CONFIG_CRYPTO_SHA1_S390 is not set |
829 | # CONFIG_CRYPTO_SHA256_S390 is not set | 879 | # CONFIG_CRYPTO_SHA256_S390 is not set |
880 | CONFIG_CRYPTO_SHA512_S390=m | ||
830 | # CONFIG_CRYPTO_DES_S390 is not set | 881 | # CONFIG_CRYPTO_DES_S390 is not set |
831 | # CONFIG_CRYPTO_AES_S390 is not set | 882 | # CONFIG_CRYPTO_AES_S390 is not set |
832 | CONFIG_S390_PRNG=m | 883 | CONFIG_S390_PRNG=m |
@@ -835,6 +886,8 @@ CONFIG_S390_PRNG=m | |||
835 | # Library routines | 886 | # Library routines |
836 | # | 887 | # |
837 | CONFIG_BITREVERSE=m | 888 | CONFIG_BITREVERSE=m |
889 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
890 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set | ||
838 | # CONFIG_CRC_CCITT is not set | 891 | # CONFIG_CRC_CCITT is not set |
839 | # CONFIG_CRC16 is not set | 892 | # CONFIG_CRC16 is not set |
840 | # CONFIG_CRC_ITU_T is not set | 893 | # CONFIG_CRC_ITU_T is not set |
@@ -844,3 +897,9 @@ CONFIG_LIBCRC32C=m | |||
844 | CONFIG_LZO_COMPRESS=m | 897 | CONFIG_LZO_COMPRESS=m |
845 | CONFIG_LZO_DECOMPRESS=m | 898 | CONFIG_LZO_DECOMPRESS=m |
846 | CONFIG_PLIST=y | 899 | CONFIG_PLIST=y |
900 | CONFIG_HAVE_KVM=y | ||
901 | CONFIG_VIRTUALIZATION=y | ||
902 | CONFIG_KVM=m | ||
903 | CONFIG_VIRTIO=y | ||
904 | CONFIG_VIRTIO_RING=y | ||
905 | CONFIG_VIRTIO_BALLOON=m | ||
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 77051cd27925..6302f5082588 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -2,8 +2,6 @@ | |||
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | EXTRA_AFLAGS := -traditional | ||
6 | |||
7 | # | 5 | # |
8 | # Passing null pointers is ok for smp code, since we access the lowcore here. | 6 | # Passing null pointers is ok for smp code, since we access the lowcore here. |
9 | # | 7 | # |
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index 68ec4083bf73..d0e09684b9ce 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
@@ -139,15 +139,15 @@ static noinline __init void detect_machine_type(void) | |||
139 | 139 | ||
140 | /* Running under z/VM ? */ | 140 | /* Running under z/VM ? */ |
141 | if (cpuinfo->cpu_id.version == 0xff) | 141 | if (cpuinfo->cpu_id.version == 0xff) |
142 | machine_flags |= 1; | 142 | machine_flags |= MACHINE_FLAG_VM; |
143 | 143 | ||
144 | /* Running on a P/390 ? */ | 144 | /* Running on a P/390 ? */ |
145 | if (cpuinfo->cpu_id.machine == 0x7490) | 145 | if (cpuinfo->cpu_id.machine == 0x7490) |
146 | machine_flags |= 4; | 146 | machine_flags |= MACHINE_FLAG_P390; |
147 | 147 | ||
148 | /* Running under KVM ? */ | 148 | /* Running under KVM ? */ |
149 | if (cpuinfo->cpu_id.version == 0xfe) | 149 | if (cpuinfo->cpu_id.version == 0xfe) |
150 | machine_flags |= 64; | 150 | machine_flags |= MACHINE_FLAG_KVM; |
151 | } | 151 | } |
152 | 152 | ||
153 | #ifdef CONFIG_64BIT | 153 | #ifdef CONFIG_64BIT |
@@ -268,6 +268,118 @@ static noinline __init void setup_lowcore_early(void) | |||
268 | s390_base_pgm_handler_fn = early_pgm_check_handler; | 268 | s390_base_pgm_handler_fn = early_pgm_check_handler; |
269 | } | 269 | } |
270 | 270 | ||
271 | static noinline __init void setup_hpage(void) | ||
272 | { | ||
273 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
274 | unsigned int facilities; | ||
275 | |||
276 | facilities = stfl(); | ||
277 | if (!(facilities & (1UL << 23)) || !(facilities & (1UL << 29))) | ||
278 | return; | ||
279 | machine_flags |= MACHINE_FLAG_HPAGE; | ||
280 | __ctl_set_bit(0, 23); | ||
281 | #endif | ||
282 | } | ||
283 | |||
284 | static __init void detect_mvpg(void) | ||
285 | { | ||
286 | #ifndef CONFIG_64BIT | ||
287 | int rc; | ||
288 | |||
289 | asm volatile( | ||
290 | " la 0,0\n" | ||
291 | " mvpg %2,%2\n" | ||
292 | "0: la %0,0\n" | ||
293 | "1:\n" | ||
294 | EX_TABLE(0b,1b) | ||
295 | : "=d" (rc) : "0" (-EOPNOTSUPP), "a" (0) : "memory", "cc", "0"); | ||
296 | if (!rc) | ||
297 | machine_flags |= MACHINE_FLAG_MVPG; | ||
298 | #endif | ||
299 | } | ||
300 | |||
301 | static __init void detect_ieee(void) | ||
302 | { | ||
303 | #ifndef CONFIG_64BIT | ||
304 | int rc, tmp; | ||
305 | |||
306 | asm volatile( | ||
307 | " efpc %1,0\n" | ||
308 | "0: la %0,0\n" | ||
309 | "1:\n" | ||
310 | EX_TABLE(0b,1b) | ||
311 | : "=d" (rc), "=d" (tmp): "0" (-EOPNOTSUPP) : "cc"); | ||
312 | if (!rc) | ||
313 | machine_flags |= MACHINE_FLAG_IEEE; | ||
314 | #endif | ||
315 | } | ||
316 | |||
317 | static __init void detect_csp(void) | ||
318 | { | ||
319 | #ifndef CONFIG_64BIT | ||
320 | int rc; | ||
321 | |||
322 | asm volatile( | ||
323 | " la 0,0\n" | ||
324 | " la 1,0\n" | ||
325 | " la 2,4\n" | ||
326 | " csp 0,2\n" | ||
327 | "0: la %0,0\n" | ||
328 | "1:\n" | ||
329 | EX_TABLE(0b,1b) | ||
330 | : "=d" (rc) : "0" (-EOPNOTSUPP) : "cc", "0", "1", "2"); | ||
331 | if (!rc) | ||
332 | machine_flags |= MACHINE_FLAG_CSP; | ||
333 | #endif | ||
334 | } | ||
335 | |||
336 | static __init void detect_diag9c(void) | ||
337 | { | ||
338 | unsigned int cpu_address; | ||
339 | int rc; | ||
340 | |||
341 | cpu_address = stap(); | ||
342 | asm volatile( | ||
343 | " diag %2,0,0x9c\n" | ||
344 | "0: la %0,0\n" | ||
345 | "1:\n" | ||
346 | EX_TABLE(0b,1b) | ||
347 | : "=d" (rc) : "0" (-EOPNOTSUPP), "d" (cpu_address) : "cc"); | ||
348 | if (!rc) | ||
349 | machine_flags |= MACHINE_FLAG_DIAG9C; | ||
350 | } | ||
351 | |||
352 | static __init void detect_diag44(void) | ||
353 | { | ||
354 | #ifdef CONFIG_64BIT | ||
355 | int rc; | ||
356 | |||
357 | asm volatile( | ||
358 | " diag 0,0,0x44\n" | ||
359 | "0: la %0,0\n" | ||
360 | "1:\n" | ||
361 | EX_TABLE(0b,1b) | ||
362 | : "=d" (rc) : "0" (-EOPNOTSUPP) : "cc"); | ||
363 | if (!rc) | ||
364 | machine_flags |= MACHINE_FLAG_DIAG44; | ||
365 | #endif | ||
366 | } | ||
367 | |||
368 | static __init void detect_machine_facilities(void) | ||
369 | { | ||
370 | #ifdef CONFIG_64BIT | ||
371 | unsigned int facilities; | ||
372 | |||
373 | facilities = stfl(); | ||
374 | if (facilities & (1 << 28)) | ||
375 | machine_flags |= MACHINE_FLAG_IDTE; | ||
376 | if (facilities & (1 << 23)) | ||
377 | machine_flags |= MACHINE_FLAG_PFMF; | ||
378 | if (facilities & (1 << 4)) | ||
379 | machine_flags |= MACHINE_FLAG_MVCOS; | ||
380 | #endif | ||
381 | } | ||
382 | |||
271 | /* | 383 | /* |
272 | * Save ipl parameters, clear bss memory, initialize storage keys | 384 | * Save ipl parameters, clear bss memory, initialize storage keys |
273 | * and create a kernel NSS at startup if the SAVESYS= parm is defined | 385 | * and create a kernel NSS at startup if the SAVESYS= parm is defined |
@@ -285,6 +397,13 @@ void __init startup_init(void) | |||
285 | create_kernel_nss(); | 397 | create_kernel_nss(); |
286 | sort_main_extable(); | 398 | sort_main_extable(); |
287 | setup_lowcore_early(); | 399 | setup_lowcore_early(); |
400 | detect_mvpg(); | ||
401 | detect_ieee(); | ||
402 | detect_csp(); | ||
403 | detect_diag9c(); | ||
404 | detect_diag44(); | ||
405 | detect_machine_facilities(); | ||
406 | setup_hpage(); | ||
288 | sclp_read_info_early(); | 407 | sclp_read_info_early(); |
289 | sclp_facilities_detect(); | 408 | sclp_facilities_detect(); |
290 | memsize = sclp_memory_detect(); | 409 | memsize = sclp_memory_detect(); |
diff --git a/arch/s390/kernel/head31.S b/arch/s390/kernel/head31.S index dc364c1419af..a816e2de32b9 100644 --- a/arch/s390/kernel/head31.S +++ b/arch/s390/kernel/head31.S | |||
@@ -57,61 +57,6 @@ startup_continue: | |||
57 | # | 57 | # |
58 | l %r14,.Lstartup_init-.LPG1(%r13) | 58 | l %r14,.Lstartup_init-.LPG1(%r13) |
59 | basr %r14,%r14 | 59 | basr %r14,%r14 |
60 | |||
61 | l %r12,.Lmflags-.LPG1(%r13) # get address of machine_flags | ||
62 | # | ||
63 | # find out if we have an IEEE fpu | ||
64 | # | ||
65 | mvc __LC_PGM_NEW_PSW(8),.Lpcfpu-.LPG1(%r13) | ||
66 | efpc %r0,0 # test IEEE extract fpc instruction | ||
67 | oi 3(%r12),2 # set IEEE fpu flag | ||
68 | .Lchkfpu: | ||
69 | |||
70 | # | ||
71 | # find out if we have the CSP instruction | ||
72 | # | ||
73 | mvc __LC_PGM_NEW_PSW(8),.Lpccsp-.LPG1(%r13) | ||
74 | la %r0,0 | ||
75 | lr %r1,%r0 | ||
76 | la %r2,4 | ||
77 | csp %r0,%r2 # Test CSP instruction | ||
78 | oi 3(%r12),8 # set CSP flag | ||
79 | .Lchkcsp: | ||
80 | |||
81 | # | ||
82 | # find out if we have the MVPG instruction | ||
83 | # | ||
84 | mvc __LC_PGM_NEW_PSW(8),.Lpcmvpg-.LPG1(%r13) | ||
85 | sr %r0,%r0 | ||
86 | la %r1,0 | ||
87 | la %r2,0 | ||
88 | mvpg %r1,%r2 # Test CSP instruction | ||
89 | oi 3(%r12),16 # set MVPG flag | ||
90 | .Lchkmvpg: | ||
91 | |||
92 | # | ||
93 | # find out if we have the IDTE instruction | ||
94 | # | ||
95 | mvc __LC_PGM_NEW_PSW(8),.Lpcidte-.LPG1(%r13) | ||
96 | .long 0xb2b10000 # store facility list | ||
97 | tm 0xc8,0x08 # check bit for clearing-by-ASCE | ||
98 | bno .Lchkidte-.LPG1(%r13) | ||
99 | lhi %r1,2094 | ||
100 | lhi %r2,0 | ||
101 | .long 0xb98e2001 | ||
102 | oi 3(%r12),0x80 # set IDTE flag | ||
103 | .Lchkidte: | ||
104 | |||
105 | # | ||
106 | # find out if the diag 0x9c is available | ||
107 | # | ||
108 | mvc __LC_PGM_NEW_PSW(8),.Lpcdiag9c-.LPG1(%r13) | ||
109 | stap __LC_CPUID+4 # store cpu address | ||
110 | lh %r1,__LC_CPUID+4 | ||
111 | diag %r1,0,0x9c # test diag 0x9c | ||
112 | oi 2(%r12),1 # set diag9c flag | ||
113 | .Lchkdiag9c: | ||
114 | |||
115 | lpsw .Lentry-.LPG1(13) # jump to _stext in primary-space, | 60 | lpsw .Lentry-.LPG1(13) # jump to _stext in primary-space, |
116 | # virtual and never return ... | 61 | # virtual and never return ... |
117 | .align 8 | 62 | .align 8 |
@@ -132,13 +77,7 @@ startup_continue: | |||
132 | .long 0 # cr13: home space segment table | 77 | .long 0 # cr13: home space segment table |
133 | .long 0xc0000000 # cr14: machine check handling off | 78 | .long 0xc0000000 # cr14: machine check handling off |
134 | .long 0 # cr15: linkage stack operations | 79 | .long 0 # cr15: linkage stack operations |
135 | .Lpcfpu:.long 0x00080000,0x80000000 + .Lchkfpu | ||
136 | .Lpccsp:.long 0x00080000,0x80000000 + .Lchkcsp | ||
137 | .Lpcmvpg:.long 0x00080000,0x80000000 + .Lchkmvpg | ||
138 | .Lpcidte:.long 0x00080000,0x80000000 + .Lchkidte | ||
139 | .Lpcdiag9c:.long 0x00080000,0x80000000 + .Lchkdiag9c | ||
140 | .Lmchunk:.long memory_chunk | 80 | .Lmchunk:.long memory_chunk |
141 | .Lmflags:.long machine_flags | ||
142 | .Lbss_bgn: .long __bss_start | 81 | .Lbss_bgn: .long __bss_start |
143 | .Lbss_end: .long _end | 82 | .Lbss_end: .long _end |
144 | .Lparmaddr: .long PARMAREA | 83 | .Lparmaddr: .long PARMAREA |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index 79dccd206a6e..1d06961e87b3 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -125,73 +125,11 @@ startup_continue: | |||
125 | # and create a kernel NSS if the SAVESYS= parm is defined | 125 | # and create a kernel NSS if the SAVESYS= parm is defined |
126 | # | 126 | # |
127 | brasl %r14,startup_init | 127 | brasl %r14,startup_init |
128 | # set program check new psw mask | ||
129 | mvc __LC_PGM_NEW_PSW(8),.Lpcmsk-.LPG1(%r13) | ||
130 | larl %r12,machine_flags | ||
131 | # | ||
132 | # find out if we have the MVPG instruction | ||
133 | # | ||
134 | la %r1,0f-.LPG1(%r13) # set program check address | ||
135 | stg %r1,__LC_PGM_NEW_PSW+8 | ||
136 | sgr %r0,%r0 | ||
137 | lghi %r1,0 | ||
138 | lghi %r2,0 | ||
139 | mvpg %r1,%r2 # test MVPG instruction | ||
140 | oi 7(%r12),16 # set MVPG flag | ||
141 | 0: | ||
142 | |||
143 | # | ||
144 | # find out if the diag 0x44 works in 64 bit mode | ||
145 | # | ||
146 | la %r1,0f-.LPG1(%r13) # set program check address | ||
147 | stg %r1,__LC_PGM_NEW_PSW+8 | ||
148 | diag 0,0,0x44 # test diag 0x44 | ||
149 | oi 7(%r12),32 # set diag44 flag | ||
150 | 0: | ||
151 | |||
152 | # | ||
153 | # find out if we have the IDTE instruction | ||
154 | # | ||
155 | la %r1,0f-.LPG1(%r13) # set program check address | ||
156 | stg %r1,__LC_PGM_NEW_PSW+8 | ||
157 | .long 0xb2b10000 # store facility list | ||
158 | tm 0xc8,0x08 # check bit for clearing-by-ASCE | ||
159 | bno 0f-.LPG1(%r13) | ||
160 | lhi %r1,2048 | ||
161 | lhi %r2,0 | ||
162 | .long 0xb98e2001 | ||
163 | oi 7(%r12),0x80 # set IDTE flag | ||
164 | 0: | ||
165 | |||
166 | # | ||
167 | # find out if the diag 0x9c is available | ||
168 | # | ||
169 | la %r1,0f-.LPG1(%r13) # set program check address | ||
170 | stg %r1,__LC_PGM_NEW_PSW+8 | ||
171 | stap __LC_CPUID+4 # store cpu address | ||
172 | lh %r1,__LC_CPUID+4 | ||
173 | diag %r1,0,0x9c # test diag 0x9c | ||
174 | oi 6(%r12),1 # set diag9c flag | ||
175 | 0: | ||
176 | |||
177 | # | ||
178 | # find out if we have the MVCOS instruction | ||
179 | # | ||
180 | la %r1,0f-.LPG1(%r13) # set program check address | ||
181 | stg %r1,__LC_PGM_NEW_PSW+8 | ||
182 | .short 0xc800 # mvcos 0(%r0),0(%r0),%r0 | ||
183 | .short 0x0000 | ||
184 | .short 0x0000 | ||
185 | 0: tm 0x8f,0x13 # special-operation exception? | ||
186 | bno 1f-.LPG1(%r13) # if yes, MVCOS is present | ||
187 | oi 6(%r12),2 # set MVCOS flag | ||
188 | 1: | ||
189 | |||
190 | lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space, | 128 | lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space, |
191 | # virtual and never return ... | 129 | # virtual and never return ... |
192 | .align 16 | 130 | .align 16 |
193 | .Lentry:.quad 0x0000000180000000,_stext | 131 | .Lentry:.quad 0x0000000180000000,_stext |
194 | .Lctl: .quad 0x04b50002 # cr0: various things | 132 | .Lctl: .quad 0x04350002 # cr0: various things |
195 | .quad 0 # cr1: primary space segment table | 133 | .quad 0 # cr1: primary space segment table |
196 | .quad .Lduct # cr2: dispatchable unit control table | 134 | .quad .Lduct # cr2: dispatchable unit control table |
197 | .quad 0 # cr3: instruction authorization | 135 | .quad 0 # cr3: instruction authorization |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index c1aff194141d..7920861109d2 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -180,24 +180,6 @@ void cpu_idle(void) | |||
180 | } | 180 | } |
181 | } | 181 | } |
182 | 182 | ||
183 | void show_regs(struct pt_regs *regs) | ||
184 | { | ||
185 | print_modules(); | ||
186 | printk("CPU: %d %s %s %.*s\n", | ||
187 | task_thread_info(current)->cpu, print_tainted(), | ||
188 | init_utsname()->release, | ||
189 | (int)strcspn(init_utsname()->version, " "), | ||
190 | init_utsname()->version); | ||
191 | printk("Process %s (pid: %d, task: %p, ksp: %p)\n", | ||
192 | current->comm, current->pid, current, | ||
193 | (void *) current->thread.ksp); | ||
194 | show_registers(regs); | ||
195 | /* Show stack backtrace if pt_regs is from kernel mode */ | ||
196 | if (!(regs->psw.mask & PSW_MASK_PSTATE)) | ||
197 | show_trace(NULL, (unsigned long *) regs->gprs[15]); | ||
198 | show_last_breaking_event(regs); | ||
199 | } | ||
200 | |||
201 | extern void kernel_thread_starter(void); | 183 | extern void kernel_thread_starter(void); |
202 | 184 | ||
203 | asm( | 185 | asm( |
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c index 58a064296987..7f4270163744 100644 --- a/arch/s390/kernel/ptrace.c +++ b/arch/s390/kernel/ptrace.c | |||
@@ -607,38 +607,8 @@ do_ptrace_emu31(struct task_struct *child, long request, long addr, long data) | |||
607 | } | 607 | } |
608 | #endif | 608 | #endif |
609 | 609 | ||
610 | #define PT32_IEEE_IP 0x13c | 610 | long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
611 | |||
612 | static int | ||
613 | do_ptrace(struct task_struct *child, long request, long addr, long data) | ||
614 | { | 611 | { |
615 | int ret; | ||
616 | |||
617 | if (request == PTRACE_ATTACH) | ||
618 | return ptrace_attach(child); | ||
619 | |||
620 | /* | ||
621 | * Special cases to get/store the ieee instructions pointer. | ||
622 | */ | ||
623 | if (child == current) { | ||
624 | if (request == PTRACE_PEEKUSR && addr == PT_IEEE_IP) | ||
625 | return peek_user(child, addr, data); | ||
626 | if (request == PTRACE_POKEUSR && addr == PT_IEEE_IP) | ||
627 | return poke_user(child, addr, data); | ||
628 | #ifdef CONFIG_COMPAT | ||
629 | if (request == PTRACE_PEEKUSR && | ||
630 | addr == PT32_IEEE_IP && test_thread_flag(TIF_31BIT)) | ||
631 | return peek_user_emu31(child, addr, data); | ||
632 | if (request == PTRACE_POKEUSR && | ||
633 | addr == PT32_IEEE_IP && test_thread_flag(TIF_31BIT)) | ||
634 | return poke_user_emu31(child, addr, data); | ||
635 | #endif | ||
636 | } | ||
637 | |||
638 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | ||
639 | if (ret < 0) | ||
640 | return ret; | ||
641 | |||
642 | switch (request) { | 612 | switch (request) { |
643 | case PTRACE_SYSCALL: | 613 | case PTRACE_SYSCALL: |
644 | /* continue and stop at next (return from) syscall */ | 614 | /* continue and stop at next (return from) syscall */ |
@@ -693,31 +663,6 @@ do_ptrace(struct task_struct *child, long request, long addr, long data) | |||
693 | return -EIO; | 663 | return -EIO; |
694 | } | 664 | } |
695 | 665 | ||
696 | asmlinkage long | ||
697 | sys_ptrace(long request, long pid, long addr, long data) | ||
698 | { | ||
699 | struct task_struct *child; | ||
700 | int ret; | ||
701 | |||
702 | lock_kernel(); | ||
703 | if (request == PTRACE_TRACEME) { | ||
704 | ret = ptrace_traceme(); | ||
705 | goto out; | ||
706 | } | ||
707 | |||
708 | child = ptrace_get_task_struct(pid); | ||
709 | if (IS_ERR(child)) { | ||
710 | ret = PTR_ERR(child); | ||
711 | goto out; | ||
712 | } | ||
713 | |||
714 | ret = do_ptrace(child, request, addr, data); | ||
715 | put_task_struct(child); | ||
716 | out: | ||
717 | unlock_kernel(); | ||
718 | return ret; | ||
719 | } | ||
720 | |||
721 | asmlinkage void | 666 | asmlinkage void |
722 | syscall_trace(struct pt_regs *regs, int entryexit) | 667 | syscall_trace(struct pt_regs *regs, int entryexit) |
723 | { | 668 | { |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index a9d18aafa5f4..2bc70b6e876a 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -73,7 +73,7 @@ EXPORT_SYMBOL(uaccess); | |||
73 | unsigned int console_mode = 0; | 73 | unsigned int console_mode = 0; |
74 | unsigned int console_devno = -1; | 74 | unsigned int console_devno = -1; |
75 | unsigned int console_irq = -1; | 75 | unsigned int console_irq = -1; |
76 | unsigned long machine_flags = 0; | 76 | unsigned long machine_flags; |
77 | unsigned long elf_hwcap = 0; | 77 | unsigned long elf_hwcap = 0; |
78 | char elf_platform[ELF_PLATFORM_SIZE]; | 78 | char elf_platform[ELF_PLATFORM_SIZE]; |
79 | 79 | ||
@@ -683,15 +683,6 @@ setup_memory(void) | |||
683 | #endif | 683 | #endif |
684 | } | 684 | } |
685 | 685 | ||
686 | static __init unsigned int stfl(void) | ||
687 | { | ||
688 | asm volatile( | ||
689 | " .insn s,0xb2b10000,0(0)\n" /* stfl */ | ||
690 | "0:\n" | ||
691 | EX_TABLE(0b,0b)); | ||
692 | return S390_lowcore.stfl_fac_list; | ||
693 | } | ||
694 | |||
695 | static int __init __stfle(unsigned long long *list, int doublewords) | 686 | static int __init __stfle(unsigned long long *list, int doublewords) |
696 | { | 687 | { |
697 | typedef struct { unsigned long long _[doublewords]; } addrtype; | 688 | typedef struct { unsigned long long _[doublewords]; } addrtype; |
@@ -758,6 +749,9 @@ static void __init setup_hwcaps(void) | |||
758 | elf_hwcap |= 1UL << 6; | 749 | elf_hwcap |= 1UL << 6; |
759 | } | 750 | } |
760 | 751 | ||
752 | if (MACHINE_HAS_HPAGE) | ||
753 | elf_hwcap |= 1UL << 7; | ||
754 | |||
761 | switch (cpuinfo->cpu_id.machine) { | 755 | switch (cpuinfo->cpu_id.machine) { |
762 | case 0x9672: | 756 | case 0x9672: |
763 | #if !defined(CONFIG_64BIT) | 757 | #if !defined(CONFIG_64BIT) |
@@ -881,8 +875,9 @@ void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) | |||
881 | 875 | ||
882 | static int show_cpuinfo(struct seq_file *m, void *v) | 876 | static int show_cpuinfo(struct seq_file *m, void *v) |
883 | { | 877 | { |
884 | static const char *hwcap_str[7] = { | 878 | static const char *hwcap_str[8] = { |
885 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp" | 879 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", |
880 | "edat" | ||
886 | }; | 881 | }; |
887 | struct cpuinfo_S390 *cpuinfo; | 882 | struct cpuinfo_S390 *cpuinfo; |
888 | unsigned long n = (unsigned long) v - 1; | 883 | unsigned long n = (unsigned long) v - 1; |
@@ -897,7 +892,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
897 | num_online_cpus(), loops_per_jiffy/(500000/HZ), | 892 | num_online_cpus(), loops_per_jiffy/(500000/HZ), |
898 | (loops_per_jiffy/(5000/HZ))%100); | 893 | (loops_per_jiffy/(5000/HZ))%100); |
899 | seq_puts(m, "features\t: "); | 894 | seq_puts(m, "features\t: "); |
900 | for (i = 0; i < 7; i++) | 895 | for (i = 0; i < 8; i++) |
901 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) | 896 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) |
902 | seq_printf(m, "%s ", hwcap_str[i]); | 897 | seq_printf(m, "%s ", hwcap_str[i]); |
903 | seq_puts(m, "\n"); | 898 | seq_puts(m, "\n"); |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 0dfa988c1b26..0aeb290060d9 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -505,7 +505,7 @@ out: | |||
505 | return rc; | 505 | return rc; |
506 | } | 506 | } |
507 | 507 | ||
508 | static int smp_rescan_cpus(void) | 508 | static int __smp_rescan_cpus(void) |
509 | { | 509 | { |
510 | cpumask_t avail; | 510 | cpumask_t avail; |
511 | 511 | ||
@@ -570,7 +570,7 @@ out: | |||
570 | kfree(info); | 570 | kfree(info); |
571 | printk(KERN_INFO "CPUs: %d configured, %d standby\n", c_cpus, s_cpus); | 571 | printk(KERN_INFO "CPUs: %d configured, %d standby\n", c_cpus, s_cpus); |
572 | get_online_cpus(); | 572 | get_online_cpus(); |
573 | smp_rescan_cpus(); | 573 | __smp_rescan_cpus(); |
574 | put_online_cpus(); | 574 | put_online_cpus(); |
575 | } | 575 | } |
576 | 576 | ||
@@ -890,8 +890,8 @@ static ssize_t cpu_configure_store(struct sys_device *dev, const char *buf, | |||
890 | if (val != 0 && val != 1) | 890 | if (val != 0 && val != 1) |
891 | return -EINVAL; | 891 | return -EINVAL; |
892 | 892 | ||
893 | mutex_lock(&smp_cpu_state_mutex); | ||
894 | get_online_cpus(); | 893 | get_online_cpus(); |
894 | mutex_lock(&smp_cpu_state_mutex); | ||
895 | rc = -EBUSY; | 895 | rc = -EBUSY; |
896 | if (cpu_online(cpu)) | 896 | if (cpu_online(cpu)) |
897 | goto out; | 897 | goto out; |
@@ -919,8 +919,8 @@ static ssize_t cpu_configure_store(struct sys_device *dev, const char *buf, | |||
919 | break; | 919 | break; |
920 | } | 920 | } |
921 | out: | 921 | out: |
922 | put_online_cpus(); | ||
923 | mutex_unlock(&smp_cpu_state_mutex); | 922 | mutex_unlock(&smp_cpu_state_mutex); |
923 | put_online_cpus(); | ||
924 | return rc ? rc : count; | 924 | return rc ? rc : count; |
925 | } | 925 | } |
926 | static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store); | 926 | static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store); |
@@ -1088,17 +1088,17 @@ out: | |||
1088 | } | 1088 | } |
1089 | 1089 | ||
1090 | #ifdef CONFIG_HOTPLUG_CPU | 1090 | #ifdef CONFIG_HOTPLUG_CPU |
1091 | static ssize_t __ref rescan_store(struct sys_device *dev, | 1091 | |
1092 | const char *buf, size_t count) | 1092 | int smp_rescan_cpus(void) |
1093 | { | 1093 | { |
1094 | cpumask_t newcpus; | 1094 | cpumask_t newcpus; |
1095 | int cpu; | 1095 | int cpu; |
1096 | int rc; | 1096 | int rc; |
1097 | 1097 | ||
1098 | mutex_lock(&smp_cpu_state_mutex); | ||
1099 | get_online_cpus(); | 1098 | get_online_cpus(); |
1099 | mutex_lock(&smp_cpu_state_mutex); | ||
1100 | newcpus = cpu_present_map; | 1100 | newcpus = cpu_present_map; |
1101 | rc = smp_rescan_cpus(); | 1101 | rc = __smp_rescan_cpus(); |
1102 | if (rc) | 1102 | if (rc) |
1103 | goto out; | 1103 | goto out; |
1104 | cpus_andnot(newcpus, cpu_present_map, newcpus); | 1104 | cpus_andnot(newcpus, cpu_present_map, newcpus); |
@@ -1109,10 +1109,19 @@ static ssize_t __ref rescan_store(struct sys_device *dev, | |||
1109 | } | 1109 | } |
1110 | rc = 0; | 1110 | rc = 0; |
1111 | out: | 1111 | out: |
1112 | put_online_cpus(); | ||
1113 | mutex_unlock(&smp_cpu_state_mutex); | 1112 | mutex_unlock(&smp_cpu_state_mutex); |
1113 | put_online_cpus(); | ||
1114 | if (!cpus_empty(newcpus)) | 1114 | if (!cpus_empty(newcpus)) |
1115 | topology_schedule_update(); | 1115 | topology_schedule_update(); |
1116 | return rc; | ||
1117 | } | ||
1118 | |||
1119 | static ssize_t __ref rescan_store(struct sys_device *dev, const char *buf, | ||
1120 | size_t count) | ||
1121 | { | ||
1122 | int rc; | ||
1123 | |||
1124 | rc = smp_rescan_cpus(); | ||
1116 | return rc ? rc : count; | 1125 | return rc ? rc : count; |
1117 | } | 1126 | } |
1118 | static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store); | 1127 | static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store); |
@@ -1139,16 +1148,16 @@ static ssize_t dispatching_store(struct sys_device *dev, const char *buf, | |||
1139 | if (val != 0 && val != 1) | 1148 | if (val != 0 && val != 1) |
1140 | return -EINVAL; | 1149 | return -EINVAL; |
1141 | rc = 0; | 1150 | rc = 0; |
1142 | mutex_lock(&smp_cpu_state_mutex); | ||
1143 | get_online_cpus(); | 1151 | get_online_cpus(); |
1152 | mutex_lock(&smp_cpu_state_mutex); | ||
1144 | if (cpu_management == val) | 1153 | if (cpu_management == val) |
1145 | goto out; | 1154 | goto out; |
1146 | rc = topology_set_cpu_management(val); | 1155 | rc = topology_set_cpu_management(val); |
1147 | if (!rc) | 1156 | if (!rc) |
1148 | cpu_management = val; | 1157 | cpu_management = val; |
1149 | out: | 1158 | out: |
1150 | put_online_cpus(); | ||
1151 | mutex_unlock(&smp_cpu_state_mutex); | 1159 | mutex_unlock(&smp_cpu_state_mutex); |
1160 | put_online_cpus(); | ||
1152 | return rc ? rc : count; | 1161 | return rc ? rc : count; |
1153 | } | 1162 | } |
1154 | static SYSDEV_ATTR(dispatching, 0644, dispatching_show, dispatching_store); | 1163 | static SYSDEV_ATTR(dispatching, 0644, dispatching_show, dispatching_store); |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index 12b39b3d9c38..661a07217057 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/device.h> | 9 | #include <linux/device.h> |
10 | #include <linux/bootmem.h> | 10 | #include <linux/bootmem.h> |
11 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
12 | #include <linux/kthread.h> | ||
12 | #include <linux/workqueue.h> | 13 | #include <linux/workqueue.h> |
13 | #include <linux/cpu.h> | 14 | #include <linux/cpu.h> |
14 | #include <linux/smp.h> | 15 | #include <linux/smp.h> |
@@ -66,6 +67,8 @@ static struct timer_list topology_timer; | |||
66 | static void set_topology_timer(void); | 67 | static void set_topology_timer(void); |
67 | static DECLARE_WORK(topology_work, topology_work_fn); | 68 | static DECLARE_WORK(topology_work, topology_work_fn); |
68 | 69 | ||
70 | cpumask_t cpu_core_map[NR_CPUS]; | ||
71 | |||
69 | cpumask_t cpu_coregroup_map(unsigned int cpu) | 72 | cpumask_t cpu_coregroup_map(unsigned int cpu) |
70 | { | 73 | { |
71 | struct core_info *core = &core_info; | 74 | struct core_info *core = &core_info; |
@@ -199,6 +202,14 @@ int topology_set_cpu_management(int fc) | |||
199 | return rc; | 202 | return rc; |
200 | } | 203 | } |
201 | 204 | ||
205 | static void update_cpu_core_map(void) | ||
206 | { | ||
207 | int cpu; | ||
208 | |||
209 | for_each_present_cpu(cpu) | ||
210 | cpu_core_map[cpu] = cpu_coregroup_map(cpu); | ||
211 | } | ||
212 | |||
202 | void arch_update_cpu_topology(void) | 213 | void arch_update_cpu_topology(void) |
203 | { | 214 | { |
204 | struct tl_info *info = tl_info; | 215 | struct tl_info *info = tl_info; |
@@ -206,20 +217,33 @@ void arch_update_cpu_topology(void) | |||
206 | int cpu; | 217 | int cpu; |
207 | 218 | ||
208 | if (!machine_has_topology) { | 219 | if (!machine_has_topology) { |
220 | update_cpu_core_map(); | ||
209 | topology_update_polarization_simple(); | 221 | topology_update_polarization_simple(); |
210 | return; | 222 | return; |
211 | } | 223 | } |
212 | stsi(info, 15, 1, 2); | 224 | stsi(info, 15, 1, 2); |
213 | tl_to_cores(info); | 225 | tl_to_cores(info); |
226 | update_cpu_core_map(); | ||
214 | for_each_online_cpu(cpu) { | 227 | for_each_online_cpu(cpu) { |
215 | sysdev = get_cpu_sysdev(cpu); | 228 | sysdev = get_cpu_sysdev(cpu); |
216 | kobject_uevent(&sysdev->kobj, KOBJ_CHANGE); | 229 | kobject_uevent(&sysdev->kobj, KOBJ_CHANGE); |
217 | } | 230 | } |
218 | } | 231 | } |
219 | 232 | ||
220 | static void topology_work_fn(struct work_struct *work) | 233 | static int topology_kthread(void *data) |
221 | { | 234 | { |
222 | arch_reinit_sched_domains(); | 235 | arch_reinit_sched_domains(); |
236 | return 0; | ||
237 | } | ||
238 | |||
239 | static void topology_work_fn(struct work_struct *work) | ||
240 | { | ||
241 | /* We can't call arch_reinit_sched_domains() from a multi-threaded | ||
242 | * workqueue context since it may deadlock in case of cpu hotplug. | ||
243 | * So we have to create a kernel thread in order to call | ||
244 | * arch_reinit_sched_domains(). | ||
245 | */ | ||
246 | kthread_run(topology_kthread, NULL, "topology_update"); | ||
223 | } | 247 | } |
224 | 248 | ||
225 | void topology_schedule_update(void) | 249 | void topology_schedule_update(void) |
@@ -251,20 +275,23 @@ static int __init init_topology_update(void) | |||
251 | { | 275 | { |
252 | int rc; | 276 | int rc; |
253 | 277 | ||
278 | rc = 0; | ||
254 | if (!machine_has_topology) { | 279 | if (!machine_has_topology) { |
255 | topology_update_polarization_simple(); | 280 | topology_update_polarization_simple(); |
256 | return 0; | 281 | goto out; |
257 | } | 282 | } |
258 | init_timer_deferrable(&topology_timer); | 283 | init_timer_deferrable(&topology_timer); |
259 | if (machine_has_topology_irq) { | 284 | if (machine_has_topology_irq) { |
260 | rc = register_external_interrupt(0x2005, topology_interrupt); | 285 | rc = register_external_interrupt(0x2005, topology_interrupt); |
261 | if (rc) | 286 | if (rc) |
262 | return rc; | 287 | goto out; |
263 | ctl_set_bit(0, 8); | 288 | ctl_set_bit(0, 8); |
264 | } | 289 | } |
265 | else | 290 | else |
266 | set_topology_timer(); | 291 | set_topology_timer(); |
267 | return 0; | 292 | out: |
293 | update_cpu_core_map(); | ||
294 | return rc; | ||
268 | } | 295 | } |
269 | __initcall(init_topology_update); | 296 | __initcall(init_topology_update); |
270 | 297 | ||
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 57b607b61100..4584d81984c0 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -113,7 +113,7 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high) | |||
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | void show_trace(struct task_struct *task, unsigned long *stack) | 116 | static void show_trace(struct task_struct *task, unsigned long *stack) |
117 | { | 117 | { |
118 | register unsigned long __r15 asm ("15"); | 118 | register unsigned long __r15 asm ("15"); |
119 | unsigned long sp; | 119 | unsigned long sp; |
@@ -161,14 +161,14 @@ void show_stack(struct task_struct *task, unsigned long *sp) | |||
161 | show_trace(task, sp); | 161 | show_trace(task, sp); |
162 | } | 162 | } |
163 | 163 | ||
164 | #ifdef CONFIG_64BIT | 164 | static void show_last_breaking_event(struct pt_regs *regs) |
165 | void show_last_breaking_event(struct pt_regs *regs) | ||
166 | { | 165 | { |
166 | #ifdef CONFIG_64BIT | ||
167 | printk("Last Breaking-Event-Address:\n"); | 167 | printk("Last Breaking-Event-Address:\n"); |
168 | printk(" [<%016lx>] ", regs->args[0] & PSW_ADDR_INSN); | 168 | printk(" [<%016lx>] ", regs->args[0] & PSW_ADDR_INSN); |
169 | print_symbol("%s\n", regs->args[0] & PSW_ADDR_INSN); | 169 | print_symbol("%s\n", regs->args[0] & PSW_ADDR_INSN); |
170 | } | ||
171 | #endif | 170 | #endif |
171 | } | ||
172 | 172 | ||
173 | /* | 173 | /* |
174 | * The architecture-independent dump_stack generator | 174 | * The architecture-independent dump_stack generator |
@@ -223,6 +223,24 @@ void show_registers(struct pt_regs *regs) | |||
223 | show_code(regs); | 223 | show_code(regs); |
224 | } | 224 | } |
225 | 225 | ||
226 | void show_regs(struct pt_regs *regs) | ||
227 | { | ||
228 | print_modules(); | ||
229 | printk("CPU: %d %s %s %.*s\n", | ||
230 | task_thread_info(current)->cpu, print_tainted(), | ||
231 | init_utsname()->release, | ||
232 | (int)strcspn(init_utsname()->version, " "), | ||
233 | init_utsname()->version); | ||
234 | printk("Process %s (pid: %d, task: %p, ksp: %p)\n", | ||
235 | current->comm, current->pid, current, | ||
236 | (void *) current->thread.ksp); | ||
237 | show_registers(regs); | ||
238 | /* Show stack backtrace if pt_regs is from kernel mode */ | ||
239 | if (!(regs->psw.mask & PSW_MASK_PSTATE)) | ||
240 | show_trace(NULL, (unsigned long *) regs->gprs[15]); | ||
241 | show_last_breaking_event(regs); | ||
242 | } | ||
243 | |||
226 | /* This is called from fs/proc/array.c */ | 244 | /* This is called from fs/proc/array.c */ |
227 | void task_show_regs(struct seq_file *m, struct task_struct *task) | 245 | void task_show_regs(struct seq_file *m, struct task_struct *task) |
228 | { | 246 | { |
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c index 1465946325c5..c02286c6a931 100644 --- a/arch/s390/kvm/priv.c +++ b/arch/s390/kvm/priv.c | |||
@@ -151,18 +151,9 @@ static int handle_chsc(struct kvm_vcpu *vcpu) | |||
151 | return 0; | 151 | return 0; |
152 | } | 152 | } |
153 | 153 | ||
154 | static unsigned int kvm_stfl(void) | ||
155 | { | ||
156 | asm volatile( | ||
157 | " .insn s,0xb2b10000,0(0)\n" /* stfl */ | ||
158 | "0:\n" | ||
159 | EX_TABLE(0b, 0b)); | ||
160 | return S390_lowcore.stfl_fac_list; | ||
161 | } | ||
162 | |||
163 | static int handle_stfl(struct kvm_vcpu *vcpu) | 154 | static int handle_stfl(struct kvm_vcpu *vcpu) |
164 | { | 155 | { |
165 | unsigned int facility_list = kvm_stfl(); | 156 | unsigned int facility_list = stfl(); |
166 | int rc; | 157 | int rc; |
167 | 158 | ||
168 | vcpu->stat.instruction_stfl++; | 159 | vcpu->stat.instruction_stfl++; |
diff --git a/arch/s390/lib/Makefile b/arch/s390/lib/Makefile index 52084436ab69..ab6735df2d21 100644 --- a/arch/s390/lib/Makefile +++ b/arch/s390/lib/Makefile | |||
@@ -2,8 +2,6 @@ | |||
2 | # Makefile for s390-specific library files.. | 2 | # Makefile for s390-specific library files.. |
3 | # | 3 | # |
4 | 4 | ||
5 | EXTRA_AFLAGS := -traditional | ||
6 | |||
7 | lib-y += delay.o string.o uaccess_std.o uaccess_pt.o | 5 | lib-y += delay.o string.o uaccess_std.o uaccess_pt.o |
8 | obj-$(CONFIG_32BIT) += div64.o qrnnd.o | 6 | obj-$(CONFIG_32BIT) += div64.o qrnnd.o |
9 | lib-$(CONFIG_64BIT) += uaccess_mvcos.o | 7 | lib-$(CONFIG_64BIT) += uaccess_mvcos.o |
diff --git a/arch/s390/lib/uaccess_mvcos.c b/arch/s390/lib/uaccess_mvcos.c index 6d8772339d76..3f15aaf54855 100644 --- a/arch/s390/lib/uaccess_mvcos.c +++ b/arch/s390/lib/uaccess_mvcos.c | |||
@@ -162,6 +162,7 @@ static size_t clear_user_mvcos(size_t size, void __user *to) | |||
162 | return size; | 162 | return size; |
163 | } | 163 | } |
164 | 164 | ||
165 | #ifdef CONFIG_S390_SWITCH_AMODE | ||
165 | static size_t strnlen_user_mvcos(size_t count, const char __user *src) | 166 | static size_t strnlen_user_mvcos(size_t count, const char __user *src) |
166 | { | 167 | { |
167 | char buf[256]; | 168 | char buf[256]; |
@@ -199,6 +200,7 @@ static size_t strncpy_from_user_mvcos(size_t count, const char __user *src, | |||
199 | } while ((len_str == len) && (done < count)); | 200 | } while ((len_str == len) && (done < count)); |
200 | return done; | 201 | return done; |
201 | } | 202 | } |
203 | #endif /* CONFIG_S390_SWITCH_AMODE */ | ||
202 | 204 | ||
203 | struct uaccess_ops uaccess_mvcos = { | 205 | struct uaccess_ops uaccess_mvcos = { |
204 | .copy_from_user = copy_from_user_mvcos_check, | 206 | .copy_from_user = copy_from_user_mvcos_check, |
diff --git a/arch/s390/math-emu/Makefile b/arch/s390/math-emu/Makefile index 73b3e72efc46..c84890341052 100644 --- a/arch/s390/math-emu/Makefile +++ b/arch/s390/math-emu/Makefile | |||
@@ -5,4 +5,3 @@ | |||
5 | obj-$(CONFIG_MATHEMU) := math.o | 5 | obj-$(CONFIG_MATHEMU) := math.o |
6 | 6 | ||
7 | EXTRA_CFLAGS := -I$(src) -Iinclude/math-emu -w | 7 | EXTRA_CFLAGS := -I$(src) -Iinclude/math-emu -w |
8 | EXTRA_AFLAGS := -traditional | ||
diff --git a/arch/s390/mm/Makefile b/arch/s390/mm/Makefile index 66401930f83e..fb988a48a754 100644 --- a/arch/s390/mm/Makefile +++ b/arch/s390/mm/Makefile | |||
@@ -4,4 +4,4 @@ | |||
4 | 4 | ||
5 | obj-y := init.o fault.o extmem.o mmap.o vmem.o pgtable.o | 5 | obj-y := init.o fault.o extmem.o mmap.o vmem.o pgtable.o |
6 | obj-$(CONFIG_CMM) += cmm.o | 6 | obj-$(CONFIG_CMM) += cmm.o |
7 | 7 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | |
diff --git a/arch/s390/mm/extmem.c b/arch/s390/mm/extmem.c index ed2af0a3303b..f231f5ec74b6 100644 --- a/arch/s390/mm/extmem.c +++ b/arch/s390/mm/extmem.c | |||
@@ -287,7 +287,7 @@ __segment_load (char *name, int do_nonshared, unsigned long *addr, unsigned long | |||
287 | if (rc < 0) | 287 | if (rc < 0) |
288 | goto out_free; | 288 | goto out_free; |
289 | 289 | ||
290 | rc = add_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1); | 290 | rc = vmem_add_mapping(seg->start_addr, seg->end - seg->start_addr + 1); |
291 | 291 | ||
292 | if (rc) | 292 | if (rc) |
293 | goto out_free; | 293 | goto out_free; |
@@ -351,7 +351,7 @@ __segment_load (char *name, int do_nonshared, unsigned long *addr, unsigned long | |||
351 | release_resource(seg->res); | 351 | release_resource(seg->res); |
352 | kfree(seg->res); | 352 | kfree(seg->res); |
353 | out_shared: | 353 | out_shared: |
354 | remove_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1); | 354 | vmem_remove_mapping(seg->start_addr, seg->end - seg->start_addr + 1); |
355 | out_free: | 355 | out_free: |
356 | kfree(seg); | 356 | kfree(seg); |
357 | out: | 357 | out: |
@@ -474,7 +474,7 @@ segment_modify_shared (char *name, int do_nonshared) | |||
474 | rc = 0; | 474 | rc = 0; |
475 | goto out_unlock; | 475 | goto out_unlock; |
476 | out_del: | 476 | out_del: |
477 | remove_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1); | 477 | vmem_remove_mapping(seg->start_addr, seg->end - seg->start_addr + 1); |
478 | list_del(&seg->list); | 478 | list_del(&seg->list); |
479 | dcss_diag(DCSS_PURGESEG, seg->dcss_name, &dummy, &dummy); | 479 | dcss_diag(DCSS_PURGESEG, seg->dcss_name, &dummy, &dummy); |
480 | kfree(seg); | 480 | kfree(seg); |
@@ -508,7 +508,7 @@ segment_unload(char *name) | |||
508 | goto out_unlock; | 508 | goto out_unlock; |
509 | release_resource(seg->res); | 509 | release_resource(seg->res); |
510 | kfree(seg->res); | 510 | kfree(seg->res); |
511 | remove_shared_memory(seg->start_addr, seg->end - seg->start_addr + 1); | 511 | vmem_remove_mapping(seg->start_addr, seg->end - seg->start_addr + 1); |
512 | list_del(&seg->list); | 512 | list_del(&seg->list); |
513 | dcss_diag(DCSS_PURGESEG, seg->dcss_name, &dummy, &dummy); | 513 | dcss_diag(DCSS_PURGESEG, seg->dcss_name, &dummy, &dummy); |
514 | kfree(seg); | 514 | kfree(seg); |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 2650f46001d0..4d537205e83c 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/hardirq.h> | 28 | #include <linux/hardirq.h> |
29 | #include <linux/kprobes.h> | 29 | #include <linux/kprobes.h> |
30 | #include <linux/uaccess.h> | 30 | #include <linux/uaccess.h> |
31 | #include <linux/hugetlb.h> | ||
31 | #include <asm/system.h> | 32 | #include <asm/system.h> |
32 | #include <asm/pgtable.h> | 33 | #include <asm/pgtable.h> |
33 | #include <asm/s390_ext.h> | 34 | #include <asm/s390_ext.h> |
@@ -367,6 +368,8 @@ good_area: | |||
367 | } | 368 | } |
368 | 369 | ||
369 | survive: | 370 | survive: |
371 | if (is_vm_hugetlb_page(vma)) | ||
372 | address &= HPAGE_MASK; | ||
370 | /* | 373 | /* |
371 | * If for any reason at all we couldn't handle the fault, | 374 | * If for any reason at all we couldn't handle the fault, |
372 | * make sure we exit gracefully rather than endlessly redo | 375 | * make sure we exit gracefully rather than endlessly redo |
diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c new file mode 100644 index 000000000000..f4b6124fdb75 --- /dev/null +++ b/arch/s390/mm/hugetlbpage.c | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | * IBM System z Huge TLB Page Support for Kernel. | ||
3 | * | ||
4 | * Copyright 2007 IBM Corp. | ||
5 | * Author(s): Gerald Schaefer <gerald.schaefer@de.ibm.com> | ||
6 | */ | ||
7 | |||
8 | #include <linux/mm.h> | ||
9 | #include <linux/hugetlb.h> | ||
10 | |||
11 | |||
12 | void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, | ||
13 | pte_t *pteptr, pte_t pteval) | ||
14 | { | ||
15 | pmd_t *pmdp = (pmd_t *) pteptr; | ||
16 | pte_t shadow_pteval = pteval; | ||
17 | unsigned long mask; | ||
18 | |||
19 | if (!MACHINE_HAS_HPAGE) { | ||
20 | pteptr = (pte_t *) pte_page(pteval)[1].index; | ||
21 | mask = pte_val(pteval) & | ||
22 | (_SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO); | ||
23 | pte_val(pteval) = (_SEGMENT_ENTRY + __pa(pteptr)) | mask; | ||
24 | if (mm->context.noexec) { | ||
25 | pteptr += PTRS_PER_PTE; | ||
26 | pte_val(shadow_pteval) = | ||
27 | (_SEGMENT_ENTRY + __pa(pteptr)) | mask; | ||
28 | } | ||
29 | } | ||
30 | |||
31 | pmd_val(*pmdp) = pte_val(pteval); | ||
32 | if (mm->context.noexec) { | ||
33 | pmdp = get_shadow_table(pmdp); | ||
34 | pmd_val(*pmdp) = pte_val(shadow_pteval); | ||
35 | } | ||
36 | } | ||
37 | |||
38 | int arch_prepare_hugepage(struct page *page) | ||
39 | { | ||
40 | unsigned long addr = page_to_phys(page); | ||
41 | pte_t pte; | ||
42 | pte_t *ptep; | ||
43 | int i; | ||
44 | |||
45 | if (MACHINE_HAS_HPAGE) | ||
46 | return 0; | ||
47 | |||
48 | ptep = (pte_t *) pte_alloc_one(&init_mm, address); | ||
49 | if (!ptep) | ||
50 | return -ENOMEM; | ||
51 | |||
52 | pte = mk_pte(page, PAGE_RW); | ||
53 | for (i = 0; i < PTRS_PER_PTE; i++) { | ||
54 | set_pte_at(&init_mm, addr + i * PAGE_SIZE, ptep + i, pte); | ||
55 | pte_val(pte) += PAGE_SIZE; | ||
56 | } | ||
57 | page[1].index = (unsigned long) ptep; | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | void arch_release_hugepage(struct page *page) | ||
62 | { | ||
63 | pte_t *ptep; | ||
64 | |||
65 | if (MACHINE_HAS_HPAGE) | ||
66 | return; | ||
67 | |||
68 | ptep = (pte_t *) page[1].index; | ||
69 | if (!ptep) | ||
70 | return; | ||
71 | pte_free(&init_mm, ptep); | ||
72 | page[1].index = 0; | ||
73 | } | ||
74 | |||
75 | pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) | ||
76 | { | ||
77 | pgd_t *pgdp; | ||
78 | pud_t *pudp; | ||
79 | pmd_t *pmdp = NULL; | ||
80 | |||
81 | pgdp = pgd_offset(mm, addr); | ||
82 | pudp = pud_alloc(mm, pgdp, addr); | ||
83 | if (pudp) | ||
84 | pmdp = pmd_alloc(mm, pudp, addr); | ||
85 | return (pte_t *) pmdp; | ||
86 | } | ||
87 | |||
88 | pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) | ||
89 | { | ||
90 | pgd_t *pgdp; | ||
91 | pud_t *pudp; | ||
92 | pmd_t *pmdp = NULL; | ||
93 | |||
94 | pgdp = pgd_offset(mm, addr); | ||
95 | if (pgd_present(*pgdp)) { | ||
96 | pudp = pud_offset(pgdp, addr); | ||
97 | if (pud_present(*pudp)) | ||
98 | pmdp = pmd_offset(pudp, addr); | ||
99 | } | ||
100 | return (pte_t *) pmdp; | ||
101 | } | ||
102 | |||
103 | int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep) | ||
104 | { | ||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address, | ||
109 | int write) | ||
110 | { | ||
111 | return ERR_PTR(-EINVAL); | ||
112 | } | ||
113 | |||
114 | int pmd_huge(pmd_t pmd) | ||
115 | { | ||
116 | if (!MACHINE_HAS_HPAGE) | ||
117 | return 0; | ||
118 | |||
119 | return !!(pmd_val(pmd) & _SEGMENT_ENTRY_LARGE); | ||
120 | } | ||
121 | |||
122 | struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, | ||
123 | pmd_t *pmdp, int write) | ||
124 | { | ||
125 | struct page *page; | ||
126 | |||
127 | if (!MACHINE_HAS_HPAGE) | ||
128 | return NULL; | ||
129 | |||
130 | page = pmd_page(*pmdp); | ||
131 | if (page) | ||
132 | page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT); | ||
133 | return page; | ||
134 | } | ||
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 202c952a29b4..fa31de6ae97a 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -77,28 +77,6 @@ void show_mem(void) | |||
77 | printk("%lu pages pagetables\n", global_page_state(NR_PAGETABLE)); | 77 | printk("%lu pages pagetables\n", global_page_state(NR_PAGETABLE)); |
78 | } | 78 | } |
79 | 79 | ||
80 | static void __init setup_ro_region(void) | ||
81 | { | ||
82 | pgd_t *pgd; | ||
83 | pud_t *pud; | ||
84 | pmd_t *pmd; | ||
85 | pte_t *pte; | ||
86 | pte_t new_pte; | ||
87 | unsigned long address, end; | ||
88 | |||
89 | address = ((unsigned long)&_stext) & PAGE_MASK; | ||
90 | end = PFN_ALIGN((unsigned long)&_eshared); | ||
91 | |||
92 | for (; address < end; address += PAGE_SIZE) { | ||
93 | pgd = pgd_offset_k(address); | ||
94 | pud = pud_offset(pgd, address); | ||
95 | pmd = pmd_offset(pud, address); | ||
96 | pte = pte_offset_kernel(pmd, address); | ||
97 | new_pte = mk_pte_phys(address, __pgprot(_PAGE_RO)); | ||
98 | *pte = new_pte; | ||
99 | } | ||
100 | } | ||
101 | |||
102 | /* | 80 | /* |
103 | * paging_init() sets up the page tables | 81 | * paging_init() sets up the page tables |
104 | */ | 82 | */ |
@@ -121,7 +99,6 @@ void __init paging_init(void) | |||
121 | clear_table((unsigned long *) init_mm.pgd, pgd_type, | 99 | clear_table((unsigned long *) init_mm.pgd, pgd_type, |
122 | sizeof(unsigned long)*2048); | 100 | sizeof(unsigned long)*2048); |
123 | vmem_map_init(); | 101 | vmem_map_init(); |
124 | setup_ro_region(); | ||
125 | 102 | ||
126 | /* enable virtual mapping in kernel mode */ | 103 | /* enable virtual mapping in kernel mode */ |
127 | __ctl_load(S390_lowcore.kernel_asce, 1, 1); | 104 | __ctl_load(S390_lowcore.kernel_asce, 1, 1); |
@@ -129,6 +106,8 @@ void __init paging_init(void) | |||
129 | __ctl_load(S390_lowcore.kernel_asce, 13, 13); | 106 | __ctl_load(S390_lowcore.kernel_asce, 13, 13); |
130 | __raw_local_irq_ssm(ssm_mask); | 107 | __raw_local_irq_ssm(ssm_mask); |
131 | 108 | ||
109 | sparse_memory_present_with_active_regions(MAX_NUMNODES); | ||
110 | sparse_init(); | ||
132 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 111 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); |
133 | #ifdef CONFIG_ZONE_DMA | 112 | #ifdef CONFIG_ZONE_DMA |
134 | max_zone_pfns[ZONE_DMA] = PFN_DOWN(MAX_DMA_ADDRESS); | 113 | max_zone_pfns[ZONE_DMA] = PFN_DOWN(MAX_DMA_ADDRESS); |
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index 35d90a4720fd..beccacf907f3 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c | |||
@@ -10,10 +10,12 @@ | |||
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/list.h> | 12 | #include <linux/list.h> |
13 | #include <linux/hugetlb.h> | ||
13 | #include <asm/pgalloc.h> | 14 | #include <asm/pgalloc.h> |
14 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
15 | #include <asm/setup.h> | 16 | #include <asm/setup.h> |
16 | #include <asm/tlbflush.h> | 17 | #include <asm/tlbflush.h> |
18 | #include <asm/sections.h> | ||
17 | 19 | ||
18 | static DEFINE_MUTEX(vmem_mutex); | 20 | static DEFINE_MUTEX(vmem_mutex); |
19 | 21 | ||
@@ -25,43 +27,6 @@ struct memory_segment { | |||
25 | 27 | ||
26 | static LIST_HEAD(mem_segs); | 28 | static LIST_HEAD(mem_segs); |
27 | 29 | ||
28 | void __meminit memmap_init(unsigned long size, int nid, unsigned long zone, | ||
29 | unsigned long start_pfn) | ||
30 | { | ||
31 | struct page *start, *end; | ||
32 | struct page *map_start, *map_end; | ||
33 | int i; | ||
34 | |||
35 | start = pfn_to_page(start_pfn); | ||
36 | end = start + size; | ||
37 | |||
38 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { | ||
39 | unsigned long cstart, cend; | ||
40 | |||
41 | cstart = PFN_DOWN(memory_chunk[i].addr); | ||
42 | cend = cstart + PFN_DOWN(memory_chunk[i].size); | ||
43 | |||
44 | map_start = mem_map + cstart; | ||
45 | map_end = mem_map + cend; | ||
46 | |||
47 | if (map_start < start) | ||
48 | map_start = start; | ||
49 | if (map_end > end) | ||
50 | map_end = end; | ||
51 | |||
52 | map_start -= ((unsigned long) map_start & (PAGE_SIZE - 1)) | ||
53 | / sizeof(struct page); | ||
54 | map_end += ((PFN_ALIGN((unsigned long) map_end) | ||
55 | - (unsigned long) map_end) | ||
56 | / sizeof(struct page)); | ||
57 | |||
58 | if (map_start < map_end) | ||
59 | memmap_init_zone((unsigned long)(map_end - map_start), | ||
60 | nid, zone, page_to_pfn(map_start), | ||
61 | MEMMAP_EARLY); | ||
62 | } | ||
63 | } | ||
64 | |||
65 | static void __ref *vmem_alloc_pages(unsigned int order) | 30 | static void __ref *vmem_alloc_pages(unsigned int order) |
66 | { | 31 | { |
67 | if (slab_is_available()) | 32 | if (slab_is_available()) |
@@ -77,8 +42,7 @@ static inline pud_t *vmem_pud_alloc(void) | |||
77 | pud = vmem_alloc_pages(2); | 42 | pud = vmem_alloc_pages(2); |
78 | if (!pud) | 43 | if (!pud) |
79 | return NULL; | 44 | return NULL; |
80 | pud_val(*pud) = _REGION3_ENTRY_EMPTY; | 45 | clear_table((unsigned long *) pud, _REGION3_ENTRY_EMPTY, PAGE_SIZE * 4); |
81 | memcpy(pud + 1, pud, (PTRS_PER_PUD - 1)*sizeof(pud_t)); | ||
82 | #endif | 46 | #endif |
83 | return pud; | 47 | return pud; |
84 | } | 48 | } |
@@ -91,7 +55,7 @@ static inline pmd_t *vmem_pmd_alloc(void) | |||
91 | pmd = vmem_alloc_pages(2); | 55 | pmd = vmem_alloc_pages(2); |
92 | if (!pmd) | 56 | if (!pmd) |
93 | return NULL; | 57 | return NULL; |
94 | clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE*4); | 58 | clear_table((unsigned long *) pmd, _SEGMENT_ENTRY_EMPTY, PAGE_SIZE * 4); |
95 | #endif | 59 | #endif |
96 | return pmd; | 60 | return pmd; |
97 | } | 61 | } |
@@ -114,7 +78,7 @@ static pte_t __init_refok *vmem_pte_alloc(void) | |||
114 | /* | 78 | /* |
115 | * Add a physical memory range to the 1:1 mapping. | 79 | * Add a physical memory range to the 1:1 mapping. |
116 | */ | 80 | */ |
117 | static int vmem_add_range(unsigned long start, unsigned long size) | 81 | static int vmem_add_mem(unsigned long start, unsigned long size, int ro) |
118 | { | 82 | { |
119 | unsigned long address; | 83 | unsigned long address; |
120 | pgd_t *pg_dir; | 84 | pgd_t *pg_dir; |
@@ -141,7 +105,19 @@ static int vmem_add_range(unsigned long start, unsigned long size) | |||
141 | pud_populate_kernel(&init_mm, pu_dir, pm_dir); | 105 | pud_populate_kernel(&init_mm, pu_dir, pm_dir); |
142 | } | 106 | } |
143 | 107 | ||
108 | pte = mk_pte_phys(address, __pgprot(ro ? _PAGE_RO : 0)); | ||
144 | pm_dir = pmd_offset(pu_dir, address); | 109 | pm_dir = pmd_offset(pu_dir, address); |
110 | |||
111 | #ifdef __s390x__ | ||
112 | if (MACHINE_HAS_HPAGE && !(address & ~HPAGE_MASK) && | ||
113 | (address + HPAGE_SIZE <= start + size) && | ||
114 | (address >= HPAGE_SIZE)) { | ||
115 | pte_val(pte) |= _SEGMENT_ENTRY_LARGE; | ||
116 | pmd_val(*pm_dir) = pte_val(pte); | ||
117 | address += HPAGE_SIZE - PAGE_SIZE; | ||
118 | continue; | ||
119 | } | ||
120 | #endif | ||
145 | if (pmd_none(*pm_dir)) { | 121 | if (pmd_none(*pm_dir)) { |
146 | pt_dir = vmem_pte_alloc(); | 122 | pt_dir = vmem_pte_alloc(); |
147 | if (!pt_dir) | 123 | if (!pt_dir) |
@@ -150,7 +126,6 @@ static int vmem_add_range(unsigned long start, unsigned long size) | |||
150 | } | 126 | } |
151 | 127 | ||
152 | pt_dir = pte_offset_kernel(pm_dir, address); | 128 | pt_dir = pte_offset_kernel(pm_dir, address); |
153 | pte = pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL); | ||
154 | *pt_dir = pte; | 129 | *pt_dir = pte; |
155 | } | 130 | } |
156 | ret = 0; | 131 | ret = 0; |
@@ -181,6 +156,13 @@ static void vmem_remove_range(unsigned long start, unsigned long size) | |||
181 | pm_dir = pmd_offset(pu_dir, address); | 156 | pm_dir = pmd_offset(pu_dir, address); |
182 | if (pmd_none(*pm_dir)) | 157 | if (pmd_none(*pm_dir)) |
183 | continue; | 158 | continue; |
159 | |||
160 | if (pmd_huge(*pm_dir)) { | ||
161 | pmd_clear_kernel(pm_dir); | ||
162 | address += HPAGE_SIZE - PAGE_SIZE; | ||
163 | continue; | ||
164 | } | ||
165 | |||
184 | pt_dir = pte_offset_kernel(pm_dir, address); | 166 | pt_dir = pte_offset_kernel(pm_dir, address); |
185 | *pt_dir = pte; | 167 | *pt_dir = pte; |
186 | } | 168 | } |
@@ -190,10 +172,9 @@ static void vmem_remove_range(unsigned long start, unsigned long size) | |||
190 | /* | 172 | /* |
191 | * Add a backed mem_map array to the virtual mem_map array. | 173 | * Add a backed mem_map array to the virtual mem_map array. |
192 | */ | 174 | */ |
193 | static int vmem_add_mem_map(unsigned long start, unsigned long size) | 175 | int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node) |
194 | { | 176 | { |
195 | unsigned long address, start_addr, end_addr; | 177 | unsigned long address, start_addr, end_addr; |
196 | struct page *map_start, *map_end; | ||
197 | pgd_t *pg_dir; | 178 | pgd_t *pg_dir; |
198 | pud_t *pu_dir; | 179 | pud_t *pu_dir; |
199 | pmd_t *pm_dir; | 180 | pmd_t *pm_dir; |
@@ -201,11 +182,8 @@ static int vmem_add_mem_map(unsigned long start, unsigned long size) | |||
201 | pte_t pte; | 182 | pte_t pte; |
202 | int ret = -ENOMEM; | 183 | int ret = -ENOMEM; |
203 | 184 | ||
204 | map_start = VMEM_MAP + PFN_DOWN(start); | 185 | start_addr = (unsigned long) start; |
205 | map_end = VMEM_MAP + PFN_DOWN(start + size); | 186 | end_addr = (unsigned long) (start + nr); |
206 | |||
207 | start_addr = (unsigned long) map_start & PAGE_MASK; | ||
208 | end_addr = PFN_ALIGN((unsigned long) map_end); | ||
209 | 187 | ||
210 | for (address = start_addr; address < end_addr; address += PAGE_SIZE) { | 188 | for (address = start_addr; address < end_addr; address += PAGE_SIZE) { |
211 | pg_dir = pgd_offset_k(address); | 189 | pg_dir = pgd_offset_k(address); |
@@ -249,16 +227,6 @@ out: | |||
249 | return ret; | 227 | return ret; |
250 | } | 228 | } |
251 | 229 | ||
252 | static int vmem_add_mem(unsigned long start, unsigned long size) | ||
253 | { | ||
254 | int ret; | ||
255 | |||
256 | ret = vmem_add_mem_map(start, size); | ||
257 | if (ret) | ||
258 | return ret; | ||
259 | return vmem_add_range(start, size); | ||
260 | } | ||
261 | |||
262 | /* | 230 | /* |
263 | * Add memory segment to the segment list if it doesn't overlap with | 231 | * Add memory segment to the segment list if it doesn't overlap with |
264 | * an already present segment. | 232 | * an already present segment. |
@@ -296,7 +264,7 @@ static void __remove_shared_memory(struct memory_segment *seg) | |||
296 | vmem_remove_range(seg->start, seg->size); | 264 | vmem_remove_range(seg->start, seg->size); |
297 | } | 265 | } |
298 | 266 | ||
299 | int remove_shared_memory(unsigned long start, unsigned long size) | 267 | int vmem_remove_mapping(unsigned long start, unsigned long size) |
300 | { | 268 | { |
301 | struct memory_segment *seg; | 269 | struct memory_segment *seg; |
302 | int ret; | 270 | int ret; |
@@ -320,11 +288,9 @@ out: | |||
320 | return ret; | 288 | return ret; |
321 | } | 289 | } |
322 | 290 | ||
323 | int add_shared_memory(unsigned long start, unsigned long size) | 291 | int vmem_add_mapping(unsigned long start, unsigned long size) |
324 | { | 292 | { |
325 | struct memory_segment *seg; | 293 | struct memory_segment *seg; |
326 | struct page *page; | ||
327 | unsigned long pfn, num_pfn, end_pfn; | ||
328 | int ret; | 294 | int ret; |
329 | 295 | ||
330 | mutex_lock(&vmem_mutex); | 296 | mutex_lock(&vmem_mutex); |
@@ -339,24 +305,9 @@ int add_shared_memory(unsigned long start, unsigned long size) | |||
339 | if (ret) | 305 | if (ret) |
340 | goto out_free; | 306 | goto out_free; |
341 | 307 | ||
342 | ret = vmem_add_mem(start, size); | 308 | ret = vmem_add_mem(start, size, 0); |
343 | if (ret) | 309 | if (ret) |
344 | goto out_remove; | 310 | goto out_remove; |
345 | |||
346 | pfn = PFN_DOWN(start); | ||
347 | num_pfn = PFN_DOWN(size); | ||
348 | end_pfn = pfn + num_pfn; | ||
349 | |||
350 | page = pfn_to_page(pfn); | ||
351 | memset(page, 0, num_pfn * sizeof(struct page)); | ||
352 | |||
353 | for (; pfn < end_pfn; pfn++) { | ||
354 | page = pfn_to_page(pfn); | ||
355 | init_page_count(page); | ||
356 | reset_page_mapcount(page); | ||
357 | SetPageReserved(page); | ||
358 | INIT_LIST_HEAD(&page->lru); | ||
359 | } | ||
360 | goto out; | 311 | goto out; |
361 | 312 | ||
362 | out_remove: | 313 | out_remove: |
@@ -375,14 +326,34 @@ out: | |||
375 | */ | 326 | */ |
376 | void __init vmem_map_init(void) | 327 | void __init vmem_map_init(void) |
377 | { | 328 | { |
329 | unsigned long ro_start, ro_end; | ||
330 | unsigned long start, end; | ||
378 | int i; | 331 | int i; |
379 | 332 | ||
380 | INIT_LIST_HEAD(&init_mm.context.crst_list); | 333 | INIT_LIST_HEAD(&init_mm.context.crst_list); |
381 | INIT_LIST_HEAD(&init_mm.context.pgtable_list); | 334 | INIT_LIST_HEAD(&init_mm.context.pgtable_list); |
382 | init_mm.context.noexec = 0; | 335 | init_mm.context.noexec = 0; |
383 | NODE_DATA(0)->node_mem_map = VMEM_MAP; | 336 | ro_start = ((unsigned long)&_stext) & PAGE_MASK; |
384 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) | 337 | ro_end = PFN_ALIGN((unsigned long)&_eshared); |
385 | vmem_add_mem(memory_chunk[i].addr, memory_chunk[i].size); | 338 | for (i = 0; i < MEMORY_CHUNKS && memory_chunk[i].size > 0; i++) { |
339 | start = memory_chunk[i].addr; | ||
340 | end = memory_chunk[i].addr + memory_chunk[i].size; | ||
341 | if (start >= ro_end || end <= ro_start) | ||
342 | vmem_add_mem(start, end - start, 0); | ||
343 | else if (start >= ro_start && end <= ro_end) | ||
344 | vmem_add_mem(start, end - start, 1); | ||
345 | else if (start >= ro_start) { | ||
346 | vmem_add_mem(start, ro_end - start, 1); | ||
347 | vmem_add_mem(ro_end, end - ro_end, 0); | ||
348 | } else if (end < ro_end) { | ||
349 | vmem_add_mem(start, ro_start - start, 0); | ||
350 | vmem_add_mem(ro_start, end - ro_start, 1); | ||
351 | } else { | ||
352 | vmem_add_mem(start, ro_start - start, 0); | ||
353 | vmem_add_mem(ro_start, ro_end - ro_start, 1); | ||
354 | vmem_add_mem(ro_end, end - ro_end, 0); | ||
355 | } | ||
356 | } | ||
386 | } | 357 | } |
387 | 358 | ||
388 | /* | 359 | /* |
diff --git a/drivers/s390/char/sclp_config.c b/drivers/s390/char/sclp_config.c index b8f35bc52b7b..9e784d5f7f57 100644 --- a/drivers/s390/char/sclp_config.c +++ b/drivers/s390/char/sclp_config.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/cpu.h> | 10 | #include <linux/cpu.h> |
11 | #include <linux/sysdev.h> | 11 | #include <linux/sysdev.h> |
12 | #include <linux/workqueue.h> | 12 | #include <linux/workqueue.h> |
13 | #include <asm/smp.h> | ||
13 | #include "sclp.h" | 14 | #include "sclp.h" |
14 | 15 | ||
15 | #define TAG "sclp_config: " | 16 | #define TAG "sclp_config: " |
@@ -19,9 +20,11 @@ struct conf_mgm_data { | |||
19 | u8 ev_qualifier; | 20 | u8 ev_qualifier; |
20 | } __attribute__((packed)); | 21 | } __attribute__((packed)); |
21 | 22 | ||
23 | #define EV_QUAL_CPU_CHANGE 1 | ||
22 | #define EV_QUAL_CAP_CHANGE 3 | 24 | #define EV_QUAL_CAP_CHANGE 3 |
23 | 25 | ||
24 | static struct work_struct sclp_cpu_capability_work; | 26 | static struct work_struct sclp_cpu_capability_work; |
27 | static struct work_struct sclp_cpu_change_work; | ||
25 | 28 | ||
26 | static void sclp_cpu_capability_notify(struct work_struct *work) | 29 | static void sclp_cpu_capability_notify(struct work_struct *work) |
27 | { | 30 | { |
@@ -37,13 +40,24 @@ static void sclp_cpu_capability_notify(struct work_struct *work) | |||
37 | put_online_cpus(); | 40 | put_online_cpus(); |
38 | } | 41 | } |
39 | 42 | ||
43 | static void sclp_cpu_change_notify(struct work_struct *work) | ||
44 | { | ||
45 | smp_rescan_cpus(); | ||
46 | } | ||
47 | |||
40 | static void sclp_conf_receiver_fn(struct evbuf_header *evbuf) | 48 | static void sclp_conf_receiver_fn(struct evbuf_header *evbuf) |
41 | { | 49 | { |
42 | struct conf_mgm_data *cdata; | 50 | struct conf_mgm_data *cdata; |
43 | 51 | ||
44 | cdata = (struct conf_mgm_data *)(evbuf + 1); | 52 | cdata = (struct conf_mgm_data *)(evbuf + 1); |
45 | if (cdata->ev_qualifier == EV_QUAL_CAP_CHANGE) | 53 | switch (cdata->ev_qualifier) { |
54 | case EV_QUAL_CPU_CHANGE: | ||
55 | schedule_work(&sclp_cpu_change_work); | ||
56 | break; | ||
57 | case EV_QUAL_CAP_CHANGE: | ||
46 | schedule_work(&sclp_cpu_capability_work); | 58 | schedule_work(&sclp_cpu_capability_work); |
59 | break; | ||
60 | } | ||
47 | } | 61 | } |
48 | 62 | ||
49 | static struct sclp_register sclp_conf_register = | 63 | static struct sclp_register sclp_conf_register = |
@@ -57,6 +71,7 @@ static int __init sclp_conf_init(void) | |||
57 | int rc; | 71 | int rc; |
58 | 72 | ||
59 | INIT_WORK(&sclp_cpu_capability_work, sclp_cpu_capability_notify); | 73 | INIT_WORK(&sclp_cpu_capability_work, sclp_cpu_capability_notify); |
74 | INIT_WORK(&sclp_cpu_change_work, sclp_cpu_change_notify); | ||
60 | 75 | ||
61 | rc = sclp_register(&sclp_conf_register); | 76 | rc = sclp_register(&sclp_conf_register); |
62 | if (rc) { | 77 | if (rc) { |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index fe1ad1722158..85b2e51a42ae 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -318,7 +318,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
318 | { | 318 | { |
319 | struct ccwgroup_device *gdev; | 319 | struct ccwgroup_device *gdev; |
320 | struct ccwgroup_driver *gdrv; | 320 | struct ccwgroup_driver *gdrv; |
321 | unsigned int value; | 321 | unsigned long value; |
322 | int ret; | 322 | int ret; |
323 | 323 | ||
324 | gdev = to_ccwgroupdev(dev); | 324 | gdev = to_ccwgroupdev(dev); |
@@ -329,7 +329,9 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
329 | if (!try_module_get(gdrv->owner)) | 329 | if (!try_module_get(gdrv->owner)) |
330 | return -EINVAL; | 330 | return -EINVAL; |
331 | 331 | ||
332 | value = simple_strtoul(buf, NULL, 0); | 332 | ret = strict_strtoul(buf, 0, &value); |
333 | if (ret) | ||
334 | goto out; | ||
333 | ret = count; | 335 | ret = count; |
334 | if (value == 1) | 336 | if (value == 1) |
335 | ccwgroup_set_online(gdev); | 337 | ccwgroup_set_online(gdev); |
@@ -337,6 +339,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const | |||
337 | ccwgroup_set_offline(gdev); | 339 | ccwgroup_set_offline(gdev); |
338 | else | 340 | else |
339 | ret = -EINVAL; | 341 | ret = -EINVAL; |
342 | out: | ||
340 | module_put(gdrv->owner); | 343 | module_put(gdrv->owner); |
341 | return ret; | 344 | return ret; |
342 | } | 345 | } |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 23ffcc4768a7..08a578161306 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -407,8 +407,7 @@ cio_modify (struct subchannel *sch) | |||
407 | /* | 407 | /* |
408 | * Enable subchannel. | 408 | * Enable subchannel. |
409 | */ | 409 | */ |
410 | int cio_enable_subchannel(struct subchannel *sch, unsigned int isc, | 410 | int cio_enable_subchannel(struct subchannel *sch, u32 intparm) |
411 | u32 intparm) | ||
412 | { | 411 | { |
413 | char dbf_txt[15]; | 412 | char dbf_txt[15]; |
414 | int ccode; | 413 | int ccode; |
@@ -426,7 +425,7 @@ int cio_enable_subchannel(struct subchannel *sch, unsigned int isc, | |||
426 | 425 | ||
427 | for (retry = 5, ret = 0; retry > 0; retry--) { | 426 | for (retry = 5, ret = 0; retry > 0; retry--) { |
428 | sch->schib.pmcw.ena = 1; | 427 | sch->schib.pmcw.ena = 1; |
429 | sch->schib.pmcw.isc = isc; | 428 | sch->schib.pmcw.isc = sch->isc; |
430 | sch->schib.pmcw.intparm = intparm; | 429 | sch->schib.pmcw.intparm = intparm; |
431 | ret = cio_modify(sch); | 430 | ret = cio_modify(sch); |
432 | if (ret == -ENODEV) | 431 | if (ret == -ENODEV) |
@@ -600,6 +599,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
600 | else | 599 | else |
601 | sch->opm = chp_get_sch_opm(sch); | 600 | sch->opm = chp_get_sch_opm(sch); |
602 | sch->lpm = sch->schib.pmcw.pam & sch->opm; | 601 | sch->lpm = sch->schib.pmcw.pam & sch->opm; |
602 | sch->isc = 3; | ||
603 | 603 | ||
604 | CIO_DEBUG(KERN_INFO, 0, | 604 | CIO_DEBUG(KERN_INFO, 0, |
605 | "Detected device %04x on subchannel 0.%x.%04X" | 605 | "Detected device %04x on subchannel 0.%x.%04X" |
@@ -610,13 +610,11 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
610 | 610 | ||
611 | /* | 611 | /* |
612 | * We now have to initially ... | 612 | * We now have to initially ... |
613 | * ... set "interruption subclass" | ||
614 | * ... enable "concurrent sense" | 613 | * ... enable "concurrent sense" |
615 | * ... enable "multipath mode" if more than one | 614 | * ... enable "multipath mode" if more than one |
616 | * CHPID is available. This is done regardless | 615 | * CHPID is available. This is done regardless |
617 | * whether multiple paths are available for us. | 616 | * whether multiple paths are available for us. |
618 | */ | 617 | */ |
619 | sch->schib.pmcw.isc = 3; /* could be smth. else */ | ||
620 | sch->schib.pmcw.csense = 1; /* concurrent sense */ | 618 | sch->schib.pmcw.csense = 1; /* concurrent sense */ |
621 | sch->schib.pmcw.ena = 0; | 619 | sch->schib.pmcw.ena = 0; |
622 | if ((sch->lpm & (sch->lpm - 1)) != 0) | 620 | if ((sch->lpm & (sch->lpm - 1)) != 0) |
@@ -812,6 +810,7 @@ cio_probe_console(void) | |||
812 | * enable console I/O-interrupt subclass 7 | 810 | * enable console I/O-interrupt subclass 7 |
813 | */ | 811 | */ |
814 | ctl_set_bit(6, 24); | 812 | ctl_set_bit(6, 24); |
813 | console_subchannel.isc = 7; | ||
815 | console_subchannel.schib.pmcw.isc = 7; | 814 | console_subchannel.schib.pmcw.isc = 7; |
816 | console_subchannel.schib.pmcw.intparm = | 815 | console_subchannel.schib.pmcw.intparm = |
817 | (u32)(addr_t)&console_subchannel; | 816 | (u32)(addr_t)&console_subchannel; |
diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h index 08f2235c5a6f..3c75412904dc 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h | |||
@@ -74,6 +74,7 @@ struct subchannel { | |||
74 | __u8 lpm; /* logical path mask */ | 74 | __u8 lpm; /* logical path mask */ |
75 | __u8 opm; /* operational path mask */ | 75 | __u8 opm; /* operational path mask */ |
76 | struct schib schib; /* subchannel information block */ | 76 | struct schib schib; /* subchannel information block */ |
77 | int isc; /* desired interruption subclass */ | ||
77 | struct chsc_ssd_info ssd_info; /* subchannel description */ | 78 | struct chsc_ssd_info ssd_info; /* subchannel description */ |
78 | struct device dev; /* entry in device tree */ | 79 | struct device dev; /* entry in device tree */ |
79 | struct css_driver *driver; | 80 | struct css_driver *driver; |
@@ -85,7 +86,7 @@ struct subchannel { | |||
85 | #define to_subchannel(n) container_of(n, struct subchannel, dev) | 86 | #define to_subchannel(n) container_of(n, struct subchannel, dev) |
86 | 87 | ||
87 | extern int cio_validate_subchannel (struct subchannel *, struct subchannel_id); | 88 | extern int cio_validate_subchannel (struct subchannel *, struct subchannel_id); |
88 | extern int cio_enable_subchannel(struct subchannel *, unsigned int, u32); | 89 | extern int cio_enable_subchannel(struct subchannel *, u32); |
89 | extern int cio_disable_subchannel (struct subchannel *); | 90 | extern int cio_disable_subchannel (struct subchannel *); |
90 | extern int cio_cancel (struct subchannel *); | 91 | extern int cio_cancel (struct subchannel *); |
91 | extern int cio_clear (struct subchannel *); | 92 | extern int cio_clear (struct subchannel *); |
diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index f4c132ab39ed..2808b6833b9e 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c | |||
@@ -1219,16 +1219,21 @@ static ssize_t cmb_enable_store(struct device *dev, | |||
1219 | { | 1219 | { |
1220 | struct ccw_device *cdev; | 1220 | struct ccw_device *cdev; |
1221 | int ret; | 1221 | int ret; |
1222 | unsigned long val; | ||
1223 | |||
1224 | ret = strict_strtoul(buf, 16, &val); | ||
1225 | if (ret) | ||
1226 | return ret; | ||
1222 | 1227 | ||
1223 | cdev = to_ccwdev(dev); | 1228 | cdev = to_ccwdev(dev); |
1224 | 1229 | ||
1225 | switch (buf[0]) { | 1230 | switch (val) { |
1226 | case '0': | 1231 | case 0: |
1227 | ret = disable_cmf(cdev); | 1232 | ret = disable_cmf(cdev); |
1228 | if (ret) | 1233 | if (ret) |
1229 | dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret); | 1234 | dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret); |
1230 | break; | 1235 | break; |
1231 | case '1': | 1236 | case 1: |
1232 | ret = enable_cmf(cdev); | 1237 | ret = enable_cmf(cdev); |
1233 | if (ret && ret != -EBUSY) | 1238 | if (ret && ret != -EBUSY) |
1234 | dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret); | 1239 | dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret); |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index c1afab5f72d6..595e327d2f76 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -705,13 +705,17 @@ css_cm_enable_store(struct device *dev, struct device_attribute *attr, | |||
705 | { | 705 | { |
706 | struct channel_subsystem *css = to_css(dev); | 706 | struct channel_subsystem *css = to_css(dev); |
707 | int ret; | 707 | int ret; |
708 | unsigned long val; | ||
708 | 709 | ||
710 | ret = strict_strtoul(buf, 16, &val); | ||
711 | if (ret) | ||
712 | return ret; | ||
709 | mutex_lock(&css->mutex); | 713 | mutex_lock(&css->mutex); |
710 | switch (buf[0]) { | 714 | switch (val) { |
711 | case '0': | 715 | case 0: |
712 | ret = css->cm_enabled ? chsc_secm(css, 0) : 0; | 716 | ret = css->cm_enabled ? chsc_secm(css, 0) : 0; |
713 | break; | 717 | break; |
714 | case '1': | 718 | case 1: |
715 | ret = css->cm_enabled ? 0 : chsc_secm(css, 1); | 719 | ret = css->cm_enabled ? 0 : chsc_secm(css, 1); |
716 | break; | 720 | break; |
717 | default: | 721 | default: |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index e0c7adb8958e..abfd601d237a 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -512,8 +512,8 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr, | |||
512 | const char *buf, size_t count) | 512 | const char *buf, size_t count) |
513 | { | 513 | { |
514 | struct ccw_device *cdev = to_ccwdev(dev); | 514 | struct ccw_device *cdev = to_ccwdev(dev); |
515 | int i, force; | 515 | int force, ret; |
516 | char *tmp; | 516 | unsigned long i; |
517 | 517 | ||
518 | if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) | 518 | if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) |
519 | return -EAGAIN; | 519 | return -EAGAIN; |
@@ -525,25 +525,30 @@ static ssize_t online_store (struct device *dev, struct device_attribute *attr, | |||
525 | if (!strncmp(buf, "force\n", count)) { | 525 | if (!strncmp(buf, "force\n", count)) { |
526 | force = 1; | 526 | force = 1; |
527 | i = 1; | 527 | i = 1; |
528 | ret = 0; | ||
528 | } else { | 529 | } else { |
529 | force = 0; | 530 | force = 0; |
530 | i = simple_strtoul(buf, &tmp, 16); | 531 | ret = strict_strtoul(buf, 16, &i); |
531 | } | 532 | } |
532 | 533 | if (ret) | |
534 | goto out; | ||
533 | switch (i) { | 535 | switch (i) { |
534 | case 0: | 536 | case 0: |
535 | online_store_handle_offline(cdev); | 537 | online_store_handle_offline(cdev); |
538 | ret = count; | ||
536 | break; | 539 | break; |
537 | case 1: | 540 | case 1: |
538 | online_store_handle_online(cdev, force); | 541 | online_store_handle_online(cdev, force); |
542 | ret = count; | ||
539 | break; | 543 | break; |
540 | default: | 544 | default: |
541 | count = -EINVAL; | 545 | ret = -EINVAL; |
542 | } | 546 | } |
547 | out: | ||
543 | if (cdev->drv) | 548 | if (cdev->drv) |
544 | module_put(cdev->drv->owner); | 549 | module_put(cdev->drv->owner); |
545 | atomic_set(&cdev->private->onoff, 0); | 550 | atomic_set(&cdev->private->onoff, 0); |
546 | return count; | 551 | return ret; |
547 | } | 552 | } |
548 | 553 | ||
549 | static ssize_t | 554 | static ssize_t |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 4b92c84fb438..99403b0a97a7 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -555,8 +555,7 @@ ccw_device_recognition(struct ccw_device *cdev) | |||
555 | (cdev->private->state != DEV_STATE_BOXED)) | 555 | (cdev->private->state != DEV_STATE_BOXED)) |
556 | return -EINVAL; | 556 | return -EINVAL; |
557 | sch = to_subchannel(cdev->dev.parent); | 557 | sch = to_subchannel(cdev->dev.parent); |
558 | ret = cio_enable_subchannel(sch, sch->schib.pmcw.isc, | 558 | ret = cio_enable_subchannel(sch, (u32)(addr_t)sch); |
559 | (u32)(addr_t)sch); | ||
560 | if (ret != 0) | 559 | if (ret != 0) |
561 | /* Couldn't enable the subchannel for i/o. Sick device. */ | 560 | /* Couldn't enable the subchannel for i/o. Sick device. */ |
562 | return ret; | 561 | return ret; |
@@ -667,8 +666,7 @@ ccw_device_online(struct ccw_device *cdev) | |||
667 | sch = to_subchannel(cdev->dev.parent); | 666 | sch = to_subchannel(cdev->dev.parent); |
668 | if (css_init_done && !get_device(&cdev->dev)) | 667 | if (css_init_done && !get_device(&cdev->dev)) |
669 | return -ENODEV; | 668 | return -ENODEV; |
670 | ret = cio_enable_subchannel(sch, sch->schib.pmcw.isc, | 669 | ret = cio_enable_subchannel(sch, (u32)(addr_t)sch); |
671 | (u32)(addr_t)sch); | ||
672 | if (ret != 0) { | 670 | if (ret != 0) { |
673 | /* Couldn't enable the subchannel for i/o. Sick device. */ | 671 | /* Couldn't enable the subchannel for i/o. Sick device. */ |
674 | if (ret == -ENODEV) | 672 | if (ret == -ENODEV) |
@@ -1048,8 +1046,7 @@ ccw_device_start_id(struct ccw_device *cdev, enum dev_event dev_event) | |||
1048 | struct subchannel *sch; | 1046 | struct subchannel *sch; |
1049 | 1047 | ||
1050 | sch = to_subchannel(cdev->dev.parent); | 1048 | sch = to_subchannel(cdev->dev.parent); |
1051 | if (cio_enable_subchannel(sch, sch->schib.pmcw.isc, | 1049 | if (cio_enable_subchannel(sch, (u32)(addr_t)sch) != 0) |
1052 | (u32)(addr_t)sch) != 0) | ||
1053 | /* Couldn't enable the subchannel for i/o. Sick device. */ | 1050 | /* Couldn't enable the subchannel for i/o. Sick device. */ |
1054 | return; | 1051 | return; |
1055 | 1052 | ||
@@ -1082,7 +1079,6 @@ device_trigger_reprobe(struct subchannel *sch) | |||
1082 | */ | 1079 | */ |
1083 | sch->lpm = sch->schib.pmcw.pam & sch->opm; | 1080 | sch->lpm = sch->schib.pmcw.pam & sch->opm; |
1084 | /* Re-set some bits in the pmcw that were lost. */ | 1081 | /* Re-set some bits in the pmcw that were lost. */ |
1085 | sch->schib.pmcw.isc = 3; | ||
1086 | sch->schib.pmcw.csense = 1; | 1082 | sch->schib.pmcw.csense = 1; |
1087 | sch->schib.pmcw.ena = 0; | 1083 | sch->schib.pmcw.ena = 0; |
1088 | if ((sch->lpm & (sch->lpm - 1)) != 0) | 1084 | if ((sch->lpm & (sch->lpm - 1)) != 0) |
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index a1718a0aa539..f308ad55a6d5 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c | |||
@@ -508,7 +508,7 @@ ccw_device_stlck(struct ccw_device *cdev) | |||
508 | return -ENOMEM; | 508 | return -ENOMEM; |
509 | } | 509 | } |
510 | spin_lock_irqsave(sch->lock, flags); | 510 | spin_lock_irqsave(sch->lock, flags); |
511 | ret = cio_enable_subchannel(sch, 3, (u32)(addr_t)sch); | 511 | ret = cio_enable_subchannel(sch, (u32)(addr_t)sch); |
512 | if (ret) | 512 | if (ret) |
513 | goto out_unlock; | 513 | goto out_unlock; |
514 | /* | 514 | /* |
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 43876e287370..445cf364e461 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -3663,11 +3663,11 @@ qdio_performance_stats_show(struct bus_type *bus, char *buf) | |||
3663 | static ssize_t | 3663 | static ssize_t |
3664 | qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count) | 3664 | qdio_performance_stats_store(struct bus_type *bus, const char *buf, size_t count) |
3665 | { | 3665 | { |
3666 | char *tmp; | 3666 | unsigned long i; |
3667 | int i; | 3667 | int ret; |
3668 | 3668 | ||
3669 | i = simple_strtoul(buf, &tmp, 16); | 3669 | ret = strict_strtoul(buf, 16, &i); |
3670 | if ((i == 0) || (i == 1)) { | 3670 | if (!ret && ((i == 0) || (i == 1))) { |
3671 | if (i == qdio_performance_stats) | 3671 | if (i == qdio_performance_stats) |
3672 | return count; | 3672 | return count; |
3673 | qdio_performance_stats = i; | 3673 | qdio_performance_stats = i; |
diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index bbef3764fbf8..47a7e6200b26 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/virtio_config.h> | 17 | #include <linux/virtio_config.h> |
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/virtio_ring.h> | 19 | #include <linux/virtio_ring.h> |
20 | #include <linux/pfn.h> | ||
20 | #include <asm/io.h> | 21 | #include <asm/io.h> |
21 | #include <asm/kvm_para.h> | 22 | #include <asm/kvm_para.h> |
22 | #include <asm/kvm_virtio.h> | 23 | #include <asm/kvm_virtio.h> |
@@ -180,11 +181,10 @@ static struct virtqueue *kvm_find_vq(struct virtio_device *vdev, | |||
180 | 181 | ||
181 | config = kvm_vq_config(kdev->desc)+index; | 182 | config = kvm_vq_config(kdev->desc)+index; |
182 | 183 | ||
183 | if (add_shared_memory(config->address, | 184 | err = vmem_add_mapping(config->address, |
184 | vring_size(config->num, PAGE_SIZE))) { | 185 | vring_size(config->num, PAGE_SIZE)); |
185 | err = -ENOMEM; | 186 | if (err) |
186 | goto out; | 187 | goto out; |
187 | } | ||
188 | 188 | ||
189 | vq = vring_new_virtqueue(config->num, vdev, (void *) config->address, | 189 | vq = vring_new_virtqueue(config->num, vdev, (void *) config->address, |
190 | kvm_notify, callback); | 190 | kvm_notify, callback); |
@@ -202,8 +202,8 @@ static struct virtqueue *kvm_find_vq(struct virtio_device *vdev, | |||
202 | vq->priv = config; | 202 | vq->priv = config; |
203 | return vq; | 203 | return vq; |
204 | unmap: | 204 | unmap: |
205 | remove_shared_memory(config->address, vring_size(config->num, | 205 | vmem_remove_mapping(config->address, |
206 | PAGE_SIZE)); | 206 | vring_size(config->num, PAGE_SIZE)); |
207 | out: | 207 | out: |
208 | return ERR_PTR(err); | 208 | return ERR_PTR(err); |
209 | } | 209 | } |
@@ -213,8 +213,8 @@ static void kvm_del_vq(struct virtqueue *vq) | |||
213 | struct kvm_vqconfig *config = vq->priv; | 213 | struct kvm_vqconfig *config = vq->priv; |
214 | 214 | ||
215 | vring_del_virtqueue(vq); | 215 | vring_del_virtqueue(vq); |
216 | remove_shared_memory(config->address, | 216 | vmem_remove_mapping(config->address, |
217 | vring_size(config->num, PAGE_SIZE)); | 217 | vring_size(config->num, PAGE_SIZE)); |
218 | } | 218 | } |
219 | 219 | ||
220 | /* | 220 | /* |
@@ -318,12 +318,13 @@ static int __init kvm_devices_init(void) | |||
318 | return rc; | 318 | return rc; |
319 | } | 319 | } |
320 | 320 | ||
321 | if (add_shared_memory((max_pfn) << PAGE_SHIFT, PAGE_SIZE)) { | 321 | rc = vmem_add_mapping(PFN_PHYS(max_pfn), PAGE_SIZE); |
322 | if (rc) { | ||
322 | device_unregister(&kvm_root); | 323 | device_unregister(&kvm_root); |
323 | return -ENOMEM; | 324 | return rc; |
324 | } | 325 | } |
325 | 326 | ||
326 | kvm_devices = (void *) (max_pfn << PAGE_SHIFT); | 327 | kvm_devices = (void *) PFN_PHYS(max_pfn); |
327 | 328 | ||
328 | ctl_set_bit(0, 9); | 329 | ctl_set_bit(0, 9); |
329 | register_external_interrupt(0x2603, kvm_extint_handler); | 330 | register_external_interrupt(0x2603, kvm_extint_handler); |
diff --git a/fs/Kconfig b/fs/Kconfig index 2e43d46f65d6..cf12c403b8c7 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
@@ -1005,7 +1005,8 @@ config TMPFS_POSIX_ACL | |||
1005 | 1005 | ||
1006 | config HUGETLBFS | 1006 | config HUGETLBFS |
1007 | bool "HugeTLB file system support" | 1007 | bool "HugeTLB file system support" |
1008 | depends on X86 || IA64 || PPC64 || SPARC64 || (SUPERH && MMU) || BROKEN | 1008 | depends on X86 || IA64 || PPC64 || SPARC64 || (SUPERH && MMU) || \ |
1009 | (S390 && 64BIT) || BROKEN | ||
1009 | help | 1010 | help |
1010 | hugetlbfs is a filesystem backing for HugeTLB pages, based on | 1011 | hugetlbfs is a filesystem backing for HugeTLB pages, based on |
1011 | ramfs. For architectures that support it, say Y here and read | 1012 | ramfs. For architectures that support it, say Y here and read |
diff --git a/include/asm-s390/hugetlb.h b/include/asm-s390/hugetlb.h new file mode 100644 index 000000000000..600a776f8f75 --- /dev/null +++ b/include/asm-s390/hugetlb.h | |||
@@ -0,0 +1,183 @@ | |||
1 | /* | ||
2 | * IBM System z Huge TLB Page Support for Kernel. | ||
3 | * | ||
4 | * Copyright IBM Corp. 2008 | ||
5 | * Author(s): Gerald Schaefer <gerald.schaefer@de.ibm.com> | ||
6 | */ | ||
7 | |||
8 | #ifndef _ASM_S390_HUGETLB_H | ||
9 | #define _ASM_S390_HUGETLB_H | ||
10 | |||
11 | #include <asm/page.h> | ||
12 | #include <asm/pgtable.h> | ||
13 | |||
14 | |||
15 | #define is_hugepage_only_range(mm, addr, len) 0 | ||
16 | #define hugetlb_free_pgd_range free_pgd_range | ||
17 | |||
18 | void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, | ||
19 | pte_t *ptep, pte_t pte); | ||
20 | |||
21 | /* | ||
22 | * If the arch doesn't supply something else, assume that hugepage | ||
23 | * size aligned regions are ok without further preparation. | ||
24 | */ | ||
25 | static inline int prepare_hugepage_range(unsigned long addr, unsigned long len) | ||
26 | { | ||
27 | if (len & ~HPAGE_MASK) | ||
28 | return -EINVAL; | ||
29 | if (addr & ~HPAGE_MASK) | ||
30 | return -EINVAL; | ||
31 | return 0; | ||
32 | } | ||
33 | |||
34 | #define hugetlb_prefault_arch_hook(mm) do { } while (0) | ||
35 | |||
36 | int arch_prepare_hugepage(struct page *page); | ||
37 | void arch_release_hugepage(struct page *page); | ||
38 | |||
39 | static inline pte_t pte_mkhuge(pte_t pte) | ||
40 | { | ||
41 | /* | ||
42 | * PROT_NONE needs to be remapped from the pte type to the ste type. | ||
43 | * The HW invalid bit is also different for pte and ste. The pte | ||
44 | * invalid bit happens to be the same as the ste _SEGMENT_ENTRY_LARGE | ||
45 | * bit, so we don't have to clear it. | ||
46 | */ | ||
47 | if (pte_val(pte) & _PAGE_INVALID) { | ||
48 | if (pte_val(pte) & _PAGE_SWT) | ||
49 | pte_val(pte) |= _HPAGE_TYPE_NONE; | ||
50 | pte_val(pte) |= _SEGMENT_ENTRY_INV; | ||
51 | } | ||
52 | /* | ||
53 | * Clear SW pte bits SWT and SWX, there are no SW bits in a segment | ||
54 | * table entry. | ||
55 | */ | ||
56 | pte_val(pte) &= ~(_PAGE_SWT | _PAGE_SWX); | ||
57 | /* | ||
58 | * Also set the change-override bit because we don't need dirty bit | ||
59 | * tracking for hugetlbfs pages. | ||
60 | */ | ||
61 | pte_val(pte) |= (_SEGMENT_ENTRY_LARGE | _SEGMENT_ENTRY_CO); | ||
62 | return pte; | ||
63 | } | ||
64 | |||
65 | static inline pte_t huge_pte_wrprotect(pte_t pte) | ||
66 | { | ||
67 | pte_val(pte) |= _PAGE_RO; | ||
68 | return pte; | ||
69 | } | ||
70 | |||
71 | static inline int huge_pte_none(pte_t pte) | ||
72 | { | ||
73 | return (pte_val(pte) & _SEGMENT_ENTRY_INV) && | ||
74 | !(pte_val(pte) & _SEGMENT_ENTRY_RO); | ||
75 | } | ||
76 | |||
77 | static inline pte_t huge_ptep_get(pte_t *ptep) | ||
78 | { | ||
79 | pte_t pte = *ptep; | ||
80 | unsigned long mask; | ||
81 | |||
82 | if (!MACHINE_HAS_HPAGE) { | ||
83 | ptep = (pte_t *) (pte_val(pte) & _SEGMENT_ENTRY_ORIGIN); | ||
84 | if (ptep) { | ||
85 | mask = pte_val(pte) & | ||
86 | (_SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO); | ||
87 | pte = pte_mkhuge(*ptep); | ||
88 | pte_val(pte) |= mask; | ||
89 | } | ||
90 | } | ||
91 | return pte; | ||
92 | } | ||
93 | |||
94 | static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | ||
95 | unsigned long addr, pte_t *ptep) | ||
96 | { | ||
97 | pte_t pte = huge_ptep_get(ptep); | ||
98 | |||
99 | pmd_clear((pmd_t *) ptep); | ||
100 | return pte; | ||
101 | } | ||
102 | |||
103 | static inline void __pmd_csp(pmd_t *pmdp) | ||
104 | { | ||
105 | register unsigned long reg2 asm("2") = pmd_val(*pmdp); | ||
106 | register unsigned long reg3 asm("3") = pmd_val(*pmdp) | | ||
107 | _SEGMENT_ENTRY_INV; | ||
108 | register unsigned long reg4 asm("4") = ((unsigned long) pmdp) + 5; | ||
109 | |||
110 | asm volatile( | ||
111 | " csp %1,%3" | ||
112 | : "=m" (*pmdp) | ||
113 | : "d" (reg2), "d" (reg3), "d" (reg4), "m" (*pmdp) : "cc"); | ||
114 | pmd_val(*pmdp) = _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY; | ||
115 | } | ||
116 | |||
117 | static inline void __pmd_idte(unsigned long address, pmd_t *pmdp) | ||
118 | { | ||
119 | unsigned long sto = (unsigned long) pmdp - | ||
120 | pmd_index(address) * sizeof(pmd_t); | ||
121 | |||
122 | if (!(pmd_val(*pmdp) & _SEGMENT_ENTRY_INV)) { | ||
123 | asm volatile( | ||
124 | " .insn rrf,0xb98e0000,%2,%3,0,0" | ||
125 | : "=m" (*pmdp) | ||
126 | : "m" (*pmdp), "a" (sto), | ||
127 | "a" ((address & HPAGE_MASK)) | ||
128 | ); | ||
129 | } | ||
130 | pmd_val(*pmdp) = _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY; | ||
131 | } | ||
132 | |||
133 | static inline void huge_ptep_invalidate(struct mm_struct *mm, | ||
134 | unsigned long address, pte_t *ptep) | ||
135 | { | ||
136 | pmd_t *pmdp = (pmd_t *) ptep; | ||
137 | |||
138 | if (!MACHINE_HAS_IDTE) { | ||
139 | __pmd_csp(pmdp); | ||
140 | if (mm->context.noexec) { | ||
141 | pmdp = get_shadow_table(pmdp); | ||
142 | __pmd_csp(pmdp); | ||
143 | } | ||
144 | return; | ||
145 | } | ||
146 | |||
147 | __pmd_idte(address, pmdp); | ||
148 | if (mm->context.noexec) { | ||
149 | pmdp = get_shadow_table(pmdp); | ||
150 | __pmd_idte(address, pmdp); | ||
151 | } | ||
152 | return; | ||
153 | } | ||
154 | |||
155 | #define huge_ptep_set_access_flags(__vma, __addr, __ptep, __entry, __dirty) \ | ||
156 | ({ \ | ||
157 | int __changed = !pte_same(huge_ptep_get(__ptep), __entry); \ | ||
158 | if (__changed) { \ | ||
159 | huge_ptep_invalidate((__vma)->vm_mm, __addr, __ptep); \ | ||
160 | set_huge_pte_at((__vma)->vm_mm, __addr, __ptep, __entry); \ | ||
161 | } \ | ||
162 | __changed; \ | ||
163 | }) | ||
164 | |||
165 | #define huge_ptep_set_wrprotect(__mm, __addr, __ptep) \ | ||
166 | ({ \ | ||
167 | pte_t __pte = huge_ptep_get(__ptep); \ | ||
168 | if (pte_write(__pte)) { \ | ||
169 | if (atomic_read(&(__mm)->mm_users) > 1 || \ | ||
170 | (__mm) != current->active_mm) \ | ||
171 | huge_ptep_invalidate(__mm, __addr, __ptep); \ | ||
172 | set_huge_pte_at(__mm, __addr, __ptep, \ | ||
173 | huge_pte_wrprotect(__pte)); \ | ||
174 | } \ | ||
175 | }) | ||
176 | |||
177 | static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, | ||
178 | unsigned long address, pte_t *ptep) | ||
179 | { | ||
180 | huge_ptep_invalidate(vma->vm_mm, address, ptep); | ||
181 | } | ||
182 | |||
183 | #endif /* _ASM_S390_HUGETLB_H */ | ||
diff --git a/include/asm-s390/page.h b/include/asm-s390/page.h index fe7f92b6ae6d..f0f4579eac13 100644 --- a/include/asm-s390/page.h +++ b/include/asm-s390/page.h | |||
@@ -19,17 +19,34 @@ | |||
19 | #define PAGE_DEFAULT_ACC 0 | 19 | #define PAGE_DEFAULT_ACC 0 |
20 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) | 20 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) |
21 | 21 | ||
22 | #define HPAGE_SHIFT 20 | ||
23 | #define HPAGE_SIZE (1UL << HPAGE_SHIFT) | ||
24 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | ||
25 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | ||
26 | |||
27 | #define ARCH_HAS_SETCLEAR_HUGE_PTE | ||
28 | #define ARCH_HAS_HUGE_PTE_TYPE | ||
29 | #define ARCH_HAS_PREPARE_HUGEPAGE | ||
30 | #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH | ||
31 | |||
22 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
23 | #ifndef __ASSEMBLY__ | 33 | #ifndef __ASSEMBLY__ |
24 | 34 | ||
25 | static inline void clear_page(void *page) | 35 | static inline void clear_page(void *page) |
26 | { | 36 | { |
27 | register unsigned long reg1 asm ("1") = 0; | 37 | if (MACHINE_HAS_PFMF) { |
28 | register void *reg2 asm ("2") = page; | 38 | asm volatile( |
29 | register unsigned long reg3 asm ("3") = 4096; | 39 | " .insn rre,0xb9af0000,%0,%1" |
30 | asm volatile( | 40 | : : "d" (0x10000), "a" (page) : "memory", "cc"); |
31 | " mvcl 2,0" | 41 | } else { |
32 | : "+d" (reg2), "+d" (reg3) : "d" (reg1) : "memory", "cc"); | 42 | register unsigned long reg1 asm ("1") = 0; |
43 | register void *reg2 asm ("2") = page; | ||
44 | register unsigned long reg3 asm ("3") = 4096; | ||
45 | asm volatile( | ||
46 | " mvcl 2,0" | ||
47 | : "+d" (reg2), "+d" (reg3) : "d" (reg1) | ||
48 | : "memory", "cc"); | ||
49 | } | ||
33 | } | 50 | } |
34 | 51 | ||
35 | static inline void copy_page(void *to, void *from) | 52 | static inline void copy_page(void *to, void *from) |
@@ -108,26 +125,6 @@ page_get_storage_key(unsigned long addr) | |||
108 | return skey; | 125 | return skey; |
109 | } | 126 | } |
110 | 127 | ||
111 | extern unsigned long max_pfn; | ||
112 | |||
113 | static inline int pfn_valid(unsigned long pfn) | ||
114 | { | ||
115 | unsigned long dummy; | ||
116 | int ccode; | ||
117 | |||
118 | if (pfn >= max_pfn) | ||
119 | return 0; | ||
120 | |||
121 | asm volatile( | ||
122 | " lra %0,0(%2)\n" | ||
123 | " ipm %1\n" | ||
124 | " srl %1,28\n" | ||
125 | : "=d" (dummy), "=d" (ccode) | ||
126 | : "a" (pfn << PAGE_SHIFT) | ||
127 | : "cc"); | ||
128 | return !ccode; | ||
129 | } | ||
130 | |||
131 | #endif /* !__ASSEMBLY__ */ | 128 | #endif /* !__ASSEMBLY__ */ |
132 | 129 | ||
133 | /* to align the pointer to the (next) page boundary */ | 130 | /* to align the pointer to the (next) page boundary */ |
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index f8347ce9c5a1..c7f4f8e3e297 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h | |||
@@ -129,7 +129,7 @@ extern char empty_zero_page[PAGE_SIZE]; | |||
129 | #define VMEM_MAX_PAGES ((VMEM_MAP_END - VMALLOC_END) / sizeof(struct page)) | 129 | #define VMEM_MAX_PAGES ((VMEM_MAP_END - VMALLOC_END) / sizeof(struct page)) |
130 | #define VMEM_MAX_PFN min(VMALLOC_START >> PAGE_SHIFT, VMEM_MAX_PAGES) | 130 | #define VMEM_MAX_PFN min(VMALLOC_START >> PAGE_SHIFT, VMEM_MAX_PAGES) |
131 | #define VMEM_MAX_PHYS ((VMEM_MAX_PFN << PAGE_SHIFT) & ~((16 << 20) - 1)) | 131 | #define VMEM_MAX_PHYS ((VMEM_MAX_PFN << PAGE_SHIFT) & ~((16 << 20) - 1)) |
132 | #define VMEM_MAP ((struct page *) VMALLOC_END) | 132 | #define vmemmap ((struct page *) VMALLOC_END) |
133 | 133 | ||
134 | /* | 134 | /* |
135 | * A 31 bit pagetable entry of S390 has following format: | 135 | * A 31 bit pagetable entry of S390 has following format: |
@@ -234,6 +234,15 @@ extern char empty_zero_page[PAGE_SIZE]; | |||
234 | #define _PAGE_TYPE_EX_RW 0x002 | 234 | #define _PAGE_TYPE_EX_RW 0x002 |
235 | 235 | ||
236 | /* | 236 | /* |
237 | * Only four types for huge pages, using the invalid bit and protection bit | ||
238 | * of a segment table entry. | ||
239 | */ | ||
240 | #define _HPAGE_TYPE_EMPTY 0x020 /* _SEGMENT_ENTRY_INV */ | ||
241 | #define _HPAGE_TYPE_NONE 0x220 | ||
242 | #define _HPAGE_TYPE_RO 0x200 /* _SEGMENT_ENTRY_RO */ | ||
243 | #define _HPAGE_TYPE_RW 0x000 | ||
244 | |||
245 | /* | ||
237 | * PTE type bits are rather complicated. handle_pte_fault uses pte_present, | 246 | * PTE type bits are rather complicated. handle_pte_fault uses pte_present, |
238 | * pte_none and pte_file to find out the pte type WITHOUT holding the page | 247 | * pte_none and pte_file to find out the pte type WITHOUT holding the page |
239 | * table lock. ptep_clear_flush on the other hand uses ptep_clear_flush to | 248 | * table lock. ptep_clear_flush on the other hand uses ptep_clear_flush to |
@@ -325,6 +334,9 @@ extern char empty_zero_page[PAGE_SIZE]; | |||
325 | #define _SEGMENT_ENTRY (0) | 334 | #define _SEGMENT_ENTRY (0) |
326 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) | 335 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) |
327 | 336 | ||
337 | #define _SEGMENT_ENTRY_LARGE 0x400 /* STE-format control, large page */ | ||
338 | #define _SEGMENT_ENTRY_CO 0x100 /* change-recording override */ | ||
339 | |||
328 | #endif /* __s390x__ */ | 340 | #endif /* __s390x__ */ |
329 | 341 | ||
330 | /* | 342 | /* |
@@ -1063,8 +1075,8 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) | |||
1063 | 1075 | ||
1064 | #define kern_addr_valid(addr) (1) | 1076 | #define kern_addr_valid(addr) (1) |
1065 | 1077 | ||
1066 | extern int add_shared_memory(unsigned long start, unsigned long size); | 1078 | extern int vmem_add_mapping(unsigned long start, unsigned long size); |
1067 | extern int remove_shared_memory(unsigned long start, unsigned long size); | 1079 | extern int vmem_remove_mapping(unsigned long start, unsigned long size); |
1068 | extern int s390_enable_sie(void); | 1080 | extern int s390_enable_sie(void); |
1069 | 1081 | ||
1070 | /* | 1082 | /* |
@@ -1072,9 +1084,6 @@ extern int s390_enable_sie(void); | |||
1072 | */ | 1084 | */ |
1073 | #define pgtable_cache_init() do { } while (0) | 1085 | #define pgtable_cache_init() do { } while (0) |
1074 | 1086 | ||
1075 | #define __HAVE_ARCH_MEMMAP_INIT | ||
1076 | extern void memmap_init(unsigned long, int, unsigned long, unsigned long); | ||
1077 | |||
1078 | #include <asm-generic/pgtable.h> | 1087 | #include <asm-generic/pgtable.h> |
1079 | 1088 | ||
1080 | #endif /* _S390_PAGE_H */ | 1089 | #endif /* _S390_PAGE_H */ |
diff --git a/include/asm-s390/processor.h b/include/asm-s390/processor.h index 8eaf343a12a8..a00f79dd323b 100644 --- a/include/asm-s390/processor.h +++ b/include/asm-s390/processor.h | |||
@@ -172,16 +172,7 @@ extern unsigned long thread_saved_pc(struct task_struct *t); | |||
172 | */ | 172 | */ |
173 | extern void task_show_regs(struct seq_file *m, struct task_struct *task); | 173 | extern void task_show_regs(struct seq_file *m, struct task_struct *task); |
174 | 174 | ||
175 | extern void show_registers(struct pt_regs *regs); | ||
176 | extern void show_code(struct pt_regs *regs); | 175 | extern void show_code(struct pt_regs *regs); |
177 | extern void show_trace(struct task_struct *task, unsigned long *sp); | ||
178 | #ifdef CONFIG_64BIT | ||
179 | extern void show_last_breaking_event(struct pt_regs *regs); | ||
180 | #else | ||
181 | static inline void show_last_breaking_event(struct pt_regs *regs) | ||
182 | { | ||
183 | } | ||
184 | #endif | ||
185 | 176 | ||
186 | unsigned long get_wchan(struct task_struct *p); | 177 | unsigned long get_wchan(struct task_struct *p); |
187 | #define task_pt_regs(tsk) ((struct pt_regs *) \ | 178 | #define task_pt_regs(tsk) ((struct pt_regs *) \ |
diff --git a/include/asm-s390/ptrace.h b/include/asm-s390/ptrace.h index 61f6952f2e35..441d7c260857 100644 --- a/include/asm-s390/ptrace.h +++ b/include/asm-s390/ptrace.h | |||
@@ -463,8 +463,6 @@ struct user_regs_struct | |||
463 | }; | 463 | }; |
464 | 464 | ||
465 | #ifdef __KERNEL__ | 465 | #ifdef __KERNEL__ |
466 | #define __ARCH_SYS_PTRACE 1 | ||
467 | |||
468 | /* | 466 | /* |
469 | * These are defined as per linux/ptrace.h, which see. | 467 | * These are defined as per linux/ptrace.h, which see. |
470 | */ | 468 | */ |
diff --git a/include/asm-s390/setup.h b/include/asm-s390/setup.h index aaf4b518b940..ba69674012a7 100644 --- a/include/asm-s390/setup.h +++ b/include/asm-s390/setup.h | |||
@@ -59,23 +59,42 @@ extern unsigned int s390_noexec; | |||
59 | */ | 59 | */ |
60 | extern unsigned long machine_flags; | 60 | extern unsigned long machine_flags; |
61 | 61 | ||
62 | #define MACHINE_IS_VM (machine_flags & 1) | 62 | #define MACHINE_FLAG_VM (1UL << 0) |
63 | #define MACHINE_IS_P390 (machine_flags & 4) | 63 | #define MACHINE_FLAG_IEEE (1UL << 1) |
64 | #define MACHINE_HAS_MVPG (machine_flags & 16) | 64 | #define MACHINE_FLAG_P390 (1UL << 2) |
65 | #define MACHINE_IS_KVM (machine_flags & 64) | 65 | #define MACHINE_FLAG_CSP (1UL << 3) |
66 | #define MACHINE_HAS_IDTE (machine_flags & 128) | 66 | #define MACHINE_FLAG_MVPG (1UL << 4) |
67 | #define MACHINE_HAS_DIAG9C (machine_flags & 256) | 67 | #define MACHINE_FLAG_DIAG44 (1UL << 5) |
68 | #define MACHINE_FLAG_IDTE (1UL << 6) | ||
69 | #define MACHINE_FLAG_DIAG9C (1UL << 7) | ||
70 | #define MACHINE_FLAG_MVCOS (1UL << 8) | ||
71 | #define MACHINE_FLAG_KVM (1UL << 9) | ||
72 | #define MACHINE_FLAG_HPAGE (1UL << 10) | ||
73 | #define MACHINE_FLAG_PFMF (1UL << 11) | ||
74 | |||
75 | #define MACHINE_IS_VM (machine_flags & MACHINE_FLAG_VM) | ||
76 | #define MACHINE_IS_KVM (machine_flags & MACHINE_FLAG_KVM) | ||
77 | #define MACHINE_IS_P390 (machine_flags & MACHINE_FLAG_P390) | ||
78 | #define MACHINE_HAS_DIAG9C (machine_flags & MACHINE_FLAG_DIAG9C) | ||
68 | 79 | ||
69 | #ifndef __s390x__ | 80 | #ifndef __s390x__ |
70 | #define MACHINE_HAS_IEEE (machine_flags & 2) | 81 | #define MACHINE_HAS_IEEE (machine_flags & MACHINE_FLAG_IEEE) |
71 | #define MACHINE_HAS_CSP (machine_flags & 8) | 82 | #define MACHINE_HAS_CSP (machine_flags & MACHINE_FLAG_CSP) |
83 | #define MACHINE_HAS_IDTE (0) | ||
72 | #define MACHINE_HAS_DIAG44 (1) | 84 | #define MACHINE_HAS_DIAG44 (1) |
85 | #define MACHINE_HAS_MVPG (machine_flags & MACHINE_FLAG_MVPG) | ||
73 | #define MACHINE_HAS_MVCOS (0) | 86 | #define MACHINE_HAS_MVCOS (0) |
87 | #define MACHINE_HAS_HPAGE (0) | ||
88 | #define MACHINE_HAS_PFMF (0) | ||
74 | #else /* __s390x__ */ | 89 | #else /* __s390x__ */ |
75 | #define MACHINE_HAS_IEEE (1) | 90 | #define MACHINE_HAS_IEEE (1) |
76 | #define MACHINE_HAS_CSP (1) | 91 | #define MACHINE_HAS_CSP (1) |
77 | #define MACHINE_HAS_DIAG44 (machine_flags & 32) | 92 | #define MACHINE_HAS_IDTE (machine_flags & MACHINE_FLAG_IDTE) |
78 | #define MACHINE_HAS_MVCOS (machine_flags & 512) | 93 | #define MACHINE_HAS_DIAG44 (machine_flags & MACHINE_FLAG_DIAG44) |
94 | #define MACHINE_HAS_MVPG (1) | ||
95 | #define MACHINE_HAS_MVCOS (machine_flags & MACHINE_FLAG_MVCOS) | ||
96 | #define MACHINE_HAS_HPAGE (machine_flags & MACHINE_FLAG_HPAGE) | ||
97 | #define MACHINE_HAS_PFMF (machine_flags & MACHINE_FLAG_PFMF) | ||
79 | #endif /* __s390x__ */ | 98 | #endif /* __s390x__ */ |
80 | 99 | ||
81 | #define MACHINE_HAS_SCLP (!MACHINE_IS_P390) | 100 | #define MACHINE_HAS_SCLP (!MACHINE_IS_P390) |
diff --git a/include/asm-s390/smp.h b/include/asm-s390/smp.h index 6f3821a6a902..ae89cf2478fc 100644 --- a/include/asm-s390/smp.h +++ b/include/asm-s390/smp.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/lowcore.h> | 19 | #include <asm/lowcore.h> |
20 | #include <asm/sigp.h> | 20 | #include <asm/sigp.h> |
21 | #include <asm/ptrace.h> | 21 | #include <asm/ptrace.h> |
22 | #include <asm/system.h> | ||
22 | 23 | ||
23 | /* | 24 | /* |
24 | s390 specific smp.c headers | 25 | s390 specific smp.c headers |
@@ -53,10 +54,7 @@ extern void machine_power_off_smp(void); | |||
53 | 54 | ||
54 | static inline __u16 hard_smp_processor_id(void) | 55 | static inline __u16 hard_smp_processor_id(void) |
55 | { | 56 | { |
56 | __u16 cpu_address; | 57 | return stap(); |
57 | |||
58 | asm volatile("stap %0" : "=m" (cpu_address)); | ||
59 | return cpu_address; | ||
60 | } | 58 | } |
61 | 59 | ||
62 | /* | 60 | /* |
@@ -108,5 +106,11 @@ static inline void smp_send_stop(void) | |||
108 | #define smp_cpu_not_running(cpu) 1 | 106 | #define smp_cpu_not_running(cpu) 1 |
109 | #endif | 107 | #endif |
110 | 108 | ||
109 | #ifdef CONFIG_HOTPLUG_CPU | ||
110 | extern int smp_rescan_cpus(void); | ||
111 | #else | ||
112 | static inline int smp_rescan_cpus(void) { return 0; } | ||
113 | #endif | ||
114 | |||
111 | extern union save_area *zfcpdump_save_areas[NR_CPUS + 1]; | 115 | extern union save_area *zfcpdump_save_areas[NR_CPUS + 1]; |
112 | #endif | 116 | #endif |
diff --git a/include/asm-s390/sparsemem.h b/include/asm-s390/sparsemem.h new file mode 100644 index 000000000000..06dfdab6c0e8 --- /dev/null +++ b/include/asm-s390/sparsemem.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef _ASM_S390_SPARSEMEM_H | ||
2 | #define _ASM_S390_SPARSEMEM_H | ||
3 | |||
4 | #define SECTION_SIZE_BITS 25 | ||
5 | |||
6 | #ifdef CONFIG_64BIT | ||
7 | |||
8 | #define MAX_PHYSADDR_BITS 42 | ||
9 | #define MAX_PHYSMEM_BITS 42 | ||
10 | |||
11 | #else | ||
12 | |||
13 | #define MAX_PHYSADDR_BITS 31 | ||
14 | #define MAX_PHYSMEM_BITS 31 | ||
15 | |||
16 | #endif /* CONFIG_64BIT */ | ||
17 | |||
18 | #endif /* _ASM_S390_SPARSEMEM_H */ | ||
diff --git a/include/asm-s390/sysinfo.h b/include/asm-s390/sysinfo.h index abe10ae15e46..79d01343f8b0 100644 --- a/include/asm-s390/sysinfo.h +++ b/include/asm-s390/sysinfo.h | |||
@@ -11,6 +11,9 @@ | |||
11 | * Christian Borntraeger <borntraeger@de.ibm.com> | 11 | * Christian Borntraeger <borntraeger@de.ibm.com> |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #ifndef __ASM_S390_SYSINFO_H | ||
15 | #define __ASM_S390_SYSINFO_H | ||
16 | |||
14 | struct sysinfo_1_1_1 { | 17 | struct sysinfo_1_1_1 { |
15 | char reserved_0[32]; | 18 | char reserved_0[32]; |
16 | char manufacturer[16]; | 19 | char manufacturer[16]; |
@@ -114,3 +117,5 @@ static inline int stsi(void *sysinfo, int fc, int sel1, int sel2) | |||
114 | : "cc", "memory"); | 117 | : "cc", "memory"); |
115 | return r0; | 118 | return r0; |
116 | } | 119 | } |
120 | |||
121 | #endif /* __ASM_S390_SYSINFO_H */ | ||
diff --git a/include/asm-s390/system.h b/include/asm-s390/system.h index 92098df4d6e3..c819ae25a842 100644 --- a/include/asm-s390/system.h +++ b/include/asm-s390/system.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <asm/ptrace.h> | 16 | #include <asm/ptrace.h> |
17 | #include <asm/setup.h> | 17 | #include <asm/setup.h> |
18 | #include <asm/processor.h> | 18 | #include <asm/processor.h> |
19 | #include <asm/lowcore.h> | ||
19 | 20 | ||
20 | #ifdef __KERNEL__ | 21 | #ifdef __KERNEL__ |
21 | 22 | ||
@@ -422,6 +423,23 @@ extern void smp_ctl_clear_bit(int cr, int bit); | |||
422 | 423 | ||
423 | #endif /* CONFIG_SMP */ | 424 | #endif /* CONFIG_SMP */ |
424 | 425 | ||
426 | static inline unsigned int stfl(void) | ||
427 | { | ||
428 | asm volatile( | ||
429 | " .insn s,0xb2b10000,0(0)\n" /* stfl */ | ||
430 | "0:\n" | ||
431 | EX_TABLE(0b,0b)); | ||
432 | return S390_lowcore.stfl_fac_list; | ||
433 | } | ||
434 | |||
435 | static inline unsigned short stap(void) | ||
436 | { | ||
437 | unsigned short cpu_address; | ||
438 | |||
439 | asm volatile("stap %0" : "=m" (cpu_address)); | ||
440 | return cpu_address; | ||
441 | } | ||
442 | |||
425 | extern void (*_machine_restart)(char *command); | 443 | extern void (*_machine_restart)(char *command); |
426 | extern void (*_machine_halt)(void); | 444 | extern void (*_machine_halt)(void); |
427 | extern void (*_machine_power_off)(void); | 445 | extern void (*_machine_power_off)(void); |
diff --git a/include/asm-s390/tlbflush.h b/include/asm-s390/tlbflush.h index 9e57a93d7de1..d60394b9745e 100644 --- a/include/asm-s390/tlbflush.h +++ b/include/asm-s390/tlbflush.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _S390_TLBFLUSH_H | 2 | #define _S390_TLBFLUSH_H |
3 | 3 | ||
4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> |
5 | #include <linux/sched.h> | ||
5 | #include <asm/processor.h> | 6 | #include <asm/processor.h> |
6 | #include <asm/pgalloc.h> | 7 | #include <asm/pgalloc.h> |
7 | 8 | ||
diff --git a/include/asm-s390/topology.h b/include/asm-s390/topology.h index 8e97b06f298a..d96c91643458 100644 --- a/include/asm-s390/topology.h +++ b/include/asm-s390/topology.h | |||
@@ -7,6 +7,10 @@ | |||
7 | 7 | ||
8 | cpumask_t cpu_coregroup_map(unsigned int cpu); | 8 | cpumask_t cpu_coregroup_map(unsigned int cpu); |
9 | 9 | ||
10 | extern cpumask_t cpu_core_map[NR_CPUS]; | ||
11 | |||
12 | #define topology_core_siblings(cpu) (cpu_core_map[cpu]) | ||
13 | |||
10 | int topology_set_cpu_management(int fc); | 14 | int topology_set_cpu_management(int fc); |
11 | void topology_schedule_update(void); | 15 | void topology_schedule_update(void); |
12 | 16 | ||