diff options
Diffstat (limited to 'arch')
133 files changed, 5989 insertions, 3189 deletions
diff --git a/arch/arm/configs/pnx4008_defconfig b/arch/arm/configs/pnx4008_defconfig index 8a078d479d57..a4989f44baaa 100644 --- a/arch/arm/configs/pnx4008_defconfig +++ b/arch/arm/configs/pnx4008_defconfig | |||
@@ -1,14 +1,18 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.17-rc1 | 3 | # Linux kernel version: 2.6.18-rc6 |
4 | # Thu Apr 6 17:05:58 2006 | 4 | # Mon Sep 11 13:59:24 2006 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
8 | CONFIG_GENERIC_HARDIRQS=y | ||
9 | CONFIG_HARDIRQS_SW_RESEND=y | ||
10 | CONFIG_GENERIC_IRQ_PROBE=y | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 11 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
9 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
10 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 13 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
11 | CONFIG_VECTORS_BASE=0xffff0000 | 14 | CONFIG_VECTORS_BASE=0xffff0000 |
15 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
12 | 16 | ||
13 | # | 17 | # |
14 | # Code maturity level options | 18 | # Code maturity level options |
@@ -28,6 +32,7 @@ CONFIG_SYSVIPC=y | |||
28 | CONFIG_POSIX_MQUEUE=y | 32 | CONFIG_POSIX_MQUEUE=y |
29 | CONFIG_BSD_PROCESS_ACCT=y | 33 | CONFIG_BSD_PROCESS_ACCT=y |
30 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | 34 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set |
35 | # CONFIG_TASKSTATS is not set | ||
31 | CONFIG_SYSCTL=y | 36 | CONFIG_SYSCTL=y |
32 | CONFIG_AUDIT=y | 37 | CONFIG_AUDIT=y |
33 | # CONFIG_IKCONFIG is not set | 38 | # CONFIG_IKCONFIG is not set |
@@ -44,14 +49,15 @@ CONFIG_PRINTK=y | |||
44 | CONFIG_BUG=y | 49 | CONFIG_BUG=y |
45 | CONFIG_ELF_CORE=y | 50 | CONFIG_ELF_CORE=y |
46 | CONFIG_BASE_FULL=y | 51 | CONFIG_BASE_FULL=y |
52 | CONFIG_RT_MUTEXES=y | ||
47 | CONFIG_FUTEX=y | 53 | CONFIG_FUTEX=y |
48 | CONFIG_EPOLL=y | 54 | CONFIG_EPOLL=y |
49 | CONFIG_SHMEM=y | 55 | CONFIG_SHMEM=y |
50 | CONFIG_SLAB=y | 56 | CONFIG_SLAB=y |
57 | CONFIG_VM_EVENT_COUNTERS=y | ||
51 | # CONFIG_TINY_SHMEM is not set | 58 | # CONFIG_TINY_SHMEM is not set |
52 | CONFIG_BASE_SMALL=0 | 59 | CONFIG_BASE_SMALL=0 |
53 | # CONFIG_SLOB is not set | 60 | # CONFIG_SLOB is not set |
54 | CONFIG_OBSOLETE_INTERMODULE=m | ||
55 | 61 | ||
56 | # | 62 | # |
57 | # Loadable module support | 63 | # Loadable module support |
@@ -84,18 +90,26 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
84 | # | 90 | # |
85 | # System Type | 91 | # System Type |
86 | # | 92 | # |
93 | # CONFIG_ARCH_AAEC2000 is not set | ||
94 | # CONFIG_ARCH_INTEGRATOR is not set | ||
95 | # CONFIG_ARCH_REALVIEW is not set | ||
96 | # CONFIG_ARCH_VERSATILE is not set | ||
97 | # CONFIG_ARCH_AT91 is not set | ||
87 | # CONFIG_ARCH_CLPS7500 is not set | 98 | # CONFIG_ARCH_CLPS7500 is not set |
88 | # CONFIG_ARCH_CLPS711X is not set | 99 | # CONFIG_ARCH_CLPS711X is not set |
89 | # CONFIG_ARCH_CO285 is not set | 100 | # CONFIG_ARCH_CO285 is not set |
90 | # CONFIG_ARCH_EBSA110 is not set | 101 | # CONFIG_ARCH_EBSA110 is not set |
91 | # CONFIG_ARCH_EP93XX is not set | 102 | # CONFIG_ARCH_EP93XX is not set |
92 | # CONFIG_ARCH_FOOTBRIDGE is not set | 103 | # CONFIG_ARCH_FOOTBRIDGE is not set |
93 | # CONFIG_ARCH_INTEGRATOR is not set | 104 | # CONFIG_ARCH_NETX is not set |
105 | # CONFIG_ARCH_H720X is not set | ||
106 | # CONFIG_ARCH_IMX is not set | ||
94 | # CONFIG_ARCH_IOP3XX is not set | 107 | # CONFIG_ARCH_IOP3XX is not set |
95 | # CONFIG_ARCH_IXP4XX is not set | 108 | # CONFIG_ARCH_IXP4XX is not set |
96 | # CONFIG_ARCH_IXP2000 is not set | 109 | # CONFIG_ARCH_IXP2000 is not set |
97 | # CONFIG_ARCH_IXP23XX is not set | 110 | # CONFIG_ARCH_IXP23XX is not set |
98 | # CONFIG_ARCH_L7200 is not set | 111 | # CONFIG_ARCH_L7200 is not set |
112 | CONFIG_ARCH_PNX4008=y | ||
99 | # CONFIG_ARCH_PXA is not set | 113 | # CONFIG_ARCH_PXA is not set |
100 | # CONFIG_ARCH_RPC is not set | 114 | # CONFIG_ARCH_RPC is not set |
101 | # CONFIG_ARCH_SA1100 is not set | 115 | # CONFIG_ARCH_SA1100 is not set |
@@ -103,13 +117,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
103 | # CONFIG_ARCH_SHARK is not set | 117 | # CONFIG_ARCH_SHARK is not set |
104 | # CONFIG_ARCH_LH7A40X is not set | 118 | # CONFIG_ARCH_LH7A40X is not set |
105 | # CONFIG_ARCH_OMAP is not set | 119 | # CONFIG_ARCH_OMAP is not set |
106 | # CONFIG_ARCH_VERSATILE is not set | ||
107 | # CONFIG_ARCH_REALVIEW is not set | ||
108 | # CONFIG_ARCH_IMX is not set | ||
109 | # CONFIG_ARCH_H720X is not set | ||
110 | # CONFIG_ARCH_AAEC2000 is not set | ||
111 | # CONFIG_ARCH_AT91RM9200 is not set | ||
112 | CONFIG_ARCH_PNX4008=y | ||
113 | 120 | ||
114 | # | 121 | # |
115 | # Processor Type | 122 | # Processor Type |
@@ -138,15 +145,7 @@ CONFIG_ARM_THUMB=y | |||
138 | # | 145 | # |
139 | # PCCARD (PCMCIA/CardBus) support | 146 | # PCCARD (PCMCIA/CardBus) support |
140 | # | 147 | # |
141 | CONFIG_PCCARD=m | 148 | # CONFIG_PCCARD is not set |
142 | # CONFIG_PCMCIA_DEBUG is not set | ||
143 | CONFIG_PCMCIA=m | ||
144 | CONFIG_PCMCIA_LOAD_CIS=y | ||
145 | CONFIG_PCMCIA_IOCTL=y | ||
146 | |||
147 | # | ||
148 | # PC-card bridges | ||
149 | # | ||
150 | 149 | ||
151 | # | 150 | # |
152 | # Kernel Features | 151 | # Kernel Features |
@@ -164,13 +163,14 @@ CONFIG_FLATMEM=y | |||
164 | CONFIG_FLAT_NODE_MEM_MAP=y | 163 | CONFIG_FLAT_NODE_MEM_MAP=y |
165 | # CONFIG_SPARSEMEM_STATIC is not set | 164 | # CONFIG_SPARSEMEM_STATIC is not set |
166 | CONFIG_SPLIT_PTLOCK_CPUS=4096 | 165 | CONFIG_SPLIT_PTLOCK_CPUS=4096 |
166 | # CONFIG_RESOURCES_64BIT is not set | ||
167 | CONFIG_ALIGNMENT_TRAP=y | 167 | CONFIG_ALIGNMENT_TRAP=y |
168 | 168 | ||
169 | # | 169 | # |
170 | # Boot options | 170 | # Boot options |
171 | # | 171 | # |
172 | CONFIG_ZBOOT_ROM_TEXT=0 | 172 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
173 | CONFIG_ZBOOT_ROM_BSS=0 | 173 | CONFIG_ZBOOT_ROM_BSS=0x0 |
174 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200" | 174 | CONFIG_CMDLINE="mem=64M console=ttyS0,115200" |
175 | # CONFIG_XIP_KERNEL is not set | 175 | # CONFIG_XIP_KERNEL is not set |
176 | 176 | ||
@@ -181,7 +181,8 @@ CONFIG_CMDLINE="mem=64M console=ttyS0,115200" | |||
181 | # | 181 | # |
182 | # At least one emulation must be selected | 182 | # At least one emulation must be selected |
183 | # | 183 | # |
184 | # CONFIG_FPE_NWFPE is not set | 184 | CONFIG_FPE_NWFPE=y |
185 | # CONFIG_FPE_NWFPE_XP is not set | ||
185 | # CONFIG_FPE_FASTFPE is not set | 186 | # CONFIG_FPE_FASTFPE is not set |
186 | # CONFIG_VFP is not set | 187 | # CONFIG_VFP is not set |
187 | 188 | ||
@@ -199,7 +200,7 @@ CONFIG_BINFMT_MISC=m | |||
199 | CONFIG_PM=y | 200 | CONFIG_PM=y |
200 | CONFIG_PM_LEGACY=y | 201 | CONFIG_PM_LEGACY=y |
201 | # CONFIG_PM_DEBUG is not set | 202 | # CONFIG_PM_DEBUG is not set |
202 | CONFIG_APM=m | 203 | # CONFIG_APM is not set |
203 | 204 | ||
204 | # | 205 | # |
205 | # Networking | 206 | # Networking |
@@ -210,12 +211,12 @@ CONFIG_NET=y | |||
210 | # Networking options | 211 | # Networking options |
211 | # | 212 | # |
212 | # CONFIG_NETDEBUG is not set | 213 | # CONFIG_NETDEBUG is not set |
213 | CONFIG_PACKET=m | 214 | CONFIG_PACKET=y |
214 | CONFIG_PACKET_MMAP=y | 215 | CONFIG_PACKET_MMAP=y |
215 | CONFIG_UNIX=m | 216 | CONFIG_UNIX=y |
216 | CONFIG_XFRM=y | 217 | CONFIG_XFRM=y |
217 | CONFIG_XFRM_USER=m | 218 | # CONFIG_XFRM_USER is not set |
218 | CONFIG_NET_KEY=m | 219 | # CONFIG_NET_KEY is not set |
219 | CONFIG_INET=y | 220 | CONFIG_INET=y |
220 | CONFIG_IP_MULTICAST=y | 221 | CONFIG_IP_MULTICAST=y |
221 | CONFIG_IP_ADVANCED_ROUTER=y | 222 | CONFIG_IP_ADVANCED_ROUTER=y |
@@ -227,10 +228,12 @@ CONFIG_IP_ROUTE_FWMARK=y | |||
227 | CONFIG_IP_ROUTE_MULTIPATH=y | 228 | CONFIG_IP_ROUTE_MULTIPATH=y |
228 | # CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set | 229 | # CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set |
229 | CONFIG_IP_ROUTE_VERBOSE=y | 230 | CONFIG_IP_ROUTE_VERBOSE=y |
230 | # CONFIG_IP_PNP is not set | 231 | CONFIG_IP_PNP=y |
231 | CONFIG_NET_IPIP=m | 232 | CONFIG_IP_PNP_DHCP=y |
232 | CONFIG_NET_IPGRE=m | 233 | CONFIG_IP_PNP_BOOTP=y |
233 | CONFIG_NET_IPGRE_BROADCAST=y | 234 | # CONFIG_IP_PNP_RARP is not set |
235 | # CONFIG_NET_IPIP is not set | ||
236 | # CONFIG_NET_IPGRE is not set | ||
234 | CONFIG_IP_MROUTE=y | 237 | CONFIG_IP_MROUTE=y |
235 | CONFIG_IP_PIMSM_V1=y | 238 | CONFIG_IP_PIMSM_V1=y |
236 | CONFIG_IP_PIMSM_V2=y | 239 | CONFIG_IP_PIMSM_V2=y |
@@ -241,6 +244,8 @@ CONFIG_INET_ESP=m | |||
241 | CONFIG_INET_IPCOMP=m | 244 | CONFIG_INET_IPCOMP=m |
242 | CONFIG_INET_XFRM_TUNNEL=m | 245 | CONFIG_INET_XFRM_TUNNEL=m |
243 | CONFIG_INET_TUNNEL=m | 246 | CONFIG_INET_TUNNEL=m |
247 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
248 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
244 | CONFIG_INET_DIAG=y | 249 | CONFIG_INET_DIAG=y |
245 | CONFIG_INET_TCP_DIAG=y | 250 | CONFIG_INET_TCP_DIAG=y |
246 | # CONFIG_TCP_CONG_ADVANCED is not set | 251 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -287,7 +292,10 @@ CONFIG_INET6_ESP=m | |||
287 | CONFIG_INET6_IPCOMP=m | 292 | CONFIG_INET6_IPCOMP=m |
288 | CONFIG_INET6_XFRM_TUNNEL=m | 293 | CONFIG_INET6_XFRM_TUNNEL=m |
289 | CONFIG_INET6_TUNNEL=m | 294 | CONFIG_INET6_TUNNEL=m |
295 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
296 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
290 | CONFIG_IPV6_TUNNEL=m | 297 | CONFIG_IPV6_TUNNEL=m |
298 | # CONFIG_NETWORK_SECMARK is not set | ||
291 | CONFIG_NETFILTER=y | 299 | CONFIG_NETFILTER=y |
292 | # CONFIG_NETFILTER_DEBUG is not set | 300 | # CONFIG_NETFILTER_DEBUG is not set |
293 | CONFIG_BRIDGE_NETFILTER=y | 301 | CONFIG_BRIDGE_NETFILTER=y |
@@ -313,6 +321,7 @@ CONFIG_IP_NF_TFTP=m | |||
313 | CONFIG_IP_NF_AMANDA=m | 321 | CONFIG_IP_NF_AMANDA=m |
314 | # CONFIG_IP_NF_PPTP is not set | 322 | # CONFIG_IP_NF_PPTP is not set |
315 | # CONFIG_IP_NF_H323 is not set | 323 | # CONFIG_IP_NF_H323 is not set |
324 | # CONFIG_IP_NF_SIP is not set | ||
316 | CONFIG_IP_NF_QUEUE=m | 325 | CONFIG_IP_NF_QUEUE=m |
317 | 326 | ||
318 | # | 327 | # |
@@ -384,7 +393,7 @@ CONFIG_LLC2=m | |||
384 | CONFIG_IPX=m | 393 | CONFIG_IPX=m |
385 | # CONFIG_IPX_INTERN is not set | 394 | # CONFIG_IPX_INTERN is not set |
386 | CONFIG_ATALK=m | 395 | CONFIG_ATALK=m |
387 | CONFIG_DEV_APPLETALK=y | 396 | CONFIG_DEV_APPLETALK=m |
388 | CONFIG_IPDDP=m | 397 | CONFIG_IPDDP=m |
389 | CONFIG_IPDDP_ENCAP=y | 398 | CONFIG_IPDDP_ENCAP=y |
390 | CONFIG_IPDDP_DECAP=y | 399 | CONFIG_IPDDP_DECAP=y |
@@ -445,110 +454,9 @@ CONFIG_NET_ESTIMATOR=y | |||
445 | # Network testing | 454 | # Network testing |
446 | # | 455 | # |
447 | CONFIG_NET_PKTGEN=m | 456 | CONFIG_NET_PKTGEN=m |
448 | CONFIG_HAMRADIO=y | 457 | # CONFIG_HAMRADIO is not set |
449 | 458 | # CONFIG_IRDA is not set | |
450 | # | 459 | # CONFIG_BT is not set |
451 | # Packet Radio protocols | ||
452 | # | ||
453 | CONFIG_AX25=m | ||
454 | # CONFIG_AX25_DAMA_SLAVE is not set | ||
455 | CONFIG_NETROM=m | ||
456 | CONFIG_ROSE=m | ||
457 | |||
458 | # | ||
459 | # AX.25 network device drivers | ||
460 | # | ||
461 | CONFIG_MKISS=m | ||
462 | CONFIG_6PACK=m | ||
463 | CONFIG_BPQETHER=m | ||
464 | CONFIG_BAYCOM_SER_FDX=m | ||
465 | CONFIG_BAYCOM_SER_HDX=m | ||
466 | CONFIG_BAYCOM_PAR=m | ||
467 | CONFIG_BAYCOM_EPP=m | ||
468 | CONFIG_YAM=m | ||
469 | CONFIG_IRDA=m | ||
470 | |||
471 | # | ||
472 | # IrDA protocols | ||
473 | # | ||
474 | CONFIG_IRLAN=m | ||
475 | CONFIG_IRNET=m | ||
476 | CONFIG_IRCOMM=m | ||
477 | # CONFIG_IRDA_ULTRA is not set | ||
478 | |||
479 | # | ||
480 | # IrDA options | ||
481 | # | ||
482 | CONFIG_IRDA_CACHE_LAST_LSAP=y | ||
483 | CONFIG_IRDA_FAST_RR=y | ||
484 | CONFIG_IRDA_DEBUG=y | ||
485 | |||
486 | # | ||
487 | # Infrared-port device drivers | ||
488 | # | ||
489 | |||
490 | # | ||
491 | # SIR device drivers | ||
492 | # | ||
493 | CONFIG_IRTTY_SIR=m | ||
494 | |||
495 | # | ||
496 | # Dongle support | ||
497 | # | ||
498 | CONFIG_DONGLE=y | ||
499 | CONFIG_ESI_DONGLE=m | ||
500 | CONFIG_ACTISYS_DONGLE=m | ||
501 | CONFIG_TEKRAM_DONGLE=m | ||
502 | # CONFIG_TOIM3232_DONGLE is not set | ||
503 | CONFIG_LITELINK_DONGLE=m | ||
504 | CONFIG_MA600_DONGLE=m | ||
505 | CONFIG_GIRBIL_DONGLE=m | ||
506 | CONFIG_MCP2120_DONGLE=m | ||
507 | CONFIG_OLD_BELKIN_DONGLE=m | ||
508 | CONFIG_ACT200L_DONGLE=m | ||
509 | |||
510 | # | ||
511 | # Old SIR device drivers | ||
512 | # | ||
513 | CONFIG_IRPORT_SIR=m | ||
514 | |||
515 | # | ||
516 | # Old Serial dongle support | ||
517 | # | ||
518 | # CONFIG_DONGLE_OLD is not set | ||
519 | |||
520 | # | ||
521 | # FIR device drivers | ||
522 | # | ||
523 | CONFIG_USB_IRDA=m | ||
524 | CONFIG_SIGMATEL_FIR=m | ||
525 | CONFIG_BT=m | ||
526 | CONFIG_BT_L2CAP=m | ||
527 | CONFIG_BT_SCO=m | ||
528 | CONFIG_BT_RFCOMM=m | ||
529 | CONFIG_BT_RFCOMM_TTY=y | ||
530 | CONFIG_BT_BNEP=m | ||
531 | CONFIG_BT_BNEP_MC_FILTER=y | ||
532 | CONFIG_BT_BNEP_PROTO_FILTER=y | ||
533 | CONFIG_BT_CMTP=m | ||
534 | CONFIG_BT_HIDP=m | ||
535 | |||
536 | # | ||
537 | # Bluetooth device drivers | ||
538 | # | ||
539 | CONFIG_BT_HCIUSB=m | ||
540 | CONFIG_BT_HCIUSB_SCO=y | ||
541 | CONFIG_BT_HCIUART=m | ||
542 | CONFIG_BT_HCIUART_H4=y | ||
543 | CONFIG_BT_HCIUART_BCSP=y | ||
544 | CONFIG_BT_HCIBCM203X=m | ||
545 | # CONFIG_BT_HCIBPA10X is not set | ||
546 | CONFIG_BT_HCIBFUSB=m | ||
547 | CONFIG_BT_HCIDTL1=m | ||
548 | CONFIG_BT_HCIBT3C=m | ||
549 | CONFIG_BT_HCIBLUECARD=m | ||
550 | CONFIG_BT_HCIBTUART=m | ||
551 | CONFIG_BT_HCIVHCI=m | ||
552 | CONFIG_IEEE80211=m | 460 | CONFIG_IEEE80211=m |
553 | # CONFIG_IEEE80211_DEBUG is not set | 461 | # CONFIG_IEEE80211_DEBUG is not set |
554 | # CONFIG_IEEE80211_CRYPT_WEP is not set | 462 | # CONFIG_IEEE80211_CRYPT_WEP is not set |
@@ -566,8 +474,9 @@ CONFIG_WIRELESS_EXT=y | |||
566 | # | 474 | # |
567 | CONFIG_STANDALONE=y | 475 | CONFIG_STANDALONE=y |
568 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 476 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
569 | CONFIG_FW_LOADER=m | 477 | CONFIG_FW_LOADER=y |
570 | # CONFIG_DEBUG_DRIVER is not set | 478 | # CONFIG_DEBUG_DRIVER is not set |
479 | # CONFIG_SYS_HYPERVISOR is not set | ||
571 | 480 | ||
572 | # | 481 | # |
573 | # Connector - unified userspace <-> kernelspace linker | 482 | # Connector - unified userspace <-> kernelspace linker |
@@ -577,11 +486,11 @@ CONFIG_FW_LOADER=m | |||
577 | # | 486 | # |
578 | # Memory Technology Devices (MTD) | 487 | # Memory Technology Devices (MTD) |
579 | # | 488 | # |
580 | CONFIG_MTD=m | 489 | CONFIG_MTD=y |
581 | # CONFIG_MTD_DEBUG is not set | 490 | # CONFIG_MTD_DEBUG is not set |
582 | CONFIG_MTD_CONCAT=m | 491 | CONFIG_MTD_CONCAT=y |
583 | CONFIG_MTD_PARTITIONS=y | 492 | CONFIG_MTD_PARTITIONS=y |
584 | CONFIG_MTD_REDBOOT_PARTS=m | 493 | CONFIG_MTD_REDBOOT_PARTS=y |
585 | CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 | 494 | CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 |
586 | # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set | 495 | # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set |
587 | # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set | 496 | # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set |
@@ -591,22 +500,18 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 | |||
591 | # | 500 | # |
592 | # User Modules And Translation Layers | 501 | # User Modules And Translation Layers |
593 | # | 502 | # |
594 | CONFIG_MTD_CHAR=m | 503 | CONFIG_MTD_CHAR=y |
595 | CONFIG_MTD_BLOCK=m | 504 | CONFIG_MTD_BLOCK=y |
596 | CONFIG_MTD_BLOCK_RO=m | 505 | # CONFIG_FTL is not set |
597 | CONFIG_FTL=m | 506 | # CONFIG_NFTL is not set |
598 | CONFIG_NFTL=m | 507 | # CONFIG_INFTL is not set |
599 | CONFIG_NFTL_RW=y | ||
600 | CONFIG_INFTL=m | ||
601 | # CONFIG_RFD_FTL is not set | 508 | # CONFIG_RFD_FTL is not set |
602 | 509 | ||
603 | # | 510 | # |
604 | # RAM/ROM/Flash chip drivers | 511 | # RAM/ROM/Flash chip drivers |
605 | # | 512 | # |
606 | CONFIG_MTD_CFI=m | 513 | # CONFIG_MTD_CFI is not set |
607 | CONFIG_MTD_JEDECPROBE=m | 514 | # CONFIG_MTD_JEDECPROBE is not set |
608 | CONFIG_MTD_GEN_PROBE=m | ||
609 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
610 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | 515 | CONFIG_MTD_MAP_BANK_WIDTH_1=y |
611 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | 516 | CONFIG_MTD_MAP_BANK_WIDTH_2=y |
612 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | 517 | CONFIG_MTD_MAP_BANK_WIDTH_4=y |
@@ -617,36 +522,27 @@ CONFIG_MTD_CFI_I1=y | |||
617 | CONFIG_MTD_CFI_I2=y | 522 | CONFIG_MTD_CFI_I2=y |
618 | # CONFIG_MTD_CFI_I4 is not set | 523 | # CONFIG_MTD_CFI_I4 is not set |
619 | # CONFIG_MTD_CFI_I8 is not set | 524 | # CONFIG_MTD_CFI_I8 is not set |
620 | CONFIG_MTD_CFI_INTELEXT=m | 525 | # CONFIG_MTD_RAM is not set |
621 | CONFIG_MTD_CFI_AMDSTD=m | 526 | # CONFIG_MTD_ROM is not set |
622 | CONFIG_MTD_CFI_STAA=m | 527 | # CONFIG_MTD_ABSENT is not set |
623 | CONFIG_MTD_CFI_UTIL=m | ||
624 | CONFIG_MTD_RAM=m | ||
625 | CONFIG_MTD_ROM=m | ||
626 | CONFIG_MTD_ABSENT=m | ||
627 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | 528 | # CONFIG_MTD_OBSOLETE_CHIPS is not set |
628 | 529 | ||
629 | # | 530 | # |
630 | # Mapping drivers for chip access | 531 | # Mapping drivers for chip access |
631 | # | 532 | # |
632 | CONFIG_MTD_COMPLEX_MAPPINGS=y | 533 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set |
633 | CONFIG_MTD_PHYSMAP=m | ||
634 | CONFIG_MTD_PHYSMAP_START=0x8000000 | ||
635 | CONFIG_MTD_PHYSMAP_LEN=0x4000000 | ||
636 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
637 | # CONFIG_MTD_ARM_INTEGRATOR is not set | ||
638 | # CONFIG_MTD_IMPA7 is not set | ||
639 | # CONFIG_MTD_PLATRAM is not set | 534 | # CONFIG_MTD_PLATRAM is not set |
640 | 535 | ||
641 | # | 536 | # |
642 | # Self-contained MTD device drivers | 537 | # Self-contained MTD device drivers |
643 | # | 538 | # |
539 | # CONFIG_MTD_DATAFLASH is not set | ||
540 | # CONFIG_MTD_M25P80 is not set | ||
644 | CONFIG_MTD_SLRAM=m | 541 | CONFIG_MTD_SLRAM=m |
645 | CONFIG_MTD_PHRAM=m | 542 | CONFIG_MTD_PHRAM=m |
646 | CONFIG_MTD_MTDRAM=m | 543 | CONFIG_MTD_MTDRAM=m |
647 | CONFIG_MTDRAM_TOTAL_SIZE=4096 | 544 | CONFIG_MTDRAM_TOTAL_SIZE=4096 |
648 | CONFIG_MTDRAM_ERASE_SIZE=128 | 545 | CONFIG_MTDRAM_ERASE_SIZE=128 |
649 | CONFIG_MTD_BLKMTD=m | ||
650 | # CONFIG_MTD_BLOCK2MTD is not set | 546 | # CONFIG_MTD_BLOCK2MTD is not set |
651 | 547 | ||
652 | # | 548 | # |
@@ -663,14 +559,12 @@ CONFIG_MTD_DOCPROBE_ADDRESS=0 | |||
663 | # | 559 | # |
664 | # NAND Flash Device Drivers | 560 | # NAND Flash Device Drivers |
665 | # | 561 | # |
666 | CONFIG_MTD_NAND=m | 562 | CONFIG_MTD_NAND=y |
667 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set | 563 | # CONFIG_MTD_NAND_VERIFY_WRITE is not set |
668 | CONFIG_MTD_NAND_IDS=m | 564 | # CONFIG_MTD_NAND_ECC_SMC is not set |
669 | CONFIG_MTD_NAND_DISKONCHIP=m | 565 | CONFIG_MTD_NAND_IDS=y |
670 | # CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set | 566 | # CONFIG_MTD_NAND_DISKONCHIP is not set |
671 | CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 | 567 | CONFIG_MTD_NAND_NANDSIM=m |
672 | # CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set | ||
673 | # CONFIG_MTD_NAND_NANDSIM is not set | ||
674 | 568 | ||
675 | # | 569 | # |
676 | # OneNAND Flash Device Drivers | 570 | # OneNAND Flash Device Drivers |
@@ -680,15 +574,7 @@ CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 | |||
680 | # | 574 | # |
681 | # Parallel port support | 575 | # Parallel port support |
682 | # | 576 | # |
683 | CONFIG_PARPORT=m | 577 | # CONFIG_PARPORT is not set |
684 | CONFIG_PARPORT_PC=m | ||
685 | CONFIG_PARPORT_PC_FIFO=y | ||
686 | # CONFIG_PARPORT_PC_SUPERIO is not set | ||
687 | CONFIG_PARPORT_PC_PCMCIA=m | ||
688 | CONFIG_PARPORT_NOT_PC=y | ||
689 | # CONFIG_PARPORT_ARC is not set | ||
690 | # CONFIG_PARPORT_GSC is not set | ||
691 | CONFIG_PARPORT_1284=y | ||
692 | 578 | ||
693 | # | 579 | # |
694 | # Plug and Play support | 580 | # Plug and Play support |
@@ -697,45 +583,15 @@ CONFIG_PARPORT_1284=y | |||
697 | # | 583 | # |
698 | # Block devices | 584 | # Block devices |
699 | # | 585 | # |
700 | CONFIG_PARIDE=m | ||
701 | CONFIG_PARIDE_PARPORT=m | ||
702 | |||
703 | # | ||
704 | # Parallel IDE high-level drivers | ||
705 | # | ||
706 | CONFIG_PARIDE_PD=m | ||
707 | CONFIG_PARIDE_PCD=m | ||
708 | CONFIG_PARIDE_PF=m | ||
709 | CONFIG_PARIDE_PT=m | ||
710 | CONFIG_PARIDE_PG=m | ||
711 | |||
712 | # | ||
713 | # Parallel IDE protocol modules | ||
714 | # | ||
715 | CONFIG_PARIDE_ATEN=m | ||
716 | CONFIG_PARIDE_BPCK=m | ||
717 | CONFIG_PARIDE_BPCK6=m | ||
718 | CONFIG_PARIDE_COMM=m | ||
719 | CONFIG_PARIDE_DSTR=m | ||
720 | CONFIG_PARIDE_FIT2=m | ||
721 | CONFIG_PARIDE_FIT3=m | ||
722 | CONFIG_PARIDE_EPAT=m | ||
723 | # CONFIG_PARIDE_EPATC8 is not set | ||
724 | CONFIG_PARIDE_EPIA=m | ||
725 | CONFIG_PARIDE_FRIQ=m | ||
726 | CONFIG_PARIDE_FRPW=m | ||
727 | CONFIG_PARIDE_KBIC=m | ||
728 | CONFIG_PARIDE_KTTI=m | ||
729 | CONFIG_PARIDE_ON20=m | ||
730 | CONFIG_PARIDE_ON26=m | ||
731 | # CONFIG_BLK_DEV_COW_COMMON is not set | 586 | # CONFIG_BLK_DEV_COW_COMMON is not set |
732 | CONFIG_BLK_DEV_LOOP=m | 587 | CONFIG_BLK_DEV_LOOP=y |
733 | CONFIG_BLK_DEV_CRYPTOLOOP=m | 588 | CONFIG_BLK_DEV_CRYPTOLOOP=y |
734 | CONFIG_BLK_DEV_NBD=m | 589 | CONFIG_BLK_DEV_NBD=y |
735 | # CONFIG_BLK_DEV_UB is not set | 590 | # CONFIG_BLK_DEV_UB is not set |
736 | CONFIG_BLK_DEV_RAM=y | 591 | CONFIG_BLK_DEV_RAM=y |
737 | CONFIG_BLK_DEV_RAM_COUNT=16 | 592 | CONFIG_BLK_DEV_RAM_COUNT=16 |
738 | CONFIG_BLK_DEV_RAM_SIZE=8192 | 593 | CONFIG_BLK_DEV_RAM_SIZE=8192 |
594 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
739 | CONFIG_BLK_DEV_INITRD=y | 595 | CONFIG_BLK_DEV_INITRD=y |
740 | CONFIG_CDROM_PKTCDVD=m | 596 | CONFIG_CDROM_PKTCDVD=m |
741 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | 597 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 |
@@ -743,34 +599,6 @@ CONFIG_CDROM_PKTCDVD_BUFFERS=8 | |||
743 | # CONFIG_ATA_OVER_ETH is not set | 599 | # CONFIG_ATA_OVER_ETH is not set |
744 | 600 | ||
745 | # | 601 | # |
746 | # ATA/ATAPI/MFM/RLL support | ||
747 | # | ||
748 | CONFIG_IDE=m | ||
749 | CONFIG_BLK_DEV_IDE=m | ||
750 | |||
751 | # | ||
752 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
753 | # | ||
754 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
755 | CONFIG_BLK_DEV_IDEDISK=m | ||
756 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
757 | CONFIG_BLK_DEV_IDECS=m | ||
758 | CONFIG_BLK_DEV_IDECD=m | ||
759 | CONFIG_BLK_DEV_IDETAPE=m | ||
760 | CONFIG_BLK_DEV_IDEFLOPPY=m | ||
761 | CONFIG_BLK_DEV_IDESCSI=m | ||
762 | # CONFIG_IDE_TASK_IOCTL is not set | ||
763 | |||
764 | # | ||
765 | # IDE chipset support/bugfixes | ||
766 | # | ||
767 | CONFIG_IDE_GENERIC=m | ||
768 | # CONFIG_IDE_ARM is not set | ||
769 | # CONFIG_BLK_DEV_IDEDMA is not set | ||
770 | # CONFIG_IDEDMA_AUTO is not set | ||
771 | # CONFIG_BLK_DEV_HD is not set | ||
772 | |||
773 | # | ||
774 | # SCSI device support | 602 | # SCSI device support |
775 | # | 603 | # |
776 | # CONFIG_RAID_ATTRS is not set | 604 | # CONFIG_RAID_ATTRS is not set |
@@ -808,41 +636,12 @@ CONFIG_SCSI_FC_ATTRS=m | |||
808 | # | 636 | # |
809 | # CONFIG_ISCSI_TCP is not set | 637 | # CONFIG_ISCSI_TCP is not set |
810 | CONFIG_SCSI_SATA=m | 638 | CONFIG_SCSI_SATA=m |
811 | CONFIG_SCSI_PPA=m | ||
812 | CONFIG_SCSI_IMM=m | ||
813 | # CONFIG_SCSI_IZIP_EPP16 is not set | ||
814 | # CONFIG_SCSI_IZIP_SLOW_CTR is not set | ||
815 | CONFIG_SCSI_DEBUG=m | 639 | CONFIG_SCSI_DEBUG=m |
816 | 640 | ||
817 | # | 641 | # |
818 | # PCMCIA SCSI adapter support | ||
819 | # | ||
820 | CONFIG_PCMCIA_AHA152X=m | ||
821 | CONFIG_PCMCIA_FDOMAIN=m | ||
822 | CONFIG_PCMCIA_NINJA_SCSI=m | ||
823 | CONFIG_PCMCIA_QLOGIC=m | ||
824 | CONFIG_PCMCIA_SYM53C500=m | ||
825 | |||
826 | # | ||
827 | # Multi-device support (RAID and LVM) | 642 | # Multi-device support (RAID and LVM) |
828 | # | 643 | # |
829 | CONFIG_MD=y | 644 | # CONFIG_MD is not set |
830 | CONFIG_BLK_DEV_MD=m | ||
831 | CONFIG_MD_LINEAR=m | ||
832 | CONFIG_MD_RAID0=m | ||
833 | CONFIG_MD_RAID1=m | ||
834 | CONFIG_MD_RAID10=m | ||
835 | CONFIG_MD_RAID5=m | ||
836 | # CONFIG_MD_RAID5_RESHAPE is not set | ||
837 | CONFIG_MD_RAID6=m | ||
838 | CONFIG_MD_MULTIPATH=m | ||
839 | CONFIG_MD_FAULTY=m | ||
840 | CONFIG_BLK_DEV_DM=m | ||
841 | CONFIG_DM_CRYPT=m | ||
842 | CONFIG_DM_SNAPSHOT=m | ||
843 | CONFIG_DM_MIRROR=m | ||
844 | CONFIG_DM_ZERO=m | ||
845 | # CONFIG_DM_MULTIPATH is not set | ||
846 | 645 | ||
847 | # | 646 | # |
848 | # Fusion MPT device support | 647 | # Fusion MPT device support |
@@ -878,9 +677,6 @@ CONFIG_NET_ETHERNET=y | |||
878 | CONFIG_MII=m | 677 | CONFIG_MII=m |
879 | # CONFIG_SMC91X is not set | 678 | # CONFIG_SMC91X is not set |
880 | # CONFIG_DM9000 is not set | 679 | # CONFIG_DM9000 is not set |
881 | CONFIG_NET_POCKET=y | ||
882 | CONFIG_DE600=m | ||
883 | CONFIG_DE620=m | ||
884 | 680 | ||
885 | # | 681 | # |
886 | # Ethernet (1000 Mbit) | 682 | # Ethernet (1000 Mbit) |
@@ -904,49 +700,13 @@ CONFIG_NET_RADIO=y | |||
904 | # Obsolete Wireless cards support (pre-802.11) | 700 | # Obsolete Wireless cards support (pre-802.11) |
905 | # | 701 | # |
906 | CONFIG_STRIP=m | 702 | CONFIG_STRIP=m |
907 | CONFIG_PCMCIA_WAVELAN=m | 703 | # CONFIG_USB_ZD1201 is not set |
908 | CONFIG_PCMCIA_NETWAVE=m | ||
909 | |||
910 | # | ||
911 | # Wireless 802.11 Frequency Hopping cards support | ||
912 | # | ||
913 | CONFIG_PCMCIA_RAYCS=m | ||
914 | |||
915 | # | ||
916 | # Wireless 802.11b ISA/PCI cards support | ||
917 | # | ||
918 | CONFIG_HERMES=m | ||
919 | CONFIG_ATMEL=m | ||
920 | |||
921 | # | ||
922 | # Wireless 802.11b Pcmcia/Cardbus cards support | ||
923 | # | ||
924 | CONFIG_PCMCIA_HERMES=m | ||
925 | # CONFIG_PCMCIA_SPECTRUM is not set | ||
926 | CONFIG_AIRO_CS=m | ||
927 | CONFIG_PCMCIA_ATMEL=m | ||
928 | CONFIG_PCMCIA_WL3501=m | ||
929 | # CONFIG_HOSTAP is not set | 704 | # CONFIG_HOSTAP is not set |
930 | CONFIG_NET_WIRELESS=y | ||
931 | |||
932 | # | ||
933 | # PCMCIA network device support | ||
934 | # | ||
935 | CONFIG_NET_PCMCIA=y | ||
936 | CONFIG_PCMCIA_3C589=m | ||
937 | CONFIG_PCMCIA_3C574=m | ||
938 | CONFIG_PCMCIA_FMVJ18X=m | ||
939 | CONFIG_PCMCIA_PCNET=m | ||
940 | CONFIG_PCMCIA_NMCLAN=m | ||
941 | CONFIG_PCMCIA_SMC91C92=m | ||
942 | CONFIG_PCMCIA_XIRC2PS=m | ||
943 | CONFIG_PCMCIA_AXNET=m | ||
944 | 705 | ||
945 | # | 706 | # |
946 | # Wan interfaces | 707 | # Wan interfaces |
947 | # | 708 | # |
948 | CONFIG_WAN=y | 709 | CONFIG_WAN=y |
949 | CONFIG_SYNCLINK_SYNCPPP=m | ||
950 | CONFIG_HDLC=m | 710 | CONFIG_HDLC=m |
951 | CONFIG_HDLC_RAW=y | 711 | CONFIG_HDLC_RAW=y |
952 | CONFIG_HDLC_RAW_ETH=y | 712 | CONFIG_HDLC_RAW_ETH=y |
@@ -966,7 +726,6 @@ CONFIG_X25_ASY=m | |||
966 | # | 726 | # |
967 | # CONFIG_ATM_DUMMY is not set | 727 | # CONFIG_ATM_DUMMY is not set |
968 | CONFIG_ATM_TCP=m | 728 | CONFIG_ATM_TCP=m |
969 | CONFIG_PLIP=m | ||
970 | CONFIG_PPP=m | 729 | CONFIG_PPP=m |
971 | CONFIG_PPP_MULTILINK=y | 730 | CONFIG_PPP_MULTILINK=y |
972 | CONFIG_PPP_FILTER=y | 731 | CONFIG_PPP_FILTER=y |
@@ -991,114 +750,7 @@ CONFIG_NET_POLL_CONTROLLER=y | |||
991 | # | 750 | # |
992 | # ISDN subsystem | 751 | # ISDN subsystem |
993 | # | 752 | # |
994 | CONFIG_ISDN=m | 753 | # CONFIG_ISDN is not set |
995 | |||
996 | # | ||
997 | # Old ISDN4Linux | ||
998 | # | ||
999 | CONFIG_ISDN_I4L=m | ||
1000 | CONFIG_ISDN_PPP=y | ||
1001 | CONFIG_ISDN_PPP_VJ=y | ||
1002 | CONFIG_ISDN_MPP=y | ||
1003 | CONFIG_IPPP_FILTER=y | ||
1004 | CONFIG_ISDN_PPP_BSDCOMP=m | ||
1005 | CONFIG_ISDN_AUDIO=y | ||
1006 | CONFIG_ISDN_TTY_FAX=y | ||
1007 | CONFIG_ISDN_X25=y | ||
1008 | |||
1009 | # | ||
1010 | # ISDN feature submodules | ||
1011 | # | ||
1012 | CONFIG_ISDN_DRV_LOOP=m | ||
1013 | CONFIG_ISDN_DIVERSION=m | ||
1014 | |||
1015 | # | ||
1016 | # ISDN4Linux hardware drivers | ||
1017 | # | ||
1018 | |||
1019 | # | ||
1020 | # Passive cards | ||
1021 | # | ||
1022 | CONFIG_ISDN_DRV_HISAX=m | ||
1023 | |||
1024 | # | ||
1025 | # D-channel protocol features | ||
1026 | # | ||
1027 | CONFIG_HISAX_EURO=y | ||
1028 | CONFIG_DE_AOC=y | ||
1029 | # CONFIG_HISAX_NO_SENDCOMPLETE is not set | ||
1030 | # CONFIG_HISAX_NO_LLC is not set | ||
1031 | # CONFIG_HISAX_NO_KEYPAD is not set | ||
1032 | CONFIG_HISAX_1TR6=y | ||
1033 | CONFIG_HISAX_NI1=y | ||
1034 | CONFIG_HISAX_MAX_CARDS=8 | ||
1035 | |||
1036 | # | ||
1037 | # HiSax supported cards | ||
1038 | # | ||
1039 | CONFIG_HISAX_16_3=y | ||
1040 | CONFIG_HISAX_S0BOX=y | ||
1041 | CONFIG_HISAX_FRITZPCI=y | ||
1042 | CONFIG_HISAX_AVM_A1_PCMCIA=y | ||
1043 | CONFIG_HISAX_ELSA=y | ||
1044 | CONFIG_HISAX_DIEHLDIVA=y | ||
1045 | CONFIG_HISAX_SEDLBAUER=y | ||
1046 | CONFIG_HISAX_NICCY=y | ||
1047 | CONFIG_HISAX_GAZEL=y | ||
1048 | CONFIG_HISAX_HFC_SX=y | ||
1049 | # CONFIG_HISAX_DEBUG is not set | ||
1050 | |||
1051 | # | ||
1052 | # HiSax PCMCIA card service modules | ||
1053 | # | ||
1054 | CONFIG_HISAX_SEDLBAUER_CS=m | ||
1055 | CONFIG_HISAX_ELSA_CS=m | ||
1056 | CONFIG_HISAX_AVM_A1_CS=m | ||
1057 | CONFIG_HISAX_TELES_CS=m | ||
1058 | |||
1059 | # | ||
1060 | # HiSax sub driver modules | ||
1061 | # | ||
1062 | CONFIG_HISAX_ST5481=m | ||
1063 | CONFIG_HISAX_HFCUSB=m | ||
1064 | # CONFIG_HISAX_HFC4S8S is not set | ||
1065 | CONFIG_HISAX_HDLC=y | ||
1066 | |||
1067 | # | ||
1068 | # Active cards | ||
1069 | # | ||
1070 | |||
1071 | # | ||
1072 | # Siemens Gigaset | ||
1073 | # | ||
1074 | # CONFIG_ISDN_DRV_GIGASET is not set | ||
1075 | |||
1076 | # | ||
1077 | # CAPI subsystem | ||
1078 | # | ||
1079 | CONFIG_ISDN_CAPI=m | ||
1080 | CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y | ||
1081 | CONFIG_ISDN_CAPI_MIDDLEWARE=y | ||
1082 | CONFIG_ISDN_CAPI_CAPI20=m | ||
1083 | CONFIG_ISDN_CAPI_CAPIFS_BOOL=y | ||
1084 | CONFIG_ISDN_CAPI_CAPIFS=m | ||
1085 | CONFIG_ISDN_CAPI_CAPIDRV=m | ||
1086 | |||
1087 | # | ||
1088 | # CAPI hardware drivers | ||
1089 | # | ||
1090 | |||
1091 | # | ||
1092 | # Active AVM cards | ||
1093 | # | ||
1094 | CONFIG_CAPI_AVM=y | ||
1095 | CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m | ||
1096 | CONFIG_ISDN_DRV_AVMB1_AVM_CS=m | ||
1097 | |||
1098 | # | ||
1099 | # Active Eicon DIVA Server cards | ||
1100 | # | ||
1101 | CONFIG_CAPI_EICON=y | ||
1102 | 754 | ||
1103 | # | 755 | # |
1104 | # Input device support | 756 | # Input device support |
@@ -1108,10 +760,7 @@ CONFIG_INPUT=y | |||
1108 | # | 760 | # |
1109 | # Userland interfaces | 761 | # Userland interfaces |
1110 | # | 762 | # |
1111 | CONFIG_INPUT_MOUSEDEV=m | 763 | # CONFIG_INPUT_MOUSEDEV is not set |
1112 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
1113 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
1114 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
1115 | CONFIG_INPUT_JOYDEV=m | 764 | CONFIG_INPUT_JOYDEV=m |
1116 | CONFIG_INPUT_TSDEV=m | 765 | CONFIG_INPUT_TSDEV=m |
1117 | CONFIG_INPUT_TSDEV_SCREEN_X=240 | 766 | CONFIG_INPUT_TSDEV_SCREEN_X=240 |
@@ -1153,11 +802,9 @@ CONFIG_JOYSTICK_SPACEORB=m | |||
1153 | CONFIG_JOYSTICK_SPACEBALL=m | 802 | CONFIG_JOYSTICK_SPACEBALL=m |
1154 | CONFIG_JOYSTICK_STINGER=m | 803 | CONFIG_JOYSTICK_STINGER=m |
1155 | # CONFIG_JOYSTICK_TWIDJOY is not set | 804 | # CONFIG_JOYSTICK_TWIDJOY is not set |
1156 | CONFIG_JOYSTICK_DB9=m | ||
1157 | CONFIG_JOYSTICK_GAMECON=m | ||
1158 | CONFIG_JOYSTICK_TURBOGRAFX=m | ||
1159 | CONFIG_JOYSTICK_JOYDUMP=m | 805 | CONFIG_JOYSTICK_JOYDUMP=m |
1160 | CONFIG_INPUT_TOUCHSCREEN=y | 806 | CONFIG_INPUT_TOUCHSCREEN=y |
807 | # CONFIG_TOUCHSCREEN_ADS7846 is not set | ||
1161 | CONFIG_TOUCHSCREEN_GUNZE=m | 808 | CONFIG_TOUCHSCREEN_GUNZE=m |
1162 | # CONFIG_TOUCHSCREEN_ELO is not set | 809 | # CONFIG_TOUCHSCREEN_ELO is not set |
1163 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | 810 | # CONFIG_TOUCHSCREEN_MTOUCH is not set |
@@ -1170,7 +817,6 @@ CONFIG_INPUT_UINPUT=m | |||
1170 | # | 817 | # |
1171 | CONFIG_SERIO=y | 818 | CONFIG_SERIO=y |
1172 | CONFIG_SERIO_SERPORT=m | 819 | CONFIG_SERIO_SERPORT=m |
1173 | CONFIG_SERIO_PARKBD=m | ||
1174 | CONFIG_SERIO_LIBPS2=y | 820 | CONFIG_SERIO_LIBPS2=y |
1175 | CONFIG_SERIO_RAW=m | 821 | CONFIG_SERIO_RAW=m |
1176 | CONFIG_GAMEPORT=m | 822 | CONFIG_GAMEPORT=m |
@@ -1183,32 +829,14 @@ CONFIG_GAMEPORT_L4=m | |||
1183 | CONFIG_VT=y | 829 | CONFIG_VT=y |
1184 | CONFIG_VT_CONSOLE=y | 830 | CONFIG_VT_CONSOLE=y |
1185 | CONFIG_HW_CONSOLE=y | 831 | CONFIG_HW_CONSOLE=y |
1186 | CONFIG_SERIAL_NONSTANDARD=y | 832 | # CONFIG_VT_HW_CONSOLE_BINDING is not set |
1187 | CONFIG_COMPUTONE=m | 833 | # CONFIG_SERIAL_NONSTANDARD is not set |
1188 | CONFIG_ROCKETPORT=m | ||
1189 | CONFIG_CYCLADES=m | ||
1190 | # CONFIG_CYZ_INTR is not set | ||
1191 | CONFIG_DIGIEPCA=m | ||
1192 | CONFIG_MOXA_INTELLIO=m | ||
1193 | CONFIG_MOXA_SMARTIO=m | ||
1194 | # CONFIG_ISI is not set | ||
1195 | CONFIG_SYNCLINKMP=m | ||
1196 | CONFIG_N_HDLC=m | ||
1197 | # CONFIG_RISCOM8 is not set | ||
1198 | # CONFIG_SPECIALIX is not set | ||
1199 | CONFIG_SX=m | ||
1200 | CONFIG_RIO=m | ||
1201 | CONFIG_RIO_OLDPCI=y | ||
1202 | CONFIG_STALDRV=y | ||
1203 | CONFIG_STALLION=m | ||
1204 | CONFIG_ISTALLION=m | ||
1205 | 834 | ||
1206 | # | 835 | # |
1207 | # Serial drivers | 836 | # Serial drivers |
1208 | # | 837 | # |
1209 | CONFIG_SERIAL_8250=y | 838 | CONFIG_SERIAL_8250=y |
1210 | CONFIG_SERIAL_8250_CONSOLE=y | 839 | CONFIG_SERIAL_8250_CONSOLE=y |
1211 | CONFIG_SERIAL_8250_CS=m | ||
1212 | CONFIG_SERIAL_8250_NR_UARTS=4 | 840 | CONFIG_SERIAL_8250_NR_UARTS=4 |
1213 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 | 841 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 |
1214 | CONFIG_SERIAL_8250_EXTENDED=y | 842 | CONFIG_SERIAL_8250_EXTENDED=y |
@@ -1225,20 +853,11 @@ CONFIG_SERIAL_CORE_CONSOLE=y | |||
1225 | CONFIG_UNIX98_PTYS=y | 853 | CONFIG_UNIX98_PTYS=y |
1226 | CONFIG_LEGACY_PTYS=y | 854 | CONFIG_LEGACY_PTYS=y |
1227 | CONFIG_LEGACY_PTY_COUNT=256 | 855 | CONFIG_LEGACY_PTY_COUNT=256 |
1228 | CONFIG_PRINTER=m | ||
1229 | # CONFIG_LP_CONSOLE is not set | ||
1230 | CONFIG_PPDEV=m | ||
1231 | CONFIG_TIPAR=m | ||
1232 | 856 | ||
1233 | # | 857 | # |
1234 | # IPMI | 858 | # IPMI |
1235 | # | 859 | # |
1236 | CONFIG_IPMI_HANDLER=m | 860 | # CONFIG_IPMI_HANDLER is not set |
1237 | # CONFIG_IPMI_PANIC_EVENT is not set | ||
1238 | CONFIG_IPMI_DEVICE_INTERFACE=m | ||
1239 | CONFIG_IPMI_SI=m | ||
1240 | CONFIG_IPMI_WATCHDOG=m | ||
1241 | CONFIG_IPMI_POWEROFF=m | ||
1242 | 861 | ||
1243 | # | 862 | # |
1244 | # Watchdog Cards | 863 | # Watchdog Cards |
@@ -1255,22 +874,15 @@ CONFIG_SOFT_WATCHDOG=m | |||
1255 | # USB-based Watchdog Cards | 874 | # USB-based Watchdog Cards |
1256 | # | 875 | # |
1257 | CONFIG_USBPCWATCHDOG=m | 876 | CONFIG_USBPCWATCHDOG=m |
1258 | CONFIG_NVRAM=m | 877 | CONFIG_HW_RANDOM=y |
1259 | CONFIG_DTLK=m | 878 | # CONFIG_NVRAM is not set |
1260 | CONFIG_R3964=m | 879 | # CONFIG_DTLK is not set |
880 | # CONFIG_R3964 is not set | ||
1261 | 881 | ||
1262 | # | 882 | # |
1263 | # Ftape, the floppy tape device driver | 883 | # Ftape, the floppy tape device driver |
1264 | # | 884 | # |
1265 | 885 | # CONFIG_RAW_DRIVER is not set | |
1266 | # | ||
1267 | # PCMCIA character devices | ||
1268 | # | ||
1269 | CONFIG_SYNCLINK_CS=m | ||
1270 | # CONFIG_CARDMAN_4000 is not set | ||
1271 | # CONFIG_CARDMAN_4040 is not set | ||
1272 | CONFIG_RAW_DRIVER=m | ||
1273 | CONFIG_MAX_RAW_DEVS=256 | ||
1274 | 886 | ||
1275 | # | 887 | # |
1276 | # TPM devices | 888 | # TPM devices |
@@ -1281,8 +893,8 @@ CONFIG_MAX_RAW_DEVS=256 | |||
1281 | # | 893 | # |
1282 | # I2C support | 894 | # I2C support |
1283 | # | 895 | # |
1284 | CONFIG_I2C=m | 896 | CONFIG_I2C=y |
1285 | CONFIG_I2C_CHARDEV=m | 897 | CONFIG_I2C_CHARDEV=y |
1286 | 898 | ||
1287 | # | 899 | # |
1288 | # I2C Algorithms | 900 | # I2C Algorithms |
@@ -1294,11 +906,10 @@ CONFIG_I2C_ALGOPCA=m | |||
1294 | # | 906 | # |
1295 | # I2C Hardware Bus support | 907 | # I2C Hardware Bus support |
1296 | # | 908 | # |
1297 | CONFIG_I2C_ISA=m | 909 | # CONFIG_I2C_OCORES is not set |
1298 | CONFIG_I2C_PARPORT=m | 910 | # CONFIG_I2C_PARPORT_LIGHT is not set |
1299 | CONFIG_I2C_PARPORT_LIGHT=m | 911 | # CONFIG_I2C_STUB is not set |
1300 | CONFIG_I2C_STUB=m | 912 | # CONFIG_I2C_PCA_ISA is not set |
1301 | CONFIG_I2C_PCA_ISA=m | ||
1302 | 913 | ||
1303 | # | 914 | # |
1304 | # Miscellaneous I2C Chip support | 915 | # Miscellaneous I2C Chip support |
@@ -1318,66 +929,28 @@ CONFIG_SENSORS_PCF8591=m | |||
1318 | # | 929 | # |
1319 | # SPI support | 930 | # SPI support |
1320 | # | 931 | # |
1321 | # CONFIG_SPI is not set | 932 | CONFIG_SPI=y |
1322 | # CONFIG_SPI_MASTER is not set | 933 | # CONFIG_SPI_DEBUG is not set |
934 | CONFIG_SPI_MASTER=y | ||
1323 | 935 | ||
1324 | # | 936 | # |
1325 | # Dallas's 1-wire bus | 937 | # SPI Master Controller Drivers |
1326 | # | 938 | # |
1327 | CONFIG_W1=m | 939 | CONFIG_SPI_BITBANG=y |
1328 | 940 | ||
1329 | # | 941 | # |
1330 | # 1-wire Bus Masters | 942 | # SPI Protocol Masters |
1331 | # | 943 | # |
1332 | # CONFIG_W1_MASTER_DS9490 is not set | ||
1333 | # CONFIG_W1_MASTER_DS2482 is not set | ||
1334 | 944 | ||
1335 | # | 945 | # |
1336 | # 1-wire Slaves | 946 | # Dallas's 1-wire bus |
1337 | # | 947 | # |
1338 | # CONFIG_W1_SLAVE_THERM is not set | ||
1339 | # CONFIG_W1_SLAVE_SMEM is not set | ||
1340 | # CONFIG_W1_SLAVE_DS2433 is not set | ||
1341 | 948 | ||
1342 | # | 949 | # |
1343 | # Hardware Monitoring support | 950 | # Hardware Monitoring support |
1344 | # | 951 | # |
1345 | CONFIG_HWMON=y | 952 | # CONFIG_HWMON is not set |
1346 | CONFIG_HWMON_VID=m | 953 | # CONFIG_HWMON_VID is not set |
1347 | CONFIG_SENSORS_ADM1021=m | ||
1348 | CONFIG_SENSORS_ADM1025=m | ||
1349 | CONFIG_SENSORS_ADM1026=m | ||
1350 | CONFIG_SENSORS_ADM1031=m | ||
1351 | # CONFIG_SENSORS_ADM9240 is not set | ||
1352 | CONFIG_SENSORS_ASB100=m | ||
1353 | # CONFIG_SENSORS_ATXP1 is not set | ||
1354 | CONFIG_SENSORS_DS1621=m | ||
1355 | # CONFIG_SENSORS_F71805F is not set | ||
1356 | CONFIG_SENSORS_FSCHER=m | ||
1357 | # CONFIG_SENSORS_FSCPOS is not set | ||
1358 | CONFIG_SENSORS_GL518SM=m | ||
1359 | # CONFIG_SENSORS_GL520SM is not set | ||
1360 | CONFIG_SENSORS_IT87=m | ||
1361 | CONFIG_SENSORS_LM63=m | ||
1362 | CONFIG_SENSORS_LM75=m | ||
1363 | CONFIG_SENSORS_LM77=m | ||
1364 | CONFIG_SENSORS_LM78=m | ||
1365 | CONFIG_SENSORS_LM80=m | ||
1366 | CONFIG_SENSORS_LM83=m | ||
1367 | CONFIG_SENSORS_LM85=m | ||
1368 | CONFIG_SENSORS_LM87=m | ||
1369 | CONFIG_SENSORS_LM90=m | ||
1370 | # CONFIG_SENSORS_LM92 is not set | ||
1371 | CONFIG_SENSORS_MAX1619=m | ||
1372 | CONFIG_SENSORS_PC87360=m | ||
1373 | CONFIG_SENSORS_SMSC47M1=m | ||
1374 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
1375 | CONFIG_SENSORS_W83781D=m | ||
1376 | # CONFIG_SENSORS_W83792D is not set | ||
1377 | CONFIG_SENSORS_W83L785TS=m | ||
1378 | CONFIG_SENSORS_W83627HF=m | ||
1379 | # CONFIG_SENSORS_W83627EHF is not set | ||
1380 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
1381 | 954 | ||
1382 | # | 955 | # |
1383 | # Misc devices | 956 | # Misc devices |
@@ -1389,9 +962,18 @@ CONFIG_SENSORS_W83627HF=m | |||
1389 | # CONFIG_NEW_LEDS is not set | 962 | # CONFIG_NEW_LEDS is not set |
1390 | 963 | ||
1391 | # | 964 | # |
965 | # LED drivers | ||
966 | # | ||
967 | |||
968 | # | ||
969 | # LED Triggers | ||
970 | # | ||
971 | |||
972 | # | ||
1392 | # Multimedia devices | 973 | # Multimedia devices |
1393 | # | 974 | # |
1394 | # CONFIG_VIDEO_DEV is not set | 975 | # CONFIG_VIDEO_DEV is not set |
976 | CONFIG_VIDEO_V4L2=y | ||
1395 | 977 | ||
1396 | # | 978 | # |
1397 | # Digital Video Broadcasting Devices | 979 | # Digital Video Broadcasting Devices |
@@ -1460,18 +1042,25 @@ CONFIG_DVB_TDA10021=m | |||
1460 | CONFIG_DVB_STV0297=m | 1042 | CONFIG_DVB_STV0297=m |
1461 | 1043 | ||
1462 | # | 1044 | # |
1463 | # ATSC (North American/Korean Terresterial DTV) frontends | 1045 | # ATSC (North American/Korean Terrestrial/Cable DTV) frontends |
1464 | # | 1046 | # |
1465 | # CONFIG_DVB_NXT200X is not set | 1047 | # CONFIG_DVB_NXT200X is not set |
1466 | # CONFIG_DVB_OR51211 is not set | 1048 | # CONFIG_DVB_OR51211 is not set |
1467 | # CONFIG_DVB_OR51132 is not set | 1049 | # CONFIG_DVB_OR51132 is not set |
1468 | # CONFIG_DVB_BCM3510 is not set | 1050 | # CONFIG_DVB_BCM3510 is not set |
1469 | # CONFIG_DVB_LGDT330X is not set | 1051 | # CONFIG_DVB_LGDT330X is not set |
1052 | |||
1053 | # | ||
1054 | # Miscellaneous devices | ||
1055 | # | ||
1056 | CONFIG_DVB_LNBP21=m | ||
1057 | # CONFIG_DVB_ISL6421 is not set | ||
1470 | # CONFIG_USB_DABUSB is not set | 1058 | # CONFIG_USB_DABUSB is not set |
1471 | 1059 | ||
1472 | # | 1060 | # |
1473 | # Graphics support | 1061 | # Graphics support |
1474 | # | 1062 | # |
1063 | CONFIG_FIRMWARE_EDID=y | ||
1475 | # CONFIG_FB is not set | 1064 | # CONFIG_FB is not set |
1476 | 1065 | ||
1477 | # | 1066 | # |
@@ -1479,6 +1068,7 @@ CONFIG_DVB_STV0297=m | |||
1479 | # | 1068 | # |
1480 | # CONFIG_VGA_CONSOLE is not set | 1069 | # CONFIG_VGA_CONSOLE is not set |
1481 | CONFIG_DUMMY_CONSOLE=y | 1070 | CONFIG_DUMMY_CONSOLE=y |
1071 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
1482 | 1072 | ||
1483 | # | 1073 | # |
1484 | # Sound | 1074 | # Sound |
@@ -1526,17 +1116,12 @@ CONFIG_SND_MPU401=m | |||
1526 | CONFIG_SND_USB_AUDIO=m | 1116 | CONFIG_SND_USB_AUDIO=m |
1527 | 1117 | ||
1528 | # | 1118 | # |
1529 | # PCMCIA devices | ||
1530 | # | ||
1531 | |||
1532 | # | ||
1533 | # Open Sound System | 1119 | # Open Sound System |
1534 | # | 1120 | # |
1535 | CONFIG_SOUND_PRIME=m | 1121 | CONFIG_SOUND_PRIME=m |
1536 | # CONFIG_OBSOLETE_OSS_DRIVER is not set | 1122 | # CONFIG_OSS_OBSOLETE_DRIVER is not set |
1537 | # CONFIG_SOUND_MSNDCLAS is not set | 1123 | # CONFIG_SOUND_MSNDCLAS is not set |
1538 | # CONFIG_SOUND_MSNDPIN is not set | 1124 | # CONFIG_SOUND_MSNDPIN is not set |
1539 | CONFIG_SOUND_TVMIXER=m | ||
1540 | 1125 | ||
1541 | # | 1126 | # |
1542 | # USB support | 1127 | # USB support |
@@ -1544,7 +1129,7 @@ CONFIG_SOUND_TVMIXER=m | |||
1544 | CONFIG_USB_ARCH_HAS_HCD=y | 1129 | CONFIG_USB_ARCH_HAS_HCD=y |
1545 | # CONFIG_USB_ARCH_HAS_OHCI is not set | 1130 | # CONFIG_USB_ARCH_HAS_OHCI is not set |
1546 | # CONFIG_USB_ARCH_HAS_EHCI is not set | 1131 | # CONFIG_USB_ARCH_HAS_EHCI is not set |
1547 | CONFIG_USB=m | 1132 | CONFIG_USB=y |
1548 | # CONFIG_USB_DEBUG is not set | 1133 | # CONFIG_USB_DEBUG is not set |
1549 | 1134 | ||
1550 | # | 1135 | # |
@@ -1561,7 +1146,6 @@ CONFIG_USB_BANDWIDTH=y | |||
1561 | # | 1146 | # |
1562 | # CONFIG_USB_ISP116X_HCD is not set | 1147 | # CONFIG_USB_ISP116X_HCD is not set |
1563 | CONFIG_USB_SL811_HCD=m | 1148 | CONFIG_USB_SL811_HCD=m |
1564 | # CONFIG_USB_SL811_CS is not set | ||
1565 | 1149 | ||
1566 | # | 1150 | # |
1567 | # USB Device Class drivers | 1151 | # USB Device Class drivers |
@@ -1580,7 +1164,6 @@ CONFIG_USB_STORAGE=m | |||
1580 | # CONFIG_USB_STORAGE_DEBUG is not set | 1164 | # CONFIG_USB_STORAGE_DEBUG is not set |
1581 | CONFIG_USB_STORAGE_DATAFAB=y | 1165 | CONFIG_USB_STORAGE_DATAFAB=y |
1582 | CONFIG_USB_STORAGE_FREECOM=y | 1166 | CONFIG_USB_STORAGE_FREECOM=y |
1583 | CONFIG_USB_STORAGE_ISD200=y | ||
1584 | CONFIG_USB_STORAGE_DPCM=y | 1167 | CONFIG_USB_STORAGE_DPCM=y |
1585 | CONFIG_USB_STORAGE_USBAT=y | 1168 | CONFIG_USB_STORAGE_USBAT=y |
1586 | CONFIG_USB_STORAGE_SDDR09=y | 1169 | CONFIG_USB_STORAGE_SDDR09=y |
@@ -1608,9 +1191,7 @@ CONFIG_USB_WACOM=m | |||
1608 | # CONFIG_USB_ACECAD is not set | 1191 | # CONFIG_USB_ACECAD is not set |
1609 | CONFIG_USB_KBTAB=m | 1192 | CONFIG_USB_KBTAB=m |
1610 | CONFIG_USB_POWERMATE=m | 1193 | CONFIG_USB_POWERMATE=m |
1611 | CONFIG_USB_MTOUCH=m | 1194 | # CONFIG_USB_TOUCHSCREEN is not set |
1612 | # CONFIG_USB_ITMTOUCH is not set | ||
1613 | CONFIG_USB_EGALAX=m | ||
1614 | # CONFIG_USB_YEALINK is not set | 1195 | # CONFIG_USB_YEALINK is not set |
1615 | CONFIG_USB_XPAD=m | 1196 | CONFIG_USB_XPAD=m |
1616 | CONFIG_USB_ATI_REMOTE=m | 1197 | CONFIG_USB_ATI_REMOTE=m |
@@ -1640,13 +1221,11 @@ CONFIG_USB_NET_NET1080=m | |||
1640 | # CONFIG_USB_NET_RNDIS_HOST is not set | 1221 | # CONFIG_USB_NET_RNDIS_HOST is not set |
1641 | # CONFIG_USB_NET_CDC_SUBSET is not set | 1222 | # CONFIG_USB_NET_CDC_SUBSET is not set |
1642 | CONFIG_USB_NET_ZAURUS=m | 1223 | CONFIG_USB_NET_ZAURUS=m |
1643 | # CONFIG_USB_ZD1201 is not set | ||
1644 | CONFIG_USB_MON=y | 1224 | CONFIG_USB_MON=y |
1645 | 1225 | ||
1646 | # | 1226 | # |
1647 | # USB port drivers | 1227 | # USB port drivers |
1648 | # | 1228 | # |
1649 | CONFIG_USB_USS720=m | ||
1650 | 1229 | ||
1651 | # | 1230 | # |
1652 | # USB Serial Converter support | 1231 | # USB Serial Converter support |
@@ -1654,7 +1233,7 @@ CONFIG_USB_USS720=m | |||
1654 | CONFIG_USB_SERIAL=m | 1233 | CONFIG_USB_SERIAL=m |
1655 | CONFIG_USB_SERIAL_GENERIC=y | 1234 | CONFIG_USB_SERIAL_GENERIC=y |
1656 | # CONFIG_USB_SERIAL_AIRPRIME is not set | 1235 | # CONFIG_USB_SERIAL_AIRPRIME is not set |
1657 | # CONFIG_USB_SERIAL_ANYDATA is not set | 1236 | # CONFIG_USB_SERIAL_ARK3116 is not set |
1658 | CONFIG_USB_SERIAL_BELKIN=m | 1237 | CONFIG_USB_SERIAL_BELKIN=m |
1659 | CONFIG_USB_SERIAL_WHITEHEAT=m | 1238 | CONFIG_USB_SERIAL_WHITEHEAT=m |
1660 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | 1239 | CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m |
@@ -1662,6 +1241,7 @@ CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m | |||
1662 | CONFIG_USB_SERIAL_CYPRESS_M8=m | 1241 | CONFIG_USB_SERIAL_CYPRESS_M8=m |
1663 | CONFIG_USB_SERIAL_EMPEG=m | 1242 | CONFIG_USB_SERIAL_EMPEG=m |
1664 | CONFIG_USB_SERIAL_FTDI_SIO=m | 1243 | CONFIG_USB_SERIAL_FTDI_SIO=m |
1244 | # CONFIG_USB_SERIAL_FUNSOFT is not set | ||
1665 | CONFIG_USB_SERIAL_VISOR=m | 1245 | CONFIG_USB_SERIAL_VISOR=m |
1666 | CONFIG_USB_SERIAL_IPAQ=m | 1246 | CONFIG_USB_SERIAL_IPAQ=m |
1667 | CONFIG_USB_SERIAL_IR=m | 1247 | CONFIG_USB_SERIAL_IR=m |
@@ -1691,9 +1271,11 @@ CONFIG_USB_SERIAL_PL2303=m | |||
1691 | # CONFIG_USB_SERIAL_HP4X is not set | 1271 | # CONFIG_USB_SERIAL_HP4X is not set |
1692 | CONFIG_USB_SERIAL_SAFE=m | 1272 | CONFIG_USB_SERIAL_SAFE=m |
1693 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set | 1273 | # CONFIG_USB_SERIAL_SAFE_PADDED is not set |
1274 | # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set | ||
1694 | # CONFIG_USB_SERIAL_TI is not set | 1275 | # CONFIG_USB_SERIAL_TI is not set |
1695 | CONFIG_USB_SERIAL_CYBERJACK=m | 1276 | CONFIG_USB_SERIAL_CYBERJACK=m |
1696 | CONFIG_USB_SERIAL_XIRCOM=m | 1277 | CONFIG_USB_SERIAL_XIRCOM=m |
1278 | # CONFIG_USB_SERIAL_OPTION is not set | ||
1697 | CONFIG_USB_SERIAL_OMNINET=m | 1279 | CONFIG_USB_SERIAL_OMNINET=m |
1698 | CONFIG_USB_EZUSB=y | 1280 | CONFIG_USB_EZUSB=y |
1699 | 1281 | ||
@@ -1707,10 +1289,12 @@ CONFIG_USB_RIO500=m | |||
1707 | CONFIG_USB_LEGOTOWER=m | 1289 | CONFIG_USB_LEGOTOWER=m |
1708 | CONFIG_USB_LCD=m | 1290 | CONFIG_USB_LCD=m |
1709 | CONFIG_USB_LED=m | 1291 | CONFIG_USB_LED=m |
1292 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
1710 | CONFIG_USB_CYTHERM=m | 1293 | CONFIG_USB_CYTHERM=m |
1711 | CONFIG_USB_PHIDGETKIT=m | 1294 | CONFIG_USB_PHIDGETKIT=m |
1712 | CONFIG_USB_PHIDGETSERVO=m | 1295 | CONFIG_USB_PHIDGETSERVO=m |
1713 | # CONFIG_USB_IDMOUSE is not set | 1296 | # CONFIG_USB_IDMOUSE is not set |
1297 | # CONFIG_USB_APPLEDISPLAY is not set | ||
1714 | # CONFIG_USB_LD is not set | 1298 | # CONFIG_USB_LD is not set |
1715 | CONFIG_USB_TEST=m | 1299 | CONFIG_USB_TEST=m |
1716 | 1300 | ||
@@ -1787,7 +1371,6 @@ CONFIG_JFS_POSIX_ACL=y | |||
1787 | CONFIG_JFS_STATISTICS=y | 1371 | CONFIG_JFS_STATISTICS=y |
1788 | CONFIG_FS_POSIX_ACL=y | 1372 | CONFIG_FS_POSIX_ACL=y |
1789 | CONFIG_XFS_FS=m | 1373 | CONFIG_XFS_FS=m |
1790 | CONFIG_XFS_EXPORT=y | ||
1791 | CONFIG_XFS_QUOTA=y | 1374 | CONFIG_XFS_QUOTA=y |
1792 | CONFIG_XFS_SECURITY=y | 1375 | CONFIG_XFS_SECURITY=y |
1793 | CONFIG_XFS_POSIX_ACL=y | 1376 | CONFIG_XFS_POSIX_ACL=y |
@@ -1796,6 +1379,7 @@ CONFIG_XFS_RT=y | |||
1796 | CONFIG_MINIX_FS=m | 1379 | CONFIG_MINIX_FS=m |
1797 | CONFIG_ROMFS_FS=m | 1380 | CONFIG_ROMFS_FS=m |
1798 | CONFIG_INOTIFY=y | 1381 | CONFIG_INOTIFY=y |
1382 | CONFIG_INOTIFY_USER=y | ||
1799 | CONFIG_QUOTA=y | 1383 | CONFIG_QUOTA=y |
1800 | CONFIG_QFMT_V1=m | 1384 | CONFIG_QFMT_V1=m |
1801 | CONFIG_QFMT_V2=m | 1385 | CONFIG_QFMT_V2=m |
@@ -1856,6 +1440,7 @@ CONFIG_JFFS2_FS=m | |||
1856 | CONFIG_JFFS2_FS_DEBUG=0 | 1440 | CONFIG_JFFS2_FS_DEBUG=0 |
1857 | CONFIG_JFFS2_FS_WRITEBUFFER=y | 1441 | CONFIG_JFFS2_FS_WRITEBUFFER=y |
1858 | # CONFIG_JFFS2_SUMMARY is not set | 1442 | # CONFIG_JFFS2_SUMMARY is not set |
1443 | # CONFIG_JFFS2_FS_XATTR is not set | ||
1859 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | 1444 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set |
1860 | CONFIG_JFFS2_ZLIB=y | 1445 | CONFIG_JFFS2_ZLIB=y |
1861 | CONFIG_JFFS2_RTIME=y | 1446 | CONFIG_JFFS2_RTIME=y |
@@ -1866,11 +1451,13 @@ CONFIG_HPFS_FS=m | |||
1866 | CONFIG_QNX4FS_FS=m | 1451 | CONFIG_QNX4FS_FS=m |
1867 | CONFIG_SYSV_FS=m | 1452 | CONFIG_SYSV_FS=m |
1868 | CONFIG_UFS_FS=m | 1453 | CONFIG_UFS_FS=m |
1454 | # CONFIG_UFS_FS_WRITE is not set | ||
1455 | # CONFIG_UFS_DEBUG is not set | ||
1869 | 1456 | ||
1870 | # | 1457 | # |
1871 | # Network File Systems | 1458 | # Network File Systems |
1872 | # | 1459 | # |
1873 | CONFIG_NFS_FS=m | 1460 | CONFIG_NFS_FS=y |
1874 | CONFIG_NFS_V3=y | 1461 | CONFIG_NFS_V3=y |
1875 | # CONFIG_NFS_V3_ACL is not set | 1462 | # CONFIG_NFS_V3_ACL is not set |
1876 | CONFIG_NFS_V4=y | 1463 | CONFIG_NFS_V4=y |
@@ -1880,19 +1467,22 @@ CONFIG_NFSD_V3=y | |||
1880 | # CONFIG_NFSD_V3_ACL is not set | 1467 | # CONFIG_NFSD_V3_ACL is not set |
1881 | CONFIG_NFSD_V4=y | 1468 | CONFIG_NFSD_V4=y |
1882 | CONFIG_NFSD_TCP=y | 1469 | CONFIG_NFSD_TCP=y |
1883 | CONFIG_LOCKD=m | 1470 | CONFIG_ROOT_NFS=y |
1471 | CONFIG_LOCKD=y | ||
1884 | CONFIG_LOCKD_V4=y | 1472 | CONFIG_LOCKD_V4=y |
1885 | CONFIG_EXPORTFS=m | 1473 | CONFIG_EXPORTFS=m |
1886 | CONFIG_NFS_COMMON=y | 1474 | CONFIG_NFS_COMMON=y |
1887 | CONFIG_SUNRPC=m | 1475 | CONFIG_SUNRPC=y |
1888 | CONFIG_SUNRPC_GSS=m | 1476 | CONFIG_SUNRPC_GSS=y |
1889 | CONFIG_RPCSEC_GSS_KRB5=m | 1477 | CONFIG_RPCSEC_GSS_KRB5=y |
1890 | CONFIG_RPCSEC_GSS_SPKM3=m | 1478 | CONFIG_RPCSEC_GSS_SPKM3=m |
1891 | CONFIG_SMB_FS=m | 1479 | CONFIG_SMB_FS=m |
1892 | # CONFIG_SMB_NLS_DEFAULT is not set | 1480 | # CONFIG_SMB_NLS_DEFAULT is not set |
1893 | CONFIG_CIFS=m | 1481 | CONFIG_CIFS=m |
1894 | # CONFIG_CIFS_STATS is not set | 1482 | # CONFIG_CIFS_STATS is not set |
1483 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
1895 | # CONFIG_CIFS_XATTR is not set | 1484 | # CONFIG_CIFS_XATTR is not set |
1485 | # CONFIG_CIFS_DEBUG2 is not set | ||
1896 | # CONFIG_CIFS_EXPERIMENTAL is not set | 1486 | # CONFIG_CIFS_EXPERIMENTAL is not set |
1897 | CONFIG_NCP_FS=m | 1487 | CONFIG_NCP_FS=m |
1898 | CONFIG_NCPFS_PACKET_SIGNING=y | 1488 | CONFIG_NCPFS_PACKET_SIGNING=y |
@@ -1940,7 +1530,7 @@ CONFIG_SUN_PARTITION=y | |||
1940 | # | 1530 | # |
1941 | # Native Language Support | 1531 | # Native Language Support |
1942 | # | 1532 | # |
1943 | CONFIG_NLS=y | 1533 | CONFIG_NLS=m |
1944 | CONFIG_NLS_DEFAULT="cp437" | 1534 | CONFIG_NLS_DEFAULT="cp437" |
1945 | CONFIG_NLS_CODEPAGE_437=m | 1535 | CONFIG_NLS_CODEPAGE_437=m |
1946 | CONFIG_NLS_CODEPAGE_737=m | 1536 | CONFIG_NLS_CODEPAGE_737=m |
@@ -1984,26 +1574,29 @@ CONFIG_NLS_UTF8=m | |||
1984 | # | 1574 | # |
1985 | # Profiling support | 1575 | # Profiling support |
1986 | # | 1576 | # |
1987 | CONFIG_PROFILING=y | 1577 | # CONFIG_PROFILING is not set |
1988 | CONFIG_OPROFILE=m | ||
1989 | 1578 | ||
1990 | # | 1579 | # |
1991 | # Kernel hacking | 1580 | # Kernel hacking |
1992 | # | 1581 | # |
1993 | # CONFIG_PRINTK_TIME is not set | 1582 | # CONFIG_PRINTK_TIME is not set |
1994 | CONFIG_MAGIC_SYSRQ=y | 1583 | CONFIG_MAGIC_SYSRQ=y |
1584 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1995 | CONFIG_DEBUG_KERNEL=y | 1585 | CONFIG_DEBUG_KERNEL=y |
1996 | CONFIG_LOG_BUF_SHIFT=14 | 1586 | CONFIG_LOG_BUF_SHIFT=14 |
1997 | CONFIG_DETECT_SOFTLOCKUP=y | 1587 | CONFIG_DETECT_SOFTLOCKUP=y |
1998 | # CONFIG_SCHEDSTATS is not set | 1588 | # CONFIG_SCHEDSTATS is not set |
1999 | # CONFIG_DEBUG_SLAB is not set | 1589 | # CONFIG_DEBUG_SLAB is not set |
2000 | CONFIG_DEBUG_PREEMPT=y | 1590 | # CONFIG_DEBUG_RT_MUTEXES is not set |
2001 | CONFIG_DEBUG_MUTEXES=y | 1591 | # CONFIG_RT_MUTEX_TESTER is not set |
2002 | # CONFIG_DEBUG_SPINLOCK is not set | 1592 | # CONFIG_DEBUG_SPINLOCK is not set |
1593 | CONFIG_DEBUG_MUTEXES=y | ||
1594 | # CONFIG_DEBUG_RWSEMS is not set | ||
2003 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1595 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1596 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
2004 | # CONFIG_DEBUG_KOBJECT is not set | 1597 | # CONFIG_DEBUG_KOBJECT is not set |
2005 | # CONFIG_DEBUG_BUGVERBOSE is not set | 1598 | # CONFIG_DEBUG_BUGVERBOSE is not set |
2006 | CONFIG_DEBUG_INFO=y | 1599 | # CONFIG_DEBUG_INFO is not set |
2007 | # CONFIG_DEBUG_FS is not set | 1600 | # CONFIG_DEBUG_FS is not set |
2008 | # CONFIG_DEBUG_VM is not set | 1601 | # CONFIG_DEBUG_VM is not set |
2009 | CONFIG_FRAME_POINTER=y | 1602 | CONFIG_FRAME_POINTER=y |
@@ -2013,8 +1606,7 @@ CONFIG_FORCED_INLINING=y | |||
2013 | # CONFIG_DEBUG_USER is not set | 1606 | # CONFIG_DEBUG_USER is not set |
2014 | # CONFIG_DEBUG_WAITQ is not set | 1607 | # CONFIG_DEBUG_WAITQ is not set |
2015 | # CONFIG_DEBUG_ERRORS is not set | 1608 | # CONFIG_DEBUG_ERRORS is not set |
2016 | CONFIG_DEBUG_LL=y | 1609 | # CONFIG_DEBUG_LL is not set |
2017 | # CONFIG_DEBUG_ICEDCC is not set | ||
2018 | 1610 | ||
2019 | # | 1611 | # |
2020 | # Security options | 1612 | # Security options |
@@ -2039,7 +1631,7 @@ CONFIG_CRYPTO_SHA256=m | |||
2039 | CONFIG_CRYPTO_SHA512=m | 1631 | CONFIG_CRYPTO_SHA512=m |
2040 | CONFIG_CRYPTO_WP512=m | 1632 | CONFIG_CRYPTO_WP512=m |
2041 | # CONFIG_CRYPTO_TGR192 is not set | 1633 | # CONFIG_CRYPTO_TGR192 is not set |
2042 | CONFIG_CRYPTO_DES=m | 1634 | CONFIG_CRYPTO_DES=y |
2043 | CONFIG_CRYPTO_BLOWFISH=m | 1635 | CONFIG_CRYPTO_BLOWFISH=m |
2044 | CONFIG_CRYPTO_TWOFISH=m | 1636 | CONFIG_CRYPTO_TWOFISH=m |
2045 | CONFIG_CRYPTO_SERPENT=m | 1637 | CONFIG_CRYPTO_SERPENT=m |
@@ -2068,5 +1660,6 @@ CONFIG_CRC32=y | |||
2068 | CONFIG_LIBCRC32C=m | 1660 | CONFIG_LIBCRC32C=m |
2069 | CONFIG_ZLIB_INFLATE=y | 1661 | CONFIG_ZLIB_INFLATE=y |
2070 | CONFIG_ZLIB_DEFLATE=m | 1662 | CONFIG_ZLIB_DEFLATE=m |
2071 | CONFIG_REED_SOLOMON=m | 1663 | CONFIG_TEXTSEARCH=y |
2072 | CONFIG_REED_SOLOMON_DEC16=y | 1664 | CONFIG_TEXTSEARCH_KMP=m |
1665 | CONFIG_PLIST=y | ||
diff --git a/arch/arm/mach-s3c2410/Kconfig b/arch/arm/mach-s3c2410/Kconfig index b4171dd43df0..bbd138be6a70 100644 --- a/arch/arm/mach-s3c2410/Kconfig +++ b/arch/arm/mach-s3c2410/Kconfig | |||
@@ -81,9 +81,17 @@ config SMDK2440_CPU2442 | |||
81 | depends on ARCH_S3C2440 | 81 | depends on ARCH_S3C2440 |
82 | select CPU_S3C2442 | 82 | select CPU_S3C2442 |
83 | 83 | ||
84 | config MACH_S3C2413 | ||
85 | bool | ||
86 | help | ||
87 | Internal node for S3C2413 verison of SMDK2413, so that | ||
88 | machine_is_s3c2413() will work when MACH_SMDK2413 is | ||
89 | selected | ||
90 | |||
84 | config MACH_SMDK2413 | 91 | config MACH_SMDK2413 |
85 | bool "SMDK2413" | 92 | bool "SMDK2413" |
86 | select CPU_S3C2412 | 93 | select CPU_S3C2412 |
94 | select MACH_S3C2413 | ||
87 | select MACH_SMDK | 95 | select MACH_SMDK |
88 | help | 96 | help |
89 | Say Y here if you are using an SMDK2413 | 97 | Say Y here if you are using an SMDK2413 |
diff --git a/arch/arm/mach-s3c2410/irq.h b/arch/arm/mach-s3c2410/irq.h index f7cc4c983de5..842a9f42c97b 100644 --- a/arch/arm/mach-s3c2410/irq.h +++ b/arch/arm/mach-s3c2410/irq.h | |||
@@ -100,5 +100,10 @@ s3c_irqsub_ack(unsigned int irqno, unsigned int parentmask, unsigned int group) | |||
100 | 100 | ||
101 | /* exported for use in arch/arm/mach-s3c2410 */ | 101 | /* exported for use in arch/arm/mach-s3c2410 */ |
102 | 102 | ||
103 | #ifdef CONFIG_PM | ||
103 | extern int s3c_irq_wake(unsigned int irqno, unsigned int state); | 104 | extern int s3c_irq_wake(unsigned int irqno, unsigned int state); |
105 | #else | ||
106 | #define s3c_irq_wake NULL | ||
107 | #endif | ||
108 | |||
104 | extern int s3c_irqext_type(unsigned int irq, unsigned int type); | 109 | extern int s3c_irqext_type(unsigned int irq, unsigned int type); |
diff --git a/arch/arm/mach-s3c2410/s3c2412.c b/arch/arm/mach-s3c2410/s3c2412.c index e24ffd5e478b..2d163f7600be 100644 --- a/arch/arm/mach-s3c2410/s3c2412.c +++ b/arch/arm/mach-s3c2410/s3c2412.c | |||
@@ -35,11 +35,15 @@ | |||
35 | #include <asm/mach/irq.h> | 35 | #include <asm/mach/irq.h> |
36 | 36 | ||
37 | #include <asm/hardware.h> | 37 | #include <asm/hardware.h> |
38 | #include <asm/proc-fns.h> | ||
38 | #include <asm/io.h> | 39 | #include <asm/io.h> |
39 | #include <asm/irq.h> | 40 | #include <asm/irq.h> |
40 | 41 | ||
42 | #include <asm/arch/idle.h> | ||
43 | |||
41 | #include <asm/arch/regs-clock.h> | 44 | #include <asm/arch/regs-clock.h> |
42 | #include <asm/arch/regs-serial.h> | 45 | #include <asm/arch/regs-serial.h> |
46 | #include <asm/arch/regs-power.h> | ||
43 | #include <asm/arch/regs-gpio.h> | 47 | #include <asm/arch/regs-gpio.h> |
44 | #include <asm/arch/regs-gpioj.h> | 48 | #include <asm/arch/regs-gpioj.h> |
45 | #include <asm/arch/regs-dsc.h> | 49 | #include <asm/arch/regs-dsc.h> |
@@ -75,6 +79,27 @@ void __init s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no) | |||
75 | s3c_device_nand.name = "s3c2412-nand"; | 79 | s3c_device_nand.name = "s3c2412-nand"; |
76 | } | 80 | } |
77 | 81 | ||
82 | /* s3c2412_idle | ||
83 | * | ||
84 | * use the standard idle call by ensuring the idle mode | ||
85 | * in power config, then issuing the idle co-processor | ||
86 | * instruction | ||
87 | */ | ||
88 | |||
89 | static void s3c2412_idle(void) | ||
90 | { | ||
91 | unsigned long tmp; | ||
92 | |||
93 | /* ensure our idle mode is to go to idle */ | ||
94 | |||
95 | tmp = __raw_readl(S3C2412_PWRCFG); | ||
96 | tmp &= ~S3C2412_PWRCFG_STANDBYWFI_MASK; | ||
97 | tmp |= S3C2412_PWRCFG_STANDBYWFI_IDLE; | ||
98 | __raw_writel(tmp, S3C2412_PWRCFG); | ||
99 | |||
100 | cpu_do_idle(); | ||
101 | } | ||
102 | |||
78 | /* s3c2412_map_io | 103 | /* s3c2412_map_io |
79 | * | 104 | * |
80 | * register the standard cpu IO areas, and any passed in from the | 105 | * register the standard cpu IO areas, and any passed in from the |
@@ -87,6 +112,10 @@ void __init s3c2412_map_io(struct map_desc *mach_desc, int mach_size) | |||
87 | 112 | ||
88 | s3c24xx_va_gpio2 = S3C24XX_VA_GPIO + 0x10; | 113 | s3c24xx_va_gpio2 = S3C24XX_VA_GPIO + 0x10; |
89 | 114 | ||
115 | /* set our idle function */ | ||
116 | |||
117 | s3c24xx_idle = s3c2412_idle; | ||
118 | |||
90 | /* register our io-tables */ | 119 | /* register our io-tables */ |
91 | 120 | ||
92 | iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); | 121 | iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); |
diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 561bff73a036..3ca0c92e98a2 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S | |||
@@ -644,7 +644,7 @@ __80219_proc_info: | |||
644 | .type __8032x_proc_info,#object | 644 | .type __8032x_proc_info,#object |
645 | __8032x_proc_info: | 645 | __8032x_proc_info: |
646 | .long 0x69052420 | 646 | .long 0x69052420 |
647 | .long 0xffffffe0 | 647 | .long 0xfffff7e0 |
648 | .long PMD_TYPE_SECT | \ | 648 | .long PMD_TYPE_SECT | \ |
649 | PMD_SECT_BUFFERABLE | \ | 649 | PMD_SECT_BUFFERABLE | \ |
650 | PMD_SECT_CACHEABLE | \ | 650 | PMD_SECT_CACHEABLE | \ |
diff --git a/arch/frv/Makefile b/arch/frv/Makefile index d163747d17c0..038e3a8457e0 100644 --- a/arch/frv/Makefile +++ b/arch/frv/Makefile | |||
@@ -108,11 +108,8 @@ Image: vmlinux | |||
108 | bootstrap: | 108 | bootstrap: |
109 | $(Q)$(MAKEBOOT) bootstrap | 109 | $(Q)$(MAKEBOOT) bootstrap |
110 | 110 | ||
111 | archmrproper: | ||
112 | $(Q)$(MAKE) $(build)=arch/frv/boot mrproper | ||
113 | |||
114 | archclean: | 111 | archclean: |
115 | $(Q)$(MAKE) $(build)=arch/frv/boot clean | 112 | $(Q)$(MAKE) $(clean)=arch/frv/boot |
116 | 113 | ||
117 | archdep: scripts/mkdep symlinks | 114 | archdep: scripts/mkdep symlinks |
118 | $(Q)$(MAKE) $(build)=arch/frv/boot dep | 115 | $(Q)$(MAKE) $(build)=arch/frv/boot dep |
diff --git a/arch/frv/boot/Makefile b/arch/frv/boot/Makefile index 5dfc93fd945a..dc6f03824423 100644 --- a/arch/frv/boot/Makefile +++ b/arch/frv/boot/Makefile | |||
@@ -8,6 +8,8 @@ | |||
8 | # Copyright (C) 1995-2000 Russell King | 8 | # Copyright (C) 1995-2000 Russell King |
9 | # | 9 | # |
10 | 10 | ||
11 | targets := Image zImage bootpImage | ||
12 | |||
11 | SYSTEM =$(TOPDIR)/$(LINUX) | 13 | SYSTEM =$(TOPDIR)/$(LINUX) |
12 | 14 | ||
13 | ZTEXTADDR = 0x02080000 | 15 | ZTEXTADDR = 0x02080000 |
@@ -66,7 +68,6 @@ zinstall: $(CONFIGURE) zImage | |||
66 | # miscellany | 68 | # miscellany |
67 | # | 69 | # |
68 | mrproper clean: | 70 | mrproper clean: |
69 | $(RM) Image zImage bootpImage | ||
70 | # @$(MAKE) -C compressed clean | 71 | # @$(MAKE) -C compressed clean |
71 | # @$(MAKE) -C bootp clean | 72 | # @$(MAKE) -C bootp clean |
72 | 73 | ||
diff --git a/arch/i386/crypto/Makefile b/arch/i386/crypto/Makefile index 103c353d0a63..3fd19af18e34 100644 --- a/arch/i386/crypto/Makefile +++ b/arch/i386/crypto/Makefile | |||
@@ -5,5 +5,8 @@ | |||
5 | # | 5 | # |
6 | 6 | ||
7 | obj-$(CONFIG_CRYPTO_AES_586) += aes-i586.o | 7 | obj-$(CONFIG_CRYPTO_AES_586) += aes-i586.o |
8 | obj-$(CONFIG_CRYPTO_TWOFISH_586) += twofish-i586.o | ||
8 | 9 | ||
9 | aes-i586-y := aes-i586-asm.o aes.o | 10 | aes-i586-y := aes-i586-asm.o aes.o |
11 | twofish-i586-y := twofish-i586-asm.o twofish.o | ||
12 | |||
diff --git a/arch/i386/crypto/aes.c b/arch/i386/crypto/aes.c index d3806daa3de3..49aad9397f10 100644 --- a/arch/i386/crypto/aes.c +++ b/arch/i386/crypto/aes.c | |||
@@ -379,12 +379,13 @@ static void gen_tabs(void) | |||
379 | } | 379 | } |
380 | 380 | ||
381 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 381 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
382 | unsigned int key_len, u32 *flags) | 382 | unsigned int key_len) |
383 | { | 383 | { |
384 | int i; | 384 | int i; |
385 | u32 ss[8]; | 385 | u32 ss[8]; |
386 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | 386 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); |
387 | const __le32 *key = (const __le32 *)in_key; | 387 | const __le32 *key = (const __le32 *)in_key; |
388 | u32 *flags = &tfm->crt_flags; | ||
388 | 389 | ||
389 | /* encryption schedule */ | 390 | /* encryption schedule */ |
390 | 391 | ||
diff --git a/arch/i386/crypto/twofish-i586-asm.S b/arch/i386/crypto/twofish-i586-asm.S new file mode 100644 index 000000000000..39b98ed2c1b9 --- /dev/null +++ b/arch/i386/crypto/twofish-i586-asm.S | |||
@@ -0,0 +1,335 @@ | |||
1 | /*************************************************************************** | ||
2 | * Copyright (C) 2006 by Joachim Fritschi, <jfritschi@freenet.de> * | ||
3 | * * | ||
4 | * This program is free software; you can redistribute it and/or modify * | ||
5 | * it under the terms of the GNU General Public License as published by * | ||
6 | * the Free Software Foundation; either version 2 of the License, or * | ||
7 | * (at your option) any later version. * | ||
8 | * * | ||
9 | * This program is distributed in the hope that it will be useful, * | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | ||
12 | * GNU General Public License for more details. * | ||
13 | * * | ||
14 | * You should have received a copy of the GNU General Public License * | ||
15 | * along with this program; if not, write to the * | ||
16 | * Free Software Foundation, Inc., * | ||
17 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | ||
18 | ***************************************************************************/ | ||
19 | |||
20 | .file "twofish-i586-asm.S" | ||
21 | .text | ||
22 | |||
23 | #include <asm/asm-offsets.h> | ||
24 | |||
25 | /* return adress at 0 */ | ||
26 | |||
27 | #define in_blk 12 /* input byte array address parameter*/ | ||
28 | #define out_blk 8 /* output byte array address parameter*/ | ||
29 | #define tfm 4 /* Twofish context structure */ | ||
30 | |||
31 | #define a_offset 0 | ||
32 | #define b_offset 4 | ||
33 | #define c_offset 8 | ||
34 | #define d_offset 12 | ||
35 | |||
36 | /* Structure of the crypto context struct*/ | ||
37 | |||
38 | #define s0 0 /* S0 Array 256 Words each */ | ||
39 | #define s1 1024 /* S1 Array */ | ||
40 | #define s2 2048 /* S2 Array */ | ||
41 | #define s3 3072 /* S3 Array */ | ||
42 | #define w 4096 /* 8 whitening keys (word) */ | ||
43 | #define k 4128 /* key 1-32 ( word ) */ | ||
44 | |||
45 | /* define a few register aliases to allow macro substitution */ | ||
46 | |||
47 | #define R0D %eax | ||
48 | #define R0B %al | ||
49 | #define R0H %ah | ||
50 | |||
51 | #define R1D %ebx | ||
52 | #define R1B %bl | ||
53 | #define R1H %bh | ||
54 | |||
55 | #define R2D %ecx | ||
56 | #define R2B %cl | ||
57 | #define R2H %ch | ||
58 | |||
59 | #define R3D %edx | ||
60 | #define R3B %dl | ||
61 | #define R3H %dh | ||
62 | |||
63 | |||
64 | /* performs input whitening */ | ||
65 | #define input_whitening(src,context,offset)\ | ||
66 | xor w+offset(context), src; | ||
67 | |||
68 | /* performs input whitening */ | ||
69 | #define output_whitening(src,context,offset)\ | ||
70 | xor w+16+offset(context), src; | ||
71 | |||
72 | /* | ||
73 | * a input register containing a (rotated 16) | ||
74 | * b input register containing b | ||
75 | * c input register containing c | ||
76 | * d input register containing d (already rol $1) | ||
77 | * operations on a and b are interleaved to increase performance | ||
78 | */ | ||
79 | #define encrypt_round(a,b,c,d,round)\ | ||
80 | push d ## D;\ | ||
81 | movzx b ## B, %edi;\ | ||
82 | mov s1(%ebp,%edi,4),d ## D;\ | ||
83 | movzx a ## B, %edi;\ | ||
84 | mov s2(%ebp,%edi,4),%esi;\ | ||
85 | movzx b ## H, %edi;\ | ||
86 | ror $16, b ## D;\ | ||
87 | xor s2(%ebp,%edi,4),d ## D;\ | ||
88 | movzx a ## H, %edi;\ | ||
89 | ror $16, a ## D;\ | ||
90 | xor s3(%ebp,%edi,4),%esi;\ | ||
91 | movzx b ## B, %edi;\ | ||
92 | xor s3(%ebp,%edi,4),d ## D;\ | ||
93 | movzx a ## B, %edi;\ | ||
94 | xor (%ebp,%edi,4), %esi;\ | ||
95 | movzx b ## H, %edi;\ | ||
96 | ror $15, b ## D;\ | ||
97 | xor (%ebp,%edi,4), d ## D;\ | ||
98 | movzx a ## H, %edi;\ | ||
99 | xor s1(%ebp,%edi,4),%esi;\ | ||
100 | pop %edi;\ | ||
101 | add d ## D, %esi;\ | ||
102 | add %esi, d ## D;\ | ||
103 | add k+round(%ebp), %esi;\ | ||
104 | xor %esi, c ## D;\ | ||
105 | rol $15, c ## D;\ | ||
106 | add k+4+round(%ebp),d ## D;\ | ||
107 | xor %edi, d ## D; | ||
108 | |||
109 | /* | ||
110 | * a input register containing a (rotated 16) | ||
111 | * b input register containing b | ||
112 | * c input register containing c | ||
113 | * d input register containing d (already rol $1) | ||
114 | * operations on a and b are interleaved to increase performance | ||
115 | * last round has different rotations for the output preparation | ||
116 | */ | ||
117 | #define encrypt_last_round(a,b,c,d,round)\ | ||
118 | push d ## D;\ | ||
119 | movzx b ## B, %edi;\ | ||
120 | mov s1(%ebp,%edi,4),d ## D;\ | ||
121 | movzx a ## B, %edi;\ | ||
122 | mov s2(%ebp,%edi,4),%esi;\ | ||
123 | movzx b ## H, %edi;\ | ||
124 | ror $16, b ## D;\ | ||
125 | xor s2(%ebp,%edi,4),d ## D;\ | ||
126 | movzx a ## H, %edi;\ | ||
127 | ror $16, a ## D;\ | ||
128 | xor s3(%ebp,%edi,4),%esi;\ | ||
129 | movzx b ## B, %edi;\ | ||
130 | xor s3(%ebp,%edi,4),d ## D;\ | ||
131 | movzx a ## B, %edi;\ | ||
132 | xor (%ebp,%edi,4), %esi;\ | ||
133 | movzx b ## H, %edi;\ | ||
134 | ror $16, b ## D;\ | ||
135 | xor (%ebp,%edi,4), d ## D;\ | ||
136 | movzx a ## H, %edi;\ | ||
137 | xor s1(%ebp,%edi,4),%esi;\ | ||
138 | pop %edi;\ | ||
139 | add d ## D, %esi;\ | ||
140 | add %esi, d ## D;\ | ||
141 | add k+round(%ebp), %esi;\ | ||
142 | xor %esi, c ## D;\ | ||
143 | ror $1, c ## D;\ | ||
144 | add k+4+round(%ebp),d ## D;\ | ||
145 | xor %edi, d ## D; | ||
146 | |||
147 | /* | ||
148 | * a input register containing a | ||
149 | * b input register containing b (rotated 16) | ||
150 | * c input register containing c | ||
151 | * d input register containing d (already rol $1) | ||
152 | * operations on a and b are interleaved to increase performance | ||
153 | */ | ||
154 | #define decrypt_round(a,b,c,d,round)\ | ||
155 | push c ## D;\ | ||
156 | movzx a ## B, %edi;\ | ||
157 | mov (%ebp,%edi,4), c ## D;\ | ||
158 | movzx b ## B, %edi;\ | ||
159 | mov s3(%ebp,%edi,4),%esi;\ | ||
160 | movzx a ## H, %edi;\ | ||
161 | ror $16, a ## D;\ | ||
162 | xor s1(%ebp,%edi,4),c ## D;\ | ||
163 | movzx b ## H, %edi;\ | ||
164 | ror $16, b ## D;\ | ||
165 | xor (%ebp,%edi,4), %esi;\ | ||
166 | movzx a ## B, %edi;\ | ||
167 | xor s2(%ebp,%edi,4),c ## D;\ | ||
168 | movzx b ## B, %edi;\ | ||
169 | xor s1(%ebp,%edi,4),%esi;\ | ||
170 | movzx a ## H, %edi;\ | ||
171 | ror $15, a ## D;\ | ||
172 | xor s3(%ebp,%edi,4),c ## D;\ | ||
173 | movzx b ## H, %edi;\ | ||
174 | xor s2(%ebp,%edi,4),%esi;\ | ||
175 | pop %edi;\ | ||
176 | add %esi, c ## D;\ | ||
177 | add c ## D, %esi;\ | ||
178 | add k+round(%ebp), c ## D;\ | ||
179 | xor %edi, c ## D;\ | ||
180 | add k+4+round(%ebp),%esi;\ | ||
181 | xor %esi, d ## D;\ | ||
182 | rol $15, d ## D; | ||
183 | |||
184 | /* | ||
185 | * a input register containing a | ||
186 | * b input register containing b (rotated 16) | ||
187 | * c input register containing c | ||
188 | * d input register containing d (already rol $1) | ||
189 | * operations on a and b are interleaved to increase performance | ||
190 | * last round has different rotations for the output preparation | ||
191 | */ | ||
192 | #define decrypt_last_round(a,b,c,d,round)\ | ||
193 | push c ## D;\ | ||
194 | movzx a ## B, %edi;\ | ||
195 | mov (%ebp,%edi,4), c ## D;\ | ||
196 | movzx b ## B, %edi;\ | ||
197 | mov s3(%ebp,%edi,4),%esi;\ | ||
198 | movzx a ## H, %edi;\ | ||
199 | ror $16, a ## D;\ | ||
200 | xor s1(%ebp,%edi,4),c ## D;\ | ||
201 | movzx b ## H, %edi;\ | ||
202 | ror $16, b ## D;\ | ||
203 | xor (%ebp,%edi,4), %esi;\ | ||
204 | movzx a ## B, %edi;\ | ||
205 | xor s2(%ebp,%edi,4),c ## D;\ | ||
206 | movzx b ## B, %edi;\ | ||
207 | xor s1(%ebp,%edi,4),%esi;\ | ||
208 | movzx a ## H, %edi;\ | ||
209 | ror $16, a ## D;\ | ||
210 | xor s3(%ebp,%edi,4),c ## D;\ | ||
211 | movzx b ## H, %edi;\ | ||
212 | xor s2(%ebp,%edi,4),%esi;\ | ||
213 | pop %edi;\ | ||
214 | add %esi, c ## D;\ | ||
215 | add c ## D, %esi;\ | ||
216 | add k+round(%ebp), c ## D;\ | ||
217 | xor %edi, c ## D;\ | ||
218 | add k+4+round(%ebp),%esi;\ | ||
219 | xor %esi, d ## D;\ | ||
220 | ror $1, d ## D; | ||
221 | |||
222 | .align 4 | ||
223 | .global twofish_enc_blk | ||
224 | .global twofish_dec_blk | ||
225 | |||
226 | twofish_enc_blk: | ||
227 | push %ebp /* save registers according to calling convention*/ | ||
228 | push %ebx | ||
229 | push %esi | ||
230 | push %edi | ||
231 | |||
232 | mov tfm + 16(%esp), %ebp /* abuse the base pointer: set new base bointer to the crypto tfm */ | ||
233 | add $crypto_tfm_ctx_offset, %ebp /* ctx adress */ | ||
234 | mov in_blk+16(%esp),%edi /* input adress in edi */ | ||
235 | |||
236 | mov (%edi), %eax | ||
237 | mov b_offset(%edi), %ebx | ||
238 | mov c_offset(%edi), %ecx | ||
239 | mov d_offset(%edi), %edx | ||
240 | input_whitening(%eax,%ebp,a_offset) | ||
241 | ror $16, %eax | ||
242 | input_whitening(%ebx,%ebp,b_offset) | ||
243 | input_whitening(%ecx,%ebp,c_offset) | ||
244 | input_whitening(%edx,%ebp,d_offset) | ||
245 | rol $1, %edx | ||
246 | |||
247 | encrypt_round(R0,R1,R2,R3,0); | ||
248 | encrypt_round(R2,R3,R0,R1,8); | ||
249 | encrypt_round(R0,R1,R2,R3,2*8); | ||
250 | encrypt_round(R2,R3,R0,R1,3*8); | ||
251 | encrypt_round(R0,R1,R2,R3,4*8); | ||
252 | encrypt_round(R2,R3,R0,R1,5*8); | ||
253 | encrypt_round(R0,R1,R2,R3,6*8); | ||
254 | encrypt_round(R2,R3,R0,R1,7*8); | ||
255 | encrypt_round(R0,R1,R2,R3,8*8); | ||
256 | encrypt_round(R2,R3,R0,R1,9*8); | ||
257 | encrypt_round(R0,R1,R2,R3,10*8); | ||
258 | encrypt_round(R2,R3,R0,R1,11*8); | ||
259 | encrypt_round(R0,R1,R2,R3,12*8); | ||
260 | encrypt_round(R2,R3,R0,R1,13*8); | ||
261 | encrypt_round(R0,R1,R2,R3,14*8); | ||
262 | encrypt_last_round(R2,R3,R0,R1,15*8); | ||
263 | |||
264 | output_whitening(%eax,%ebp,c_offset) | ||
265 | output_whitening(%ebx,%ebp,d_offset) | ||
266 | output_whitening(%ecx,%ebp,a_offset) | ||
267 | output_whitening(%edx,%ebp,b_offset) | ||
268 | mov out_blk+16(%esp),%edi; | ||
269 | mov %eax, c_offset(%edi) | ||
270 | mov %ebx, d_offset(%edi) | ||
271 | mov %ecx, (%edi) | ||
272 | mov %edx, b_offset(%edi) | ||
273 | |||
274 | pop %edi | ||
275 | pop %esi | ||
276 | pop %ebx | ||
277 | pop %ebp | ||
278 | mov $1, %eax | ||
279 | ret | ||
280 | |||
281 | twofish_dec_blk: | ||
282 | push %ebp /* save registers according to calling convention*/ | ||
283 | push %ebx | ||
284 | push %esi | ||
285 | push %edi | ||
286 | |||
287 | |||
288 | mov tfm + 16(%esp), %ebp /* abuse the base pointer: set new base bointer to the crypto tfm */ | ||
289 | add $crypto_tfm_ctx_offset, %ebp /* ctx adress */ | ||
290 | mov in_blk+16(%esp),%edi /* input adress in edi */ | ||
291 | |||
292 | mov (%edi), %eax | ||
293 | mov b_offset(%edi), %ebx | ||
294 | mov c_offset(%edi), %ecx | ||
295 | mov d_offset(%edi), %edx | ||
296 | output_whitening(%eax,%ebp,a_offset) | ||
297 | output_whitening(%ebx,%ebp,b_offset) | ||
298 | ror $16, %ebx | ||
299 | output_whitening(%ecx,%ebp,c_offset) | ||
300 | output_whitening(%edx,%ebp,d_offset) | ||
301 | rol $1, %ecx | ||
302 | |||
303 | decrypt_round(R0,R1,R2,R3,15*8); | ||
304 | decrypt_round(R2,R3,R0,R1,14*8); | ||
305 | decrypt_round(R0,R1,R2,R3,13*8); | ||
306 | decrypt_round(R2,R3,R0,R1,12*8); | ||
307 | decrypt_round(R0,R1,R2,R3,11*8); | ||
308 | decrypt_round(R2,R3,R0,R1,10*8); | ||
309 | decrypt_round(R0,R1,R2,R3,9*8); | ||
310 | decrypt_round(R2,R3,R0,R1,8*8); | ||
311 | decrypt_round(R0,R1,R2,R3,7*8); | ||
312 | decrypt_round(R2,R3,R0,R1,6*8); | ||
313 | decrypt_round(R0,R1,R2,R3,5*8); | ||
314 | decrypt_round(R2,R3,R0,R1,4*8); | ||
315 | decrypt_round(R0,R1,R2,R3,3*8); | ||
316 | decrypt_round(R2,R3,R0,R1,2*8); | ||
317 | decrypt_round(R0,R1,R2,R3,1*8); | ||
318 | decrypt_last_round(R2,R3,R0,R1,0); | ||
319 | |||
320 | input_whitening(%eax,%ebp,c_offset) | ||
321 | input_whitening(%ebx,%ebp,d_offset) | ||
322 | input_whitening(%ecx,%ebp,a_offset) | ||
323 | input_whitening(%edx,%ebp,b_offset) | ||
324 | mov out_blk+16(%esp),%edi; | ||
325 | mov %eax, c_offset(%edi) | ||
326 | mov %ebx, d_offset(%edi) | ||
327 | mov %ecx, (%edi) | ||
328 | mov %edx, b_offset(%edi) | ||
329 | |||
330 | pop %edi | ||
331 | pop %esi | ||
332 | pop %ebx | ||
333 | pop %ebp | ||
334 | mov $1, %eax | ||
335 | ret | ||
diff --git a/arch/i386/crypto/twofish.c b/arch/i386/crypto/twofish.c new file mode 100644 index 000000000000..e3004dfe9c7a --- /dev/null +++ b/arch/i386/crypto/twofish.c | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * Glue Code for optimized 586 assembler version of TWOFISH | ||
3 | * | ||
4 | * Originally Twofish for GPG | ||
5 | * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 | ||
6 | * 256-bit key length added March 20, 1999 | ||
7 | * Some modifications to reduce the text size by Werner Koch, April, 1998 | ||
8 | * Ported to the kerneli patch by Marc Mutz <Marc@Mutz.com> | ||
9 | * Ported to CryptoAPI by Colin Slater <hoho@tacomeat.net> | ||
10 | * | ||
11 | * The original author has disclaimed all copyright interest in this | ||
12 | * code and thus put it in the public domain. The subsequent authors | ||
13 | * have put this under the GNU General Public License. | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, write to the Free Software | ||
27 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | ||
28 | * USA | ||
29 | * | ||
30 | * This code is a "clean room" implementation, written from the paper | ||
31 | * _Twofish: A 128-Bit Block Cipher_ by Bruce Schneier, John Kelsey, | ||
32 | * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson, available | ||
33 | * through http://www.counterpane.com/twofish.html | ||
34 | * | ||
35 | * For background information on multiplication in finite fields, used for | ||
36 | * the matrix operations in the key schedule, see the book _Contemporary | ||
37 | * Abstract Algebra_ by Joseph A. Gallian, especially chapter 22 in the | ||
38 | * Third Edition. | ||
39 | */ | ||
40 | |||
41 | #include <crypto/twofish.h> | ||
42 | #include <linux/crypto.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/module.h> | ||
45 | #include <linux/types.h> | ||
46 | |||
47 | |||
48 | asmlinkage void twofish_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
49 | asmlinkage void twofish_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
50 | |||
51 | static void twofish_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
52 | { | ||
53 | twofish_enc_blk(tfm, dst, src); | ||
54 | } | ||
55 | |||
56 | static void twofish_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
57 | { | ||
58 | twofish_dec_blk(tfm, dst, src); | ||
59 | } | ||
60 | |||
61 | static struct crypto_alg alg = { | ||
62 | .cra_name = "twofish", | ||
63 | .cra_driver_name = "twofish-i586", | ||
64 | .cra_priority = 200, | ||
65 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
66 | .cra_blocksize = TF_BLOCK_SIZE, | ||
67 | .cra_ctxsize = sizeof(struct twofish_ctx), | ||
68 | .cra_alignmask = 3, | ||
69 | .cra_module = THIS_MODULE, | ||
70 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | ||
71 | .cra_u = { | ||
72 | .cipher = { | ||
73 | .cia_min_keysize = TF_MIN_KEY_SIZE, | ||
74 | .cia_max_keysize = TF_MAX_KEY_SIZE, | ||
75 | .cia_setkey = twofish_setkey, | ||
76 | .cia_encrypt = twofish_encrypt, | ||
77 | .cia_decrypt = twofish_decrypt | ||
78 | } | ||
79 | } | ||
80 | }; | ||
81 | |||
82 | static int __init init(void) | ||
83 | { | ||
84 | return crypto_register_alg(&alg); | ||
85 | } | ||
86 | |||
87 | static void __exit fini(void) | ||
88 | { | ||
89 | crypto_unregister_alg(&alg); | ||
90 | } | ||
91 | |||
92 | module_init(init); | ||
93 | module_exit(fini); | ||
94 | |||
95 | MODULE_LICENSE("GPL"); | ||
96 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm, i586 asm optimized"); | ||
97 | MODULE_ALIAS("twofish"); | ||
diff --git a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c index e6ea00edcb54..ea19d091fd41 100644 --- a/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/seq_file.h> | 32 | #include <linux/seq_file.h> |
33 | #include <linux/compiler.h> | 33 | #include <linux/compiler.h> |
34 | #include <linux/sched.h> /* current */ | 34 | #include <linux/sched.h> /* current */ |
35 | #include <linux/dmi.h> | ||
35 | #include <asm/io.h> | 36 | #include <asm/io.h> |
36 | #include <asm/delay.h> | 37 | #include <asm/delay.h> |
37 | #include <asm/uaccess.h> | 38 | #include <asm/uaccess.h> |
@@ -387,6 +388,33 @@ static int acpi_cpufreq_early_init_acpi(void) | |||
387 | return acpi_processor_preregister_performance(acpi_perf_data); | 388 | return acpi_processor_preregister_performance(acpi_perf_data); |
388 | } | 389 | } |
389 | 390 | ||
391 | /* | ||
392 | * Some BIOSes do SW_ANY coordination internally, either set it up in hw | ||
393 | * or do it in BIOS firmware and won't inform about it to OS. If not | ||
394 | * detected, this has a side effect of making CPU run at a different speed | ||
395 | * than OS intended it to run at. Detect it and handle it cleanly. | ||
396 | */ | ||
397 | static int bios_with_sw_any_bug; | ||
398 | |||
399 | static int __init sw_any_bug_found(struct dmi_system_id *d) | ||
400 | { | ||
401 | bios_with_sw_any_bug = 1; | ||
402 | return 0; | ||
403 | } | ||
404 | |||
405 | static struct dmi_system_id __initdata sw_any_bug_dmi_table[] = { | ||
406 | { | ||
407 | .callback = sw_any_bug_found, | ||
408 | .ident = "Supermicro Server X6DLP", | ||
409 | .matches = { | ||
410 | DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"), | ||
411 | DMI_MATCH(DMI_BIOS_VERSION, "080010"), | ||
412 | DMI_MATCH(DMI_PRODUCT_NAME, "X6DLP"), | ||
413 | }, | ||
414 | }, | ||
415 | { } | ||
416 | }; | ||
417 | |||
390 | static int | 418 | static int |
391 | acpi_cpufreq_cpu_init ( | 419 | acpi_cpufreq_cpu_init ( |
392 | struct cpufreq_policy *policy) | 420 | struct cpufreq_policy *policy) |
@@ -422,8 +450,17 @@ acpi_cpufreq_cpu_init ( | |||
422 | * coordination is required. | 450 | * coordination is required. |
423 | */ | 451 | */ |
424 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || | 452 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || |
425 | policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) | 453 | policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) { |
426 | policy->cpus = perf->shared_cpu_map; | 454 | policy->cpus = perf->shared_cpu_map; |
455 | } | ||
456 | |||
457 | #ifdef CONFIG_SMP | ||
458 | dmi_check_system(sw_any_bug_dmi_table); | ||
459 | if (bios_with_sw_any_bug && cpus_weight(policy->cpus) == 1) { | ||
460 | policy->shared_type = CPUFREQ_SHARED_TYPE_ALL; | ||
461 | policy->cpus = cpu_core_map[cpu]; | ||
462 | } | ||
463 | #endif | ||
427 | 464 | ||
428 | if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { | 465 | if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) { |
429 | acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS; | 466 | acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS; |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index 4f2c3aeef724..f5cc9f5c9bab 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/cpufreq.h> | 29 | #include <linux/cpufreq.h> |
30 | #include <linux/pci.h> | ||
30 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
31 | #include <linux/string.h> | 32 | #include <linux/string.h> |
32 | 33 | ||
@@ -52,18 +53,26 @@ | |||
52 | #define CPU_NEHEMIAH 5 | 53 | #define CPU_NEHEMIAH 5 |
53 | 54 | ||
54 | static int cpu_model; | 55 | static int cpu_model; |
55 | static unsigned int numscales=16, numvscales; | 56 | static unsigned int numscales=16; |
56 | static unsigned int fsb; | 57 | static unsigned int fsb; |
57 | static int minvid, maxvid; | 58 | |
59 | static struct mV_pos *vrm_mV_table; | ||
60 | static unsigned char *mV_vrm_table; | ||
61 | struct f_msr { | ||
62 | unsigned char vrm; | ||
63 | }; | ||
64 | static struct f_msr f_msr_table[32]; | ||
65 | |||
66 | static unsigned int highest_speed, lowest_speed; /* kHz */ | ||
58 | static unsigned int minmult, maxmult; | 67 | static unsigned int minmult, maxmult; |
59 | static int can_scale_voltage; | 68 | static int can_scale_voltage; |
60 | static int vrmrev; | ||
61 | static struct acpi_processor *pr = NULL; | 69 | static struct acpi_processor *pr = NULL; |
62 | static struct acpi_processor_cx *cx = NULL; | 70 | static struct acpi_processor_cx *cx = NULL; |
71 | static int port22_en; | ||
63 | 72 | ||
64 | /* Module parameters */ | 73 | /* Module parameters */ |
65 | static int dont_scale_voltage; | 74 | static int scale_voltage; |
66 | 75 | static int ignore_latency; | |
67 | 76 | ||
68 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg) | 77 | #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg) |
69 | 78 | ||
@@ -71,7 +80,6 @@ static int dont_scale_voltage; | |||
71 | /* Clock ratios multiplied by 10 */ | 80 | /* Clock ratios multiplied by 10 */ |
72 | static int clock_ratio[32]; | 81 | static int clock_ratio[32]; |
73 | static int eblcr_table[32]; | 82 | static int eblcr_table[32]; |
74 | static int voltage_table[32]; | ||
75 | static unsigned int highest_speed, lowest_speed; /* kHz */ | 83 | static unsigned int highest_speed, lowest_speed; /* kHz */ |
76 | static int longhaul_version; | 84 | static int longhaul_version; |
77 | static struct cpufreq_frequency_table *longhaul_table; | 85 | static struct cpufreq_frequency_table *longhaul_table; |
@@ -124,10 +132,9 @@ static int longhaul_get_cpu_mult(void) | |||
124 | 132 | ||
125 | /* For processor with BCR2 MSR */ | 133 | /* For processor with BCR2 MSR */ |
126 | 134 | ||
127 | static void do_longhaul1(int cx_address, unsigned int clock_ratio_index) | 135 | static void do_longhaul1(unsigned int clock_ratio_index) |
128 | { | 136 | { |
129 | union msr_bcr2 bcr2; | 137 | union msr_bcr2 bcr2; |
130 | u32 t; | ||
131 | 138 | ||
132 | rdmsrl(MSR_VIA_BCR2, bcr2.val); | 139 | rdmsrl(MSR_VIA_BCR2, bcr2.val); |
133 | /* Enable software clock multiplier */ | 140 | /* Enable software clock multiplier */ |
@@ -136,13 +143,11 @@ static void do_longhaul1(int cx_address, unsigned int clock_ratio_index) | |||
136 | 143 | ||
137 | /* Sync to timer tick */ | 144 | /* Sync to timer tick */ |
138 | safe_halt(); | 145 | safe_halt(); |
139 | ACPI_FLUSH_CPU_CACHE(); | ||
140 | /* Change frequency on next halt or sleep */ | 146 | /* Change frequency on next halt or sleep */ |
141 | wrmsrl(MSR_VIA_BCR2, bcr2.val); | 147 | wrmsrl(MSR_VIA_BCR2, bcr2.val); |
142 | /* Invoke C3 */ | 148 | /* Invoke transition */ |
143 | inb(cx_address); | 149 | ACPI_FLUSH_CPU_CACHE(); |
144 | /* Dummy op - must do something useless after P_LVL3 read */ | 150 | halt(); |
145 | t = inl(acpi_fadt.xpm_tmr_blk.address); | ||
146 | 151 | ||
147 | /* Disable software clock multiplier */ | 152 | /* Disable software clock multiplier */ |
148 | local_irq_disable(); | 153 | local_irq_disable(); |
@@ -164,11 +169,16 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index) | |||
164 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; | 169 | longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4; |
165 | longhaul.bits.EnableSoftBusRatio = 1; | 170 | longhaul.bits.EnableSoftBusRatio = 1; |
166 | 171 | ||
172 | if (can_scale_voltage) { | ||
173 | longhaul.bits.SoftVID = f_msr_table[clock_ratio_index].vrm; | ||
174 | longhaul.bits.EnableSoftVID = 1; | ||
175 | } | ||
176 | |||
167 | /* Sync to timer tick */ | 177 | /* Sync to timer tick */ |
168 | safe_halt(); | 178 | safe_halt(); |
169 | ACPI_FLUSH_CPU_CACHE(); | ||
170 | /* Change frequency on next halt or sleep */ | 179 | /* Change frequency on next halt or sleep */ |
171 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); | 180 | wrmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
181 | ACPI_FLUSH_CPU_CACHE(); | ||
172 | /* Invoke C3 */ | 182 | /* Invoke C3 */ |
173 | inb(cx_address); | 183 | inb(cx_address); |
174 | /* Dummy op - must do something useless after P_LVL3 read */ | 184 | /* Dummy op - must do something useless after P_LVL3 read */ |
@@ -227,10 +237,13 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
227 | outb(0xFF,0xA1); /* Overkill */ | 237 | outb(0xFF,0xA1); /* Overkill */ |
228 | outb(0xFE,0x21); /* TMR0 only */ | 238 | outb(0xFE,0x21); /* TMR0 only */ |
229 | 239 | ||
230 | /* Disable bus master arbitration */ | 240 | if (pr->flags.bm_control) { |
231 | if (pr->flags.bm_check) { | 241 | /* Disable bus master arbitration */ |
232 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, | 242 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1, |
233 | ACPI_MTX_DO_NOT_LOCK); | 243 | ACPI_MTX_DO_NOT_LOCK); |
244 | } else if (port22_en) { | ||
245 | /* Disable AGP and PCI arbiters */ | ||
246 | outb(3, 0x22); | ||
234 | } | 247 | } |
235 | 248 | ||
236 | switch (longhaul_version) { | 249 | switch (longhaul_version) { |
@@ -244,7 +257,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
244 | */ | 257 | */ |
245 | case TYPE_LONGHAUL_V1: | 258 | case TYPE_LONGHAUL_V1: |
246 | case TYPE_LONGHAUL_V2: | 259 | case TYPE_LONGHAUL_V2: |
247 | do_longhaul1(cx->address, clock_ratio_index); | 260 | do_longhaul1(clock_ratio_index); |
248 | break; | 261 | break; |
249 | 262 | ||
250 | /* | 263 | /* |
@@ -259,14 +272,20 @@ static void longhaul_setstate(unsigned int clock_ratio_index) | |||
259 | * to work in practice. | 272 | * to work in practice. |
260 | */ | 273 | */ |
261 | case TYPE_POWERSAVER: | 274 | case TYPE_POWERSAVER: |
275 | /* Don't allow wakeup */ | ||
276 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0, | ||
277 | ACPI_MTX_DO_NOT_LOCK); | ||
262 | do_powersaver(cx->address, clock_ratio_index); | 278 | do_powersaver(cx->address, clock_ratio_index); |
263 | break; | 279 | break; |
264 | } | 280 | } |
265 | 281 | ||
266 | /* Enable bus master arbitration */ | 282 | if (pr->flags.bm_control) { |
267 | if (pr->flags.bm_check) { | 283 | /* Enable bus master arbitration */ |
268 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, | 284 | acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0, |
269 | ACPI_MTX_DO_NOT_LOCK); | 285 | ACPI_MTX_DO_NOT_LOCK); |
286 | } else if (port22_en) { | ||
287 | /* Enable arbiters */ | ||
288 | outb(0, 0x22); | ||
270 | } | 289 | } |
271 | 290 | ||
272 | outb(pic2_mask,0xA1); /* restore mask */ | 291 | outb(pic2_mask,0xA1); /* restore mask */ |
@@ -446,53 +465,57 @@ static int __init longhaul_get_ranges(void) | |||
446 | static void __init longhaul_setup_voltagescaling(void) | 465 | static void __init longhaul_setup_voltagescaling(void) |
447 | { | 466 | { |
448 | union msr_longhaul longhaul; | 467 | union msr_longhaul longhaul; |
468 | struct mV_pos minvid, maxvid; | ||
469 | unsigned int j, speed, pos, kHz_step, numvscales; | ||
449 | 470 | ||
450 | rdmsrl (MSR_VIA_LONGHAUL, longhaul.val); | 471 | rdmsrl(MSR_VIA_LONGHAUL, longhaul.val); |
451 | 472 | if (!(longhaul.bits.RevisionID & 1)) { | |
452 | if (!(longhaul.bits.RevisionID & 1)) | 473 | printk(KERN_INFO PFX "Voltage scaling not supported by CPU.\n"); |
453 | return; | 474 | return; |
475 | } | ||
476 | |||
477 | if (!longhaul.bits.VRMRev) { | ||
478 | printk (KERN_INFO PFX "VRM 8.5\n"); | ||
479 | vrm_mV_table = &vrm85_mV[0]; | ||
480 | mV_vrm_table = &mV_vrm85[0]; | ||
481 | } else { | ||
482 | printk (KERN_INFO PFX "Mobile VRM\n"); | ||
483 | vrm_mV_table = &mobilevrm_mV[0]; | ||
484 | mV_vrm_table = &mV_mobilevrm[0]; | ||
485 | } | ||
454 | 486 | ||
455 | minvid = longhaul.bits.MinimumVID; | 487 | minvid = vrm_mV_table[longhaul.bits.MinimumVID]; |
456 | maxvid = longhaul.bits.MaximumVID; | 488 | maxvid = vrm_mV_table[longhaul.bits.MaximumVID]; |
457 | vrmrev = longhaul.bits.VRMRev; | 489 | numvscales = maxvid.pos - minvid.pos + 1; |
490 | kHz_step = (highest_speed - lowest_speed) / numvscales; | ||
458 | 491 | ||
459 | if (minvid == 0 || maxvid == 0) { | 492 | if (minvid.mV == 0 || maxvid.mV == 0 || minvid.mV > maxvid.mV) { |
460 | printk (KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. " | 493 | printk (KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. " |
461 | "Voltage scaling disabled.\n", | 494 | "Voltage scaling disabled.\n", |
462 | minvid/1000, minvid%1000, maxvid/1000, maxvid%1000); | 495 | minvid.mV/1000, minvid.mV%1000, maxvid.mV/1000, maxvid.mV%1000); |
463 | return; | 496 | return; |
464 | } | 497 | } |
465 | 498 | ||
466 | if (minvid == maxvid) { | 499 | if (minvid.mV == maxvid.mV) { |
467 | printk (KERN_INFO PFX "Claims to support voltage scaling but min & max are " | 500 | printk (KERN_INFO PFX "Claims to support voltage scaling but min & max are " |
468 | "both %d.%03d. Voltage scaling disabled\n", | 501 | "both %d.%03d. Voltage scaling disabled\n", |
469 | maxvid/1000, maxvid%1000); | 502 | maxvid.mV/1000, maxvid.mV%1000); |
470 | return; | 503 | return; |
471 | } | 504 | } |
472 | 505 | ||
473 | if (vrmrev==0) { | 506 | printk(KERN_INFO PFX "Max VID=%d.%03d Min VID=%d.%03d, %d possible voltage scales\n", |
474 | dprintk ("VRM 8.5\n"); | 507 | maxvid.mV/1000, maxvid.mV%1000, |
475 | memcpy (voltage_table, vrm85scales, sizeof(voltage_table)); | 508 | minvid.mV/1000, minvid.mV%1000, |
476 | numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25; | 509 | numvscales); |
477 | } else { | 510 | |
478 | dprintk ("Mobile VRM\n"); | 511 | j = 0; |
479 | memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table)); | 512 | while (longhaul_table[j].frequency != CPUFREQ_TABLE_END) { |
480 | numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5; | 513 | speed = longhaul_table[j].frequency; |
514 | pos = (speed - lowest_speed) / kHz_step + minvid.pos; | ||
515 | f_msr_table[longhaul_table[j].index].vrm = mV_vrm_table[pos]; | ||
516 | j++; | ||
481 | } | 517 | } |
482 | 518 | ||
483 | /* Current voltage isn't readable at first, so we need to | ||
484 | set it to a known value. The spec says to use maxvid */ | ||
485 | longhaul.bits.RevisionKey = longhaul.bits.RevisionID; /* FIXME: This is bad. */ | ||
486 | longhaul.bits.EnableSoftVID = 1; | ||
487 | longhaul.bits.SoftVID = maxvid; | ||
488 | wrmsrl (MSR_VIA_LONGHAUL, longhaul.val); | ||
489 | |||
490 | minvid = voltage_table[minvid]; | ||
491 | maxvid = voltage_table[maxvid]; | ||
492 | |||
493 | dprintk ("Min VID=%d.%03d Max VID=%d.%03d, %d possible voltage scales\n", | ||
494 | maxvid/1000, maxvid%1000, minvid/1000, minvid%1000, numvscales); | ||
495 | |||
496 | can_scale_voltage = 1; | 519 | can_scale_voltage = 1; |
497 | } | 520 | } |
498 | 521 | ||
@@ -540,21 +563,33 @@ static acpi_status longhaul_walk_callback(acpi_handle obj_handle, | |||
540 | return 1; | 563 | return 1; |
541 | } | 564 | } |
542 | 565 | ||
566 | /* VIA don't support PM2 reg, but have something similar */ | ||
567 | static int enable_arbiter_disable(void) | ||
568 | { | ||
569 | struct pci_dev *dev; | ||
570 | u8 pci_cmd; | ||
571 | |||
572 | /* Find PLE133 host bridge */ | ||
573 | dev = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8601_0, NULL); | ||
574 | if (dev != NULL) { | ||
575 | /* Enable access to port 0x22 */ | ||
576 | pci_read_config_byte(dev, 0x78, &pci_cmd); | ||
577 | if ( !(pci_cmd & 1<<7) ) { | ||
578 | pci_cmd |= 1<<7; | ||
579 | pci_write_config_byte(dev, 0x78, pci_cmd); | ||
580 | } | ||
581 | return 1; | ||
582 | } | ||
583 | return 0; | ||
584 | } | ||
585 | |||
543 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | 586 | static int __init longhaul_cpu_init(struct cpufreq_policy *policy) |
544 | { | 587 | { |
545 | struct cpuinfo_x86 *c = cpu_data; | 588 | struct cpuinfo_x86 *c = cpu_data; |
546 | char *cpuname=NULL; | 589 | char *cpuname=NULL; |
547 | int ret; | 590 | int ret; |
548 | 591 | ||
549 | /* Check ACPI support for C3 state */ | 592 | /* Check what we have on this motherboard */ |
550 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, | ||
551 | &longhaul_walk_callback, NULL, (void *)&pr); | ||
552 | if (pr == NULL) goto err_acpi; | ||
553 | |||
554 | cx = &pr->power.states[ACPI_STATE_C3]; | ||
555 | if (cx->address == 0 || cx->latency > 1000) goto err_acpi; | ||
556 | |||
557 | /* Now check what we have on this motherboard */ | ||
558 | switch (c->x86_model) { | 593 | switch (c->x86_model) { |
559 | case 6: | 594 | case 6: |
560 | cpu_model = CPU_SAMUEL; | 595 | cpu_model = CPU_SAMUEL; |
@@ -636,12 +671,36 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy) | |||
636 | break; | 671 | break; |
637 | }; | 672 | }; |
638 | 673 | ||
674 | /* Find ACPI data for processor */ | ||
675 | acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, | ||
676 | &longhaul_walk_callback, NULL, (void *)&pr); | ||
677 | if (pr == NULL) | ||
678 | goto err_acpi; | ||
679 | |||
680 | if (longhaul_version == TYPE_POWERSAVER) { | ||
681 | /* Check ACPI support for C3 state */ | ||
682 | cx = &pr->power.states[ACPI_STATE_C3]; | ||
683 | if (cx->address == 0 || | ||
684 | (cx->latency > 1000 && ignore_latency == 0) ) | ||
685 | goto err_acpi; | ||
686 | |||
687 | } else { | ||
688 | /* Check ACPI support for bus master arbiter disable */ | ||
689 | if (!pr->flags.bm_control) { | ||
690 | if (!enable_arbiter_disable()) { | ||
691 | printk(KERN_ERR PFX "No ACPI support. No VT8601 host bridge. Aborting.\n"); | ||
692 | return -ENODEV; | ||
693 | } else | ||
694 | port22_en = 1; | ||
695 | } | ||
696 | } | ||
697 | |||
639 | ret = longhaul_get_ranges(); | 698 | ret = longhaul_get_ranges(); |
640 | if (ret != 0) | 699 | if (ret != 0) |
641 | return ret; | 700 | return ret; |
642 | 701 | ||
643 | if ((longhaul_version==TYPE_LONGHAUL_V2 || longhaul_version==TYPE_POWERSAVER) && | 702 | if ((longhaul_version==TYPE_LONGHAUL_V2 || longhaul_version==TYPE_POWERSAVER) && |
644 | (dont_scale_voltage==0)) | 703 | (scale_voltage != 0)) |
645 | longhaul_setup_voltagescaling(); | 704 | longhaul_setup_voltagescaling(); |
646 | 705 | ||
647 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; | 706 | policy->governor = CPUFREQ_DEFAULT_GOVERNOR; |
@@ -729,8 +788,10 @@ static void __exit longhaul_exit(void) | |||
729 | kfree(longhaul_table); | 788 | kfree(longhaul_table); |
730 | } | 789 | } |
731 | 790 | ||
732 | module_param (dont_scale_voltage, int, 0644); | 791 | module_param (scale_voltage, int, 0644); |
733 | MODULE_PARM_DESC(dont_scale_voltage, "Don't scale voltage of processor"); | 792 | MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor"); |
793 | module_param(ignore_latency, int, 0644); | ||
794 | MODULE_PARM_DESC(ignore_latency, "Skip ACPI C3 latency test"); | ||
734 | 795 | ||
735 | MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); | 796 | MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>"); |
736 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); | 797 | MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors."); |
@@ -738,4 +799,3 @@ MODULE_LICENSE ("GPL"); | |||
738 | 799 | ||
739 | late_initcall(longhaul_init); | 800 | late_initcall(longhaul_init); |
740 | module_exit(longhaul_exit); | 801 | module_exit(longhaul_exit); |
741 | |||
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.h b/arch/i386/kernel/cpu/cpufreq/longhaul.h index d3a95d77ee85..bc4682aad69b 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.h +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.h | |||
@@ -450,17 +450,45 @@ static int __initdata nehemiah_c_eblcr[32] = { | |||
450 | * Voltage scales. Div/Mod by 1000 to get actual voltage. | 450 | * Voltage scales. Div/Mod by 1000 to get actual voltage. |
451 | * Which scale to use depends on the VRM type in use. | 451 | * Which scale to use depends on the VRM type in use. |
452 | */ | 452 | */ |
453 | static int __initdata vrm85scales[32] = { | 453 | |
454 | 1250, 1200, 1150, 1100, 1050, 1800, 1750, 1700, | 454 | struct mV_pos { |
455 | 1650, 1600, 1550, 1500, 1450, 1400, 1350, 1300, | 455 | unsigned short mV; |
456 | 1275, 1225, 1175, 1125, 1075, 1825, 1775, 1725, | 456 | unsigned short pos; |
457 | 1675, 1625, 1575, 1525, 1475, 1425, 1375, 1325, | 457 | }; |
458 | |||
459 | static struct mV_pos __initdata vrm85_mV[32] = { | ||
460 | {1250, 8}, {1200, 6}, {1150, 4}, {1100, 2}, | ||
461 | {1050, 0}, {1800, 30}, {1750, 28}, {1700, 26}, | ||
462 | {1650, 24}, {1600, 22}, {1550, 20}, {1500, 18}, | ||
463 | {1450, 16}, {1400, 14}, {1350, 12}, {1300, 10}, | ||
464 | {1275, 9}, {1225, 7}, {1175, 5}, {1125, 3}, | ||
465 | {1075, 1}, {1825, 31}, {1775, 29}, {1725, 27}, | ||
466 | {1675, 25}, {1625, 23}, {1575, 21}, {1525, 19}, | ||
467 | {1475, 17}, {1425, 15}, {1375, 13}, {1325, 11} | ||
468 | }; | ||
469 | |||
470 | static unsigned char __initdata mV_vrm85[32] = { | ||
471 | 0x04, 0x14, 0x03, 0x13, 0x02, 0x12, 0x01, 0x11, | ||
472 | 0x00, 0x10, 0x0f, 0x1f, 0x0e, 0x1e, 0x0d, 0x1d, | ||
473 | 0x0c, 0x1c, 0x0b, 0x1b, 0x0a, 0x1a, 0x09, 0x19, | ||
474 | 0x08, 0x18, 0x07, 0x17, 0x06, 0x16, 0x05, 0x15 | ||
475 | }; | ||
476 | |||
477 | static struct mV_pos __initdata mobilevrm_mV[32] = { | ||
478 | {1750, 31}, {1700, 30}, {1650, 29}, {1600, 28}, | ||
479 | {1550, 27}, {1500, 26}, {1450, 25}, {1400, 24}, | ||
480 | {1350, 23}, {1300, 22}, {1250, 21}, {1200, 20}, | ||
481 | {1150, 19}, {1100, 18}, {1050, 17}, {1000, 16}, | ||
482 | {975, 15}, {950, 14}, {925, 13}, {900, 12}, | ||
483 | {875, 11}, {850, 10}, {825, 9}, {800, 8}, | ||
484 | {775, 7}, {750, 6}, {725, 5}, {700, 4}, | ||
485 | {675, 3}, {650, 2}, {625, 1}, {600, 0} | ||
458 | }; | 486 | }; |
459 | 487 | ||
460 | static int __initdata mobilevrmscales[32] = { | 488 | static unsigned char __initdata mV_mobilevrm[32] = { |
461 | 2000, 1950, 1900, 1850, 1800, 1750, 1700, 1650, | 489 | 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18, |
462 | 1600, 1550, 1500, 1450, 1500, 1350, 1300, -1, | 490 | 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, |
463 | 1275, 1250, 1225, 1200, 1175, 1150, 1125, 1100, | 491 | 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, |
464 | 1075, 1050, 1025, 1000, 975, 950, 925, -1, | 492 | 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 |
465 | }; | 493 | }; |
466 | 494 | ||
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c index b77f1358bd79..7a9325349e94 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI | 24 | #ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI |
25 | #include <linux/acpi.h> | 25 | #include <linux/acpi.h> |
26 | #include <linux/dmi.h> | ||
26 | #include <acpi/processor.h> | 27 | #include <acpi/processor.h> |
27 | #endif | 28 | #endif |
28 | 29 | ||
@@ -377,6 +378,35 @@ static int centrino_cpu_early_init_acpi(void) | |||
377 | return 0; | 378 | return 0; |
378 | } | 379 | } |
379 | 380 | ||
381 | |||
382 | /* | ||
383 | * Some BIOSes do SW_ANY coordination internally, either set it up in hw | ||
384 | * or do it in BIOS firmware and won't inform about it to OS. If not | ||
385 | * detected, this has a side effect of making CPU run at a different speed | ||
386 | * than OS intended it to run at. Detect it and handle it cleanly. | ||
387 | */ | ||
388 | static int bios_with_sw_any_bug; | ||
389 | static int __init sw_any_bug_found(struct dmi_system_id *d) | ||
390 | { | ||
391 | bios_with_sw_any_bug = 1; | ||
392 | return 0; | ||
393 | } | ||
394 | |||
395 | |||
396 | static struct dmi_system_id sw_any_bug_dmi_table[] = { | ||
397 | { | ||
398 | .callback = sw_any_bug_found, | ||
399 | .ident = "Supermicro Server X6DLP", | ||
400 | .matches = { | ||
401 | DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"), | ||
402 | DMI_MATCH(DMI_BIOS_VERSION, "080010"), | ||
403 | DMI_MATCH(DMI_PRODUCT_NAME, "X6DLP"), | ||
404 | }, | ||
405 | }, | ||
406 | { } | ||
407 | }; | ||
408 | |||
409 | |||
380 | /* | 410 | /* |
381 | * centrino_cpu_init_acpi - register with ACPI P-States library | 411 | * centrino_cpu_init_acpi - register with ACPI P-States library |
382 | * | 412 | * |
@@ -398,14 +428,24 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) | |||
398 | dprintk(PFX "obtaining ACPI data failed\n"); | 428 | dprintk(PFX "obtaining ACPI data failed\n"); |
399 | return -EIO; | 429 | return -EIO; |
400 | } | 430 | } |
431 | |||
401 | policy->shared_type = p->shared_type; | 432 | policy->shared_type = p->shared_type; |
402 | /* | 433 | /* |
403 | * Will let policy->cpus know about dependency only when software | 434 | * Will let policy->cpus know about dependency only when software |
404 | * coordination is required. | 435 | * coordination is required. |
405 | */ | 436 | */ |
406 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || | 437 | if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL || |
407 | policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) | 438 | policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) { |
408 | policy->cpus = p->shared_cpu_map; | 439 | policy->cpus = p->shared_cpu_map; |
440 | } | ||
441 | |||
442 | #ifdef CONFIG_SMP | ||
443 | dmi_check_system(sw_any_bug_dmi_table); | ||
444 | if (bios_with_sw_any_bug && cpus_weight(policy->cpus) == 1) { | ||
445 | policy->shared_type = CPUFREQ_SHARED_TYPE_ALL; | ||
446 | policy->cpus = cpu_core_map[cpu]; | ||
447 | } | ||
448 | #endif | ||
409 | 449 | ||
410 | /* verify the acpi_data */ | 450 | /* verify the acpi_data */ |
411 | if (p->state_count <= 1) { | 451 | if (p->state_count <= 1) { |
diff --git a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S index 37a7d2eaf4a0..87f9f60b803b 100644 --- a/arch/i386/kernel/entry.S +++ b/arch/i386/kernel/entry.S | |||
@@ -209,6 +209,10 @@ ENTRY(ret_from_fork) | |||
209 | GET_THREAD_INFO(%ebp) | 209 | GET_THREAD_INFO(%ebp) |
210 | popl %eax | 210 | popl %eax |
211 | CFI_ADJUST_CFA_OFFSET -4 | 211 | CFI_ADJUST_CFA_OFFSET -4 |
212 | pushl $0x0202 # Reset kernel eflags | ||
213 | CFI_ADJUST_CFA_OFFSET 4 | ||
214 | popfl | ||
215 | CFI_ADJUST_CFA_OFFSET -4 | ||
212 | jmp syscall_exit | 216 | jmp syscall_exit |
213 | CFI_ENDPROC | 217 | CFI_ENDPROC |
214 | 218 | ||
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 345ffb7d904d..f1682206d304 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -956,6 +956,38 @@ efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg) | |||
956 | return 0; | 956 | return 0; |
957 | } | 957 | } |
958 | 958 | ||
959 | /* | ||
960 | * This function checks if the entire range <start,end> is mapped with type. | ||
961 | * | ||
962 | * Note: this function only works correct if the e820 table is sorted and | ||
963 | * not-overlapping, which is the case | ||
964 | */ | ||
965 | int __init | ||
966 | e820_all_mapped(unsigned long s, unsigned long e, unsigned type) | ||
967 | { | ||
968 | u64 start = s; | ||
969 | u64 end = e; | ||
970 | int i; | ||
971 | for (i = 0; i < e820.nr_map; i++) { | ||
972 | struct e820entry *ei = &e820.map[i]; | ||
973 | if (type && ei->type != type) | ||
974 | continue; | ||
975 | /* is the region (part) in overlap with the current region ?*/ | ||
976 | if (ei->addr >= end || ei->addr + ei->size <= start) | ||
977 | continue; | ||
978 | /* if the region is at the beginning of <start,end> we move | ||
979 | * start to the end of the region since it's ok until there | ||
980 | */ | ||
981 | if (ei->addr <= start) | ||
982 | start = ei->addr + ei->size; | ||
983 | /* if start is now at or beyond end, we're done, full | ||
984 | * coverage */ | ||
985 | if (start >= end) | ||
986 | return 1; /* we're done */ | ||
987 | } | ||
988 | return 0; | ||
989 | } | ||
990 | |||
959 | /* | 991 | /* |
960 | * Find the highest page frame number we have available | 992 | * Find the highest page frame number we have available |
961 | */ | 993 | */ |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index f948419c888a..efe07990e7fc 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -642,9 +642,13 @@ static void map_cpu_to_logical_apicid(void) | |||
642 | { | 642 | { |
643 | int cpu = smp_processor_id(); | 643 | int cpu = smp_processor_id(); |
644 | int apicid = logical_smp_processor_id(); | 644 | int apicid = logical_smp_processor_id(); |
645 | int node = apicid_to_node(apicid); | ||
646 | |||
647 | if (!node_online(node)) | ||
648 | node = first_online_node; | ||
645 | 649 | ||
646 | cpu_2_logical_apicid[cpu] = apicid; | 650 | cpu_2_logical_apicid[cpu] = apicid; |
647 | map_cpu_to_node(cpu, apicid_to_node(apicid)); | 651 | map_cpu_to_node(cpu, node); |
648 | } | 652 | } |
649 | 653 | ||
650 | static void unmap_cpu_to_logical_apicid(int cpu) | 654 | static void unmap_cpu_to_logical_apicid(int cpu) |
diff --git a/arch/i386/mm/boot_ioremap.c b/arch/i386/mm/boot_ioremap.c index 5d44f4f5ff59..4de11f508c3a 100644 --- a/arch/i386/mm/boot_ioremap.c +++ b/arch/i386/mm/boot_ioremap.c | |||
@@ -29,8 +29,11 @@ | |||
29 | */ | 29 | */ |
30 | 30 | ||
31 | #define BOOT_PTE_PTRS (PTRS_PER_PTE*2) | 31 | #define BOOT_PTE_PTRS (PTRS_PER_PTE*2) |
32 | #define boot_pte_index(address) \ | 32 | |
33 | (((address) >> PAGE_SHIFT) & (BOOT_PTE_PTRS - 1)) | 33 | static unsigned long boot_pte_index(unsigned long vaddr) |
34 | { | ||
35 | return __pa(vaddr) >> PAGE_SHIFT; | ||
36 | } | ||
34 | 37 | ||
35 | static inline boot_pte_t* boot_vaddr_to_pte(void *address) | 38 | static inline boot_pte_t* boot_vaddr_to_pte(void *address) |
36 | { | 39 | { |
diff --git a/arch/i386/oprofile/nmi_int.c b/arch/i386/oprofile/nmi_int.c index c8c1df8ff2b4..5f8dc8a21bd7 100644 --- a/arch/i386/oprofile/nmi_int.c +++ b/arch/i386/oprofile/nmi_int.c | |||
@@ -337,6 +337,8 @@ static int __init ppro_init(char ** cpu_type) | |||
337 | 337 | ||
338 | if (cpu_model == 14) | 338 | if (cpu_model == 14) |
339 | *cpu_type = "i386/core"; | 339 | *cpu_type = "i386/core"; |
340 | else if (cpu_model == 15) | ||
341 | *cpu_type = "i386/core_2"; | ||
340 | else if (cpu_model > 0xd) | 342 | else if (cpu_model > 0xd) |
341 | return 0; | 343 | return 0; |
342 | else if (cpu_model == 9) { | 344 | else if (cpu_model == 9) { |
diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c index 1220dd828ce3..0a362e3aeac5 100644 --- a/arch/i386/pci/common.c +++ b/arch/i386/pci/common.c | |||
@@ -237,11 +237,6 @@ char * __devinit pcibios_setup(char *str) | |||
237 | pci_probe &= ~PCI_PROBE_MMCONF; | 237 | pci_probe &= ~PCI_PROBE_MMCONF; |
238 | return NULL; | 238 | return NULL; |
239 | } | 239 | } |
240 | /* override DMI blacklist */ | ||
241 | else if (!strcmp(str, "mmconf")) { | ||
242 | pci_probe |= PCI_PROBE_MMCONF_FORCE; | ||
243 | return NULL; | ||
244 | } | ||
245 | #endif | 240 | #endif |
246 | else if (!strcmp(str, "noacpi")) { | 241 | else if (!strcmp(str, "noacpi")) { |
247 | acpi_noirq_set(); | 242 | acpi_noirq_set(); |
diff --git a/arch/i386/pci/mmconfig.c b/arch/i386/pci/mmconfig.c index ef5a2faa7d82..972180f738d9 100644 --- a/arch/i386/pci/mmconfig.c +++ b/arch/i386/pci/mmconfig.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/acpi.h> | 14 | #include <linux/acpi.h> |
15 | #include <linux/dmi.h> | ||
16 | #include <asm/e820.h> | 15 | #include <asm/e820.h> |
17 | #include "pci.h" | 16 | #include "pci.h" |
18 | 17 | ||
@@ -188,31 +187,9 @@ static __init void unreachable_devices(void) | |||
188 | } | 187 | } |
189 | } | 188 | } |
190 | 189 | ||
191 | static int disable_mcfg(struct dmi_system_id *d) | ||
192 | { | ||
193 | printk("PCI: %s detected. Disabling MCFG.\n", d->ident); | ||
194 | pci_probe &= ~PCI_PROBE_MMCONF; | ||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | static struct dmi_system_id __initdata dmi_bad_mcfg[] = { | ||
199 | /* Has broken MCFG table that makes the system hang when used */ | ||
200 | { | ||
201 | .callback = disable_mcfg, | ||
202 | .ident = "Intel D3C5105 SDV", | ||
203 | .matches = { | ||
204 | DMI_MATCH(DMI_BIOS_VENDOR, "Intel"), | ||
205 | DMI_MATCH(DMI_BOARD_NAME, "D26928"), | ||
206 | }, | ||
207 | }, | ||
208 | {} | ||
209 | }; | ||
210 | |||
211 | void __init pci_mmcfg_init(void) | 190 | void __init pci_mmcfg_init(void) |
212 | { | 191 | { |
213 | dmi_check_system(dmi_bad_mcfg); | 192 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) |
214 | |||
215 | if ((pci_probe & (PCI_PROBE_MMCONF_FORCE|PCI_PROBE_MMCONF)) == 0) | ||
216 | return; | 193 | return; |
217 | 194 | ||
218 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); | 195 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); |
@@ -221,6 +198,15 @@ void __init pci_mmcfg_init(void) | |||
221 | (pci_mmcfg_config[0].base_address == 0)) | 198 | (pci_mmcfg_config[0].base_address == 0)) |
222 | return; | 199 | return; |
223 | 200 | ||
201 | if (!e820_all_mapped(pci_mmcfg_config[0].base_address, | ||
202 | pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN, | ||
203 | E820_RESERVED)) { | ||
204 | printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n", | ||
205 | pci_mmcfg_config[0].base_address); | ||
206 | printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); | ||
207 | return; | ||
208 | } | ||
209 | |||
224 | printk(KERN_INFO "PCI: Using MMCONFIG\n"); | 210 | printk(KERN_INFO "PCI: Using MMCONFIG\n"); |
225 | raw_pci_ops = &pci_mmcfg; | 211 | raw_pci_ops = &pci_mmcfg; |
226 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 212 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
diff --git a/arch/i386/pci/pci.h b/arch/i386/pci/pci.h index 49a849b3a241..bf4e79335388 100644 --- a/arch/i386/pci/pci.h +++ b/arch/i386/pci/pci.h | |||
@@ -16,8 +16,7 @@ | |||
16 | #define PCI_PROBE_CONF1 0x0002 | 16 | #define PCI_PROBE_CONF1 0x0002 |
17 | #define PCI_PROBE_CONF2 0x0004 | 17 | #define PCI_PROBE_CONF2 0x0004 |
18 | #define PCI_PROBE_MMCONF 0x0008 | 18 | #define PCI_PROBE_MMCONF 0x0008 |
19 | #define PCI_PROBE_MMCONF_FORCE 0x0010 | 19 | #define PCI_PROBE_MASK 0x000f |
20 | #define PCI_PROBE_MASK 0x00ff | ||
21 | 20 | ||
22 | #define PCI_NO_SORT 0x0100 | 21 | #define PCI_NO_SORT 0x0100 |
23 | #define PCI_BIOS_SORT 0x0200 | 22 | #define PCI_BIOS_SORT 0x0200 |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 0176556aeecc..32c3abededc6 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -771,16 +771,19 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, long physid) | |||
771 | { | 771 | { |
772 | #ifdef CONFIG_ACPI_NUMA | 772 | #ifdef CONFIG_ACPI_NUMA |
773 | int pxm_id; | 773 | int pxm_id; |
774 | int nid; | ||
774 | 775 | ||
775 | pxm_id = acpi_get_pxm(handle); | 776 | pxm_id = acpi_get_pxm(handle); |
776 | |||
777 | /* | 777 | /* |
778 | * Assuming that the container driver would have set the proximity | 778 | * We don't have cpu-only-node hotadd. But if the system equips |
779 | * domain and would have initialized pxm_to_node(pxm_id) && pxm_flag | 779 | * SRAT table, pxm is already found and node is ready. |
780 | * So, just pxm_to_nid(pxm) is OK. | ||
781 | * This code here is for the system which doesn't have full SRAT | ||
782 | * table for possible cpus. | ||
780 | */ | 783 | */ |
781 | node_cpuid[cpu].nid = (pxm_id < 0) ? 0 : pxm_to_node(pxm_id); | 784 | nid = acpi_map_pxm_to_node(pxm_id); |
782 | |||
783 | node_cpuid[cpu].phys_id = physid; | 785 | node_cpuid[cpu].phys_id = physid; |
786 | node_cpuid[cpu].nid = nid; | ||
784 | #endif | 787 | #endif |
785 | return (0); | 788 | return (0); |
786 | } | 789 | } |
diff --git a/arch/ia64/kernel/numa.c b/arch/ia64/kernel/numa.c index 1cc360c83e7a..20340631179f 100644 --- a/arch/ia64/kernel/numa.c +++ b/arch/ia64/kernel/numa.c | |||
@@ -29,6 +29,36 @@ EXPORT_SYMBOL(cpu_to_node_map); | |||
29 | 29 | ||
30 | cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; | 30 | cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; |
31 | 31 | ||
32 | void __cpuinit map_cpu_to_node(int cpu, int nid) | ||
33 | { | ||
34 | int oldnid; | ||
35 | if (nid < 0) { /* just initialize by zero */ | ||
36 | cpu_to_node_map[cpu] = 0; | ||
37 | return; | ||
38 | } | ||
39 | /* sanity check first */ | ||
40 | oldnid = cpu_to_node_map[cpu]; | ||
41 | if (cpu_isset(cpu, node_to_cpu_mask[oldnid])) { | ||
42 | return; /* nothing to do */ | ||
43 | } | ||
44 | /* we don't have cpu-driven node hot add yet... | ||
45 | In usual case, node is created from SRAT at boot time. */ | ||
46 | if (!node_online(nid)) | ||
47 | nid = first_online_node; | ||
48 | cpu_to_node_map[cpu] = nid; | ||
49 | cpu_set(cpu, node_to_cpu_mask[nid]); | ||
50 | return; | ||
51 | } | ||
52 | |||
53 | void __cpuinit unmap_cpu_from_node(int cpu, int nid) | ||
54 | { | ||
55 | WARN_ON(!cpu_isset(cpu, node_to_cpu_mask[nid])); | ||
56 | WARN_ON(cpu_to_node_map[cpu] != nid); | ||
57 | cpu_to_node_map[cpu] = 0; | ||
58 | cpu_clear(cpu, node_to_cpu_mask[nid]); | ||
59 | } | ||
60 | |||
61 | |||
32 | /** | 62 | /** |
33 | * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays | 63 | * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays |
34 | * | 64 | * |
@@ -49,8 +79,6 @@ void __init build_cpu_to_node_map(void) | |||
49 | node = node_cpuid[i].nid; | 79 | node = node_cpuid[i].nid; |
50 | break; | 80 | break; |
51 | } | 81 | } |
52 | cpu_to_node_map[cpu] = (node >= 0) ? node : 0; | 82 | map_cpu_to_node(cpu, node); |
53 | if (node >= 0) | ||
54 | cpu_set(cpu, node_to_cpu_mask[node]); | ||
55 | } | 83 | } |
56 | } | 84 | } |
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index f648c610b10c..05bdf7affb43 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c | |||
@@ -36,6 +36,9 @@ int arch_register_cpu(int num) | |||
36 | */ | 36 | */ |
37 | if (!can_cpei_retarget() && is_cpu_cpei_target(num)) | 37 | if (!can_cpei_retarget() && is_cpu_cpei_target(num)) |
38 | sysfs_cpus[num].cpu.no_control = 1; | 38 | sysfs_cpus[num].cpu.no_control = 1; |
39 | #ifdef CONFIG_NUMA | ||
40 | map_cpu_to_node(num, node_cpuid[num].nid); | ||
41 | #endif | ||
39 | #endif | 42 | #endif |
40 | 43 | ||
41 | return register_cpu(&sysfs_cpus[num].cpu, num); | 44 | return register_cpu(&sysfs_cpus[num].cpu, num); |
@@ -45,7 +48,8 @@ int arch_register_cpu(int num) | |||
45 | 48 | ||
46 | void arch_unregister_cpu(int num) | 49 | void arch_unregister_cpu(int num) |
47 | { | 50 | { |
48 | return unregister_cpu(&sysfs_cpus[num].cpu); | 51 | unregister_cpu(&sysfs_cpus[num].cpu); |
52 | unmap_cpu_from_node(num, cpu_to_node(num)); | ||
49 | } | 53 | } |
50 | EXPORT_SYMBOL(arch_register_cpu); | 54 | EXPORT_SYMBOL(arch_register_cpu); |
51 | EXPORT_SYMBOL(arch_unregister_cpu); | 55 | EXPORT_SYMBOL(arch_unregister_cpu); |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index afc776f821e5..e73774136b55 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -36,7 +36,8 @@ zliblinuxheader := zlib.h zconf.h zutil.h | |||
36 | $(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) | 36 | $(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) |
37 | #$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h) | 37 | #$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h) |
38 | 38 | ||
39 | src-boot := crt0.S string.S prom.c stdio.c main.c div64.S | 39 | src-boot-$(CONFIG_PPC_MULTIPLATFORM) := of.c |
40 | src-boot := crt0.S string.S stdio.c main.c div64.S $(src-boot-y) | ||
40 | src-boot += $(zlib) | 41 | src-boot += $(zlib) |
41 | src-boot := $(addprefix $(obj)/, $(src-boot)) | 42 | src-boot := $(addprefix $(obj)/, $(src-boot)) |
42 | obj-boot := $(addsuffix .o, $(basename $(src-boot))) | 43 | obj-boot := $(addsuffix .o, $(basename $(src-boot))) |
diff --git a/arch/powerpc/boot/flatdevtree.h b/arch/powerpc/boot/flatdevtree.h new file mode 100644 index 000000000000..761c8dc84008 --- /dev/null +++ b/arch/powerpc/boot/flatdevtree.h | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License as published by | ||
4 | * the Free Software Foundation; either version 2 of the License, or | ||
5 | * (at your option) any later version. | ||
6 | * | ||
7 | * This program is distributed in the hope that it will be useful, | ||
8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
10 | * GNU General Public License for more details. | ||
11 | * | ||
12 | * You should have received a copy of the GNU General Public License | ||
13 | * along with this program; if not, write to the Free Software | ||
14 | * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
15 | */ | ||
16 | |||
17 | #ifndef FLATDEVTREE_H | ||
18 | #define FLATDEVTREE_H | ||
19 | |||
20 | #include "types.h" | ||
21 | |||
22 | /* Definitions used by the flattened device tree */ | ||
23 | #define OF_DT_HEADER 0xd00dfeed /* marker */ | ||
24 | #define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */ | ||
25 | #define OF_DT_END_NODE 0x2 /* End node */ | ||
26 | #define OF_DT_PROP 0x3 /* Property: name off, size, content */ | ||
27 | #define OF_DT_NOP 0x4 /* nop */ | ||
28 | #define OF_DT_END 0x9 | ||
29 | |||
30 | #define OF_DT_VERSION 0x10 | ||
31 | |||
32 | struct boot_param_header { | ||
33 | u32 magic; /* magic word OF_DT_HEADER */ | ||
34 | u32 totalsize; /* total size of DT block */ | ||
35 | u32 off_dt_struct; /* offset to structure */ | ||
36 | u32 off_dt_strings; /* offset to strings */ | ||
37 | u32 off_mem_rsvmap; /* offset to memory reserve map */ | ||
38 | u32 version; /* format version */ | ||
39 | u32 last_comp_version; /* last compatible version */ | ||
40 | /* version 2 fields below */ | ||
41 | u32 boot_cpuid_phys; /* Physical CPU id we're booting on */ | ||
42 | /* version 3 fields below */ | ||
43 | u32 dt_strings_size; /* size of the DT strings block */ | ||
44 | }; | ||
45 | |||
46 | #endif /* FLATDEVTREE_H */ | ||
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c index b66634c9ea34..d719bb9333d1 100644 --- a/arch/powerpc/boot/main.c +++ b/arch/powerpc/boot/main.c | |||
@@ -14,17 +14,12 @@ | |||
14 | #include "page.h" | 14 | #include "page.h" |
15 | #include "string.h" | 15 | #include "string.h" |
16 | #include "stdio.h" | 16 | #include "stdio.h" |
17 | #include "prom.h" | ||
18 | #include "zlib.h" | 17 | #include "zlib.h" |
18 | #include "ops.h" | ||
19 | #include "flatdevtree.h" | ||
19 | 20 | ||
20 | extern void flush_cache(void *, unsigned long); | 21 | extern void flush_cache(void *, unsigned long); |
21 | 22 | ||
22 | |||
23 | /* Value picked to match that used by yaboot */ | ||
24 | #define PROG_START 0x01400000 /* only used on 64-bit systems */ | ||
25 | #define RAM_END (512<<20) /* Fixme: use OF */ | ||
26 | #define ONE_MB 0x100000 | ||
27 | |||
28 | extern char _start[]; | 23 | extern char _start[]; |
29 | extern char __bss_start[]; | 24 | extern char __bss_start[]; |
30 | extern char _end[]; | 25 | extern char _end[]; |
@@ -33,14 +28,6 @@ extern char _vmlinux_end[]; | |||
33 | extern char _initrd_start[]; | 28 | extern char _initrd_start[]; |
34 | extern char _initrd_end[]; | 29 | extern char _initrd_end[]; |
35 | 30 | ||
36 | /* A buffer that may be edited by tools operating on a zImage binary so as to | ||
37 | * edit the command line passed to vmlinux (by setting /chosen/bootargs). | ||
38 | * The buffer is put in it's own section so that tools may locate it easier. | ||
39 | */ | ||
40 | static char builtin_cmdline[512] | ||
41 | __attribute__((section("__builtin_cmdline"))); | ||
42 | |||
43 | |||
44 | struct addr_range { | 31 | struct addr_range { |
45 | unsigned long addr; | 32 | unsigned long addr; |
46 | unsigned long size; | 33 | unsigned long size; |
@@ -51,21 +38,16 @@ static struct addr_range vmlinuz; | |||
51 | static struct addr_range initrd; | 38 | static struct addr_range initrd; |
52 | 39 | ||
53 | static unsigned long elfoffset; | 40 | static unsigned long elfoffset; |
41 | static int is_64bit; | ||
54 | 42 | ||
55 | static char scratch[46912]; /* scratch space for gunzip, from zlib_inflate_workspacesize() */ | 43 | /* scratch space for gunzip; 46912 is from zlib_inflate_workspacesize() */ |
44 | static char scratch[46912]; | ||
56 | static char elfheader[256]; | 45 | static char elfheader[256]; |
57 | 46 | ||
58 | 47 | typedef void (*kernel_entry_t)(unsigned long, unsigned long, void *); | |
59 | typedef void (*kernel_entry_t)( unsigned long, | ||
60 | unsigned long, | ||
61 | void *, | ||
62 | void *); | ||
63 | |||
64 | 48 | ||
65 | #undef DEBUG | 49 | #undef DEBUG |
66 | 50 | ||
67 | static unsigned long claim_base; | ||
68 | |||
69 | #define HEAD_CRC 2 | 51 | #define HEAD_CRC 2 |
70 | #define EXTRA_FIELD 4 | 52 | #define EXTRA_FIELD 4 |
71 | #define ORIG_NAME 8 | 53 | #define ORIG_NAME 8 |
@@ -123,24 +105,6 @@ static void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp) | |||
123 | zlib_inflateEnd(&s); | 105 | zlib_inflateEnd(&s); |
124 | } | 106 | } |
125 | 107 | ||
126 | static unsigned long try_claim(unsigned long size) | ||
127 | { | ||
128 | unsigned long addr = 0; | ||
129 | |||
130 | for(; claim_base < RAM_END; claim_base += ONE_MB) { | ||
131 | #ifdef DEBUG | ||
132 | printf(" trying: 0x%08lx\n\r", claim_base); | ||
133 | #endif | ||
134 | addr = (unsigned long)claim(claim_base, size, 0); | ||
135 | if ((void *)addr != (void *)-1) | ||
136 | break; | ||
137 | } | ||
138 | if (addr == 0) | ||
139 | return 0; | ||
140 | claim_base = PAGE_ALIGN(claim_base + size); | ||
141 | return addr; | ||
142 | } | ||
143 | |||
144 | static int is_elf64(void *hdr) | 108 | static int is_elf64(void *hdr) |
145 | { | 109 | { |
146 | Elf64_Ehdr *elf64 = hdr; | 110 | Elf64_Ehdr *elf64 = hdr; |
@@ -169,16 +133,7 @@ static int is_elf64(void *hdr) | |||
169 | vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset; | 133 | vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset; |
170 | vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset; | 134 | vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset; |
171 | 135 | ||
172 | #if defined(PROG_START) | 136 | is_64bit = 1; |
173 | /* | ||
174 | * Maintain a "magic" minimum address. This keeps some older | ||
175 | * firmware platforms running. | ||
176 | */ | ||
177 | |||
178 | if (claim_base < PROG_START) | ||
179 | claim_base = PROG_START; | ||
180 | #endif | ||
181 | |||
182 | return 1; | 137 | return 1; |
183 | } | 138 | } |
184 | 139 | ||
@@ -212,47 +167,9 @@ static int is_elf32(void *hdr) | |||
212 | return 1; | 167 | return 1; |
213 | } | 168 | } |
214 | 169 | ||
215 | void export_cmdline(void* chosen_handle) | 170 | static void prep_kernel(unsigned long *a1, unsigned long *a2) |
216 | { | ||
217 | int len; | ||
218 | char cmdline[2] = { 0, 0 }; | ||
219 | |||
220 | if (builtin_cmdline[0] == 0) | ||
221 | return; | ||
222 | |||
223 | len = getprop(chosen_handle, "bootargs", cmdline, sizeof(cmdline)); | ||
224 | if (len > 0 && cmdline[0] != 0) | ||
225 | return; | ||
226 | |||
227 | setprop(chosen_handle, "bootargs", builtin_cmdline, | ||
228 | strlen(builtin_cmdline) + 1); | ||
229 | } | ||
230 | |||
231 | |||
232 | void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | ||
233 | { | 171 | { |
234 | int len; | 172 | int len; |
235 | kernel_entry_t kernel_entry; | ||
236 | |||
237 | memset(__bss_start, 0, _end - __bss_start); | ||
238 | |||
239 | prom = (int (*)(void *)) promptr; | ||
240 | chosen_handle = finddevice("/chosen"); | ||
241 | if (chosen_handle == (void *) -1) | ||
242 | exit(); | ||
243 | if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4) | ||
244 | exit(); | ||
245 | |||
246 | printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", _start, sp); | ||
247 | |||
248 | /* | ||
249 | * The first available claim_base must be above the end of the | ||
250 | * the loaded kernel wrapper file (_start to _end includes the | ||
251 | * initrd image if it is present) and rounded up to a nice | ||
252 | * 1 MB boundary for good measure. | ||
253 | */ | ||
254 | |||
255 | claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); | ||
256 | 173 | ||
257 | vmlinuz.addr = (unsigned long)_vmlinux_start; | 174 | vmlinuz.addr = (unsigned long)_vmlinux_start; |
258 | vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start); | 175 | vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start); |
@@ -263,43 +180,51 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | |||
263 | gunzip(elfheader, sizeof(elfheader), | 180 | gunzip(elfheader, sizeof(elfheader), |
264 | (unsigned char *)vmlinuz.addr, &len); | 181 | (unsigned char *)vmlinuz.addr, &len); |
265 | } else | 182 | } else |
266 | memcpy(elfheader, (const void *)vmlinuz.addr, sizeof(elfheader)); | 183 | memcpy(elfheader, (const void *)vmlinuz.addr, |
184 | sizeof(elfheader)); | ||
267 | 185 | ||
268 | if (!is_elf64(elfheader) && !is_elf32(elfheader)) { | 186 | if (!is_elf64(elfheader) && !is_elf32(elfheader)) { |
269 | printf("Error: not a valid PPC32 or PPC64 ELF file!\n\r"); | 187 | printf("Error: not a valid PPC32 or PPC64 ELF file!\n\r"); |
270 | exit(); | 188 | exit(); |
271 | } | 189 | } |
190 | if (platform_ops.image_hdr) | ||
191 | platform_ops.image_hdr(elfheader); | ||
272 | 192 | ||
273 | /* We need to claim the memsize plus the file offset since gzip | 193 | /* We need to alloc the memsize plus the file offset since gzip |
274 | * will expand the header (file offset), then the kernel, then | 194 | * will expand the header (file offset), then the kernel, then |
275 | * possible rubbish we don't care about. But the kernel bss must | 195 | * possible rubbish we don't care about. But the kernel bss must |
276 | * be claimed (it will be zero'd by the kernel itself) | 196 | * be claimed (it will be zero'd by the kernel itself) |
277 | */ | 197 | */ |
278 | printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux.memsize); | 198 | printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux.memsize); |
279 | vmlinux.addr = try_claim(vmlinux.memsize); | 199 | vmlinux.addr = (unsigned long)malloc(vmlinux.memsize); |
280 | if (vmlinux.addr == 0) { | 200 | if (vmlinux.addr == 0) { |
281 | printf("Can't allocate memory for kernel image !\n\r"); | 201 | printf("Can't allocate memory for kernel image !\n\r"); |
282 | exit(); | 202 | exit(); |
283 | } | 203 | } |
284 | 204 | ||
285 | /* | 205 | /* |
286 | * Now we try to claim memory for the initrd (and copy it there) | 206 | * Now we try to alloc memory for the initrd (and copy it there) |
287 | */ | 207 | */ |
288 | initrd.size = (unsigned long)(_initrd_end - _initrd_start); | 208 | initrd.size = (unsigned long)(_initrd_end - _initrd_start); |
289 | initrd.memsize = initrd.size; | 209 | initrd.memsize = initrd.size; |
290 | if ( initrd.size > 0 ) { | 210 | if ( initrd.size > 0 ) { |
291 | printf("Allocating 0x%lx bytes for initrd ...\n\r", initrd.size); | 211 | printf("Allocating 0x%lx bytes for initrd ...\n\r", |
292 | initrd.addr = try_claim(initrd.size); | 212 | initrd.size); |
213 | initrd.addr = (unsigned long)malloc((u32)initrd.size); | ||
293 | if (initrd.addr == 0) { | 214 | if (initrd.addr == 0) { |
294 | printf("Can't allocate memory for initial ramdisk !\n\r"); | 215 | printf("Can't allocate memory for initial " |
216 | "ramdisk !\n\r"); | ||
295 | exit(); | 217 | exit(); |
296 | } | 218 | } |
297 | a1 = initrd.addr; | 219 | *a1 = initrd.addr; |
298 | a2 = initrd.size; | 220 | *a2 = initrd.size; |
299 | printf("initial ramdisk moving 0x%lx <- 0x%lx (0x%lx bytes)\n\r", | 221 | printf("initial ramdisk moving 0x%lx <- 0x%lx " |
300 | initrd.addr, (unsigned long)_initrd_start, initrd.size); | 222 | "(0x%lx bytes)\n\r", initrd.addr, |
301 | memmove((void *)initrd.addr, (void *)_initrd_start, initrd.size); | 223 | (unsigned long)_initrd_start, initrd.size); |
302 | printf("initrd head: 0x%lx\n\r", *((unsigned long *)initrd.addr)); | 224 | memmove((void *)initrd.addr, (void *)_initrd_start, |
225 | initrd.size); | ||
226 | printf("initrd head: 0x%lx\n\r", | ||
227 | *((unsigned long *)initrd.addr)); | ||
303 | } | 228 | } |
304 | 229 | ||
305 | /* Eventually gunzip the kernel */ | 230 | /* Eventually gunzip the kernel */ |
@@ -311,11 +236,10 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | |||
311 | (unsigned char *)vmlinuz.addr, &len); | 236 | (unsigned char *)vmlinuz.addr, &len); |
312 | printf("done 0x%lx bytes\n\r", len); | 237 | printf("done 0x%lx bytes\n\r", len); |
313 | } else { | 238 | } else { |
314 | memmove((void *)vmlinux.addr,(void *)vmlinuz.addr,vmlinuz.size); | 239 | memmove((void *)vmlinux.addr,(void *)vmlinuz.addr, |
240 | vmlinuz.size); | ||
315 | } | 241 | } |
316 | 242 | ||
317 | export_cmdline(chosen_handle); | ||
318 | |||
319 | /* Skip over the ELF header */ | 243 | /* Skip over the ELF header */ |
320 | #ifdef DEBUG | 244 | #ifdef DEBUG |
321 | printf("... skipping 0x%lx bytes of ELF header\n\r", | 245 | printf("... skipping 0x%lx bytes of ELF header\n\r", |
@@ -324,23 +248,107 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | |||
324 | vmlinux.addr += elfoffset; | 248 | vmlinux.addr += elfoffset; |
325 | 249 | ||
326 | flush_cache((void *)vmlinux.addr, vmlinux.size); | 250 | flush_cache((void *)vmlinux.addr, vmlinux.size); |
251 | } | ||
327 | 252 | ||
328 | kernel_entry = (kernel_entry_t)vmlinux.addr; | 253 | void __attribute__ ((weak)) ft_init(void *dt_blob) |
329 | #ifdef DEBUG | 254 | { |
330 | printf( "kernel:\n\r" | 255 | } |
331 | " entry addr = 0x%lx\n\r" | ||
332 | " a1 = 0x%lx,\n\r" | ||
333 | " a2 = 0x%lx,\n\r" | ||
334 | " prom = 0x%lx,\n\r" | ||
335 | " bi_recs = 0x%lx,\n\r", | ||
336 | (unsigned long)kernel_entry, a1, a2, | ||
337 | (unsigned long)prom, NULL); | ||
338 | #endif | ||
339 | 256 | ||
340 | kernel_entry(a1, a2, prom, NULL); | 257 | /* A buffer that may be edited by tools operating on a zImage binary so as to |
258 | * edit the command line passed to vmlinux (by setting /chosen/bootargs). | ||
259 | * The buffer is put in it's own section so that tools may locate it easier. | ||
260 | */ | ||
261 | static char builtin_cmdline[COMMAND_LINE_SIZE] | ||
262 | __attribute__((__section__("__builtin_cmdline"))); | ||
341 | 263 | ||
342 | printf("Error: Linux kernel returned to zImage bootloader!\n\r"); | 264 | static void get_cmdline(char *buf, int size) |
265 | { | ||
266 | void *devp; | ||
267 | int len = strlen(builtin_cmdline); | ||
343 | 268 | ||
344 | exit(); | 269 | buf[0] = '\0'; |
270 | |||
271 | if (len > 0) { /* builtin_cmdline overrides dt's /chosen/bootargs */ | ||
272 | len = min(len, size-1); | ||
273 | strncpy(buf, builtin_cmdline, len); | ||
274 | buf[len] = '\0'; | ||
275 | } | ||
276 | else if ((devp = finddevice("/chosen"))) | ||
277 | getprop(devp, "bootargs", buf, size); | ||
278 | } | ||
279 | |||
280 | static void set_cmdline(char *buf) | ||
281 | { | ||
282 | void *devp; | ||
283 | |||
284 | if ((devp = finddevice("/chosen"))) | ||
285 | setprop(devp, "bootargs", buf, strlen(buf) + 1); | ||
345 | } | 286 | } |
346 | 287 | ||
288 | /* Section where ft can be tacked on after zImage is built */ | ||
289 | union blobspace { | ||
290 | struct boot_param_header hdr; | ||
291 | char space[8*1024]; | ||
292 | } dt_blob __attribute__((__section__("__builtin_ft"))); | ||
293 | |||
294 | struct platform_ops platform_ops; | ||
295 | struct dt_ops dt_ops; | ||
296 | struct console_ops console_ops; | ||
297 | |||
298 | void start(unsigned long a1, unsigned long a2, void *promptr, void *sp) | ||
299 | { | ||
300 | int have_dt = 0; | ||
301 | kernel_entry_t kentry; | ||
302 | char cmdline[COMMAND_LINE_SIZE]; | ||
303 | |||
304 | memset(__bss_start, 0, _end - __bss_start); | ||
305 | memset(&platform_ops, 0, sizeof(platform_ops)); | ||
306 | memset(&dt_ops, 0, sizeof(dt_ops)); | ||
307 | memset(&console_ops, 0, sizeof(console_ops)); | ||
308 | |||
309 | /* Override the dt_ops and device tree if there was an flat dev | ||
310 | * tree attached to the zImage. | ||
311 | */ | ||
312 | if (dt_blob.hdr.magic == OF_DT_HEADER) { | ||
313 | have_dt = 1; | ||
314 | ft_init(&dt_blob); | ||
315 | } | ||
316 | |||
317 | if (platform_init(promptr)) | ||
318 | exit(); | ||
319 | if (console_ops.open && (console_ops.open() < 0)) | ||
320 | exit(); | ||
321 | if (platform_ops.fixups) | ||
322 | platform_ops.fixups(); | ||
323 | |||
324 | printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", | ||
325 | _start, sp); | ||
326 | |||
327 | prep_kernel(&a1, &a2); | ||
328 | |||
329 | /* If cmdline came from zimage wrapper or if we can edit the one | ||
330 | * in the dt, print it out and edit it, if possible. | ||
331 | */ | ||
332 | if ((strlen(builtin_cmdline) > 0) || console_ops.edit_cmdline) { | ||
333 | get_cmdline(cmdline, COMMAND_LINE_SIZE); | ||
334 | printf("\n\rLinux/PowerPC load: %s", cmdline); | ||
335 | if (console_ops.edit_cmdline) | ||
336 | console_ops.edit_cmdline(cmdline, COMMAND_LINE_SIZE); | ||
337 | printf("\n\r"); | ||
338 | set_cmdline(cmdline); | ||
339 | } | ||
340 | |||
341 | if (console_ops.close) | ||
342 | console_ops.close(); | ||
343 | |||
344 | kentry = (kernel_entry_t) vmlinux.addr; | ||
345 | if (have_dt) | ||
346 | kentry(dt_ops.ft_addr(), 0, NULL); | ||
347 | else | ||
348 | /* XXX initrd addr/size should be passed in properties */ | ||
349 | kentry(a1, a2, promptr); | ||
350 | |||
351 | /* console closed so printf below may not work */ | ||
352 | printf("Error: Linux kernel returned to zImage boot wrapper!\n\r"); | ||
353 | exit(); | ||
354 | } | ||
diff --git a/arch/powerpc/boot/prom.c b/arch/powerpc/boot/of.c index fa0057736f6b..fd99f789a37b 100644 --- a/arch/powerpc/boot/prom.c +++ b/arch/powerpc/boot/of.c | |||
@@ -8,15 +8,29 @@ | |||
8 | */ | 8 | */ |
9 | #include <stdarg.h> | 9 | #include <stdarg.h> |
10 | #include <stddef.h> | 10 | #include <stddef.h> |
11 | #include "types.h" | ||
12 | #include "elf.h" | ||
11 | #include "string.h" | 13 | #include "string.h" |
12 | #include "stdio.h" | 14 | #include "stdio.h" |
13 | #include "prom.h" | 15 | #include "page.h" |
16 | #include "ops.h" | ||
14 | 17 | ||
15 | int (*prom)(void *); | 18 | typedef void *ihandle; |
16 | phandle chosen_handle; | 19 | typedef void *phandle; |
17 | ihandle stdout; | ||
18 | 20 | ||
19 | int call_prom(const char *service, int nargs, int nret, ...) | 21 | extern char _end[]; |
22 | |||
23 | /* Value picked to match that used by yaboot */ | ||
24 | #define PROG_START 0x01400000 /* only used on 64-bit systems */ | ||
25 | #define RAM_END (512<<20) /* Fixme: use OF */ | ||
26 | #define ONE_MB 0x100000 | ||
27 | |||
28 | int (*prom) (void *); | ||
29 | |||
30 | |||
31 | static unsigned long claim_base; | ||
32 | |||
33 | static int call_prom(const char *service, int nargs, int nret, ...) | ||
20 | { | 34 | { |
21 | int i; | 35 | int i; |
22 | struct prom_args { | 36 | struct prom_args { |
@@ -45,7 +59,7 @@ int call_prom(const char *service, int nargs, int nret, ...) | |||
45 | return (nret > 0)? args.args[nargs]: 0; | 59 | return (nret > 0)? args.args[nargs]: 0; |
46 | } | 60 | } |
47 | 61 | ||
48 | int call_prom_ret(const char *service, int nargs, int nret, | 62 | static int call_prom_ret(const char *service, int nargs, int nret, |
49 | unsigned int *rets, ...) | 63 | unsigned int *rets, ...) |
50 | { | 64 | { |
51 | int i; | 65 | int i; |
@@ -79,11 +93,6 @@ int call_prom_ret(const char *service, int nargs, int nret, | |||
79 | return (nret > 0)? args.args[nargs]: 0; | 93 | return (nret > 0)? args.args[nargs]: 0; |
80 | } | 94 | } |
81 | 95 | ||
82 | int write(void *handle, void *ptr, int nb) | ||
83 | { | ||
84 | return call_prom("write", 3, 1, handle, ptr, nb); | ||
85 | } | ||
86 | |||
87 | /* | 96 | /* |
88 | * Older OF's require that when claiming a specific range of addresses, | 97 | * Older OF's require that when claiming a specific range of addresses, |
89 | * we claim the physical space in the /memory node and the virtual | 98 | * we claim the physical space in the /memory node and the virtual |
@@ -142,7 +151,7 @@ static int check_of_version(void) | |||
142 | return 1; | 151 | return 1; |
143 | } | 152 | } |
144 | 153 | ||
145 | void *claim(unsigned long virt, unsigned long size, unsigned long align) | 154 | static void *claim(unsigned long virt, unsigned long size, unsigned long align) |
146 | { | 155 | { |
147 | int ret; | 156 | int ret; |
148 | unsigned int result; | 157 | unsigned int result; |
@@ -151,7 +160,7 @@ void *claim(unsigned long virt, unsigned long size, unsigned long align) | |||
151 | need_map = check_of_version(); | 160 | need_map = check_of_version(); |
152 | if (align || !need_map) | 161 | if (align || !need_map) |
153 | return (void *) call_prom("claim", 3, 1, virt, size, align); | 162 | return (void *) call_prom("claim", 3, 1, virt, size, align); |
154 | 163 | ||
155 | ret = call_prom_ret("call-method", 5, 2, &result, "claim", memory, | 164 | ret = call_prom_ret("call-method", 5, 2, &result, "claim", memory, |
156 | align, size, virt); | 165 | align, size, virt); |
157 | if (ret != 0 || result == -1) | 166 | if (ret != 0 || result == -1) |
@@ -163,3 +172,112 @@ void *claim(unsigned long virt, unsigned long size, unsigned long align) | |||
163 | 0x12, size, virt, virt); | 172 | 0x12, size, virt, virt); |
164 | return (void *) virt; | 173 | return (void *) virt; |
165 | } | 174 | } |
175 | |||
176 | static void *of_try_claim(u32 size) | ||
177 | { | ||
178 | unsigned long addr = 0; | ||
179 | static u8 first_time = 1; | ||
180 | |||
181 | if (first_time) { | ||
182 | claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); | ||
183 | first_time = 0; | ||
184 | } | ||
185 | |||
186 | for(; claim_base < RAM_END; claim_base += ONE_MB) { | ||
187 | #ifdef DEBUG | ||
188 | printf(" trying: 0x%08lx\n\r", claim_base); | ||
189 | #endif | ||
190 | addr = (unsigned long)claim(claim_base, size, 0); | ||
191 | if ((void *)addr != (void *)-1) | ||
192 | break; | ||
193 | } | ||
194 | if (addr == 0) | ||
195 | return NULL; | ||
196 | claim_base = PAGE_ALIGN(claim_base + size); | ||
197 | return (void *)addr; | ||
198 | } | ||
199 | |||
200 | static void of_image_hdr(const void *hdr) | ||
201 | { | ||
202 | const Elf64_Ehdr *elf64 = hdr; | ||
203 | |||
204 | if (elf64->e_ident[EI_CLASS] == ELFCLASS64) { | ||
205 | /* | ||
206 | * Maintain a "magic" minimum address. This keeps some older | ||
207 | * firmware platforms running. | ||
208 | */ | ||
209 | if (claim_base < PROG_START) | ||
210 | claim_base = PROG_START; | ||
211 | } | ||
212 | } | ||
213 | |||
214 | static void of_exit(void) | ||
215 | { | ||
216 | call_prom("exit", 0, 0); | ||
217 | } | ||
218 | |||
219 | /* | ||
220 | * OF device tree routines | ||
221 | */ | ||
222 | static void *of_finddevice(const char *name) | ||
223 | { | ||
224 | return (phandle) call_prom("finddevice", 1, 1, name); | ||
225 | } | ||
226 | |||
227 | static int of_getprop(const void *phandle, const char *name, void *buf, | ||
228 | const int buflen) | ||
229 | { | ||
230 | return call_prom("getprop", 4, 1, phandle, name, buf, buflen); | ||
231 | } | ||
232 | |||
233 | static int of_setprop(const void *phandle, const char *name, const void *buf, | ||
234 | const int buflen) | ||
235 | { | ||
236 | return call_prom("setprop", 4, 1, phandle, name, buf, buflen); | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * OF console routines | ||
241 | */ | ||
242 | static void *of_stdout_handle; | ||
243 | |||
244 | static int of_console_open(void) | ||
245 | { | ||
246 | void *devp; | ||
247 | |||
248 | if (((devp = finddevice("/chosen")) != NULL) | ||
249 | && (getprop(devp, "stdout", &of_stdout_handle, | ||
250 | sizeof(of_stdout_handle)) | ||
251 | == sizeof(of_stdout_handle))) | ||
252 | return 0; | ||
253 | |||
254 | return -1; | ||
255 | } | ||
256 | |||
257 | static void of_console_write(char *buf, int len) | ||
258 | { | ||
259 | call_prom("write", 3, 1, of_stdout_handle, buf, len); | ||
260 | } | ||
261 | |||
262 | int platform_init(void *promptr) | ||
263 | { | ||
264 | platform_ops.fixups = NULL; | ||
265 | platform_ops.image_hdr = of_image_hdr; | ||
266 | platform_ops.malloc = of_try_claim; | ||
267 | platform_ops.free = NULL; | ||
268 | platform_ops.exit = of_exit; | ||
269 | |||
270 | dt_ops.finddevice = of_finddevice; | ||
271 | dt_ops.getprop = of_getprop; | ||
272 | dt_ops.setprop = of_setprop; | ||
273 | dt_ops.translate_addr = NULL; | ||
274 | |||
275 | console_ops.open = of_console_open; | ||
276 | console_ops.write = of_console_write; | ||
277 | console_ops.edit_cmdline = NULL; | ||
278 | console_ops.close = NULL; | ||
279 | console_ops.data = NULL; | ||
280 | |||
281 | prom = (int (*)(void *))promptr; | ||
282 | return 0; | ||
283 | } | ||
diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h new file mode 100644 index 000000000000..135eb4bb03b4 --- /dev/null +++ b/arch/powerpc/boot/ops.h | |||
@@ -0,0 +1,100 @@ | |||
1 | /* | ||
2 | * Global definition of all the bootwrapper operations. | ||
3 | * | ||
4 | * Author: Mark A. Greer <mgreer@mvista.com> | ||
5 | * | ||
6 | * 2006 (c) MontaVista Software, Inc. This file is licensed under | ||
7 | * the terms of the GNU General Public License version 2. This program | ||
8 | * is licensed "as is" without any warranty of any kind, whether express | ||
9 | * or implied. | ||
10 | */ | ||
11 | #ifndef _PPC_BOOT_OPS_H_ | ||
12 | #define _PPC_BOOT_OPS_H_ | ||
13 | |||
14 | #include "types.h" | ||
15 | |||
16 | #define COMMAND_LINE_SIZE 512 | ||
17 | #define MAX_PATH_LEN 256 | ||
18 | #define MAX_PROP_LEN 256 /* What should this be? */ | ||
19 | |||
20 | /* Platform specific operations */ | ||
21 | struct platform_ops { | ||
22 | void (*fixups)(void); | ||
23 | void (*image_hdr)(const void *); | ||
24 | void * (*malloc)(u32 size); | ||
25 | void (*free)(void *ptr, u32 size); | ||
26 | void (*exit)(void); | ||
27 | }; | ||
28 | extern struct platform_ops platform_ops; | ||
29 | |||
30 | /* Device Tree operations */ | ||
31 | struct dt_ops { | ||
32 | void * (*finddevice)(const char *name); | ||
33 | int (*getprop)(const void *node, const char *name, void *buf, | ||
34 | const int buflen); | ||
35 | int (*setprop)(const void *node, const char *name, | ||
36 | const void *buf, const int buflen); | ||
37 | u64 (*translate_addr)(const char *path, const u32 *in_addr, | ||
38 | const u32 addr_len); | ||
39 | unsigned long (*ft_addr)(void); | ||
40 | }; | ||
41 | extern struct dt_ops dt_ops; | ||
42 | |||
43 | /* Console operations */ | ||
44 | struct console_ops { | ||
45 | int (*open)(void); | ||
46 | void (*write)(char *buf, int len); | ||
47 | void (*edit_cmdline)(char *buf, int len); | ||
48 | void (*close)(void); | ||
49 | void *data; | ||
50 | }; | ||
51 | extern struct console_ops console_ops; | ||
52 | |||
53 | /* Serial console operations */ | ||
54 | struct serial_console_data { | ||
55 | int (*open)(void); | ||
56 | void (*putc)(unsigned char c); | ||
57 | unsigned char (*getc)(void); | ||
58 | u8 (*tstc)(void); | ||
59 | void (*close)(void); | ||
60 | }; | ||
61 | |||
62 | extern int platform_init(void *promptr); | ||
63 | extern void simple_alloc_init(void); | ||
64 | extern void ft_init(void *dt_blob); | ||
65 | extern int serial_console_init(void); | ||
66 | |||
67 | static inline void *finddevice(const char *name) | ||
68 | { | ||
69 | return (dt_ops.finddevice) ? dt_ops.finddevice(name) : NULL; | ||
70 | } | ||
71 | |||
72 | static inline int getprop(void *devp, const char *name, void *buf, int buflen) | ||
73 | { | ||
74 | return (dt_ops.getprop) ? dt_ops.getprop(devp, name, buf, buflen) : -1; | ||
75 | } | ||
76 | |||
77 | static inline int setprop(void *devp, const char *name, void *buf, int buflen) | ||
78 | { | ||
79 | return (dt_ops.setprop) ? dt_ops.setprop(devp, name, buf, buflen) : -1; | ||
80 | } | ||
81 | |||
82 | static inline void *malloc(u32 size) | ||
83 | { | ||
84 | return (platform_ops.malloc) ? platform_ops.malloc(size) : NULL; | ||
85 | } | ||
86 | |||
87 | static inline void free(void *ptr, u32 size) | ||
88 | { | ||
89 | if (platform_ops.free) | ||
90 | platform_ops.free(ptr, size); | ||
91 | } | ||
92 | |||
93 | static inline void exit(void) | ||
94 | { | ||
95 | if (platform_ops.exit) | ||
96 | platform_ops.exit(); | ||
97 | for(;;); | ||
98 | } | ||
99 | |||
100 | #endif /* _PPC_BOOT_OPS_H_ */ | ||
diff --git a/arch/powerpc/boot/prom.h b/arch/powerpc/boot/prom.h deleted file mode 100644 index a57b184c564f..000000000000 --- a/arch/powerpc/boot/prom.h +++ /dev/null | |||
@@ -1,41 +0,0 @@ | |||
1 | #ifndef _PPC_BOOT_PROM_H_ | ||
2 | #define _PPC_BOOT_PROM_H_ | ||
3 | |||
4 | typedef void *phandle; | ||
5 | typedef void *ihandle; | ||
6 | |||
7 | extern int (*prom) (void *); | ||
8 | extern phandle chosen_handle; | ||
9 | extern ihandle stdout; | ||
10 | |||
11 | int call_prom(const char *service, int nargs, int nret, ...); | ||
12 | int call_prom_ret(const char *service, int nargs, int nret, | ||
13 | unsigned int *rets, ...); | ||
14 | |||
15 | extern int write(void *handle, void *ptr, int nb); | ||
16 | extern void *claim(unsigned long virt, unsigned long size, unsigned long aln); | ||
17 | |||
18 | static inline void exit(void) | ||
19 | { | ||
20 | call_prom("exit", 0, 0); | ||
21 | } | ||
22 | |||
23 | static inline phandle finddevice(const char *name) | ||
24 | { | ||
25 | return (phandle) call_prom("finddevice", 1, 1, name); | ||
26 | } | ||
27 | |||
28 | static inline int getprop(void *phandle, const char *name, | ||
29 | void *buf, int buflen) | ||
30 | { | ||
31 | return call_prom("getprop", 4, 1, phandle, name, buf, buflen); | ||
32 | } | ||
33 | |||
34 | |||
35 | static inline int setprop(void *phandle, const char *name, | ||
36 | void *buf, int buflen) | ||
37 | { | ||
38 | return call_prom("setprop", 4, 1, phandle, name, buf, buflen); | ||
39 | } | ||
40 | |||
41 | #endif /* _PPC_BOOT_PROM_H_ */ | ||
diff --git a/arch/powerpc/boot/stdio.c b/arch/powerpc/boot/stdio.c index b5aa522f8b77..6d5f6382e1ce 100644 --- a/arch/powerpc/boot/stdio.c +++ b/arch/powerpc/boot/stdio.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <stddef.h> | 10 | #include <stddef.h> |
11 | #include "string.h" | 11 | #include "string.h" |
12 | #include "stdio.h" | 12 | #include "stdio.h" |
13 | #include "prom.h" | 13 | #include "ops.h" |
14 | 14 | ||
15 | size_t strnlen(const char * s, size_t count) | 15 | size_t strnlen(const char * s, size_t count) |
16 | { | 16 | { |
@@ -320,6 +320,6 @@ printf(const char *fmt, ...) | |||
320 | va_start(args, fmt); | 320 | va_start(args, fmt); |
321 | n = vsprintf(sprint_buf, fmt, args); | 321 | n = vsprintf(sprint_buf, fmt, args); |
322 | va_end(args); | 322 | va_end(args); |
323 | write(stdout, sprint_buf, n); | 323 | console_ops.write(sprint_buf, n); |
324 | return n; | 324 | return n; |
325 | } | 325 | } |
diff --git a/arch/powerpc/boot/stdio.h b/arch/powerpc/boot/stdio.h index eb9e16c87aef..73b8a91bfb34 100644 --- a/arch/powerpc/boot/stdio.h +++ b/arch/powerpc/boot/stdio.h | |||
@@ -1,8 +1,16 @@ | |||
1 | #ifndef _PPC_BOOT_STDIO_H_ | 1 | #ifndef _PPC_BOOT_STDIO_H_ |
2 | #define _PPC_BOOT_STDIO_H_ | 2 | #define _PPC_BOOT_STDIO_H_ |
3 | 3 | ||
4 | #include <stdarg.h> | ||
5 | |||
6 | #define ENOMEM 12 /* Out of Memory */ | ||
7 | #define EINVAL 22 /* Invalid argument */ | ||
8 | #define ENOSPC 28 /* No space left on device */ | ||
9 | |||
4 | extern int printf(const char *fmt, ...); | 10 | extern int printf(const char *fmt, ...); |
5 | 11 | ||
12 | #define fprintf(fmt, args...) printf(args) | ||
13 | |||
6 | extern int sprintf(char *buf, const char *fmt, ...); | 14 | extern int sprintf(char *buf, const char *fmt, ...); |
7 | 15 | ||
8 | extern int vsprintf(char *buf, const char *fmt, va_list args); | 16 | extern int vsprintf(char *buf, const char *fmt, va_list args); |
diff --git a/arch/powerpc/boot/types.h b/arch/powerpc/boot/types.h new file mode 100644 index 000000000000..79d26e708677 --- /dev/null +++ b/arch/powerpc/boot/types.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef _TYPES_H_ | ||
2 | #define _TYPES_H_ | ||
3 | |||
4 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | ||
5 | |||
6 | typedef unsigned char u8; | ||
7 | typedef unsigned short u16; | ||
8 | typedef unsigned int u32; | ||
9 | typedef unsigned long long u64; | ||
10 | |||
11 | #define min(x,y) ({ \ | ||
12 | typeof(x) _x = (x); \ | ||
13 | typeof(y) _y = (y); \ | ||
14 | (void) (&_x == &_y); \ | ||
15 | _x < _y ? _x : _y; }) | ||
16 | |||
17 | #define max(x,y) ({ \ | ||
18 | typeof(x) _x = (x); \ | ||
19 | typeof(y) _y = (y); \ | ||
20 | (void) (&_x == &_y); \ | ||
21 | _x > _y ? _x : _y; }) | ||
22 | |||
23 | #endif /* _TYPES_H_ */ | ||
diff --git a/arch/powerpc/configs/chrp32_defconfig b/arch/powerpc/configs/chrp32_defconfig index bbf2b5f8a8cb..fee72f8a2fb7 100644 --- a/arch/powerpc/configs/chrp32_defconfig +++ b/arch/powerpc/configs/chrp32_defconfig | |||
@@ -492,7 +492,7 @@ CONFIG_SCSI_SPI_ATTRS=y | |||
492 | # CONFIG_MEGARAID_NEWGEN is not set | 492 | # CONFIG_MEGARAID_NEWGEN is not set |
493 | # CONFIG_MEGARAID_LEGACY is not set | 493 | # CONFIG_MEGARAID_LEGACY is not set |
494 | # CONFIG_MEGARAID_SAS is not set | 494 | # CONFIG_MEGARAID_SAS is not set |
495 | # CONFIG_SCSI_SATA is not set | 495 | # CONFIG_ATA is not set |
496 | # CONFIG_SCSI_HPTIOP is not set | 496 | # CONFIG_SCSI_HPTIOP is not set |
497 | # CONFIG_SCSI_BUSLOGIC is not set | 497 | # CONFIG_SCSI_BUSLOGIC is not set |
498 | # CONFIG_SCSI_DMX3191D is not set | 498 | # CONFIG_SCSI_DMX3191D is not set |
diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig index 4b9c2ed925f5..92d0a9dd0b8f 100644 --- a/arch/powerpc/configs/g5_defconfig +++ b/arch/powerpc/configs/g5_defconfig | |||
@@ -490,23 +490,23 @@ CONFIG_SCSI_SPI_ATTRS=y | |||
490 | # CONFIG_MEGARAID_NEWGEN is not set | 490 | # CONFIG_MEGARAID_NEWGEN is not set |
491 | # CONFIG_MEGARAID_LEGACY is not set | 491 | # CONFIG_MEGARAID_LEGACY is not set |
492 | # CONFIG_MEGARAID_SAS is not set | 492 | # CONFIG_MEGARAID_SAS is not set |
493 | CONFIG_SCSI_SATA=y | 493 | CONFIG_ATA=y |
494 | # CONFIG_SCSI_SATA_AHCI is not set | 494 | # CONFIG_SATA_AHCI is not set |
495 | CONFIG_SCSI_SATA_SVW=y | 495 | CONFIG_SATA_SVW=y |
496 | # CONFIG_SCSI_ATA_PIIX is not set | 496 | # CONFIG_SCSI_ATA_PIIX is not set |
497 | # CONFIG_SCSI_SATA_MV is not set | 497 | # CONFIG_SATA_MV is not set |
498 | # CONFIG_SCSI_SATA_NV is not set | 498 | # CONFIG_SATA_NV is not set |
499 | # CONFIG_SCSI_PDC_ADMA is not set | 499 | # CONFIG_SCSI_PDC_ADMA is not set |
500 | # CONFIG_SCSI_HPTIOP is not set | 500 | # CONFIG_SCSI_HPTIOP is not set |
501 | # CONFIG_SCSI_SATA_QSTOR is not set | 501 | # CONFIG_SATA_QSTOR is not set |
502 | # CONFIG_SCSI_SATA_PROMISE is not set | 502 | # CONFIG_SATA_PROMISE is not set |
503 | # CONFIG_SCSI_SATA_SX4 is not set | 503 | # CONFIG_SATA_SX4 is not set |
504 | # CONFIG_SCSI_SATA_SIL is not set | 504 | # CONFIG_SATA_SIL is not set |
505 | # CONFIG_SCSI_SATA_SIL24 is not set | 505 | # CONFIG_SATA_SIL24 is not set |
506 | # CONFIG_SCSI_SATA_SIS is not set | 506 | # CONFIG_SATA_SIS is not set |
507 | # CONFIG_SCSI_SATA_ULI is not set | 507 | # CONFIG_SATA_ULI is not set |
508 | # CONFIG_SCSI_SATA_VIA is not set | 508 | # CONFIG_SATA_VIA is not set |
509 | # CONFIG_SCSI_SATA_VITESSE is not set | 509 | # CONFIG_SATA_VITESSE is not set |
510 | # CONFIG_SCSI_BUSLOGIC is not set | 510 | # CONFIG_SCSI_BUSLOGIC is not set |
511 | # CONFIG_SCSI_DMX3191D is not set | 511 | # CONFIG_SCSI_DMX3191D is not set |
512 | # CONFIG_SCSI_EATA is not set | 512 | # CONFIG_SCSI_EATA is not set |
diff --git a/arch/powerpc/configs/iseries_defconfig b/arch/powerpc/configs/iseries_defconfig index eb0885ea0731..d58f82f836f8 100644 --- a/arch/powerpc/configs/iseries_defconfig +++ b/arch/powerpc/configs/iseries_defconfig | |||
@@ -475,7 +475,7 @@ CONFIG_SCSI_FC_ATTRS=y | |||
475 | # CONFIG_MEGARAID_NEWGEN is not set | 475 | # CONFIG_MEGARAID_NEWGEN is not set |
476 | # CONFIG_MEGARAID_LEGACY is not set | 476 | # CONFIG_MEGARAID_LEGACY is not set |
477 | # CONFIG_MEGARAID_SAS is not set | 477 | # CONFIG_MEGARAID_SAS is not set |
478 | # CONFIG_SCSI_SATA is not set | 478 | # CONFIG_ATA is not set |
479 | # CONFIG_SCSI_HPTIOP is not set | 479 | # CONFIG_SCSI_HPTIOP is not set |
480 | # CONFIG_SCSI_BUSLOGIC is not set | 480 | # CONFIG_SCSI_BUSLOGIC is not set |
481 | # CONFIG_SCSI_DMX3191D is not set | 481 | # CONFIG_SCSI_DMX3191D is not set |
diff --git a/arch/powerpc/configs/mpc7448_hpc2_defconfig b/arch/powerpc/configs/mpc7448_hpc2_defconfig index 719fba4eb421..d1811e754518 100644 --- a/arch/powerpc/configs/mpc7448_hpc2_defconfig +++ b/arch/powerpc/configs/mpc7448_hpc2_defconfig | |||
@@ -413,23 +413,23 @@ CONFIG_BLK_DEV_SD=y | |||
413 | # CONFIG_MEGARAID_NEWGEN is not set | 413 | # CONFIG_MEGARAID_NEWGEN is not set |
414 | # CONFIG_MEGARAID_LEGACY is not set | 414 | # CONFIG_MEGARAID_LEGACY is not set |
415 | # CONFIG_MEGARAID_SAS is not set | 415 | # CONFIG_MEGARAID_SAS is not set |
416 | CONFIG_SCSI_SATA=y | 416 | CONFIG_ATA=y |
417 | # CONFIG_SCSI_SATA_AHCI is not set | 417 | # CONFIG_SATA_AHCI is not set |
418 | # CONFIG_SCSI_SATA_SVW is not set | 418 | # CONFIG_SATA_SVW is not set |
419 | # CONFIG_SCSI_ATA_PIIX is not set | 419 | # CONFIG_SCSI_ATA_PIIX is not set |
420 | CONFIG_SCSI_SATA_MV=y | 420 | CONFIG_SATA_MV=y |
421 | # CONFIG_SCSI_SATA_NV is not set | 421 | # CONFIG_SATA_NV is not set |
422 | # CONFIG_SCSI_PDC_ADMA is not set | 422 | # CONFIG_SCSI_PDC_ADMA is not set |
423 | # CONFIG_SCSI_HPTIOP is not set | 423 | # CONFIG_SCSI_HPTIOP is not set |
424 | # CONFIG_SCSI_SATA_QSTOR is not set | 424 | # CONFIG_SATA_QSTOR is not set |
425 | # CONFIG_SCSI_SATA_PROMISE is not set | 425 | # CONFIG_SATA_PROMISE is not set |
426 | # CONFIG_SCSI_SATA_SX4 is not set | 426 | # CONFIG_SATA_SX4 is not set |
427 | # CONFIG_SCSI_SATA_SIL is not set | 427 | # CONFIG_SATA_SIL is not set |
428 | # CONFIG_SCSI_SATA_SIL24 is not set | 428 | # CONFIG_SATA_SIL24 is not set |
429 | # CONFIG_SCSI_SATA_SIS is not set | 429 | # CONFIG_SATA_SIS is not set |
430 | # CONFIG_SCSI_SATA_ULI is not set | 430 | # CONFIG_SATA_ULI is not set |
431 | # CONFIG_SCSI_SATA_VIA is not set | 431 | # CONFIG_SATA_VIA is not set |
432 | # CONFIG_SCSI_SATA_VITESSE is not set | 432 | # CONFIG_SATA_VITESSE is not set |
433 | # CONFIG_SCSI_BUSLOGIC is not set | 433 | # CONFIG_SCSI_BUSLOGIC is not set |
434 | # CONFIG_SCSI_DMX3191D is not set | 434 | # CONFIG_SCSI_DMX3191D is not set |
435 | # CONFIG_SCSI_EATA is not set | 435 | # CONFIG_SCSI_EATA is not set |
diff --git a/arch/powerpc/configs/mpc834x_itx_defconfig b/arch/powerpc/configs/mpc834x_itx_defconfig index 8da6a47f0339..cd3535e1a095 100644 --- a/arch/powerpc/configs/mpc834x_itx_defconfig +++ b/arch/powerpc/configs/mpc834x_itx_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.18-rc6 | 3 | # Linux kernel version: 2.6.18 |
4 | # Sun Sep 10 10:28:05 2006 | 4 | # Mon Sep 25 19:41:14 2006 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | CONFIG_PPC32=y | 7 | CONFIG_PPC32=y |
@@ -21,6 +21,7 @@ CONFIG_ARCH_MAY_HAVE_PC_FDC=y | |||
21 | CONFIG_PPC_OF=y | 21 | CONFIG_PPC_OF=y |
22 | CONFIG_PPC_UDBG_16550=y | 22 | CONFIG_PPC_UDBG_16550=y |
23 | # CONFIG_GENERIC_TBSYNC is not set | 23 | # CONFIG_GENERIC_TBSYNC is not set |
24 | CONFIG_AUDIT_ARCH=y | ||
24 | CONFIG_DEFAULT_UIMAGE=y | 25 | CONFIG_DEFAULT_UIMAGE=y |
25 | 26 | ||
26 | # | 27 | # |
@@ -61,25 +62,25 @@ CONFIG_SYSVIPC=y | |||
61 | # CONFIG_POSIX_MQUEUE is not set | 62 | # CONFIG_POSIX_MQUEUE is not set |
62 | # CONFIG_BSD_PROCESS_ACCT is not set | 63 | # CONFIG_BSD_PROCESS_ACCT is not set |
63 | # CONFIG_TASKSTATS is not set | 64 | # CONFIG_TASKSTATS is not set |
64 | CONFIG_SYSCTL=y | ||
65 | # CONFIG_AUDIT is not set | 65 | # CONFIG_AUDIT is not set |
66 | # CONFIG_IKCONFIG is not set | 66 | # CONFIG_IKCONFIG is not set |
67 | # CONFIG_RELAY is not set | 67 | # CONFIG_RELAY is not set |
68 | CONFIG_INITRAMFS_SOURCE="" | 68 | CONFIG_INITRAMFS_SOURCE="" |
69 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 69 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
70 | CONFIG_EMBEDDED=y | 70 | CONFIG_EMBEDDED=y |
71 | CONFIG_SYSCTL=y | ||
71 | # CONFIG_KALLSYMS is not set | 72 | # CONFIG_KALLSYMS is not set |
72 | CONFIG_HOTPLUG=y | 73 | CONFIG_HOTPLUG=y |
73 | CONFIG_PRINTK=y | 74 | CONFIG_PRINTK=y |
74 | CONFIG_BUG=y | 75 | CONFIG_BUG=y |
75 | CONFIG_ELF_CORE=y | 76 | CONFIG_ELF_CORE=y |
76 | CONFIG_BASE_FULL=y | 77 | CONFIG_BASE_FULL=y |
77 | CONFIG_RT_MUTEXES=y | ||
78 | CONFIG_FUTEX=y | 78 | CONFIG_FUTEX=y |
79 | # CONFIG_EPOLL is not set | 79 | # CONFIG_EPOLL is not set |
80 | CONFIG_SHMEM=y | 80 | CONFIG_SHMEM=y |
81 | CONFIG_SLAB=y | 81 | CONFIG_SLAB=y |
82 | CONFIG_VM_EVENT_COUNTERS=y | 82 | CONFIG_VM_EVENT_COUNTERS=y |
83 | CONFIG_RT_MUTEXES=y | ||
83 | # CONFIG_TINY_SHMEM is not set | 84 | # CONFIG_TINY_SHMEM is not set |
84 | CONFIG_BASE_SMALL=0 | 85 | CONFIG_BASE_SMALL=0 |
85 | # CONFIG_SLOB is not set | 86 | # CONFIG_SLOB is not set |
@@ -259,7 +260,6 @@ CONFIG_TCP_CONG_BIC=y | |||
259 | # CONFIG_ATALK is not set | 260 | # CONFIG_ATALK is not set |
260 | # CONFIG_X25 is not set | 261 | # CONFIG_X25 is not set |
261 | # CONFIG_LAPB is not set | 262 | # CONFIG_LAPB is not set |
262 | # CONFIG_NET_DIVERT is not set | ||
263 | # CONFIG_ECONET is not set | 263 | # CONFIG_ECONET is not set |
264 | # CONFIG_WAN_ROUTER is not set | 264 | # CONFIG_WAN_ROUTER is not set |
265 | 265 | ||
@@ -313,6 +313,7 @@ CONFIG_MTD_CHAR=y | |||
313 | # CONFIG_NFTL is not set | 313 | # CONFIG_NFTL is not set |
314 | # CONFIG_INFTL is not set | 314 | # CONFIG_INFTL is not set |
315 | # CONFIG_RFD_FTL is not set | 315 | # CONFIG_RFD_FTL is not set |
316 | # CONFIG_SSFDC is not set | ||
316 | 317 | ||
317 | # | 318 | # |
318 | # RAM/ROM/Flash chip drivers | 319 | # RAM/ROM/Flash chip drivers |
@@ -464,23 +465,23 @@ CONFIG_SCSI_SPI_ATTRS=y | |||
464 | # CONFIG_MEGARAID_NEWGEN is not set | 465 | # CONFIG_MEGARAID_NEWGEN is not set |
465 | # CONFIG_MEGARAID_LEGACY is not set | 466 | # CONFIG_MEGARAID_LEGACY is not set |
466 | # CONFIG_MEGARAID_SAS is not set | 467 | # CONFIG_MEGARAID_SAS is not set |
467 | CONFIG_SCSI_SATA=y | 468 | CONFIG_ATA=y |
468 | # CONFIG_SCSI_SATA_AHCI is not set | 469 | # CONFIG_SATA_AHCI is not set |
469 | # CONFIG_SCSI_SATA_SVW is not set | 470 | # CONFIG_SATA_SVW is not set |
470 | # CONFIG_SCSI_ATA_PIIX is not set | 471 | # CONFIG_SCSI_ATA_PIIX is not set |
471 | # CONFIG_SCSI_SATA_MV is not set | 472 | # CONFIG_SATA_MV is not set |
472 | # CONFIG_SCSI_SATA_NV is not set | 473 | # CONFIG_SATA_NV is not set |
473 | # CONFIG_SCSI_PDC_ADMA is not set | 474 | # CONFIG_SCSI_PDC_ADMA is not set |
474 | # CONFIG_SCSI_HPTIOP is not set | 475 | # CONFIG_SCSI_HPTIOP is not set |
475 | # CONFIG_SCSI_SATA_QSTOR is not set | 476 | # CONFIG_SATA_QSTOR is not set |
476 | # CONFIG_SCSI_SATA_PROMISE is not set | 477 | # CONFIG_SATA_PROMISE is not set |
477 | # CONFIG_SCSI_SATA_SX4 is not set | 478 | # CONFIG_SATA_SX4 is not set |
478 | CONFIG_SCSI_SATA_SIL=y | 479 | CONFIG_SATA_SIL=y |
479 | # CONFIG_SCSI_SATA_SIL24 is not set | 480 | # CONFIG_SATA_SIL24 is not set |
480 | # CONFIG_SCSI_SATA_SIS is not set | 481 | # CONFIG_SATA_SIS is not set |
481 | # CONFIG_SCSI_SATA_ULI is not set | 482 | # CONFIG_SATA_ULI is not set |
482 | # CONFIG_SCSI_SATA_VIA is not set | 483 | # CONFIG_SATA_VIA is not set |
483 | # CONFIG_SCSI_SATA_VITESSE is not set | 484 | # CONFIG_SATA_VITESSE is not set |
484 | # CONFIG_SCSI_BUSLOGIC is not set | 485 | # CONFIG_SCSI_BUSLOGIC is not set |
485 | # CONFIG_SCSI_DMX3191D is not set | 486 | # CONFIG_SCSI_DMX3191D is not set |
486 | # CONFIG_SCSI_EATA is not set | 487 | # CONFIG_SCSI_EATA is not set |
@@ -1277,11 +1278,11 @@ CONFIG_PLIST=y | |||
1277 | # | 1278 | # |
1278 | # Kernel hacking | 1279 | # Kernel hacking |
1279 | # | 1280 | # |
1280 | CONFIG_PRINTK_TIME=y | 1281 | # CONFIG_PRINTK_TIME is not set |
1281 | # CONFIG_MAGIC_SYSRQ is not set | 1282 | # CONFIG_MAGIC_SYSRQ is not set |
1282 | # CONFIG_UNUSED_SYMBOLS is not set | 1283 | # CONFIG_UNUSED_SYMBOLS is not set |
1283 | CONFIG_DEBUG_KERNEL=y | 1284 | CONFIG_DEBUG_KERNEL=y |
1284 | CONFIG_LOG_BUF_SHIFT=17 | 1285 | CONFIG_LOG_BUF_SHIFT=14 |
1285 | CONFIG_DETECT_SOFTLOCKUP=y | 1286 | CONFIG_DETECT_SOFTLOCKUP=y |
1286 | # CONFIG_SCHEDSTATS is not set | 1287 | # CONFIG_SCHEDSTATS is not set |
1287 | # CONFIG_DEBUG_SLAB is not set | 1288 | # CONFIG_DEBUG_SLAB is not set |
@@ -1293,15 +1294,15 @@ CONFIG_DETECT_SOFTLOCKUP=y | |||
1293 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 1294 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
1294 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 1295 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
1295 | # CONFIG_DEBUG_KOBJECT is not set | 1296 | # CONFIG_DEBUG_KOBJECT is not set |
1296 | CONFIG_DEBUG_INFO=y | 1297 | # CONFIG_DEBUG_INFO is not set |
1297 | # CONFIG_DEBUG_FS is not set | 1298 | # CONFIG_DEBUG_FS is not set |
1298 | # CONFIG_DEBUG_VM is not set | 1299 | # CONFIG_DEBUG_VM is not set |
1299 | CONFIG_FORCED_INLINING=y | 1300 | CONFIG_FORCED_INLINING=y |
1300 | # CONFIG_RCU_TORTURE_TEST is not set | 1301 | # CONFIG_RCU_TORTURE_TEST is not set |
1301 | # CONFIG_DEBUGGER is not set | 1302 | # CONFIG_DEBUGGER is not set |
1302 | # CONFIG_BDI_SWITCH is not set | 1303 | # CONFIG_BDI_SWITCH is not set |
1303 | CONFIG_BOOTX_TEXT=y | 1304 | # CONFIG_BOOTX_TEXT is not set |
1304 | CONFIG_SERIAL_TEXT_DEBUG=y | 1305 | # CONFIG_SERIAL_TEXT_DEBUG is not set |
1305 | # CONFIG_PPC_EARLY_DEBUG is not set | 1306 | # CONFIG_PPC_EARLY_DEBUG is not set |
1306 | 1307 | ||
1307 | # | 1308 | # |
@@ -1314,6 +1315,8 @@ CONFIG_SERIAL_TEXT_DEBUG=y | |||
1314 | # Cryptographic options | 1315 | # Cryptographic options |
1315 | # | 1316 | # |
1316 | CONFIG_CRYPTO=y | 1317 | CONFIG_CRYPTO=y |
1318 | CONFIG_CRYPTO_ALGAPI=y | ||
1319 | # CONFIG_CRYPTO_MANAGER is not set | ||
1317 | # CONFIG_CRYPTO_HMAC is not set | 1320 | # CONFIG_CRYPTO_HMAC is not set |
1318 | # CONFIG_CRYPTO_NULL is not set | 1321 | # CONFIG_CRYPTO_NULL is not set |
1319 | # CONFIG_CRYPTO_MD4 is not set | 1322 | # CONFIG_CRYPTO_MD4 is not set |
@@ -1323,6 +1326,8 @@ CONFIG_CRYPTO_MD5=y | |||
1323 | # CONFIG_CRYPTO_SHA512 is not set | 1326 | # CONFIG_CRYPTO_SHA512 is not set |
1324 | # CONFIG_CRYPTO_WP512 is not set | 1327 | # CONFIG_CRYPTO_WP512 is not set |
1325 | # CONFIG_CRYPTO_TGR192 is not set | 1328 | # CONFIG_CRYPTO_TGR192 is not set |
1329 | # CONFIG_CRYPTO_ECB is not set | ||
1330 | # CONFIG_CRYPTO_CBC is not set | ||
1326 | CONFIG_CRYPTO_DES=y | 1331 | CONFIG_CRYPTO_DES=y |
1327 | # CONFIG_CRYPTO_BLOWFISH is not set | 1332 | # CONFIG_CRYPTO_BLOWFISH is not set |
1328 | # CONFIG_CRYPTO_TWOFISH is not set | 1333 | # CONFIG_CRYPTO_TWOFISH is not set |
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig index 6861dde7d77b..765c8bb90ddd 100644 --- a/arch/powerpc/configs/pmac32_defconfig +++ b/arch/powerpc/configs/pmac32_defconfig | |||
@@ -682,7 +682,7 @@ CONFIG_SCSI_AIC7XXX_OLD=m | |||
682 | # CONFIG_MEGARAID_NEWGEN is not set | 682 | # CONFIG_MEGARAID_NEWGEN is not set |
683 | # CONFIG_MEGARAID_LEGACY is not set | 683 | # CONFIG_MEGARAID_LEGACY is not set |
684 | # CONFIG_MEGARAID_SAS is not set | 684 | # CONFIG_MEGARAID_SAS is not set |
685 | # CONFIG_SCSI_SATA is not set | 685 | # CONFIG_ATA is not set |
686 | # CONFIG_SCSI_HPTIOP is not set | 686 | # CONFIG_SCSI_HPTIOP is not set |
687 | # CONFIG_SCSI_BUSLOGIC is not set | 687 | # CONFIG_SCSI_BUSLOGIC is not set |
688 | # CONFIG_SCSI_DMX3191D is not set | 688 | # CONFIG_SCSI_DMX3191D is not set |
@@ -1826,7 +1826,7 @@ CONFIG_OPROFILE=y | |||
1826 | # Kernel hacking | 1826 | # Kernel hacking |
1827 | # | 1827 | # |
1828 | # CONFIG_PRINTK_TIME is not set | 1828 | # CONFIG_PRINTK_TIME is not set |
1829 | # CONFIG_MAGIC_SYSRQ is not set | 1829 | CONFIG_MAGIC_SYSRQ=y |
1830 | # CONFIG_UNUSED_SYMBOLS is not set | 1830 | # CONFIG_UNUSED_SYMBOLS is not set |
1831 | CONFIG_DEBUG_KERNEL=y | 1831 | CONFIG_DEBUG_KERNEL=y |
1832 | CONFIG_LOG_BUF_SHIFT=14 | 1832 | CONFIG_LOG_BUF_SHIFT=14 |
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig index 7517d0c5303f..be11df7c11aa 100644 --- a/arch/powerpc/configs/ppc64_defconfig +++ b/arch/powerpc/configs/ppc64_defconfig | |||
@@ -520,23 +520,23 @@ CONFIG_SCSI_ISCSI_ATTRS=m | |||
520 | # CONFIG_MEGARAID_NEWGEN is not set | 520 | # CONFIG_MEGARAID_NEWGEN is not set |
521 | # CONFIG_MEGARAID_LEGACY is not set | 521 | # CONFIG_MEGARAID_LEGACY is not set |
522 | # CONFIG_MEGARAID_SAS is not set | 522 | # CONFIG_MEGARAID_SAS is not set |
523 | CONFIG_SCSI_SATA=y | 523 | CONFIG_ATA=y |
524 | # CONFIG_SCSI_SATA_AHCI is not set | 524 | # CONFIG_SATA_AHCI is not set |
525 | CONFIG_SCSI_SATA_SVW=y | 525 | CONFIG_SATA_SVW=y |
526 | # CONFIG_SCSI_ATA_PIIX is not set | 526 | # CONFIG_SCSI_ATA_PIIX is not set |
527 | # CONFIG_SCSI_SATA_MV is not set | 527 | # CONFIG_SATA_MV is not set |
528 | # CONFIG_SCSI_SATA_NV is not set | 528 | # CONFIG_SATA_NV is not set |
529 | # CONFIG_SCSI_PDC_ADMA is not set | 529 | # CONFIG_SCSI_PDC_ADMA is not set |
530 | # CONFIG_SCSI_HPTIOP is not set | 530 | # CONFIG_SCSI_HPTIOP is not set |
531 | # CONFIG_SCSI_SATA_QSTOR is not set | 531 | # CONFIG_SATA_QSTOR is not set |
532 | # CONFIG_SCSI_SATA_PROMISE is not set | 532 | # CONFIG_SATA_PROMISE is not set |
533 | # CONFIG_SCSI_SATA_SX4 is not set | 533 | # CONFIG_SATA_SX4 is not set |
534 | # CONFIG_SCSI_SATA_SIL is not set | 534 | # CONFIG_SATA_SIL is not set |
535 | # CONFIG_SCSI_SATA_SIL24 is not set | 535 | # CONFIG_SATA_SIL24 is not set |
536 | # CONFIG_SCSI_SATA_SIS is not set | 536 | # CONFIG_SATA_SIS is not set |
537 | # CONFIG_SCSI_SATA_ULI is not set | 537 | # CONFIG_SATA_ULI is not set |
538 | # CONFIG_SCSI_SATA_VIA is not set | 538 | # CONFIG_SATA_VIA is not set |
539 | # CONFIG_SCSI_SATA_VITESSE is not set | 539 | # CONFIG_SATA_VITESSE is not set |
540 | # CONFIG_SCSI_BUSLOGIC is not set | 540 | # CONFIG_SCSI_BUSLOGIC is not set |
541 | # CONFIG_SCSI_DMX3191D is not set | 541 | # CONFIG_SCSI_DMX3191D is not set |
542 | # CONFIG_SCSI_EATA is not set | 542 | # CONFIG_SCSI_EATA is not set |
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index a8cdf312e1b0..44175fb7adec 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -506,7 +506,7 @@ CONFIG_SCSI_SAS_ATTRS=m | |||
506 | # CONFIG_MEGARAID_NEWGEN is not set | 506 | # CONFIG_MEGARAID_NEWGEN is not set |
507 | # CONFIG_MEGARAID_LEGACY is not set | 507 | # CONFIG_MEGARAID_LEGACY is not set |
508 | # CONFIG_MEGARAID_SAS is not set | 508 | # CONFIG_MEGARAID_SAS is not set |
509 | # CONFIG_SCSI_SATA is not set | 509 | # CONFIG_ATA is not set |
510 | # CONFIG_SCSI_HPTIOP is not set | 510 | # CONFIG_SCSI_HPTIOP is not set |
511 | # CONFIG_SCSI_BUSLOGIC is not set | 511 | # CONFIG_SCSI_BUSLOGIC is not set |
512 | # CONFIG_SCSI_DMX3191D is not set | 512 | # CONFIG_SCSI_DMX3191D is not set |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 8b3f4faf5768..8b133afbdc20 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -51,7 +51,7 @@ extra-$(CONFIG_8xx) := head_8xx.o | |||
51 | extra-y += vmlinux.lds | 51 | extra-y += vmlinux.lds |
52 | 52 | ||
53 | obj-y += time.o prom.o traps.o setup-common.o \ | 53 | obj-y += time.o prom.o traps.o setup-common.o \ |
54 | udbg.o misc.o | 54 | udbg.o misc.o io.o |
55 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o | 55 | obj-$(CONFIG_PPC32) += entry_32.o setup_32.o misc_32.o |
56 | obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o | 56 | obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o |
57 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o | 57 | obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index db65c9f6559a..190a57e20765 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -949,6 +949,7 @@ struct cpu_spec cpu_specs[] = { | |||
949 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | 949 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, |
950 | .icache_bsize = 32, | 950 | .icache_bsize = 32, |
951 | .dcache_bsize = 32, | 951 | .dcache_bsize = 32, |
952 | .platform = "ppc405", | ||
952 | }, | 953 | }, |
953 | { /* 405EP */ | 954 | { /* 405EP */ |
954 | .pvr_mask = 0xffff0000, | 955 | .pvr_mask = 0xffff0000, |
diff --git a/arch/powerpc/kernel/io.c b/arch/powerpc/kernel/io.c new file mode 100644 index 000000000000..e98180686b35 --- /dev/null +++ b/arch/powerpc/kernel/io.c | |||
@@ -0,0 +1,131 @@ | |||
1 | /* | ||
2 | * I/O string operations | ||
3 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) | ||
4 | * Copyright (C) 2006 IBM Corporation | ||
5 | * | ||
6 | * Largely rewritten by Cort Dougan (cort@cs.nmt.edu) | ||
7 | * and Paul Mackerras. | ||
8 | * | ||
9 | * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com) | ||
10 | * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com) | ||
11 | * | ||
12 | * Rewritten in C by Stephen Rothwell. | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or | ||
15 | * modify it under the terms of the GNU General Public License | ||
16 | * as published by the Free Software Foundation; either version | ||
17 | * 2 of the License, or (at your option) any later version. | ||
18 | */ | ||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/types.h> | ||
21 | #include <linux/compiler.h> | ||
22 | #include <linux/module.h> | ||
23 | |||
24 | #include <asm/io.h> | ||
25 | #include <asm/firmware.h> | ||
26 | #include <asm/bug.h> | ||
27 | |||
28 | void _insb(volatile u8 __iomem *port, void *buf, long count) | ||
29 | { | ||
30 | u8 *tbuf = buf; | ||
31 | u8 tmp; | ||
32 | |||
33 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
34 | |||
35 | if (unlikely(count <= 0)) | ||
36 | return; | ||
37 | asm volatile("sync"); | ||
38 | do { | ||
39 | tmp = *port; | ||
40 | asm volatile("eieio"); | ||
41 | *tbuf++ = tmp; | ||
42 | } while (--count != 0); | ||
43 | asm volatile("twi 0,%0,0; isync" : : "r" (tmp)); | ||
44 | } | ||
45 | EXPORT_SYMBOL(_insb); | ||
46 | |||
47 | void _outsb(volatile u8 __iomem *port, const void *buf, long count) | ||
48 | { | ||
49 | const u8 *tbuf = buf; | ||
50 | |||
51 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
52 | |||
53 | if (unlikely(count <= 0)) | ||
54 | return; | ||
55 | asm volatile("sync"); | ||
56 | do { | ||
57 | *port = *tbuf++; | ||
58 | } while (--count != 0); | ||
59 | asm volatile("sync"); | ||
60 | } | ||
61 | EXPORT_SYMBOL(_outsb); | ||
62 | |||
63 | void _insw_ns(volatile u16 __iomem *port, void *buf, long count) | ||
64 | { | ||
65 | u16 *tbuf = buf; | ||
66 | u16 tmp; | ||
67 | |||
68 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
69 | |||
70 | if (unlikely(count <= 0)) | ||
71 | return; | ||
72 | asm volatile("sync"); | ||
73 | do { | ||
74 | tmp = *port; | ||
75 | asm volatile("eieio"); | ||
76 | *tbuf++ = tmp; | ||
77 | } while (--count != 0); | ||
78 | asm volatile("twi 0,%0,0; isync" : : "r" (tmp)); | ||
79 | } | ||
80 | EXPORT_SYMBOL(_insw_ns); | ||
81 | |||
82 | void _outsw_ns(volatile u16 __iomem *port, const void *buf, long count) | ||
83 | { | ||
84 | const u16 *tbuf = buf; | ||
85 | |||
86 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
87 | |||
88 | if (unlikely(count <= 0)) | ||
89 | return; | ||
90 | asm volatile("sync"); | ||
91 | do { | ||
92 | *port = *tbuf++; | ||
93 | } while (--count != 0); | ||
94 | asm volatile("sync"); | ||
95 | } | ||
96 | EXPORT_SYMBOL(_outsw_ns); | ||
97 | |||
98 | void _insl_ns(volatile u32 __iomem *port, void *buf, long count) | ||
99 | { | ||
100 | u32 *tbuf = buf; | ||
101 | u32 tmp; | ||
102 | |||
103 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
104 | |||
105 | if (unlikely(count <= 0)) | ||
106 | return; | ||
107 | asm volatile("sync"); | ||
108 | do { | ||
109 | tmp = *port; | ||
110 | asm volatile("eieio"); | ||
111 | *tbuf++ = tmp; | ||
112 | } while (--count != 0); | ||
113 | asm volatile("twi 0,%0,0; isync" : : "r" (tmp)); | ||
114 | } | ||
115 | EXPORT_SYMBOL(_insl_ns); | ||
116 | |||
117 | void _outsl_ns(volatile u32 __iomem *port, const void *buf, long count) | ||
118 | { | ||
119 | const u32 *tbuf = buf; | ||
120 | |||
121 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
122 | |||
123 | if (unlikely(count <= 0)) | ||
124 | return; | ||
125 | asm volatile("sync"); | ||
126 | do { | ||
127 | *port = *tbuf++; | ||
128 | } while (--count != 0); | ||
129 | asm volatile("sync"); | ||
130 | } | ||
131 | EXPORT_SYMBOL(_outsl_ns); | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index b4432332341f..c3f58f2f9f52 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -777,7 +777,6 @@ unsigned int irq_alloc_virt(struct irq_host *host, | |||
777 | { | 777 | { |
778 | unsigned long flags; | 778 | unsigned long flags; |
779 | unsigned int i, j, found = NO_IRQ; | 779 | unsigned int i, j, found = NO_IRQ; |
780 | unsigned int limit = irq_virq_count - count; | ||
781 | 780 | ||
782 | if (count == 0 || count > (irq_virq_count - NUM_ISA_INTERRUPTS)) | 781 | if (count == 0 || count > (irq_virq_count - NUM_ISA_INTERRUPTS)) |
783 | return NO_IRQ; | 782 | return NO_IRQ; |
@@ -794,14 +793,16 @@ unsigned int irq_alloc_virt(struct irq_host *host, | |||
794 | /* Look for count consecutive numbers in the allocatable | 793 | /* Look for count consecutive numbers in the allocatable |
795 | * (non-legacy) space | 794 | * (non-legacy) space |
796 | */ | 795 | */ |
797 | for (i = NUM_ISA_INTERRUPTS; i <= limit; ) { | 796 | for (i = NUM_ISA_INTERRUPTS, j = 0; i < irq_virq_count; i++) { |
798 | for (j = i; j < (i + count); j++) | 797 | if (irq_map[i].host != NULL) |
799 | if (irq_map[j].host != NULL) { | 798 | j = 0; |
800 | i = j + 1; | 799 | else |
801 | continue; | 800 | j++; |
802 | } | 801 | |
803 | found = i; | 802 | if (j == count) { |
804 | break; | 803 | found = i - count + 1; |
804 | break; | ||
805 | } | ||
805 | } | 806 | } |
806 | if (found == NO_IRQ) { | 807 | if (found == NO_IRQ) { |
807 | spin_unlock_irqrestore(&irq_big_lock, flags); | 808 | spin_unlock_irqrestore(&irq_big_lock, flags); |
diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S index f770805f1215..330c9dc7db86 100644 --- a/arch/powerpc/kernel/misc.S +++ b/arch/powerpc/kernel/misc.S | |||
@@ -43,162 +43,3 @@ _GLOBAL(add_reloc_offset) | |||
43 | add r3,r3,r5 | 43 | add r3,r3,r5 |
44 | mtlr r0 | 44 | mtlr r0 |
45 | blr | 45 | blr |
46 | |||
47 | /* | ||
48 | * I/O string operations | ||
49 | * | ||
50 | * insb(port, buf, len) | ||
51 | * outsb(port, buf, len) | ||
52 | * insw(port, buf, len) | ||
53 | * outsw(port, buf, len) | ||
54 | * insl(port, buf, len) | ||
55 | * outsl(port, buf, len) | ||
56 | * insw_ns(port, buf, len) | ||
57 | * outsw_ns(port, buf, len) | ||
58 | * insl_ns(port, buf, len) | ||
59 | * outsl_ns(port, buf, len) | ||
60 | * | ||
61 | * The *_ns versions don't do byte-swapping. | ||
62 | */ | ||
63 | _GLOBAL(_insb) | ||
64 | sync | ||
65 | cmpwi 0,r5,0 | ||
66 | mtctr r5 | ||
67 | subi r4,r4,1 | ||
68 | blelr- | ||
69 | 00: lbz r5,0(r3) | ||
70 | eieio | ||
71 | stbu r5,1(r4) | ||
72 | bdnz 00b | ||
73 | twi 0,r5,0 | ||
74 | isync | ||
75 | blr | ||
76 | |||
77 | _GLOBAL(_outsb) | ||
78 | cmpwi 0,r5,0 | ||
79 | mtctr r5 | ||
80 | subi r4,r4,1 | ||
81 | blelr- | ||
82 | sync | ||
83 | 00: lbzu r5,1(r4) | ||
84 | stb r5,0(r3) | ||
85 | bdnz 00b | ||
86 | sync | ||
87 | blr | ||
88 | |||
89 | _GLOBAL(_insw) | ||
90 | sync | ||
91 | cmpwi 0,r5,0 | ||
92 | mtctr r5 | ||
93 | subi r4,r4,2 | ||
94 | blelr- | ||
95 | 00: lhbrx r5,0,r3 | ||
96 | eieio | ||
97 | sthu r5,2(r4) | ||
98 | bdnz 00b | ||
99 | twi 0,r5,0 | ||
100 | isync | ||
101 | blr | ||
102 | |||
103 | _GLOBAL(_outsw) | ||
104 | cmpwi 0,r5,0 | ||
105 | mtctr r5 | ||
106 | subi r4,r4,2 | ||
107 | blelr- | ||
108 | sync | ||
109 | 00: lhzu r5,2(r4) | ||
110 | sthbrx r5,0,r3 | ||
111 | bdnz 00b | ||
112 | sync | ||
113 | blr | ||
114 | |||
115 | _GLOBAL(_insl) | ||
116 | sync | ||
117 | cmpwi 0,r5,0 | ||
118 | mtctr r5 | ||
119 | subi r4,r4,4 | ||
120 | blelr- | ||
121 | 00: lwbrx r5,0,r3 | ||
122 | eieio | ||
123 | stwu r5,4(r4) | ||
124 | bdnz 00b | ||
125 | twi 0,r5,0 | ||
126 | isync | ||
127 | blr | ||
128 | |||
129 | _GLOBAL(_outsl) | ||
130 | cmpwi 0,r5,0 | ||
131 | mtctr r5 | ||
132 | subi r4,r4,4 | ||
133 | blelr- | ||
134 | sync | ||
135 | 00: lwzu r5,4(r4) | ||
136 | stwbrx r5,0,r3 | ||
137 | bdnz 00b | ||
138 | sync | ||
139 | blr | ||
140 | |||
141 | #ifdef CONFIG_PPC32 | ||
142 | _GLOBAL(__ide_mm_insw) | ||
143 | #endif | ||
144 | _GLOBAL(_insw_ns) | ||
145 | sync | ||
146 | cmpwi 0,r5,0 | ||
147 | mtctr r5 | ||
148 | subi r4,r4,2 | ||
149 | blelr- | ||
150 | 00: lhz r5,0(r3) | ||
151 | eieio | ||
152 | sthu r5,2(r4) | ||
153 | bdnz 00b | ||
154 | twi 0,r5,0 | ||
155 | isync | ||
156 | blr | ||
157 | |||
158 | #ifdef CONFIG_PPC32 | ||
159 | _GLOBAL(__ide_mm_outsw) | ||
160 | #endif | ||
161 | _GLOBAL(_outsw_ns) | ||
162 | cmpwi 0,r5,0 | ||
163 | mtctr r5 | ||
164 | subi r4,r4,2 | ||
165 | blelr- | ||
166 | sync | ||
167 | 00: lhzu r5,2(r4) | ||
168 | sth r5,0(r3) | ||
169 | bdnz 00b | ||
170 | sync | ||
171 | blr | ||
172 | |||
173 | #ifdef CONFIG_PPC32 | ||
174 | _GLOBAL(__ide_mm_insl) | ||
175 | #endif | ||
176 | _GLOBAL(_insl_ns) | ||
177 | sync | ||
178 | cmpwi 0,r5,0 | ||
179 | mtctr r5 | ||
180 | subi r4,r4,4 | ||
181 | blelr- | ||
182 | 00: lwz r5,0(r3) | ||
183 | eieio | ||
184 | stwu r5,4(r4) | ||
185 | bdnz 00b | ||
186 | twi 0,r5,0 | ||
187 | isync | ||
188 | blr | ||
189 | |||
190 | #ifdef CONFIG_PPC32 | ||
191 | _GLOBAL(__ide_mm_outsl) | ||
192 | #endif | ||
193 | _GLOBAL(_outsl_ns) | ||
194 | cmpwi 0,r5,0 | ||
195 | mtctr r5 | ||
196 | subi r4,r4,4 | ||
197 | blelr- | ||
198 | sync | ||
199 | 00: lwzu r5,4(r4) | ||
200 | stw r5,0(r3) | ||
201 | bdnz 00b | ||
202 | sync | ||
203 | blr | ||
204 | |||
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index b2edac8ddf0a..807193a3c784 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -95,24 +95,6 @@ EXPORT_SYMBOL(__strnlen_user); | |||
95 | EXPORT_SYMBOL(copy_4K_page); | 95 | EXPORT_SYMBOL(copy_4K_page); |
96 | #endif | 96 | #endif |
97 | 97 | ||
98 | #ifndef __powerpc64__ | ||
99 | EXPORT_SYMBOL(__ide_mm_insl); | ||
100 | EXPORT_SYMBOL(__ide_mm_outsw); | ||
101 | EXPORT_SYMBOL(__ide_mm_insw); | ||
102 | EXPORT_SYMBOL(__ide_mm_outsl); | ||
103 | #endif | ||
104 | |||
105 | EXPORT_SYMBOL(_insb); | ||
106 | EXPORT_SYMBOL(_outsb); | ||
107 | EXPORT_SYMBOL(_insw); | ||
108 | EXPORT_SYMBOL(_outsw); | ||
109 | EXPORT_SYMBOL(_insl); | ||
110 | EXPORT_SYMBOL(_outsl); | ||
111 | EXPORT_SYMBOL(_insw_ns); | ||
112 | EXPORT_SYMBOL(_outsw_ns); | ||
113 | EXPORT_SYMBOL(_insl_ns); | ||
114 | EXPORT_SYMBOL(_outsl_ns); | ||
115 | |||
116 | #if defined(CONFIG_PPC32) && (defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)) | 98 | #if defined(CONFIG_PPC32) && (defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)) |
117 | EXPORT_SYMBOL(ppc_ide_md); | 99 | EXPORT_SYMBOL(ppc_ide_md); |
118 | #endif | 100 | #endif |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index bf2005b2feb6..eb913f80bfb1 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -757,24 +757,9 @@ static int __init early_init_dt_scan_root(unsigned long node, | |||
757 | static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) | 757 | static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) |
758 | { | 758 | { |
759 | cell_t *p = *cellp; | 759 | cell_t *p = *cellp; |
760 | unsigned long r; | ||
761 | 760 | ||
762 | /* Ignore more than 2 cells */ | 761 | *cellp = p + s; |
763 | while (s > sizeof(unsigned long) / 4) { | 762 | return of_read_ulong(p, s); |
764 | p++; | ||
765 | s--; | ||
766 | } | ||
767 | r = *p++; | ||
768 | #ifdef CONFIG_PPC64 | ||
769 | if (s > 1) { | ||
770 | r <<= 32; | ||
771 | r |= *(p++); | ||
772 | s--; | ||
773 | } | ||
774 | #endif | ||
775 | |||
776 | *cellp = p; | ||
777 | return r; | ||
778 | } | 763 | } |
779 | 764 | ||
780 | 765 | ||
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index dea75d73f983..975102a020d9 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -526,9 +526,7 @@ static void do_syscall_trace(void) | |||
526 | 526 | ||
527 | void do_syscall_trace_enter(struct pt_regs *regs) | 527 | void do_syscall_trace_enter(struct pt_regs *regs) |
528 | { | 528 | { |
529 | #ifdef CONFIG_PPC64 | ||
530 | secure_computing(regs->gpr[0]); | 529 | secure_computing(regs->gpr[0]); |
531 | #endif | ||
532 | 530 | ||
533 | if (test_thread_flag(TIF_SYSCALL_TRACE) | 531 | if (test_thread_flag(TIF_SYSCALL_TRACE) |
534 | && (current->ptrace & PT_PTRACED)) | 532 | && (current->ptrace & PT_PTRACED)) |
@@ -548,12 +546,8 @@ void do_syscall_trace_enter(struct pt_regs *regs) | |||
548 | 546 | ||
549 | void do_syscall_trace_leave(struct pt_regs *regs) | 547 | void do_syscall_trace_leave(struct pt_regs *regs) |
550 | { | 548 | { |
551 | #ifdef CONFIG_PPC32 | ||
552 | secure_computing(regs->gpr[0]); | ||
553 | #endif | ||
554 | |||
555 | if (unlikely(current->audit_context)) | 549 | if (unlikely(current->audit_context)) |
556 | audit_syscall_exit((regs->ccr&0x1000)?AUDITSC_FAILURE:AUDITSC_SUCCESS, | 550 | audit_syscall_exit((regs->ccr&0x10000000)?AUDITSC_FAILURE:AUDITSC_SUCCESS, |
557 | regs->result); | 551 | regs->result); |
558 | 552 | ||
559 | if ((test_thread_flag(TIF_SYSCALL_TRACE) | 553 | if ((test_thread_flag(TIF_SYSCALL_TRACE) |
@@ -561,8 +555,3 @@ void do_syscall_trace_leave(struct pt_regs *regs) | |||
561 | && (current->ptrace & PT_PTRACED)) | 555 | && (current->ptrace & PT_PTRACED)) |
562 | do_syscall_trace(); | 556 | do_syscall_trace(); |
563 | } | 557 | } |
564 | |||
565 | #ifdef CONFIG_PPC32 | ||
566 | EXPORT_SYMBOL(do_syscall_trace_enter); | ||
567 | EXPORT_SYMBOL(do_syscall_trace_leave); | ||
568 | #endif | ||
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 465e7435efbc..0af3fc1bdcc9 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -304,18 +304,21 @@ struct seq_operations cpuinfo_op = { | |||
304 | void __init check_for_initrd(void) | 304 | void __init check_for_initrd(void) |
305 | { | 305 | { |
306 | #ifdef CONFIG_BLK_DEV_INITRD | 306 | #ifdef CONFIG_BLK_DEV_INITRD |
307 | const unsigned long *prop; | 307 | const unsigned int *prop; |
308 | int len; | ||
308 | 309 | ||
309 | DBG(" -> check_for_initrd()\n"); | 310 | DBG(" -> check_for_initrd()\n"); |
310 | 311 | ||
311 | if (of_chosen) { | 312 | if (of_chosen) { |
312 | prop = get_property(of_chosen, "linux,initrd-start", NULL); | 313 | prop = get_property(of_chosen, "linux,initrd-start", &len); |
313 | if (prop != NULL) { | 314 | if (prop != NULL) { |
314 | initrd_start = (unsigned long)__va(*prop); | 315 | initrd_start = (unsigned long) |
316 | __va(of_read_ulong(prop, len / 4)); | ||
315 | prop = get_property(of_chosen, | 317 | prop = get_property(of_chosen, |
316 | "linux,initrd-end", NULL); | 318 | "linux,initrd-end", &len); |
317 | if (prop != NULL) { | 319 | if (prop != NULL) { |
318 | initrd_end = (unsigned long)__va(*prop); | 320 | initrd_end = (unsigned long) |
321 | __va(of_read_ulong(prop, len / 4)); | ||
319 | initrd_below_start_ok = 1; | 322 | initrd_below_start_ok = 1; |
320 | } else | 323 | } else |
321 | initrd_start = 0; | 324 | initrd_start = 0; |
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 406f308ddead..d45a168bdaca 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c | |||
@@ -25,8 +25,8 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices); | |||
25 | /* SMT stuff */ | 25 | /* SMT stuff */ |
26 | 26 | ||
27 | #ifdef CONFIG_PPC_MULTIPLATFORM | 27 | #ifdef CONFIG_PPC_MULTIPLATFORM |
28 | /* default to snooze disabled */ | 28 | /* Time in microseconds we delay before sleeping in the idle loop */ |
29 | DEFINE_PER_CPU(unsigned long, smt_snooze_delay); | 29 | DEFINE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 }; |
30 | 30 | ||
31 | static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf, | 31 | static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf, |
32 | size_t count) | 32 | size_t count) |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index b9a2061cfdb7..7a3c3f791ade 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -870,9 +870,7 @@ static int __init get_freq(char *name, int cells, unsigned long *val) | |||
870 | fp = get_property(cpu, name, NULL); | 870 | fp = get_property(cpu, name, NULL); |
871 | if (fp) { | 871 | if (fp) { |
872 | found = 1; | 872 | found = 1; |
873 | *val = 0; | 873 | *val = of_read_ulong(fp, cells); |
874 | while (cells--) | ||
875 | *val = (*val << 32) | *fp++; | ||
876 | } | 874 | } |
877 | 875 | ||
878 | of_node_put(cpu); | 876 | of_node_put(cpu); |
diff --git a/arch/powerpc/lib/locks.c b/arch/powerpc/lib/locks.c index 077bed7dc52b..80b482ca30df 100644 --- a/arch/powerpc/lib/locks.c +++ b/arch/powerpc/lib/locks.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/hvcall.h> | 23 | #include <asm/hvcall.h> |
24 | #include <asm/iseries/hv_call.h> | 24 | #include <asm/iseries/hv_call.h> |
25 | #include <asm/smp.h> | 25 | #include <asm/smp.h> |
26 | #include <asm/firmware.h> | ||
26 | 27 | ||
27 | void __spin_yield(raw_spinlock_t *lock) | 28 | void __spin_yield(raw_spinlock_t *lock) |
28 | { | 29 | { |
@@ -39,13 +40,12 @@ void __spin_yield(raw_spinlock_t *lock) | |||
39 | rmb(); | 40 | rmb(); |
40 | if (lock->slock != lock_value) | 41 | if (lock->slock != lock_value) |
41 | return; /* something has changed */ | 42 | return; /* something has changed */ |
42 | #ifdef CONFIG_PPC_ISERIES | 43 | if (firmware_has_feature(FW_FEATURE_ISERIES)) |
43 | HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc, | 44 | HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc, |
44 | ((u64)holder_cpu << 32) | yield_count); | 45 | ((u64)holder_cpu << 32) | yield_count); |
45 | #else | 46 | else |
46 | plpar_hcall_norets(H_CONFER, get_hard_smp_processor_id(holder_cpu), | 47 | plpar_hcall_norets(H_CONFER, |
47 | yield_count); | 48 | get_hard_smp_processor_id(holder_cpu), yield_count); |
48 | #endif | ||
49 | } | 49 | } |
50 | 50 | ||
51 | /* | 51 | /* |
@@ -69,13 +69,12 @@ void __rw_yield(raw_rwlock_t *rw) | |||
69 | rmb(); | 69 | rmb(); |
70 | if (rw->lock != lock_value) | 70 | if (rw->lock != lock_value) |
71 | return; /* something has changed */ | 71 | return; /* something has changed */ |
72 | #ifdef CONFIG_PPC_ISERIES | 72 | if (firmware_has_feature(FW_FEATURE_ISERIES)) |
73 | HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc, | 73 | HvCall2(HvCallBaseYieldProcessor, HvCall_YieldToProc, |
74 | ((u64)holder_cpu << 32) | yield_count); | 74 | ((u64)holder_cpu << 32) | yield_count); |
75 | #else | 75 | else |
76 | plpar_hcall_norets(H_CONFER, get_hard_smp_processor_id(holder_cpu), | 76 | plpar_hcall_norets(H_CONFER, |
77 | yield_count); | 77 | get_hard_smp_processor_id(holder_cpu), yield_count); |
78 | #endif | ||
79 | } | 78 | } |
80 | #endif | 79 | #endif |
81 | 80 | ||
diff --git a/arch/powerpc/math-emu/Makefile b/arch/powerpc/math-emu/Makefile index 754143e8936b..29bc9126241b 100644 --- a/arch/powerpc/math-emu/Makefile +++ b/arch/powerpc/math-emu/Makefile | |||
@@ -11,3 +11,6 @@ obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \ | |||
11 | mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ | 11 | mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ |
12 | mtfsf.o mtfsfi.o stfiwx.o stfs.o \ | 12 | mtfsf.o mtfsfi.o stfiwx.o stfs.o \ |
13 | udivmodti4.o | 13 | udivmodti4.o |
14 | |||
15 | CFLAGS_fabs.o = -fno-builtin-fabs | ||
16 | CFLAGS_math.o = -fno-builtin-fabs | ||
diff --git a/arch/powerpc/oprofile/backtrace.c b/arch/powerpc/oprofile/backtrace.c index 75f57bc96b40..b4278cfd1f80 100644 --- a/arch/powerpc/oprofile/backtrace.c +++ b/arch/powerpc/oprofile/backtrace.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/sched.h> | 11 | #include <linux/sched.h> |
12 | #include <asm/processor.h> | 12 | #include <asm/processor.h> |
13 | #include <asm/uaccess.h> | 13 | #include <asm/uaccess.h> |
14 | #include <asm/compat.h> | ||
14 | 15 | ||
15 | #define STACK_SP(STACK) *(STACK) | 16 | #define STACK_SP(STACK) *(STACK) |
16 | 17 | ||
@@ -26,8 +27,9 @@ | |||
26 | static unsigned int user_getsp32(unsigned int sp, int is_first) | 27 | static unsigned int user_getsp32(unsigned int sp, int is_first) |
27 | { | 28 | { |
28 | unsigned int stack_frame[2]; | 29 | unsigned int stack_frame[2]; |
30 | void __user *p = compat_ptr(sp); | ||
29 | 31 | ||
30 | if (!access_ok(VERIFY_READ, sp, sizeof(stack_frame))) | 32 | if (!access_ok(VERIFY_READ, p, sizeof(stack_frame))) |
31 | return 0; | 33 | return 0; |
32 | 34 | ||
33 | /* | 35 | /* |
@@ -35,8 +37,7 @@ static unsigned int user_getsp32(unsigned int sp, int is_first) | |||
35 | * which means that we've done all that we can do from | 37 | * which means that we've done all that we can do from |
36 | * interrupt context. | 38 | * interrupt context. |
37 | */ | 39 | */ |
38 | if (__copy_from_user_inatomic(stack_frame, (void *)(long)sp, | 40 | if (__copy_from_user_inatomic(stack_frame, p, sizeof(stack_frame))) |
39 | sizeof(stack_frame))) | ||
40 | return 0; | 41 | return 0; |
41 | 42 | ||
42 | if (!is_first) | 43 | if (!is_first) |
@@ -54,10 +55,10 @@ static unsigned long user_getsp64(unsigned long sp, int is_first) | |||
54 | { | 55 | { |
55 | unsigned long stack_frame[3]; | 56 | unsigned long stack_frame[3]; |
56 | 57 | ||
57 | if (!access_ok(VERIFY_READ, sp, sizeof(stack_frame))) | 58 | if (!access_ok(VERIFY_READ, (void __user *)sp, sizeof(stack_frame))) |
58 | return 0; | 59 | return 0; |
59 | 60 | ||
60 | if (__copy_from_user_inatomic(stack_frame, (void *)sp, | 61 | if (__copy_from_user_inatomic(stack_frame, (void __user *)sp, |
61 | sizeof(stack_frame))) | 62 | sizeof(stack_frame))) |
62 | return 0; | 63 | return 0; |
63 | 64 | ||
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index 3bd36d46ab4a..0f5c8ebc7fc3 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -538,7 +538,7 @@ static void __iomem * __init map_spe_prop(struct spu *spu, | |||
538 | 538 | ||
539 | const void *p; | 539 | const void *p; |
540 | int proplen; | 540 | int proplen; |
541 | void* ret = NULL; | 541 | void __iomem *ret = NULL; |
542 | int err = 0; | 542 | int err = 0; |
543 | 543 | ||
544 | p = get_property(n, name, &proplen); | 544 | p = get_property(n, name, &proplen); |
@@ -562,7 +562,7 @@ static void spu_unmap(struct spu *spu) | |||
562 | iounmap(spu->priv2); | 562 | iounmap(spu->priv2); |
563 | iounmap(spu->priv1); | 563 | iounmap(spu->priv1); |
564 | iounmap(spu->problem); | 564 | iounmap(spu->problem); |
565 | iounmap((u8 __iomem *)spu->local_store); | 565 | iounmap((__force u8 __iomem *)spu->local_store); |
566 | } | 566 | } |
567 | 567 | ||
568 | /* This function shall be abstracted for HV platforms */ | 568 | /* This function shall be abstracted for HV platforms */ |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 58e794f9da1b..51fd197ab5dd 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -1342,7 +1342,7 @@ static u64 spufs_id_get(void *data) | |||
1342 | 1342 | ||
1343 | return num; | 1343 | return num; |
1344 | } | 1344 | } |
1345 | DEFINE_SIMPLE_ATTRIBUTE(spufs_id_ops, spufs_id_get, 0, "0x%llx\n") | 1345 | DEFINE_SIMPLE_ATTRIBUTE(spufs_id_ops, spufs_id_get, NULL, "0x%llx\n") |
1346 | 1346 | ||
1347 | struct tree_descr spufs_dir_contents[] = { | 1347 | struct tree_descr spufs_dir_contents[] = { |
1348 | { "mem", &spufs_mem_fops, 0666, }, | 1348 | { "mem", &spufs_mem_fops, 0666, }, |
diff --git a/arch/powerpc/platforms/cell/spufs/hw_ops.c b/arch/powerpc/platforms/cell/spufs/hw_ops.c index c8670f519734..efc452e71ab0 100644 --- a/arch/powerpc/platforms/cell/spufs/hw_ops.c +++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c | |||
@@ -234,7 +234,7 @@ static void spu_hw_runcntl_stop(struct spu_context *ctx) | |||
234 | 234 | ||
235 | static int spu_hw_set_mfc_query(struct spu_context * ctx, u32 mask, u32 mode) | 235 | static int spu_hw_set_mfc_query(struct spu_context * ctx, u32 mask, u32 mode) |
236 | { | 236 | { |
237 | struct spu_problem *prob = ctx->spu->problem; | 237 | struct spu_problem __iomem *prob = ctx->spu->problem; |
238 | int ret; | 238 | int ret; |
239 | 239 | ||
240 | spin_lock_irq(&ctx->spu->register_lock); | 240 | spin_lock_irq(&ctx->spu->register_lock); |
@@ -263,7 +263,7 @@ static int spu_hw_send_mfc_command(struct spu_context *ctx, | |||
263 | struct mfc_dma_command *cmd) | 263 | struct mfc_dma_command *cmd) |
264 | { | 264 | { |
265 | u32 status; | 265 | u32 status; |
266 | struct spu_problem *prob = ctx->spu->problem; | 266 | struct spu_problem __iomem *prob = ctx->spu->problem; |
267 | 267 | ||
268 | spin_lock_irq(&ctx->spu->register_lock); | 268 | spin_lock_irq(&ctx->spu->register_lock); |
269 | out_be32(&prob->mfc_lsa_W, cmd->lsa); | 269 | out_be32(&prob->mfc_lsa_W, cmd->lsa); |
diff --git a/arch/powerpc/platforms/iseries/pci.c b/arch/powerpc/platforms/iseries/pci.c index f4d427a7bb2d..3eb12065df23 100644 --- a/arch/powerpc/platforms/iseries/pci.c +++ b/arch/powerpc/platforms/iseries/pci.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/pci-bridge.h> | 34 | #include <asm/pci-bridge.h> |
35 | #include <asm/iommu.h> | 35 | #include <asm/iommu.h> |
36 | #include <asm/abs_addr.h> | 36 | #include <asm/abs_addr.h> |
37 | #include <asm/firmware.h> | ||
37 | 38 | ||
38 | #include <asm/iseries/hv_call_xm.h> | 39 | #include <asm/iseries/hv_call_xm.h> |
39 | #include <asm/iseries/mf.h> | 40 | #include <asm/iseries/mf.h> |
@@ -270,46 +271,6 @@ void pcibios_fixup_resources(struct pci_dev *pdev) | |||
270 | } | 271 | } |
271 | 272 | ||
272 | /* | 273 | /* |
273 | * I/0 Memory copy MUST use mmio commands on iSeries | ||
274 | * To do; For performance, include the hv call directly | ||
275 | */ | ||
276 | void iSeries_memset_io(volatile void __iomem *dest, char c, size_t Count) | ||
277 | { | ||
278 | u8 ByteValue = c; | ||
279 | long NumberOfBytes = Count; | ||
280 | |||
281 | while (NumberOfBytes > 0) { | ||
282 | iSeries_Write_Byte(ByteValue, dest++); | ||
283 | -- NumberOfBytes; | ||
284 | } | ||
285 | } | ||
286 | EXPORT_SYMBOL(iSeries_memset_io); | ||
287 | |||
288 | void iSeries_memcpy_toio(volatile void __iomem *dest, void *source, size_t count) | ||
289 | { | ||
290 | char *src = source; | ||
291 | long NumberOfBytes = count; | ||
292 | |||
293 | while (NumberOfBytes > 0) { | ||
294 | iSeries_Write_Byte(*src++, dest++); | ||
295 | -- NumberOfBytes; | ||
296 | } | ||
297 | } | ||
298 | EXPORT_SYMBOL(iSeries_memcpy_toio); | ||
299 | |||
300 | void iSeries_memcpy_fromio(void *dest, const volatile void __iomem *src, size_t count) | ||
301 | { | ||
302 | char *dst = dest; | ||
303 | long NumberOfBytes = count; | ||
304 | |||
305 | while (NumberOfBytes > 0) { | ||
306 | *dst++ = iSeries_Read_Byte(src++); | ||
307 | -- NumberOfBytes; | ||
308 | } | ||
309 | } | ||
310 | EXPORT_SYMBOL(iSeries_memcpy_fromio); | ||
311 | |||
312 | /* | ||
313 | * Look down the chain to find the matching Device Device | 274 | * Look down the chain to find the matching Device Device |
314 | */ | 275 | */ |
315 | static struct device_node *find_Device_Node(int bus, int devfn) | 276 | static struct device_node *find_Device_Node(int bus, int devfn) |
@@ -491,7 +452,7 @@ static inline struct device_node *xlate_iomm_address( | |||
491 | * iSeries_Read_Word = Read Word (16 bit) | 452 | * iSeries_Read_Word = Read Word (16 bit) |
492 | * iSeries_Read_Long = Read Long (32 bit) | 453 | * iSeries_Read_Long = Read Long (32 bit) |
493 | */ | 454 | */ |
494 | u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress) | 455 | static u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress) |
495 | { | 456 | { |
496 | u64 BarOffset; | 457 | u64 BarOffset; |
497 | u64 dsa; | 458 | u64 dsa; |
@@ -518,9 +479,8 @@ u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress) | |||
518 | 479 | ||
519 | return (u8)ret.value; | 480 | return (u8)ret.value; |
520 | } | 481 | } |
521 | EXPORT_SYMBOL(iSeries_Read_Byte); | ||
522 | 482 | ||
523 | u16 iSeries_Read_Word(const volatile void __iomem *IoAddress) | 483 | static u16 iSeries_Read_Word(const volatile void __iomem *IoAddress) |
524 | { | 484 | { |
525 | u64 BarOffset; | 485 | u64 BarOffset; |
526 | u64 dsa; | 486 | u64 dsa; |
@@ -548,9 +508,8 @@ u16 iSeries_Read_Word(const volatile void __iomem *IoAddress) | |||
548 | 508 | ||
549 | return swab16((u16)ret.value); | 509 | return swab16((u16)ret.value); |
550 | } | 510 | } |
551 | EXPORT_SYMBOL(iSeries_Read_Word); | ||
552 | 511 | ||
553 | u32 iSeries_Read_Long(const volatile void __iomem *IoAddress) | 512 | static u32 iSeries_Read_Long(const volatile void __iomem *IoAddress) |
554 | { | 513 | { |
555 | u64 BarOffset; | 514 | u64 BarOffset; |
556 | u64 dsa; | 515 | u64 dsa; |
@@ -578,7 +537,6 @@ u32 iSeries_Read_Long(const volatile void __iomem *IoAddress) | |||
578 | 537 | ||
579 | return swab32((u32)ret.value); | 538 | return swab32((u32)ret.value); |
580 | } | 539 | } |
581 | EXPORT_SYMBOL(iSeries_Read_Long); | ||
582 | 540 | ||
583 | /* | 541 | /* |
584 | * Write MM I/O Instructions for the iSeries | 542 | * Write MM I/O Instructions for the iSeries |
@@ -587,7 +545,7 @@ EXPORT_SYMBOL(iSeries_Read_Long); | |||
587 | * iSeries_Write_Word = Write Word(16 bit) | 545 | * iSeries_Write_Word = Write Word(16 bit) |
588 | * iSeries_Write_Long = Write Long(32 bit) | 546 | * iSeries_Write_Long = Write Long(32 bit) |
589 | */ | 547 | */ |
590 | void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress) | 548 | static void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress) |
591 | { | 549 | { |
592 | u64 BarOffset; | 550 | u64 BarOffset; |
593 | u64 dsa; | 551 | u64 dsa; |
@@ -612,9 +570,8 @@ void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress) | |||
612 | rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0); | 570 | rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0); |
613 | } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0); | 571 | } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0); |
614 | } | 572 | } |
615 | EXPORT_SYMBOL(iSeries_Write_Byte); | ||
616 | 573 | ||
617 | void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress) | 574 | static void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress) |
618 | { | 575 | { |
619 | u64 BarOffset; | 576 | u64 BarOffset; |
620 | u64 dsa; | 577 | u64 dsa; |
@@ -639,9 +596,8 @@ void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress) | |||
639 | rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0); | 596 | rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, swab16(data), 0); |
640 | } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0); | 597 | } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0); |
641 | } | 598 | } |
642 | EXPORT_SYMBOL(iSeries_Write_Word); | ||
643 | 599 | ||
644 | void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress) | 600 | static void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress) |
645 | { | 601 | { |
646 | u64 BarOffset; | 602 | u64 BarOffset; |
647 | u64 dsa; | 603 | u64 dsa; |
@@ -666,4 +622,224 @@ void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress) | |||
666 | rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0); | 622 | rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, swab32(data), 0); |
667 | } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0); | 623 | } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0); |
668 | } | 624 | } |
669 | EXPORT_SYMBOL(iSeries_Write_Long); | 625 | |
626 | extern unsigned char __raw_readb(const volatile void __iomem *addr) | ||
627 | { | ||
628 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
629 | |||
630 | return *(volatile unsigned char __force *)addr; | ||
631 | } | ||
632 | EXPORT_SYMBOL(__raw_readb); | ||
633 | |||
634 | extern unsigned short __raw_readw(const volatile void __iomem *addr) | ||
635 | { | ||
636 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
637 | |||
638 | return *(volatile unsigned short __force *)addr; | ||
639 | } | ||
640 | EXPORT_SYMBOL(__raw_readw); | ||
641 | |||
642 | extern unsigned int __raw_readl(const volatile void __iomem *addr) | ||
643 | { | ||
644 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
645 | |||
646 | return *(volatile unsigned int __force *)addr; | ||
647 | } | ||
648 | EXPORT_SYMBOL(__raw_readl); | ||
649 | |||
650 | extern unsigned long __raw_readq(const volatile void __iomem *addr) | ||
651 | { | ||
652 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
653 | |||
654 | return *(volatile unsigned long __force *)addr; | ||
655 | } | ||
656 | EXPORT_SYMBOL(__raw_readq); | ||
657 | |||
658 | extern void __raw_writeb(unsigned char v, volatile void __iomem *addr) | ||
659 | { | ||
660 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
661 | |||
662 | *(volatile unsigned char __force *)addr = v; | ||
663 | } | ||
664 | EXPORT_SYMBOL(__raw_writeb); | ||
665 | |||
666 | extern void __raw_writew(unsigned short v, volatile void __iomem *addr) | ||
667 | { | ||
668 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
669 | |||
670 | *(volatile unsigned short __force *)addr = v; | ||
671 | } | ||
672 | EXPORT_SYMBOL(__raw_writew); | ||
673 | |||
674 | extern void __raw_writel(unsigned int v, volatile void __iomem *addr) | ||
675 | { | ||
676 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
677 | |||
678 | *(volatile unsigned int __force *)addr = v; | ||
679 | } | ||
680 | EXPORT_SYMBOL(__raw_writel); | ||
681 | |||
682 | extern void __raw_writeq(unsigned long v, volatile void __iomem *addr) | ||
683 | { | ||
684 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
685 | |||
686 | *(volatile unsigned long __force *)addr = v; | ||
687 | } | ||
688 | EXPORT_SYMBOL(__raw_writeq); | ||
689 | |||
690 | int in_8(const volatile unsigned char __iomem *addr) | ||
691 | { | ||
692 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
693 | return iSeries_Read_Byte(addr); | ||
694 | return __in_8(addr); | ||
695 | } | ||
696 | EXPORT_SYMBOL(in_8); | ||
697 | |||
698 | void out_8(volatile unsigned char __iomem *addr, int val) | ||
699 | { | ||
700 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
701 | iSeries_Write_Byte(val, addr); | ||
702 | else | ||
703 | __out_8(addr, val); | ||
704 | } | ||
705 | EXPORT_SYMBOL(out_8); | ||
706 | |||
707 | int in_le16(const volatile unsigned short __iomem *addr) | ||
708 | { | ||
709 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
710 | return iSeries_Read_Word(addr); | ||
711 | return __in_le16(addr); | ||
712 | } | ||
713 | EXPORT_SYMBOL(in_le16); | ||
714 | |||
715 | int in_be16(const volatile unsigned short __iomem *addr) | ||
716 | { | ||
717 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
718 | |||
719 | return __in_be16(addr); | ||
720 | } | ||
721 | EXPORT_SYMBOL(in_be16); | ||
722 | |||
723 | void out_le16(volatile unsigned short __iomem *addr, int val) | ||
724 | { | ||
725 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
726 | iSeries_Write_Word(val, addr); | ||
727 | else | ||
728 | __out_le16(addr, val); | ||
729 | } | ||
730 | EXPORT_SYMBOL(out_le16); | ||
731 | |||
732 | void out_be16(volatile unsigned short __iomem *addr, int val) | ||
733 | { | ||
734 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
735 | |||
736 | __out_be16(addr, val); | ||
737 | } | ||
738 | EXPORT_SYMBOL(out_be16); | ||
739 | |||
740 | unsigned in_le32(const volatile unsigned __iomem *addr) | ||
741 | { | ||
742 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
743 | return iSeries_Read_Long(addr); | ||
744 | return __in_le32(addr); | ||
745 | } | ||
746 | EXPORT_SYMBOL(in_le32); | ||
747 | |||
748 | unsigned in_be32(const volatile unsigned __iomem *addr) | ||
749 | { | ||
750 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
751 | |||
752 | return __in_be32(addr); | ||
753 | } | ||
754 | EXPORT_SYMBOL(in_be32); | ||
755 | |||
756 | void out_le32(volatile unsigned __iomem *addr, int val) | ||
757 | { | ||
758 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
759 | iSeries_Write_Long(val, addr); | ||
760 | else | ||
761 | __out_le32(addr, val); | ||
762 | } | ||
763 | EXPORT_SYMBOL(out_le32); | ||
764 | |||
765 | void out_be32(volatile unsigned __iomem *addr, int val) | ||
766 | { | ||
767 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
768 | |||
769 | __out_be32(addr, val); | ||
770 | } | ||
771 | EXPORT_SYMBOL(out_be32); | ||
772 | |||
773 | unsigned long in_le64(const volatile unsigned long __iomem *addr) | ||
774 | { | ||
775 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
776 | |||
777 | return __in_le64(addr); | ||
778 | } | ||
779 | EXPORT_SYMBOL(in_le64); | ||
780 | |||
781 | unsigned long in_be64(const volatile unsigned long __iomem *addr) | ||
782 | { | ||
783 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
784 | |||
785 | return __in_be64(addr); | ||
786 | } | ||
787 | EXPORT_SYMBOL(in_be64); | ||
788 | |||
789 | void out_le64(volatile unsigned long __iomem *addr, unsigned long val) | ||
790 | { | ||
791 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
792 | |||
793 | __out_le64(addr, val); | ||
794 | } | ||
795 | EXPORT_SYMBOL(out_le64); | ||
796 | |||
797 | void out_be64(volatile unsigned long __iomem *addr, unsigned long val) | ||
798 | { | ||
799 | BUG_ON(firmware_has_feature(FW_FEATURE_ISERIES)); | ||
800 | |||
801 | __out_be64(addr, val); | ||
802 | } | ||
803 | EXPORT_SYMBOL(out_be64); | ||
804 | |||
805 | void memset_io(volatile void __iomem *addr, int c, unsigned long n) | ||
806 | { | ||
807 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
808 | volatile char __iomem *d = addr; | ||
809 | |||
810 | while (n-- > 0) { | ||
811 | iSeries_Write_Byte(c, d++); | ||
812 | } | ||
813 | } else | ||
814 | eeh_memset_io(addr, c, n); | ||
815 | } | ||
816 | EXPORT_SYMBOL(memset_io); | ||
817 | |||
818 | void memcpy_fromio(void *dest, const volatile void __iomem *src, | ||
819 | unsigned long n) | ||
820 | { | ||
821 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
822 | char *d = dest; | ||
823 | const volatile char __iomem *s = src; | ||
824 | |||
825 | while (n-- > 0) { | ||
826 | *d++ = iSeries_Read_Byte(s++); | ||
827 | } | ||
828 | } else | ||
829 | eeh_memcpy_fromio(dest, src, n); | ||
830 | } | ||
831 | EXPORT_SYMBOL(memcpy_fromio); | ||
832 | |||
833 | void memcpy_toio(volatile void __iomem *dest, const void *src, unsigned long n) | ||
834 | { | ||
835 | if (firmware_has_feature(FW_FEATURE_ISERIES)) { | ||
836 | const char *s = src; | ||
837 | volatile char __iomem *d = dest; | ||
838 | |||
839 | while (n-- > 0) { | ||
840 | iSeries_Write_Byte(*s++, d++); | ||
841 | } | ||
842 | } else | ||
843 | eeh_memcpy_toio(dest, src, n); | ||
844 | } | ||
845 | EXPORT_SYMBOL(memcpy_toio); | ||
diff --git a/arch/powerpc/platforms/maple/pci.c b/arch/powerpc/platforms/maple/pci.c index dc05af5156a9..1b827618e05f 100644 --- a/arch/powerpc/platforms/maple/pci.c +++ b/arch/powerpc/platforms/maple/pci.c | |||
@@ -81,28 +81,32 @@ static void __init fixup_bus_range(struct device_node *bridge) | |||
81 | } | 81 | } |
82 | 82 | ||
83 | 83 | ||
84 | #define U3_AGP_CFA0(devfn, off) \ | 84 | static unsigned long u3_agp_cfa0(u8 devfn, u8 off) |
85 | ((1 << (unsigned long)PCI_SLOT(dev_fn)) \ | 85 | { |
86 | | (((unsigned long)PCI_FUNC(dev_fn)) << 8) \ | 86 | return (1 << (unsigned long)PCI_SLOT(devfn)) | |
87 | | (((unsigned long)(off)) & 0xFCUL)) | 87 | ((unsigned long)PCI_FUNC(devfn) << 8) | |
88 | 88 | ((unsigned long)off & 0xFCUL); | |
89 | #define U3_AGP_CFA1(bus, devfn, off) \ | 89 | } |
90 | ((((unsigned long)(bus)) << 16) \ | 90 | |
91 | |(((unsigned long)(devfn)) << 8) \ | 91 | static unsigned long u3_agp_cfa1(u8 bus, u8 devfn, u8 off) |
92 | |(((unsigned long)(off)) & 0xFCUL) \ | 92 | { |
93 | |1UL) | 93 | return ((unsigned long)bus << 16) | |
94 | 94 | ((unsigned long)devfn << 8) | | |
95 | static unsigned long u3_agp_cfg_access(struct pci_controller* hose, | 95 | ((unsigned long)off & 0xFCUL) | |
96 | 1UL; | ||
97 | } | ||
98 | |||
99 | static volatile void __iomem *u3_agp_cfg_access(struct pci_controller* hose, | ||
96 | u8 bus, u8 dev_fn, u8 offset) | 100 | u8 bus, u8 dev_fn, u8 offset) |
97 | { | 101 | { |
98 | unsigned int caddr; | 102 | unsigned int caddr; |
99 | 103 | ||
100 | if (bus == hose->first_busno) { | 104 | if (bus == hose->first_busno) { |
101 | if (dev_fn < (11 << 3)) | 105 | if (dev_fn < (11 << 3)) |
102 | return 0; | 106 | return NULL; |
103 | caddr = U3_AGP_CFA0(dev_fn, offset); | 107 | caddr = u3_agp_cfa0(dev_fn, offset); |
104 | } else | 108 | } else |
105 | caddr = U3_AGP_CFA1(bus, dev_fn, offset); | 109 | caddr = u3_agp_cfa1(bus, dev_fn, offset); |
106 | 110 | ||
107 | /* Uninorth will return garbage if we don't read back the value ! */ | 111 | /* Uninorth will return garbage if we don't read back the value ! */ |
108 | do { | 112 | do { |
@@ -110,14 +114,14 @@ static unsigned long u3_agp_cfg_access(struct pci_controller* hose, | |||
110 | } while (in_le32(hose->cfg_addr) != caddr); | 114 | } while (in_le32(hose->cfg_addr) != caddr); |
111 | 115 | ||
112 | offset &= 0x07; | 116 | offset &= 0x07; |
113 | return ((unsigned long)hose->cfg_data) + offset; | 117 | return hose->cfg_data + offset; |
114 | } | 118 | } |
115 | 119 | ||
116 | static int u3_agp_read_config(struct pci_bus *bus, unsigned int devfn, | 120 | static int u3_agp_read_config(struct pci_bus *bus, unsigned int devfn, |
117 | int offset, int len, u32 *val) | 121 | int offset, int len, u32 *val) |
118 | { | 122 | { |
119 | struct pci_controller *hose; | 123 | struct pci_controller *hose; |
120 | unsigned long addr; | 124 | volatile void __iomem *addr; |
121 | 125 | ||
122 | hose = pci_bus_to_host(bus); | 126 | hose = pci_bus_to_host(bus); |
123 | if (hose == NULL) | 127 | if (hose == NULL) |
@@ -132,13 +136,13 @@ static int u3_agp_read_config(struct pci_bus *bus, unsigned int devfn, | |||
132 | */ | 136 | */ |
133 | switch (len) { | 137 | switch (len) { |
134 | case 1: | 138 | case 1: |
135 | *val = in_8((u8 *)addr); | 139 | *val = in_8(addr); |
136 | break; | 140 | break; |
137 | case 2: | 141 | case 2: |
138 | *val = in_le16((u16 *)addr); | 142 | *val = in_le16(addr); |
139 | break; | 143 | break; |
140 | default: | 144 | default: |
141 | *val = in_le32((u32 *)addr); | 145 | *val = in_le32(addr); |
142 | break; | 146 | break; |
143 | } | 147 | } |
144 | return PCIBIOS_SUCCESSFUL; | 148 | return PCIBIOS_SUCCESSFUL; |
@@ -148,7 +152,7 @@ static int u3_agp_write_config(struct pci_bus *bus, unsigned int devfn, | |||
148 | int offset, int len, u32 val) | 152 | int offset, int len, u32 val) |
149 | { | 153 | { |
150 | struct pci_controller *hose; | 154 | struct pci_controller *hose; |
151 | unsigned long addr; | 155 | volatile void __iomem *addr; |
152 | 156 | ||
153 | hose = pci_bus_to_host(bus); | 157 | hose = pci_bus_to_host(bus); |
154 | if (hose == NULL) | 158 | if (hose == NULL) |
@@ -163,16 +167,16 @@ static int u3_agp_write_config(struct pci_bus *bus, unsigned int devfn, | |||
163 | */ | 167 | */ |
164 | switch (len) { | 168 | switch (len) { |
165 | case 1: | 169 | case 1: |
166 | out_8((u8 *)addr, val); | 170 | out_8(addr, val); |
167 | (void) in_8((u8 *)addr); | 171 | (void) in_8(addr); |
168 | break; | 172 | break; |
169 | case 2: | 173 | case 2: |
170 | out_le16((u16 *)addr, val); | 174 | out_le16(addr, val); |
171 | (void) in_le16((u16 *)addr); | 175 | (void) in_le16(addr); |
172 | break; | 176 | break; |
173 | default: | 177 | default: |
174 | out_le32((u32 *)addr, val); | 178 | out_le32(addr, val); |
175 | (void) in_le32((u32 *)addr); | 179 | (void) in_le32(addr); |
176 | break; | 180 | break; |
177 | } | 181 | } |
178 | return PCIBIOS_SUCCESSFUL; | 182 | return PCIBIOS_SUCCESSFUL; |
@@ -184,35 +188,40 @@ static struct pci_ops u3_agp_pci_ops = | |||
184 | u3_agp_write_config | 188 | u3_agp_write_config |
185 | }; | 189 | }; |
186 | 190 | ||
191 | static unsigned long u3_ht_cfa0(u8 devfn, u8 off) | ||
192 | { | ||
193 | return (devfn << 8) | off; | ||
194 | } | ||
187 | 195 | ||
188 | #define U3_HT_CFA0(devfn, off) \ | 196 | static unsigned long u3_ht_cfa1(u8 bus, u8 devfn, u8 off) |
189 | ((((unsigned long)devfn) << 8) | offset) | 197 | { |
190 | #define U3_HT_CFA1(bus, devfn, off) \ | 198 | return u3_ht_cfa0(devfn, off) + (bus << 16) + 0x01000000UL; |
191 | (U3_HT_CFA0(devfn, off) \ | 199 | } |
192 | + (((unsigned long)bus) << 16) \ | ||
193 | + 0x01000000UL) | ||
194 | 200 | ||
195 | static unsigned long u3_ht_cfg_access(struct pci_controller* hose, | 201 | static volatile void __iomem *u3_ht_cfg_access(struct pci_controller* hose, |
196 | u8 bus, u8 devfn, u8 offset) | 202 | u8 bus, u8 devfn, u8 offset) |
197 | { | 203 | { |
198 | if (bus == hose->first_busno) { | 204 | if (bus == hose->first_busno) { |
199 | if (PCI_SLOT(devfn) == 0) | 205 | if (PCI_SLOT(devfn) == 0) |
200 | return 0; | 206 | return NULL; |
201 | return ((unsigned long)hose->cfg_data) + U3_HT_CFA0(devfn, offset); | 207 | return hose->cfg_data + u3_ht_cfa0(devfn, offset); |
202 | } else | 208 | } else |
203 | return ((unsigned long)hose->cfg_data) + U3_HT_CFA1(bus, devfn, offset); | 209 | return hose->cfg_data + u3_ht_cfa1(bus, devfn, offset); |
204 | } | 210 | } |
205 | 211 | ||
206 | static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, | 212 | static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, |
207 | int offset, int len, u32 *val) | 213 | int offset, int len, u32 *val) |
208 | { | 214 | { |
209 | struct pci_controller *hose; | 215 | struct pci_controller *hose; |
210 | unsigned long addr; | 216 | volatile void __iomem *addr; |
211 | 217 | ||
212 | hose = pci_bus_to_host(bus); | 218 | hose = pci_bus_to_host(bus); |
213 | if (hose == NULL) | 219 | if (hose == NULL) |
214 | return PCIBIOS_DEVICE_NOT_FOUND; | 220 | return PCIBIOS_DEVICE_NOT_FOUND; |
215 | 221 | ||
222 | if (offset > 0xff) | ||
223 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
224 | |||
216 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); | 225 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); |
217 | if (!addr) | 226 | if (!addr) |
218 | return PCIBIOS_DEVICE_NOT_FOUND; | 227 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -223,13 +232,13 @@ static int u3_ht_read_config(struct pci_bus *bus, unsigned int devfn, | |||
223 | */ | 232 | */ |
224 | switch (len) { | 233 | switch (len) { |
225 | case 1: | 234 | case 1: |
226 | *val = in_8((u8 *)addr); | 235 | *val = in_8(addr); |
227 | break; | 236 | break; |
228 | case 2: | 237 | case 2: |
229 | *val = in_le16((u16 *)addr); | 238 | *val = in_le16(addr); |
230 | break; | 239 | break; |
231 | default: | 240 | default: |
232 | *val = in_le32((u32 *)addr); | 241 | *val = in_le32(addr); |
233 | break; | 242 | break; |
234 | } | 243 | } |
235 | return PCIBIOS_SUCCESSFUL; | 244 | return PCIBIOS_SUCCESSFUL; |
@@ -239,12 +248,15 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, | |||
239 | int offset, int len, u32 val) | 248 | int offset, int len, u32 val) |
240 | { | 249 | { |
241 | struct pci_controller *hose; | 250 | struct pci_controller *hose; |
242 | unsigned long addr; | 251 | volatile void __iomem *addr; |
243 | 252 | ||
244 | hose = pci_bus_to_host(bus); | 253 | hose = pci_bus_to_host(bus); |
245 | if (hose == NULL) | 254 | if (hose == NULL) |
246 | return PCIBIOS_DEVICE_NOT_FOUND; | 255 | return PCIBIOS_DEVICE_NOT_FOUND; |
247 | 256 | ||
257 | if (offset > 0xff) | ||
258 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
259 | |||
248 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); | 260 | addr = u3_ht_cfg_access(hose, bus->number, devfn, offset); |
249 | if (!addr) | 261 | if (!addr) |
250 | return PCIBIOS_DEVICE_NOT_FOUND; | 262 | return PCIBIOS_DEVICE_NOT_FOUND; |
@@ -254,16 +266,16 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn, | |||
254 | */ | 266 | */ |
255 | switch (len) { | 267 | switch (len) { |
256 | case 1: | 268 | case 1: |
257 | out_8((u8 *)addr, val); | 269 | out_8(addr, val); |
258 | (void) in_8((u8 *)addr); | 270 | (void) in_8(addr); |
259 | break; | 271 | break; |
260 | case 2: | 272 | case 2: |
261 | out_le16((u16 *)addr, val); | 273 | out_le16(addr, val); |
262 | (void) in_le16((u16 *)addr); | 274 | (void) in_le16(addr); |
263 | break; | 275 | break; |
264 | default: | 276 | default: |
265 | out_le32((u32 *)addr, val); | 277 | out_le32(addr, val); |
266 | (void) in_le32((u32 *)addr); | 278 | (void) in_le32(addr); |
267 | break; | 279 | break; |
268 | } | 280 | } |
269 | return PCIBIOS_SUCCESSFUL; | 281 | return PCIBIOS_SUCCESSFUL; |
@@ -303,7 +315,7 @@ static void __init setup_u3_ht(struct pci_controller* hose) | |||
303 | * the reg address cell, we shall fix that by killing struct | 315 | * the reg address cell, we shall fix that by killing struct |
304 | * reg_property and using some accessor functions instead | 316 | * reg_property and using some accessor functions instead |
305 | */ | 317 | */ |
306 | hose->cfg_data = (volatile unsigned char *)ioremap(0xf2000000, 0x02000000); | 318 | hose->cfg_data = ioremap(0xf2000000, 0x02000000); |
307 | 319 | ||
308 | hose->first_busno = 0; | 320 | hose->first_busno = 0; |
309 | hose->last_busno = 0xef; | 321 | hose->last_busno = 0xef; |
diff --git a/arch/powerpc/platforms/powermac/cpufreq_64.c b/arch/powerpc/platforms/powermac/cpufreq_64.c index 167cd3ce8a13..d30466d74194 100644 --- a/arch/powerpc/platforms/powermac/cpufreq_64.c +++ b/arch/powerpc/platforms/powermac/cpufreq_64.c | |||
@@ -89,7 +89,7 @@ static DEFINE_MUTEX(g5_switch_mutex); | |||
89 | 89 | ||
90 | #ifdef CONFIG_PMAC_SMU | 90 | #ifdef CONFIG_PMAC_SMU |
91 | 91 | ||
92 | static u32 *g5_pmode_data; | 92 | static const u32 *g5_pmode_data; |
93 | static int g5_pmode_max; | 93 | static int g5_pmode_max; |
94 | 94 | ||
95 | static struct smu_sdbp_fvt *g5_fvt_table; /* table of op. points */ | 95 | static struct smu_sdbp_fvt *g5_fvt_table; /* table of op. points */ |
diff --git a/arch/powerpc/platforms/powermac/feature.c b/arch/powerpc/platforms/powermac/feature.c index 13fcaf5b1796..e49621be6640 100644 --- a/arch/powerpc/platforms/powermac/feature.c +++ b/arch/powerpc/platforms/powermac/feature.c | |||
@@ -1058,8 +1058,8 @@ core99_reset_cpu(struct device_node *node, long param, long value) | |||
1058 | if (np == NULL) | 1058 | if (np == NULL) |
1059 | return -ENODEV; | 1059 | return -ENODEV; |
1060 | for (np = np->child; np != NULL; np = np->sibling) { | 1060 | for (np = np->child; np != NULL; np = np->sibling) { |
1061 | u32 *num = get_property(np, "reg", NULL); | 1061 | const u32 *num = get_property(np, "reg", NULL); |
1062 | u32 *rst = get_property(np, "soft-reset", NULL); | 1062 | const u32 *rst = get_property(np, "soft-reset", NULL); |
1063 | if (num == NULL || rst == NULL) | 1063 | if (num == NULL || rst == NULL) |
1064 | continue; | 1064 | continue; |
1065 | if (param == *num) { | 1065 | if (param == *num) { |
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index 653eeb64d1e2..1949b657b092 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
@@ -702,7 +702,7 @@ static void __init smp_core99_setup(int ncpus) | |||
702 | /* GPIO based HW sync on ppc32 Core99 */ | 702 | /* GPIO based HW sync on ppc32 Core99 */ |
703 | if (pmac_tb_freeze == NULL && !machine_is_compatible("MacRISC4")) { | 703 | if (pmac_tb_freeze == NULL && !machine_is_compatible("MacRISC4")) { |
704 | struct device_node *cpu; | 704 | struct device_node *cpu; |
705 | u32 *tbprop = NULL; | 705 | const u32 *tbprop = NULL; |
706 | 706 | ||
707 | core99_tb_gpio = KL_GPIO_TB_ENABLE; /* default value */ | 707 | core99_tb_gpio = KL_GPIO_TB_ENABLE; /* default value */ |
708 | cpu = of_find_node_by_type(NULL, "cpu"); | 708 | cpu = of_find_node_by_type(NULL, "cpu"); |
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 5a23ce5e16ff..3c2d63ebf787 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
@@ -225,6 +225,7 @@ static void __eeh_mark_slot (struct device_node *dn, int mode_flag) | |||
225 | 225 | ||
226 | void eeh_mark_slot (struct device_node *dn, int mode_flag) | 226 | void eeh_mark_slot (struct device_node *dn, int mode_flag) |
227 | { | 227 | { |
228 | struct pci_dev *dev; | ||
228 | dn = find_device_pe (dn); | 229 | dn = find_device_pe (dn); |
229 | 230 | ||
230 | /* Back up one, since config addrs might be shared */ | 231 | /* Back up one, since config addrs might be shared */ |
@@ -232,6 +233,12 @@ void eeh_mark_slot (struct device_node *dn, int mode_flag) | |||
232 | dn = dn->parent; | 233 | dn = dn->parent; |
233 | 234 | ||
234 | PCI_DN(dn)->eeh_mode |= mode_flag; | 235 | PCI_DN(dn)->eeh_mode |= mode_flag; |
236 | |||
237 | /* Mark the pci device too */ | ||
238 | dev = PCI_DN(dn)->pcidev; | ||
239 | if (dev) | ||
240 | dev->error_state = pci_channel_io_frozen; | ||
241 | |||
235 | __eeh_mark_slot (dn->child, mode_flag); | 242 | __eeh_mark_slot (dn->child, mode_flag); |
236 | } | 243 | } |
237 | 244 | ||
@@ -449,7 +456,11 @@ EXPORT_SYMBOL(eeh_check_failure); | |||
449 | /* ------------------------------------------------------------- */ | 456 | /* ------------------------------------------------------------- */ |
450 | /* The code below deals with error recovery */ | 457 | /* The code below deals with error recovery */ |
451 | 458 | ||
452 | /** Return negative value if a permanent error, else return | 459 | /** |
460 | * eeh_slot_availability - returns error status of slot | ||
461 | * @pdn pci device node | ||
462 | * | ||
463 | * Return negative value if a permanent error, else return | ||
453 | * a number of milliseconds to wait until the PCI slot is | 464 | * a number of milliseconds to wait until the PCI slot is |
454 | * ready to be used. | 465 | * ready to be used. |
455 | */ | 466 | */ |
@@ -474,11 +485,42 @@ eeh_slot_availability(struct pci_dn *pdn) | |||
474 | 485 | ||
475 | printk (KERN_ERR "EEH: Slot unavailable: rc=%d, rets=%d %d %d\n", | 486 | printk (KERN_ERR "EEH: Slot unavailable: rc=%d, rets=%d %d %d\n", |
476 | rc, rets[0], rets[1], rets[2]); | 487 | rc, rets[0], rets[1], rets[2]); |
477 | return -1; | 488 | return -2; |
478 | } | 489 | } |
479 | 490 | ||
480 | /** rtas_pci_slot_reset raises/lowers the pci #RST line | 491 | /** |
481 | * state: 1/0 to raise/lower the #RST | 492 | * rtas_pci_enable - enable MMIO or DMA transfers for this slot |
493 | * @pdn pci device node | ||
494 | */ | ||
495 | |||
496 | int | ||
497 | rtas_pci_enable(struct pci_dn *pdn, int function) | ||
498 | { | ||
499 | int config_addr; | ||
500 | int rc; | ||
501 | |||
502 | /* Use PE configuration address, if present */ | ||
503 | config_addr = pdn->eeh_config_addr; | ||
504 | if (pdn->eeh_pe_config_addr) | ||
505 | config_addr = pdn->eeh_pe_config_addr; | ||
506 | |||
507 | rc = rtas_call(ibm_set_eeh_option, 4, 1, NULL, | ||
508 | config_addr, | ||
509 | BUID_HI(pdn->phb->buid), | ||
510 | BUID_LO(pdn->phb->buid), | ||
511 | function); | ||
512 | |||
513 | if (rc) | ||
514 | printk(KERN_WARNING "EEH: Cannot enable function %d, err=%d dn=%s\n", | ||
515 | function, rc, pdn->node->full_name); | ||
516 | |||
517 | return rc; | ||
518 | } | ||
519 | |||
520 | /** | ||
521 | * rtas_pci_slot_reset - raises/lowers the pci #RST line | ||
522 | * @pdn pci device node | ||
523 | * @state: 1/0 to raise/lower the #RST | ||
482 | * | 524 | * |
483 | * Clear the EEH-frozen condition on a slot. This routine | 525 | * Clear the EEH-frozen condition on a slot. This routine |
484 | * asserts the PCI #RST line if the 'state' argument is '1', | 526 | * asserts the PCI #RST line if the 'state' argument is '1', |
@@ -511,24 +553,21 @@ rtas_pci_slot_reset(struct pci_dn *pdn, int state) | |||
511 | BUID_HI(pdn->phb->buid), | 553 | BUID_HI(pdn->phb->buid), |
512 | BUID_LO(pdn->phb->buid), | 554 | BUID_LO(pdn->phb->buid), |
513 | state); | 555 | state); |
514 | if (rc) { | 556 | if (rc) |
515 | printk (KERN_WARNING "EEH: Unable to reset the failed slot, (%d) #RST=%d dn=%s\n", | 557 | printk (KERN_WARNING "EEH: Unable to reset the failed slot," |
558 | " (%d) #RST=%d dn=%s\n", | ||
516 | rc, state, pdn->node->full_name); | 559 | rc, state, pdn->node->full_name); |
517 | return; | ||
518 | } | ||
519 | } | 560 | } |
520 | 561 | ||
521 | /** rtas_set_slot_reset -- assert the pci #RST line for 1/4 second | 562 | /** |
522 | * dn -- device node to be reset. | 563 | * rtas_set_slot_reset -- assert the pci #RST line for 1/4 second |
564 | * @pdn: pci device node to be reset. | ||
523 | * | 565 | * |
524 | * Return 0 if success, else a non-zero value. | 566 | * Return 0 if success, else a non-zero value. |
525 | */ | 567 | */ |
526 | 568 | ||
527 | int | 569 | static void __rtas_set_slot_reset(struct pci_dn *pdn) |
528 | rtas_set_slot_reset(struct pci_dn *pdn) | ||
529 | { | 570 | { |
530 | int i, rc; | ||
531 | |||
532 | rtas_pci_slot_reset (pdn, 1); | 571 | rtas_pci_slot_reset (pdn, 1); |
533 | 572 | ||
534 | /* The PCI bus requires that the reset be held high for at least | 573 | /* The PCI bus requires that the reset be held high for at least |
@@ -549,17 +588,33 @@ rtas_set_slot_reset(struct pci_dn *pdn) | |||
549 | * up traffic. */ | 588 | * up traffic. */ |
550 | #define PCI_BUS_SETTLE_TIME_MSEC 1800 | 589 | #define PCI_BUS_SETTLE_TIME_MSEC 1800 |
551 | msleep (PCI_BUS_SETTLE_TIME_MSEC); | 590 | msleep (PCI_BUS_SETTLE_TIME_MSEC); |
591 | } | ||
592 | |||
593 | int rtas_set_slot_reset(struct pci_dn *pdn) | ||
594 | { | ||
595 | int i, rc; | ||
596 | |||
597 | __rtas_set_slot_reset(pdn); | ||
552 | 598 | ||
553 | /* Now double check with the firmware to make sure the device is | 599 | /* Now double check with the firmware to make sure the device is |
554 | * ready to be used; if not, wait for recovery. */ | 600 | * ready to be used; if not, wait for recovery. */ |
555 | for (i=0; i<10; i++) { | 601 | for (i=0; i<10; i++) { |
556 | rc = eeh_slot_availability (pdn); | 602 | rc = eeh_slot_availability (pdn); |
557 | if (rc < 0) | ||
558 | printk (KERN_ERR "EEH: failed (%d) to reset slot %s\n", rc, pdn->node->full_name); | ||
559 | if (rc == 0) | 603 | if (rc == 0) |
560 | return 0; | 604 | return 0; |
561 | if (rc < 0) | 605 | |
606 | if (rc == -2) { | ||
607 | printk (KERN_ERR "EEH: failed (%d) to reset slot %s\n", | ||
608 | i, pdn->node->full_name); | ||
609 | __rtas_set_slot_reset(pdn); | ||
610 | continue; | ||
611 | } | ||
612 | |||
613 | if (rc < 0) { | ||
614 | printk (KERN_ERR "EEH: unrecoverable slot failure %s\n", | ||
615 | pdn->node->full_name); | ||
562 | return -1; | 616 | return -1; |
617 | } | ||
563 | 618 | ||
564 | msleep (rc+100); | 619 | msleep (rc+100); |
565 | } | 620 | } |
@@ -582,6 +637,8 @@ rtas_set_slot_reset(struct pci_dn *pdn) | |||
582 | 637 | ||
583 | /** | 638 | /** |
584 | * __restore_bars - Restore the Base Address Registers | 639 | * __restore_bars - Restore the Base Address Registers |
640 | * @pdn: pci device node | ||
641 | * | ||
585 | * Loads the PCI configuration space base address registers, | 642 | * Loads the PCI configuration space base address registers, |
586 | * the expansion ROM base address, the latency timer, and etc. | 643 | * the expansion ROM base address, the latency timer, and etc. |
587 | * from the saved values in the device node. | 644 | * from the saved values in the device node. |
diff --git a/arch/powerpc/platforms/pseries/eeh_cache.c b/arch/powerpc/platforms/pseries/eeh_cache.c index c37a8497c60f..b6b462d3c604 100644 --- a/arch/powerpc/platforms/pseries/eeh_cache.c +++ b/arch/powerpc/platforms/pseries/eeh_cache.c | |||
@@ -157,6 +157,7 @@ pci_addr_cache_insert(struct pci_dev *dev, unsigned long alo, | |||
157 | if (!piar) | 157 | if (!piar) |
158 | return NULL; | 158 | return NULL; |
159 | 159 | ||
160 | pci_dev_get(dev); | ||
160 | piar->addr_lo = alo; | 161 | piar->addr_lo = alo; |
161 | piar->addr_hi = ahi; | 162 | piar->addr_hi = ahi; |
162 | piar->pcidev = dev; | 163 | piar->pcidev = dev; |
@@ -178,7 +179,6 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev) | |||
178 | struct device_node *dn; | 179 | struct device_node *dn; |
179 | struct pci_dn *pdn; | 180 | struct pci_dn *pdn; |
180 | int i; | 181 | int i; |
181 | int inserted = 0; | ||
182 | 182 | ||
183 | dn = pci_device_to_OF_node(dev); | 183 | dn = pci_device_to_OF_node(dev); |
184 | if (!dn) { | 184 | if (!dn) { |
@@ -197,9 +197,6 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev) | |||
197 | return; | 197 | return; |
198 | } | 198 | } |
199 | 199 | ||
200 | /* The cache holds a reference to the device... */ | ||
201 | pci_dev_get(dev); | ||
202 | |||
203 | /* Walk resources on this device, poke them into the tree */ | 200 | /* Walk resources on this device, poke them into the tree */ |
204 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | 201 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
205 | unsigned long start = pci_resource_start(dev,i); | 202 | unsigned long start = pci_resource_start(dev,i); |
@@ -212,12 +209,7 @@ static void __pci_addr_cache_insert_device(struct pci_dev *dev) | |||
212 | if (start == 0 || ~start == 0 || end == 0 || ~end == 0) | 209 | if (start == 0 || ~start == 0 || end == 0 || ~end == 0) |
213 | continue; | 210 | continue; |
214 | pci_addr_cache_insert(dev, start, end, flags); | 211 | pci_addr_cache_insert(dev, start, end, flags); |
215 | inserted = 1; | ||
216 | } | 212 | } |
217 | |||
218 | /* If there was nothing to add, the cache has no reference... */ | ||
219 | if (!inserted) | ||
220 | pci_dev_put(dev); | ||
221 | } | 213 | } |
222 | 214 | ||
223 | /** | 215 | /** |
@@ -240,7 +232,6 @@ void pci_addr_cache_insert_device(struct pci_dev *dev) | |||
240 | static inline void __pci_addr_cache_remove_device(struct pci_dev *dev) | 232 | static inline void __pci_addr_cache_remove_device(struct pci_dev *dev) |
241 | { | 233 | { |
242 | struct rb_node *n; | 234 | struct rb_node *n; |
243 | int removed = 0; | ||
244 | 235 | ||
245 | restart: | 236 | restart: |
246 | n = rb_first(&pci_io_addr_cache_root.rb_root); | 237 | n = rb_first(&pci_io_addr_cache_root.rb_root); |
@@ -250,16 +241,12 @@ restart: | |||
250 | 241 | ||
251 | if (piar->pcidev == dev) { | 242 | if (piar->pcidev == dev) { |
252 | rb_erase(n, &pci_io_addr_cache_root.rb_root); | 243 | rb_erase(n, &pci_io_addr_cache_root.rb_root); |
253 | removed = 1; | 244 | pci_dev_put(piar->pcidev); |
254 | kfree(piar); | 245 | kfree(piar); |
255 | goto restart; | 246 | goto restart; |
256 | } | 247 | } |
257 | n = rb_next(n); | 248 | n = rb_next(n); |
258 | } | 249 | } |
259 | |||
260 | /* The cache no longer holds its reference to this device... */ | ||
261 | if (removed) | ||
262 | pci_dev_put(dev); | ||
263 | } | 250 | } |
264 | 251 | ||
265 | /** | 252 | /** |
diff --git a/arch/powerpc/platforms/pseries/eeh_driver.c b/arch/powerpc/platforms/pseries/eeh_driver.c index 3269d2cd428b..c2bc9904f1cb 100644 --- a/arch/powerpc/platforms/pseries/eeh_driver.c +++ b/arch/powerpc/platforms/pseries/eeh_driver.c | |||
@@ -77,8 +77,12 @@ static int irq_in_use(unsigned int irq) | |||
77 | } | 77 | } |
78 | 78 | ||
79 | /* ------------------------------------------------------- */ | 79 | /* ------------------------------------------------------- */ |
80 | /** eeh_report_error - report an EEH error to each device, | 80 | /** |
81 | * collect up and merge the device responses. | 81 | * eeh_report_error - report pci error to each device driver |
82 | * | ||
83 | * Report an EEH error to each device driver, collect up and | ||
84 | * merge the device driver responses. Cumulative response | ||
85 | * passed back in "userdata". | ||
82 | */ | 86 | */ |
83 | 87 | ||
84 | static void eeh_report_error(struct pci_dev *dev, void *userdata) | 88 | static void eeh_report_error(struct pci_dev *dev, void *userdata) |
@@ -96,24 +100,49 @@ static void eeh_report_error(struct pci_dev *dev, void *userdata) | |||
96 | PCI_DN(dn)->eeh_mode |= EEH_MODE_IRQ_DISABLED; | 100 | PCI_DN(dn)->eeh_mode |= EEH_MODE_IRQ_DISABLED; |
97 | disable_irq_nosync(dev->irq); | 101 | disable_irq_nosync(dev->irq); |
98 | } | 102 | } |
99 | if (!driver->err_handler) | 103 | if (!driver->err_handler || |
100 | return; | 104 | !driver->err_handler->error_detected) |
101 | if (!driver->err_handler->error_detected) | ||
102 | return; | 105 | return; |
103 | 106 | ||
104 | rc = driver->err_handler->error_detected (dev, pci_channel_io_frozen); | 107 | rc = driver->err_handler->error_detected (dev, pci_channel_io_frozen); |
105 | if (*res == PCI_ERS_RESULT_NONE) *res = rc; | 108 | if (*res == PCI_ERS_RESULT_NONE) *res = rc; |
106 | if (*res == PCI_ERS_RESULT_NEED_RESET) return; | ||
107 | if (*res == PCI_ERS_RESULT_DISCONNECT && | 109 | if (*res == PCI_ERS_RESULT_DISCONNECT && |
108 | rc == PCI_ERS_RESULT_NEED_RESET) *res = rc; | 110 | rc == PCI_ERS_RESULT_NEED_RESET) *res = rc; |
109 | } | 111 | } |
110 | 112 | ||
111 | /** eeh_report_reset -- tell this device that the pci slot | 113 | /** |
112 | * has been reset. | 114 | * eeh_report_mmio_enabled - tell drivers that MMIO has been enabled |
115 | * | ||
116 | * Report an EEH error to each device driver, collect up and | ||
117 | * merge the device driver responses. Cumulative response | ||
118 | * passed back in "userdata". | ||
119 | */ | ||
120 | |||
121 | static void eeh_report_mmio_enabled(struct pci_dev *dev, void *userdata) | ||
122 | { | ||
123 | enum pci_ers_result rc, *res = userdata; | ||
124 | struct pci_driver *driver = dev->driver; | ||
125 | |||
126 | // dev->error_state = pci_channel_mmio_enabled; | ||
127 | |||
128 | if (!driver || | ||
129 | !driver->err_handler || | ||
130 | !driver->err_handler->mmio_enabled) | ||
131 | return; | ||
132 | |||
133 | rc = driver->err_handler->mmio_enabled (dev); | ||
134 | if (*res == PCI_ERS_RESULT_NONE) *res = rc; | ||
135 | if (*res == PCI_ERS_RESULT_DISCONNECT && | ||
136 | rc == PCI_ERS_RESULT_NEED_RESET) *res = rc; | ||
137 | } | ||
138 | |||
139 | /** | ||
140 | * eeh_report_reset - tell device that slot has been reset | ||
113 | */ | 141 | */ |
114 | 142 | ||
115 | static void eeh_report_reset(struct pci_dev *dev, void *userdata) | 143 | static void eeh_report_reset(struct pci_dev *dev, void *userdata) |
116 | { | 144 | { |
145 | enum pci_ers_result rc, *res = userdata; | ||
117 | struct pci_driver *driver = dev->driver; | 146 | struct pci_driver *driver = dev->driver; |
118 | struct device_node *dn = pci_device_to_OF_node(dev); | 147 | struct device_node *dn = pci_device_to_OF_node(dev); |
119 | 148 | ||
@@ -124,14 +153,20 @@ static void eeh_report_reset(struct pci_dev *dev, void *userdata) | |||
124 | PCI_DN(dn)->eeh_mode &= ~EEH_MODE_IRQ_DISABLED; | 153 | PCI_DN(dn)->eeh_mode &= ~EEH_MODE_IRQ_DISABLED; |
125 | enable_irq(dev->irq); | 154 | enable_irq(dev->irq); |
126 | } | 155 | } |
127 | if (!driver->err_handler) | 156 | if (!driver->err_handler || |
128 | return; | 157 | !driver->err_handler->slot_reset) |
129 | if (!driver->err_handler->slot_reset) | ||
130 | return; | 158 | return; |
131 | 159 | ||
132 | driver->err_handler->slot_reset(dev); | 160 | rc = driver->err_handler->slot_reset(dev); |
161 | if (*res == PCI_ERS_RESULT_NONE) *res = rc; | ||
162 | if (*res == PCI_ERS_RESULT_DISCONNECT && | ||
163 | rc == PCI_ERS_RESULT_NEED_RESET) *res = rc; | ||
133 | } | 164 | } |
134 | 165 | ||
166 | /** | ||
167 | * eeh_report_resume - tell device to resume normal operations | ||
168 | */ | ||
169 | |||
135 | static void eeh_report_resume(struct pci_dev *dev, void *userdata) | 170 | static void eeh_report_resume(struct pci_dev *dev, void *userdata) |
136 | { | 171 | { |
137 | struct pci_driver *driver = dev->driver; | 172 | struct pci_driver *driver = dev->driver; |
@@ -148,6 +183,13 @@ static void eeh_report_resume(struct pci_dev *dev, void *userdata) | |||
148 | driver->err_handler->resume(dev); | 183 | driver->err_handler->resume(dev); |
149 | } | 184 | } |
150 | 185 | ||
186 | /** | ||
187 | * eeh_report_failure - tell device driver that device is dead. | ||
188 | * | ||
189 | * This informs the device driver that the device is permanently | ||
190 | * dead, and that no further recovery attempts will be made on it. | ||
191 | */ | ||
192 | |||
151 | static void eeh_report_failure(struct pci_dev *dev, void *userdata) | 193 | static void eeh_report_failure(struct pci_dev *dev, void *userdata) |
152 | { | 194 | { |
153 | struct pci_driver *driver = dev->driver; | 195 | struct pci_driver *driver = dev->driver; |
@@ -190,11 +232,11 @@ static void eeh_report_failure(struct pci_dev *dev, void *userdata) | |||
190 | 232 | ||
191 | /** | 233 | /** |
192 | * eeh_reset_device() -- perform actual reset of a pci slot | 234 | * eeh_reset_device() -- perform actual reset of a pci slot |
193 | * Args: bus: pointer to the pci bus structure corresponding | 235 | * @bus: pointer to the pci bus structure corresponding |
194 | * to the isolated slot. A non-null value will | 236 | * to the isolated slot. A non-null value will |
195 | * cause all devices under the bus to be removed | 237 | * cause all devices under the bus to be removed |
196 | * and then re-added. | 238 | * and then re-added. |
197 | * pe_dn: pointer to a "Partionable Endpoint" device node. | 239 | * @pe_dn: pointer to a "Partionable Endpoint" device node. |
198 | * This is the top-level structure on which pci | 240 | * This is the top-level structure on which pci |
199 | * bus resets can be performed. | 241 | * bus resets can be performed. |
200 | */ | 242 | */ |
@@ -347,23 +389,43 @@ struct pci_dn * handle_eeh_events (struct eeh_event *event) | |||
347 | goto hard_fail; | 389 | goto hard_fail; |
348 | } | 390 | } |
349 | 391 | ||
350 | /* If any device called out for a reset, then reset the slot */ | 392 | /* If all devices reported they can proceed, then re-enable MMIO */ |
351 | if (result == PCI_ERS_RESULT_NEED_RESET) { | 393 | if (result == PCI_ERS_RESULT_CAN_RECOVER) { |
352 | rc = eeh_reset_device(frozen_pdn, NULL); | 394 | rc = rtas_pci_enable(frozen_pdn, EEH_THAW_MMIO); |
353 | if (rc) | 395 | |
354 | goto hard_fail; | 396 | if (rc) { |
355 | pci_walk_bus(frozen_bus, eeh_report_reset, NULL); | 397 | result = PCI_ERS_RESULT_NEED_RESET; |
398 | } else { | ||
399 | result = PCI_ERS_RESULT_NONE; | ||
400 | pci_walk_bus(frozen_bus, eeh_report_mmio_enabled, &result); | ||
401 | } | ||
356 | } | 402 | } |
357 | 403 | ||
358 | /* If all devices reported they can proceed, the re-enable PIO */ | 404 | /* If all devices reported they can proceed, then re-enable DMA */ |
359 | if (result == PCI_ERS_RESULT_CAN_RECOVER) { | 405 | if (result == PCI_ERS_RESULT_CAN_RECOVER) { |
360 | /* XXX Not supported; we brute-force reset the device */ | 406 | rc = rtas_pci_enable(frozen_pdn, EEH_THAW_DMA); |
407 | |||
408 | if (rc) | ||
409 | result = PCI_ERS_RESULT_NEED_RESET; | ||
410 | } | ||
411 | |||
412 | /* If any device has a hard failure, then shut off everything. */ | ||
413 | if (result == PCI_ERS_RESULT_DISCONNECT) | ||
414 | goto hard_fail; | ||
415 | |||
416 | /* If any device called out for a reset, then reset the slot */ | ||
417 | if (result == PCI_ERS_RESULT_NEED_RESET) { | ||
361 | rc = eeh_reset_device(frozen_pdn, NULL); | 418 | rc = eeh_reset_device(frozen_pdn, NULL); |
362 | if (rc) | 419 | if (rc) |
363 | goto hard_fail; | 420 | goto hard_fail; |
364 | pci_walk_bus(frozen_bus, eeh_report_reset, NULL); | 421 | result = PCI_ERS_RESULT_NONE; |
422 | pci_walk_bus(frozen_bus, eeh_report_reset, &result); | ||
365 | } | 423 | } |
366 | 424 | ||
425 | /* All devices should claim they have recovered by now. */ | ||
426 | if (result != PCI_ERS_RESULT_RECOVERED) | ||
427 | goto hard_fail; | ||
428 | |||
367 | /* Tell all device drivers that they can resume operations */ | 429 | /* Tell all device drivers that they can resume operations */ |
368 | pci_walk_bus(frozen_bus, eeh_report_resume, NULL); | 430 | pci_walk_bus(frozen_bus, eeh_report_resume, NULL); |
369 | 431 | ||
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index a6398fbe530d..2551da46b2a6 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -477,7 +477,6 @@ static void pseries_dedicated_idle_sleep(void) | |||
477 | { | 477 | { |
478 | unsigned int cpu = smp_processor_id(); | 478 | unsigned int cpu = smp_processor_id(); |
479 | unsigned long start_snooze; | 479 | unsigned long start_snooze; |
480 | unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay); | ||
481 | 480 | ||
482 | /* | 481 | /* |
483 | * Indicate to the HV that we are idle. Now would be | 482 | * Indicate to the HV that we are idle. Now would be |
@@ -490,9 +489,9 @@ static void pseries_dedicated_idle_sleep(void) | |||
490 | * has been checked recently. If we should poll for a little | 489 | * has been checked recently. If we should poll for a little |
491 | * while, do so. | 490 | * while, do so. |
492 | */ | 491 | */ |
493 | if (*smt_snooze_delay) { | 492 | if (__get_cpu_var(smt_snooze_delay)) { |
494 | start_snooze = get_tb() + | 493 | start_snooze = get_tb() + |
495 | *smt_snooze_delay * tb_ticks_per_usec; | 494 | __get_cpu_var(smt_snooze_delay) * tb_ticks_per_usec; |
496 | local_irq_enable(); | 495 | local_irq_enable(); |
497 | set_thread_flag(TIF_POLLING_NRFLAG); | 496 | set_thread_flag(TIF_POLLING_NRFLAG); |
498 | 497 | ||
@@ -512,24 +511,7 @@ static void pseries_dedicated_idle_sleep(void) | |||
512 | goto out; | 511 | goto out; |
513 | } | 512 | } |
514 | 513 | ||
515 | /* | 514 | cede_processor(); |
516 | * If not SMT, cede processor. If CPU is running SMT | ||
517 | * cede if the other thread is not idle, so that it can | ||
518 | * go single-threaded. If the other thread is idle, | ||
519 | * we ask the hypervisor if it has pending work it | ||
520 | * wants to do and cede if it does. Otherwise we keep | ||
521 | * polling in order to reduce interrupt latency. | ||
522 | * | ||
523 | * Doing the cede when the other thread is active will | ||
524 | * result in this thread going dormant, meaning the other | ||
525 | * thread gets to run in single-threaded (ST) mode, which | ||
526 | * is slightly faster than SMT mode with this thread at | ||
527 | * very low priority. The cede enables interrupts, which | ||
528 | * doesn't matter here. | ||
529 | */ | ||
530 | if (!cpu_has_feature(CPU_FTR_SMT) || !lppaca[cpu ^ 1].idle | ||
531 | || poll_pending() == H_PENDING) | ||
532 | cede_processor(); | ||
533 | 515 | ||
534 | out: | 516 | out: |
535 | HMT_medium(); | 517 | HMT_medium(); |
diff --git a/arch/powerpc/sysdev/fsl_soc.h b/arch/powerpc/sysdev/fsl_soc.h index 25230ceffbcf..04e145b5fc32 100644 --- a/arch/powerpc/sysdev/fsl_soc.h +++ b/arch/powerpc/sysdev/fsl_soc.h | |||
@@ -2,6 +2,8 @@ | |||
2 | #define __PPC_FSL_SOC_H | 2 | #define __PPC_FSL_SOC_H |
3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
4 | 4 | ||
5 | #include <asm/mmu.h> | ||
6 | |||
5 | extern phys_addr_t get_immrbase(void); | 7 | extern phys_addr_t get_immrbase(void); |
6 | extern u32 get_brgfreq(void); | 8 | extern u32 get_brgfreq(void); |
7 | extern u32 get_baudrate(void); | 9 | extern u32 get_baudrate(void); |
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index 70e707785d49..0251b7c68d0e 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c | |||
@@ -210,7 +210,7 @@ static struct ipic_info ipic_info[] = { | |||
210 | .prio_mask = 4, | 210 | .prio_mask = 4, |
211 | }, | 211 | }, |
212 | [64] = { | 212 | [64] = { |
213 | .pend = IPIC_SIPNR_H, | 213 | .pend = IPIC_SIPNR_L, |
214 | .mask = IPIC_SIMSR_L, | 214 | .mask = IPIC_SIMSR_L, |
215 | .prio = IPIC_SMPRR_A, | 215 | .prio = IPIC_SMPRR_A, |
216 | .force = IPIC_SIFCR_L, | 216 | .force = IPIC_SIFCR_L, |
@@ -218,7 +218,7 @@ static struct ipic_info ipic_info[] = { | |||
218 | .prio_mask = 0, | 218 | .prio_mask = 0, |
219 | }, | 219 | }, |
220 | [65] = { | 220 | [65] = { |
221 | .pend = IPIC_SIPNR_H, | 221 | .pend = IPIC_SIPNR_L, |
222 | .mask = IPIC_SIMSR_L, | 222 | .mask = IPIC_SIMSR_L, |
223 | .prio = IPIC_SMPRR_A, | 223 | .prio = IPIC_SMPRR_A, |
224 | .force = IPIC_SIFCR_L, | 224 | .force = IPIC_SIFCR_L, |
@@ -226,7 +226,7 @@ static struct ipic_info ipic_info[] = { | |||
226 | .prio_mask = 1, | 226 | .prio_mask = 1, |
227 | }, | 227 | }, |
228 | [66] = { | 228 | [66] = { |
229 | .pend = IPIC_SIPNR_H, | 229 | .pend = IPIC_SIPNR_L, |
230 | .mask = IPIC_SIMSR_L, | 230 | .mask = IPIC_SIMSR_L, |
231 | .prio = IPIC_SMPRR_A, | 231 | .prio = IPIC_SMPRR_A, |
232 | .force = IPIC_SIFCR_L, | 232 | .force = IPIC_SIFCR_L, |
@@ -234,7 +234,7 @@ static struct ipic_info ipic_info[] = { | |||
234 | .prio_mask = 2, | 234 | .prio_mask = 2, |
235 | }, | 235 | }, |
236 | [67] = { | 236 | [67] = { |
237 | .pend = IPIC_SIPNR_H, | 237 | .pend = IPIC_SIPNR_L, |
238 | .mask = IPIC_SIMSR_L, | 238 | .mask = IPIC_SIMSR_L, |
239 | .prio = IPIC_SMPRR_A, | 239 | .prio = IPIC_SMPRR_A, |
240 | .force = IPIC_SIFCR_L, | 240 | .force = IPIC_SIFCR_L, |
@@ -242,7 +242,7 @@ static struct ipic_info ipic_info[] = { | |||
242 | .prio_mask = 3, | 242 | .prio_mask = 3, |
243 | }, | 243 | }, |
244 | [68] = { | 244 | [68] = { |
245 | .pend = IPIC_SIPNR_H, | 245 | .pend = IPIC_SIPNR_L, |
246 | .mask = IPIC_SIMSR_L, | 246 | .mask = IPIC_SIMSR_L, |
247 | .prio = IPIC_SMPRR_B, | 247 | .prio = IPIC_SMPRR_B, |
248 | .force = IPIC_SIFCR_L, | 248 | .force = IPIC_SIFCR_L, |
@@ -250,7 +250,7 @@ static struct ipic_info ipic_info[] = { | |||
250 | .prio_mask = 0, | 250 | .prio_mask = 0, |
251 | }, | 251 | }, |
252 | [69] = { | 252 | [69] = { |
253 | .pend = IPIC_SIPNR_H, | 253 | .pend = IPIC_SIPNR_L, |
254 | .mask = IPIC_SIMSR_L, | 254 | .mask = IPIC_SIMSR_L, |
255 | .prio = IPIC_SMPRR_B, | 255 | .prio = IPIC_SMPRR_B, |
256 | .force = IPIC_SIFCR_L, | 256 | .force = IPIC_SIFCR_L, |
@@ -258,7 +258,7 @@ static struct ipic_info ipic_info[] = { | |||
258 | .prio_mask = 1, | 258 | .prio_mask = 1, |
259 | }, | 259 | }, |
260 | [70] = { | 260 | [70] = { |
261 | .pend = IPIC_SIPNR_H, | 261 | .pend = IPIC_SIPNR_L, |
262 | .mask = IPIC_SIMSR_L, | 262 | .mask = IPIC_SIMSR_L, |
263 | .prio = IPIC_SMPRR_B, | 263 | .prio = IPIC_SMPRR_B, |
264 | .force = IPIC_SIFCR_L, | 264 | .force = IPIC_SIFCR_L, |
@@ -266,7 +266,7 @@ static struct ipic_info ipic_info[] = { | |||
266 | .prio_mask = 2, | 266 | .prio_mask = 2, |
267 | }, | 267 | }, |
268 | [71] = { | 268 | [71] = { |
269 | .pend = IPIC_SIPNR_H, | 269 | .pend = IPIC_SIPNR_L, |
270 | .mask = IPIC_SIMSR_L, | 270 | .mask = IPIC_SIMSR_L, |
271 | .prio = IPIC_SMPRR_B, | 271 | .prio = IPIC_SMPRR_B, |
272 | .force = IPIC_SIFCR_L, | 272 | .force = IPIC_SIFCR_L, |
@@ -274,91 +274,91 @@ static struct ipic_info ipic_info[] = { | |||
274 | .prio_mask = 3, | 274 | .prio_mask = 3, |
275 | }, | 275 | }, |
276 | [72] = { | 276 | [72] = { |
277 | .pend = IPIC_SIPNR_H, | 277 | .pend = IPIC_SIPNR_L, |
278 | .mask = IPIC_SIMSR_L, | 278 | .mask = IPIC_SIMSR_L, |
279 | .prio = 0, | 279 | .prio = 0, |
280 | .force = IPIC_SIFCR_L, | 280 | .force = IPIC_SIFCR_L, |
281 | .bit = 8, | 281 | .bit = 8, |
282 | }, | 282 | }, |
283 | [73] = { | 283 | [73] = { |
284 | .pend = IPIC_SIPNR_H, | 284 | .pend = IPIC_SIPNR_L, |
285 | .mask = IPIC_SIMSR_L, | 285 | .mask = IPIC_SIMSR_L, |
286 | .prio = 0, | 286 | .prio = 0, |
287 | .force = IPIC_SIFCR_L, | 287 | .force = IPIC_SIFCR_L, |
288 | .bit = 9, | 288 | .bit = 9, |
289 | }, | 289 | }, |
290 | [74] = { | 290 | [74] = { |
291 | .pend = IPIC_SIPNR_H, | 291 | .pend = IPIC_SIPNR_L, |
292 | .mask = IPIC_SIMSR_L, | 292 | .mask = IPIC_SIMSR_L, |
293 | .prio = 0, | 293 | .prio = 0, |
294 | .force = IPIC_SIFCR_L, | 294 | .force = IPIC_SIFCR_L, |
295 | .bit = 10, | 295 | .bit = 10, |
296 | }, | 296 | }, |
297 | [75] = { | 297 | [75] = { |
298 | .pend = IPIC_SIPNR_H, | 298 | .pend = IPIC_SIPNR_L, |
299 | .mask = IPIC_SIMSR_L, | 299 | .mask = IPIC_SIMSR_L, |
300 | .prio = 0, | 300 | .prio = 0, |
301 | .force = IPIC_SIFCR_L, | 301 | .force = IPIC_SIFCR_L, |
302 | .bit = 11, | 302 | .bit = 11, |
303 | }, | 303 | }, |
304 | [76] = { | 304 | [76] = { |
305 | .pend = IPIC_SIPNR_H, | 305 | .pend = IPIC_SIPNR_L, |
306 | .mask = IPIC_SIMSR_L, | 306 | .mask = IPIC_SIMSR_L, |
307 | .prio = 0, | 307 | .prio = 0, |
308 | .force = IPIC_SIFCR_L, | 308 | .force = IPIC_SIFCR_L, |
309 | .bit = 12, | 309 | .bit = 12, |
310 | }, | 310 | }, |
311 | [77] = { | 311 | [77] = { |
312 | .pend = IPIC_SIPNR_H, | 312 | .pend = IPIC_SIPNR_L, |
313 | .mask = IPIC_SIMSR_L, | 313 | .mask = IPIC_SIMSR_L, |
314 | .prio = 0, | 314 | .prio = 0, |
315 | .force = IPIC_SIFCR_L, | 315 | .force = IPIC_SIFCR_L, |
316 | .bit = 13, | 316 | .bit = 13, |
317 | }, | 317 | }, |
318 | [78] = { | 318 | [78] = { |
319 | .pend = IPIC_SIPNR_H, | 319 | .pend = IPIC_SIPNR_L, |
320 | .mask = IPIC_SIMSR_L, | 320 | .mask = IPIC_SIMSR_L, |
321 | .prio = 0, | 321 | .prio = 0, |
322 | .force = IPIC_SIFCR_L, | 322 | .force = IPIC_SIFCR_L, |
323 | .bit = 14, | 323 | .bit = 14, |
324 | }, | 324 | }, |
325 | [79] = { | 325 | [79] = { |
326 | .pend = IPIC_SIPNR_H, | 326 | .pend = IPIC_SIPNR_L, |
327 | .mask = IPIC_SIMSR_L, | 327 | .mask = IPIC_SIMSR_L, |
328 | .prio = 0, | 328 | .prio = 0, |
329 | .force = IPIC_SIFCR_L, | 329 | .force = IPIC_SIFCR_L, |
330 | .bit = 15, | 330 | .bit = 15, |
331 | }, | 331 | }, |
332 | [80] = { | 332 | [80] = { |
333 | .pend = IPIC_SIPNR_H, | 333 | .pend = IPIC_SIPNR_L, |
334 | .mask = IPIC_SIMSR_L, | 334 | .mask = IPIC_SIMSR_L, |
335 | .prio = 0, | 335 | .prio = 0, |
336 | .force = IPIC_SIFCR_L, | 336 | .force = IPIC_SIFCR_L, |
337 | .bit = 16, | 337 | .bit = 16, |
338 | }, | 338 | }, |
339 | [84] = { | 339 | [84] = { |
340 | .pend = IPIC_SIPNR_H, | 340 | .pend = IPIC_SIPNR_L, |
341 | .mask = IPIC_SIMSR_L, | 341 | .mask = IPIC_SIMSR_L, |
342 | .prio = 0, | 342 | .prio = 0, |
343 | .force = IPIC_SIFCR_L, | 343 | .force = IPIC_SIFCR_L, |
344 | .bit = 20, | 344 | .bit = 20, |
345 | }, | 345 | }, |
346 | [85] = { | 346 | [85] = { |
347 | .pend = IPIC_SIPNR_H, | 347 | .pend = IPIC_SIPNR_L, |
348 | .mask = IPIC_SIMSR_L, | 348 | .mask = IPIC_SIMSR_L, |
349 | .prio = 0, | 349 | .prio = 0, |
350 | .force = IPIC_SIFCR_L, | 350 | .force = IPIC_SIFCR_L, |
351 | .bit = 21, | 351 | .bit = 21, |
352 | }, | 352 | }, |
353 | [90] = { | 353 | [90] = { |
354 | .pend = IPIC_SIPNR_H, | 354 | .pend = IPIC_SIPNR_L, |
355 | .mask = IPIC_SIMSR_L, | 355 | .mask = IPIC_SIMSR_L, |
356 | .prio = 0, | 356 | .prio = 0, |
357 | .force = IPIC_SIFCR_L, | 357 | .force = IPIC_SIFCR_L, |
358 | .bit = 26, | 358 | .bit = 26, |
359 | }, | 359 | }, |
360 | [91] = { | 360 | [91] = { |
361 | .pend = IPIC_SIPNR_H, | 361 | .pend = IPIC_SIPNR_L, |
362 | .mask = IPIC_SIMSR_L, | 362 | .mask = IPIC_SIMSR_L, |
363 | .prio = 0, | 363 | .prio = 0, |
364 | .force = IPIC_SIFCR_L, | 364 | .force = IPIC_SIFCR_L, |
diff --git a/arch/ppc/boot/utils/mkbugboot.c b/arch/ppc/boot/utils/mkbugboot.c index 29115e01f60a..1640c4199ca6 100644 --- a/arch/ppc/boot/utils/mkbugboot.c +++ b/arch/ppc/boot/utils/mkbugboot.c | |||
@@ -19,36 +19,13 @@ | |||
19 | #include <stdlib.h> | 19 | #include <stdlib.h> |
20 | #include <errno.h> | 20 | #include <errno.h> |
21 | #include <fcntl.h> | 21 | #include <fcntl.h> |
22 | #include <netinet/in.h> | ||
22 | #ifdef __sun__ | 23 | #ifdef __sun__ |
23 | #include <inttypes.h> | 24 | #include <inttypes.h> |
24 | #else | 25 | #else |
25 | #include <stdint.h> | 26 | #include <stdint.h> |
26 | #endif | 27 | #endif |
27 | 28 | ||
28 | #ifdef __i386__ | ||
29 | #define cpu_to_be32(x) le32_to_cpu(x) | ||
30 | #define cpu_to_be16(x) le16_to_cpu(x) | ||
31 | #else | ||
32 | #define cpu_to_be32(x) (x) | ||
33 | #define cpu_to_be16(x) (x) | ||
34 | #endif | ||
35 | |||
36 | #define cpu_to_le32(x) le32_to_cpu((x)) | ||
37 | unsigned long le32_to_cpu(unsigned long x) | ||
38 | { | ||
39 | return (((x & 0x000000ffU) << 24) | | ||
40 | ((x & 0x0000ff00U) << 8) | | ||
41 | ((x & 0x00ff0000U) >> 8) | | ||
42 | ((x & 0xff000000U) >> 24)); | ||
43 | } | ||
44 | |||
45 | #define cpu_to_le16(x) le16_to_cpu((x)) | ||
46 | unsigned short le16_to_cpu(unsigned short x) | ||
47 | { | ||
48 | return (((x & 0x00ff) << 8) | | ||
49 | ((x & 0xff00) >> 8)); | ||
50 | } | ||
51 | |||
52 | /* size of read buffer */ | 29 | /* size of read buffer */ |
53 | #define SIZE 0x1000 | 30 | #define SIZE 0x1000 |
54 | 31 | ||
@@ -62,124 +39,109 @@ typedef struct bug_boot_header { | |||
62 | 39 | ||
63 | #define HEADER_SIZE sizeof(bug_boot_header_t) | 40 | #define HEADER_SIZE sizeof(bug_boot_header_t) |
64 | 41 | ||
65 | uint32_t copy_image(int32_t in_fd, int32_t out_fd) | 42 | void update_checksum(void *buf, size_t size, uint16_t *sum) |
66 | { | 43 | { |
67 | uint8_t buf[SIZE]; | 44 | uint32_t csum = *sum; |
68 | int n; | 45 | |
69 | uint32_t image_size = 0; | 46 | while (size) { |
70 | uint8_t zero = 0; | 47 | csum += *(uint16_t *)buf; |
71 | 48 | if (csum > 0xffff) | |
72 | lseek(in_fd, ELF_HEADER_SIZE, SEEK_SET); | 49 | csum -= 0xffff; |
73 | 50 | buf = (uint16_t *)buf + 1; | |
74 | /* Copy an image while recording its size */ | 51 | size -= 2; |
75 | while ( (n = read(in_fd, buf, SIZE)) > 0 ) | 52 | } |
76 | { | 53 | *sum = csum; |
77 | image_size = image_size + n; | ||
78 | write(out_fd, buf, n); | ||
79 | } | ||
80 | |||
81 | /* BUG romboot requires that our size is divisible by 2 */ | ||
82 | /* align image to 2 byte boundary */ | ||
83 | if (image_size % 2) | ||
84 | { | ||
85 | image_size++; | ||
86 | write(out_fd, &zero, 1); | ||
87 | } | ||
88 | |||
89 | return image_size; | ||
90 | } | 54 | } |
91 | 55 | ||
92 | void write_bugboot_header(int32_t out_fd, uint32_t boot_size) | 56 | uint32_t copy_image(int in_fd, int out_fd, uint16_t *sum) |
93 | { | 57 | { |
94 | uint8_t header_block[HEADER_SIZE]; | 58 | uint8_t buf[SIZE]; |
95 | bug_boot_header_t *bbh = (bug_boot_header_t *)&header_block[0]; | 59 | int offset = 0; |
96 | 60 | int n; | |
97 | memset(header_block, 0, HEADER_SIZE); | 61 | uint32_t image_size = 0; |
98 | 62 | ||
99 | /* Fill in the PPCBUG ROM boot header */ | 63 | lseek(in_fd, ELF_HEADER_SIZE, SEEK_SET); |
100 | strncpy(bbh->magic_word, "BOOT", 4); /* PPCBUG magic word */ | 64 | |
101 | bbh->entry_offset = cpu_to_be32(HEADER_SIZE); /* Entry address */ | 65 | /* Copy an image while recording its size */ |
102 | bbh->routine_length= cpu_to_be32(HEADER_SIZE+boot_size+2); /* Routine length */ | 66 | while ( (n = read(in_fd, buf + offset, SIZE - offset)) > 0 ) { |
103 | strncpy(bbh->routine_name, "LINUXROM", 8); /* Routine name */ | 67 | n += offset; |
104 | 68 | offset = n & 1; | |
105 | /* Output the header and bootloader to the file */ | 69 | n -= offset; |
106 | write(out_fd, header_block, HEADER_SIZE); | 70 | image_size = image_size + n; |
71 | /* who's going to deal with short writes? */ | ||
72 | write(out_fd, buf, n); | ||
73 | update_checksum(buf, n, sum); | ||
74 | if (offset) | ||
75 | buf[0] = buf[n]; | ||
76 | } | ||
77 | |||
78 | /* BUG romboot requires that our size is divisible by 2 */ | ||
79 | /* align image to 2 byte boundary */ | ||
80 | if (offset) { | ||
81 | image_size += 2; | ||
82 | buf[1] = '\0'; | ||
83 | write(out_fd, buf, 2); | ||
84 | update_checksum(buf, 2, sum); | ||
85 | } | ||
86 | return image_size; | ||
107 | } | 87 | } |
108 | 88 | ||
109 | uint16_t calc_checksum(int32_t bug_fd) | 89 | void write_bugboot_header(int out_fd, uint32_t boot_size, uint16_t *sum) |
110 | { | 90 | { |
111 | uint32_t checksum_var = 0; | 91 | static bug_boot_header_t bbh = { |
112 | uint8_t buf[2]; | 92 | .magic_word = "BOOT", |
113 | int n; | 93 | .routine_name = "LINUXROM" |
114 | 94 | }; | |
115 | /* Checksum loop */ | 95 | |
116 | while ( (n = read(bug_fd, buf, 2) ) ) | 96 | /* Fill in the PPCBUG ROM boot header */ |
117 | { | 97 | bbh.entry_offset = htonl(HEADER_SIZE); /* Entry address */ |
118 | checksum_var = checksum_var + *(uint16_t *)buf; | 98 | bbh.routine_length= htonl(HEADER_SIZE+boot_size+2); /* Routine length */ |
119 | 99 | ||
120 | /* If we carry out, mask it and add one to the checksum */ | 100 | /* Output the header and bootloader to the file */ |
121 | if (checksum_var >> 16) | 101 | write(out_fd, &bbh, sizeof(bug_boot_header_t)); |
122 | checksum_var = (checksum_var & 0x0000ffff) + 1; | 102 | update_checksum(&bbh, sizeof(bug_boot_header_t), sum); |
123 | } | ||
124 | |||
125 | return checksum_var; | ||
126 | } | 103 | } |
127 | 104 | ||
128 | int main(int argc, char *argv[]) | 105 | int main(int argc, char *argv[]) |
129 | { | 106 | { |
130 | int32_t image_fd, bugboot_fd; | 107 | int image_fd, bugboot_fd; |
131 | int argptr = 1; | 108 | uint32_t kernel_size = 0; |
132 | uint32_t kernel_size = 0; | 109 | uint16_t checksum = 0; |
133 | uint16_t checksum = 0; | ||
134 | uint8_t bugbootname[256]; | ||
135 | |||
136 | if ( (argc != 3) ) | ||
137 | { | ||
138 | fprintf(stderr, "usage: %s <kernel_image> <bugboot>\n",argv[0]); | ||
139 | exit(-1); | ||
140 | } | ||
141 | |||
142 | /* Get file args */ | ||
143 | |||
144 | /* kernel image file */ | ||
145 | if ((image_fd = open( argv[argptr] , 0)) < 0) | ||
146 | exit(-1); | ||
147 | argptr++; | ||
148 | 110 | ||
149 | /* bugboot file */ | 111 | if (argc != 3) { |
150 | if ( !strcmp( argv[argptr], "-" ) ) | 112 | fprintf(stderr, "usage: %s <kernel_image> <bugboot>\n",argv[0]); |
151 | bugboot_fd = 1; /* stdout */ | 113 | exit(-1); |
152 | else | 114 | } |
153 | if ((bugboot_fd = creat( argv[argptr] , 0755)) < 0) | ||
154 | exit(-1); | ||
155 | else | ||
156 | strcpy(bugbootname, argv[argptr]); | ||
157 | argptr++; | ||
158 | 115 | ||
159 | /* Set file position after ROM header block where zImage will be written */ | 116 | /* Get file args */ |
160 | lseek(bugboot_fd, HEADER_SIZE, SEEK_SET); | ||
161 | 117 | ||
162 | /* Copy kernel image into bugboot image */ | 118 | /* kernel image file */ |
163 | kernel_size = copy_image(image_fd, bugboot_fd); | 119 | if ((image_fd = open(argv[1] , 0)) < 0) |
164 | close(image_fd); | 120 | exit(-1); |
165 | 121 | ||
166 | /* Set file position to beginning where header/romboot will be written */ | 122 | /* bugboot file */ |
167 | lseek(bugboot_fd, 0, SEEK_SET); | 123 | if (!strcmp(argv[2], "-")) |
124 | bugboot_fd = 1; /* stdout */ | ||
125 | else if ((bugboot_fd = creat(argv[2] , 0755)) < 0) | ||
126 | exit(-1); | ||
168 | 127 | ||
169 | /* Write out BUG header/romboot */ | 128 | /* Set file position after ROM header block where zImage will be written */ |
170 | write_bugboot_header(bugboot_fd, kernel_size); | 129 | lseek(bugboot_fd, HEADER_SIZE, SEEK_SET); |
171 | 130 | ||
172 | /* Close bugboot file */ | 131 | /* Copy kernel image into bugboot image */ |
173 | close(bugboot_fd); | 132 | kernel_size = copy_image(image_fd, bugboot_fd, &checksum); |
174 | 133 | ||
175 | /* Reopen it as read/write */ | 134 | /* Set file position to beginning where header/romboot will be written */ |
176 | bugboot_fd = open(bugbootname, O_RDWR); | 135 | lseek(bugboot_fd, 0, SEEK_SET); |
177 | 136 | ||
178 | /* Calculate checksum */ | 137 | /* Write out BUG header/romboot */ |
179 | checksum = calc_checksum(bugboot_fd); | 138 | write_bugboot_header(bugboot_fd, kernel_size, &checksum); |
180 | 139 | ||
181 | /* Write out the calculated checksum */ | 140 | /* Write out the calculated checksum */ |
182 | write(bugboot_fd, &checksum, 2); | 141 | lseek(bugboot_fd, 0, SEEK_END); |
142 | write(bugboot_fd, &checksum, 2); | ||
183 | 143 | ||
184 | return 0; | 144 | /* Close bugboot file */ |
145 | close(bugboot_fd); | ||
146 | return 0; | ||
185 | } | 147 | } |
diff --git a/arch/ppc/boot/utils/mkprep.c b/arch/ppc/boot/utils/mkprep.c index f6d5a2f2fcf6..192bb397126f 100644 --- a/arch/ppc/boot/utils/mkprep.c +++ b/arch/ppc/boot/utils/mkprep.c | |||
@@ -15,279 +15,227 @@ | |||
15 | * Modified for Sparc hosted builds by Peter Wahl <PeterWahl@web.de> | 15 | * Modified for Sparc hosted builds by Peter Wahl <PeterWahl@web.de> |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <fcntl.h> | ||
19 | #include <stdio.h> | 18 | #include <stdio.h> |
20 | #include <stdlib.h> | ||
21 | #include <string.h> | 19 | #include <string.h> |
22 | #include <strings.h> | 20 | #include <stdlib.h> |
23 | #include <sys/stat.h> | ||
24 | #include <unistd.h> | ||
25 | |||
26 | #define cpu_to_le32(x) le32_to_cpu((x)) | ||
27 | unsigned long le32_to_cpu(unsigned long x) | ||
28 | { | ||
29 | return (((x & 0x000000ffU) << 24) | | ||
30 | ((x & 0x0000ff00U) << 8) | | ||
31 | ((x & 0x00ff0000U) >> 8) | | ||
32 | ((x & 0xff000000U) >> 24)); | ||
33 | } | ||
34 | |||
35 | |||
36 | #define cpu_to_le16(x) le16_to_cpu((x)) | ||
37 | unsigned short le16_to_cpu(unsigned short x) | ||
38 | { | ||
39 | return (((x & 0x00ff) << 8) | | ||
40 | ((x & 0xff00) >> 8)); | ||
41 | } | ||
42 | |||
43 | #define cpu_to_be32(x) (x) | ||
44 | #define be32_to_cpu(x) (x) | ||
45 | #define cpu_to_be16(x) (x) | ||
46 | #define be16_to_cpu(x) (x) | ||
47 | 21 | ||
48 | /* size of read buffer */ | 22 | /* size of read buffer */ |
49 | #define SIZE 0x1000 | 23 | #define SIZE 0x1000 |
50 | 24 | ||
51 | |||
52 | typedef unsigned long dword_t; | ||
53 | typedef unsigned short word_t; | ||
54 | typedef unsigned char byte_t; | ||
55 | typedef byte_t block_t[512]; | ||
56 | typedef byte_t page_t[4096]; | ||
57 | |||
58 | |||
59 | /* | 25 | /* |
60 | * Partition table entry | 26 | * Partition table entry |
61 | * - from the PReP spec | 27 | * - from the PReP spec |
62 | */ | 28 | */ |
63 | typedef struct partition_entry { | 29 | typedef struct partition_entry { |
64 | byte_t boot_indicator; | 30 | unsigned char boot_indicator; |
65 | byte_t starting_head; | 31 | unsigned char starting_head; |
66 | byte_t starting_sector; | 32 | unsigned char starting_sector; |
67 | byte_t starting_cylinder; | 33 | unsigned char starting_cylinder; |
68 | 34 | ||
69 | byte_t system_indicator; | 35 | unsigned char system_indicator; |
70 | byte_t ending_head; | 36 | unsigned char ending_head; |
71 | byte_t ending_sector; | 37 | unsigned char ending_sector; |
72 | byte_t ending_cylinder; | 38 | unsigned char ending_cylinder; |
73 | 39 | ||
74 | dword_t beginning_sector; | 40 | unsigned char beginning_sector[4]; |
75 | dword_t number_of_sectors; | 41 | unsigned char number_of_sectors[4]; |
76 | } partition_entry_t; | 42 | } partition_entry_t; |
77 | 43 | ||
78 | #define BootActive 0x80 | 44 | #define BootActive 0x80 |
79 | #define SystemPrep 0x41 | 45 | #define SystemPrep 0x41 |
80 | 46 | ||
81 | void copy_image(int , int); | 47 | void copy_image(FILE *, FILE *); |
82 | void write_prep_partition(int , int ); | 48 | void write_prep_partition(FILE *, FILE *); |
83 | void write_asm_data( int in, int out ); | 49 | void write_asm_data(FILE *, FILE *); |
84 | 50 | ||
85 | unsigned int elfhdr_size = 65536; | 51 | unsigned int elfhdr_size = 65536; |
86 | 52 | ||
87 | int main(int argc, char *argv[]) | 53 | int main(int argc, char *argv[]) |
88 | { | 54 | { |
89 | int in_fd, out_fd; | 55 | FILE *in, *out; |
90 | int argptr = 1; | 56 | int argptr = 1; |
91 | unsigned int prep = 0; | 57 | int prep = 0; |
92 | unsigned int asmoutput = 0; | 58 | int asmoutput = 0; |
93 | 59 | ||
94 | if ( (argc < 3) || (argc > 4) ) | 60 | if (argc < 3 || argc > 4) { |
95 | { | 61 | fprintf(stderr, "usage: %s [-pbp] [-asm] <boot-file> <image>\n", |
96 | fprintf(stderr, "usage: %s [-pbp] [-asm] <boot-file> <image>\n",argv[0]); | 62 | argv[0]); |
97 | exit(-1); | 63 | exit(-1); |
98 | } | 64 | } |
99 | 65 | ||
100 | /* needs to handle args more elegantly -- but this is a small/simple program */ | 66 | /* needs to handle args more elegantly -- but this is a small/simple program */ |
101 | 67 | ||
102 | /* check for -pbp */ | 68 | /* check for -pbp */ |
103 | if ( !strcmp( argv[argptr], "-pbp" ) ) | 69 | if (!strcmp(argv[argptr], "-pbp")) { |
104 | { | 70 | prep = 1; |
105 | prep = 1; | 71 | argptr++; |
106 | argptr++; | 72 | } |
107 | } | 73 | |
108 | 74 | /* check for -asm */ | |
109 | /* check for -asm */ | 75 | if (!strcmp(argv[argptr], "-asm")) { |
110 | if ( !strcmp( argv[argptr], "-asm" ) ) | 76 | asmoutput = 1; |
111 | { | 77 | argptr++; |
112 | asmoutput = 1; | 78 | } |
113 | argptr++; | 79 | |
114 | } | 80 | /* input file */ |
115 | 81 | if (!strcmp(argv[argptr], "-")) | |
116 | /* input file */ | 82 | in = stdin; |
117 | if ( !strcmp( argv[argptr], "-" ) ) | 83 | else if (!(in = fopen(argv[argptr], "r"))) |
118 | in_fd = 0; /* stdin */ | 84 | exit(-1); |
119 | else | 85 | argptr++; |
120 | if ((in_fd = open( argv[argptr] , 0)) < 0) | 86 | |
121 | exit(-1); | 87 | /* output file */ |
122 | argptr++; | 88 | if (!strcmp(argv[argptr], "-")) |
123 | 89 | out = stdout; | |
124 | /* output file */ | 90 | else if (!(out = fopen(argv[argptr], "w"))) |
125 | if ( !strcmp( argv[argptr], "-" ) ) | 91 | exit(-1); |
126 | out_fd = 1; /* stdout */ | 92 | argptr++; |
127 | else | 93 | |
128 | if ((out_fd = creat( argv[argptr] , 0755)) < 0) | 94 | /* skip elf header in input file */ |
129 | exit(-1); | 95 | /*if ( !prep )*/ |
130 | argptr++; | 96 | fseek(in, elfhdr_size, SEEK_SET); |
131 | 97 | ||
132 | /* skip elf header in input file */ | 98 | /* write prep partition if necessary */ |
133 | /*if ( !prep )*/ | 99 | if (prep) |
134 | lseek(in_fd, elfhdr_size, SEEK_SET); | 100 | write_prep_partition(in, out); |
135 | 101 | ||
136 | /* write prep partition if necessary */ | 102 | /* write input image to bootimage */ |
137 | if ( prep ) | 103 | if (asmoutput) |
138 | write_prep_partition( in_fd, out_fd ); | 104 | write_asm_data(in, out); |
139 | 105 | else | |
140 | /* write input image to bootimage */ | 106 | copy_image(in, out); |
141 | if ( asmoutput ) | 107 | |
142 | write_asm_data( in_fd, out_fd ); | 108 | return 0; |
143 | else | ||
144 | copy_image(in_fd, out_fd); | ||
145 | |||
146 | return 0; | ||
147 | } | 109 | } |
148 | 110 | ||
149 | void write_prep_partition(int in, int out) | 111 | void store_le32(unsigned int v, unsigned char *p) |
150 | { | 112 | { |
151 | unsigned char block[512]; | 113 | p[0] = v; |
152 | partition_entry_t pe; | 114 | p[1] = v >>= 8; |
153 | dword_t *entry = (dword_t *)&block[0]; | 115 | p[2] = v >>= 8; |
154 | dword_t *length = (dword_t *)&block[sizeof(long)]; | 116 | p[3] = v >> 8; |
155 | struct stat info; | 117 | } |
156 | 118 | ||
157 | if (fstat(in, &info) < 0) | 119 | void write_prep_partition(FILE *in, FILE *out) |
158 | { | 120 | { |
159 | fprintf(stderr,"info failed\n"); | 121 | unsigned char block[512]; |
160 | exit(-1); | 122 | partition_entry_t pe; |
161 | } | 123 | unsigned char *entry = block; |
162 | 124 | unsigned char *length = block + 4; | |
163 | bzero( block, sizeof block ); | 125 | long pos = ftell(in), size; |
164 | 126 | ||
165 | /* set entry point and boot image size skipping over elf header */ | 127 | if (fseek(in, 0, SEEK_END) < 0) { |
166 | #ifdef __i386__ | 128 | fprintf(stderr,"info failed\n"); |
167 | *entry = 0x400/*+65536*/; | 129 | exit(-1); |
168 | *length = info.st_size-elfhdr_size+0x400; | 130 | } |
169 | #else | 131 | size = ftell(in); |
170 | *entry = cpu_to_le32(0x400/*+65536*/); | 132 | if (fseek(in, pos, SEEK_SET) < 0) { |
171 | *length = cpu_to_le32(info.st_size-elfhdr_size+0x400); | 133 | fprintf(stderr,"info failed\n"); |
172 | #endif /* __i386__ */ | 134 | exit(-1); |
173 | 135 | } | |
174 | /* sets magic number for msdos partition (used by linux) */ | 136 | |
175 | block[510] = 0x55; | 137 | memset(block, '\0', sizeof(block)); |
176 | block[511] = 0xAA; | 138 | |
177 | 139 | /* set entry point and boot image size skipping over elf header */ | |
178 | /* | 140 | store_le32(0x400/*+65536*/, entry); |
179 | * Build a "PReP" partition table entry in the boot record | 141 | store_le32(size-elfhdr_size+0x400, length); |
180 | * - "PReP" may only look at the system_indicator | 142 | |
181 | */ | 143 | /* sets magic number for msdos partition (used by linux) */ |
182 | pe.boot_indicator = BootActive; | 144 | block[510] = 0x55; |
183 | pe.system_indicator = SystemPrep; | 145 | block[511] = 0xAA; |
184 | /* | 146 | |
185 | * The first block of the diskette is used by this "boot record" which | 147 | /* |
186 | * actually contains the partition table. (The first block of the | 148 | * Build a "PReP" partition table entry in the boot record |
187 | * partition contains the boot image, but I digress...) We'll set up | 149 | * - "PReP" may only look at the system_indicator |
188 | * one partition on the diskette and it shall contain the rest of the | 150 | */ |
189 | * diskette. | 151 | pe.boot_indicator = BootActive; |
190 | */ | 152 | pe.system_indicator = SystemPrep; |
191 | pe.starting_head = 0; /* zero-based */ | 153 | /* |
192 | pe.starting_sector = 2; /* one-based */ | 154 | * The first block of the diskette is used by this "boot record" which |
193 | pe.starting_cylinder = 0; /* zero-based */ | 155 | * actually contains the partition table. (The first block of the |
194 | pe.ending_head = 1; /* assumes two heads */ | 156 | * partition contains the boot image, but I digress...) We'll set up |
195 | pe.ending_sector = 18; /* assumes 18 sectors/track */ | 157 | * one partition on the diskette and it shall contain the rest of the |
196 | pe.ending_cylinder = 79; /* assumes 80 cylinders/diskette */ | 158 | * diskette. |
197 | 159 | */ | |
198 | /* | 160 | pe.starting_head = 0; /* zero-based */ |
199 | * The "PReP" software ignores the above fields and just looks at | 161 | pe.starting_sector = 2; /* one-based */ |
200 | * the next two. | 162 | pe.starting_cylinder = 0; /* zero-based */ |
201 | * - size of the diskette is (assumed to be) | 163 | pe.ending_head = 1; /* assumes two heads */ |
202 | * (2 tracks/cylinder)(18 sectors/tracks)(80 cylinders/diskette) | 164 | pe.ending_sector = 18; /* assumes 18 sectors/track */ |
203 | * - unlike the above sector numbers, the beginning sector is zero-based! | 165 | pe.ending_cylinder = 79; /* assumes 80 cylinders/diskette */ |
204 | */ | 166 | |
167 | /* | ||
168 | * The "PReP" software ignores the above fields and just looks at | ||
169 | * the next two. | ||
170 | * - size of the diskette is (assumed to be) | ||
171 | * (2 tracks/cylinder)(18 sectors/tracks)(80 cylinders/diskette) | ||
172 | * - unlike the above sector numbers, the beginning sector is zero-based! | ||
173 | */ | ||
205 | #if 0 | 174 | #if 0 |
206 | pe.beginning_sector = cpu_to_le32(1); | 175 | store_le32(1, pe.beginning_sector); |
207 | #else | ||
208 | /* This has to be 0 on the PowerStack? */ | ||
209 | #ifdef __i386__ | ||
210 | pe.beginning_sector = 0; | ||
211 | #else | 176 | #else |
212 | pe.beginning_sector = cpu_to_le32(0); | 177 | /* This has to be 0 on the PowerStack? */ |
213 | #endif /* __i386__ */ | 178 | store_le32(0, pe.beginning_sector); |
214 | #endif | 179 | #endif |
215 | 180 | ||
216 | #ifdef __i386__ | 181 | store_le32(2*18*80-1, pe.number_of_sectors); |
217 | pe.number_of_sectors = 2*18*80-1; | ||
218 | #else | ||
219 | pe.number_of_sectors = cpu_to_le32(2*18*80-1); | ||
220 | #endif /* __i386__ */ | ||
221 | 182 | ||
222 | memcpy(&block[0x1BE], &pe, sizeof(pe)); | 183 | memcpy(&block[0x1BE], &pe, sizeof(pe)); |
223 | 184 | ||
224 | write( out, block, sizeof(block) ); | 185 | fwrite(block, sizeof(block), 1, out); |
225 | write( out, entry, sizeof(*entry) ); | 186 | fwrite(entry, 4, 1, out); |
226 | write( out, length, sizeof(*length) ); | 187 | fwrite(length, 4, 1, out); |
227 | /* set file position to 2nd sector where image will be written */ | 188 | /* set file position to 2nd sector where image will be written */ |
228 | lseek( out, 0x400, SEEK_SET ); | 189 | fseek( out, 0x400, SEEK_SET ); |
229 | } | 190 | } |
230 | 191 | ||
231 | 192 | ||
232 | 193 | ||
233 | void | 194 | void copy_image(FILE *in, FILE *out) |
234 | copy_image(int in, int out) | ||
235 | { | 195 | { |
236 | char buf[SIZE]; | 196 | char buf[SIZE]; |
237 | int n; | 197 | int n; |
238 | 198 | ||
239 | while ( (n = read(in, buf, SIZE)) > 0 ) | 199 | while ( (n = fread(buf, 1, SIZE, in)) > 0 ) |
240 | write(out, buf, n); | 200 | fwrite(buf, 1, n, out); |
241 | } | 201 | } |
242 | 202 | ||
243 | 203 | ||
244 | void | 204 | void |
245 | write_asm_data( int in, int out ) | 205 | write_asm_data(FILE *in, FILE *out) |
246 | { | 206 | { |
247 | int i, cnt, pos, len; | 207 | int i, cnt, pos = 0; |
248 | unsigned int cksum, val; | 208 | unsigned int cksum = 0, val; |
249 | unsigned char *lp; | 209 | unsigned char *lp; |
250 | unsigned char buf[SIZE]; | 210 | unsigned char buf[SIZE]; |
251 | unsigned char str[256]; | 211 | size_t len; |
252 | 212 | ||
253 | write( out, "\t.data\n\t.globl input_data\ninput_data:\n", | 213 | fputs("\t.data\n\t.globl input_data\ninput_data:\n", out); |
254 | strlen( "\t.data\n\t.globl input_data\ninput_data:\n" ) ); | 214 | while ((len = fread(buf, 1, sizeof(buf), in)) > 0) { |
255 | pos = 0; | 215 | cnt = 0; |
256 | cksum = 0; | 216 | lp = buf; |
257 | while ((len = read(in, buf, sizeof(buf))) > 0) | 217 | /* Round up to longwords */ |
258 | { | 218 | while (len & 3) |
259 | cnt = 0; | 219 | buf[len++] = '\0'; |
260 | lp = (unsigned char *)buf; | 220 | for (i = 0; i < len; i += 4) { |
261 | len = (len + 3) & ~3; /* Round up to longwords */ | 221 | if (cnt == 0) |
262 | for (i = 0; i < len; i += 4) | 222 | fputs("\t.long\t", out); |
263 | { | 223 | fprintf(out, "0x%02X%02X%02X%02X", |
264 | if (cnt == 0) | 224 | lp[0], lp[1], lp[2], lp[3]); |
265 | { | 225 | val = *(unsigned long *)lp; |
266 | write( out, "\t.long\t", strlen( "\t.long\t" ) ); | 226 | cksum ^= val; |
267 | } | 227 | lp += 4; |
268 | sprintf( str, "0x%02X%02X%02X%02X", lp[0], lp[1], lp[2], lp[3]); | 228 | if (++cnt == 4) { |
269 | write( out, str, strlen(str) ); | 229 | cnt = 0; |
270 | val = *(unsigned long *)lp; | 230 | fprintf(out, " # %x \n", pos+i-12); |
271 | cksum ^= val; | 231 | } else { |
272 | lp += 4; | 232 | fputs(",", out); |
273 | if (++cnt == 4) | 233 | } |
274 | { | 234 | } |
275 | cnt = 0; | 235 | if (cnt) |
276 | sprintf( str, " # %x \n", pos+i-12); | 236 | fputs("0\n", out); |
277 | write( out, str, strlen(str) ); | 237 | pos += len; |
278 | } else | 238 | } |
279 | { | 239 | fprintf(out, "\t.globl input_len\ninput_len:\t.long\t0x%x\n", pos); |
280 | write( out, ",", 1 ); | 240 | fprintf(stderr, "cksum = %x\n", cksum); |
281 | } | ||
282 | } | ||
283 | if (cnt) | ||
284 | { | ||
285 | write( out, "0\n", 2 ); | ||
286 | } | ||
287 | pos += len; | ||
288 | } | ||
289 | sprintf(str, "\t.globl input_len\ninput_len:\t.long\t0x%x\n", pos); | ||
290 | write( out, str, strlen(str) ); | ||
291 | |||
292 | fprintf(stderr, "cksum = %x\n", cksum); | ||
293 | } | 241 | } |
diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S index 2fa0075f2b5f..50b4bbd06804 100644 --- a/arch/ppc/kernel/misc.S +++ b/arch/ppc/kernel/misc.S | |||
@@ -768,91 +768,6 @@ _GLOBAL(_outsb) | |||
768 | bdnz 00b | 768 | bdnz 00b |
769 | blr | 769 | blr |
770 | 770 | ||
771 | _GLOBAL(_insw) | ||
772 | cmpwi 0,r5,0 | ||
773 | mtctr r5 | ||
774 | subi r4,r4,2 | ||
775 | blelr- | ||
776 | 00: lhbrx r5,0,r3 | ||
777 | 01: eieio | ||
778 | 02: sthu r5,2(r4) | ||
779 | ISYNC_8xx | ||
780 | .section .fixup,"ax" | ||
781 | 03: blr | ||
782 | .text | ||
783 | .section __ex_table, "a" | ||
784 | .align 2 | ||
785 | .long 00b, 03b | ||
786 | .long 01b, 03b | ||
787 | .long 02b, 03b | ||
788 | .text | ||
789 | bdnz 00b | ||
790 | blr | ||
791 | |||
792 | _GLOBAL(_outsw) | ||
793 | cmpwi 0,r5,0 | ||
794 | mtctr r5 | ||
795 | subi r4,r4,2 | ||
796 | blelr- | ||
797 | 00: lhzu r5,2(r4) | ||
798 | 01: eieio | ||
799 | 02: sthbrx r5,0,r3 | ||
800 | ISYNC_8xx | ||
801 | .section .fixup,"ax" | ||
802 | 03: blr | ||
803 | .text | ||
804 | .section __ex_table, "a" | ||
805 | .align 2 | ||
806 | .long 00b, 03b | ||
807 | .long 01b, 03b | ||
808 | .long 02b, 03b | ||
809 | .text | ||
810 | bdnz 00b | ||
811 | blr | ||
812 | |||
813 | _GLOBAL(_insl) | ||
814 | cmpwi 0,r5,0 | ||
815 | mtctr r5 | ||
816 | subi r4,r4,4 | ||
817 | blelr- | ||
818 | 00: lwbrx r5,0,r3 | ||
819 | 01: eieio | ||
820 | 02: stwu r5,4(r4) | ||
821 | ISYNC_8xx | ||
822 | .section .fixup,"ax" | ||
823 | 03: blr | ||
824 | .text | ||
825 | .section __ex_table, "a" | ||
826 | .align 2 | ||
827 | .long 00b, 03b | ||
828 | .long 01b, 03b | ||
829 | .long 02b, 03b | ||
830 | .text | ||
831 | bdnz 00b | ||
832 | blr | ||
833 | |||
834 | _GLOBAL(_outsl) | ||
835 | cmpwi 0,r5,0 | ||
836 | mtctr r5 | ||
837 | subi r4,r4,4 | ||
838 | blelr- | ||
839 | 00: lwzu r5,4(r4) | ||
840 | 01: stwbrx r5,0,r3 | ||
841 | 02: eieio | ||
842 | ISYNC_8xx | ||
843 | .section .fixup,"ax" | ||
844 | 03: blr | ||
845 | .text | ||
846 | .section __ex_table, "a" | ||
847 | .align 2 | ||
848 | .long 00b, 03b | ||
849 | .long 01b, 03b | ||
850 | .long 02b, 03b | ||
851 | .text | ||
852 | bdnz 00b | ||
853 | blr | ||
854 | |||
855 | _GLOBAL(__ide_mm_insw) | ||
856 | _GLOBAL(_insw_ns) | 771 | _GLOBAL(_insw_ns) |
857 | cmpwi 0,r5,0 | 772 | cmpwi 0,r5,0 |
858 | mtctr r5 | 773 | mtctr r5 |
@@ -874,7 +789,6 @@ _GLOBAL(_insw_ns) | |||
874 | bdnz 00b | 789 | bdnz 00b |
875 | blr | 790 | blr |
876 | 791 | ||
877 | _GLOBAL(__ide_mm_outsw) | ||
878 | _GLOBAL(_outsw_ns) | 792 | _GLOBAL(_outsw_ns) |
879 | cmpwi 0,r5,0 | 793 | cmpwi 0,r5,0 |
880 | mtctr r5 | 794 | mtctr r5 |
@@ -896,7 +810,6 @@ _GLOBAL(_outsw_ns) | |||
896 | bdnz 00b | 810 | bdnz 00b |
897 | blr | 811 | blr |
898 | 812 | ||
899 | _GLOBAL(__ide_mm_insl) | ||
900 | _GLOBAL(_insl_ns) | 813 | _GLOBAL(_insl_ns) |
901 | cmpwi 0,r5,0 | 814 | cmpwi 0,r5,0 |
902 | mtctr r5 | 815 | mtctr r5 |
@@ -918,7 +831,6 @@ _GLOBAL(_insl_ns) | |||
918 | bdnz 00b | 831 | bdnz 00b |
919 | blr | 832 | blr |
920 | 833 | ||
921 | _GLOBAL(__ide_mm_outsl) | ||
922 | _GLOBAL(_outsl_ns) | 834 | _GLOBAL(_outsl_ns) |
923 | cmpwi 0,r5,0 | 835 | cmpwi 0,r5,0 |
924 | mtctr r5 | 836 | mtctr r5 |
diff --git a/arch/ppc/kernel/ppc_ksyms.c b/arch/ppc/kernel/ppc_ksyms.c index d1735401384c..c8b65ca8a350 100644 --- a/arch/ppc/kernel/ppc_ksyms.c +++ b/arch/ppc/kernel/ppc_ksyms.c | |||
@@ -115,17 +115,8 @@ EXPORT_SYMBOL(outw); | |||
115 | EXPORT_SYMBOL(outl); | 115 | EXPORT_SYMBOL(outl); |
116 | EXPORT_SYMBOL(outsl);*/ | 116 | EXPORT_SYMBOL(outsl);*/ |
117 | 117 | ||
118 | EXPORT_SYMBOL(__ide_mm_insl); | ||
119 | EXPORT_SYMBOL(__ide_mm_outsw); | ||
120 | EXPORT_SYMBOL(__ide_mm_insw); | ||
121 | EXPORT_SYMBOL(__ide_mm_outsl); | ||
122 | |||
123 | EXPORT_SYMBOL(_insb); | 118 | EXPORT_SYMBOL(_insb); |
124 | EXPORT_SYMBOL(_outsb); | 119 | EXPORT_SYMBOL(_outsb); |
125 | EXPORT_SYMBOL(_insw); | ||
126 | EXPORT_SYMBOL(_outsw); | ||
127 | EXPORT_SYMBOL(_insl); | ||
128 | EXPORT_SYMBOL(_outsl); | ||
129 | EXPORT_SYMBOL(_insw_ns); | 120 | EXPORT_SYMBOL(_insw_ns); |
130 | EXPORT_SYMBOL(_outsw_ns); | 121 | EXPORT_SYMBOL(_outsw_ns); |
131 | EXPORT_SYMBOL(_insl_ns); | 122 | EXPORT_SYMBOL(_insl_ns); |
diff --git a/arch/ppc/platforms/85xx/sbc8560.h b/arch/ppc/platforms/85xx/sbc8560.h index c7d61cf3a449..e5e156f60100 100644 --- a/arch/ppc/platforms/85xx/sbc8560.h +++ b/arch/ppc/platforms/85xx/sbc8560.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #define __MACH_SBC8560_H__ | 14 | #define __MACH_SBC8560_H__ |
15 | 15 | ||
16 | #include <platforms/85xx/sbc85xx.h> | 16 | #include <platforms/85xx/sbc85xx.h> |
17 | #include <asm/irq.h> | ||
17 | 18 | ||
18 | #define CPM_MAP_ADDR (CCSRBAR + MPC85xx_CPM_OFFSET) | 19 | #define CPM_MAP_ADDR (CCSRBAR + MPC85xx_CPM_OFFSET) |
19 | 20 | ||
diff --git a/arch/ppc/platforms/85xx/sbc85xx.h b/arch/ppc/platforms/85xx/sbc85xx.h index 21ea7a55639b..51df4dc04e22 100644 --- a/arch/ppc/platforms/85xx/sbc85xx.h +++ b/arch/ppc/platforms/85xx/sbc85xx.h | |||
@@ -49,4 +49,22 @@ extern void sbc8560_init_IRQ(void) __init; | |||
49 | 49 | ||
50 | #define MPC85XX_PCI1_IO_SIZE 0x01000000 | 50 | #define MPC85XX_PCI1_IO_SIZE 0x01000000 |
51 | 51 | ||
52 | /* FCC1 Clock Source Configuration. These can be | ||
53 | * redefined in the board specific file. | ||
54 | * Can only choose from CLK9-12 */ | ||
55 | #define F1_RXCLK 12 | ||
56 | #define F1_TXCLK 11 | ||
57 | |||
58 | /* FCC2 Clock Source Configuration. These can be | ||
59 | * redefined in the board specific file. | ||
60 | * Can only choose from CLK13-16 */ | ||
61 | #define F2_RXCLK 13 | ||
62 | #define F2_TXCLK 14 | ||
63 | |||
64 | /* FCC3 Clock Source Configuration. These can be | ||
65 | * redefined in the board specific file. | ||
66 | * Can only choose from CLK13-16 */ | ||
67 | #define F3_RXCLK 15 | ||
68 | #define F3_TXCLK 16 | ||
69 | |||
52 | #endif /* __PLATFORMS_85XX_SBC85XX_H__ */ | 70 | #endif /* __PLATFORMS_85XX_SBC85XX_H__ */ |
diff --git a/arch/ppc/syslib/m8260_pci_erratum9.c b/arch/ppc/syslib/m8260_pci_erratum9.c index 974581ea4849..5475709ce07b 100644 --- a/arch/ppc/syslib/m8260_pci_erratum9.c +++ b/arch/ppc/syslib/m8260_pci_erratum9.c | |||
@@ -339,20 +339,6 @@ void insl(unsigned port, void *buf, int nl) | |||
339 | idma_pci9_read((u8 *)buf, (u8 *)addr, nl*sizeof(u32), sizeof(u32), 0); | 339 | idma_pci9_read((u8 *)buf, (u8 *)addr, nl*sizeof(u32), sizeof(u32), 0); |
340 | } | 340 | } |
341 | 341 | ||
342 | void insw_ns(unsigned port, void *buf, int ns) | ||
343 | { | ||
344 | u8 *addr = (u8 *)(port + _IO_BASE); | ||
345 | |||
346 | idma_pci9_read((u8 *)buf, (u8 *)addr, ns*sizeof(u16), sizeof(u16), 0); | ||
347 | } | ||
348 | |||
349 | void insl_ns(unsigned port, void *buf, int nl) | ||
350 | { | ||
351 | u8 *addr = (u8 *)(port + _IO_BASE); | ||
352 | |||
353 | idma_pci9_read((u8 *)buf, (u8 *)addr, nl*sizeof(u32), sizeof(u32), 0); | ||
354 | } | ||
355 | |||
356 | void *memcpy_fromio(void *dest, unsigned long src, size_t count) | 342 | void *memcpy_fromio(void *dest, unsigned long src, size_t count) |
357 | { | 343 | { |
358 | unsigned long pa = iopa((unsigned long) src); | 344 | unsigned long pa = iopa((unsigned long) src); |
@@ -373,8 +359,6 @@ EXPORT_SYMBOL(inl); | |||
373 | EXPORT_SYMBOL(insb); | 359 | EXPORT_SYMBOL(insb); |
374 | EXPORT_SYMBOL(insw); | 360 | EXPORT_SYMBOL(insw); |
375 | EXPORT_SYMBOL(insl); | 361 | EXPORT_SYMBOL(insl); |
376 | EXPORT_SYMBOL(insw_ns); | ||
377 | EXPORT_SYMBOL(insl_ns); | ||
378 | EXPORT_SYMBOL(memcpy_fromio); | 362 | EXPORT_SYMBOL(memcpy_fromio); |
379 | 363 | ||
380 | #endif /* ifdef CONFIG_8260_PCI9 */ | 364 | #endif /* ifdef CONFIG_8260_PCI9 */ |
diff --git a/arch/ppc/xmon/xmon.c b/arch/ppc/xmon/xmon.c index 25d032b2aec7..b1a91744fd2d 100644 --- a/arch/ppc/xmon/xmon.c +++ b/arch/ppc/xmon/xmon.c | |||
@@ -806,7 +806,7 @@ backtrace(struct pt_regs *excp) | |||
806 | for (; sp != 0; sp = stack[0]) { | 806 | for (; sp != 0; sp = stack[0]) { |
807 | if (mread(sp, stack, sizeof(stack)) != sizeof(stack)) | 807 | if (mread(sp, stack, sizeof(stack)) != sizeof(stack)) |
808 | break; | 808 | break; |
809 | printf("[%.8lx] ", stack); | 809 | printf("[%.8lx] ", stack[0]); |
810 | xmon_print_symbol(stack[1], " ", "\n"); | 810 | xmon_print_symbol(stack[1], " ", "\n"); |
811 | if (stack[1] == (unsigned) &ret_from_except | 811 | if (stack[1] == (unsigned) &ret_from_except |
812 | || stack[1] == (unsigned) &ret_from_except_full | 812 | || stack[1] == (unsigned) &ret_from_except_full |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 2f4f70c4dbb2..b216ca659cdf 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -460,8 +460,7 @@ config S390_HYPFS_FS | |||
460 | information in an s390 hypervisor environment. | 460 | information in an s390 hypervisor environment. |
461 | 461 | ||
462 | config KEXEC | 462 | config KEXEC |
463 | bool "kexec system call (EXPERIMENTAL)" | 463 | bool "kexec system call" |
464 | depends on EXPERIMENTAL | ||
465 | help | 464 | help |
466 | kexec is a system call that implements the ability to shutdown your | 465 | kexec is a system call that implements the ability to shutdown your |
467 | current kernel, and to start another kernel. It is like a reboot | 466 | current kernel, and to start another kernel. It is like a reboot |
@@ -487,8 +486,22 @@ source "drivers/net/Kconfig" | |||
487 | 486 | ||
488 | source "fs/Kconfig" | 487 | source "fs/Kconfig" |
489 | 488 | ||
489 | menu "Instrumentation Support" | ||
490 | |||
490 | source "arch/s390/oprofile/Kconfig" | 491 | source "arch/s390/oprofile/Kconfig" |
491 | 492 | ||
493 | config KPROBES | ||
494 | bool "Kprobes (EXPERIMENTAL)" | ||
495 | depends on EXPERIMENTAL && MODULES | ||
496 | help | ||
497 | Kprobes allows you to trap at almost any kernel address and | ||
498 | execute a callback function. register_kprobe() establishes | ||
499 | a probepoint and specifies the callback. Kprobes is useful | ||
500 | for kernel debugging, non-intrusive instrumentation and testing. | ||
501 | If in doubt, say "N". | ||
502 | |||
503 | endmenu | ||
504 | |||
492 | source "arch/s390/Kconfig.debug" | 505 | source "arch/s390/Kconfig.debug" |
493 | 506 | ||
494 | source "security/Kconfig" | 507 | source "security/Kconfig" |
diff --git a/arch/s390/appldata/appldata.h b/arch/s390/appldata/appldata.h index 71d65eb30650..0429481dea63 100644 --- a/arch/s390/appldata/appldata.h +++ b/arch/s390/appldata/appldata.h | |||
@@ -29,22 +29,6 @@ | |||
29 | #define CTL_APPLDATA_NET_SUM 2125 | 29 | #define CTL_APPLDATA_NET_SUM 2125 |
30 | #define CTL_APPLDATA_PROC 2126 | 30 | #define CTL_APPLDATA_PROC 2126 |
31 | 31 | ||
32 | #ifndef CONFIG_64BIT | ||
33 | |||
34 | #define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ | ||
35 | #define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ | ||
36 | #define APPLDATA_GEN_EVENT_RECORD 0x02 | ||
37 | #define APPLDATA_START_CONFIG_REC 0x03 | ||
38 | |||
39 | #else | ||
40 | |||
41 | #define APPLDATA_START_INTERVAL_REC 0x80 | ||
42 | #define APPLDATA_STOP_REC 0x81 | ||
43 | #define APPLDATA_GEN_EVENT_RECORD 0x82 | ||
44 | #define APPLDATA_START_CONFIG_REC 0x83 | ||
45 | |||
46 | #endif /* CONFIG_64BIT */ | ||
47 | |||
48 | #define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x) | 32 | #define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x) |
49 | #define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x) | 33 | #define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x) |
50 | #define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x) | 34 | #define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x) |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index a0a94e0ef8d1..b69ed742f981 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -14,20 +14,20 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <asm/uaccess.h> | ||
18 | #include <asm/io.h> | ||
19 | #include <asm/smp.h> | ||
20 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
21 | #include <linux/proc_fs.h> | 18 | #include <linux/proc_fs.h> |
22 | #include <linux/page-flags.h> | 19 | #include <linux/page-flags.h> |
23 | #include <linux/swap.h> | 20 | #include <linux/swap.h> |
24 | #include <linux/pagemap.h> | 21 | #include <linux/pagemap.h> |
25 | #include <linux/sysctl.h> | 22 | #include <linux/sysctl.h> |
26 | #include <asm/timer.h> | ||
27 | //#include <linux/kernel_stat.h> | ||
28 | #include <linux/notifier.h> | 23 | #include <linux/notifier.h> |
29 | #include <linux/cpu.h> | 24 | #include <linux/cpu.h> |
30 | #include <linux/workqueue.h> | 25 | #include <linux/workqueue.h> |
26 | #include <asm/appldata.h> | ||
27 | #include <asm/timer.h> | ||
28 | #include <asm/uaccess.h> | ||
29 | #include <asm/io.h> | ||
30 | #include <asm/smp.h> | ||
31 | 31 | ||
32 | #include "appldata.h" | 32 | #include "appldata.h" |
33 | 33 | ||
@@ -39,34 +39,6 @@ | |||
39 | 39 | ||
40 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units | 40 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units |
41 | for 1 microsecond */ | 41 | for 1 microsecond */ |
42 | |||
43 | /* | ||
44 | * Parameter list for DIAGNOSE X'DC' | ||
45 | */ | ||
46 | #ifndef CONFIG_64BIT | ||
47 | struct appldata_parameter_list { | ||
48 | u16 diag; /* The DIAGNOSE code X'00DC' */ | ||
49 | u8 function; /* The function code for the DIAGNOSE */ | ||
50 | u8 parlist_length; /* Length of the parameter list */ | ||
51 | u32 product_id_addr; /* Address of the 16-byte product ID */ | ||
52 | u16 reserved; | ||
53 | u16 buffer_length; /* Length of the application data buffer */ | ||
54 | u32 buffer_addr; /* Address of the application data buffer */ | ||
55 | }; | ||
56 | #else | ||
57 | struct appldata_parameter_list { | ||
58 | u16 diag; | ||
59 | u8 function; | ||
60 | u8 parlist_length; | ||
61 | u32 unused01; | ||
62 | u16 reserved; | ||
63 | u16 buffer_length; | ||
64 | u32 unused02; | ||
65 | u64 product_id_addr; | ||
66 | u64 buffer_addr; | ||
67 | }; | ||
68 | #endif /* CONFIG_64BIT */ | ||
69 | |||
70 | /* | 42 | /* |
71 | * /proc entries (sysctl) | 43 | * /proc entries (sysctl) |
72 | */ | 44 | */ |
@@ -181,46 +153,17 @@ static void appldata_work_fn(void *data) | |||
181 | int appldata_diag(char record_nr, u16 function, unsigned long buffer, | 153 | int appldata_diag(char record_nr, u16 function, unsigned long buffer, |
182 | u16 length, char *mod_lvl) | 154 | u16 length, char *mod_lvl) |
183 | { | 155 | { |
184 | unsigned long ry; | 156 | struct appldata_product_id id = { |
185 | struct appldata_product_id { | ||
186 | char prod_nr[7]; /* product nr. */ | ||
187 | char prod_fn[2]; /* product function */ | ||
188 | char record_nr; /* record nr. */ | ||
189 | char version_nr[2]; /* version */ | ||
190 | char release_nr[2]; /* release */ | ||
191 | char mod_lvl[2]; /* modification lvl. */ | ||
192 | } appldata_product_id = { | ||
193 | /* all strings are EBCDIC, record_nr is byte */ | ||
194 | .prod_nr = {0xD3, 0xC9, 0xD5, 0xE4, | 157 | .prod_nr = {0xD3, 0xC9, 0xD5, 0xE4, |
195 | 0xE7, 0xD2, 0xD9}, /* "LINUXKR" */ | 158 | 0xE7, 0xD2, 0xD9}, /* "LINUXKR" */ |
196 | .prod_fn = {0xD5, 0xD3}, /* "NL" */ | 159 | .prod_fn = 0xD5D3, /* "NL" */ |
197 | .record_nr = record_nr, | 160 | .record_nr = record_nr, |
198 | .version_nr = {0xF2, 0xF6}, /* "26" */ | 161 | .version_nr = 0xF2F6, /* "26" */ |
199 | .release_nr = {0xF0, 0xF1}, /* "01" */ | 162 | .release_nr = 0xF0F1, /* "01" */ |
200 | .mod_lvl = {mod_lvl[0], mod_lvl[1]}, | 163 | .mod_lvl = (mod_lvl[0]) << 8 | mod_lvl[1], |
201 | }; | ||
202 | struct appldata_parameter_list appldata_parameter_list = { | ||
203 | .diag = 0xDC, | ||
204 | .function = function, | ||
205 | .parlist_length = | ||
206 | sizeof(appldata_parameter_list), | ||
207 | .buffer_length = length, | ||
208 | .product_id_addr = | ||
209 | (unsigned long) &appldata_product_id, | ||
210 | .buffer_addr = virt_to_phys((void *) buffer) | ||
211 | }; | 164 | }; |
212 | 165 | ||
213 | if (!MACHINE_IS_VM) | 166 | return appldata_asm(&id, function, (void *) buffer, length); |
214 | return -ENOSYS; | ||
215 | ry = -1; | ||
216 | asm volatile( | ||
217 | "diag %1,%0,0xDC\n\t" | ||
218 | : "=d" (ry) | ||
219 | : "d" (&appldata_parameter_list), | ||
220 | "m" (appldata_parameter_list), | ||
221 | "m" (appldata_product_id) | ||
222 | : "cc"); | ||
223 | return (int) ry; | ||
224 | } | 167 | } |
225 | /************************ timer, work, DIAG <END> ****************************/ | 168 | /************************ timer, work, DIAG <END> ****************************/ |
226 | 169 | ||
diff --git a/arch/s390/appldata/appldata_os.c b/arch/s390/appldata/appldata_os.c index 161acc5c8a1b..76a15523ae9e 100644 --- a/arch/s390/appldata/appldata_os.c +++ b/arch/s390/appldata/appldata_os.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/kernel_stat.h> | 16 | #include <linux/kernel_stat.h> |
17 | #include <linux/netdevice.h> | 17 | #include <linux/netdevice.h> |
18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
19 | #include <asm/appldata.h> | ||
19 | #include <asm/smp.h> | 20 | #include <asm/smp.h> |
20 | 21 | ||
21 | #include "appldata.h" | 22 | #include "appldata.h" |
diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c index 5713c7e5bd16..15c9eec02928 100644 --- a/arch/s390/crypto/aes_s390.c +++ b/arch/s390/crypto/aes_s390.c | |||
@@ -16,9 +16,9 @@ | |||
16 | * | 16 | * |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <crypto/algapi.h> | ||
19 | #include <linux/module.h> | 20 | #include <linux/module.h> |
20 | #include <linux/init.h> | 21 | #include <linux/init.h> |
21 | #include <linux/crypto.h> | ||
22 | #include "crypt_s390.h" | 22 | #include "crypt_s390.h" |
23 | 23 | ||
24 | #define AES_MIN_KEY_SIZE 16 | 24 | #define AES_MIN_KEY_SIZE 16 |
@@ -34,13 +34,16 @@ int has_aes_256 = 0; | |||
34 | struct s390_aes_ctx { | 34 | struct s390_aes_ctx { |
35 | u8 iv[AES_BLOCK_SIZE]; | 35 | u8 iv[AES_BLOCK_SIZE]; |
36 | u8 key[AES_MAX_KEY_SIZE]; | 36 | u8 key[AES_MAX_KEY_SIZE]; |
37 | long enc; | ||
38 | long dec; | ||
37 | int key_len; | 39 | int key_len; |
38 | }; | 40 | }; |
39 | 41 | ||
40 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 42 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
41 | unsigned int key_len, u32 *flags) | 43 | unsigned int key_len) |
42 | { | 44 | { |
43 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | 45 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); |
46 | u32 *flags = &tfm->crt_flags; | ||
44 | 47 | ||
45 | switch (key_len) { | 48 | switch (key_len) { |
46 | case 16: | 49 | case 16: |
@@ -110,133 +113,206 @@ static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
110 | } | 113 | } |
111 | } | 114 | } |
112 | 115 | ||
113 | static unsigned int aes_encrypt_ecb(const struct cipher_desc *desc, u8 *out, | ||
114 | const u8 *in, unsigned int nbytes) | ||
115 | { | ||
116 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(desc->tfm); | ||
117 | int ret; | ||
118 | 116 | ||
119 | /* only use complete blocks */ | 117 | static struct crypto_alg aes_alg = { |
120 | nbytes &= ~(AES_BLOCK_SIZE - 1); | 118 | .cra_name = "aes", |
119 | .cra_driver_name = "aes-s390", | ||
120 | .cra_priority = CRYPT_S390_PRIORITY, | ||
121 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
122 | .cra_blocksize = AES_BLOCK_SIZE, | ||
123 | .cra_ctxsize = sizeof(struct s390_aes_ctx), | ||
124 | .cra_module = THIS_MODULE, | ||
125 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | ||
126 | .cra_u = { | ||
127 | .cipher = { | ||
128 | .cia_min_keysize = AES_MIN_KEY_SIZE, | ||
129 | .cia_max_keysize = AES_MAX_KEY_SIZE, | ||
130 | .cia_setkey = aes_set_key, | ||
131 | .cia_encrypt = aes_encrypt, | ||
132 | .cia_decrypt = aes_decrypt, | ||
133 | } | ||
134 | } | ||
135 | }; | ||
136 | |||
137 | static int ecb_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
138 | unsigned int key_len) | ||
139 | { | ||
140 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
121 | 141 | ||
122 | switch (sctx->key_len) { | 142 | switch (key_len) { |
123 | case 16: | 143 | case 16: |
124 | ret = crypt_s390_km(KM_AES_128_ENCRYPT, &sctx->key, out, in, nbytes); | 144 | sctx->enc = KM_AES_128_ENCRYPT; |
125 | BUG_ON((ret < 0) || (ret != nbytes)); | 145 | sctx->dec = KM_AES_128_DECRYPT; |
126 | break; | 146 | break; |
127 | case 24: | 147 | case 24: |
128 | ret = crypt_s390_km(KM_AES_192_ENCRYPT, &sctx->key, out, in, nbytes); | 148 | sctx->enc = KM_AES_192_ENCRYPT; |
129 | BUG_ON((ret < 0) || (ret != nbytes)); | 149 | sctx->dec = KM_AES_192_DECRYPT; |
130 | break; | 150 | break; |
131 | case 32: | 151 | case 32: |
132 | ret = crypt_s390_km(KM_AES_256_ENCRYPT, &sctx->key, out, in, nbytes); | 152 | sctx->enc = KM_AES_256_ENCRYPT; |
133 | BUG_ON((ret < 0) || (ret != nbytes)); | 153 | sctx->dec = KM_AES_256_DECRYPT; |
134 | break; | 154 | break; |
135 | } | 155 | } |
136 | return nbytes; | 156 | |
157 | return aes_set_key(tfm, in_key, key_len); | ||
137 | } | 158 | } |
138 | 159 | ||
139 | static unsigned int aes_decrypt_ecb(const struct cipher_desc *desc, u8 *out, | 160 | static int ecb_aes_crypt(struct blkcipher_desc *desc, long func, void *param, |
140 | const u8 *in, unsigned int nbytes) | 161 | struct blkcipher_walk *walk) |
141 | { | 162 | { |
142 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 163 | int ret = blkcipher_walk_virt(desc, walk); |
143 | int ret; | 164 | unsigned int nbytes; |
144 | 165 | ||
145 | /* only use complete blocks */ | 166 | while ((nbytes = walk->nbytes)) { |
146 | nbytes &= ~(AES_BLOCK_SIZE - 1); | 167 | /* only use complete blocks */ |
168 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); | ||
169 | u8 *out = walk->dst.virt.addr; | ||
170 | u8 *in = walk->src.virt.addr; | ||
147 | 171 | ||
148 | switch (sctx->key_len) { | 172 | ret = crypt_s390_km(func, param, out, in, n); |
149 | case 16: | 173 | BUG_ON((ret < 0) || (ret != n)); |
150 | ret = crypt_s390_km(KM_AES_128_DECRYPT, &sctx->key, out, in, nbytes); | 174 | |
151 | BUG_ON((ret < 0) || (ret != nbytes)); | 175 | nbytes &= AES_BLOCK_SIZE - 1; |
152 | break; | 176 | ret = blkcipher_walk_done(desc, walk, nbytes); |
153 | case 24: | ||
154 | ret = crypt_s390_km(KM_AES_192_DECRYPT, &sctx->key, out, in, nbytes); | ||
155 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
156 | break; | ||
157 | case 32: | ||
158 | ret = crypt_s390_km(KM_AES_256_DECRYPT, &sctx->key, out, in, nbytes); | ||
159 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
160 | break; | ||
161 | } | 177 | } |
162 | return nbytes; | 178 | |
179 | return ret; | ||
163 | } | 180 | } |
164 | 181 | ||
165 | static unsigned int aes_encrypt_cbc(const struct cipher_desc *desc, u8 *out, | 182 | static int ecb_aes_encrypt(struct blkcipher_desc *desc, |
166 | const u8 *in, unsigned int nbytes) | 183 | struct scatterlist *dst, struct scatterlist *src, |
184 | unsigned int nbytes) | ||
167 | { | 185 | { |
168 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 186 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
169 | int ret; | 187 | struct blkcipher_walk walk; |
170 | 188 | ||
171 | /* only use complete blocks */ | 189 | blkcipher_walk_init(&walk, dst, src, nbytes); |
172 | nbytes &= ~(AES_BLOCK_SIZE - 1); | 190 | return ecb_aes_crypt(desc, sctx->enc, sctx->key, &walk); |
191 | } | ||
173 | 192 | ||
174 | memcpy(&sctx->iv, desc->info, AES_BLOCK_SIZE); | 193 | static int ecb_aes_decrypt(struct blkcipher_desc *desc, |
175 | switch (sctx->key_len) { | 194 | struct scatterlist *dst, struct scatterlist *src, |
195 | unsigned int nbytes) | ||
196 | { | ||
197 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
198 | struct blkcipher_walk walk; | ||
199 | |||
200 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
201 | return ecb_aes_crypt(desc, sctx->dec, sctx->key, &walk); | ||
202 | } | ||
203 | |||
204 | static struct crypto_alg ecb_aes_alg = { | ||
205 | .cra_name = "ecb(aes)", | ||
206 | .cra_driver_name = "ecb-aes-s390", | ||
207 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, | ||
208 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
209 | .cra_blocksize = AES_BLOCK_SIZE, | ||
210 | .cra_ctxsize = sizeof(struct s390_aes_ctx), | ||
211 | .cra_type = &crypto_blkcipher_type, | ||
212 | .cra_module = THIS_MODULE, | ||
213 | .cra_list = LIST_HEAD_INIT(ecb_aes_alg.cra_list), | ||
214 | .cra_u = { | ||
215 | .blkcipher = { | ||
216 | .min_keysize = AES_MIN_KEY_SIZE, | ||
217 | .max_keysize = AES_MAX_KEY_SIZE, | ||
218 | .setkey = ecb_aes_set_key, | ||
219 | .encrypt = ecb_aes_encrypt, | ||
220 | .decrypt = ecb_aes_decrypt, | ||
221 | } | ||
222 | } | ||
223 | }; | ||
224 | |||
225 | static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | ||
226 | unsigned int key_len) | ||
227 | { | ||
228 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm); | ||
229 | |||
230 | switch (key_len) { | ||
176 | case 16: | 231 | case 16: |
177 | ret = crypt_s390_kmc(KMC_AES_128_ENCRYPT, &sctx->iv, out, in, nbytes); | 232 | sctx->enc = KMC_AES_128_ENCRYPT; |
178 | BUG_ON((ret < 0) || (ret != nbytes)); | 233 | sctx->dec = KMC_AES_128_DECRYPT; |
179 | break; | 234 | break; |
180 | case 24: | 235 | case 24: |
181 | ret = crypt_s390_kmc(KMC_AES_192_ENCRYPT, &sctx->iv, out, in, nbytes); | 236 | sctx->enc = KMC_AES_192_ENCRYPT; |
182 | BUG_ON((ret < 0) || (ret != nbytes)); | 237 | sctx->dec = KMC_AES_192_DECRYPT; |
183 | break; | 238 | break; |
184 | case 32: | 239 | case 32: |
185 | ret = crypt_s390_kmc(KMC_AES_256_ENCRYPT, &sctx->iv, out, in, nbytes); | 240 | sctx->enc = KMC_AES_256_ENCRYPT; |
186 | BUG_ON((ret < 0) || (ret != nbytes)); | 241 | sctx->dec = KMC_AES_256_DECRYPT; |
187 | break; | 242 | break; |
188 | } | 243 | } |
189 | memcpy(desc->info, &sctx->iv, AES_BLOCK_SIZE); | ||
190 | 244 | ||
191 | return nbytes; | 245 | return aes_set_key(tfm, in_key, key_len); |
192 | } | 246 | } |
193 | 247 | ||
194 | static unsigned int aes_decrypt_cbc(const struct cipher_desc *desc, u8 *out, | 248 | static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param, |
195 | const u8 *in, unsigned int nbytes) | 249 | struct blkcipher_walk *walk) |
196 | { | 250 | { |
197 | struct s390_aes_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 251 | int ret = blkcipher_walk_virt(desc, walk); |
198 | int ret; | 252 | unsigned int nbytes = walk->nbytes; |
199 | 253 | ||
200 | /* only use complete blocks */ | 254 | if (!nbytes) |
201 | nbytes &= ~(AES_BLOCK_SIZE - 1); | 255 | goto out; |
202 | 256 | ||
203 | memcpy(&sctx->iv, desc->info, AES_BLOCK_SIZE); | 257 | memcpy(param, walk->iv, AES_BLOCK_SIZE); |
204 | switch (sctx->key_len) { | 258 | do { |
205 | case 16: | 259 | /* only use complete blocks */ |
206 | ret = crypt_s390_kmc(KMC_AES_128_DECRYPT, &sctx->iv, out, in, nbytes); | 260 | unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1); |
207 | BUG_ON((ret < 0) || (ret != nbytes)); | 261 | u8 *out = walk->dst.virt.addr; |
208 | break; | 262 | u8 *in = walk->src.virt.addr; |
209 | case 24: | 263 | |
210 | ret = crypt_s390_kmc(KMC_AES_192_DECRYPT, &sctx->iv, out, in, nbytes); | 264 | ret = crypt_s390_kmc(func, param, out, in, n); |
211 | BUG_ON((ret < 0) || (ret != nbytes)); | 265 | BUG_ON((ret < 0) || (ret != n)); |
212 | break; | 266 | |
213 | case 32: | 267 | nbytes &= AES_BLOCK_SIZE - 1; |
214 | ret = crypt_s390_kmc(KMC_AES_256_DECRYPT, &sctx->iv, out, in, nbytes); | 268 | ret = blkcipher_walk_done(desc, walk, nbytes); |
215 | BUG_ON((ret < 0) || (ret != nbytes)); | 269 | } while ((nbytes = walk->nbytes)); |
216 | break; | 270 | memcpy(walk->iv, param, AES_BLOCK_SIZE); |
217 | } | 271 | |
218 | return nbytes; | 272 | out: |
273 | return ret; | ||
219 | } | 274 | } |
220 | 275 | ||
276 | static int cbc_aes_encrypt(struct blkcipher_desc *desc, | ||
277 | struct scatterlist *dst, struct scatterlist *src, | ||
278 | unsigned int nbytes) | ||
279 | { | ||
280 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
281 | struct blkcipher_walk walk; | ||
221 | 282 | ||
222 | static struct crypto_alg aes_alg = { | 283 | blkcipher_walk_init(&walk, dst, src, nbytes); |
223 | .cra_name = "aes", | 284 | return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk); |
224 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 285 | } |
286 | |||
287 | static int cbc_aes_decrypt(struct blkcipher_desc *desc, | ||
288 | struct scatterlist *dst, struct scatterlist *src, | ||
289 | unsigned int nbytes) | ||
290 | { | ||
291 | struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
292 | struct blkcipher_walk walk; | ||
293 | |||
294 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
295 | return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk); | ||
296 | } | ||
297 | |||
298 | static struct crypto_alg cbc_aes_alg = { | ||
299 | .cra_name = "cbc(aes)", | ||
300 | .cra_driver_name = "cbc-aes-s390", | ||
301 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, | ||
302 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
225 | .cra_blocksize = AES_BLOCK_SIZE, | 303 | .cra_blocksize = AES_BLOCK_SIZE, |
226 | .cra_ctxsize = sizeof(struct s390_aes_ctx), | 304 | .cra_ctxsize = sizeof(struct s390_aes_ctx), |
305 | .cra_type = &crypto_blkcipher_type, | ||
227 | .cra_module = THIS_MODULE, | 306 | .cra_module = THIS_MODULE, |
228 | .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), | 307 | .cra_list = LIST_HEAD_INIT(cbc_aes_alg.cra_list), |
229 | .cra_u = { | 308 | .cra_u = { |
230 | .cipher = { | 309 | .blkcipher = { |
231 | .cia_min_keysize = AES_MIN_KEY_SIZE, | 310 | .min_keysize = AES_MIN_KEY_SIZE, |
232 | .cia_max_keysize = AES_MAX_KEY_SIZE, | 311 | .max_keysize = AES_MAX_KEY_SIZE, |
233 | .cia_setkey = aes_set_key, | 312 | .ivsize = AES_BLOCK_SIZE, |
234 | .cia_encrypt = aes_encrypt, | 313 | .setkey = cbc_aes_set_key, |
235 | .cia_decrypt = aes_decrypt, | 314 | .encrypt = cbc_aes_encrypt, |
236 | .cia_encrypt_ecb = aes_encrypt_ecb, | 315 | .decrypt = cbc_aes_decrypt, |
237 | .cia_decrypt_ecb = aes_decrypt_ecb, | ||
238 | .cia_encrypt_cbc = aes_encrypt_cbc, | ||
239 | .cia_decrypt_cbc = aes_decrypt_cbc, | ||
240 | } | 316 | } |
241 | } | 317 | } |
242 | }; | 318 | }; |
@@ -256,13 +332,40 @@ static int __init aes_init(void) | |||
256 | return -ENOSYS; | 332 | return -ENOSYS; |
257 | 333 | ||
258 | ret = crypto_register_alg(&aes_alg); | 334 | ret = crypto_register_alg(&aes_alg); |
259 | if (ret != 0) | 335 | if (ret != 0) { |
260 | printk(KERN_INFO "crypt_s390: aes_s390 couldn't be loaded.\n"); | 336 | printk(KERN_INFO "crypt_s390: aes-s390 couldn't be loaded.\n"); |
337 | goto aes_err; | ||
338 | } | ||
339 | |||
340 | ret = crypto_register_alg(&ecb_aes_alg); | ||
341 | if (ret != 0) { | ||
342 | printk(KERN_INFO | ||
343 | "crypt_s390: ecb-aes-s390 couldn't be loaded.\n"); | ||
344 | goto ecb_aes_err; | ||
345 | } | ||
346 | |||
347 | ret = crypto_register_alg(&cbc_aes_alg); | ||
348 | if (ret != 0) { | ||
349 | printk(KERN_INFO | ||
350 | "crypt_s390: cbc-aes-s390 couldn't be loaded.\n"); | ||
351 | goto cbc_aes_err; | ||
352 | } | ||
353 | |||
354 | out: | ||
261 | return ret; | 355 | return ret; |
356 | |||
357 | cbc_aes_err: | ||
358 | crypto_unregister_alg(&ecb_aes_alg); | ||
359 | ecb_aes_err: | ||
360 | crypto_unregister_alg(&aes_alg); | ||
361 | aes_err: | ||
362 | goto out; | ||
262 | } | 363 | } |
263 | 364 | ||
264 | static void __exit aes_fini(void) | 365 | static void __exit aes_fini(void) |
265 | { | 366 | { |
367 | crypto_unregister_alg(&cbc_aes_alg); | ||
368 | crypto_unregister_alg(&ecb_aes_alg); | ||
266 | crypto_unregister_alg(&aes_alg); | 369 | crypto_unregister_alg(&aes_alg); |
267 | } | 370 | } |
268 | 371 | ||
diff --git a/arch/s390/crypto/crypt_s390.h b/arch/s390/crypto/crypt_s390.h index d1c259a7fe33..efd836c2e4a6 100644 --- a/arch/s390/crypto/crypt_s390.h +++ b/arch/s390/crypto/crypt_s390.h | |||
@@ -20,6 +20,9 @@ | |||
20 | #define CRYPT_S390_OP_MASK 0xFF00 | 20 | #define CRYPT_S390_OP_MASK 0xFF00 |
21 | #define CRYPT_S390_FUNC_MASK 0x00FF | 21 | #define CRYPT_S390_FUNC_MASK 0x00FF |
22 | 22 | ||
23 | #define CRYPT_S390_PRIORITY 300 | ||
24 | #define CRYPT_S390_COMPOSITE_PRIORITY 400 | ||
25 | |||
23 | /* s930 cryptographic operations */ | 26 | /* s930 cryptographic operations */ |
24 | enum crypt_s390_operations { | 27 | enum crypt_s390_operations { |
25 | CRYPT_S390_KM = 0x0100, | 28 | CRYPT_S390_KM = 0x0100, |
diff --git a/arch/s390/crypto/des_s390.c b/arch/s390/crypto/des_s390.c index b3f7496a79b4..2aba04852fe3 100644 --- a/arch/s390/crypto/des_s390.c +++ b/arch/s390/crypto/des_s390.c | |||
@@ -13,9 +13,10 @@ | |||
13 | * (at your option) any later version. | 13 | * (at your option) any later version. |
14 | * | 14 | * |
15 | */ | 15 | */ |
16 | |||
17 | #include <crypto/algapi.h> | ||
16 | #include <linux/init.h> | 18 | #include <linux/init.h> |
17 | #include <linux/module.h> | 19 | #include <linux/module.h> |
18 | #include <linux/crypto.h> | ||
19 | 20 | ||
20 | #include "crypt_s390.h" | 21 | #include "crypt_s390.h" |
21 | #include "crypto_des.h" | 22 | #include "crypto_des.h" |
@@ -45,9 +46,10 @@ struct crypt_s390_des3_192_ctx { | |||
45 | }; | 46 | }; |
46 | 47 | ||
47 | static int des_setkey(struct crypto_tfm *tfm, const u8 *key, | 48 | static int des_setkey(struct crypto_tfm *tfm, const u8 *key, |
48 | unsigned int keylen, u32 *flags) | 49 | unsigned int keylen) |
49 | { | 50 | { |
50 | struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm); | 51 | struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm); |
52 | u32 *flags = &tfm->crt_flags; | ||
51 | int ret; | 53 | int ret; |
52 | 54 | ||
53 | /* test if key is valid (not a weak key) */ | 55 | /* test if key is valid (not a weak key) */ |
@@ -71,85 +73,159 @@ static void des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | |||
71 | crypt_s390_km(KM_DEA_DECRYPT, dctx->key, out, in, DES_BLOCK_SIZE); | 73 | crypt_s390_km(KM_DEA_DECRYPT, dctx->key, out, in, DES_BLOCK_SIZE); |
72 | } | 74 | } |
73 | 75 | ||
74 | static unsigned int des_encrypt_ecb(const struct cipher_desc *desc, u8 *out, | 76 | static struct crypto_alg des_alg = { |
75 | const u8 *in, unsigned int nbytes) | 77 | .cra_name = "des", |
78 | .cra_driver_name = "des-s390", | ||
79 | .cra_priority = CRYPT_S390_PRIORITY, | ||
80 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
81 | .cra_blocksize = DES_BLOCK_SIZE, | ||
82 | .cra_ctxsize = sizeof(struct crypt_s390_des_ctx), | ||
83 | .cra_module = THIS_MODULE, | ||
84 | .cra_list = LIST_HEAD_INIT(des_alg.cra_list), | ||
85 | .cra_u = { | ||
86 | .cipher = { | ||
87 | .cia_min_keysize = DES_KEY_SIZE, | ||
88 | .cia_max_keysize = DES_KEY_SIZE, | ||
89 | .cia_setkey = des_setkey, | ||
90 | .cia_encrypt = des_encrypt, | ||
91 | .cia_decrypt = des_decrypt, | ||
92 | } | ||
93 | } | ||
94 | }; | ||
95 | |||
96 | static int ecb_desall_crypt(struct blkcipher_desc *desc, long func, | ||
97 | void *param, struct blkcipher_walk *walk) | ||
76 | { | 98 | { |
77 | struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 99 | int ret = blkcipher_walk_virt(desc, walk); |
78 | int ret; | 100 | unsigned int nbytes; |
101 | |||
102 | while ((nbytes = walk->nbytes)) { | ||
103 | /* only use complete blocks */ | ||
104 | unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1); | ||
105 | u8 *out = walk->dst.virt.addr; | ||
106 | u8 *in = walk->src.virt.addr; | ||
79 | 107 | ||
80 | /* only use complete blocks */ | 108 | ret = crypt_s390_km(func, param, out, in, n); |
81 | nbytes &= ~(DES_BLOCK_SIZE - 1); | 109 | BUG_ON((ret < 0) || (ret != n)); |
82 | ret = crypt_s390_km(KM_DEA_ENCRYPT, sctx->key, out, in, nbytes); | ||
83 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
84 | 110 | ||
85 | return nbytes; | 111 | nbytes &= DES_BLOCK_SIZE - 1; |
112 | ret = blkcipher_walk_done(desc, walk, nbytes); | ||
113 | } | ||
114 | |||
115 | return ret; | ||
86 | } | 116 | } |
87 | 117 | ||
88 | static unsigned int des_decrypt_ecb(const struct cipher_desc *desc, u8 *out, | 118 | static int cbc_desall_crypt(struct blkcipher_desc *desc, long func, |
89 | const u8 *in, unsigned int nbytes) | 119 | void *param, struct blkcipher_walk *walk) |
90 | { | 120 | { |
91 | struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 121 | int ret = blkcipher_walk_virt(desc, walk); |
92 | int ret; | 122 | unsigned int nbytes = walk->nbytes; |
123 | |||
124 | if (!nbytes) | ||
125 | goto out; | ||
126 | |||
127 | memcpy(param, walk->iv, DES_BLOCK_SIZE); | ||
128 | do { | ||
129 | /* only use complete blocks */ | ||
130 | unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1); | ||
131 | u8 *out = walk->dst.virt.addr; | ||
132 | u8 *in = walk->src.virt.addr; | ||
93 | 133 | ||
94 | /* only use complete blocks */ | 134 | ret = crypt_s390_kmc(func, param, out, in, n); |
95 | nbytes &= ~(DES_BLOCK_SIZE - 1); | 135 | BUG_ON((ret < 0) || (ret != n)); |
96 | ret = crypt_s390_km(KM_DEA_DECRYPT, sctx->key, out, in, nbytes); | ||
97 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
98 | 136 | ||
99 | return nbytes; | 137 | nbytes &= DES_BLOCK_SIZE - 1; |
138 | ret = blkcipher_walk_done(desc, walk, nbytes); | ||
139 | } while ((nbytes = walk->nbytes)); | ||
140 | memcpy(walk->iv, param, DES_BLOCK_SIZE); | ||
141 | |||
142 | out: | ||
143 | return ret; | ||
100 | } | 144 | } |
101 | 145 | ||
102 | static unsigned int des_encrypt_cbc(const struct cipher_desc *desc, u8 *out, | 146 | static int ecb_des_encrypt(struct blkcipher_desc *desc, |
103 | const u8 *in, unsigned int nbytes) | 147 | struct scatterlist *dst, struct scatterlist *src, |
148 | unsigned int nbytes) | ||
104 | { | 149 | { |
105 | struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 150 | struct crypt_s390_des_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
106 | int ret; | 151 | struct blkcipher_walk walk; |
107 | 152 | ||
108 | /* only use complete blocks */ | 153 | blkcipher_walk_init(&walk, dst, src, nbytes); |
109 | nbytes &= ~(DES_BLOCK_SIZE - 1); | 154 | return ecb_desall_crypt(desc, KM_DEA_ENCRYPT, sctx->key, &walk); |
155 | } | ||
110 | 156 | ||
111 | memcpy(sctx->iv, desc->info, DES_BLOCK_SIZE); | 157 | static int ecb_des_decrypt(struct blkcipher_desc *desc, |
112 | ret = crypt_s390_kmc(KMC_DEA_ENCRYPT, &sctx->iv, out, in, nbytes); | 158 | struct scatterlist *dst, struct scatterlist *src, |
113 | BUG_ON((ret < 0) || (ret != nbytes)); | 159 | unsigned int nbytes) |
160 | { | ||
161 | struct crypt_s390_des_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
162 | struct blkcipher_walk walk; | ||
114 | 163 | ||
115 | memcpy(desc->info, sctx->iv, DES_BLOCK_SIZE); | 164 | blkcipher_walk_init(&walk, dst, src, nbytes); |
116 | return nbytes; | 165 | return ecb_desall_crypt(desc, KM_DEA_DECRYPT, sctx->key, &walk); |
117 | } | 166 | } |
118 | 167 | ||
119 | static unsigned int des_decrypt_cbc(const struct cipher_desc *desc, u8 *out, | 168 | static struct crypto_alg ecb_des_alg = { |
120 | const u8 *in, unsigned int nbytes) | 169 | .cra_name = "ecb(des)", |
170 | .cra_driver_name = "ecb-des-s390", | ||
171 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, | ||
172 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
173 | .cra_blocksize = DES_BLOCK_SIZE, | ||
174 | .cra_ctxsize = sizeof(struct crypt_s390_des_ctx), | ||
175 | .cra_type = &crypto_blkcipher_type, | ||
176 | .cra_module = THIS_MODULE, | ||
177 | .cra_list = LIST_HEAD_INIT(ecb_des_alg.cra_list), | ||
178 | .cra_u = { | ||
179 | .blkcipher = { | ||
180 | .min_keysize = DES_KEY_SIZE, | ||
181 | .max_keysize = DES_KEY_SIZE, | ||
182 | .setkey = des_setkey, | ||
183 | .encrypt = ecb_des_encrypt, | ||
184 | .decrypt = ecb_des_decrypt, | ||
185 | } | ||
186 | } | ||
187 | }; | ||
188 | |||
189 | static int cbc_des_encrypt(struct blkcipher_desc *desc, | ||
190 | struct scatterlist *dst, struct scatterlist *src, | ||
191 | unsigned int nbytes) | ||
121 | { | 192 | { |
122 | struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 193 | struct crypt_s390_des_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
123 | int ret; | 194 | struct blkcipher_walk walk; |
124 | 195 | ||
125 | /* only use complete blocks */ | 196 | blkcipher_walk_init(&walk, dst, src, nbytes); |
126 | nbytes &= ~(DES_BLOCK_SIZE - 1); | 197 | return cbc_desall_crypt(desc, KMC_DEA_ENCRYPT, sctx->iv, &walk); |
198 | } | ||
127 | 199 | ||
128 | memcpy(&sctx->iv, desc->info, DES_BLOCK_SIZE); | 200 | static int cbc_des_decrypt(struct blkcipher_desc *desc, |
129 | ret = crypt_s390_kmc(KMC_DEA_DECRYPT, &sctx->iv, out, in, nbytes); | 201 | struct scatterlist *dst, struct scatterlist *src, |
130 | BUG_ON((ret < 0) || (ret != nbytes)); | 202 | unsigned int nbytes) |
203 | { | ||
204 | struct crypt_s390_des_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
205 | struct blkcipher_walk walk; | ||
131 | 206 | ||
132 | return nbytes; | 207 | blkcipher_walk_init(&walk, dst, src, nbytes); |
208 | return cbc_desall_crypt(desc, KMC_DEA_DECRYPT, sctx->iv, &walk); | ||
133 | } | 209 | } |
134 | 210 | ||
135 | static struct crypto_alg des_alg = { | 211 | static struct crypto_alg cbc_des_alg = { |
136 | .cra_name = "des", | 212 | .cra_name = "cbc(des)", |
137 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 213 | .cra_driver_name = "cbc-des-s390", |
214 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, | ||
215 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
138 | .cra_blocksize = DES_BLOCK_SIZE, | 216 | .cra_blocksize = DES_BLOCK_SIZE, |
139 | .cra_ctxsize = sizeof(struct crypt_s390_des_ctx), | 217 | .cra_ctxsize = sizeof(struct crypt_s390_des_ctx), |
218 | .cra_type = &crypto_blkcipher_type, | ||
140 | .cra_module = THIS_MODULE, | 219 | .cra_module = THIS_MODULE, |
141 | .cra_list = LIST_HEAD_INIT(des_alg.cra_list), | 220 | .cra_list = LIST_HEAD_INIT(cbc_des_alg.cra_list), |
142 | .cra_u = { | 221 | .cra_u = { |
143 | .cipher = { | 222 | .blkcipher = { |
144 | .cia_min_keysize = DES_KEY_SIZE, | 223 | .min_keysize = DES_KEY_SIZE, |
145 | .cia_max_keysize = DES_KEY_SIZE, | 224 | .max_keysize = DES_KEY_SIZE, |
146 | .cia_setkey = des_setkey, | 225 | .ivsize = DES_BLOCK_SIZE, |
147 | .cia_encrypt = des_encrypt, | 226 | .setkey = des_setkey, |
148 | .cia_decrypt = des_decrypt, | 227 | .encrypt = cbc_des_encrypt, |
149 | .cia_encrypt_ecb = des_encrypt_ecb, | 228 | .decrypt = cbc_des_decrypt, |
150 | .cia_decrypt_ecb = des_decrypt_ecb, | ||
151 | .cia_encrypt_cbc = des_encrypt_cbc, | ||
152 | .cia_decrypt_cbc = des_decrypt_cbc, | ||
153 | } | 229 | } |
154 | } | 230 | } |
155 | }; | 231 | }; |
@@ -167,11 +243,12 @@ static struct crypto_alg des_alg = { | |||
167 | * | 243 | * |
168 | */ | 244 | */ |
169 | static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key, | 245 | static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key, |
170 | unsigned int keylen, u32 *flags) | 246 | unsigned int keylen) |
171 | { | 247 | { |
172 | int i, ret; | 248 | int i, ret; |
173 | struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm); | 249 | struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm); |
174 | const u8* temp_key = key; | 250 | const u8 *temp_key = key; |
251 | u32 *flags = &tfm->crt_flags; | ||
175 | 252 | ||
176 | if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) { | 253 | if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) { |
177 | *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED; | 254 | *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED; |
@@ -202,89 +279,111 @@ static void des3_128_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | |||
202 | DES3_128_BLOCK_SIZE); | 279 | DES3_128_BLOCK_SIZE); |
203 | } | 280 | } |
204 | 281 | ||
205 | static unsigned int des3_128_encrypt_ecb(const struct cipher_desc *desc, | 282 | static struct crypto_alg des3_128_alg = { |
206 | u8 *out, const u8 *in, | 283 | .cra_name = "des3_ede128", |
207 | unsigned int nbytes) | 284 | .cra_driver_name = "des3_ede128-s390", |
208 | { | 285 | .cra_priority = CRYPT_S390_PRIORITY, |
209 | struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 286 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, |
210 | int ret; | 287 | .cra_blocksize = DES3_128_BLOCK_SIZE, |
288 | .cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx), | ||
289 | .cra_module = THIS_MODULE, | ||
290 | .cra_list = LIST_HEAD_INIT(des3_128_alg.cra_list), | ||
291 | .cra_u = { | ||
292 | .cipher = { | ||
293 | .cia_min_keysize = DES3_128_KEY_SIZE, | ||
294 | .cia_max_keysize = DES3_128_KEY_SIZE, | ||
295 | .cia_setkey = des3_128_setkey, | ||
296 | .cia_encrypt = des3_128_encrypt, | ||
297 | .cia_decrypt = des3_128_decrypt, | ||
298 | } | ||
299 | } | ||
300 | }; | ||
211 | 301 | ||
212 | /* only use complete blocks */ | 302 | static int ecb_des3_128_encrypt(struct blkcipher_desc *desc, |
213 | nbytes &= ~(DES3_128_BLOCK_SIZE - 1); | 303 | struct scatterlist *dst, |
214 | ret = crypt_s390_km(KM_TDEA_128_ENCRYPT, sctx->key, out, in, nbytes); | 304 | struct scatterlist *src, unsigned int nbytes) |
215 | BUG_ON((ret < 0) || (ret != nbytes)); | 305 | { |
306 | struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
307 | struct blkcipher_walk walk; | ||
216 | 308 | ||
217 | return nbytes; | 309 | blkcipher_walk_init(&walk, dst, src, nbytes); |
310 | return ecb_desall_crypt(desc, KM_TDEA_128_ENCRYPT, sctx->key, &walk); | ||
218 | } | 311 | } |
219 | 312 | ||
220 | static unsigned int des3_128_decrypt_ecb(const struct cipher_desc *desc, | 313 | static int ecb_des3_128_decrypt(struct blkcipher_desc *desc, |
221 | u8 *out, const u8 *in, | 314 | struct scatterlist *dst, |
222 | unsigned int nbytes) | 315 | struct scatterlist *src, unsigned int nbytes) |
223 | { | 316 | { |
224 | struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 317 | struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
225 | int ret; | 318 | struct blkcipher_walk walk; |
226 | 319 | ||
227 | /* only use complete blocks */ | 320 | blkcipher_walk_init(&walk, dst, src, nbytes); |
228 | nbytes &= ~(DES3_128_BLOCK_SIZE - 1); | 321 | return ecb_desall_crypt(desc, KM_TDEA_128_DECRYPT, sctx->key, &walk); |
229 | ret = crypt_s390_km(KM_TDEA_128_DECRYPT, sctx->key, out, in, nbytes); | ||
230 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
231 | |||
232 | return nbytes; | ||
233 | } | 322 | } |
234 | 323 | ||
235 | static unsigned int des3_128_encrypt_cbc(const struct cipher_desc *desc, | 324 | static struct crypto_alg ecb_des3_128_alg = { |
236 | u8 *out, const u8 *in, | 325 | .cra_name = "ecb(des3_ede128)", |
237 | unsigned int nbytes) | 326 | .cra_driver_name = "ecb-des3_ede128-s390", |
238 | { | 327 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, |
239 | struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 328 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, |
240 | int ret; | 329 | .cra_blocksize = DES3_128_BLOCK_SIZE, |
241 | 330 | .cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx), | |
242 | /* only use complete blocks */ | 331 | .cra_type = &crypto_blkcipher_type, |
243 | nbytes &= ~(DES3_128_BLOCK_SIZE - 1); | 332 | .cra_module = THIS_MODULE, |
333 | .cra_list = LIST_HEAD_INIT( | ||
334 | ecb_des3_128_alg.cra_list), | ||
335 | .cra_u = { | ||
336 | .blkcipher = { | ||
337 | .min_keysize = DES3_128_KEY_SIZE, | ||
338 | .max_keysize = DES3_128_KEY_SIZE, | ||
339 | .setkey = des3_128_setkey, | ||
340 | .encrypt = ecb_des3_128_encrypt, | ||
341 | .decrypt = ecb_des3_128_decrypt, | ||
342 | } | ||
343 | } | ||
344 | }; | ||
244 | 345 | ||
245 | memcpy(sctx->iv, desc->info, DES3_128_BLOCK_SIZE); | 346 | static int cbc_des3_128_encrypt(struct blkcipher_desc *desc, |
246 | ret = crypt_s390_kmc(KMC_TDEA_128_ENCRYPT, &sctx->iv, out, in, nbytes); | 347 | struct scatterlist *dst, |
247 | BUG_ON((ret < 0) || (ret != nbytes)); | 348 | struct scatterlist *src, unsigned int nbytes) |
349 | { | ||
350 | struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
351 | struct blkcipher_walk walk; | ||
248 | 352 | ||
249 | memcpy(desc->info, sctx->iv, DES3_128_BLOCK_SIZE); | 353 | blkcipher_walk_init(&walk, dst, src, nbytes); |
250 | return nbytes; | 354 | return cbc_desall_crypt(desc, KMC_TDEA_128_ENCRYPT, sctx->iv, &walk); |
251 | } | 355 | } |
252 | 356 | ||
253 | static unsigned int des3_128_decrypt_cbc(const struct cipher_desc *desc, | 357 | static int cbc_des3_128_decrypt(struct blkcipher_desc *desc, |
254 | u8 *out, const u8 *in, | 358 | struct scatterlist *dst, |
255 | unsigned int nbytes) | 359 | struct scatterlist *src, unsigned int nbytes) |
256 | { | 360 | { |
257 | struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 361 | struct crypt_s390_des3_128_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
258 | int ret; | 362 | struct blkcipher_walk walk; |
259 | |||
260 | /* only use complete blocks */ | ||
261 | nbytes &= ~(DES3_128_BLOCK_SIZE - 1); | ||
262 | |||
263 | memcpy(&sctx->iv, desc->info, DES3_128_BLOCK_SIZE); | ||
264 | ret = crypt_s390_kmc(KMC_TDEA_128_DECRYPT, &sctx->iv, out, in, nbytes); | ||
265 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
266 | 363 | ||
267 | return nbytes; | 364 | blkcipher_walk_init(&walk, dst, src, nbytes); |
365 | return cbc_desall_crypt(desc, KMC_TDEA_128_DECRYPT, sctx->iv, &walk); | ||
268 | } | 366 | } |
269 | 367 | ||
270 | static struct crypto_alg des3_128_alg = { | 368 | static struct crypto_alg cbc_des3_128_alg = { |
271 | .cra_name = "des3_ede128", | 369 | .cra_name = "cbc(des3_ede128)", |
272 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 370 | .cra_driver_name = "cbc-des3_ede128-s390", |
371 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, | ||
372 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
273 | .cra_blocksize = DES3_128_BLOCK_SIZE, | 373 | .cra_blocksize = DES3_128_BLOCK_SIZE, |
274 | .cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx), | 374 | .cra_ctxsize = sizeof(struct crypt_s390_des3_128_ctx), |
375 | .cra_type = &crypto_blkcipher_type, | ||
275 | .cra_module = THIS_MODULE, | 376 | .cra_module = THIS_MODULE, |
276 | .cra_list = LIST_HEAD_INIT(des3_128_alg.cra_list), | 377 | .cra_list = LIST_HEAD_INIT( |
378 | cbc_des3_128_alg.cra_list), | ||
277 | .cra_u = { | 379 | .cra_u = { |
278 | .cipher = { | 380 | .blkcipher = { |
279 | .cia_min_keysize = DES3_128_KEY_SIZE, | 381 | .min_keysize = DES3_128_KEY_SIZE, |
280 | .cia_max_keysize = DES3_128_KEY_SIZE, | 382 | .max_keysize = DES3_128_KEY_SIZE, |
281 | .cia_setkey = des3_128_setkey, | 383 | .ivsize = DES3_128_BLOCK_SIZE, |
282 | .cia_encrypt = des3_128_encrypt, | 384 | .setkey = des3_128_setkey, |
283 | .cia_decrypt = des3_128_decrypt, | 385 | .encrypt = cbc_des3_128_encrypt, |
284 | .cia_encrypt_ecb = des3_128_encrypt_ecb, | 386 | .decrypt = cbc_des3_128_decrypt, |
285 | .cia_decrypt_ecb = des3_128_decrypt_ecb, | ||
286 | .cia_encrypt_cbc = des3_128_encrypt_cbc, | ||
287 | .cia_decrypt_cbc = des3_128_decrypt_cbc, | ||
288 | } | 387 | } |
289 | } | 388 | } |
290 | }; | 389 | }; |
@@ -303,11 +402,12 @@ static struct crypto_alg des3_128_alg = { | |||
303 | * | 402 | * |
304 | */ | 403 | */ |
305 | static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key, | 404 | static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key, |
306 | unsigned int keylen, u32 *flags) | 405 | unsigned int keylen) |
307 | { | 406 | { |
308 | int i, ret; | 407 | int i, ret; |
309 | struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm); | 408 | struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm); |
310 | const u8* temp_key = key; | 409 | const u8 *temp_key = key; |
410 | u32 *flags = &tfm->crt_flags; | ||
311 | 411 | ||
312 | if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) && | 412 | if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) && |
313 | memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2], | 413 | memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2], |
@@ -341,89 +441,111 @@ static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | |||
341 | DES3_192_BLOCK_SIZE); | 441 | DES3_192_BLOCK_SIZE); |
342 | } | 442 | } |
343 | 443 | ||
344 | static unsigned int des3_192_encrypt_ecb(const struct cipher_desc *desc, | 444 | static struct crypto_alg des3_192_alg = { |
345 | u8 *out, const u8 *in, | 445 | .cra_name = "des3_ede", |
346 | unsigned int nbytes) | 446 | .cra_driver_name = "des3_ede-s390", |
347 | { | 447 | .cra_priority = CRYPT_S390_PRIORITY, |
348 | struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 448 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, |
349 | int ret; | 449 | .cra_blocksize = DES3_192_BLOCK_SIZE, |
450 | .cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx), | ||
451 | .cra_module = THIS_MODULE, | ||
452 | .cra_list = LIST_HEAD_INIT(des3_192_alg.cra_list), | ||
453 | .cra_u = { | ||
454 | .cipher = { | ||
455 | .cia_min_keysize = DES3_192_KEY_SIZE, | ||
456 | .cia_max_keysize = DES3_192_KEY_SIZE, | ||
457 | .cia_setkey = des3_192_setkey, | ||
458 | .cia_encrypt = des3_192_encrypt, | ||
459 | .cia_decrypt = des3_192_decrypt, | ||
460 | } | ||
461 | } | ||
462 | }; | ||
350 | 463 | ||
351 | /* only use complete blocks */ | 464 | static int ecb_des3_192_encrypt(struct blkcipher_desc *desc, |
352 | nbytes &= ~(DES3_192_BLOCK_SIZE - 1); | 465 | struct scatterlist *dst, |
353 | ret = crypt_s390_km(KM_TDEA_192_ENCRYPT, sctx->key, out, in, nbytes); | 466 | struct scatterlist *src, unsigned int nbytes) |
354 | BUG_ON((ret < 0) || (ret != nbytes)); | 467 | { |
468 | struct crypt_s390_des3_192_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
469 | struct blkcipher_walk walk; | ||
355 | 470 | ||
356 | return nbytes; | 471 | blkcipher_walk_init(&walk, dst, src, nbytes); |
472 | return ecb_desall_crypt(desc, KM_TDEA_192_ENCRYPT, sctx->key, &walk); | ||
357 | } | 473 | } |
358 | 474 | ||
359 | static unsigned int des3_192_decrypt_ecb(const struct cipher_desc *desc, | 475 | static int ecb_des3_192_decrypt(struct blkcipher_desc *desc, |
360 | u8 *out, const u8 *in, | 476 | struct scatterlist *dst, |
361 | unsigned int nbytes) | 477 | struct scatterlist *src, unsigned int nbytes) |
362 | { | 478 | { |
363 | struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 479 | struct crypt_s390_des3_192_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
364 | int ret; | 480 | struct blkcipher_walk walk; |
365 | |||
366 | /* only use complete blocks */ | ||
367 | nbytes &= ~(DES3_192_BLOCK_SIZE - 1); | ||
368 | ret = crypt_s390_km(KM_TDEA_192_DECRYPT, sctx->key, out, in, nbytes); | ||
369 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
370 | 481 | ||
371 | return nbytes; | 482 | blkcipher_walk_init(&walk, dst, src, nbytes); |
483 | return ecb_desall_crypt(desc, KM_TDEA_192_DECRYPT, sctx->key, &walk); | ||
372 | } | 484 | } |
373 | 485 | ||
374 | static unsigned int des3_192_encrypt_cbc(const struct cipher_desc *desc, | 486 | static struct crypto_alg ecb_des3_192_alg = { |
375 | u8 *out, const u8 *in, | 487 | .cra_name = "ecb(des3_ede)", |
376 | unsigned int nbytes) | 488 | .cra_driver_name = "ecb-des3_ede-s390", |
377 | { | 489 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, |
378 | struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 490 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, |
379 | int ret; | 491 | .cra_blocksize = DES3_192_BLOCK_SIZE, |
380 | 492 | .cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx), | |
381 | /* only use complete blocks */ | 493 | .cra_type = &crypto_blkcipher_type, |
382 | nbytes &= ~(DES3_192_BLOCK_SIZE - 1); | 494 | .cra_module = THIS_MODULE, |
495 | .cra_list = LIST_HEAD_INIT( | ||
496 | ecb_des3_192_alg.cra_list), | ||
497 | .cra_u = { | ||
498 | .blkcipher = { | ||
499 | .min_keysize = DES3_192_KEY_SIZE, | ||
500 | .max_keysize = DES3_192_KEY_SIZE, | ||
501 | .setkey = des3_192_setkey, | ||
502 | .encrypt = ecb_des3_192_encrypt, | ||
503 | .decrypt = ecb_des3_192_decrypt, | ||
504 | } | ||
505 | } | ||
506 | }; | ||
383 | 507 | ||
384 | memcpy(sctx->iv, desc->info, DES3_192_BLOCK_SIZE); | 508 | static int cbc_des3_192_encrypt(struct blkcipher_desc *desc, |
385 | ret = crypt_s390_kmc(KMC_TDEA_192_ENCRYPT, &sctx->iv, out, in, nbytes); | 509 | struct scatterlist *dst, |
386 | BUG_ON((ret < 0) || (ret != nbytes)); | 510 | struct scatterlist *src, unsigned int nbytes) |
511 | { | ||
512 | struct crypt_s390_des3_192_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); | ||
513 | struct blkcipher_walk walk; | ||
387 | 514 | ||
388 | memcpy(desc->info, sctx->iv, DES3_192_BLOCK_SIZE); | 515 | blkcipher_walk_init(&walk, dst, src, nbytes); |
389 | return nbytes; | 516 | return cbc_desall_crypt(desc, KMC_TDEA_192_ENCRYPT, sctx->iv, &walk); |
390 | } | 517 | } |
391 | 518 | ||
392 | static unsigned int des3_192_decrypt_cbc(const struct cipher_desc *desc, | 519 | static int cbc_des3_192_decrypt(struct blkcipher_desc *desc, |
393 | u8 *out, const u8 *in, | 520 | struct scatterlist *dst, |
394 | unsigned int nbytes) | 521 | struct scatterlist *src, unsigned int nbytes) |
395 | { | 522 | { |
396 | struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm); | 523 | struct crypt_s390_des3_192_ctx *sctx = crypto_blkcipher_ctx(desc->tfm); |
397 | int ret; | 524 | struct blkcipher_walk walk; |
398 | 525 | ||
399 | /* only use complete blocks */ | 526 | blkcipher_walk_init(&walk, dst, src, nbytes); |
400 | nbytes &= ~(DES3_192_BLOCK_SIZE - 1); | 527 | return cbc_desall_crypt(desc, KMC_TDEA_192_DECRYPT, sctx->iv, &walk); |
401 | |||
402 | memcpy(&sctx->iv, desc->info, DES3_192_BLOCK_SIZE); | ||
403 | ret = crypt_s390_kmc(KMC_TDEA_192_DECRYPT, &sctx->iv, out, in, nbytes); | ||
404 | BUG_ON((ret < 0) || (ret != nbytes)); | ||
405 | |||
406 | return nbytes; | ||
407 | } | 528 | } |
408 | 529 | ||
409 | static struct crypto_alg des3_192_alg = { | 530 | static struct crypto_alg cbc_des3_192_alg = { |
410 | .cra_name = "des3_ede", | 531 | .cra_name = "cbc(des3_ede)", |
411 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | 532 | .cra_driver_name = "cbc-des3_ede-s390", |
533 | .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, | ||
534 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
412 | .cra_blocksize = DES3_192_BLOCK_SIZE, | 535 | .cra_blocksize = DES3_192_BLOCK_SIZE, |
413 | .cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx), | 536 | .cra_ctxsize = sizeof(struct crypt_s390_des3_192_ctx), |
537 | .cra_type = &crypto_blkcipher_type, | ||
414 | .cra_module = THIS_MODULE, | 538 | .cra_module = THIS_MODULE, |
415 | .cra_list = LIST_HEAD_INIT(des3_192_alg.cra_list), | 539 | .cra_list = LIST_HEAD_INIT( |
540 | cbc_des3_192_alg.cra_list), | ||
416 | .cra_u = { | 541 | .cra_u = { |
417 | .cipher = { | 542 | .blkcipher = { |
418 | .cia_min_keysize = DES3_192_KEY_SIZE, | 543 | .min_keysize = DES3_192_KEY_SIZE, |
419 | .cia_max_keysize = DES3_192_KEY_SIZE, | 544 | .max_keysize = DES3_192_KEY_SIZE, |
420 | .cia_setkey = des3_192_setkey, | 545 | .ivsize = DES3_192_BLOCK_SIZE, |
421 | .cia_encrypt = des3_192_encrypt, | 546 | .setkey = des3_192_setkey, |
422 | .cia_decrypt = des3_192_decrypt, | 547 | .encrypt = cbc_des3_192_encrypt, |
423 | .cia_encrypt_ecb = des3_192_encrypt_ecb, | 548 | .decrypt = cbc_des3_192_decrypt, |
424 | .cia_decrypt_ecb = des3_192_decrypt_ecb, | ||
425 | .cia_encrypt_cbc = des3_192_encrypt_cbc, | ||
426 | .cia_decrypt_cbc = des3_192_decrypt_cbc, | ||
427 | } | 549 | } |
428 | } | 550 | } |
429 | }; | 551 | }; |
@@ -437,22 +559,69 @@ static int init(void) | |||
437 | !crypt_s390_func_available(KM_TDEA_192_ENCRYPT)) | 559 | !crypt_s390_func_available(KM_TDEA_192_ENCRYPT)) |
438 | return -ENOSYS; | 560 | return -ENOSYS; |
439 | 561 | ||
440 | ret |= (crypto_register_alg(&des_alg) == 0) ? 0:1; | 562 | ret = crypto_register_alg(&des_alg); |
441 | ret |= (crypto_register_alg(&des3_128_alg) == 0) ? 0:2; | 563 | if (ret) |
442 | ret |= (crypto_register_alg(&des3_192_alg) == 0) ? 0:4; | 564 | goto des_err; |
443 | if (ret) { | 565 | ret = crypto_register_alg(&ecb_des_alg); |
444 | crypto_unregister_alg(&des3_192_alg); | 566 | if (ret) |
445 | crypto_unregister_alg(&des3_128_alg); | 567 | goto ecb_des_err; |
446 | crypto_unregister_alg(&des_alg); | 568 | ret = crypto_register_alg(&cbc_des_alg); |
447 | return -EEXIST; | 569 | if (ret) |
448 | } | 570 | goto cbc_des_err; |
449 | return 0; | 571 | |
572 | ret = crypto_register_alg(&des3_128_alg); | ||
573 | if (ret) | ||
574 | goto des3_128_err; | ||
575 | ret = crypto_register_alg(&ecb_des3_128_alg); | ||
576 | if (ret) | ||
577 | goto ecb_des3_128_err; | ||
578 | ret = crypto_register_alg(&cbc_des3_128_alg); | ||
579 | if (ret) | ||
580 | goto cbc_des3_128_err; | ||
581 | |||
582 | ret = crypto_register_alg(&des3_192_alg); | ||
583 | if (ret) | ||
584 | goto des3_192_err; | ||
585 | ret = crypto_register_alg(&ecb_des3_192_alg); | ||
586 | if (ret) | ||
587 | goto ecb_des3_192_err; | ||
588 | ret = crypto_register_alg(&cbc_des3_192_alg); | ||
589 | if (ret) | ||
590 | goto cbc_des3_192_err; | ||
591 | |||
592 | out: | ||
593 | return ret; | ||
594 | |||
595 | cbc_des3_192_err: | ||
596 | crypto_unregister_alg(&ecb_des3_192_alg); | ||
597 | ecb_des3_192_err: | ||
598 | crypto_unregister_alg(&des3_192_alg); | ||
599 | des3_192_err: | ||
600 | crypto_unregister_alg(&cbc_des3_128_alg); | ||
601 | cbc_des3_128_err: | ||
602 | crypto_unregister_alg(&ecb_des3_128_alg); | ||
603 | ecb_des3_128_err: | ||
604 | crypto_unregister_alg(&des3_128_alg); | ||
605 | des3_128_err: | ||
606 | crypto_unregister_alg(&cbc_des_alg); | ||
607 | cbc_des_err: | ||
608 | crypto_unregister_alg(&ecb_des_alg); | ||
609 | ecb_des_err: | ||
610 | crypto_unregister_alg(&des_alg); | ||
611 | des_err: | ||
612 | goto out; | ||
450 | } | 613 | } |
451 | 614 | ||
452 | static void __exit fini(void) | 615 | static void __exit fini(void) |
453 | { | 616 | { |
617 | crypto_unregister_alg(&cbc_des3_192_alg); | ||
618 | crypto_unregister_alg(&ecb_des3_192_alg); | ||
454 | crypto_unregister_alg(&des3_192_alg); | 619 | crypto_unregister_alg(&des3_192_alg); |
620 | crypto_unregister_alg(&cbc_des3_128_alg); | ||
621 | crypto_unregister_alg(&ecb_des3_128_alg); | ||
455 | crypto_unregister_alg(&des3_128_alg); | 622 | crypto_unregister_alg(&des3_128_alg); |
623 | crypto_unregister_alg(&cbc_des_alg); | ||
624 | crypto_unregister_alg(&ecb_des_alg); | ||
456 | crypto_unregister_alg(&des_alg); | 625 | crypto_unregister_alg(&des_alg); |
457 | } | 626 | } |
458 | 627 | ||
diff --git a/arch/s390/crypto/sha1_s390.c b/arch/s390/crypto/sha1_s390.c index 9d34a35b1aa5..49ca8690ee39 100644 --- a/arch/s390/crypto/sha1_s390.c +++ b/arch/s390/crypto/sha1_s390.c | |||
@@ -126,6 +126,8 @@ static void sha1_final(struct crypto_tfm *tfm, u8 *out) | |||
126 | 126 | ||
127 | static struct crypto_alg alg = { | 127 | static struct crypto_alg alg = { |
128 | .cra_name = "sha1", | 128 | .cra_name = "sha1", |
129 | .cra_driver_name = "sha1-s390", | ||
130 | .cra_priority = CRYPT_S390_PRIORITY, | ||
129 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 131 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, |
130 | .cra_blocksize = SHA1_BLOCK_SIZE, | 132 | .cra_blocksize = SHA1_BLOCK_SIZE, |
131 | .cra_ctxsize = sizeof(struct crypt_s390_sha1_ctx), | 133 | .cra_ctxsize = sizeof(struct crypt_s390_sha1_ctx), |
diff --git a/arch/s390/crypto/sha256_s390.c b/arch/s390/crypto/sha256_s390.c index f573df30f31d..8e4e67503fe7 100644 --- a/arch/s390/crypto/sha256_s390.c +++ b/arch/s390/crypto/sha256_s390.c | |||
@@ -127,6 +127,8 @@ static void sha256_final(struct crypto_tfm *tfm, u8 *out) | |||
127 | 127 | ||
128 | static struct crypto_alg alg = { | 128 | static struct crypto_alg alg = { |
129 | .cra_name = "sha256", | 129 | .cra_name = "sha256", |
130 | .cra_driver_name = "sha256-s390", | ||
131 | .cra_priority = CRYPT_S390_PRIORITY, | ||
130 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, | 132 | .cra_flags = CRYPTO_ALG_TYPE_DIGEST, |
131 | .cra_blocksize = SHA256_BLOCK_SIZE, | 133 | .cra_blocksize = SHA256_BLOCK_SIZE, |
132 | .cra_ctxsize = sizeof(struct s390_sha256_ctx), | 134 | .cra_ctxsize = sizeof(struct s390_sha256_ctx), |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index f1d4591eddbb..35da53986b1b 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -428,6 +428,7 @@ CONFIG_S390_TAPE_34XX=m | |||
428 | # CONFIG_VMLOGRDR is not set | 428 | # CONFIG_VMLOGRDR is not set |
429 | # CONFIG_VMCP is not set | 429 | # CONFIG_VMCP is not set |
430 | # CONFIG_MONREADER is not set | 430 | # CONFIG_MONREADER is not set |
431 | CONFIG_MONWRITER=m | ||
431 | 432 | ||
432 | # | 433 | # |
433 | # Cryptographic devices | 434 | # Cryptographic devices |
diff --git a/arch/s390/hypfs/hypfs.h b/arch/s390/hypfs/hypfs.h index ea5567be00fc..f3dbd91965c6 100644 --- a/arch/s390/hypfs/hypfs.h +++ b/arch/s390/hypfs/hypfs.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * fs/hypfs/hypfs.h | 2 | * arch/s390/hypfs/hypfs.h |
3 | * Hypervisor filesystem for Linux on s390. | 3 | * Hypervisor filesystem for Linux on s390. |
4 | * | 4 | * |
5 | * Copyright (C) IBM Corp. 2006 | 5 | * Copyright (C) IBM Corp. 2006 |
diff --git a/arch/s390/hypfs/hypfs_diag.c b/arch/s390/hypfs/hypfs_diag.c index 1785bce2b919..75144efbb92b 100644 --- a/arch/s390/hypfs/hypfs_diag.c +++ b/arch/s390/hypfs/hypfs_diag.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * fs/hypfs/hypfs_diag.c | 2 | * arch/s390/hypfs/hypfs_diag.c |
3 | * Hypervisor filesystem for Linux on s390. Diag 204 and 224 | 3 | * Hypervisor filesystem for Linux on s390. Diag 204 and 224 |
4 | * implementation. | 4 | * implementation. |
5 | * | 5 | * |
@@ -432,12 +432,14 @@ static int diag204_probe(void) | |||
432 | 432 | ||
433 | buf = diag204_get_buffer(INFO_EXT, &pages); | 433 | buf = diag204_get_buffer(INFO_EXT, &pages); |
434 | if (!IS_ERR(buf)) { | 434 | if (!IS_ERR(buf)) { |
435 | if (diag204(SUBC_STIB7 | INFO_EXT, pages, buf) >= 0) { | 435 | if (diag204((unsigned long)SUBC_STIB7 | |
436 | (unsigned long)INFO_EXT, pages, buf) >= 0) { | ||
436 | diag204_store_sc = SUBC_STIB7; | 437 | diag204_store_sc = SUBC_STIB7; |
437 | diag204_info_type = INFO_EXT; | 438 | diag204_info_type = INFO_EXT; |
438 | goto out; | 439 | goto out; |
439 | } | 440 | } |
440 | if (diag204(SUBC_STIB6 | INFO_EXT, pages, buf) >= 0) { | 441 | if (diag204((unsigned long)SUBC_STIB6 | |
442 | (unsigned long)INFO_EXT, pages, buf) >= 0) { | ||
441 | diag204_store_sc = SUBC_STIB7; | 443 | diag204_store_sc = SUBC_STIB7; |
442 | diag204_info_type = INFO_EXT; | 444 | diag204_info_type = INFO_EXT; |
443 | goto out; | 445 | goto out; |
@@ -452,7 +454,8 @@ static int diag204_probe(void) | |||
452 | rc = PTR_ERR(buf); | 454 | rc = PTR_ERR(buf); |
453 | goto fail_alloc; | 455 | goto fail_alloc; |
454 | } | 456 | } |
455 | if (diag204(SUBC_STIB4 | INFO_SIMPLE, pages, buf) >= 0) { | 457 | if (diag204((unsigned long)SUBC_STIB4 | |
458 | (unsigned long)INFO_SIMPLE, pages, buf) >= 0) { | ||
456 | diag204_store_sc = SUBC_STIB4; | 459 | diag204_store_sc = SUBC_STIB4; |
457 | diag204_info_type = INFO_SIMPLE; | 460 | diag204_info_type = INFO_SIMPLE; |
458 | goto out; | 461 | goto out; |
@@ -476,7 +479,8 @@ static void *diag204_store(void) | |||
476 | buf = diag204_get_buffer(diag204_info_type, &pages); | 479 | buf = diag204_get_buffer(diag204_info_type, &pages); |
477 | if (IS_ERR(buf)) | 480 | if (IS_ERR(buf)) |
478 | goto out; | 481 | goto out; |
479 | if (diag204(diag204_store_sc | diag204_info_type, pages, buf) < 0) | 482 | if (diag204((unsigned long)diag204_store_sc | |
483 | (unsigned long)diag204_info_type, pages, buf) < 0) | ||
480 | return ERR_PTR(-ENOSYS); | 484 | return ERR_PTR(-ENOSYS); |
481 | out: | 485 | out: |
482 | return buf; | 486 | return buf; |
@@ -531,7 +535,7 @@ __init int hypfs_diag_init(void) | |||
531 | return rc; | 535 | return rc; |
532 | } | 536 | } |
533 | 537 | ||
534 | __exit void hypfs_diag_exit(void) | 538 | void hypfs_diag_exit(void) |
535 | { | 539 | { |
536 | diag224_delete_name_table(); | 540 | diag224_delete_name_table(); |
537 | diag204_free_buffer(); | 541 | diag204_free_buffer(); |
diff --git a/arch/s390/hypfs/hypfs_diag.h b/arch/s390/hypfs/hypfs_diag.h index 793dea6b9bb6..256b384aebe1 100644 --- a/arch/s390/hypfs/hypfs_diag.h +++ b/arch/s390/hypfs/hypfs_diag.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * fs/hypfs/hypfs_diag.h | 2 | * arch/s390/hypfs_diag.h |
3 | * Hypervisor filesystem for Linux on s390. | 3 | * Hypervisor filesystem for Linux on s390. |
4 | * | 4 | * |
5 | * Copyright (C) IBM Corp. 2006 | 5 | * Copyright (C) IBM Corp. 2006 |
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c index 18c091925ea5..bdade5f2e325 100644 --- a/arch/s390/hypfs/inode.c +++ b/arch/s390/hypfs/inode.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * fs/hypfs/inode.c | 2 | * arch/s390/hypfs/inode.c |
3 | * Hypervisor filesystem for Linux on s390. | 3 | * Hypervisor filesystem for Linux on s390. |
4 | * | 4 | * |
5 | * Copyright (C) IBM Corp. 2006 | 5 | * Copyright (C) IBM Corp. 2006 |
@@ -312,10 +312,12 @@ static void hypfs_kill_super(struct super_block *sb) | |||
312 | { | 312 | { |
313 | struct hypfs_sb_info *sb_info = sb->s_fs_info; | 313 | struct hypfs_sb_info *sb_info = sb->s_fs_info; |
314 | 314 | ||
315 | hypfs_delete_tree(sb->s_root); | 315 | if (sb->s_root) { |
316 | hypfs_remove(sb_info->update_file); | 316 | hypfs_delete_tree(sb->s_root); |
317 | kfree(sb->s_fs_info); | 317 | hypfs_remove(sb_info->update_file); |
318 | sb->s_fs_info = NULL; | 318 | kfree(sb->s_fs_info); |
319 | sb->s_fs_info = NULL; | ||
320 | } | ||
319 | kill_litter_super(sb); | 321 | kill_litter_super(sb); |
320 | } | 322 | } |
321 | 323 | ||
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 9a33ed6ca696..aa978978d3d1 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -6,7 +6,7 @@ EXTRA_AFLAGS := -traditional | |||
6 | 6 | ||
7 | obj-y := bitmap.o traps.o time.o process.o \ | 7 | obj-y := bitmap.o traps.o time.o process.o \ |
8 | setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ | 8 | setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ |
9 | semaphore.o s390_ext.o debug.o profile.o irq.o reipl_diag.o | 9 | semaphore.o s390_ext.o debug.o profile.o irq.o ipl.o |
10 | 10 | ||
11 | obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) | 11 | obj-y += $(if $(CONFIG_64BIT),entry64.o,entry.o) |
12 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) | 12 | obj-y += $(if $(CONFIG_64BIT),reipl64.o,reipl.o) |
@@ -24,6 +24,7 @@ obj-$(CONFIG_COMPAT) += compat_linux.o compat_signal.o \ | |||
24 | 24 | ||
25 | obj-$(CONFIG_VIRT_TIMER) += vtime.o | 25 | obj-$(CONFIG_VIRT_TIMER) += vtime.o |
26 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | 26 | obj-$(CONFIG_STACKTRACE) += stacktrace.o |
27 | obj-$(CONFIG_KPROBES) += kprobes.o | ||
27 | 28 | ||
28 | # Kexec part | 29 | # Kexec part |
29 | S390_KEXEC_OBJS := machine_kexec.o crash.o | 30 | S390_KEXEC_OBJS := machine_kexec.o crash.o |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 5b5799ac8f83..0c712b78a7e8 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -505,6 +505,8 @@ pgm_no_vtime2: | |||
505 | mvc __THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS | 505 | mvc __THREAD_per+__PER_address(4,%r1),__LC_PER_ADDRESS |
506 | mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID | 506 | mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID |
507 | oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP | 507 | oi __TI_flags+3(%r9),_TIF_SINGLE_STEP # set TIF_SINGLE_STEP |
508 | tm SP_PSW+1(%r15),0x01 # kernel per event ? | ||
509 | bz BASED(kernel_per) | ||
508 | l %r3,__LC_PGM_ILC # load program interruption code | 510 | l %r3,__LC_PGM_ILC # load program interruption code |
509 | la %r8,0x7f | 511 | la %r8,0x7f |
510 | nr %r8,%r3 # clear per-event-bit and ilc | 512 | nr %r8,%r3 # clear per-event-bit and ilc |
@@ -536,6 +538,16 @@ pgm_no_vtime3: | |||
536 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts | 538 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts |
537 | b BASED(sysc_do_svc) | 539 | b BASED(sysc_do_svc) |
538 | 540 | ||
541 | # | ||
542 | # per was called from kernel, must be kprobes | ||
543 | # | ||
544 | kernel_per: | ||
545 | mvi SP_TRAP+1(%r15),0x28 # set trap indication to pgm check | ||
546 | la %r2,SP_PTREGS(%r15) # address of register-save area | ||
547 | l %r1,BASED(.Lhandle_per) # load adr. of per handler | ||
548 | la %r14,BASED(sysc_leave) # load adr. of system return | ||
549 | br %r1 # branch to do_single_step | ||
550 | |||
539 | /* | 551 | /* |
540 | * IO interrupt handler routine | 552 | * IO interrupt handler routine |
541 | */ | 553 | */ |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 56f5f613b868..29bbfbab7332 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -518,6 +518,8 @@ pgm_no_vtime2: | |||
518 | #endif | 518 | #endif |
519 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct | 519 | lg %r9,__LC_THREAD_INFO # load pointer to thread_info struct |
520 | lg %r1,__TI_task(%r9) | 520 | lg %r1,__TI_task(%r9) |
521 | tm SP_PSW+1(%r15),0x01 # kernel per event ? | ||
522 | jz kernel_per | ||
521 | mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID | 523 | mvc __THREAD_per+__PER_atmid(2,%r1),__LC_PER_ATMID |
522 | mvc __THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS | 524 | mvc __THREAD_per+__PER_address(8,%r1),__LC_PER_ADDRESS |
523 | mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID | 525 | mvc __THREAD_per+__PER_access_id(1,%r1),__LC_PER_ACCESS_ID |
@@ -553,6 +555,16 @@ pgm_no_vtime3: | |||
553 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts | 555 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts |
554 | j sysc_do_svc | 556 | j sysc_do_svc |
555 | 557 | ||
558 | # | ||
559 | # per was called from kernel, must be kprobes | ||
560 | # | ||
561 | kernel_per: | ||
562 | lhi %r0,__LC_PGM_OLD_PSW | ||
563 | sth %r0,SP_TRAP(%r15) # set trap indication to pgm check | ||
564 | la %r2,SP_PTREGS(%r15) # address of register-save area | ||
565 | larl %r14,sysc_leave # load adr. of system ret, no work | ||
566 | jg do_single_step # branch to do_single_step | ||
567 | |||
556 | /* | 568 | /* |
557 | * IO interrupt handler routine | 569 | * IO interrupt handler routine |
558 | */ | 570 | */ |
@@ -815,7 +827,7 @@ restart_go: | |||
815 | */ | 827 | */ |
816 | stack_overflow: | 828 | stack_overflow: |
817 | lg %r15,__LC_PANIC_STACK # change to panic stack | 829 | lg %r15,__LC_PANIC_STACK # change to panic stack |
818 | aghi %r1,-SP_SIZE | 830 | aghi %r15,-SP_SIZE |
819 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack | 831 | mvc SP_PSW(16,%r15),0(%r12) # move user PSW to stack |
820 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack | 832 | stmg %r0,%r11,SP_R0(%r15) # store gprs %r0-%r11 to kernel stack |
821 | la %r1,__LC_SAVE_AREA | 833 | la %r1,__LC_SAVE_AREA |
@@ -823,7 +835,7 @@ stack_overflow: | |||
823 | je 0f | 835 | je 0f |
824 | chi %r12,__LC_PGM_OLD_PSW | 836 | chi %r12,__LC_PGM_OLD_PSW |
825 | je 0f | 837 | je 0f |
826 | la %r1,__LC_SAVE_AREA+16 | 838 | la %r1,__LC_SAVE_AREA+32 |
827 | 0: mvc SP_R12(32,%r15),0(%r1) # move %r12-%r15 to stack | 839 | 0: mvc SP_R12(32,%r15),0(%r1) # move %r12-%r15 to stack |
828 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) # clear back chain | 840 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) # clear back chain |
829 | la %r2,SP_PTREGS(%r15) # load pt_regs | 841 | la %r2,SP_PTREGS(%r15) # load pt_regs |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index adad8863ee2f..0f1db268a8a9 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -272,7 +272,7 @@ iplstart: | |||
272 | # load parameter file from ipl device | 272 | # load parameter file from ipl device |
273 | # | 273 | # |
274 | .Lagain1: | 274 | .Lagain1: |
275 | l %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # ramdisk loc. is temp | 275 | l %r2,.Linitrd # ramdisk loc. is temp |
276 | bas %r14,.Lloader # load parameter file | 276 | bas %r14,.Lloader # load parameter file |
277 | ltr %r2,%r2 # got anything ? | 277 | ltr %r2,%r2 # got anything ? |
278 | bz .Lnopf | 278 | bz .Lnopf |
@@ -280,7 +280,7 @@ iplstart: | |||
280 | bnh .Lnotrunc | 280 | bnh .Lnotrunc |
281 | la %r2,895 | 281 | la %r2,895 |
282 | .Lnotrunc: | 282 | .Lnotrunc: |
283 | l %r4,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) | 283 | l %r4,.Linitrd |
284 | clc 0(3,%r4),.L_hdr # if it is HDRx | 284 | clc 0(3,%r4),.L_hdr # if it is HDRx |
285 | bz .Lagain1 # skip dataset header | 285 | bz .Lagain1 # skip dataset header |
286 | clc 0(3,%r4),.L_eof # if it is EOFx | 286 | clc 0(3,%r4),.L_eof # if it is EOFx |
@@ -323,14 +323,15 @@ iplstart: | |||
323 | # load ramdisk from ipl device | 323 | # load ramdisk from ipl device |
324 | # | 324 | # |
325 | .Lagain2: | 325 | .Lagain2: |
326 | l %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # addr of ramdisk | 326 | l %r2,.Linitrd # addr of ramdisk |
327 | st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) | ||
327 | bas %r14,.Lloader # load ramdisk | 328 | bas %r14,.Lloader # load ramdisk |
328 | st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of ramdisk | 329 | st %r2,INITRD_SIZE+ARCH_OFFSET-PARMAREA(%r12) # store size of ramdisk |
329 | ltr %r2,%r2 | 330 | ltr %r2,%r2 |
330 | bnz .Lrdcont | 331 | bnz .Lrdcont |
331 | st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found | 332 | st %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) # no ramdisk found |
332 | .Lrdcont: | 333 | .Lrdcont: |
333 | l %r2,INITRD_START+ARCH_OFFSET-PARMAREA(%r12) | 334 | l %r2,.Linitrd |
334 | 335 | ||
335 | clc 0(3,%r2),.L_hdr # skip HDRx and EOFx | 336 | clc 0(3,%r2),.L_hdr # skip HDRx and EOFx |
336 | bz .Lagain2 | 337 | bz .Lagain2 |
@@ -379,6 +380,7 @@ iplstart: | |||
379 | l %r1,.Lstartup | 380 | l %r1,.Lstartup |
380 | br %r1 | 381 | br %r1 |
381 | 382 | ||
383 | .Linitrd:.long _end + 0x400000 # default address of initrd | ||
382 | .Lparm: .long PARMAREA | 384 | .Lparm: .long PARMAREA |
383 | .Lstartup: .long startup | 385 | .Lstartup: .long startup |
384 | .Lcvtab:.long _ebcasc # ebcdic to ascii table | 386 | .Lcvtab:.long _ebcasc # ebcdic to ascii table |
@@ -479,65 +481,6 @@ start: | |||
479 | .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7 | 481 | .byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7 |
480 | .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff | 482 | .byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff |
481 | 483 | ||
482 | .macro GET_IPL_DEVICE | ||
483 | .Lget_ipl_device: | ||
484 | l %r1,0xb8 # get sid | ||
485 | sll %r1,15 # test if subchannel is enabled | ||
486 | srl %r1,31 | ||
487 | ltr %r1,%r1 | ||
488 | bz 2f-.LPG1(%r13) # subchannel disabled | ||
489 | l %r1,0xb8 | ||
490 | la %r5,.Lipl_schib-.LPG1(%r13) | ||
491 | stsch 0(%r5) # get schib of subchannel | ||
492 | bnz 2f-.LPG1(%r13) # schib not available | ||
493 | tm 5(%r5),0x01 # devno valid? | ||
494 | bno 2f-.LPG1(%r13) | ||
495 | la %r6,ipl_parameter_flags-.LPG1(%r13) | ||
496 | oi 3(%r6),0x01 # set flag | ||
497 | la %r2,ipl_devno-.LPG1(%r13) | ||
498 | mvc 0(2,%r2),6(%r5) # store devno | ||
499 | tm 4(%r5),0x80 # qdio capable device? | ||
500 | bno 2f-.LPG1(%r13) | ||
501 | oi 3(%r6),0x02 # set flag | ||
502 | |||
503 | # copy ipl parameters | ||
504 | |||
505 | lhi %r0,4096 | ||
506 | l %r2,20(%r0) # get address of parameter list | ||
507 | lhi %r3,IPL_PARMBLOCK_ORIGIN | ||
508 | st %r3,20(%r0) | ||
509 | lhi %r4,1 | ||
510 | cr %r2,%r3 # start parameters < destination ? | ||
511 | jl 0f | ||
512 | lhi %r1,1 # copy direction is upwards | ||
513 | j 1f | ||
514 | 0: lhi %r1,-1 # copy direction is downwards | ||
515 | ar %r2,%r0 | ||
516 | ar %r3,%r0 | ||
517 | ar %r2,%r1 | ||
518 | ar %r3,%r1 | ||
519 | 1: mvc 0(1,%r3),0(%r2) # finally copy ipl parameters | ||
520 | ar %r3,%r1 | ||
521 | ar %r2,%r1 | ||
522 | sr %r0,%r4 | ||
523 | jne 1b | ||
524 | b 2f-.LPG1(%r13) | ||
525 | |||
526 | .align 4 | ||
527 | .Lipl_schib: | ||
528 | .rept 13 | ||
529 | .long 0 | ||
530 | .endr | ||
531 | |||
532 | .globl ipl_parameter_flags | ||
533 | ipl_parameter_flags: | ||
534 | .long 0 | ||
535 | .globl ipl_devno | ||
536 | ipl_devno: | ||
537 | .word 0 | ||
538 | 2: | ||
539 | .endm | ||
540 | |||
541 | #ifdef CONFIG_64BIT | 484 | #ifdef CONFIG_64BIT |
542 | #include "head64.S" | 485 | #include "head64.S" |
543 | #else | 486 | #else |
diff --git a/arch/s390/kernel/head31.S b/arch/s390/kernel/head31.S index a4dc61f3285e..1fa9fa1ca740 100644 --- a/arch/s390/kernel/head31.S +++ b/arch/s390/kernel/head31.S | |||
@@ -26,8 +26,8 @@ startup:basr %r13,0 # get base | |||
26 | # | 26 | # |
27 | .org PARMAREA | 27 | .org PARMAREA |
28 | .long 0,0 # IPL_DEVICE | 28 | .long 0,0 # IPL_DEVICE |
29 | .long 0,RAMDISK_ORIGIN # INITRD_START | 29 | .long 0,0 # INITRD_START |
30 | .long 0,RAMDISK_SIZE # INITRD_SIZE | 30 | .long 0,0 # INITRD_SIZE |
31 | 31 | ||
32 | .org COMMAND_LINE | 32 | .org COMMAND_LINE |
33 | .byte "root=/dev/ram0 ro" | 33 | .byte "root=/dev/ram0 ro" |
@@ -37,12 +37,23 @@ startup:basr %r13,0 # get base | |||
37 | 37 | ||
38 | startup_continue: | 38 | startup_continue: |
39 | basr %r13,0 # get base | 39 | basr %r13,0 # get base |
40 | .LPG1: GET_IPL_DEVICE | 40 | .LPG1: mvi __LC_AR_MODE_ID,0 # set ESA flag (mode 0) |
41 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers | 41 | lctl %c0,%c15,.Lctl-.LPG1(%r13) # load control registers |
42 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area | 42 | l %r12,.Lparmaddr-.LPG1(%r13) # pointer to parameter area |
43 | # move IPL device to lowcore | 43 | # move IPL device to lowcore |
44 | mvc __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12) | 44 | mvc __LC_IPLDEV(4),IPL_DEVICE-PARMAREA(%r12) |
45 | # | ||
46 | # Setup stack | ||
47 | # | ||
48 | l %r15,.Linittu-.LPG1(%r13) | ||
49 | mvc __LC_CURRENT(4),__TI_task(%r15) | ||
50 | ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union+THREAD_SIZE | ||
51 | st %r15,__LC_KERNEL_STACK # set end of kernel stack | ||
52 | ahi %r15,-96 | ||
53 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain | ||
45 | 54 | ||
55 | l %r14,.Lipl_save_parameters-.LPG1(%r13) | ||
56 | basr %r14,%r14 | ||
46 | # | 57 | # |
47 | # clear bss memory | 58 | # clear bss memory |
48 | # | 59 | # |
@@ -114,6 +125,10 @@ startup_continue: | |||
114 | b .Lfchunk-.LPG1(%r13) | 125 | b .Lfchunk-.LPG1(%r13) |
115 | 126 | ||
116 | .align 4 | 127 | .align 4 |
128 | .Lipl_save_parameters: | ||
129 | .long ipl_save_parameters | ||
130 | .Linittu: | ||
131 | .long init_thread_union | ||
117 | .Lpmask: | 132 | .Lpmask: |
118 | .byte 0 | 133 | .byte 0 |
119 | .align 8 | 134 | .align 8 |
@@ -273,7 +288,23 @@ startup_continue: | |||
273 | .Lbss_end: .long _end | 288 | .Lbss_end: .long _end |
274 | .Lparmaddr: .long PARMAREA | 289 | .Lparmaddr: .long PARMAREA |
275 | .Lsccbaddr: .long .Lsccb | 290 | .Lsccbaddr: .long .Lsccb |
291 | |||
292 | .globl ipl_schib | ||
293 | ipl_schib: | ||
294 | .rept 13 | ||
295 | .long 0 | ||
296 | .endr | ||
297 | |||
298 | .globl ipl_flags | ||
299 | ipl_flags: | ||
300 | .long 0 | ||
301 | .globl ipl_devno | ||
302 | ipl_devno: | ||
303 | .word 0 | ||
304 | |||
276 | .org 0x12000 | 305 | .org 0x12000 |
306 | .globl s390_readinfo_sccb | ||
307 | s390_readinfo_sccb: | ||
277 | .Lsccb: | 308 | .Lsccb: |
278 | .hword 0x1000 # length, one page | 309 | .hword 0x1000 # length, one page |
279 | .byte 0x00,0x00,0x00 | 310 | .byte 0x00,0x00,0x00 |
@@ -302,16 +333,6 @@ startup_continue: | |||
302 | .globl _stext | 333 | .globl _stext |
303 | _stext: basr %r13,0 # get base | 334 | _stext: basr %r13,0 # get base |
304 | .LPG3: | 335 | .LPG3: |
305 | # | ||
306 | # Setup stack | ||
307 | # | ||
308 | l %r15,.Linittu-.LPG3(%r13) | ||
309 | mvc __LC_CURRENT(4),__TI_task(%r15) | ||
310 | ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union+THREAD_SIZE | ||
311 | st %r15,__LC_KERNEL_STACK # set end of kernel stack | ||
312 | ahi %r15,-96 | ||
313 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain | ||
314 | |||
315 | # check control registers | 336 | # check control registers |
316 | stctl %c0,%c15,0(%r15) | 337 | stctl %c0,%c15,0(%r15) |
317 | oi 2(%r15),0x40 # enable sigp emergency signal | 338 | oi 2(%r15),0x40 # enable sigp emergency signal |
@@ -330,6 +351,5 @@ _stext: basr %r13,0 # get base | |||
330 | # | 351 | # |
331 | .align 8 | 352 | .align 8 |
332 | .Ldw: .long 0x000a0000,0x00000000 | 353 | .Ldw: .long 0x000a0000,0x00000000 |
333 | .Linittu:.long init_thread_union | ||
334 | .Lstart:.long start_kernel | 354 | .Lstart:.long start_kernel |
335 | .Laregs:.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | 355 | .Laregs:.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index 9d80c5b1ef95..a8bdd96494c7 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -26,8 +26,8 @@ startup:basr %r13,0 # get base | |||
26 | # | 26 | # |
27 | .org PARMAREA | 27 | .org PARMAREA |
28 | .quad 0 # IPL_DEVICE | 28 | .quad 0 # IPL_DEVICE |
29 | .quad RAMDISK_ORIGIN # INITRD_START | 29 | .quad 0 # INITRD_START |
30 | .quad RAMDISK_SIZE # INITRD_SIZE | 30 | .quad 0 # INITRD_SIZE |
31 | 31 | ||
32 | .org COMMAND_LINE | 32 | .org COMMAND_LINE |
33 | .byte "root=/dev/ram0 ro" | 33 | .byte "root=/dev/ram0 ro" |
@@ -39,8 +39,8 @@ startup_continue: | |||
39 | basr %r13,0 # get base | 39 | basr %r13,0 # get base |
40 | .LPG1: sll %r13,1 # remove high order bit | 40 | .LPG1: sll %r13,1 # remove high order bit |
41 | srl %r13,1 | 41 | srl %r13,1 |
42 | GET_IPL_DEVICE | ||
43 | lhi %r1,1 # mode 1 = esame | 42 | lhi %r1,1 # mode 1 = esame |
43 | mvi __LC_AR_MODE_ID,1 # set esame flag | ||
44 | slr %r0,%r0 # set cpuid to zero | 44 | slr %r0,%r0 # set cpuid to zero |
45 | sigp %r1,%r0,0x12 # switch to esame mode | 45 | sigp %r1,%r0,0x12 # switch to esame mode |
46 | sam64 # switch to 64 bit mode | 46 | sam64 # switch to 64 bit mode |
@@ -48,7 +48,18 @@ startup_continue: | |||
48 | lg %r12,.Lparmaddr-.LPG1(%r13)# pointer to parameter area | 48 | lg %r12,.Lparmaddr-.LPG1(%r13)# pointer to parameter area |
49 | # move IPL device to lowcore | 49 | # move IPL device to lowcore |
50 | mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12) | 50 | mvc __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12) |
51 | # | ||
52 | # Setup stack | ||
53 | # | ||
54 | larl %r15,init_thread_union | ||
55 | lg %r14,__TI_task(%r15) # cache current in lowcore | ||
56 | stg %r14,__LC_CURRENT | ||
57 | aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE | ||
58 | stg %r15,__LC_KERNEL_STACK # set end of kernel stack | ||
59 | aghi %r15,-160 | ||
60 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain | ||
51 | 61 | ||
62 | brasl %r14,ipl_save_parameters | ||
52 | # | 63 | # |
53 | # clear bss memory | 64 | # clear bss memory |
54 | # | 65 | # |
@@ -239,6 +250,19 @@ startup_continue: | |||
239 | oi 7(%r12),0x80 # set IDTE flag | 250 | oi 7(%r12),0x80 # set IDTE flag |
240 | 0: | 251 | 0: |
241 | 252 | ||
253 | # | ||
254 | # find out if we have the MVCOS instruction | ||
255 | # | ||
256 | la %r1,0f-.LPG1(%r13) # set program check address | ||
257 | stg %r1,__LC_PGM_NEW_PSW+8 | ||
258 | .short 0xc800 # mvcos 0(%r0),0(%r0),%r0 | ||
259 | .short 0x0000 | ||
260 | .short 0x0000 | ||
261 | 0: tm 0x8f,0x13 # special-operation exception? | ||
262 | bno 1f-.LPG1(%r13) # if yes, MVCOS is present | ||
263 | oi 6(%r12),2 # set MVCOS flag | ||
264 | 1: | ||
265 | |||
242 | lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space, | 266 | lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space, |
243 | # virtual and never return ... | 267 | # virtual and never return ... |
244 | .align 16 | 268 | .align 16 |
@@ -268,7 +292,22 @@ startup_continue: | |||
268 | .Lparmaddr: | 292 | .Lparmaddr: |
269 | .quad PARMAREA | 293 | .quad PARMAREA |
270 | 294 | ||
295 | .globl ipl_schib | ||
296 | ipl_schib: | ||
297 | .rept 13 | ||
298 | .long 0 | ||
299 | .endr | ||
300 | |||
301 | .globl ipl_flags | ||
302 | ipl_flags: | ||
303 | .long 0 | ||
304 | .globl ipl_devno | ||
305 | ipl_devno: | ||
306 | .word 0 | ||
307 | |||
271 | .org 0x12000 | 308 | .org 0x12000 |
309 | .globl s390_readinfo_sccb | ||
310 | s390_readinfo_sccb: | ||
272 | .Lsccb: | 311 | .Lsccb: |
273 | .hword 0x1000 # length, one page | 312 | .hword 0x1000 # length, one page |
274 | .byte 0x00,0x00,0x00 | 313 | .byte 0x00,0x00,0x00 |
@@ -297,24 +336,12 @@ startup_continue: | |||
297 | .globl _stext | 336 | .globl _stext |
298 | _stext: basr %r13,0 # get base | 337 | _stext: basr %r13,0 # get base |
299 | .LPG3: | 338 | .LPG3: |
300 | # | ||
301 | # Setup stack | ||
302 | # | ||
303 | larl %r15,init_thread_union | ||
304 | lg %r14,__TI_task(%r15) # cache current in lowcore | ||
305 | stg %r14,__LC_CURRENT | ||
306 | aghi %r15,1<<(PAGE_SHIFT+THREAD_ORDER) # init_task_union + THREAD_SIZE | ||
307 | stg %r15,__LC_KERNEL_STACK # set end of kernel stack | ||
308 | aghi %r15,-160 | ||
309 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) # clear backchain | ||
310 | |||
311 | # check control registers | 339 | # check control registers |
312 | stctg %c0,%c15,0(%r15) | 340 | stctg %c0,%c15,0(%r15) |
313 | oi 6(%r15),0x40 # enable sigp emergency signal | 341 | oi 6(%r15),0x40 # enable sigp emergency signal |
314 | oi 4(%r15),0x10 # switch on low address proctection | 342 | oi 4(%r15),0x10 # switch on low address proctection |
315 | lctlg %c0,%c15,0(%r15) | 343 | lctlg %c0,%c15,0(%r15) |
316 | 344 | ||
317 | # | ||
318 | lam 0,15,.Laregs-.LPG3(%r13) # load access regs needed by uaccess | 345 | lam 0,15,.Laregs-.LPG3(%r13) # load access regs needed by uaccess |
319 | brasl %r14,start_kernel # go to C code | 346 | brasl %r14,start_kernel # go to C code |
320 | # | 347 | # |
@@ -322,7 +349,7 @@ _stext: basr %r13,0 # get base | |||
322 | # | 349 | # |
323 | basr %r13,0 | 350 | basr %r13,0 |
324 | lpswe .Ldw-.(%r13) # load disabled wait psw | 351 | lpswe .Ldw-.(%r13) # load disabled wait psw |
325 | # | 352 | |
326 | .align 8 | 353 | .align 8 |
327 | .Ldw: .quad 0x0002000180000000,0x0000000000000000 | 354 | .Ldw: .quad 0x0002000180000000,0x0000000000000000 |
328 | .Laregs: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | 355 | .Laregs: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c new file mode 100644 index 000000000000..6555cc48e28f --- /dev/null +++ b/arch/s390/kernel/ipl.c | |||
@@ -0,0 +1,942 @@ | |||
1 | /* | ||
2 | * arch/s390/kernel/ipl.c | ||
3 | * ipl/reipl/dump support for Linux on s390. | ||
4 | * | ||
5 | * Copyright (C) IBM Corp. 2005,2006 | ||
6 | * Author(s): Michael Holzheu <holzheu@de.ibm.com> | ||
7 | * Heiko Carstens <heiko.carstens@de.ibm.com> | ||
8 | * Volker Sameske <sameske@de.ibm.com> | ||
9 | */ | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/device.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/reboot.h> | ||
16 | #include <asm/smp.h> | ||
17 | #include <asm/setup.h> | ||
18 | #include <asm/cpcmd.h> | ||
19 | #include <asm/cio.h> | ||
20 | |||
21 | #define IPL_PARM_BLOCK_VERSION 0 | ||
22 | |||
23 | enum ipl_type { | ||
24 | IPL_TYPE_NONE = 1, | ||
25 | IPL_TYPE_UNKNOWN = 2, | ||
26 | IPL_TYPE_CCW = 4, | ||
27 | IPL_TYPE_FCP = 8, | ||
28 | }; | ||
29 | |||
30 | #define IPL_NONE_STR "none" | ||
31 | #define IPL_UNKNOWN_STR "unknown" | ||
32 | #define IPL_CCW_STR "ccw" | ||
33 | #define IPL_FCP_STR "fcp" | ||
34 | |||
35 | static char *ipl_type_str(enum ipl_type type) | ||
36 | { | ||
37 | switch (type) { | ||
38 | case IPL_TYPE_NONE: | ||
39 | return IPL_NONE_STR; | ||
40 | case IPL_TYPE_CCW: | ||
41 | return IPL_CCW_STR; | ||
42 | case IPL_TYPE_FCP: | ||
43 | return IPL_FCP_STR; | ||
44 | case IPL_TYPE_UNKNOWN: | ||
45 | default: | ||
46 | return IPL_UNKNOWN_STR; | ||
47 | } | ||
48 | } | ||
49 | |||
50 | enum ipl_method { | ||
51 | IPL_METHOD_NONE, | ||
52 | IPL_METHOD_CCW_CIO, | ||
53 | IPL_METHOD_CCW_DIAG, | ||
54 | IPL_METHOD_CCW_VM, | ||
55 | IPL_METHOD_FCP_RO_DIAG, | ||
56 | IPL_METHOD_FCP_RW_DIAG, | ||
57 | IPL_METHOD_FCP_RO_VM, | ||
58 | }; | ||
59 | |||
60 | enum shutdown_action { | ||
61 | SHUTDOWN_REIPL, | ||
62 | SHUTDOWN_DUMP, | ||
63 | SHUTDOWN_STOP, | ||
64 | }; | ||
65 | |||
66 | #define SHUTDOWN_REIPL_STR "reipl" | ||
67 | #define SHUTDOWN_DUMP_STR "dump" | ||
68 | #define SHUTDOWN_STOP_STR "stop" | ||
69 | |||
70 | static char *shutdown_action_str(enum shutdown_action action) | ||
71 | { | ||
72 | switch (action) { | ||
73 | case SHUTDOWN_REIPL: | ||
74 | return SHUTDOWN_REIPL_STR; | ||
75 | case SHUTDOWN_DUMP: | ||
76 | return SHUTDOWN_DUMP_STR; | ||
77 | case SHUTDOWN_STOP: | ||
78 | return SHUTDOWN_STOP_STR; | ||
79 | default: | ||
80 | BUG(); | ||
81 | } | ||
82 | } | ||
83 | |||
84 | enum diag308_subcode { | ||
85 | DIAG308_IPL = 3, | ||
86 | DIAG308_DUMP = 4, | ||
87 | DIAG308_SET = 5, | ||
88 | DIAG308_STORE = 6, | ||
89 | }; | ||
90 | |||
91 | enum diag308_ipl_type { | ||
92 | DIAG308_IPL_TYPE_FCP = 0, | ||
93 | DIAG308_IPL_TYPE_CCW = 2, | ||
94 | }; | ||
95 | |||
96 | enum diag308_opt { | ||
97 | DIAG308_IPL_OPT_IPL = 0x10, | ||
98 | DIAG308_IPL_OPT_DUMP = 0x20, | ||
99 | }; | ||
100 | |||
101 | enum diag308_rc { | ||
102 | DIAG308_RC_OK = 1, | ||
103 | }; | ||
104 | |||
105 | static int diag308_set_works = 0; | ||
106 | |||
107 | static int reipl_capabilities = IPL_TYPE_UNKNOWN; | ||
108 | static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN; | ||
109 | static enum ipl_method reipl_method = IPL_METHOD_NONE; | ||
110 | static struct ipl_parameter_block *reipl_block_fcp; | ||
111 | static struct ipl_parameter_block *reipl_block_ccw; | ||
112 | |||
113 | static int dump_capabilities = IPL_TYPE_NONE; | ||
114 | static enum ipl_type dump_type = IPL_TYPE_NONE; | ||
115 | static enum ipl_method dump_method = IPL_METHOD_NONE; | ||
116 | static struct ipl_parameter_block *dump_block_fcp; | ||
117 | static struct ipl_parameter_block *dump_block_ccw; | ||
118 | |||
119 | static enum shutdown_action on_panic_action = SHUTDOWN_STOP; | ||
120 | |||
121 | static int diag308(unsigned long subcode, void *addr) | ||
122 | { | ||
123 | register unsigned long _addr asm("0") = (unsigned long)addr; | ||
124 | register unsigned long _rc asm("1") = 0; | ||
125 | |||
126 | asm volatile ( | ||
127 | " diag %0,%2,0x308\n" | ||
128 | "0: \n" | ||
129 | ".section __ex_table,\"a\"\n" | ||
130 | #ifdef CONFIG_64BIT | ||
131 | " .align 8\n" | ||
132 | " .quad 0b, 0b\n" | ||
133 | #else | ||
134 | " .align 4\n" | ||
135 | " .long 0b, 0b\n" | ||
136 | #endif | ||
137 | ".previous\n" | ||
138 | : "+d" (_addr), "+d" (_rc) | ||
139 | : "d" (subcode) : "cc", "memory" ); | ||
140 | |||
141 | return _rc; | ||
142 | } | ||
143 | |||
144 | /* SYSFS */ | ||
145 | |||
146 | #define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \ | ||
147 | static ssize_t sys_##_prefix##_##_name##_show(struct subsystem *subsys, \ | ||
148 | char *page) \ | ||
149 | { \ | ||
150 | return sprintf(page, _format, _value); \ | ||
151 | } \ | ||
152 | static struct subsys_attribute sys_##_prefix##_##_name##_attr = \ | ||
153 | __ATTR(_name, S_IRUGO, sys_##_prefix##_##_name##_show, NULL); | ||
154 | |||
155 | #define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \ | ||
156 | static ssize_t sys_##_prefix##_##_name##_show(struct subsystem *subsys, \ | ||
157 | char *page) \ | ||
158 | { \ | ||
159 | return sprintf(page, _fmt_out, \ | ||
160 | (unsigned long long) _value); \ | ||
161 | } \ | ||
162 | static ssize_t sys_##_prefix##_##_name##_store(struct subsystem *subsys,\ | ||
163 | const char *buf, size_t len) \ | ||
164 | { \ | ||
165 | unsigned long long value; \ | ||
166 | if (sscanf(buf, _fmt_in, &value) != 1) \ | ||
167 | return -EINVAL; \ | ||
168 | _value = value; \ | ||
169 | return len; \ | ||
170 | } \ | ||
171 | static struct subsys_attribute sys_##_prefix##_##_name##_attr = \ | ||
172 | __ATTR(_name,(S_IRUGO | S_IWUSR), \ | ||
173 | sys_##_prefix##_##_name##_show, \ | ||
174 | sys_##_prefix##_##_name##_store); | ||
175 | |||
176 | static void make_attrs_ro(struct attribute **attrs) | ||
177 | { | ||
178 | while (*attrs) { | ||
179 | (*attrs)->mode = S_IRUGO; | ||
180 | attrs++; | ||
181 | } | ||
182 | } | ||
183 | |||
184 | /* | ||
185 | * ipl section | ||
186 | */ | ||
187 | |||
188 | static enum ipl_type ipl_get_type(void) | ||
189 | { | ||
190 | struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START; | ||
191 | |||
192 | if (!(ipl_flags & IPL_DEVNO_VALID)) | ||
193 | return IPL_TYPE_UNKNOWN; | ||
194 | if (!(ipl_flags & IPL_PARMBLOCK_VALID)) | ||
195 | return IPL_TYPE_CCW; | ||
196 | if (ipl->hdr.version > IPL_MAX_SUPPORTED_VERSION) | ||
197 | return IPL_TYPE_UNKNOWN; | ||
198 | if (ipl->hdr.pbt != DIAG308_IPL_TYPE_FCP) | ||
199 | return IPL_TYPE_UNKNOWN; | ||
200 | return IPL_TYPE_FCP; | ||
201 | } | ||
202 | |||
203 | static ssize_t ipl_type_show(struct subsystem *subsys, char *page) | ||
204 | { | ||
205 | return sprintf(page, "%s\n", ipl_type_str(ipl_get_type())); | ||
206 | } | ||
207 | |||
208 | static struct subsys_attribute sys_ipl_type_attr = __ATTR_RO(ipl_type); | ||
209 | |||
210 | static ssize_t sys_ipl_device_show(struct subsystem *subsys, char *page) | ||
211 | { | ||
212 | struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START; | ||
213 | |||
214 | switch (ipl_get_type()) { | ||
215 | case IPL_TYPE_CCW: | ||
216 | return sprintf(page, "0.0.%04x\n", ipl_devno); | ||
217 | case IPL_TYPE_FCP: | ||
218 | return sprintf(page, "0.0.%04x\n", ipl->ipl_info.fcp.devno); | ||
219 | default: | ||
220 | return 0; | ||
221 | } | ||
222 | } | ||
223 | |||
224 | static struct subsys_attribute sys_ipl_device_attr = | ||
225 | __ATTR(device, S_IRUGO, sys_ipl_device_show, NULL); | ||
226 | |||
227 | static ssize_t ipl_parameter_read(struct kobject *kobj, char *buf, loff_t off, | ||
228 | size_t count) | ||
229 | { | ||
230 | unsigned int size = IPL_PARMBLOCK_SIZE; | ||
231 | |||
232 | if (off > size) | ||
233 | return 0; | ||
234 | if (off + count > size) | ||
235 | count = size - off; | ||
236 | memcpy(buf, (void *)IPL_PARMBLOCK_START + off, count); | ||
237 | return count; | ||
238 | } | ||
239 | |||
240 | static struct bin_attribute ipl_parameter_attr = { | ||
241 | .attr = { | ||
242 | .name = "binary_parameter", | ||
243 | .mode = S_IRUGO, | ||
244 | .owner = THIS_MODULE, | ||
245 | }, | ||
246 | .size = PAGE_SIZE, | ||
247 | .read = &ipl_parameter_read, | ||
248 | }; | ||
249 | |||
250 | static ssize_t ipl_scp_data_read(struct kobject *kobj, char *buf, loff_t off, | ||
251 | size_t count) | ||
252 | { | ||
253 | unsigned int size = IPL_PARMBLOCK_START->ipl_info.fcp.scp_data_len; | ||
254 | void *scp_data = &IPL_PARMBLOCK_START->ipl_info.fcp.scp_data; | ||
255 | |||
256 | if (off > size) | ||
257 | return 0; | ||
258 | if (off + count > size) | ||
259 | count = size - off; | ||
260 | memcpy(buf, scp_data + off, count); | ||
261 | return count; | ||
262 | } | ||
263 | |||
264 | static struct bin_attribute ipl_scp_data_attr = { | ||
265 | .attr = { | ||
266 | .name = "scp_data", | ||
267 | .mode = S_IRUGO, | ||
268 | .owner = THIS_MODULE, | ||
269 | }, | ||
270 | .size = PAGE_SIZE, | ||
271 | .read = &ipl_scp_data_read, | ||
272 | }; | ||
273 | |||
274 | /* FCP ipl device attributes */ | ||
275 | |||
276 | DEFINE_IPL_ATTR_RO(ipl_fcp, wwpn, "0x%016llx\n", (unsigned long long) | ||
277 | IPL_PARMBLOCK_START->ipl_info.fcp.wwpn); | ||
278 | DEFINE_IPL_ATTR_RO(ipl_fcp, lun, "0x%016llx\n", (unsigned long long) | ||
279 | IPL_PARMBLOCK_START->ipl_info.fcp.lun); | ||
280 | DEFINE_IPL_ATTR_RO(ipl_fcp, bootprog, "%lld\n", (unsigned long long) | ||
281 | IPL_PARMBLOCK_START->ipl_info.fcp.bootprog); | ||
282 | DEFINE_IPL_ATTR_RO(ipl_fcp, br_lba, "%lld\n", (unsigned long long) | ||
283 | IPL_PARMBLOCK_START->ipl_info.fcp.br_lba); | ||
284 | |||
285 | static struct attribute *ipl_fcp_attrs[] = { | ||
286 | &sys_ipl_type_attr.attr, | ||
287 | &sys_ipl_device_attr.attr, | ||
288 | &sys_ipl_fcp_wwpn_attr.attr, | ||
289 | &sys_ipl_fcp_lun_attr.attr, | ||
290 | &sys_ipl_fcp_bootprog_attr.attr, | ||
291 | &sys_ipl_fcp_br_lba_attr.attr, | ||
292 | NULL, | ||
293 | }; | ||
294 | |||
295 | static struct attribute_group ipl_fcp_attr_group = { | ||
296 | .attrs = ipl_fcp_attrs, | ||
297 | }; | ||
298 | |||
299 | /* CCW ipl device attributes */ | ||
300 | |||
301 | static struct attribute *ipl_ccw_attrs[] = { | ||
302 | &sys_ipl_type_attr.attr, | ||
303 | &sys_ipl_device_attr.attr, | ||
304 | NULL, | ||
305 | }; | ||
306 | |||
307 | static struct attribute_group ipl_ccw_attr_group = { | ||
308 | .attrs = ipl_ccw_attrs, | ||
309 | }; | ||
310 | |||
311 | /* UNKNOWN ipl device attributes */ | ||
312 | |||
313 | static struct attribute *ipl_unknown_attrs[] = { | ||
314 | &sys_ipl_type_attr.attr, | ||
315 | NULL, | ||
316 | }; | ||
317 | |||
318 | static struct attribute_group ipl_unknown_attr_group = { | ||
319 | .attrs = ipl_unknown_attrs, | ||
320 | }; | ||
321 | |||
322 | static decl_subsys(ipl, NULL, NULL); | ||
323 | |||
324 | /* | ||
325 | * reipl section | ||
326 | */ | ||
327 | |||
328 | /* FCP reipl device attributes */ | ||
329 | |||
330 | DEFINE_IPL_ATTR_RW(reipl_fcp, wwpn, "0x%016llx\n", "%016llx\n", | ||
331 | reipl_block_fcp->ipl_info.fcp.wwpn); | ||
332 | DEFINE_IPL_ATTR_RW(reipl_fcp, lun, "0x%016llx\n", "%016llx\n", | ||
333 | reipl_block_fcp->ipl_info.fcp.lun); | ||
334 | DEFINE_IPL_ATTR_RW(reipl_fcp, bootprog, "%lld\n", "%lld\n", | ||
335 | reipl_block_fcp->ipl_info.fcp.bootprog); | ||
336 | DEFINE_IPL_ATTR_RW(reipl_fcp, br_lba, "%lld\n", "%lld\n", | ||
337 | reipl_block_fcp->ipl_info.fcp.br_lba); | ||
338 | DEFINE_IPL_ATTR_RW(reipl_fcp, device, "0.0.%04llx\n", "0.0.%llx\n", | ||
339 | reipl_block_fcp->ipl_info.fcp.devno); | ||
340 | |||
341 | static struct attribute *reipl_fcp_attrs[] = { | ||
342 | &sys_reipl_fcp_device_attr.attr, | ||
343 | &sys_reipl_fcp_wwpn_attr.attr, | ||
344 | &sys_reipl_fcp_lun_attr.attr, | ||
345 | &sys_reipl_fcp_bootprog_attr.attr, | ||
346 | &sys_reipl_fcp_br_lba_attr.attr, | ||
347 | NULL, | ||
348 | }; | ||
349 | |||
350 | static struct attribute_group reipl_fcp_attr_group = { | ||
351 | .name = IPL_FCP_STR, | ||
352 | .attrs = reipl_fcp_attrs, | ||
353 | }; | ||
354 | |||
355 | /* CCW reipl device attributes */ | ||
356 | |||
357 | DEFINE_IPL_ATTR_RW(reipl_ccw, device, "0.0.%04llx\n", "0.0.%llx\n", | ||
358 | reipl_block_ccw->ipl_info.ccw.devno); | ||
359 | |||
360 | static struct attribute *reipl_ccw_attrs[] = { | ||
361 | &sys_reipl_ccw_device_attr.attr, | ||
362 | NULL, | ||
363 | }; | ||
364 | |||
365 | static struct attribute_group reipl_ccw_attr_group = { | ||
366 | .name = IPL_CCW_STR, | ||
367 | .attrs = reipl_ccw_attrs, | ||
368 | }; | ||
369 | |||
370 | /* reipl type */ | ||
371 | |||
372 | static int reipl_set_type(enum ipl_type type) | ||
373 | { | ||
374 | if (!(reipl_capabilities & type)) | ||
375 | return -EINVAL; | ||
376 | |||
377 | switch(type) { | ||
378 | case IPL_TYPE_CCW: | ||
379 | if (MACHINE_IS_VM) | ||
380 | reipl_method = IPL_METHOD_CCW_VM; | ||
381 | else | ||
382 | reipl_method = IPL_METHOD_CCW_CIO; | ||
383 | break; | ||
384 | case IPL_TYPE_FCP: | ||
385 | if (diag308_set_works) | ||
386 | reipl_method = IPL_METHOD_FCP_RW_DIAG; | ||
387 | else if (MACHINE_IS_VM) | ||
388 | reipl_method = IPL_METHOD_FCP_RO_VM; | ||
389 | else | ||
390 | reipl_method = IPL_METHOD_FCP_RO_DIAG; | ||
391 | break; | ||
392 | default: | ||
393 | reipl_method = IPL_METHOD_NONE; | ||
394 | } | ||
395 | reipl_type = type; | ||
396 | return 0; | ||
397 | } | ||
398 | |||
399 | static ssize_t reipl_type_show(struct subsystem *subsys, char *page) | ||
400 | { | ||
401 | return sprintf(page, "%s\n", ipl_type_str(reipl_type)); | ||
402 | } | ||
403 | |||
404 | static ssize_t reipl_type_store(struct subsystem *subsys, const char *buf, | ||
405 | size_t len) | ||
406 | { | ||
407 | int rc = -EINVAL; | ||
408 | |||
409 | if (strncmp(buf, IPL_CCW_STR, strlen(IPL_CCW_STR)) == 0) | ||
410 | rc = reipl_set_type(IPL_TYPE_CCW); | ||
411 | else if (strncmp(buf, IPL_FCP_STR, strlen(IPL_FCP_STR)) == 0) | ||
412 | rc = reipl_set_type(IPL_TYPE_FCP); | ||
413 | return (rc != 0) ? rc : len; | ||
414 | } | ||
415 | |||
416 | static struct subsys_attribute reipl_type_attr = | ||
417 | __ATTR(reipl_type, 0644, reipl_type_show, reipl_type_store); | ||
418 | |||
419 | static decl_subsys(reipl, NULL, NULL); | ||
420 | |||
421 | /* | ||
422 | * dump section | ||
423 | */ | ||
424 | |||
425 | /* FCP dump device attributes */ | ||
426 | |||
427 | DEFINE_IPL_ATTR_RW(dump_fcp, wwpn, "0x%016llx\n", "%016llx\n", | ||
428 | dump_block_fcp->ipl_info.fcp.wwpn); | ||
429 | DEFINE_IPL_ATTR_RW(dump_fcp, lun, "0x%016llx\n", "%016llx\n", | ||
430 | dump_block_fcp->ipl_info.fcp.lun); | ||
431 | DEFINE_IPL_ATTR_RW(dump_fcp, bootprog, "%lld\n", "%lld\n", | ||
432 | dump_block_fcp->ipl_info.fcp.bootprog); | ||
433 | DEFINE_IPL_ATTR_RW(dump_fcp, br_lba, "%lld\n", "%lld\n", | ||
434 | dump_block_fcp->ipl_info.fcp.br_lba); | ||
435 | DEFINE_IPL_ATTR_RW(dump_fcp, device, "0.0.%04llx\n", "0.0.%llx\n", | ||
436 | dump_block_fcp->ipl_info.fcp.devno); | ||
437 | |||
438 | static struct attribute *dump_fcp_attrs[] = { | ||
439 | &sys_dump_fcp_device_attr.attr, | ||
440 | &sys_dump_fcp_wwpn_attr.attr, | ||
441 | &sys_dump_fcp_lun_attr.attr, | ||
442 | &sys_dump_fcp_bootprog_attr.attr, | ||
443 | &sys_dump_fcp_br_lba_attr.attr, | ||
444 | NULL, | ||
445 | }; | ||
446 | |||
447 | static struct attribute_group dump_fcp_attr_group = { | ||
448 | .name = IPL_FCP_STR, | ||
449 | .attrs = dump_fcp_attrs, | ||
450 | }; | ||
451 | |||
452 | /* CCW dump device attributes */ | ||
453 | |||
454 | DEFINE_IPL_ATTR_RW(dump_ccw, device, "0.0.%04llx\n", "0.0.%llx\n", | ||
455 | dump_block_ccw->ipl_info.ccw.devno); | ||
456 | |||
457 | static struct attribute *dump_ccw_attrs[] = { | ||
458 | &sys_dump_ccw_device_attr.attr, | ||
459 | NULL, | ||
460 | }; | ||
461 | |||
462 | static struct attribute_group dump_ccw_attr_group = { | ||
463 | .name = IPL_CCW_STR, | ||
464 | .attrs = dump_ccw_attrs, | ||
465 | }; | ||
466 | |||
467 | /* dump type */ | ||
468 | |||
469 | static int dump_set_type(enum ipl_type type) | ||
470 | { | ||
471 | if (!(dump_capabilities & type)) | ||
472 | return -EINVAL; | ||
473 | switch(type) { | ||
474 | case IPL_TYPE_CCW: | ||
475 | if (MACHINE_IS_VM) | ||
476 | dump_method = IPL_METHOD_CCW_VM; | ||
477 | else | ||
478 | dump_method = IPL_METHOD_CCW_CIO; | ||
479 | break; | ||
480 | case IPL_TYPE_FCP: | ||
481 | dump_method = IPL_METHOD_FCP_RW_DIAG; | ||
482 | break; | ||
483 | default: | ||
484 | dump_method = IPL_METHOD_NONE; | ||
485 | } | ||
486 | dump_type = type; | ||
487 | return 0; | ||
488 | } | ||
489 | |||
490 | static ssize_t dump_type_show(struct subsystem *subsys, char *page) | ||
491 | { | ||
492 | return sprintf(page, "%s\n", ipl_type_str(dump_type)); | ||
493 | } | ||
494 | |||
495 | static ssize_t dump_type_store(struct subsystem *subsys, const char *buf, | ||
496 | size_t len) | ||
497 | { | ||
498 | int rc = -EINVAL; | ||
499 | |||
500 | if (strncmp(buf, IPL_NONE_STR, strlen(IPL_NONE_STR)) == 0) | ||
501 | rc = dump_set_type(IPL_TYPE_NONE); | ||
502 | else if (strncmp(buf, IPL_CCW_STR, strlen(IPL_CCW_STR)) == 0) | ||
503 | rc = dump_set_type(IPL_TYPE_CCW); | ||
504 | else if (strncmp(buf, IPL_FCP_STR, strlen(IPL_FCP_STR)) == 0) | ||
505 | rc = dump_set_type(IPL_TYPE_FCP); | ||
506 | return (rc != 0) ? rc : len; | ||
507 | } | ||
508 | |||
509 | static struct subsys_attribute dump_type_attr = | ||
510 | __ATTR(dump_type, 0644, dump_type_show, dump_type_store); | ||
511 | |||
512 | static decl_subsys(dump, NULL, NULL); | ||
513 | |||
514 | #ifdef CONFIG_SMP | ||
515 | static void dump_smp_stop_all(void) | ||
516 | { | ||
517 | int cpu; | ||
518 | preempt_disable(); | ||
519 | for_each_online_cpu(cpu) { | ||
520 | if (cpu == smp_processor_id()) | ||
521 | continue; | ||
522 | while (signal_processor(cpu, sigp_stop) == sigp_busy) | ||
523 | udelay(10); | ||
524 | } | ||
525 | preempt_enable(); | ||
526 | } | ||
527 | #else | ||
528 | #define dump_smp_stop_all() do { } while (0) | ||
529 | #endif | ||
530 | |||
531 | /* | ||
532 | * Shutdown actions section | ||
533 | */ | ||
534 | |||
535 | static decl_subsys(shutdown_actions, NULL, NULL); | ||
536 | |||
537 | /* on panic */ | ||
538 | |||
539 | static ssize_t on_panic_show(struct subsystem *subsys, char *page) | ||
540 | { | ||
541 | return sprintf(page, "%s\n", shutdown_action_str(on_panic_action)); | ||
542 | } | ||
543 | |||
544 | static ssize_t on_panic_store(struct subsystem *subsys, const char *buf, | ||
545 | size_t len) | ||
546 | { | ||
547 | if (strncmp(buf, SHUTDOWN_REIPL_STR, strlen(SHUTDOWN_REIPL_STR)) == 0) | ||
548 | on_panic_action = SHUTDOWN_REIPL; | ||
549 | else if (strncmp(buf, SHUTDOWN_DUMP_STR, | ||
550 | strlen(SHUTDOWN_DUMP_STR)) == 0) | ||
551 | on_panic_action = SHUTDOWN_DUMP; | ||
552 | else if (strncmp(buf, SHUTDOWN_STOP_STR, | ||
553 | strlen(SHUTDOWN_STOP_STR)) == 0) | ||
554 | on_panic_action = SHUTDOWN_STOP; | ||
555 | else | ||
556 | return -EINVAL; | ||
557 | |||
558 | return len; | ||
559 | } | ||
560 | |||
561 | static struct subsys_attribute on_panic_attr = | ||
562 | __ATTR(on_panic, 0644, on_panic_show, on_panic_store); | ||
563 | |||
564 | static void print_fcp_block(struct ipl_parameter_block *fcp_block) | ||
565 | { | ||
566 | printk(KERN_EMERG "wwpn: %016llx\n", | ||
567 | (unsigned long long)fcp_block->ipl_info.fcp.wwpn); | ||
568 | printk(KERN_EMERG "lun: %016llx\n", | ||
569 | (unsigned long long)fcp_block->ipl_info.fcp.lun); | ||
570 | printk(KERN_EMERG "bootprog: %lld\n", | ||
571 | (unsigned long long)fcp_block->ipl_info.fcp.bootprog); | ||
572 | printk(KERN_EMERG "br_lba: %lld\n", | ||
573 | (unsigned long long)fcp_block->ipl_info.fcp.br_lba); | ||
574 | printk(KERN_EMERG "device: %llx\n", | ||
575 | (unsigned long long)fcp_block->ipl_info.fcp.devno); | ||
576 | printk(KERN_EMERG "opt: %x\n", fcp_block->ipl_info.fcp.opt); | ||
577 | } | ||
578 | |||
579 | void do_reipl(void) | ||
580 | { | ||
581 | struct ccw_dev_id devid; | ||
582 | static char buf[100]; | ||
583 | |||
584 | switch (reipl_type) { | ||
585 | case IPL_TYPE_CCW: | ||
586 | printk(KERN_EMERG "reboot on ccw device: 0.0.%04x\n", | ||
587 | reipl_block_ccw->ipl_info.ccw.devno); | ||
588 | break; | ||
589 | case IPL_TYPE_FCP: | ||
590 | printk(KERN_EMERG "reboot on fcp device:\n"); | ||
591 | print_fcp_block(reipl_block_fcp); | ||
592 | break; | ||
593 | default: | ||
594 | break; | ||
595 | } | ||
596 | |||
597 | switch (reipl_method) { | ||
598 | case IPL_METHOD_CCW_CIO: | ||
599 | devid.devno = reipl_block_ccw->ipl_info.ccw.devno; | ||
600 | devid.ssid = 0; | ||
601 | reipl_ccw_dev(&devid); | ||
602 | break; | ||
603 | case IPL_METHOD_CCW_VM: | ||
604 | sprintf(buf, "IPL %X", reipl_block_ccw->ipl_info.ccw.devno); | ||
605 | cpcmd(buf, NULL, 0, NULL); | ||
606 | break; | ||
607 | case IPL_METHOD_CCW_DIAG: | ||
608 | diag308(DIAG308_SET, reipl_block_ccw); | ||
609 | diag308(DIAG308_IPL, NULL); | ||
610 | break; | ||
611 | case IPL_METHOD_FCP_RW_DIAG: | ||
612 | diag308(DIAG308_SET, reipl_block_fcp); | ||
613 | diag308(DIAG308_IPL, NULL); | ||
614 | break; | ||
615 | case IPL_METHOD_FCP_RO_DIAG: | ||
616 | diag308(DIAG308_IPL, NULL); | ||
617 | break; | ||
618 | case IPL_METHOD_FCP_RO_VM: | ||
619 | cpcmd("IPL", NULL, 0, NULL); | ||
620 | break; | ||
621 | case IPL_METHOD_NONE: | ||
622 | default: | ||
623 | if (MACHINE_IS_VM) | ||
624 | cpcmd("IPL", NULL, 0, NULL); | ||
625 | diag308(DIAG308_IPL, NULL); | ||
626 | break; | ||
627 | } | ||
628 | panic("reipl failed!\n"); | ||
629 | } | ||
630 | |||
631 | static void do_dump(void) | ||
632 | { | ||
633 | struct ccw_dev_id devid; | ||
634 | static char buf[100]; | ||
635 | |||
636 | switch (dump_type) { | ||
637 | case IPL_TYPE_CCW: | ||
638 | printk(KERN_EMERG "Automatic dump on ccw device: 0.0.%04x\n", | ||
639 | dump_block_ccw->ipl_info.ccw.devno); | ||
640 | break; | ||
641 | case IPL_TYPE_FCP: | ||
642 | printk(KERN_EMERG "Automatic dump on fcp device:\n"); | ||
643 | print_fcp_block(dump_block_fcp); | ||
644 | break; | ||
645 | default: | ||
646 | return; | ||
647 | } | ||
648 | |||
649 | switch (dump_method) { | ||
650 | case IPL_METHOD_CCW_CIO: | ||
651 | dump_smp_stop_all(); | ||
652 | devid.devno = dump_block_ccw->ipl_info.ccw.devno; | ||
653 | devid.ssid = 0; | ||
654 | reipl_ccw_dev(&devid); | ||
655 | break; | ||
656 | case IPL_METHOD_CCW_VM: | ||
657 | dump_smp_stop_all(); | ||
658 | sprintf(buf, "STORE STATUS"); | ||
659 | cpcmd(buf, NULL, 0, NULL); | ||
660 | sprintf(buf, "IPL %X", dump_block_ccw->ipl_info.ccw.devno); | ||
661 | cpcmd(buf, NULL, 0, NULL); | ||
662 | break; | ||
663 | case IPL_METHOD_CCW_DIAG: | ||
664 | diag308(DIAG308_SET, dump_block_ccw); | ||
665 | diag308(DIAG308_DUMP, NULL); | ||
666 | break; | ||
667 | case IPL_METHOD_FCP_RW_DIAG: | ||
668 | diag308(DIAG308_SET, dump_block_fcp); | ||
669 | diag308(DIAG308_DUMP, NULL); | ||
670 | break; | ||
671 | case IPL_METHOD_NONE: | ||
672 | default: | ||
673 | return; | ||
674 | } | ||
675 | printk(KERN_EMERG "Dump failed!\n"); | ||
676 | } | ||
677 | |||
678 | /* init functions */ | ||
679 | |||
680 | static int __init ipl_register_fcp_files(void) | ||
681 | { | ||
682 | int rc; | ||
683 | |||
684 | rc = sysfs_create_group(&ipl_subsys.kset.kobj, | ||
685 | &ipl_fcp_attr_group); | ||
686 | if (rc) | ||
687 | goto out; | ||
688 | rc = sysfs_create_bin_file(&ipl_subsys.kset.kobj, | ||
689 | &ipl_parameter_attr); | ||
690 | if (rc) | ||
691 | goto out_ipl_parm; | ||
692 | rc = sysfs_create_bin_file(&ipl_subsys.kset.kobj, | ||
693 | &ipl_scp_data_attr); | ||
694 | if (!rc) | ||
695 | goto out; | ||
696 | |||
697 | sysfs_remove_bin_file(&ipl_subsys.kset.kobj, &ipl_parameter_attr); | ||
698 | |||
699 | out_ipl_parm: | ||
700 | sysfs_remove_group(&ipl_subsys.kset.kobj, &ipl_fcp_attr_group); | ||
701 | out: | ||
702 | return rc; | ||
703 | } | ||
704 | |||
705 | static int __init ipl_init(void) | ||
706 | { | ||
707 | int rc; | ||
708 | |||
709 | rc = firmware_register(&ipl_subsys); | ||
710 | if (rc) | ||
711 | return rc; | ||
712 | switch (ipl_get_type()) { | ||
713 | case IPL_TYPE_CCW: | ||
714 | rc = sysfs_create_group(&ipl_subsys.kset.kobj, | ||
715 | &ipl_ccw_attr_group); | ||
716 | break; | ||
717 | case IPL_TYPE_FCP: | ||
718 | rc = ipl_register_fcp_files(); | ||
719 | break; | ||
720 | default: | ||
721 | rc = sysfs_create_group(&ipl_subsys.kset.kobj, | ||
722 | &ipl_unknown_attr_group); | ||
723 | break; | ||
724 | } | ||
725 | if (rc) | ||
726 | firmware_unregister(&ipl_subsys); | ||
727 | return rc; | ||
728 | } | ||
729 | |||
730 | static void __init reipl_probe(void) | ||
731 | { | ||
732 | void *buffer; | ||
733 | |||
734 | buffer = (void *) get_zeroed_page(GFP_KERNEL); | ||
735 | if (!buffer) | ||
736 | return; | ||
737 | if (diag308(DIAG308_STORE, buffer) == DIAG308_RC_OK) | ||
738 | diag308_set_works = 1; | ||
739 | free_page((unsigned long)buffer); | ||
740 | } | ||
741 | |||
742 | static int __init reipl_ccw_init(void) | ||
743 | { | ||
744 | int rc; | ||
745 | |||
746 | reipl_block_ccw = (void *) get_zeroed_page(GFP_KERNEL); | ||
747 | if (!reipl_block_ccw) | ||
748 | return -ENOMEM; | ||
749 | rc = sysfs_create_group(&reipl_subsys.kset.kobj, &reipl_ccw_attr_group); | ||
750 | if (rc) { | ||
751 | free_page((unsigned long)reipl_block_ccw); | ||
752 | return rc; | ||
753 | } | ||
754 | reipl_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN; | ||
755 | reipl_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION; | ||
756 | reipl_block_ccw->hdr.blk0_len = sizeof(reipl_block_ccw->ipl_info.ccw); | ||
757 | reipl_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW; | ||
758 | if (ipl_get_type() == IPL_TYPE_CCW) | ||
759 | reipl_block_ccw->ipl_info.ccw.devno = ipl_devno; | ||
760 | reipl_capabilities |= IPL_TYPE_CCW; | ||
761 | return 0; | ||
762 | } | ||
763 | |||
764 | static int __init reipl_fcp_init(void) | ||
765 | { | ||
766 | int rc; | ||
767 | |||
768 | if ((!diag308_set_works) && (ipl_get_type() != IPL_TYPE_FCP)) | ||
769 | return 0; | ||
770 | if ((!diag308_set_works) && (ipl_get_type() == IPL_TYPE_FCP)) | ||
771 | make_attrs_ro(reipl_fcp_attrs); | ||
772 | |||
773 | reipl_block_fcp = (void *) get_zeroed_page(GFP_KERNEL); | ||
774 | if (!reipl_block_fcp) | ||
775 | return -ENOMEM; | ||
776 | rc = sysfs_create_group(&reipl_subsys.kset.kobj, &reipl_fcp_attr_group); | ||
777 | if (rc) { | ||
778 | free_page((unsigned long)reipl_block_fcp); | ||
779 | return rc; | ||
780 | } | ||
781 | if (ipl_get_type() == IPL_TYPE_FCP) { | ||
782 | memcpy(reipl_block_fcp, IPL_PARMBLOCK_START, PAGE_SIZE); | ||
783 | } else { | ||
784 | reipl_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN; | ||
785 | reipl_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION; | ||
786 | reipl_block_fcp->hdr.blk0_len = | ||
787 | sizeof(reipl_block_fcp->ipl_info.fcp); | ||
788 | reipl_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP; | ||
789 | reipl_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_IPL; | ||
790 | } | ||
791 | reipl_capabilities |= IPL_TYPE_FCP; | ||
792 | return 0; | ||
793 | } | ||
794 | |||
795 | static int __init reipl_init(void) | ||
796 | { | ||
797 | int rc; | ||
798 | |||
799 | rc = firmware_register(&reipl_subsys); | ||
800 | if (rc) | ||
801 | return rc; | ||
802 | rc = subsys_create_file(&reipl_subsys, &reipl_type_attr); | ||
803 | if (rc) { | ||
804 | firmware_unregister(&reipl_subsys); | ||
805 | return rc; | ||
806 | } | ||
807 | rc = reipl_ccw_init(); | ||
808 | if (rc) | ||
809 | return rc; | ||
810 | rc = reipl_fcp_init(); | ||
811 | if (rc) | ||
812 | return rc; | ||
813 | rc = reipl_set_type(ipl_get_type()); | ||
814 | if (rc) | ||
815 | return rc; | ||
816 | return 0; | ||
817 | } | ||
818 | |||
819 | static int __init dump_ccw_init(void) | ||
820 | { | ||
821 | int rc; | ||
822 | |||
823 | dump_block_ccw = (void *) get_zeroed_page(GFP_KERNEL); | ||
824 | if (!dump_block_ccw) | ||
825 | return -ENOMEM; | ||
826 | rc = sysfs_create_group(&dump_subsys.kset.kobj, &dump_ccw_attr_group); | ||
827 | if (rc) { | ||
828 | free_page((unsigned long)dump_block_ccw); | ||
829 | return rc; | ||
830 | } | ||
831 | dump_block_ccw->hdr.len = IPL_PARM_BLK_CCW_LEN; | ||
832 | dump_block_ccw->hdr.version = IPL_PARM_BLOCK_VERSION; | ||
833 | dump_block_ccw->hdr.blk0_len = sizeof(reipl_block_ccw->ipl_info.ccw); | ||
834 | dump_block_ccw->hdr.pbt = DIAG308_IPL_TYPE_CCW; | ||
835 | dump_capabilities |= IPL_TYPE_CCW; | ||
836 | return 0; | ||
837 | } | ||
838 | |||
839 | extern char s390_readinfo_sccb[]; | ||
840 | |||
841 | static int __init dump_fcp_init(void) | ||
842 | { | ||
843 | int rc; | ||
844 | |||
845 | if(!(s390_readinfo_sccb[91] & 0x2)) | ||
846 | return 0; /* LDIPL DUMP is not installed */ | ||
847 | if (!diag308_set_works) | ||
848 | return 0; | ||
849 | dump_block_fcp = (void *) get_zeroed_page(GFP_KERNEL); | ||
850 | if (!dump_block_fcp) | ||
851 | return -ENOMEM; | ||
852 | rc = sysfs_create_group(&dump_subsys.kset.kobj, &dump_fcp_attr_group); | ||
853 | if (rc) { | ||
854 | free_page((unsigned long)dump_block_fcp); | ||
855 | return rc; | ||
856 | } | ||
857 | dump_block_fcp->hdr.len = IPL_PARM_BLK_FCP_LEN; | ||
858 | dump_block_fcp->hdr.version = IPL_PARM_BLOCK_VERSION; | ||
859 | dump_block_fcp->hdr.blk0_len = sizeof(dump_block_fcp->ipl_info.fcp); | ||
860 | dump_block_fcp->hdr.pbt = DIAG308_IPL_TYPE_FCP; | ||
861 | dump_block_fcp->ipl_info.fcp.opt = DIAG308_IPL_OPT_DUMP; | ||
862 | dump_capabilities |= IPL_TYPE_FCP; | ||
863 | return 0; | ||
864 | } | ||
865 | |||
866 | #define SHUTDOWN_ON_PANIC_PRIO 0 | ||
867 | |||
868 | static int shutdown_on_panic_notify(struct notifier_block *self, | ||
869 | unsigned long event, void *data) | ||
870 | { | ||
871 | if (on_panic_action == SHUTDOWN_DUMP) | ||
872 | do_dump(); | ||
873 | else if (on_panic_action == SHUTDOWN_REIPL) | ||
874 | do_reipl(); | ||
875 | return NOTIFY_OK; | ||
876 | } | ||
877 | |||
878 | static struct notifier_block shutdown_on_panic_nb = { | ||
879 | .notifier_call = shutdown_on_panic_notify, | ||
880 | .priority = SHUTDOWN_ON_PANIC_PRIO | ||
881 | }; | ||
882 | |||
883 | static int __init dump_init(void) | ||
884 | { | ||
885 | int rc; | ||
886 | |||
887 | rc = firmware_register(&dump_subsys); | ||
888 | if (rc) | ||
889 | return rc; | ||
890 | rc = subsys_create_file(&dump_subsys, &dump_type_attr); | ||
891 | if (rc) { | ||
892 | firmware_unregister(&dump_subsys); | ||
893 | return rc; | ||
894 | } | ||
895 | rc = dump_ccw_init(); | ||
896 | if (rc) | ||
897 | return rc; | ||
898 | rc = dump_fcp_init(); | ||
899 | if (rc) | ||
900 | return rc; | ||
901 | dump_set_type(IPL_TYPE_NONE); | ||
902 | return 0; | ||
903 | } | ||
904 | |||
905 | static int __init shutdown_actions_init(void) | ||
906 | { | ||
907 | int rc; | ||
908 | |||
909 | rc = firmware_register(&shutdown_actions_subsys); | ||
910 | if (rc) | ||
911 | return rc; | ||
912 | rc = subsys_create_file(&shutdown_actions_subsys, &on_panic_attr); | ||
913 | if (rc) { | ||
914 | firmware_unregister(&shutdown_actions_subsys); | ||
915 | return rc; | ||
916 | } | ||
917 | atomic_notifier_chain_register(&panic_notifier_list, | ||
918 | &shutdown_on_panic_nb); | ||
919 | return 0; | ||
920 | } | ||
921 | |||
922 | static int __init s390_ipl_init(void) | ||
923 | { | ||
924 | int rc; | ||
925 | |||
926 | reipl_probe(); | ||
927 | rc = ipl_init(); | ||
928 | if (rc) | ||
929 | return rc; | ||
930 | rc = reipl_init(); | ||
931 | if (rc) | ||
932 | return rc; | ||
933 | rc = dump_init(); | ||
934 | if (rc) | ||
935 | return rc; | ||
936 | rc = shutdown_actions_init(); | ||
937 | if (rc) | ||
938 | return rc; | ||
939 | return 0; | ||
940 | } | ||
941 | |||
942 | __initcall(s390_ipl_init); | ||
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c new file mode 100644 index 000000000000..ca28fb0b3790 --- /dev/null +++ b/arch/s390/kernel/kprobes.c | |||
@@ -0,0 +1,657 @@ | |||
1 | /* | ||
2 | * Kernel Probes (KProbes) | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program; if not, write to the Free Software | ||
16 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
17 | * | ||
18 | * Copyright (C) IBM Corporation, 2002, 2006 | ||
19 | * | ||
20 | * s390 port, used ppc64 as template. Mike Grundy <grundym@us.ibm.com> | ||
21 | */ | ||
22 | |||
23 | #include <linux/config.h> | ||
24 | #include <linux/kprobes.h> | ||
25 | #include <linux/ptrace.h> | ||
26 | #include <linux/preempt.h> | ||
27 | #include <linux/stop_machine.h> | ||
28 | #include <asm/cacheflush.h> | ||
29 | #include <asm/kdebug.h> | ||
30 | #include <asm/sections.h> | ||
31 | #include <asm/uaccess.h> | ||
32 | #include <linux/module.h> | ||
33 | |||
34 | DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; | ||
35 | DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | ||
36 | |||
37 | int __kprobes arch_prepare_kprobe(struct kprobe *p) | ||
38 | { | ||
39 | /* Make sure the probe isn't going on a difficult instruction */ | ||
40 | if (is_prohibited_opcode((kprobe_opcode_t *) p->addr)) | ||
41 | return -EINVAL; | ||
42 | |||
43 | if ((unsigned long)p->addr & 0x01) { | ||
44 | printk("Attempt to register kprobe at an unaligned address\n"); | ||
45 | return -EINVAL; | ||
46 | } | ||
47 | |||
48 | /* Use the get_insn_slot() facility for correctness */ | ||
49 | if (!(p->ainsn.insn = get_insn_slot())) | ||
50 | return -ENOMEM; | ||
51 | |||
52 | memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t)); | ||
53 | |||
54 | get_instruction_type(&p->ainsn); | ||
55 | p->opcode = *p->addr; | ||
56 | return 0; | ||
57 | } | ||
58 | |||
59 | int __kprobes is_prohibited_opcode(kprobe_opcode_t *instruction) | ||
60 | { | ||
61 | switch (*(__u8 *) instruction) { | ||
62 | case 0x0c: /* bassm */ | ||
63 | case 0x0b: /* bsm */ | ||
64 | case 0x83: /* diag */ | ||
65 | case 0x44: /* ex */ | ||
66 | return -EINVAL; | ||
67 | } | ||
68 | switch (*(__u16 *) instruction) { | ||
69 | case 0x0101: /* pr */ | ||
70 | case 0xb25a: /* bsa */ | ||
71 | case 0xb240: /* bakr */ | ||
72 | case 0xb258: /* bsg */ | ||
73 | case 0xb218: /* pc */ | ||
74 | case 0xb228: /* pt */ | ||
75 | return -EINVAL; | ||
76 | } | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | void __kprobes get_instruction_type(struct arch_specific_insn *ainsn) | ||
81 | { | ||
82 | /* default fixup method */ | ||
83 | ainsn->fixup = FIXUP_PSW_NORMAL; | ||
84 | |||
85 | /* save r1 operand */ | ||
86 | ainsn->reg = (*ainsn->insn & 0xf0) >> 4; | ||
87 | |||
88 | /* save the instruction length (pop 5-5) in bytes */ | ||
89 | switch (*(__u8 *) (ainsn->insn) >> 4) { | ||
90 | case 0: | ||
91 | ainsn->ilen = 2; | ||
92 | break; | ||
93 | case 1: | ||
94 | case 2: | ||
95 | ainsn->ilen = 4; | ||
96 | break; | ||
97 | case 3: | ||
98 | ainsn->ilen = 6; | ||
99 | break; | ||
100 | } | ||
101 | |||
102 | switch (*(__u8 *) ainsn->insn) { | ||
103 | case 0x05: /* balr */ | ||
104 | case 0x0d: /* basr */ | ||
105 | ainsn->fixup = FIXUP_RETURN_REGISTER; | ||
106 | /* if r2 = 0, no branch will be taken */ | ||
107 | if ((*ainsn->insn & 0x0f) == 0) | ||
108 | ainsn->fixup |= FIXUP_BRANCH_NOT_TAKEN; | ||
109 | break; | ||
110 | case 0x06: /* bctr */ | ||
111 | case 0x07: /* bcr */ | ||
112 | ainsn->fixup = FIXUP_BRANCH_NOT_TAKEN; | ||
113 | break; | ||
114 | case 0x45: /* bal */ | ||
115 | case 0x4d: /* bas */ | ||
116 | ainsn->fixup = FIXUP_RETURN_REGISTER; | ||
117 | break; | ||
118 | case 0x47: /* bc */ | ||
119 | case 0x46: /* bct */ | ||
120 | case 0x86: /* bxh */ | ||
121 | case 0x87: /* bxle */ | ||
122 | ainsn->fixup = FIXUP_BRANCH_NOT_TAKEN; | ||
123 | break; | ||
124 | case 0x82: /* lpsw */ | ||
125 | ainsn->fixup = FIXUP_NOT_REQUIRED; | ||
126 | break; | ||
127 | case 0xb2: /* lpswe */ | ||
128 | if (*(((__u8 *) ainsn->insn) + 1) == 0xb2) { | ||
129 | ainsn->fixup = FIXUP_NOT_REQUIRED; | ||
130 | } | ||
131 | break; | ||
132 | case 0xa7: /* bras */ | ||
133 | if ((*ainsn->insn & 0x0f) == 0x05) { | ||
134 | ainsn->fixup |= FIXUP_RETURN_REGISTER; | ||
135 | } | ||
136 | break; | ||
137 | case 0xc0: | ||
138 | if ((*ainsn->insn & 0x0f) == 0x00 /* larl */ | ||
139 | || (*ainsn->insn & 0x0f) == 0x05) /* brasl */ | ||
140 | ainsn->fixup |= FIXUP_RETURN_REGISTER; | ||
141 | break; | ||
142 | case 0xeb: | ||
143 | if (*(((__u8 *) ainsn->insn) + 5 ) == 0x44 || /* bxhg */ | ||
144 | *(((__u8 *) ainsn->insn) + 5) == 0x45) {/* bxleg */ | ||
145 | ainsn->fixup = FIXUP_BRANCH_NOT_TAKEN; | ||
146 | } | ||
147 | break; | ||
148 | case 0xe3: /* bctg */ | ||
149 | if (*(((__u8 *) ainsn->insn) + 5) == 0x46) { | ||
150 | ainsn->fixup = FIXUP_BRANCH_NOT_TAKEN; | ||
151 | } | ||
152 | break; | ||
153 | } | ||
154 | } | ||
155 | |||
156 | static int __kprobes swap_instruction(void *aref) | ||
157 | { | ||
158 | struct ins_replace_args *args = aref; | ||
159 | int err = -EFAULT; | ||
160 | |||
161 | asm volatile( | ||
162 | "0: mvc 0(2,%2),0(%3)\n" | ||
163 | "1: la %0,0\n" | ||
164 | "2:\n" | ||
165 | EX_TABLE(0b,2b) | ||
166 | : "+d" (err), "=m" (*args->ptr) | ||
167 | : "a" (args->ptr), "a" (&args->new), "m" (args->new)); | ||
168 | return err; | ||
169 | } | ||
170 | |||
171 | void __kprobes arch_arm_kprobe(struct kprobe *p) | ||
172 | { | ||
173 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
174 | unsigned long status = kcb->kprobe_status; | ||
175 | struct ins_replace_args args; | ||
176 | |||
177 | args.ptr = p->addr; | ||
178 | args.old = p->opcode; | ||
179 | args.new = BREAKPOINT_INSTRUCTION; | ||
180 | |||
181 | kcb->kprobe_status = KPROBE_SWAP_INST; | ||
182 | stop_machine_run(swap_instruction, &args, NR_CPUS); | ||
183 | kcb->kprobe_status = status; | ||
184 | } | ||
185 | |||
186 | void __kprobes arch_disarm_kprobe(struct kprobe *p) | ||
187 | { | ||
188 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
189 | unsigned long status = kcb->kprobe_status; | ||
190 | struct ins_replace_args args; | ||
191 | |||
192 | args.ptr = p->addr; | ||
193 | args.old = BREAKPOINT_INSTRUCTION; | ||
194 | args.new = p->opcode; | ||
195 | |||
196 | kcb->kprobe_status = KPROBE_SWAP_INST; | ||
197 | stop_machine_run(swap_instruction, &args, NR_CPUS); | ||
198 | kcb->kprobe_status = status; | ||
199 | } | ||
200 | |||
201 | void __kprobes arch_remove_kprobe(struct kprobe *p) | ||
202 | { | ||
203 | mutex_lock(&kprobe_mutex); | ||
204 | free_insn_slot(p->ainsn.insn); | ||
205 | mutex_unlock(&kprobe_mutex); | ||
206 | } | ||
207 | |||
208 | static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) | ||
209 | { | ||
210 | per_cr_bits kprobe_per_regs[1]; | ||
211 | |||
212 | memset(kprobe_per_regs, 0, sizeof(per_cr_bits)); | ||
213 | regs->psw.addr = (unsigned long)p->ainsn.insn | PSW_ADDR_AMODE; | ||
214 | |||
215 | /* Set up the per control reg info, will pass to lctl */ | ||
216 | kprobe_per_regs[0].em_instruction_fetch = 1; | ||
217 | kprobe_per_regs[0].starting_addr = (unsigned long)p->ainsn.insn; | ||
218 | kprobe_per_regs[0].ending_addr = (unsigned long)p->ainsn.insn + 1; | ||
219 | |||
220 | /* Set the PER control regs, turns on single step for this address */ | ||
221 | __ctl_load(kprobe_per_regs, 9, 11); | ||
222 | regs->psw.mask |= PSW_MASK_PER; | ||
223 | regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK); | ||
224 | } | ||
225 | |||
226 | static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb) | ||
227 | { | ||
228 | kcb->prev_kprobe.kp = kprobe_running(); | ||
229 | kcb->prev_kprobe.status = kcb->kprobe_status; | ||
230 | kcb->prev_kprobe.kprobe_saved_imask = kcb->kprobe_saved_imask; | ||
231 | memcpy(kcb->prev_kprobe.kprobe_saved_ctl, kcb->kprobe_saved_ctl, | ||
232 | sizeof(kcb->kprobe_saved_ctl)); | ||
233 | } | ||
234 | |||
235 | static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb) | ||
236 | { | ||
237 | __get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp; | ||
238 | kcb->kprobe_status = kcb->prev_kprobe.status; | ||
239 | kcb->kprobe_saved_imask = kcb->prev_kprobe.kprobe_saved_imask; | ||
240 | memcpy(kcb->kprobe_saved_ctl, kcb->prev_kprobe.kprobe_saved_ctl, | ||
241 | sizeof(kcb->kprobe_saved_ctl)); | ||
242 | } | ||
243 | |||
244 | static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs, | ||
245 | struct kprobe_ctlblk *kcb) | ||
246 | { | ||
247 | __get_cpu_var(current_kprobe) = p; | ||
248 | /* Save the interrupt and per flags */ | ||
249 | kcb->kprobe_saved_imask = regs->psw.mask & | ||
250 | (PSW_MASK_PER | PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK); | ||
251 | /* Save the control regs that govern PER */ | ||
252 | __ctl_store(kcb->kprobe_saved_ctl, 9, 11); | ||
253 | } | ||
254 | |||
255 | /* Called with kretprobe_lock held */ | ||
256 | void __kprobes arch_prepare_kretprobe(struct kretprobe *rp, | ||
257 | struct pt_regs *regs) | ||
258 | { | ||
259 | struct kretprobe_instance *ri; | ||
260 | |||
261 | if ((ri = get_free_rp_inst(rp)) != NULL) { | ||
262 | ri->rp = rp; | ||
263 | ri->task = current; | ||
264 | ri->ret_addr = (kprobe_opcode_t *) regs->gprs[14]; | ||
265 | |||
266 | /* Replace the return addr with trampoline addr */ | ||
267 | regs->gprs[14] = (unsigned long)&kretprobe_trampoline; | ||
268 | |||
269 | add_rp_inst(ri); | ||
270 | } else { | ||
271 | rp->nmissed++; | ||
272 | } | ||
273 | } | ||
274 | |||
275 | static int __kprobes kprobe_handler(struct pt_regs *regs) | ||
276 | { | ||
277 | struct kprobe *p; | ||
278 | int ret = 0; | ||
279 | unsigned long *addr = (unsigned long *) | ||
280 | ((regs->psw.addr & PSW_ADDR_INSN) - 2); | ||
281 | struct kprobe_ctlblk *kcb; | ||
282 | |||
283 | /* | ||
284 | * We don't want to be preempted for the entire | ||
285 | * duration of kprobe processing | ||
286 | */ | ||
287 | preempt_disable(); | ||
288 | kcb = get_kprobe_ctlblk(); | ||
289 | |||
290 | /* Check we're not actually recursing */ | ||
291 | if (kprobe_running()) { | ||
292 | p = get_kprobe(addr); | ||
293 | if (p) { | ||
294 | if (kcb->kprobe_status == KPROBE_HIT_SS && | ||
295 | *p->ainsn.insn == BREAKPOINT_INSTRUCTION) { | ||
296 | regs->psw.mask &= ~PSW_MASK_PER; | ||
297 | regs->psw.mask |= kcb->kprobe_saved_imask; | ||
298 | goto no_kprobe; | ||
299 | } | ||
300 | /* We have reentered the kprobe_handler(), since | ||
301 | * another probe was hit while within the handler. | ||
302 | * We here save the original kprobes variables and | ||
303 | * just single step on the instruction of the new probe | ||
304 | * without calling any user handlers. | ||
305 | */ | ||
306 | save_previous_kprobe(kcb); | ||
307 | set_current_kprobe(p, regs, kcb); | ||
308 | kprobes_inc_nmissed_count(p); | ||
309 | prepare_singlestep(p, regs); | ||
310 | kcb->kprobe_status = KPROBE_REENTER; | ||
311 | return 1; | ||
312 | } else { | ||
313 | p = __get_cpu_var(current_kprobe); | ||
314 | if (p->break_handler && p->break_handler(p, regs)) { | ||
315 | goto ss_probe; | ||
316 | } | ||
317 | } | ||
318 | goto no_kprobe; | ||
319 | } | ||
320 | |||
321 | p = get_kprobe(addr); | ||
322 | if (!p) { | ||
323 | if (*addr != BREAKPOINT_INSTRUCTION) { | ||
324 | /* | ||
325 | * The breakpoint instruction was removed right | ||
326 | * after we hit it. Another cpu has removed | ||
327 | * either a probepoint or a debugger breakpoint | ||
328 | * at this address. In either case, no further | ||
329 | * handling of this interrupt is appropriate. | ||
330 | * | ||
331 | */ | ||
332 | ret = 1; | ||
333 | } | ||
334 | /* Not one of ours: let kernel handle it */ | ||
335 | goto no_kprobe; | ||
336 | } | ||
337 | |||
338 | kcb->kprobe_status = KPROBE_HIT_ACTIVE; | ||
339 | set_current_kprobe(p, regs, kcb); | ||
340 | if (p->pre_handler && p->pre_handler(p, regs)) | ||
341 | /* handler has already set things up, so skip ss setup */ | ||
342 | return 1; | ||
343 | |||
344 | ss_probe: | ||
345 | prepare_singlestep(p, regs); | ||
346 | kcb->kprobe_status = KPROBE_HIT_SS; | ||
347 | return 1; | ||
348 | |||
349 | no_kprobe: | ||
350 | preempt_enable_no_resched(); | ||
351 | return ret; | ||
352 | } | ||
353 | |||
354 | /* | ||
355 | * Function return probe trampoline: | ||
356 | * - init_kprobes() establishes a probepoint here | ||
357 | * - When the probed function returns, this probe | ||
358 | * causes the handlers to fire | ||
359 | */ | ||
360 | void __kprobes kretprobe_trampoline_holder(void) | ||
361 | { | ||
362 | asm volatile(".global kretprobe_trampoline\n" | ||
363 | "kretprobe_trampoline: bcr 0,0\n"); | ||
364 | } | ||
365 | |||
366 | /* | ||
367 | * Called when the probe at kretprobe trampoline is hit | ||
368 | */ | ||
369 | int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) | ||
370 | { | ||
371 | struct kretprobe_instance *ri = NULL; | ||
372 | struct hlist_head *head; | ||
373 | struct hlist_node *node, *tmp; | ||
374 | unsigned long flags, orig_ret_address = 0; | ||
375 | unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline; | ||
376 | |||
377 | spin_lock_irqsave(&kretprobe_lock, flags); | ||
378 | head = kretprobe_inst_table_head(current); | ||
379 | |||
380 | /* | ||
381 | * It is possible to have multiple instances associated with a given | ||
382 | * task either because an multiple functions in the call path | ||
383 | * have a return probe installed on them, and/or more then one return | ||
384 | * return probe was registered for a target function. | ||
385 | * | ||
386 | * We can handle this because: | ||
387 | * - instances are always inserted at the head of the list | ||
388 | * - when multiple return probes are registered for the same | ||
389 | * function, the first instance's ret_addr will point to the | ||
390 | * real return address, and all the rest will point to | ||
391 | * kretprobe_trampoline | ||
392 | */ | ||
393 | hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { | ||
394 | if (ri->task != current) | ||
395 | /* another task is sharing our hash bucket */ | ||
396 | continue; | ||
397 | |||
398 | if (ri->rp && ri->rp->handler) | ||
399 | ri->rp->handler(ri, regs); | ||
400 | |||
401 | orig_ret_address = (unsigned long)ri->ret_addr; | ||
402 | recycle_rp_inst(ri); | ||
403 | |||
404 | if (orig_ret_address != trampoline_address) { | ||
405 | /* | ||
406 | * This is the real return address. Any other | ||
407 | * instances associated with this task are for | ||
408 | * other calls deeper on the call stack | ||
409 | */ | ||
410 | break; | ||
411 | } | ||
412 | } | ||
413 | BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address)); | ||
414 | regs->psw.addr = orig_ret_address | PSW_ADDR_AMODE; | ||
415 | |||
416 | reset_current_kprobe(); | ||
417 | spin_unlock_irqrestore(&kretprobe_lock, flags); | ||
418 | preempt_enable_no_resched(); | ||
419 | |||
420 | /* | ||
421 | * By returning a non-zero value, we are telling | ||
422 | * kprobe_handler() that we don't want the post_handler | ||
423 | * to run (and have re-enabled preemption) | ||
424 | */ | ||
425 | return 1; | ||
426 | } | ||
427 | |||
428 | /* | ||
429 | * Called after single-stepping. p->addr is the address of the | ||
430 | * instruction whose first byte has been replaced by the "breakpoint" | ||
431 | * instruction. To avoid the SMP problems that can occur when we | ||
432 | * temporarily put back the original opcode to single-step, we | ||
433 | * single-stepped a copy of the instruction. The address of this | ||
434 | * copy is p->ainsn.insn. | ||
435 | */ | ||
436 | static void __kprobes resume_execution(struct kprobe *p, struct pt_regs *regs) | ||
437 | { | ||
438 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
439 | |||
440 | regs->psw.addr &= PSW_ADDR_INSN; | ||
441 | |||
442 | if (p->ainsn.fixup & FIXUP_PSW_NORMAL) | ||
443 | regs->psw.addr = (unsigned long)p->addr + | ||
444 | ((unsigned long)regs->psw.addr - | ||
445 | (unsigned long)p->ainsn.insn); | ||
446 | |||
447 | if (p->ainsn.fixup & FIXUP_BRANCH_NOT_TAKEN) | ||
448 | if ((unsigned long)regs->psw.addr - | ||
449 | (unsigned long)p->ainsn.insn == p->ainsn.ilen) | ||
450 | regs->psw.addr = (unsigned long)p->addr + p->ainsn.ilen; | ||
451 | |||
452 | if (p->ainsn.fixup & FIXUP_RETURN_REGISTER) | ||
453 | regs->gprs[p->ainsn.reg] = ((unsigned long)p->addr + | ||
454 | (regs->gprs[p->ainsn.reg] - | ||
455 | (unsigned long)p->ainsn.insn)) | ||
456 | | PSW_ADDR_AMODE; | ||
457 | |||
458 | regs->psw.addr |= PSW_ADDR_AMODE; | ||
459 | /* turn off PER mode */ | ||
460 | regs->psw.mask &= ~PSW_MASK_PER; | ||
461 | /* Restore the original per control regs */ | ||
462 | __ctl_load(kcb->kprobe_saved_ctl, 9, 11); | ||
463 | regs->psw.mask |= kcb->kprobe_saved_imask; | ||
464 | } | ||
465 | |||
466 | static int __kprobes post_kprobe_handler(struct pt_regs *regs) | ||
467 | { | ||
468 | struct kprobe *cur = kprobe_running(); | ||
469 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
470 | |||
471 | if (!cur) | ||
472 | return 0; | ||
473 | |||
474 | if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { | ||
475 | kcb->kprobe_status = KPROBE_HIT_SSDONE; | ||
476 | cur->post_handler(cur, regs, 0); | ||
477 | } | ||
478 | |||
479 | resume_execution(cur, regs); | ||
480 | |||
481 | /*Restore back the original saved kprobes variables and continue. */ | ||
482 | if (kcb->kprobe_status == KPROBE_REENTER) { | ||
483 | restore_previous_kprobe(kcb); | ||
484 | goto out; | ||
485 | } | ||
486 | reset_current_kprobe(); | ||
487 | out: | ||
488 | preempt_enable_no_resched(); | ||
489 | |||
490 | /* | ||
491 | * if somebody else is singlestepping across a probe point, psw mask | ||
492 | * will have PER set, in which case, continue the remaining processing | ||
493 | * of do_single_step, as if this is not a probe hit. | ||
494 | */ | ||
495 | if (regs->psw.mask & PSW_MASK_PER) { | ||
496 | return 0; | ||
497 | } | ||
498 | |||
499 | return 1; | ||
500 | } | ||
501 | |||
502 | static int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | ||
503 | { | ||
504 | struct kprobe *cur = kprobe_running(); | ||
505 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
506 | const struct exception_table_entry *entry; | ||
507 | |||
508 | switch(kcb->kprobe_status) { | ||
509 | case KPROBE_SWAP_INST: | ||
510 | /* We are here because the instruction replacement failed */ | ||
511 | return 0; | ||
512 | case KPROBE_HIT_SS: | ||
513 | case KPROBE_REENTER: | ||
514 | /* | ||
515 | * We are here because the instruction being single | ||
516 | * stepped caused a page fault. We reset the current | ||
517 | * kprobe and the nip points back to the probe address | ||
518 | * and allow the page fault handler to continue as a | ||
519 | * normal page fault. | ||
520 | */ | ||
521 | regs->psw.addr = (unsigned long)cur->addr | PSW_ADDR_AMODE; | ||
522 | regs->psw.mask &= ~PSW_MASK_PER; | ||
523 | regs->psw.mask |= kcb->kprobe_saved_imask; | ||
524 | if (kcb->kprobe_status == KPROBE_REENTER) | ||
525 | restore_previous_kprobe(kcb); | ||
526 | else | ||
527 | reset_current_kprobe(); | ||
528 | preempt_enable_no_resched(); | ||
529 | break; | ||
530 | case KPROBE_HIT_ACTIVE: | ||
531 | case KPROBE_HIT_SSDONE: | ||
532 | /* | ||
533 | * We increment the nmissed count for accounting, | ||
534 | * we can also use npre/npostfault count for accouting | ||
535 | * these specific fault cases. | ||
536 | */ | ||
537 | kprobes_inc_nmissed_count(cur); | ||
538 | |||
539 | /* | ||
540 | * We come here because instructions in the pre/post | ||
541 | * handler caused the page_fault, this could happen | ||
542 | * if handler tries to access user space by | ||
543 | * copy_from_user(), get_user() etc. Let the | ||
544 | * user-specified handler try to fix it first. | ||
545 | */ | ||
546 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | ||
547 | return 1; | ||
548 | |||
549 | /* | ||
550 | * In case the user-specified fault handler returned | ||
551 | * zero, try to fix up. | ||
552 | */ | ||
553 | entry = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); | ||
554 | if (entry) { | ||
555 | regs->psw.addr = entry->fixup | PSW_ADDR_AMODE; | ||
556 | return 1; | ||
557 | } | ||
558 | |||
559 | /* | ||
560 | * fixup_exception() could not handle it, | ||
561 | * Let do_page_fault() fix it. | ||
562 | */ | ||
563 | break; | ||
564 | default: | ||
565 | break; | ||
566 | } | ||
567 | return 0; | ||
568 | } | ||
569 | |||
570 | /* | ||
571 | * Wrapper routine to for handling exceptions. | ||
572 | */ | ||
573 | int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | ||
574 | unsigned long val, void *data) | ||
575 | { | ||
576 | struct die_args *args = (struct die_args *)data; | ||
577 | int ret = NOTIFY_DONE; | ||
578 | |||
579 | switch (val) { | ||
580 | case DIE_BPT: | ||
581 | if (kprobe_handler(args->regs)) | ||
582 | ret = NOTIFY_STOP; | ||
583 | break; | ||
584 | case DIE_SSTEP: | ||
585 | if (post_kprobe_handler(args->regs)) | ||
586 | ret = NOTIFY_STOP; | ||
587 | break; | ||
588 | case DIE_TRAP: | ||
589 | case DIE_PAGE_FAULT: | ||
590 | /* kprobe_running() needs smp_processor_id() */ | ||
591 | preempt_disable(); | ||
592 | if (kprobe_running() && | ||
593 | kprobe_fault_handler(args->regs, args->trapnr)) | ||
594 | ret = NOTIFY_STOP; | ||
595 | preempt_enable(); | ||
596 | break; | ||
597 | default: | ||
598 | break; | ||
599 | } | ||
600 | return ret; | ||
601 | } | ||
602 | |||
603 | int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | ||
604 | { | ||
605 | struct jprobe *jp = container_of(p, struct jprobe, kp); | ||
606 | unsigned long addr; | ||
607 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
608 | |||
609 | memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs)); | ||
610 | |||
611 | /* setup return addr to the jprobe handler routine */ | ||
612 | regs->psw.addr = (unsigned long)(jp->entry) | PSW_ADDR_AMODE; | ||
613 | |||
614 | /* r14 is the function return address */ | ||
615 | kcb->jprobe_saved_r14 = (unsigned long)regs->gprs[14]; | ||
616 | /* r15 is the stack pointer */ | ||
617 | kcb->jprobe_saved_r15 = (unsigned long)regs->gprs[15]; | ||
618 | addr = (unsigned long)kcb->jprobe_saved_r15; | ||
619 | |||
620 | memcpy(kcb->jprobes_stack, (kprobe_opcode_t *) addr, | ||
621 | MIN_STACK_SIZE(addr)); | ||
622 | return 1; | ||
623 | } | ||
624 | |||
625 | void __kprobes jprobe_return(void) | ||
626 | { | ||
627 | asm volatile(".word 0x0002"); | ||
628 | } | ||
629 | |||
630 | void __kprobes jprobe_return_end(void) | ||
631 | { | ||
632 | asm volatile("bcr 0,0"); | ||
633 | } | ||
634 | |||
635 | int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | ||
636 | { | ||
637 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
638 | unsigned long stack_addr = (unsigned long)(kcb->jprobe_saved_r15); | ||
639 | |||
640 | /* Put the regs back */ | ||
641 | memcpy(regs, &kcb->jprobe_saved_regs, sizeof(struct pt_regs)); | ||
642 | /* put the stack back */ | ||
643 | memcpy((kprobe_opcode_t *) stack_addr, kcb->jprobes_stack, | ||
644 | MIN_STACK_SIZE(stack_addr)); | ||
645 | preempt_enable_no_resched(); | ||
646 | return 1; | ||
647 | } | ||
648 | |||
649 | static struct kprobe trampoline_p = { | ||
650 | .addr = (kprobe_opcode_t *) & kretprobe_trampoline, | ||
651 | .pre_handler = trampoline_probe_handler | ||
652 | }; | ||
653 | |||
654 | int __init arch_init_kprobes(void) | ||
655 | { | ||
656 | return register_kprobe(&trampoline_p); | ||
657 | } | ||
diff --git a/arch/s390/kernel/reipl.S b/arch/s390/kernel/reipl.S index 658e5ac484f9..4562cdbce8eb 100644 --- a/arch/s390/kernel/reipl.S +++ b/arch/s390/kernel/reipl.S | |||
@@ -8,13 +8,30 @@ | |||
8 | 8 | ||
9 | #include <asm/lowcore.h> | 9 | #include <asm/lowcore.h> |
10 | 10 | ||
11 | .globl do_reipl | 11 | .globl do_reipl_asm |
12 | do_reipl: basr %r13,0 | 12 | do_reipl_asm: basr %r13,0 |
13 | .Lpg0: lpsw .Lnewpsw-.Lpg0(%r13) | 13 | .Lpg0: lpsw .Lnewpsw-.Lpg0(%r13) |
14 | .Lpg1: lctl %c6,%c6,.Lall-.Lpg0(%r13) | 14 | |
15 | stctl %c0,%c0,.Lctlsave-.Lpg0(%r13) | 15 | # switch off lowcore protection |
16 | ni .Lctlsave-.Lpg0(%r13),0xef | 16 | |
17 | lctl %c0,%c0,.Lctlsave-.Lpg0(%r13) | 17 | .Lpg1: stctl %c0,%c0,.Lctlsave1-.Lpg0(%r13) |
18 | stctl %c0,%c0,.Lctlsave2-.Lpg0(%r13) | ||
19 | ni .Lctlsave1-.Lpg0(%r13),0xef | ||
20 | lctl %c0,%c0,.Lctlsave1-.Lpg0(%r13) | ||
21 | |||
22 | # do store status of all registers | ||
23 | |||
24 | stm %r0,%r15,__LC_GPREGS_SAVE_AREA | ||
25 | stctl %c0,%c15,__LC_CREGS_SAVE_AREA | ||
26 | mvc __LC_CREGS_SAVE_AREA(4),.Lctlsave2-.Lpg0(%r13) | ||
27 | stam %a0,%a15,__LC_AREGS_SAVE_AREA | ||
28 | stpx __LC_PREFIX_SAVE_AREA | ||
29 | stckc .Lclkcmp-.Lpg0(%r13) | ||
30 | mvc __LC_CLOCK_COMP_SAVE_AREA(8),.Lclkcmp-.Lpg0(%r13) | ||
31 | stpt __LC_CPU_TIMER_SAVE_AREA | ||
32 | st %r13, __LC_PSW_SAVE_AREA+4 | ||
33 | |||
34 | lctl %c6,%c6,.Lall-.Lpg0(%r13) | ||
18 | lr %r1,%r2 | 35 | lr %r1,%r2 |
19 | mvc __LC_PGM_NEW_PSW(8),.Lpcnew-.Lpg0(%r13) | 36 | mvc __LC_PGM_NEW_PSW(8),.Lpcnew-.Lpg0(%r13) |
20 | stsch .Lschib-.Lpg0(%r13) | 37 | stsch .Lschib-.Lpg0(%r13) |
@@ -46,9 +63,11 @@ do_reipl: basr %r13,0 | |||
46 | .Ldisab: st %r14,.Ldispsw+4-.Lpg0(%r13) | 63 | .Ldisab: st %r14,.Ldispsw+4-.Lpg0(%r13) |
47 | lpsw .Ldispsw-.Lpg0(%r13) | 64 | lpsw .Ldispsw-.Lpg0(%r13) |
48 | .align 8 | 65 | .align 8 |
66 | .Lclkcmp: .quad 0x0000000000000000 | ||
49 | .Lall: .long 0xff000000 | 67 | .Lall: .long 0xff000000 |
50 | .Lnull: .long 0x00000000 | 68 | .Lnull: .long 0x00000000 |
51 | .Lctlsave: .long 0x00000000 | 69 | .Lctlsave1: .long 0x00000000 |
70 | .Lctlsave2: .long 0x00000000 | ||
52 | .align 8 | 71 | .align 8 |
53 | .Lnewpsw: .long 0x00080000,0x80000000+.Lpg1 | 72 | .Lnewpsw: .long 0x00080000,0x80000000+.Lpg1 |
54 | .Lpcnew: .long 0x00080000,0x80000000+.Lecs | 73 | .Lpcnew: .long 0x00080000,0x80000000+.Lecs |
diff --git a/arch/s390/kernel/reipl64.S b/arch/s390/kernel/reipl64.S index 4d090d60f3ef..95bd1e234f63 100644 --- a/arch/s390/kernel/reipl64.S +++ b/arch/s390/kernel/reipl64.S | |||
@@ -8,13 +8,30 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <asm/lowcore.h> | 10 | #include <asm/lowcore.h> |
11 | .globl do_reipl | 11 | .globl do_reipl_asm |
12 | do_reipl: basr %r13,0 | 12 | do_reipl_asm: basr %r13,0 |
13 | .Lpg0: lpswe .Lnewpsw-.Lpg0(%r13) | 13 | |
14 | # do store status of all registers | ||
15 | |||
16 | .Lpg0: stg %r1,.Lregsave-.Lpg0(%r13) | ||
17 | lghi %r1,0x1000 | ||
18 | stmg %r0,%r15,__LC_GPREGS_SAVE_AREA-0x1000(%r1) | ||
19 | lg %r0,.Lregsave-.Lpg0(%r13) | ||
20 | stg %r0,__LC_GPREGS_SAVE_AREA-0x1000+8(%r1) | ||
21 | stctg %c0,%c15,__LC_CREGS_SAVE_AREA-0x1000(%r1) | ||
22 | stam %a0,%a15,__LC_AREGS_SAVE_AREA-0x1000(%r1) | ||
23 | stpx __LC_PREFIX_SAVE_AREA-0x1000(%r1) | ||
24 | stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1) | ||
25 | stckc .Lclkcmp-.Lpg0(%r13) | ||
26 | mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(8,%r1),.Lclkcmp-.Lpg0(%r13) | ||
27 | stpt __LC_CPU_TIMER_SAVE_AREA-0x1000(%r1) | ||
28 | stg %r13, __LC_PSW_SAVE_AREA-0x1000+8(%r1) | ||
29 | |||
30 | lpswe .Lnewpsw-.Lpg0(%r13) | ||
14 | .Lpg1: lctlg %c6,%c6,.Lall-.Lpg0(%r13) | 31 | .Lpg1: lctlg %c6,%c6,.Lall-.Lpg0(%r13) |
15 | stctg %c0,%c0,.Lctlsave-.Lpg0(%r13) | 32 | stctg %c0,%c0,.Lregsave-.Lpg0(%r13) |
16 | ni .Lctlsave+4-.Lpg0(%r13),0xef | 33 | ni .Lregsave+4-.Lpg0(%r13),0xef |
17 | lctlg %c0,%c0,.Lctlsave-.Lpg0(%r13) | 34 | lctlg %c0,%c0,.Lregsave-.Lpg0(%r13) |
18 | lgr %r1,%r2 | 35 | lgr %r1,%r2 |
19 | mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13) | 36 | mvc __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13) |
20 | stsch .Lschib-.Lpg0(%r13) | 37 | stsch .Lschib-.Lpg0(%r13) |
@@ -50,8 +67,9 @@ do_reipl: basr %r13,0 | |||
50 | st %r14,.Ldispsw+12-.Lpg0(%r13) | 67 | st %r14,.Ldispsw+12-.Lpg0(%r13) |
51 | lpswe .Ldispsw-.Lpg0(%r13) | 68 | lpswe .Ldispsw-.Lpg0(%r13) |
52 | .align 8 | 69 | .align 8 |
70 | .Lclkcmp: .quad 0x0000000000000000 | ||
53 | .Lall: .quad 0x00000000ff000000 | 71 | .Lall: .quad 0x00000000ff000000 |
54 | .Lctlsave: .quad 0x0000000000000000 | 72 | .Lregsave: .quad 0x0000000000000000 |
55 | .Lnull: .long 0x0000000000000000 | 73 | .Lnull: .long 0x0000000000000000 |
56 | .align 16 | 74 | .align 16 |
57 | /* | 75 | /* |
@@ -92,5 +110,3 @@ do_reipl: basr %r13,0 | |||
92 | .long 0x00000000,0x00000000 | 110 | .long 0x00000000,0x00000000 |
93 | .long 0x00000000,0x00000000 | 111 | .long 0x00000000,0x00000000 |
94 | 112 | ||
95 | |||
96 | |||
diff --git a/arch/s390/kernel/reipl_diag.c b/arch/s390/kernel/reipl_diag.c deleted file mode 100644 index 1f33951ba439..000000000000 --- a/arch/s390/kernel/reipl_diag.c +++ /dev/null | |||
@@ -1,39 +0,0 @@ | |||
1 | /* | ||
2 | * This file contains the implementation of the | ||
3 | * Linux re-IPL support | ||
4 | * | ||
5 | * (C) Copyright IBM Corp. 2005 | ||
6 | * | ||
7 | * Author(s): Volker Sameske (sameske@de.ibm.com) | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | |||
13 | static unsigned int reipl_diag_rc1; | ||
14 | static unsigned int reipl_diag_rc2; | ||
15 | |||
16 | /* | ||
17 | * re-IPL the system using the last used IPL parameters | ||
18 | */ | ||
19 | void reipl_diag(void) | ||
20 | { | ||
21 | asm volatile ( | ||
22 | " la %%r4,0\n" | ||
23 | " la %%r5,0\n" | ||
24 | " diag %%r4,%2,0x308\n" | ||
25 | "0:\n" | ||
26 | " st %%r4,%0\n" | ||
27 | " st %%r5,%1\n" | ||
28 | ".section __ex_table,\"a\"\n" | ||
29 | #ifdef CONFIG_64BIT | ||
30 | " .align 8\n" | ||
31 | " .quad 0b, 0b\n" | ||
32 | #else | ||
33 | " .align 4\n" | ||
34 | " .long 0b, 0b\n" | ||
35 | #endif | ||
36 | ".previous\n" | ||
37 | : "=m" (reipl_diag_rc1), "=m" (reipl_diag_rc2) | ||
38 | : "d" (3) : "cc", "4", "5" ); | ||
39 | } | ||
diff --git a/arch/s390/kernel/s390_ksyms.c b/arch/s390/kernel/s390_ksyms.c index c73a45467fa4..9f19e833a562 100644 --- a/arch/s390/kernel/s390_ksyms.c +++ b/arch/s390/kernel/s390_ksyms.c | |||
@@ -25,12 +25,6 @@ EXPORT_SYMBOL(_oi_bitmap); | |||
25 | EXPORT_SYMBOL(_ni_bitmap); | 25 | EXPORT_SYMBOL(_ni_bitmap); |
26 | EXPORT_SYMBOL(_zb_findmap); | 26 | EXPORT_SYMBOL(_zb_findmap); |
27 | EXPORT_SYMBOL(_sb_findmap); | 27 | EXPORT_SYMBOL(_sb_findmap); |
28 | EXPORT_SYMBOL(__copy_from_user_asm); | ||
29 | EXPORT_SYMBOL(__copy_to_user_asm); | ||
30 | EXPORT_SYMBOL(__copy_in_user_asm); | ||
31 | EXPORT_SYMBOL(__clear_user_asm); | ||
32 | EXPORT_SYMBOL(__strncpy_from_user_asm); | ||
33 | EXPORT_SYMBOL(__strnlen_user_asm); | ||
34 | EXPORT_SYMBOL(diag10); | 28 | EXPORT_SYMBOL(diag10); |
35 | 29 | ||
36 | /* | 30 | /* |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index c902f059c7aa..e3d9325f6022 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #include <linux/kernel_stat.h> | 37 | #include <linux/kernel_stat.h> |
38 | #include <linux/device.h> | 38 | #include <linux/device.h> |
39 | #include <linux/notifier.h> | 39 | #include <linux/notifier.h> |
40 | #include <linux/pfn.h> | ||
40 | 41 | ||
41 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
42 | #include <asm/system.h> | 43 | #include <asm/system.h> |
@@ -50,6 +51,12 @@ | |||
50 | #include <asm/sections.h> | 51 | #include <asm/sections.h> |
51 | 52 | ||
52 | /* | 53 | /* |
54 | * User copy operations. | ||
55 | */ | ||
56 | struct uaccess_ops uaccess; | ||
57 | EXPORT_SYMBOL_GPL(uaccess); | ||
58 | |||
59 | /* | ||
53 | * Machine setup.. | 60 | * Machine setup.. |
54 | */ | 61 | */ |
55 | unsigned int console_mode = 0; | 62 | unsigned int console_mode = 0; |
@@ -284,16 +291,9 @@ void (*_machine_power_off)(void) = machine_power_off_smp; | |||
284 | /* | 291 | /* |
285 | * Reboot, halt and power_off routines for non SMP. | 292 | * Reboot, halt and power_off routines for non SMP. |
286 | */ | 293 | */ |
287 | extern void reipl(unsigned long devno); | ||
288 | extern void reipl_diag(void); | ||
289 | static void do_machine_restart_nonsmp(char * __unused) | 294 | static void do_machine_restart_nonsmp(char * __unused) |
290 | { | 295 | { |
291 | reipl_diag(); | 296 | do_reipl(); |
292 | |||
293 | if (MACHINE_IS_VM) | ||
294 | cpcmd ("IPL", NULL, 0, NULL); | ||
295 | else | ||
296 | reipl (0x10000 | S390_lowcore.ipl_device); | ||
297 | } | 297 | } |
298 | 298 | ||
299 | static void do_machine_halt_nonsmp(void) | 299 | static void do_machine_halt_nonsmp(void) |
@@ -501,13 +501,47 @@ setup_memory(void) | |||
501 | * partially used pages are not usable - thus | 501 | * partially used pages are not usable - thus |
502 | * we are rounding upwards: | 502 | * we are rounding upwards: |
503 | */ | 503 | */ |
504 | start_pfn = (__pa(&_end) + PAGE_SIZE - 1) >> PAGE_SHIFT; | 504 | start_pfn = PFN_UP(__pa(&_end)); |
505 | end_pfn = max_pfn = memory_end >> PAGE_SHIFT; | 505 | end_pfn = max_pfn = PFN_DOWN(memory_end); |
506 | 506 | ||
507 | /* Initialize storage key for kernel pages */ | 507 | /* Initialize storage key for kernel pages */ |
508 | for (init_pfn = 0 ; init_pfn < start_pfn; init_pfn++) | 508 | for (init_pfn = 0 ; init_pfn < start_pfn; init_pfn++) |
509 | page_set_storage_key(init_pfn << PAGE_SHIFT, PAGE_DEFAULT_KEY); | 509 | page_set_storage_key(init_pfn << PAGE_SHIFT, PAGE_DEFAULT_KEY); |
510 | 510 | ||
511 | #ifdef CONFIG_BLK_DEV_INITRD | ||
512 | /* | ||
513 | * Move the initrd in case the bitmap of the bootmem allocater | ||
514 | * would overwrite it. | ||
515 | */ | ||
516 | |||
517 | if (INITRD_START && INITRD_SIZE) { | ||
518 | unsigned long bmap_size; | ||
519 | unsigned long start; | ||
520 | |||
521 | bmap_size = bootmem_bootmap_pages(end_pfn - start_pfn + 1); | ||
522 | bmap_size = PFN_PHYS(bmap_size); | ||
523 | |||
524 | if (PFN_PHYS(start_pfn) + bmap_size > INITRD_START) { | ||
525 | start = PFN_PHYS(start_pfn) + bmap_size + PAGE_SIZE; | ||
526 | |||
527 | if (start + INITRD_SIZE > memory_end) { | ||
528 | printk("initrd extends beyond end of memory " | ||
529 | "(0x%08lx > 0x%08lx)\n" | ||
530 | "disabling initrd\n", | ||
531 | start + INITRD_SIZE, memory_end); | ||
532 | INITRD_START = INITRD_SIZE = 0; | ||
533 | } else { | ||
534 | printk("Moving initrd (0x%08lx -> 0x%08lx, " | ||
535 | "size: %ld)\n", | ||
536 | INITRD_START, start, INITRD_SIZE); | ||
537 | memmove((void *) start, (void *) INITRD_START, | ||
538 | INITRD_SIZE); | ||
539 | INITRD_START = start; | ||
540 | } | ||
541 | } | ||
542 | } | ||
543 | #endif | ||
544 | |||
511 | /* | 545 | /* |
512 | * Initialize the boot-time allocator (with low memory only): | 546 | * Initialize the boot-time allocator (with low memory only): |
513 | */ | 547 | */ |
@@ -559,7 +593,7 @@ setup_memory(void) | |||
559 | reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size); | 593 | reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size); |
560 | 594 | ||
561 | #ifdef CONFIG_BLK_DEV_INITRD | 595 | #ifdef CONFIG_BLK_DEV_INITRD |
562 | if (INITRD_START) { | 596 | if (INITRD_START && INITRD_SIZE) { |
563 | if (INITRD_START + INITRD_SIZE <= memory_end) { | 597 | if (INITRD_START + INITRD_SIZE <= memory_end) { |
564 | reserve_bootmem(INITRD_START, INITRD_SIZE); | 598 | reserve_bootmem(INITRD_START, INITRD_SIZE); |
565 | initrd_start = INITRD_START; | 599 | initrd_start = INITRD_START; |
@@ -613,6 +647,11 @@ setup_arch(char **cmdline_p) | |||
613 | 647 | ||
614 | memory_end = memory_size; | 648 | memory_end = memory_size; |
615 | 649 | ||
650 | if (MACHINE_HAS_MVCOS) | ||
651 | memcpy(&uaccess, &uaccess_mvcos, sizeof(uaccess)); | ||
652 | else | ||
653 | memcpy(&uaccess, &uaccess_std, sizeof(uaccess)); | ||
654 | |||
616 | parse_early_param(); | 655 | parse_early_param(); |
617 | 656 | ||
618 | #ifndef CONFIG_64BIT | 657 | #ifndef CONFIG_64BIT |
@@ -720,214 +759,3 @@ struct seq_operations cpuinfo_op = { | |||
720 | .show = show_cpuinfo, | 759 | .show = show_cpuinfo, |
721 | }; | 760 | }; |
722 | 761 | ||
723 | #define DEFINE_IPL_ATTR(_name, _format, _value) \ | ||
724 | static ssize_t ipl_##_name##_show(struct subsystem *subsys, \ | ||
725 | char *page) \ | ||
726 | { \ | ||
727 | return sprintf(page, _format, _value); \ | ||
728 | } \ | ||
729 | static struct subsys_attribute ipl_##_name##_attr = \ | ||
730 | __ATTR(_name, S_IRUGO, ipl_##_name##_show, NULL); | ||
731 | |||
732 | DEFINE_IPL_ATTR(wwpn, "0x%016llx\n", (unsigned long long) | ||
733 | IPL_PARMBLOCK_START->fcp.wwpn); | ||
734 | DEFINE_IPL_ATTR(lun, "0x%016llx\n", (unsigned long long) | ||
735 | IPL_PARMBLOCK_START->fcp.lun); | ||
736 | DEFINE_IPL_ATTR(bootprog, "%lld\n", (unsigned long long) | ||
737 | IPL_PARMBLOCK_START->fcp.bootprog); | ||
738 | DEFINE_IPL_ATTR(br_lba, "%lld\n", (unsigned long long) | ||
739 | IPL_PARMBLOCK_START->fcp.br_lba); | ||
740 | |||
741 | enum ipl_type_type { | ||
742 | ipl_type_unknown, | ||
743 | ipl_type_ccw, | ||
744 | ipl_type_fcp, | ||
745 | }; | ||
746 | |||
747 | static enum ipl_type_type | ||
748 | get_ipl_type(void) | ||
749 | { | ||
750 | struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START; | ||
751 | |||
752 | if (!IPL_DEVNO_VALID) | ||
753 | return ipl_type_unknown; | ||
754 | if (!IPL_PARMBLOCK_VALID) | ||
755 | return ipl_type_ccw; | ||
756 | if (ipl->hdr.header.version > IPL_MAX_SUPPORTED_VERSION) | ||
757 | return ipl_type_unknown; | ||
758 | if (ipl->fcp.pbt != IPL_TYPE_FCP) | ||
759 | return ipl_type_unknown; | ||
760 | return ipl_type_fcp; | ||
761 | } | ||
762 | |||
763 | static ssize_t | ||
764 | ipl_type_show(struct subsystem *subsys, char *page) | ||
765 | { | ||
766 | switch (get_ipl_type()) { | ||
767 | case ipl_type_ccw: | ||
768 | return sprintf(page, "ccw\n"); | ||
769 | case ipl_type_fcp: | ||
770 | return sprintf(page, "fcp\n"); | ||
771 | default: | ||
772 | return sprintf(page, "unknown\n"); | ||
773 | } | ||
774 | } | ||
775 | |||
776 | static struct subsys_attribute ipl_type_attr = __ATTR_RO(ipl_type); | ||
777 | |||
778 | static ssize_t | ||
779 | ipl_device_show(struct subsystem *subsys, char *page) | ||
780 | { | ||
781 | struct ipl_parameter_block *ipl = IPL_PARMBLOCK_START; | ||
782 | |||
783 | switch (get_ipl_type()) { | ||
784 | case ipl_type_ccw: | ||
785 | return sprintf(page, "0.0.%04x\n", ipl_devno); | ||
786 | case ipl_type_fcp: | ||
787 | return sprintf(page, "0.0.%04x\n", ipl->fcp.devno); | ||
788 | default: | ||
789 | return 0; | ||
790 | } | ||
791 | } | ||
792 | |||
793 | static struct subsys_attribute ipl_device_attr = | ||
794 | __ATTR(device, S_IRUGO, ipl_device_show, NULL); | ||
795 | |||
796 | static struct attribute *ipl_fcp_attrs[] = { | ||
797 | &ipl_type_attr.attr, | ||
798 | &ipl_device_attr.attr, | ||
799 | &ipl_wwpn_attr.attr, | ||
800 | &ipl_lun_attr.attr, | ||
801 | &ipl_bootprog_attr.attr, | ||
802 | &ipl_br_lba_attr.attr, | ||
803 | NULL, | ||
804 | }; | ||
805 | |||
806 | static struct attribute_group ipl_fcp_attr_group = { | ||
807 | .attrs = ipl_fcp_attrs, | ||
808 | }; | ||
809 | |||
810 | static struct attribute *ipl_ccw_attrs[] = { | ||
811 | &ipl_type_attr.attr, | ||
812 | &ipl_device_attr.attr, | ||
813 | NULL, | ||
814 | }; | ||
815 | |||
816 | static struct attribute_group ipl_ccw_attr_group = { | ||
817 | .attrs = ipl_ccw_attrs, | ||
818 | }; | ||
819 | |||
820 | static struct attribute *ipl_unknown_attrs[] = { | ||
821 | &ipl_type_attr.attr, | ||
822 | NULL, | ||
823 | }; | ||
824 | |||
825 | static struct attribute_group ipl_unknown_attr_group = { | ||
826 | .attrs = ipl_unknown_attrs, | ||
827 | }; | ||
828 | |||
829 | static ssize_t | ||
830 | ipl_parameter_read(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
831 | { | ||
832 | unsigned int size = IPL_PARMBLOCK_SIZE; | ||
833 | |||
834 | if (off > size) | ||
835 | return 0; | ||
836 | if (off + count > size) | ||
837 | count = size - off; | ||
838 | |||
839 | memcpy(buf, (void *) IPL_PARMBLOCK_START + off, count); | ||
840 | return count; | ||
841 | } | ||
842 | |||
843 | static struct bin_attribute ipl_parameter_attr = { | ||
844 | .attr = { | ||
845 | .name = "binary_parameter", | ||
846 | .mode = S_IRUGO, | ||
847 | .owner = THIS_MODULE, | ||
848 | }, | ||
849 | .size = PAGE_SIZE, | ||
850 | .read = &ipl_parameter_read, | ||
851 | }; | ||
852 | |||
853 | static ssize_t | ||
854 | ipl_scp_data_read(struct kobject *kobj, char *buf, loff_t off, size_t count) | ||
855 | { | ||
856 | unsigned int size = IPL_PARMBLOCK_START->fcp.scp_data_len; | ||
857 | void *scp_data = &IPL_PARMBLOCK_START->fcp.scp_data; | ||
858 | |||
859 | if (off > size) | ||
860 | return 0; | ||
861 | if (off + count > size) | ||
862 | count = size - off; | ||
863 | |||
864 | memcpy(buf, scp_data + off, count); | ||
865 | return count; | ||
866 | } | ||
867 | |||
868 | static struct bin_attribute ipl_scp_data_attr = { | ||
869 | .attr = { | ||
870 | .name = "scp_data", | ||
871 | .mode = S_IRUGO, | ||
872 | .owner = THIS_MODULE, | ||
873 | }, | ||
874 | .size = PAGE_SIZE, | ||
875 | .read = &ipl_scp_data_read, | ||
876 | }; | ||
877 | |||
878 | static decl_subsys(ipl, NULL, NULL); | ||
879 | |||
880 | static int ipl_register_fcp_files(void) | ||
881 | { | ||
882 | int rc; | ||
883 | |||
884 | rc = sysfs_create_group(&ipl_subsys.kset.kobj, | ||
885 | &ipl_fcp_attr_group); | ||
886 | if (rc) | ||
887 | goto out; | ||
888 | rc = sysfs_create_bin_file(&ipl_subsys.kset.kobj, | ||
889 | &ipl_parameter_attr); | ||
890 | if (rc) | ||
891 | goto out_ipl_parm; | ||
892 | rc = sysfs_create_bin_file(&ipl_subsys.kset.kobj, | ||
893 | &ipl_scp_data_attr); | ||
894 | if (!rc) | ||
895 | goto out; | ||
896 | |||
897 | sysfs_remove_bin_file(&ipl_subsys.kset.kobj, &ipl_parameter_attr); | ||
898 | |||
899 | out_ipl_parm: | ||
900 | sysfs_remove_group(&ipl_subsys.kset.kobj, &ipl_fcp_attr_group); | ||
901 | out: | ||
902 | return rc; | ||
903 | } | ||
904 | |||
905 | static int __init | ||
906 | ipl_device_sysfs_register(void) { | ||
907 | int rc; | ||
908 | |||
909 | rc = firmware_register(&ipl_subsys); | ||
910 | if (rc) | ||
911 | goto out; | ||
912 | |||
913 | switch (get_ipl_type()) { | ||
914 | case ipl_type_ccw: | ||
915 | rc = sysfs_create_group(&ipl_subsys.kset.kobj, | ||
916 | &ipl_ccw_attr_group); | ||
917 | break; | ||
918 | case ipl_type_fcp: | ||
919 | rc = ipl_register_fcp_files(); | ||
920 | break; | ||
921 | default: | ||
922 | rc = sysfs_create_group(&ipl_subsys.kset.kobj, | ||
923 | &ipl_unknown_attr_group); | ||
924 | break; | ||
925 | } | ||
926 | |||
927 | if (rc) | ||
928 | firmware_unregister(&ipl_subsys); | ||
929 | out: | ||
930 | return rc; | ||
931 | } | ||
932 | |||
933 | __initcall(ipl_device_sysfs_register); | ||
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index a887b686f279..642095ec7c07 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -114,29 +114,26 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | |||
114 | static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | 114 | static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) |
115 | { | 115 | { |
116 | unsigned long old_mask = regs->psw.mask; | 116 | unsigned long old_mask = regs->psw.mask; |
117 | int err; | 117 | _sigregs user_sregs; |
118 | 118 | ||
119 | save_access_regs(current->thread.acrs); | 119 | save_access_regs(current->thread.acrs); |
120 | 120 | ||
121 | /* Copy a 'clean' PSW mask to the user to avoid leaking | 121 | /* Copy a 'clean' PSW mask to the user to avoid leaking |
122 | information about whether PER is currently on. */ | 122 | information about whether PER is currently on. */ |
123 | regs->psw.mask = PSW_MASK_MERGE(PSW_USER_BITS, regs->psw.mask); | 123 | regs->psw.mask = PSW_MASK_MERGE(PSW_USER_BITS, regs->psw.mask); |
124 | err = __copy_to_user(&sregs->regs.psw, ®s->psw, | 124 | memcpy(&user_sregs.regs.psw, ®s->psw, sizeof(sregs->regs.psw) + |
125 | sizeof(sregs->regs.psw)+sizeof(sregs->regs.gprs)); | 125 | sizeof(sregs->regs.gprs)); |
126 | regs->psw.mask = old_mask; | 126 | regs->psw.mask = old_mask; |
127 | if (err != 0) | 127 | memcpy(&user_sregs.regs.acrs, current->thread.acrs, |
128 | return err; | 128 | sizeof(sregs->regs.acrs)); |
129 | err = __copy_to_user(&sregs->regs.acrs, current->thread.acrs, | ||
130 | sizeof(sregs->regs.acrs)); | ||
131 | if (err != 0) | ||
132 | return err; | ||
133 | /* | 129 | /* |
134 | * We have to store the fp registers to current->thread.fp_regs | 130 | * We have to store the fp registers to current->thread.fp_regs |
135 | * to merge them with the emulated registers. | 131 | * to merge them with the emulated registers. |
136 | */ | 132 | */ |
137 | save_fp_regs(¤t->thread.fp_regs); | 133 | save_fp_regs(¤t->thread.fp_regs); |
138 | return __copy_to_user(&sregs->fpregs, ¤t->thread.fp_regs, | 134 | memcpy(&user_sregs.fpregs, ¤t->thread.fp_regs, |
139 | sizeof(s390_fp_regs)); | 135 | sizeof(s390_fp_regs)); |
136 | return __copy_to_user(sregs, &user_sregs, sizeof(_sigregs)); | ||
140 | } | 137 | } |
141 | 138 | ||
142 | /* Returns positive number on error */ | 139 | /* Returns positive number on error */ |
@@ -144,27 +141,25 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
144 | { | 141 | { |
145 | unsigned long old_mask = regs->psw.mask; | 142 | unsigned long old_mask = regs->psw.mask; |
146 | int err; | 143 | int err; |
144 | _sigregs user_sregs; | ||
147 | 145 | ||
148 | /* Alwys make any pending restarted system call return -EINTR */ | 146 | /* Alwys make any pending restarted system call return -EINTR */ |
149 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 147 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
150 | 148 | ||
151 | err = __copy_from_user(®s->psw, &sregs->regs.psw, | 149 | err = __copy_from_user(&user_sregs, sregs, sizeof(_sigregs)); |
152 | sizeof(sregs->regs.psw)+sizeof(sregs->regs.gprs)); | ||
153 | regs->psw.mask = PSW_MASK_MERGE(old_mask, regs->psw.mask); | 150 | regs->psw.mask = PSW_MASK_MERGE(old_mask, regs->psw.mask); |
154 | regs->psw.addr |= PSW_ADDR_AMODE; | 151 | regs->psw.addr |= PSW_ADDR_AMODE; |
155 | if (err) | 152 | if (err) |
156 | return err; | 153 | return err; |
157 | err = __copy_from_user(¤t->thread.acrs, &sregs->regs.acrs, | 154 | memcpy(®s->psw, &user_sregs.regs.psw, sizeof(sregs->regs.psw) + |
158 | sizeof(sregs->regs.acrs)); | 155 | sizeof(sregs->regs.gprs)); |
159 | if (err) | 156 | memcpy(¤t->thread.acrs, &user_sregs.regs.acrs, |
160 | return err; | 157 | sizeof(sregs->regs.acrs)); |
161 | restore_access_regs(current->thread.acrs); | 158 | restore_access_regs(current->thread.acrs); |
162 | 159 | ||
163 | err = __copy_from_user(¤t->thread.fp_regs, &sregs->fpregs, | 160 | memcpy(¤t->thread.fp_regs, &user_sregs.fpregs, |
164 | sizeof(s390_fp_regs)); | 161 | sizeof(s390_fp_regs)); |
165 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; | 162 | current->thread.fp_regs.fpc &= FPC_VALID_MASK; |
166 | if (err) | ||
167 | return err; | ||
168 | 163 | ||
169 | restore_fp_regs(¤t->thread.fp_regs); | 164 | restore_fp_regs(¤t->thread.fp_regs); |
170 | regs->trap = -1; /* disable syscall checks */ | 165 | regs->trap = -1; /* disable syscall checks */ |
@@ -457,6 +452,7 @@ void do_signal(struct pt_regs *regs) | |||
457 | case -ERESTART_RESTARTBLOCK: | 452 | case -ERESTART_RESTARTBLOCK: |
458 | regs->gprs[2] = -EINTR; | 453 | regs->gprs[2] = -EINTR; |
459 | } | 454 | } |
455 | regs->trap = -1; /* Don't deal with this again. */ | ||
460 | } | 456 | } |
461 | 457 | ||
462 | /* Get signal to deliver. When running under ptrace, at this point | 458 | /* Get signal to deliver. When running under ptrace, at this point |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 8e03219eea76..b2e6f4c8d382 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -59,9 +59,6 @@ static struct task_struct *current_set[NR_CPUS]; | |||
59 | extern char vmhalt_cmd[]; | 59 | extern char vmhalt_cmd[]; |
60 | extern char vmpoff_cmd[]; | 60 | extern char vmpoff_cmd[]; |
61 | 61 | ||
62 | extern void reipl(unsigned long devno); | ||
63 | extern void reipl_diag(void); | ||
64 | |||
65 | static void smp_ext_bitcall(int, ec_bit_sig); | 62 | static void smp_ext_bitcall(int, ec_bit_sig); |
66 | static void smp_ext_bitcall_others(ec_bit_sig); | 63 | static void smp_ext_bitcall_others(ec_bit_sig); |
67 | 64 | ||
@@ -279,12 +276,7 @@ static void do_machine_restart(void * __unused) | |||
279 | * interrupted by an external interrupt and s390irq | 276 | * interrupted by an external interrupt and s390irq |
280 | * locks are always held disabled). | 277 | * locks are always held disabled). |
281 | */ | 278 | */ |
282 | reipl_diag(); | 279 | do_reipl(); |
283 | |||
284 | if (MACHINE_IS_VM) | ||
285 | cpcmd ("IPL", NULL, 0, NULL); | ||
286 | else | ||
287 | reipl (0x10000 | S390_lowcore.ipl_device); | ||
288 | } | 280 | } |
289 | 281 | ||
290 | void machine_restart_smp(char * __unused) | 282 | void machine_restart_smp(char * __unused) |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index bde1d1d59858..c4982c963424 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/kallsyms.h> | 30 | #include <linux/kallsyms.h> |
31 | #include <linux/reboot.h> | 31 | #include <linux/reboot.h> |
32 | #include <linux/kprobes.h> | ||
32 | 33 | ||
33 | #include <asm/system.h> | 34 | #include <asm/system.h> |
34 | #include <asm/uaccess.h> | 35 | #include <asm/uaccess.h> |
@@ -39,6 +40,7 @@ | |||
39 | #include <asm/s390_ext.h> | 40 | #include <asm/s390_ext.h> |
40 | #include <asm/lowcore.h> | 41 | #include <asm/lowcore.h> |
41 | #include <asm/debug.h> | 42 | #include <asm/debug.h> |
43 | #include <asm/kdebug.h> | ||
42 | 44 | ||
43 | /* Called from entry.S only */ | 45 | /* Called from entry.S only */ |
44 | extern void handle_per_exception(struct pt_regs *regs); | 46 | extern void handle_per_exception(struct pt_regs *regs); |
@@ -74,6 +76,20 @@ static int kstack_depth_to_print = 12; | |||
74 | static int kstack_depth_to_print = 20; | 76 | static int kstack_depth_to_print = 20; |
75 | #endif /* CONFIG_64BIT */ | 77 | #endif /* CONFIG_64BIT */ |
76 | 78 | ||
79 | ATOMIC_NOTIFIER_HEAD(s390die_chain); | ||
80 | |||
81 | int register_die_notifier(struct notifier_block *nb) | ||
82 | { | ||
83 | return atomic_notifier_chain_register(&s390die_chain, nb); | ||
84 | } | ||
85 | EXPORT_SYMBOL(register_die_notifier); | ||
86 | |||
87 | int unregister_die_notifier(struct notifier_block *nb) | ||
88 | { | ||
89 | return atomic_notifier_chain_unregister(&s390die_chain, nb); | ||
90 | } | ||
91 | EXPORT_SYMBOL(unregister_die_notifier); | ||
92 | |||
77 | /* | 93 | /* |
78 | * For show_trace we have tree different stack to consider: | 94 | * For show_trace we have tree different stack to consider: |
79 | * - the panic stack which is used if the kernel stack has overflown | 95 | * - the panic stack which is used if the kernel stack has overflown |
@@ -305,8 +321,9 @@ report_user_fault(long interruption_code, struct pt_regs *regs) | |||
305 | #endif | 321 | #endif |
306 | } | 322 | } |
307 | 323 | ||
308 | static void inline do_trap(long interruption_code, int signr, char *str, | 324 | static void __kprobes inline do_trap(long interruption_code, int signr, |
309 | struct pt_regs *regs, siginfo_t *info) | 325 | char *str, struct pt_regs *regs, |
326 | siginfo_t *info) | ||
310 | { | 327 | { |
311 | /* | 328 | /* |
312 | * We got all needed information from the lowcore and can | 329 | * We got all needed information from the lowcore and can |
@@ -315,6 +332,10 @@ static void inline do_trap(long interruption_code, int signr, char *str, | |||
315 | if (regs->psw.mask & PSW_MASK_PSTATE) | 332 | if (regs->psw.mask & PSW_MASK_PSTATE) |
316 | local_irq_enable(); | 333 | local_irq_enable(); |
317 | 334 | ||
335 | if (notify_die(DIE_TRAP, str, regs, interruption_code, | ||
336 | interruption_code, signr) == NOTIFY_STOP) | ||
337 | return; | ||
338 | |||
318 | if (regs->psw.mask & PSW_MASK_PSTATE) { | 339 | if (regs->psw.mask & PSW_MASK_PSTATE) { |
319 | struct task_struct *tsk = current; | 340 | struct task_struct *tsk = current; |
320 | 341 | ||
@@ -336,8 +357,12 @@ static inline void __user *get_check_address(struct pt_regs *regs) | |||
336 | return (void __user *)((regs->psw.addr-S390_lowcore.pgm_ilc) & PSW_ADDR_INSN); | 357 | return (void __user *)((regs->psw.addr-S390_lowcore.pgm_ilc) & PSW_ADDR_INSN); |
337 | } | 358 | } |
338 | 359 | ||
339 | void do_single_step(struct pt_regs *regs) | 360 | void __kprobes do_single_step(struct pt_regs *regs) |
340 | { | 361 | { |
362 | if (notify_die(DIE_SSTEP, "sstep", regs, 0, 0, | ||
363 | SIGTRAP) == NOTIFY_STOP){ | ||
364 | return; | ||
365 | } | ||
341 | if ((current->ptrace & PT_PTRACED) != 0) | 366 | if ((current->ptrace & PT_PTRACED) != 0) |
342 | force_sig(SIGTRAP, current); | 367 | force_sig(SIGTRAP, current); |
343 | } | 368 | } |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index ff5f7bb34f75..af9e69a03011 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -24,6 +24,7 @@ SECTIONS | |||
24 | *(.text) | 24 | *(.text) |
25 | SCHED_TEXT | 25 | SCHED_TEXT |
26 | LOCK_TEXT | 26 | LOCK_TEXT |
27 | KPROBES_TEXT | ||
27 | *(.fixup) | 28 | *(.fixup) |
28 | *(.gnu.warning) | 29 | *(.gnu.warning) |
29 | } = 0x0700 | 30 | } = 0x0700 |
@@ -117,7 +118,7 @@ SECTIONS | |||
117 | 118 | ||
118 | /* Sections to be discarded */ | 119 | /* Sections to be discarded */ |
119 | /DISCARD/ : { | 120 | /DISCARD/ : { |
120 | *(.exitcall.exit) | 121 | *(.exit.text) *(.exit.data) *(.exitcall.exit) |
121 | } | 122 | } |
122 | 123 | ||
123 | /* Stabs debugging sections. */ | 124 | /* Stabs debugging sections. */ |
diff --git a/arch/s390/lib/Makefile b/arch/s390/lib/Makefile index e05d087a6eae..c42ffedfdb49 100644 --- a/arch/s390/lib/Makefile +++ b/arch/s390/lib/Makefile | |||
@@ -4,6 +4,6 @@ | |||
4 | 4 | ||
5 | EXTRA_AFLAGS := -traditional | 5 | EXTRA_AFLAGS := -traditional |
6 | 6 | ||
7 | lib-y += delay.o string.o | 7 | lib-y += delay.o string.o uaccess_std.o |
8 | lib-y += $(if $(CONFIG_64BIT),uaccess64.o,uaccess.o) | 8 | lib-$(CONFIG_64BIT) += uaccess_mvcos.o |
9 | lib-$(CONFIG_SMP) += spinlock.o | 9 | lib-$(CONFIG_SMP) += spinlock.o |
diff --git a/arch/s390/lib/uaccess.S b/arch/s390/lib/uaccess.S deleted file mode 100644 index 837275284d9f..000000000000 --- a/arch/s390/lib/uaccess.S +++ /dev/null | |||
@@ -1,211 +0,0 @@ | |||
1 | /* | ||
2 | * arch/s390/lib/uaccess.S | ||
3 | * __copy_{from|to}_user functions. | ||
4 | * | ||
5 | * s390 | ||
6 | * Copyright (C) 2000,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
7 | * Authors(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | ||
8 | * | ||
9 | * These functions have standard call interface | ||
10 | */ | ||
11 | |||
12 | #include <linux/errno.h> | ||
13 | #include <asm/lowcore.h> | ||
14 | #include <asm/asm-offsets.h> | ||
15 | |||
16 | .text | ||
17 | .align 4 | ||
18 | .globl __copy_from_user_asm | ||
19 | # %r2 = to, %r3 = n, %r4 = from | ||
20 | __copy_from_user_asm: | ||
21 | slr %r0,%r0 | ||
22 | 0: mvcp 0(%r3,%r2),0(%r4),%r0 | ||
23 | jnz 1f | ||
24 | slr %r2,%r2 | ||
25 | br %r14 | ||
26 | 1: la %r2,256(%r2) | ||
27 | la %r4,256(%r4) | ||
28 | ahi %r3,-256 | ||
29 | 2: mvcp 0(%r3,%r2),0(%r4),%r0 | ||
30 | jnz 1b | ||
31 | 3: slr %r2,%r2 | ||
32 | br %r14 | ||
33 | 4: lhi %r0,-4096 | ||
34 | lr %r5,%r4 | ||
35 | slr %r5,%r0 | ||
36 | nr %r5,%r0 # %r5 = (%r4 + 4096) & -4096 | ||
37 | slr %r5,%r4 # %r5 = #bytes to next user page boundary | ||
38 | clr %r3,%r5 # copy crosses next page boundary ? | ||
39 | jnh 6f # no, the current page faulted | ||
40 | # move with the reduced length which is < 256 | ||
41 | 5: mvcp 0(%r5,%r2),0(%r4),%r0 | ||
42 | slr %r3,%r5 | ||
43 | 6: lr %r2,%r3 | ||
44 | br %r14 | ||
45 | .section __ex_table,"a" | ||
46 | .long 0b,4b | ||
47 | .long 2b,4b | ||
48 | .long 5b,6b | ||
49 | .previous | ||
50 | |||
51 | .align 4 | ||
52 | .text | ||
53 | .globl __copy_to_user_asm | ||
54 | # %r2 = from, %r3 = n, %r4 = to | ||
55 | __copy_to_user_asm: | ||
56 | slr %r0,%r0 | ||
57 | 0: mvcs 0(%r3,%r4),0(%r2),%r0 | ||
58 | jnz 1f | ||
59 | slr %r2,%r2 | ||
60 | br %r14 | ||
61 | 1: la %r2,256(%r2) | ||
62 | la %r4,256(%r4) | ||
63 | ahi %r3,-256 | ||
64 | 2: mvcs 0(%r3,%r4),0(%r2),%r0 | ||
65 | jnz 1b | ||
66 | 3: slr %r2,%r2 | ||
67 | br %r14 | ||
68 | 4: lhi %r0,-4096 | ||
69 | lr %r5,%r4 | ||
70 | slr %r5,%r0 | ||
71 | nr %r5,%r0 # %r5 = (%r4 + 4096) & -4096 | ||
72 | slr %r5,%r4 # %r5 = #bytes to next user page boundary | ||
73 | clr %r3,%r5 # copy crosses next page boundary ? | ||
74 | jnh 6f # no, the current page faulted | ||
75 | # move with the reduced length which is < 256 | ||
76 | 5: mvcs 0(%r5,%r4),0(%r2),%r0 | ||
77 | slr %r3,%r5 | ||
78 | 6: lr %r2,%r3 | ||
79 | br %r14 | ||
80 | .section __ex_table,"a" | ||
81 | .long 0b,4b | ||
82 | .long 2b,4b | ||
83 | .long 5b,6b | ||
84 | .previous | ||
85 | |||
86 | .align 4 | ||
87 | .text | ||
88 | .globl __copy_in_user_asm | ||
89 | # %r2 = from, %r3 = n, %r4 = to | ||
90 | __copy_in_user_asm: | ||
91 | ahi %r3,-1 | ||
92 | jo 6f | ||
93 | sacf 256 | ||
94 | bras %r1,4f | ||
95 | 0: ahi %r3,257 | ||
96 | 1: mvc 0(1,%r4),0(%r2) | ||
97 | la %r2,1(%r2) | ||
98 | la %r4,1(%r4) | ||
99 | ahi %r3,-1 | ||
100 | jnz 1b | ||
101 | 2: lr %r2,%r3 | ||
102 | br %r14 | ||
103 | 3: mvc 0(256,%r4),0(%r2) | ||
104 | la %r2,256(%r2) | ||
105 | la %r4,256(%r4) | ||
106 | 4: ahi %r3,-256 | ||
107 | jnm 3b | ||
108 | 5: ex %r3,4(%r1) | ||
109 | sacf 0 | ||
110 | 6: slr %r2,%r2 | ||
111 | br %r14 | ||
112 | .section __ex_table,"a" | ||
113 | .long 1b,2b | ||
114 | .long 3b,0b | ||
115 | .long 5b,0b | ||
116 | .previous | ||
117 | |||
118 | .align 4 | ||
119 | .text | ||
120 | .globl __clear_user_asm | ||
121 | # %r2 = to, %r3 = n | ||
122 | __clear_user_asm: | ||
123 | bras %r5,0f | ||
124 | .long empty_zero_page | ||
125 | 0: l %r5,0(%r5) | ||
126 | slr %r0,%r0 | ||
127 | 1: mvcs 0(%r3,%r2),0(%r5),%r0 | ||
128 | jnz 2f | ||
129 | slr %r2,%r2 | ||
130 | br %r14 | ||
131 | 2: la %r2,256(%r2) | ||
132 | ahi %r3,-256 | ||
133 | 3: mvcs 0(%r3,%r2),0(%r5),%r0 | ||
134 | jnz 2b | ||
135 | 4: slr %r2,%r2 | ||
136 | br %r14 | ||
137 | 5: lhi %r0,-4096 | ||
138 | lr %r4,%r2 | ||
139 | slr %r4,%r0 | ||
140 | nr %r4,%r0 # %r4 = (%r2 + 4096) & -4096 | ||
141 | slr %r4,%r2 # %r4 = #bytes to next user page boundary | ||
142 | clr %r3,%r4 # clear crosses next page boundary ? | ||
143 | jnh 7f # no, the current page faulted | ||
144 | # clear with the reduced length which is < 256 | ||
145 | 6: mvcs 0(%r4,%r2),0(%r5),%r0 | ||
146 | slr %r3,%r4 | ||
147 | 7: lr %r2,%r3 | ||
148 | br %r14 | ||
149 | .section __ex_table,"a" | ||
150 | .long 1b,5b | ||
151 | .long 3b,5b | ||
152 | .long 6b,7b | ||
153 | .previous | ||
154 | |||
155 | .align 4 | ||
156 | .text | ||
157 | .globl __strncpy_from_user_asm | ||
158 | # %r2 = count, %r3 = dst, %r4 = src | ||
159 | __strncpy_from_user_asm: | ||
160 | lhi %r0,0 | ||
161 | lr %r1,%r4 | ||
162 | la %r4,0(%r4) # clear high order bit from %r4 | ||
163 | la %r2,0(%r2,%r4) # %r2 points to first byte after string | ||
164 | sacf 256 | ||
165 | 0: srst %r2,%r1 | ||
166 | jo 0b | ||
167 | sacf 0 | ||
168 | lr %r1,%r2 | ||
169 | jh 1f # \0 found in string ? | ||
170 | ahi %r1,1 # include \0 in copy | ||
171 | 1: slr %r1,%r4 # %r1 = copy length (without \0) | ||
172 | slr %r2,%r4 # %r2 = return length (including \0) | ||
173 | 2: mvcp 0(%r1,%r3),0(%r4),%r0 | ||
174 | jnz 3f | ||
175 | br %r14 | ||
176 | 3: la %r3,256(%r3) | ||
177 | la %r4,256(%r4) | ||
178 | ahi %r1,-256 | ||
179 | mvcp 0(%r1,%r3),0(%r4),%r0 | ||
180 | jnz 3b | ||
181 | br %r14 | ||
182 | 4: sacf 0 | ||
183 | lhi %r2,-EFAULT | ||
184 | br %r14 | ||
185 | .section __ex_table,"a" | ||
186 | .long 0b,4b | ||
187 | .previous | ||
188 | |||
189 | .align 4 | ||
190 | .text | ||
191 | .globl __strnlen_user_asm | ||
192 | # %r2 = count, %r3 = src | ||
193 | __strnlen_user_asm: | ||
194 | lhi %r0,0 | ||
195 | lr %r1,%r3 | ||
196 | la %r3,0(%r3) # clear high order bit from %r4 | ||
197 | la %r2,0(%r2,%r3) # %r2 points to first byte after string | ||
198 | sacf 256 | ||
199 | 0: srst %r2,%r1 | ||
200 | jo 0b | ||
201 | sacf 0 | ||
202 | ahi %r2,1 # strnlen_user result includes the \0 | ||
203 | # or return count+1 if \0 not found | ||
204 | slr %r2,%r3 | ||
205 | br %r14 | ||
206 | 2: sacf 0 | ||
207 | slr %r2,%r2 # return 0 on exception | ||
208 | br %r14 | ||
209 | .section __ex_table,"a" | ||
210 | .long 0b,2b | ||
211 | .previous | ||
diff --git a/arch/s390/lib/uaccess64.S b/arch/s390/lib/uaccess64.S deleted file mode 100644 index 1f755be22f92..000000000000 --- a/arch/s390/lib/uaccess64.S +++ /dev/null | |||
@@ -1,207 +0,0 @@ | |||
1 | /* | ||
2 | * arch/s390x/lib/uaccess.S | ||
3 | * __copy_{from|to}_user functions. | ||
4 | * | ||
5 | * s390 | ||
6 | * Copyright (C) 2000,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
7 | * Authors(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | ||
8 | * | ||
9 | * These functions have standard call interface | ||
10 | */ | ||
11 | |||
12 | #include <linux/errno.h> | ||
13 | #include <asm/lowcore.h> | ||
14 | #include <asm/asm-offsets.h> | ||
15 | |||
16 | .text | ||
17 | .align 4 | ||
18 | .globl __copy_from_user_asm | ||
19 | # %r2 = to, %r3 = n, %r4 = from | ||
20 | __copy_from_user_asm: | ||
21 | slgr %r0,%r0 | ||
22 | 0: mvcp 0(%r3,%r2),0(%r4),%r0 | ||
23 | jnz 1f | ||
24 | slgr %r2,%r2 | ||
25 | br %r14 | ||
26 | 1: la %r2,256(%r2) | ||
27 | la %r4,256(%r4) | ||
28 | aghi %r3,-256 | ||
29 | 2: mvcp 0(%r3,%r2),0(%r4),%r0 | ||
30 | jnz 1b | ||
31 | 3: slgr %r2,%r2 | ||
32 | br %r14 | ||
33 | 4: lghi %r0,-4096 | ||
34 | lgr %r5,%r4 | ||
35 | slgr %r5,%r0 | ||
36 | ngr %r5,%r0 # %r5 = (%r4 + 4096) & -4096 | ||
37 | slgr %r5,%r4 # %r5 = #bytes to next user page boundary | ||
38 | clgr %r3,%r5 # copy crosses next page boundary ? | ||
39 | jnh 6f # no, the current page faulted | ||
40 | # move with the reduced length which is < 256 | ||
41 | 5: mvcp 0(%r5,%r2),0(%r4),%r0 | ||
42 | slgr %r3,%r5 | ||
43 | 6: lgr %r2,%r3 | ||
44 | br %r14 | ||
45 | .section __ex_table,"a" | ||
46 | .quad 0b,4b | ||
47 | .quad 2b,4b | ||
48 | .quad 5b,6b | ||
49 | .previous | ||
50 | |||
51 | .align 4 | ||
52 | .text | ||
53 | .globl __copy_to_user_asm | ||
54 | # %r2 = from, %r3 = n, %r4 = to | ||
55 | __copy_to_user_asm: | ||
56 | slgr %r0,%r0 | ||
57 | 0: mvcs 0(%r3,%r4),0(%r2),%r0 | ||
58 | jnz 1f | ||
59 | slgr %r2,%r2 | ||
60 | br %r14 | ||
61 | 1: la %r2,256(%r2) | ||
62 | la %r4,256(%r4) | ||
63 | aghi %r3,-256 | ||
64 | 2: mvcs 0(%r3,%r4),0(%r2),%r0 | ||
65 | jnz 1b | ||
66 | 3: slgr %r2,%r2 | ||
67 | br %r14 | ||
68 | 4: lghi %r0,-4096 | ||
69 | lgr %r5,%r4 | ||
70 | slgr %r5,%r0 | ||
71 | ngr %r5,%r0 # %r5 = (%r4 + 4096) & -4096 | ||
72 | slgr %r5,%r4 # %r5 = #bytes to next user page boundary | ||
73 | clgr %r3,%r5 # copy crosses next page boundary ? | ||
74 | jnh 6f # no, the current page faulted | ||
75 | # move with the reduced length which is < 256 | ||
76 | 5: mvcs 0(%r5,%r4),0(%r2),%r0 | ||
77 | slgr %r3,%r5 | ||
78 | 6: lgr %r2,%r3 | ||
79 | br %r14 | ||
80 | .section __ex_table,"a" | ||
81 | .quad 0b,4b | ||
82 | .quad 2b,4b | ||
83 | .quad 5b,6b | ||
84 | .previous | ||
85 | |||
86 | .align 4 | ||
87 | .text | ||
88 | .globl __copy_in_user_asm | ||
89 | # %r2 = from, %r3 = n, %r4 = to | ||
90 | __copy_in_user_asm: | ||
91 | aghi %r3,-1 | ||
92 | jo 6f | ||
93 | sacf 256 | ||
94 | bras %r1,4f | ||
95 | 0: aghi %r3,257 | ||
96 | 1: mvc 0(1,%r4),0(%r2) | ||
97 | la %r2,1(%r2) | ||
98 | la %r4,1(%r4) | ||
99 | aghi %r3,-1 | ||
100 | jnz 1b | ||
101 | 2: lgr %r2,%r3 | ||
102 | br %r14 | ||
103 | 3: mvc 0(256,%r4),0(%r2) | ||
104 | la %r2,256(%r2) | ||
105 | la %r4,256(%r4) | ||
106 | 4: aghi %r3,-256 | ||
107 | jnm 3b | ||
108 | 5: ex %r3,4(%r1) | ||
109 | sacf 0 | ||
110 | 6: slgr %r2,%r2 | ||
111 | br 14 | ||
112 | .section __ex_table,"a" | ||
113 | .quad 1b,2b | ||
114 | .quad 3b,0b | ||
115 | .quad 5b,0b | ||
116 | .previous | ||
117 | |||
118 | .align 4 | ||
119 | .text | ||
120 | .globl __clear_user_asm | ||
121 | # %r2 = to, %r3 = n | ||
122 | __clear_user_asm: | ||
123 | slgr %r0,%r0 | ||
124 | larl %r5,empty_zero_page | ||
125 | 1: mvcs 0(%r3,%r2),0(%r5),%r0 | ||
126 | jnz 2f | ||
127 | slgr %r2,%r2 | ||
128 | br %r14 | ||
129 | 2: la %r2,256(%r2) | ||
130 | aghi %r3,-256 | ||
131 | 3: mvcs 0(%r3,%r2),0(%r5),%r0 | ||
132 | jnz 2b | ||
133 | 4: slgr %r2,%r2 | ||
134 | br %r14 | ||
135 | 5: lghi %r0,-4096 | ||
136 | lgr %r4,%r2 | ||
137 | slgr %r4,%r0 | ||
138 | ngr %r4,%r0 # %r4 = (%r2 + 4096) & -4096 | ||
139 | slgr %r4,%r2 # %r4 = #bytes to next user page boundary | ||
140 | clgr %r3,%r4 # clear crosses next page boundary ? | ||
141 | jnh 7f # no, the current page faulted | ||
142 | # clear with the reduced length which is < 256 | ||
143 | 6: mvcs 0(%r4,%r2),0(%r5),%r0 | ||
144 | slgr %r3,%r4 | ||
145 | 7: lgr %r2,%r3 | ||
146 | br %r14 | ||
147 | .section __ex_table,"a" | ||
148 | .quad 1b,5b | ||
149 | .quad 3b,5b | ||
150 | .quad 6b,7b | ||
151 | .previous | ||
152 | |||
153 | .align 4 | ||
154 | .text | ||
155 | .globl __strncpy_from_user_asm | ||
156 | # %r2 = count, %r3 = dst, %r4 = src | ||
157 | __strncpy_from_user_asm: | ||
158 | lghi %r0,0 | ||
159 | lgr %r1,%r4 | ||
160 | la %r2,0(%r2,%r4) # %r2 points to first byte after string | ||
161 | sacf 256 | ||
162 | 0: srst %r2,%r1 | ||
163 | jo 0b | ||
164 | sacf 0 | ||
165 | lgr %r1,%r2 | ||
166 | jh 1f # \0 found in string ? | ||
167 | aghi %r1,1 # include \0 in copy | ||
168 | 1: slgr %r1,%r4 # %r1 = copy length (without \0) | ||
169 | slgr %r2,%r4 # %r2 = return length (including \0) | ||
170 | 2: mvcp 0(%r1,%r3),0(%r4),%r0 | ||
171 | jnz 3f | ||
172 | br %r14 | ||
173 | 3: la %r3,256(%r3) | ||
174 | la %r4,256(%r4) | ||
175 | aghi %r1,-256 | ||
176 | mvcp 0(%r1,%r3),0(%r4),%r0 | ||
177 | jnz 3b | ||
178 | br %r14 | ||
179 | 4: sacf 0 | ||
180 | lghi %r2,-EFAULT | ||
181 | br %r14 | ||
182 | .section __ex_table,"a" | ||
183 | .quad 0b,4b | ||
184 | .previous | ||
185 | |||
186 | .align 4 | ||
187 | .text | ||
188 | .globl __strnlen_user_asm | ||
189 | # %r2 = count, %r3 = src | ||
190 | __strnlen_user_asm: | ||
191 | lghi %r0,0 | ||
192 | lgr %r1,%r3 | ||
193 | la %r2,0(%r2,%r3) # %r2 points to first byte after string | ||
194 | sacf 256 | ||
195 | 0: srst %r2,%r1 | ||
196 | jo 0b | ||
197 | sacf 0 | ||
198 | aghi %r2,1 # strnlen_user result includes the \0 | ||
199 | # or return count+1 if \0 not found | ||
200 | slgr %r2,%r3 | ||
201 | br %r14 | ||
202 | 2: sacf 0 | ||
203 | slgr %r2,%r2 # return 0 on exception | ||
204 | br %r14 | ||
205 | .section __ex_table,"a" | ||
206 | .quad 0b,2b | ||
207 | .previous | ||
diff --git a/arch/s390/lib/uaccess_mvcos.c b/arch/s390/lib/uaccess_mvcos.c new file mode 100644 index 000000000000..86c96d6c191a --- /dev/null +++ b/arch/s390/lib/uaccess_mvcos.c | |||
@@ -0,0 +1,156 @@ | |||
1 | /* | ||
2 | * arch/s390/lib/uaccess_mvcos.c | ||
3 | * | ||
4 | * Optimized user space space access functions based on mvcos. | ||
5 | * | ||
6 | * Copyright (C) IBM Corp. 2006 | ||
7 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | ||
8 | * Gerald Schaefer (gerald.schaefer@de.ibm.com) | ||
9 | */ | ||
10 | |||
11 | #include <linux/errno.h> | ||
12 | #include <linux/mm.h> | ||
13 | #include <asm/uaccess.h> | ||
14 | #include <asm/futex.h> | ||
15 | |||
16 | #ifndef __s390x__ | ||
17 | #define AHI "ahi" | ||
18 | #define ALR "alr" | ||
19 | #define CLR "clr" | ||
20 | #define LHI "lhi" | ||
21 | #define SLR "slr" | ||
22 | #else | ||
23 | #define AHI "aghi" | ||
24 | #define ALR "algr" | ||
25 | #define CLR "clgr" | ||
26 | #define LHI "lghi" | ||
27 | #define SLR "slgr" | ||
28 | #endif | ||
29 | |||
30 | size_t copy_from_user_mvcos(size_t size, const void __user *ptr, void *x) | ||
31 | { | ||
32 | register unsigned long reg0 asm("0") = 0x81UL; | ||
33 | unsigned long tmp1, tmp2; | ||
34 | |||
35 | tmp1 = -4096UL; | ||
36 | asm volatile( | ||
37 | "0: .insn ss,0xc80000000000,0(%0,%2),0(%1),0\n" | ||
38 | " jz 4f\n" | ||
39 | "1:"ALR" %0,%3\n" | ||
40 | " "SLR" %1,%3\n" | ||
41 | " "SLR" %2,%3\n" | ||
42 | " j 0b\n" | ||
43 | "2: la %4,4095(%1)\n"/* %4 = ptr + 4095 */ | ||
44 | " nr %4,%3\n" /* %4 = (ptr + 4095) & -4096 */ | ||
45 | " "SLR" %4,%1\n" | ||
46 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | ||
47 | " jnh 5f\n" | ||
48 | "3: .insn ss,0xc80000000000,0(%4,%2),0(%1),0\n" | ||
49 | " "SLR" %0,%4\n" | ||
50 | " j 5f\n" | ||
51 | "4:"SLR" %0,%0\n" | ||
52 | "5: \n" | ||
53 | EX_TABLE(0b,2b) EX_TABLE(3b,5b) | ||
54 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | ||
55 | : "d" (reg0) : "cc", "memory"); | ||
56 | return size; | ||
57 | } | ||
58 | |||
59 | size_t copy_to_user_mvcos(size_t size, void __user *ptr, const void *x) | ||
60 | { | ||
61 | register unsigned long reg0 asm("0") = 0x810000UL; | ||
62 | unsigned long tmp1, tmp2; | ||
63 | |||
64 | tmp1 = -4096UL; | ||
65 | asm volatile( | ||
66 | "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n" | ||
67 | " jz 4f\n" | ||
68 | "1:"ALR" %0,%3\n" | ||
69 | " "SLR" %1,%3\n" | ||
70 | " "SLR" %2,%3\n" | ||
71 | " j 0b\n" | ||
72 | "2: la %4,4095(%1)\n"/* %4 = ptr + 4095 */ | ||
73 | " nr %4,%3\n" /* %4 = (ptr + 4095) & -4096 */ | ||
74 | " "SLR" %4,%1\n" | ||
75 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | ||
76 | " jnh 5f\n" | ||
77 | "3: .insn ss,0xc80000000000,0(%4,%1),0(%2),0\n" | ||
78 | " "SLR" %0,%4\n" | ||
79 | " j 5f\n" | ||
80 | "4:"SLR" %0,%0\n" | ||
81 | "5: \n" | ||
82 | EX_TABLE(0b,2b) EX_TABLE(3b,5b) | ||
83 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | ||
84 | : "d" (reg0) : "cc", "memory"); | ||
85 | return size; | ||
86 | } | ||
87 | |||
88 | size_t copy_in_user_mvcos(size_t size, void __user *to, const void __user *from) | ||
89 | { | ||
90 | register unsigned long reg0 asm("0") = 0x810081UL; | ||
91 | unsigned long tmp1, tmp2; | ||
92 | |||
93 | tmp1 = -4096UL; | ||
94 | /* FIXME: copy with reduced length. */ | ||
95 | asm volatile( | ||
96 | "0: .insn ss,0xc80000000000,0(%0,%1),0(%2),0\n" | ||
97 | " jz 2f\n" | ||
98 | "1:"ALR" %0,%3\n" | ||
99 | " "SLR" %1,%3\n" | ||
100 | " "SLR" %2,%3\n" | ||
101 | " j 0b\n" | ||
102 | "2:"SLR" %0,%0\n" | ||
103 | "3: \n" | ||
104 | EX_TABLE(0b,3b) | ||
105 | : "+a" (size), "+a" (to), "+a" (from), "+a" (tmp1), "=a" (tmp2) | ||
106 | : "d" (reg0) : "cc", "memory"); | ||
107 | return size; | ||
108 | } | ||
109 | |||
110 | size_t clear_user_mvcos(size_t size, void __user *to) | ||
111 | { | ||
112 | register unsigned long reg0 asm("0") = 0x810000UL; | ||
113 | unsigned long tmp1, tmp2; | ||
114 | |||
115 | tmp1 = -4096UL; | ||
116 | asm volatile( | ||
117 | "0: .insn ss,0xc80000000000,0(%0,%1),0(%4),0\n" | ||
118 | " jz 4f\n" | ||
119 | "1:"ALR" %0,%2\n" | ||
120 | " "SLR" %1,%2\n" | ||
121 | " j 0b\n" | ||
122 | "2: la %3,4095(%1)\n"/* %4 = to + 4095 */ | ||
123 | " nr %3,%2\n" /* %4 = (to + 4095) & -4096 */ | ||
124 | " "SLR" %3,%1\n" | ||
125 | " "CLR" %0,%3\n" /* copy crosses next page boundary? */ | ||
126 | " jnh 5f\n" | ||
127 | "3: .insn ss,0xc80000000000,0(%3,%1),0(%4),0\n" | ||
128 | " "SLR" %0,%3\n" | ||
129 | " j 5f\n" | ||
130 | "4:"SLR" %0,%0\n" | ||
131 | "5: \n" | ||
132 | EX_TABLE(0b,2b) EX_TABLE(3b,5b) | ||
133 | : "+a" (size), "+a" (to), "+a" (tmp1), "=a" (tmp2) | ||
134 | : "a" (empty_zero_page), "d" (reg0) : "cc", "memory"); | ||
135 | return size; | ||
136 | } | ||
137 | |||
138 | extern size_t copy_from_user_std_small(size_t, const void __user *, void *); | ||
139 | extern size_t copy_to_user_std_small(size_t, void __user *, const void *); | ||
140 | extern size_t strnlen_user_std(size_t, const char __user *); | ||
141 | extern size_t strncpy_from_user_std(size_t, const char __user *, char *); | ||
142 | extern int futex_atomic_op(int, int __user *, int, int *); | ||
143 | extern int futex_atomic_cmpxchg(int __user *, int, int); | ||
144 | |||
145 | struct uaccess_ops uaccess_mvcos = { | ||
146 | .copy_from_user = copy_from_user_mvcos, | ||
147 | .copy_from_user_small = copy_from_user_std_small, | ||
148 | .copy_to_user = copy_to_user_mvcos, | ||
149 | .copy_to_user_small = copy_to_user_std_small, | ||
150 | .copy_in_user = copy_in_user_mvcos, | ||
151 | .clear_user = clear_user_mvcos, | ||
152 | .strnlen_user = strnlen_user_std, | ||
153 | .strncpy_from_user = strncpy_from_user_std, | ||
154 | .futex_atomic_op = futex_atomic_op, | ||
155 | .futex_atomic_cmpxchg = futex_atomic_cmpxchg, | ||
156 | }; | ||
diff --git a/arch/s390/lib/uaccess_std.c b/arch/s390/lib/uaccess_std.c new file mode 100644 index 000000000000..9a4d4a29ea79 --- /dev/null +++ b/arch/s390/lib/uaccess_std.c | |||
@@ -0,0 +1,340 @@ | |||
1 | /* | ||
2 | * arch/s390/lib/uaccess_std.c | ||
3 | * | ||
4 | * Standard user space access functions based on mvcp/mvcs and doing | ||
5 | * interesting things in the secondary space mode. | ||
6 | * | ||
7 | * Copyright (C) IBM Corp. 2006 | ||
8 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | ||
9 | * Gerald Schaefer (gerald.schaefer@de.ibm.com) | ||
10 | */ | ||
11 | |||
12 | #include <linux/errno.h> | ||
13 | #include <linux/mm.h> | ||
14 | #include <asm/uaccess.h> | ||
15 | #include <asm/futex.h> | ||
16 | |||
17 | #ifndef __s390x__ | ||
18 | #define AHI "ahi" | ||
19 | #define ALR "alr" | ||
20 | #define CLR "clr" | ||
21 | #define LHI "lhi" | ||
22 | #define SLR "slr" | ||
23 | #else | ||
24 | #define AHI "aghi" | ||
25 | #define ALR "algr" | ||
26 | #define CLR "clgr" | ||
27 | #define LHI "lghi" | ||
28 | #define SLR "slgr" | ||
29 | #endif | ||
30 | |||
31 | size_t copy_from_user_std(size_t size, const void __user *ptr, void *x) | ||
32 | { | ||
33 | unsigned long tmp1, tmp2; | ||
34 | |||
35 | tmp1 = -256UL; | ||
36 | asm volatile( | ||
37 | "0: mvcp 0(%0,%2),0(%1),%3\n" | ||
38 | " jz 5f\n" | ||
39 | "1:"ALR" %0,%3\n" | ||
40 | " la %1,256(%1)\n" | ||
41 | " la %2,256(%2)\n" | ||
42 | "2: mvcp 0(%0,%2),0(%1),%3\n" | ||
43 | " jnz 1b\n" | ||
44 | " j 5f\n" | ||
45 | "3: la %4,255(%1)\n" /* %4 = ptr + 255 */ | ||
46 | " "LHI" %3,-4096\n" | ||
47 | " nr %4,%3\n" /* %4 = (ptr + 255) & -4096 */ | ||
48 | " "SLR" %4,%1\n" | ||
49 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | ||
50 | " jnh 6f\n" | ||
51 | "4: mvcp 0(%4,%2),0(%1),%3\n" | ||
52 | " "SLR" %0,%4\n" | ||
53 | " j 6f\n" | ||
54 | "5:"SLR" %0,%0\n" | ||
55 | "6: \n" | ||
56 | EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,6b) | ||
57 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | ||
58 | : : "cc", "memory"); | ||
59 | return size; | ||
60 | } | ||
61 | |||
62 | size_t copy_from_user_std_small(size_t size, const void __user *ptr, void *x) | ||
63 | { | ||
64 | unsigned long tmp1, tmp2; | ||
65 | |||
66 | tmp1 = 0UL; | ||
67 | asm volatile( | ||
68 | "0: mvcp 0(%0,%2),0(%1),%3\n" | ||
69 | " "SLR" %0,%0\n" | ||
70 | " j 3f\n" | ||
71 | "1: la %4,255(%1)\n" /* %4 = ptr + 255 */ | ||
72 | " "LHI" %3,-4096\n" | ||
73 | " nr %4,%3\n" /* %4 = (ptr + 255) & -4096 */ | ||
74 | " "SLR" %4,%1\n" | ||
75 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | ||
76 | " jnh 3f\n" | ||
77 | "2: mvcp 0(%4,%2),0(%1),%3\n" | ||
78 | " "SLR" %0,%4\n" | ||
79 | "3:\n" | ||
80 | EX_TABLE(0b,1b) EX_TABLE(2b,3b) | ||
81 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | ||
82 | : : "cc", "memory"); | ||
83 | return size; | ||
84 | } | ||
85 | |||
86 | size_t copy_to_user_std(size_t size, void __user *ptr, const void *x) | ||
87 | { | ||
88 | unsigned long tmp1, tmp2; | ||
89 | |||
90 | tmp1 = -256UL; | ||
91 | asm volatile( | ||
92 | "0: mvcs 0(%0,%1),0(%2),%3\n" | ||
93 | " jz 5f\n" | ||
94 | "1:"ALR" %0,%3\n" | ||
95 | " la %1,256(%1)\n" | ||
96 | " la %2,256(%2)\n" | ||
97 | "2: mvcs 0(%0,%1),0(%2),%3\n" | ||
98 | " jnz 1b\n" | ||
99 | " j 5f\n" | ||
100 | "3: la %4,255(%1)\n" /* %4 = ptr + 255 */ | ||
101 | " "LHI" %3,-4096\n" | ||
102 | " nr %4,%3\n" /* %4 = (ptr + 255) & -4096 */ | ||
103 | " "SLR" %4,%1\n" | ||
104 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | ||
105 | " jnh 6f\n" | ||
106 | "4: mvcs 0(%4,%1),0(%2),%3\n" | ||
107 | " "SLR" %0,%4\n" | ||
108 | " j 6f\n" | ||
109 | "5:"SLR" %0,%0\n" | ||
110 | "6: \n" | ||
111 | EX_TABLE(0b,3b) EX_TABLE(2b,3b) EX_TABLE(4b,6b) | ||
112 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | ||
113 | : : "cc", "memory"); | ||
114 | return size; | ||
115 | } | ||
116 | |||
117 | size_t copy_to_user_std_small(size_t size, void __user *ptr, const void *x) | ||
118 | { | ||
119 | unsigned long tmp1, tmp2; | ||
120 | |||
121 | tmp1 = 0UL; | ||
122 | asm volatile( | ||
123 | "0: mvcs 0(%0,%1),0(%2),%3\n" | ||
124 | " "SLR" %0,%0\n" | ||
125 | " j 3f\n" | ||
126 | "1: la %4,255(%1)\n" /* ptr + 255 */ | ||
127 | " "LHI" %3,-4096\n" | ||
128 | " nr %4,%3\n" /* (ptr + 255) & -4096UL */ | ||
129 | " "SLR" %4,%1\n" | ||
130 | " "CLR" %0,%4\n" /* copy crosses next page boundary? */ | ||
131 | " jnh 3f\n" | ||
132 | "2: mvcs 0(%4,%1),0(%2),%3\n" | ||
133 | " "SLR" %0,%4\n" | ||
134 | "3:\n" | ||
135 | EX_TABLE(0b,1b) EX_TABLE(2b,3b) | ||
136 | : "+a" (size), "+a" (ptr), "+a" (x), "+a" (tmp1), "=a" (tmp2) | ||
137 | : : "cc", "memory"); | ||
138 | return size; | ||
139 | } | ||
140 | |||
141 | size_t copy_in_user_std(size_t size, void __user *to, const void __user *from) | ||
142 | { | ||
143 | unsigned long tmp1; | ||
144 | |||
145 | asm volatile( | ||
146 | " "AHI" %0,-1\n" | ||
147 | " jo 5f\n" | ||
148 | " sacf 256\n" | ||
149 | " bras %3,3f\n" | ||
150 | "0:"AHI" %0,257\n" | ||
151 | "1: mvc 0(1,%1),0(%2)\n" | ||
152 | " la %1,1(%1)\n" | ||
153 | " la %2,1(%2)\n" | ||
154 | " "AHI" %0,-1\n" | ||
155 | " jnz 1b\n" | ||
156 | " j 5f\n" | ||
157 | "2: mvc 0(256,%1),0(%2)\n" | ||
158 | " la %1,256(%1)\n" | ||
159 | " la %2,256(%2)\n" | ||
160 | "3:"AHI" %0,-256\n" | ||
161 | " jnm 2b\n" | ||
162 | "4: ex %0,1b-0b(%3)\n" | ||
163 | " sacf 0\n" | ||
164 | "5: "SLR" %0,%0\n" | ||
165 | "6:\n" | ||
166 | EX_TABLE(1b,6b) EX_TABLE(2b,0b) EX_TABLE(4b,0b) | ||
167 | : "+a" (size), "+a" (to), "+a" (from), "=a" (tmp1) | ||
168 | : : "cc", "memory"); | ||
169 | return size; | ||
170 | } | ||
171 | |||
172 | size_t clear_user_std(size_t size, void __user *to) | ||
173 | { | ||
174 | unsigned long tmp1, tmp2; | ||
175 | |||
176 | asm volatile( | ||
177 | " "AHI" %0,-1\n" | ||
178 | " jo 5f\n" | ||
179 | " sacf 256\n" | ||
180 | " bras %3,3f\n" | ||
181 | " xc 0(1,%1),0(%1)\n" | ||
182 | "0:"AHI" %0,257\n" | ||
183 | " la %2,255(%1)\n" /* %2 = ptr + 255 */ | ||
184 | " srl %2,12\n" | ||
185 | " sll %2,12\n" /* %2 = (ptr + 255) & -4096 */ | ||
186 | " "SLR" %2,%1\n" | ||
187 | " "CLR" %0,%2\n" /* clear crosses next page boundary? */ | ||
188 | " jnh 5f\n" | ||
189 | " "AHI" %2,-1\n" | ||
190 | "1: ex %2,0(%3)\n" | ||
191 | " "AHI" %2,1\n" | ||
192 | " "SLR" %0,%2\n" | ||
193 | " j 5f\n" | ||
194 | "2: xc 0(256,%1),0(%1)\n" | ||
195 | " la %1,256(%1)\n" | ||
196 | "3:"AHI" %0,-256\n" | ||
197 | " jnm 2b\n" | ||
198 | "4: ex %0,0(%3)\n" | ||
199 | " sacf 0\n" | ||
200 | "5: "SLR" %0,%0\n" | ||
201 | "6:\n" | ||
202 | EX_TABLE(1b,6b) EX_TABLE(2b,0b) EX_TABLE(4b,0b) | ||
203 | : "+a" (size), "+a" (to), "=a" (tmp1), "=a" (tmp2) | ||
204 | : : "cc", "memory"); | ||
205 | return size; | ||
206 | } | ||
207 | |||
208 | size_t strnlen_user_std(size_t size, const char __user *src) | ||
209 | { | ||
210 | register unsigned long reg0 asm("0") = 0UL; | ||
211 | unsigned long tmp1, tmp2; | ||
212 | |||
213 | asm volatile( | ||
214 | " la %2,0(%1)\n" | ||
215 | " la %3,0(%0,%1)\n" | ||
216 | " "SLR" %0,%0\n" | ||
217 | " sacf 256\n" | ||
218 | "0: srst %3,%2\n" | ||
219 | " jo 0b\n" | ||
220 | " la %0,1(%3)\n" /* strnlen_user results includes \0 */ | ||
221 | " "SLR" %0,%1\n" | ||
222 | "1: sacf 0\n" | ||
223 | EX_TABLE(0b,1b) | ||
224 | : "+a" (size), "+a" (src), "=a" (tmp1), "=a" (tmp2) | ||
225 | : "d" (reg0) : "cc", "memory"); | ||
226 | return size; | ||
227 | } | ||
228 | |||
229 | size_t strncpy_from_user_std(size_t size, const char __user *src, char *dst) | ||
230 | { | ||
231 | register unsigned long reg0 asm("0") = 0UL; | ||
232 | unsigned long tmp1, tmp2; | ||
233 | |||
234 | asm volatile( | ||
235 | " la %3,0(%1)\n" | ||
236 | " la %4,0(%0,%1)\n" | ||
237 | " sacf 256\n" | ||
238 | "0: srst %4,%3\n" | ||
239 | " jo 0b\n" | ||
240 | " sacf 0\n" | ||
241 | " la %0,0(%4)\n" | ||
242 | " jh 1f\n" /* found \0 in string ? */ | ||
243 | " "AHI" %4,1\n" /* include \0 in copy */ | ||
244 | "1:"SLR" %0,%1\n" /* %0 = return length (without \0) */ | ||
245 | " "SLR" %4,%1\n" /* %4 = copy length (including \0) */ | ||
246 | "2: mvcp 0(%4,%2),0(%1),%5\n" | ||
247 | " jz 9f\n" | ||
248 | "3:"AHI" %4,-256\n" | ||
249 | " la %1,256(%1)\n" | ||
250 | " la %2,256(%2)\n" | ||
251 | "4: mvcp 0(%4,%2),0(%1),%5\n" | ||
252 | " jnz 3b\n" | ||
253 | " j 9f\n" | ||
254 | "7: sacf 0\n" | ||
255 | "8:"LHI" %0,%6\n" | ||
256 | "9:\n" | ||
257 | EX_TABLE(0b,7b) EX_TABLE(2b,8b) EX_TABLE(4b,8b) | ||
258 | : "+a" (size), "+a" (src), "+d" (dst), "=a" (tmp1), "=a" (tmp2) | ||
259 | : "d" (reg0), "K" (-EFAULT) : "cc", "memory"); | ||
260 | return size; | ||
261 | } | ||
262 | |||
263 | #define __futex_atomic_op(insn, ret, oldval, newval, uaddr, oparg) \ | ||
264 | asm volatile( \ | ||
265 | " sacf 256\n" \ | ||
266 | "0: l %1,0(%6)\n" \ | ||
267 | "1:"insn \ | ||
268 | "2: cs %1,%2,0(%6)\n" \ | ||
269 | "3: jl 1b\n" \ | ||
270 | " lhi %0,0\n" \ | ||
271 | "4: sacf 0\n" \ | ||
272 | EX_TABLE(0b,4b) EX_TABLE(2b,4b) EX_TABLE(3b,4b) \ | ||
273 | : "=d" (ret), "=&d" (oldval), "=&d" (newval), \ | ||
274 | "=m" (*uaddr) \ | ||
275 | : "0" (-EFAULT), "d" (oparg), "a" (uaddr), \ | ||
276 | "m" (*uaddr) : "cc"); | ||
277 | |||
278 | int futex_atomic_op(int op, int __user *uaddr, int oparg, int *old) | ||
279 | { | ||
280 | int oldval = 0, newval, ret; | ||
281 | |||
282 | inc_preempt_count(); | ||
283 | |||
284 | switch (op) { | ||
285 | case FUTEX_OP_SET: | ||
286 | __futex_atomic_op("lr %2,%5\n", | ||
287 | ret, oldval, newval, uaddr, oparg); | ||
288 | break; | ||
289 | case FUTEX_OP_ADD: | ||
290 | __futex_atomic_op("lr %2,%1\nar %2,%5\n", | ||
291 | ret, oldval, newval, uaddr, oparg); | ||
292 | break; | ||
293 | case FUTEX_OP_OR: | ||
294 | __futex_atomic_op("lr %2,%1\nor %2,%5\n", | ||
295 | ret, oldval, newval, uaddr, oparg); | ||
296 | break; | ||
297 | case FUTEX_OP_ANDN: | ||
298 | __futex_atomic_op("lr %2,%1\nnr %2,%5\n", | ||
299 | ret, oldval, newval, uaddr, oparg); | ||
300 | break; | ||
301 | case FUTEX_OP_XOR: | ||
302 | __futex_atomic_op("lr %2,%1\nxr %2,%5\n", | ||
303 | ret, oldval, newval, uaddr, oparg); | ||
304 | break; | ||
305 | default: | ||
306 | ret = -ENOSYS; | ||
307 | } | ||
308 | dec_preempt_count(); | ||
309 | *old = oldval; | ||
310 | return ret; | ||
311 | } | ||
312 | |||
313 | int futex_atomic_cmpxchg(int __user *uaddr, int oldval, int newval) | ||
314 | { | ||
315 | int ret; | ||
316 | |||
317 | asm volatile( | ||
318 | " sacf 256\n" | ||
319 | " cs %1,%4,0(%5)\n" | ||
320 | "0: lr %0,%1\n" | ||
321 | "1: sacf 0\n" | ||
322 | EX_TABLE(0b,1b) | ||
323 | : "=d" (ret), "+d" (oldval), "=m" (*uaddr) | ||
324 | : "0" (-EFAULT), "d" (newval), "a" (uaddr), "m" (*uaddr) | ||
325 | : "cc", "memory" ); | ||
326 | return ret; | ||
327 | } | ||
328 | |||
329 | struct uaccess_ops uaccess_std = { | ||
330 | .copy_from_user = copy_from_user_std, | ||
331 | .copy_from_user_small = copy_from_user_std_small, | ||
332 | .copy_to_user = copy_to_user_std, | ||
333 | .copy_to_user_small = copy_to_user_std_small, | ||
334 | .copy_in_user = copy_in_user_std, | ||
335 | .clear_user = clear_user_std, | ||
336 | .strnlen_user = strnlen_user_std, | ||
337 | .strncpy_from_user = strncpy_from_user_std, | ||
338 | .futex_atomic_op = futex_atomic_op, | ||
339 | .futex_atomic_cmpxchg = futex_atomic_cmpxchg, | ||
340 | }; | ||
diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c index ceea51cff03b..786a44dba5bf 100644 --- a/arch/s390/mm/cmm.c +++ b/arch/s390/mm/cmm.c | |||
@@ -53,22 +53,6 @@ static void cmm_timer_fn(unsigned long); | |||
53 | static void cmm_set_timer(void); | 53 | static void cmm_set_timer(void); |
54 | 54 | ||
55 | static long | 55 | static long |
56 | cmm_strtoul(const char *cp, char **endp) | ||
57 | { | ||
58 | unsigned int base = 10; | ||
59 | |||
60 | if (*cp == '0') { | ||
61 | base = 8; | ||
62 | cp++; | ||
63 | if ((*cp == 'x' || *cp == 'X') && isxdigit(cp[1])) { | ||
64 | base = 16; | ||
65 | cp++; | ||
66 | } | ||
67 | } | ||
68 | return simple_strtoul(cp, endp, base); | ||
69 | } | ||
70 | |||
71 | static long | ||
72 | cmm_alloc_pages(long pages, long *counter, struct cmm_page_array **list) | 56 | cmm_alloc_pages(long pages, long *counter, struct cmm_page_array **list) |
73 | { | 57 | { |
74 | struct cmm_page_array *pa; | 58 | struct cmm_page_array *pa; |
@@ -276,7 +260,7 @@ cmm_pages_handler(ctl_table *ctl, int write, struct file *filp, | |||
276 | return -EFAULT; | 260 | return -EFAULT; |
277 | buf[sizeof(buf) - 1] = '\0'; | 261 | buf[sizeof(buf) - 1] = '\0'; |
278 | cmm_skip_blanks(buf, &p); | 262 | cmm_skip_blanks(buf, &p); |
279 | pages = cmm_strtoul(p, &p); | 263 | pages = simple_strtoul(p, &p, 0); |
280 | if (ctl == &cmm_table[0]) | 264 | if (ctl == &cmm_table[0]) |
281 | cmm_set_pages(pages); | 265 | cmm_set_pages(pages); |
282 | else | 266 | else |
@@ -317,9 +301,9 @@ cmm_timeout_handler(ctl_table *ctl, int write, struct file *filp, | |||
317 | return -EFAULT; | 301 | return -EFAULT; |
318 | buf[sizeof(buf) - 1] = '\0'; | 302 | buf[sizeof(buf) - 1] = '\0'; |
319 | cmm_skip_blanks(buf, &p); | 303 | cmm_skip_blanks(buf, &p); |
320 | pages = cmm_strtoul(p, &p); | 304 | pages = simple_strtoul(p, &p, 0); |
321 | cmm_skip_blanks(p, &p); | 305 | cmm_skip_blanks(p, &p); |
322 | seconds = cmm_strtoul(p, &p); | 306 | seconds = simple_strtoul(p, &p, 0); |
323 | cmm_set_timeout(pages, seconds); | 307 | cmm_set_timeout(pages, seconds); |
324 | } else { | 308 | } else { |
325 | len = sprintf(buf, "%ld %ld\n", | 309 | len = sprintf(buf, "%ld %ld\n", |
@@ -382,24 +366,24 @@ cmm_smsg_target(char *from, char *msg) | |||
382 | if (strncmp(msg, "SHRINK", 6) == 0) { | 366 | if (strncmp(msg, "SHRINK", 6) == 0) { |
383 | if (!cmm_skip_blanks(msg + 6, &msg)) | 367 | if (!cmm_skip_blanks(msg + 6, &msg)) |
384 | return; | 368 | return; |
385 | pages = cmm_strtoul(msg, &msg); | 369 | pages = simple_strtoul(msg, &msg, 0); |
386 | cmm_skip_blanks(msg, &msg); | 370 | cmm_skip_blanks(msg, &msg); |
387 | if (*msg == '\0') | 371 | if (*msg == '\0') |
388 | cmm_set_pages(pages); | 372 | cmm_set_pages(pages); |
389 | } else if (strncmp(msg, "RELEASE", 7) == 0) { | 373 | } else if (strncmp(msg, "RELEASE", 7) == 0) { |
390 | if (!cmm_skip_blanks(msg + 7, &msg)) | 374 | if (!cmm_skip_blanks(msg + 7, &msg)) |
391 | return; | 375 | return; |
392 | pages = cmm_strtoul(msg, &msg); | 376 | pages = simple_strtoul(msg, &msg, 0); |
393 | cmm_skip_blanks(msg, &msg); | 377 | cmm_skip_blanks(msg, &msg); |
394 | if (*msg == '\0') | 378 | if (*msg == '\0') |
395 | cmm_add_timed_pages(pages); | 379 | cmm_add_timed_pages(pages); |
396 | } else if (strncmp(msg, "REUSE", 5) == 0) { | 380 | } else if (strncmp(msg, "REUSE", 5) == 0) { |
397 | if (!cmm_skip_blanks(msg + 5, &msg)) | 381 | if (!cmm_skip_blanks(msg + 5, &msg)) |
398 | return; | 382 | return; |
399 | pages = cmm_strtoul(msg, &msg); | 383 | pages = simple_strtoul(msg, &msg, 0); |
400 | if (!cmm_skip_blanks(msg, &msg)) | 384 | if (!cmm_skip_blanks(msg, &msg)) |
401 | return; | 385 | return; |
402 | seconds = cmm_strtoul(msg, &msg); | 386 | seconds = simple_strtoul(msg, &msg, 0); |
403 | cmm_skip_blanks(msg, &msg); | 387 | cmm_skip_blanks(msg, &msg); |
404 | if (*msg == '\0') | 388 | if (*msg == '\0') |
405 | cmm_set_timeout(pages, seconds); | 389 | cmm_set_timeout(pages, seconds); |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 7cd82575813d..44f0cda7e72e 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
@@ -25,10 +25,12 @@ | |||
25 | #include <linux/console.h> | 25 | #include <linux/console.h> |
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <linux/hardirq.h> | 27 | #include <linux/hardirq.h> |
28 | #include <linux/kprobes.h> | ||
28 | 29 | ||
29 | #include <asm/system.h> | 30 | #include <asm/system.h> |
30 | #include <asm/uaccess.h> | 31 | #include <asm/uaccess.h> |
31 | #include <asm/pgtable.h> | 32 | #include <asm/pgtable.h> |
33 | #include <asm/kdebug.h> | ||
32 | 34 | ||
33 | #ifndef CONFIG_64BIT | 35 | #ifndef CONFIG_64BIT |
34 | #define __FAIL_ADDR_MASK 0x7ffff000 | 36 | #define __FAIL_ADDR_MASK 0x7ffff000 |
@@ -48,6 +50,38 @@ extern int sysctl_userprocess_debug; | |||
48 | 50 | ||
49 | extern void die(const char *,struct pt_regs *,long); | 51 | extern void die(const char *,struct pt_regs *,long); |
50 | 52 | ||
53 | #ifdef CONFIG_KPROBES | ||
54 | ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain); | ||
55 | int register_page_fault_notifier(struct notifier_block *nb) | ||
56 | { | ||
57 | return atomic_notifier_chain_register(¬ify_page_fault_chain, nb); | ||
58 | } | ||
59 | |||
60 | int unregister_page_fault_notifier(struct notifier_block *nb) | ||
61 | { | ||
62 | return atomic_notifier_chain_unregister(¬ify_page_fault_chain, nb); | ||
63 | } | ||
64 | |||
65 | static inline int notify_page_fault(enum die_val val, const char *str, | ||
66 | struct pt_regs *regs, long err, int trap, int sig) | ||
67 | { | ||
68 | struct die_args args = { | ||
69 | .regs = regs, | ||
70 | .str = str, | ||
71 | .err = err, | ||
72 | .trapnr = trap, | ||
73 | .signr = sig | ||
74 | }; | ||
75 | return atomic_notifier_call_chain(¬ify_page_fault_chain, val, &args); | ||
76 | } | ||
77 | #else | ||
78 | static inline int notify_page_fault(enum die_val val, const char *str, | ||
79 | struct pt_regs *regs, long err, int trap, int sig) | ||
80 | { | ||
81 | return NOTIFY_DONE; | ||
82 | } | ||
83 | #endif | ||
84 | |||
51 | extern spinlock_t timerlist_lock; | 85 | extern spinlock_t timerlist_lock; |
52 | 86 | ||
53 | /* | 87 | /* |
@@ -159,7 +193,7 @@ static void do_sigsegv(struct pt_regs *regs, unsigned long error_code, | |||
159 | * 11 Page translation -> Not present (nullification) | 193 | * 11 Page translation -> Not present (nullification) |
160 | * 3b Region third trans. -> Not present (nullification) | 194 | * 3b Region third trans. -> Not present (nullification) |
161 | */ | 195 | */ |
162 | static inline void | 196 | static inline void __kprobes |
163 | do_exception(struct pt_regs *regs, unsigned long error_code, int is_protection) | 197 | do_exception(struct pt_regs *regs, unsigned long error_code, int is_protection) |
164 | { | 198 | { |
165 | struct task_struct *tsk; | 199 | struct task_struct *tsk; |
@@ -173,6 +207,10 @@ do_exception(struct pt_regs *regs, unsigned long error_code, int is_protection) | |||
173 | tsk = current; | 207 | tsk = current; |
174 | mm = tsk->mm; | 208 | mm = tsk->mm; |
175 | 209 | ||
210 | if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | ||
211 | SIGSEGV) == NOTIFY_STOP) | ||
212 | return; | ||
213 | |||
176 | /* | 214 | /* |
177 | * Check for low-address protection. This needs to be treated | 215 | * Check for low-address protection. This needs to be treated |
178 | * as a special case because the translation exception code | 216 | * as a special case because the translation exception code |
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 6e6b6de77770..cfd9b8f7a523 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c | |||
@@ -108,16 +108,23 @@ void __init paging_init(void) | |||
108 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | _KERNSEG_TABLE; | 108 | unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) | _KERNSEG_TABLE; |
109 | static const int ssm_mask = 0x04000000L; | 109 | static const int ssm_mask = 0x04000000L; |
110 | unsigned long ro_start_pfn, ro_end_pfn; | 110 | unsigned long ro_start_pfn, ro_end_pfn; |
111 | unsigned long zones_size[MAX_NR_ZONES]; | ||
111 | 112 | ||
112 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); | 113 | ro_start_pfn = PFN_DOWN((unsigned long)&__start_rodata); |
113 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); | 114 | ro_end_pfn = PFN_UP((unsigned long)&__end_rodata); |
114 | 115 | ||
116 | memset(zones_size, 0, sizeof(zones_size)); | ||
117 | zones_size[ZONE_DMA] = max_low_pfn; | ||
118 | free_area_init_node(0, &contig_page_data, zones_size, | ||
119 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, | ||
120 | zholes_size); | ||
121 | |||
115 | /* unmap whole virtual address space */ | 122 | /* unmap whole virtual address space */ |
116 | 123 | ||
117 | pg_dir = swapper_pg_dir; | 124 | pg_dir = swapper_pg_dir; |
118 | 125 | ||
119 | for (i=0;i<KERNEL_PGD_PTRS;i++) | 126 | for (i = 0; i < PTRS_PER_PGD; i++) |
120 | pmd_clear((pmd_t*)pg_dir++); | 127 | pmd_clear((pmd_t *) pg_dir++); |
121 | 128 | ||
122 | /* | 129 | /* |
123 | * map whole physical memory to virtual memory (identity mapping) | 130 | * map whole physical memory to virtual memory (identity mapping) |
@@ -131,10 +138,7 @@ void __init paging_init(void) | |||
131 | */ | 138 | */ |
132 | pg_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); | 139 | pg_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); |
133 | 140 | ||
134 | pg_dir->pgd0 = (_PAGE_TABLE | __pa(pg_table)); | 141 | pmd_populate_kernel(&init_mm, (pmd_t *) pg_dir, pg_table); |
135 | pg_dir->pgd1 = (_PAGE_TABLE | (__pa(pg_table)+1024)); | ||
136 | pg_dir->pgd2 = (_PAGE_TABLE | (__pa(pg_table)+2048)); | ||
137 | pg_dir->pgd3 = (_PAGE_TABLE | (__pa(pg_table)+3072)); | ||
138 | pg_dir++; | 142 | pg_dir++; |
139 | 143 | ||
140 | for (tmp = 0 ; tmp < PTRS_PER_PTE ; tmp++,pg_table++) { | 144 | for (tmp = 0 ; tmp < PTRS_PER_PTE ; tmp++,pg_table++) { |
@@ -143,8 +147,8 @@ void __init paging_init(void) | |||
143 | else | 147 | else |
144 | pte = pfn_pte(pfn, PAGE_KERNEL); | 148 | pte = pfn_pte(pfn, PAGE_KERNEL); |
145 | if (pfn >= max_low_pfn) | 149 | if (pfn >= max_low_pfn) |
146 | pte_clear(&init_mm, 0, &pte); | 150 | pte_val(pte) = _PAGE_TYPE_EMPTY; |
147 | set_pte(pg_table, pte); | 151 | set_pte(pg_table, pte); |
148 | pfn++; | 152 | pfn++; |
149 | } | 153 | } |
150 | } | 154 | } |
@@ -159,16 +163,6 @@ void __init paging_init(void) | |||
159 | : : "m" (pgdir_k), "m" (ssm_mask)); | 163 | : : "m" (pgdir_k), "m" (ssm_mask)); |
160 | 164 | ||
161 | local_flush_tlb(); | 165 | local_flush_tlb(); |
162 | |||
163 | { | ||
164 | unsigned long zones_size[MAX_NR_ZONES]; | ||
165 | |||
166 | memset(zones_size, 0, sizeof(zones_size)); | ||
167 | zones_size[ZONE_DMA] = max_low_pfn; | ||
168 | free_area_init_node(0, &contig_page_data, zones_size, | ||
169 | __pa(PAGE_OFFSET) >> PAGE_SHIFT, | ||
170 | zholes_size); | ||
171 | } | ||
172 | return; | 166 | return; |
173 | } | 167 | } |
174 | 168 | ||
@@ -236,10 +230,8 @@ void __init paging_init(void) | |||
236 | pte = pfn_pte(pfn, __pgprot(_PAGE_RO)); | 230 | pte = pfn_pte(pfn, __pgprot(_PAGE_RO)); |
237 | else | 231 | else |
238 | pte = pfn_pte(pfn, PAGE_KERNEL); | 232 | pte = pfn_pte(pfn, PAGE_KERNEL); |
239 | if (pfn >= max_low_pfn) { | 233 | if (pfn >= max_low_pfn) |
240 | pte_clear(&init_mm, 0, &pte); | 234 | pte_val(pte) = _PAGE_TYPE_EMPTY; |
241 | continue; | ||
242 | } | ||
243 | set_pte(pt_dir, pte); | 235 | set_pte(pt_dir, pte); |
244 | pfn++; | 236 | pfn++; |
245 | } | 237 | } |
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index 22dc9c21201d..f2031314cb2b 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/uaccess.h> | 26 | #include <asm/uaccess.h> |
27 | #include <asm/mmu_context.h> | 27 | #include <asm/mmu_context.h> |
28 | #include <asm/elf.h> | 28 | #include <asm/elf.h> |
29 | #include <asm/ubc.h> | ||
29 | 30 | ||
30 | static int hlt_counter=0; | 31 | static int hlt_counter=0; |
31 | 32 | ||
diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index 81c0cbd96ff0..75ac24d229b1 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c | |||
@@ -277,7 +277,7 @@ void __init ebus_init(void) | |||
277 | struct pci_dev *pdev; | 277 | struct pci_dev *pdev; |
278 | struct pcidev_cookie *cookie; | 278 | struct pcidev_cookie *cookie; |
279 | struct device_node *dp; | 279 | struct device_node *dp; |
280 | unsigned long addr, *base; | 280 | struct resource *p; |
281 | unsigned short pci_command; | 281 | unsigned short pci_command; |
282 | int len, reg, nreg; | 282 | int len, reg, nreg; |
283 | int num_ebus = 0; | 283 | int num_ebus = 0; |
@@ -321,13 +321,12 @@ void __init ebus_init(void) | |||
321 | } | 321 | } |
322 | nreg = len / sizeof(struct linux_prom_pci_registers); | 322 | nreg = len / sizeof(struct linux_prom_pci_registers); |
323 | 323 | ||
324 | base = &ebus->self->resource[0].start; | 324 | p = &ebus->self->resource[0]; |
325 | for (reg = 0; reg < nreg; reg++) { | 325 | for (reg = 0; reg < nreg; reg++) { |
326 | if (!(regs[reg].which_io & 0x03000000)) | 326 | if (!(regs[reg].which_io & 0x03000000)) |
327 | continue; | 327 | continue; |
328 | 328 | ||
329 | addr = regs[reg].phys_lo; | 329 | (p++)->start = regs[reg].phys_lo; |
330 | *base++ = addr; | ||
331 | } | 330 | } |
332 | 331 | ||
333 | ebus->ofdev.node = dp; | 332 | ebus->ofdev.node = dp; |
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index 8654b446ac9e..d33f8a07ccac 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c | |||
@@ -508,6 +508,7 @@ void __init sbus_arch_bus_ranges_init(struct device_node *pn, struct sbus_bus *s | |||
508 | 508 | ||
509 | void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) | 509 | void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) |
510 | { | 510 | { |
511 | #ifndef CONFIG_SUN4 | ||
511 | struct device_node *parent = dp->parent; | 512 | struct device_node *parent = dp->parent; |
512 | 513 | ||
513 | if (sparc_cpu_model != sun4d && | 514 | if (sparc_cpu_model != sun4d && |
@@ -524,6 +525,7 @@ void __init sbus_setup_iommu(struct sbus_bus *sbus, struct device_node *dp) | |||
524 | 525 | ||
525 | iounit_init(dp->node, parent->node, sbus); | 526 | iounit_init(dp->node, parent->node, sbus); |
526 | } | 527 | } |
528 | #endif | ||
527 | } | 529 | } |
528 | 530 | ||
529 | void __init sbus_setup_arch_props(struct sbus_bus *sbus, struct device_node *dp) | 531 | void __init sbus_setup_arch_props(struct sbus_bus *sbus, struct device_node *dp) |
diff --git a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c index 94ff58c9d4a9..896863fb208a 100644 --- a/arch/sparc/kernel/sys_sparc.c +++ b/arch/sparc/kernel/sys_sparc.c | |||
@@ -470,19 +470,21 @@ asmlinkage int sys_getdomainname(char __user *name, int len) | |||
470 | { | 470 | { |
471 | int nlen, err; | 471 | int nlen, err; |
472 | 472 | ||
473 | if (len < 0 || len > __NEW_UTS_LEN) | 473 | if (len < 0) |
474 | return -EINVAL; | 474 | return -EINVAL; |
475 | 475 | ||
476 | down_read(&uts_sem); | 476 | down_read(&uts_sem); |
477 | 477 | ||
478 | nlen = strlen(system_utsname.domainname) + 1; | 478 | nlen = strlen(system_utsname.domainname) + 1; |
479 | if (nlen < len) | 479 | err = -EINVAL; |
480 | len = nlen; | 480 | if (nlen > len) |
481 | goto out; | ||
481 | 482 | ||
482 | err = -EFAULT; | 483 | err = -EFAULT; |
483 | if (!copy_to_user(name, system_utsname.domainname, len)) | 484 | if (!copy_to_user(name, system_utsname.domainname, nlen)) |
484 | err = 0; | 485 | err = 0; |
485 | 486 | ||
487 | out: | ||
486 | up_read(&uts_sem); | 488 | up_read(&uts_sem); |
487 | return err; | 489 | return err; |
488 | } | 490 | } |
diff --git a/arch/sparc64/defconfig b/arch/sparc64/defconfig index 43d9229fca07..51cf6027b701 100644 --- a/arch/sparc64/defconfig +++ b/arch/sparc64/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.18-rc2 | 3 | # Linux kernel version: 2.6.18 |
4 | # Fri Jul 21 14:19:24 2006 | 4 | # Sat Sep 23 18:32:19 2006 |
5 | # | 5 | # |
6 | CONFIG_SPARC=y | 6 | CONFIG_SPARC=y |
7 | CONFIG_SPARC64=y | 7 | CONFIG_SPARC64=y |
@@ -9,6 +9,7 @@ CONFIG_64BIT=y | |||
9 | CONFIG_MMU=y | 9 | CONFIG_MMU=y |
10 | CONFIG_TIME_INTERPOLATION=y | 10 | CONFIG_TIME_INTERPOLATION=y |
11 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | 11 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y |
12 | CONFIG_AUDIT_ARCH=y | ||
12 | CONFIG_SPARC64_PAGE_SIZE_8KB=y | 13 | CONFIG_SPARC64_PAGE_SIZE_8KB=y |
13 | # CONFIG_SPARC64_PAGE_SIZE_64KB is not set | 14 | # CONFIG_SPARC64_PAGE_SIZE_64KB is not set |
14 | # CONFIG_SPARC64_PAGE_SIZE_512KB is not set | 15 | # CONFIG_SPARC64_PAGE_SIZE_512KB is not set |
@@ -37,14 +38,14 @@ CONFIG_SYSVIPC=y | |||
37 | CONFIG_POSIX_MQUEUE=y | 38 | CONFIG_POSIX_MQUEUE=y |
38 | # CONFIG_BSD_PROCESS_ACCT is not set | 39 | # CONFIG_BSD_PROCESS_ACCT is not set |
39 | # CONFIG_TASKSTATS is not set | 40 | # CONFIG_TASKSTATS is not set |
40 | CONFIG_SYSCTL=y | ||
41 | # CONFIG_AUDIT is not set | 41 | # CONFIG_AUDIT is not set |
42 | # CONFIG_IKCONFIG is not set | 42 | # CONFIG_IKCONFIG is not set |
43 | CONFIG_RELAY=y | 43 | CONFIG_RELAY=y |
44 | CONFIG_INITRAMFS_SOURCE="" | 44 | CONFIG_INITRAMFS_SOURCE="" |
45 | CONFIG_UID16=y | ||
46 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 45 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
47 | # CONFIG_EMBEDDED is not set | 46 | # CONFIG_EMBEDDED is not set |
47 | CONFIG_UID16=y | ||
48 | CONFIG_SYSCTL=y | ||
48 | CONFIG_KALLSYMS=y | 49 | CONFIG_KALLSYMS=y |
49 | # CONFIG_KALLSYMS_ALL is not set | 50 | # CONFIG_KALLSYMS_ALL is not set |
50 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 51 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -53,12 +54,12 @@ CONFIG_PRINTK=y | |||
53 | CONFIG_BUG=y | 54 | CONFIG_BUG=y |
54 | CONFIG_ELF_CORE=y | 55 | CONFIG_ELF_CORE=y |
55 | CONFIG_BASE_FULL=y | 56 | CONFIG_BASE_FULL=y |
56 | CONFIG_RT_MUTEXES=y | ||
57 | CONFIG_FUTEX=y | 57 | CONFIG_FUTEX=y |
58 | CONFIG_EPOLL=y | 58 | CONFIG_EPOLL=y |
59 | CONFIG_SHMEM=y | 59 | CONFIG_SHMEM=y |
60 | CONFIG_SLAB=y | 60 | CONFIG_SLAB=y |
61 | CONFIG_VM_EVENT_COUNTERS=y | 61 | CONFIG_VM_EVENT_COUNTERS=y |
62 | CONFIG_RT_MUTEXES=y | ||
62 | # CONFIG_TINY_SHMEM is not set | 63 | # CONFIG_TINY_SHMEM is not set |
63 | CONFIG_BASE_SMALL=0 | 64 | CONFIG_BASE_SMALL=0 |
64 | # CONFIG_SLOB is not set | 65 | # CONFIG_SLOB is not set |
@@ -169,6 +170,7 @@ CONFIG_PACKET_MMAP=y | |||
169 | CONFIG_UNIX=y | 170 | CONFIG_UNIX=y |
170 | CONFIG_XFRM=y | 171 | CONFIG_XFRM=y |
171 | CONFIG_XFRM_USER=m | 172 | CONFIG_XFRM_USER=m |
173 | # CONFIG_XFRM_SUB_POLICY is not set | ||
172 | CONFIG_NET_KEY=m | 174 | CONFIG_NET_KEY=m |
173 | CONFIG_INET=y | 175 | CONFIG_INET=y |
174 | CONFIG_IP_MULTICAST=y | 176 | CONFIG_IP_MULTICAST=y |
@@ -214,11 +216,15 @@ CONFIG_IPV6_ROUTE_INFO=y | |||
214 | CONFIG_INET6_AH=m | 216 | CONFIG_INET6_AH=m |
215 | CONFIG_INET6_ESP=m | 217 | CONFIG_INET6_ESP=m |
216 | CONFIG_INET6_IPCOMP=m | 218 | CONFIG_INET6_IPCOMP=m |
219 | # CONFIG_IPV6_MIP6 is not set | ||
217 | CONFIG_INET6_XFRM_TUNNEL=m | 220 | CONFIG_INET6_XFRM_TUNNEL=m |
218 | CONFIG_INET6_TUNNEL=m | 221 | CONFIG_INET6_TUNNEL=m |
219 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | 222 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m |
220 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | 223 | CONFIG_INET6_XFRM_MODE_TUNNEL=m |
224 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
221 | CONFIG_IPV6_TUNNEL=m | 225 | CONFIG_IPV6_TUNNEL=m |
226 | # CONFIG_IPV6_SUBTREES is not set | ||
227 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
222 | # CONFIG_NETWORK_SECMARK is not set | 228 | # CONFIG_NETWORK_SECMARK is not set |
223 | # CONFIG_NETFILTER is not set | 229 | # CONFIG_NETFILTER is not set |
224 | 230 | ||
@@ -233,6 +239,7 @@ CONFIG_IP_DCCP_ACKVEC=y | |||
233 | # DCCP CCIDs Configuration (EXPERIMENTAL) | 239 | # DCCP CCIDs Configuration (EXPERIMENTAL) |
234 | # | 240 | # |
235 | CONFIG_IP_DCCP_CCID2=m | 241 | CONFIG_IP_DCCP_CCID2=m |
242 | # CONFIG_IP_DCCP_CCID2_DEBUG is not set | ||
236 | CONFIG_IP_DCCP_CCID3=m | 243 | CONFIG_IP_DCCP_CCID3=m |
237 | CONFIG_IP_DCCP_TFRC_LIB=m | 244 | CONFIG_IP_DCCP_TFRC_LIB=m |
238 | 245 | ||
@@ -259,7 +266,6 @@ CONFIG_VLAN_8021Q=m | |||
259 | # CONFIG_ATALK is not set | 266 | # CONFIG_ATALK is not set |
260 | # CONFIG_X25 is not set | 267 | # CONFIG_X25 is not set |
261 | # CONFIG_LAPB is not set | 268 | # CONFIG_LAPB is not set |
262 | # CONFIG_NET_DIVERT is not set | ||
263 | # CONFIG_ECONET is not set | 269 | # CONFIG_ECONET is not set |
264 | # CONFIG_WAN_ROUTER is not set | 270 | # CONFIG_WAN_ROUTER is not set |
265 | 271 | ||
@@ -1386,6 +1392,10 @@ CONFIG_KEYS=y | |||
1386 | # Cryptographic options | 1392 | # Cryptographic options |
1387 | # | 1393 | # |
1388 | CONFIG_CRYPTO=y | 1394 | CONFIG_CRYPTO=y |
1395 | CONFIG_CRYPTO_ALGAPI=y | ||
1396 | CONFIG_CRYPTO_BLKCIPHER=y | ||
1397 | CONFIG_CRYPTO_HASH=y | ||
1398 | CONFIG_CRYPTO_MANAGER=m | ||
1389 | CONFIG_CRYPTO_HMAC=y | 1399 | CONFIG_CRYPTO_HMAC=y |
1390 | CONFIG_CRYPTO_NULL=m | 1400 | CONFIG_CRYPTO_NULL=m |
1391 | CONFIG_CRYPTO_MD4=y | 1401 | CONFIG_CRYPTO_MD4=y |
@@ -1395,9 +1405,12 @@ CONFIG_CRYPTO_SHA256=m | |||
1395 | CONFIG_CRYPTO_SHA512=m | 1405 | CONFIG_CRYPTO_SHA512=m |
1396 | CONFIG_CRYPTO_WP512=m | 1406 | CONFIG_CRYPTO_WP512=m |
1397 | CONFIG_CRYPTO_TGR192=m | 1407 | CONFIG_CRYPTO_TGR192=m |
1408 | CONFIG_CRYPTO_ECB=m | ||
1409 | CONFIG_CRYPTO_CBC=y | ||
1398 | CONFIG_CRYPTO_DES=y | 1410 | CONFIG_CRYPTO_DES=y |
1399 | CONFIG_CRYPTO_BLOWFISH=m | 1411 | CONFIG_CRYPTO_BLOWFISH=m |
1400 | CONFIG_CRYPTO_TWOFISH=m | 1412 | CONFIG_CRYPTO_TWOFISH=m |
1413 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
1401 | CONFIG_CRYPTO_SERPENT=m | 1414 | CONFIG_CRYPTO_SERPENT=m |
1402 | CONFIG_CRYPTO_AES=m | 1415 | CONFIG_CRYPTO_AES=m |
1403 | CONFIG_CRYPTO_CAST5=m | 1416 | CONFIG_CRYPTO_CAST5=m |
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c index bf5f14ee73de..c608c947e6c3 100644 --- a/arch/sparc64/kernel/sys_sparc.c +++ b/arch/sparc64/kernel/sys_sparc.c | |||
@@ -707,19 +707,21 @@ asmlinkage long sys_getdomainname(char __user *name, int len) | |||
707 | { | 707 | { |
708 | int nlen, err; | 708 | int nlen, err; |
709 | 709 | ||
710 | if (len < 0 || len > __NEW_UTS_LEN) | 710 | if (len < 0) |
711 | return -EINVAL; | 711 | return -EINVAL; |
712 | 712 | ||
713 | down_read(&uts_sem); | 713 | down_read(&uts_sem); |
714 | 714 | ||
715 | nlen = strlen(system_utsname.domainname) + 1; | 715 | nlen = strlen(system_utsname.domainname) + 1; |
716 | if (nlen < len) | 716 | err = -EINVAL; |
717 | len = nlen; | 717 | if (nlen > len) |
718 | goto out; | ||
718 | 719 | ||
719 | err = -EFAULT; | 720 | err = -EFAULT; |
720 | if (!copy_to_user(name, system_utsname.domainname, len)) | 721 | if (!copy_to_user(name, system_utsname.domainname, nlen)) |
721 | err = 0; | 722 | err = 0; |
722 | 723 | ||
724 | out: | ||
723 | up_read(&uts_sem); | 725 | up_read(&uts_sem); |
724 | return err; | 726 | return err; |
725 | } | 727 | } |
diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c index 094d3e35be18..b0b4feeec098 100644 --- a/arch/sparc64/kernel/time.c +++ b/arch/sparc64/kernel/time.c | |||
@@ -983,7 +983,7 @@ static struct time_interpolator sparc64_cpu_interpolator = { | |||
983 | }; | 983 | }; |
984 | 984 | ||
985 | /* The quotient formula is taken from the IA64 port. */ | 985 | /* The quotient formula is taken from the IA64 port. */ |
986 | #define SPARC64_NSEC_PER_CYC_SHIFT 30UL | 986 | #define SPARC64_NSEC_PER_CYC_SHIFT 10UL |
987 | void __init time_init(void) | 987 | void __init time_init(void) |
988 | { | 988 | { |
989 | unsigned long clock = sparc64_init_timers(); | 989 | unsigned long clock = sparc64_init_timers(); |
diff --git a/arch/sparc64/solaris/misc.c b/arch/sparc64/solaris/misc.c index 8135ec322c9c..642541769a17 100644 --- a/arch/sparc64/solaris/misc.c +++ b/arch/sparc64/solaris/misc.c | |||
@@ -736,20 +736,15 @@ struct exec_domain solaris_exec_domain = { | |||
736 | 736 | ||
737 | extern int init_socksys(void); | 737 | extern int init_socksys(void); |
738 | 738 | ||
739 | #ifdef MODULE | ||
740 | |||
741 | MODULE_AUTHOR("Jakub Jelinek (jj@ultra.linux.cz), Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)"); | 739 | MODULE_AUTHOR("Jakub Jelinek (jj@ultra.linux.cz), Patrik Rak (prak3264@ss1000.ms.mff.cuni.cz)"); |
742 | MODULE_DESCRIPTION("Solaris binary emulation module"); | 740 | MODULE_DESCRIPTION("Solaris binary emulation module"); |
743 | MODULE_LICENSE("GPL"); | 741 | MODULE_LICENSE("GPL"); |
744 | 742 | ||
745 | #ifdef __sparc_v9__ | ||
746 | extern u32 tl0_solaris[8]; | 743 | extern u32 tl0_solaris[8]; |
747 | #define update_ttable(x) \ | 744 | #define update_ttable(x) \ |
748 | tl0_solaris[3] = (((long)(x) - (long)tl0_solaris - 3) >> 2) | 0x40000000; \ | 745 | tl0_solaris[3] = (((long)(x) - (long)tl0_solaris - 3) >> 2) | 0x40000000; \ |
749 | wmb(); \ | 746 | wmb(); \ |
750 | __asm__ __volatile__ ("flush %0" : : "r" (&tl0_solaris[3])) | 747 | __asm__ __volatile__ ("flush %0" : : "r" (&tl0_solaris[3])) |
751 | #else | ||
752 | #endif | ||
753 | 748 | ||
754 | extern u32 solaris_sparc_syscall[]; | 749 | extern u32 solaris_sparc_syscall[]; |
755 | extern u32 solaris_syscall[]; | 750 | extern u32 solaris_syscall[]; |
@@ -757,7 +752,7 @@ extern void cleanup_socksys(void); | |||
757 | 752 | ||
758 | extern u32 entry64_personality_patch; | 753 | extern u32 entry64_personality_patch; |
759 | 754 | ||
760 | int init_module(void) | 755 | static int __init solaris_init(void) |
761 | { | 756 | { |
762 | int ret; | 757 | int ret; |
763 | 758 | ||
@@ -777,19 +772,12 @@ int init_module(void) | |||
777 | return 0; | 772 | return 0; |
778 | } | 773 | } |
779 | 774 | ||
780 | void cleanup_module(void) | 775 | static void __exit solaris_exit(void) |
781 | { | 776 | { |
782 | update_ttable(solaris_syscall); | 777 | update_ttable(solaris_syscall); |
783 | cleanup_socksys(); | 778 | cleanup_socksys(); |
784 | unregister_exec_domain(&solaris_exec_domain); | 779 | unregister_exec_domain(&solaris_exec_domain); |
785 | } | 780 | } |
786 | 781 | ||
787 | #else | 782 | module_init(solaris_init); |
788 | int init_solaris_emul(void) | 783 | module_exit(solaris_exit); |
789 | { | ||
790 | register_exec_domain(&solaris_exec_domain); | ||
791 | init_socksys(); | ||
792 | return 0; | ||
793 | } | ||
794 | #endif | ||
795 | |||
diff --git a/arch/sparc64/solaris/socksys.c b/arch/sparc64/solaris/socksys.c index bc3df95bc057..7c90e41fd3be 100644 --- a/arch/sparc64/solaris/socksys.c +++ b/arch/sparc64/solaris/socksys.c | |||
@@ -168,8 +168,7 @@ static struct file_operations socksys_fops = { | |||
168 | .release = socksys_release, | 168 | .release = socksys_release, |
169 | }; | 169 | }; |
170 | 170 | ||
171 | int __init | 171 | int __init init_socksys(void) |
172 | init_socksys(void) | ||
173 | { | 172 | { |
174 | int ret; | 173 | int ret; |
175 | struct file * file; | 174 | struct file * file; |
@@ -199,8 +198,7 @@ init_socksys(void) | |||
199 | return 0; | 198 | return 0; |
200 | } | 199 | } |
201 | 200 | ||
202 | void | 201 | void __exit cleanup_socksys(void) |
203 | cleanup_socksys(void) | ||
204 | { | 202 | { |
205 | if (unregister_chrdev(30, "socksys")) | 203 | if (unregister_chrdev(30, "socksys")) |
206 | printk ("Couldn't unregister socksys character device\n"); | 204 | printk ("Couldn't unregister socksys character device\n"); |
diff --git a/arch/x86_64/crypto/Makefile b/arch/x86_64/crypto/Makefile index 426d20f4b72e..15b538a8b7f7 100644 --- a/arch/x86_64/crypto/Makefile +++ b/arch/x86_64/crypto/Makefile | |||
@@ -5,5 +5,8 @@ | |||
5 | # | 5 | # |
6 | 6 | ||
7 | obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o | 7 | obj-$(CONFIG_CRYPTO_AES_X86_64) += aes-x86_64.o |
8 | obj-$(CONFIG_CRYPTO_TWOFISH_X86_64) += twofish-x86_64.o | ||
8 | 9 | ||
9 | aes-x86_64-y := aes-x86_64-asm.o aes.o | 10 | aes-x86_64-y := aes-x86_64-asm.o aes.o |
11 | twofish-x86_64-y := twofish-x86_64-asm.o twofish.o | ||
12 | |||
diff --git a/arch/x86_64/crypto/aes.c b/arch/x86_64/crypto/aes.c index 68866fab37aa..5cdb13ea5cc2 100644 --- a/arch/x86_64/crypto/aes.c +++ b/arch/x86_64/crypto/aes.c | |||
@@ -228,13 +228,14 @@ static void __init gen_tabs(void) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | 230 | static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, |
231 | unsigned int key_len, u32 *flags) | 231 | unsigned int key_len) |
232 | { | 232 | { |
233 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); | 233 | struct aes_ctx *ctx = crypto_tfm_ctx(tfm); |
234 | const __le32 *key = (const __le32 *)in_key; | 234 | const __le32 *key = (const __le32 *)in_key; |
235 | u32 *flags = &tfm->crt_flags; | ||
235 | u32 i, j, t, u, v, w; | 236 | u32 i, j, t, u, v, w; |
236 | 237 | ||
237 | if (key_len != 16 && key_len != 24 && key_len != 32) { | 238 | if (key_len % 8) { |
238 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 239 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
239 | return -EINVAL; | 240 | return -EINVAL; |
240 | } | 241 | } |
diff --git a/arch/x86_64/crypto/twofish-x86_64-asm.S b/arch/x86_64/crypto/twofish-x86_64-asm.S new file mode 100644 index 000000000000..35974a586615 --- /dev/null +++ b/arch/x86_64/crypto/twofish-x86_64-asm.S | |||
@@ -0,0 +1,324 @@ | |||
1 | /*************************************************************************** | ||
2 | * Copyright (C) 2006 by Joachim Fritschi, <jfritschi@freenet.de> * | ||
3 | * * | ||
4 | * This program is free software; you can redistribute it and/or modify * | ||
5 | * it under the terms of the GNU General Public License as published by * | ||
6 | * the Free Software Foundation; either version 2 of the License, or * | ||
7 | * (at your option) any later version. * | ||
8 | * * | ||
9 | * This program is distributed in the hope that it will be useful, * | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | ||
12 | * GNU General Public License for more details. * | ||
13 | * * | ||
14 | * You should have received a copy of the GNU General Public License * | ||
15 | * along with this program; if not, write to the * | ||
16 | * Free Software Foundation, Inc., * | ||
17 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | ||
18 | ***************************************************************************/ | ||
19 | |||
20 | .file "twofish-x86_64-asm.S" | ||
21 | .text | ||
22 | |||
23 | #include <asm/asm-offsets.h> | ||
24 | |||
25 | #define a_offset 0 | ||
26 | #define b_offset 4 | ||
27 | #define c_offset 8 | ||
28 | #define d_offset 12 | ||
29 | |||
30 | /* Structure of the crypto context struct*/ | ||
31 | |||
32 | #define s0 0 /* S0 Array 256 Words each */ | ||
33 | #define s1 1024 /* S1 Array */ | ||
34 | #define s2 2048 /* S2 Array */ | ||
35 | #define s3 3072 /* S3 Array */ | ||
36 | #define w 4096 /* 8 whitening keys (word) */ | ||
37 | #define k 4128 /* key 1-32 ( word ) */ | ||
38 | |||
39 | /* define a few register aliases to allow macro substitution */ | ||
40 | |||
41 | #define R0 %rax | ||
42 | #define R0D %eax | ||
43 | #define R0B %al | ||
44 | #define R0H %ah | ||
45 | |||
46 | #define R1 %rbx | ||
47 | #define R1D %ebx | ||
48 | #define R1B %bl | ||
49 | #define R1H %bh | ||
50 | |||
51 | #define R2 %rcx | ||
52 | #define R2D %ecx | ||
53 | #define R2B %cl | ||
54 | #define R2H %ch | ||
55 | |||
56 | #define R3 %rdx | ||
57 | #define R3D %edx | ||
58 | #define R3B %dl | ||
59 | #define R3H %dh | ||
60 | |||
61 | |||
62 | /* performs input whitening */ | ||
63 | #define input_whitening(src,context,offset)\ | ||
64 | xor w+offset(context), src; | ||
65 | |||
66 | /* performs input whitening */ | ||
67 | #define output_whitening(src,context,offset)\ | ||
68 | xor w+16+offset(context), src; | ||
69 | |||
70 | |||
71 | /* | ||
72 | * a input register containing a (rotated 16) | ||
73 | * b input register containing b | ||
74 | * c input register containing c | ||
75 | * d input register containing d (already rol $1) | ||
76 | * operations on a and b are interleaved to increase performance | ||
77 | */ | ||
78 | #define encrypt_round(a,b,c,d,round)\ | ||
79 | movzx b ## B, %edi;\ | ||
80 | mov s1(%r11,%rdi,4),%r8d;\ | ||
81 | movzx a ## B, %edi;\ | ||
82 | mov s2(%r11,%rdi,4),%r9d;\ | ||
83 | movzx b ## H, %edi;\ | ||
84 | ror $16, b ## D;\ | ||
85 | xor s2(%r11,%rdi,4),%r8d;\ | ||
86 | movzx a ## H, %edi;\ | ||
87 | ror $16, a ## D;\ | ||
88 | xor s3(%r11,%rdi,4),%r9d;\ | ||
89 | movzx b ## B, %edi;\ | ||
90 | xor s3(%r11,%rdi,4),%r8d;\ | ||
91 | movzx a ## B, %edi;\ | ||
92 | xor (%r11,%rdi,4), %r9d;\ | ||
93 | movzx b ## H, %edi;\ | ||
94 | ror $15, b ## D;\ | ||
95 | xor (%r11,%rdi,4), %r8d;\ | ||
96 | movzx a ## H, %edi;\ | ||
97 | xor s1(%r11,%rdi,4),%r9d;\ | ||
98 | add %r8d, %r9d;\ | ||
99 | add %r9d, %r8d;\ | ||
100 | add k+round(%r11), %r9d;\ | ||
101 | xor %r9d, c ## D;\ | ||
102 | rol $15, c ## D;\ | ||
103 | add k+4+round(%r11),%r8d;\ | ||
104 | xor %r8d, d ## D; | ||
105 | |||
106 | /* | ||
107 | * a input register containing a(rotated 16) | ||
108 | * b input register containing b | ||
109 | * c input register containing c | ||
110 | * d input register containing d (already rol $1) | ||
111 | * operations on a and b are interleaved to increase performance | ||
112 | * during the round a and b are prepared for the output whitening | ||
113 | */ | ||
114 | #define encrypt_last_round(a,b,c,d,round)\ | ||
115 | mov b ## D, %r10d;\ | ||
116 | shl $32, %r10;\ | ||
117 | movzx b ## B, %edi;\ | ||
118 | mov s1(%r11,%rdi,4),%r8d;\ | ||
119 | movzx a ## B, %edi;\ | ||
120 | mov s2(%r11,%rdi,4),%r9d;\ | ||
121 | movzx b ## H, %edi;\ | ||
122 | ror $16, b ## D;\ | ||
123 | xor s2(%r11,%rdi,4),%r8d;\ | ||
124 | movzx a ## H, %edi;\ | ||
125 | ror $16, a ## D;\ | ||
126 | xor s3(%r11,%rdi,4),%r9d;\ | ||
127 | movzx b ## B, %edi;\ | ||
128 | xor s3(%r11,%rdi,4),%r8d;\ | ||
129 | movzx a ## B, %edi;\ | ||
130 | xor (%r11,%rdi,4), %r9d;\ | ||
131 | xor a, %r10;\ | ||
132 | movzx b ## H, %edi;\ | ||
133 | xor (%r11,%rdi,4), %r8d;\ | ||
134 | movzx a ## H, %edi;\ | ||
135 | xor s1(%r11,%rdi,4),%r9d;\ | ||
136 | add %r8d, %r9d;\ | ||
137 | add %r9d, %r8d;\ | ||
138 | add k+round(%r11), %r9d;\ | ||
139 | xor %r9d, c ## D;\ | ||
140 | ror $1, c ## D;\ | ||
141 | add k+4+round(%r11),%r8d;\ | ||
142 | xor %r8d, d ## D | ||
143 | |||
144 | /* | ||
145 | * a input register containing a | ||
146 | * b input register containing b (rotated 16) | ||
147 | * c input register containing c (already rol $1) | ||
148 | * d input register containing d | ||
149 | * operations on a and b are interleaved to increase performance | ||
150 | */ | ||
151 | #define decrypt_round(a,b,c,d,round)\ | ||
152 | movzx a ## B, %edi;\ | ||
153 | mov (%r11,%rdi,4), %r9d;\ | ||
154 | movzx b ## B, %edi;\ | ||
155 | mov s3(%r11,%rdi,4),%r8d;\ | ||
156 | movzx a ## H, %edi;\ | ||
157 | ror $16, a ## D;\ | ||
158 | xor s1(%r11,%rdi,4),%r9d;\ | ||
159 | movzx b ## H, %edi;\ | ||
160 | ror $16, b ## D;\ | ||
161 | xor (%r11,%rdi,4), %r8d;\ | ||
162 | movzx a ## B, %edi;\ | ||
163 | xor s2(%r11,%rdi,4),%r9d;\ | ||
164 | movzx b ## B, %edi;\ | ||
165 | xor s1(%r11,%rdi,4),%r8d;\ | ||
166 | movzx a ## H, %edi;\ | ||
167 | ror $15, a ## D;\ | ||
168 | xor s3(%r11,%rdi,4),%r9d;\ | ||
169 | movzx b ## H, %edi;\ | ||
170 | xor s2(%r11,%rdi,4),%r8d;\ | ||
171 | add %r8d, %r9d;\ | ||
172 | add %r9d, %r8d;\ | ||
173 | add k+round(%r11), %r9d;\ | ||
174 | xor %r9d, c ## D;\ | ||
175 | add k+4+round(%r11),%r8d;\ | ||
176 | xor %r8d, d ## D;\ | ||
177 | rol $15, d ## D; | ||
178 | |||
179 | /* | ||
180 | * a input register containing a | ||
181 | * b input register containing b | ||
182 | * c input register containing c (already rol $1) | ||
183 | * d input register containing d | ||
184 | * operations on a and b are interleaved to increase performance | ||
185 | * during the round a and b are prepared for the output whitening | ||
186 | */ | ||
187 | #define decrypt_last_round(a,b,c,d,round)\ | ||
188 | movzx a ## B, %edi;\ | ||
189 | mov (%r11,%rdi,4), %r9d;\ | ||
190 | movzx b ## B, %edi;\ | ||
191 | mov s3(%r11,%rdi,4),%r8d;\ | ||
192 | movzx b ## H, %edi;\ | ||
193 | ror $16, b ## D;\ | ||
194 | xor (%r11,%rdi,4), %r8d;\ | ||
195 | movzx a ## H, %edi;\ | ||
196 | mov b ## D, %r10d;\ | ||
197 | shl $32, %r10;\ | ||
198 | xor a, %r10;\ | ||
199 | ror $16, a ## D;\ | ||
200 | xor s1(%r11,%rdi,4),%r9d;\ | ||
201 | movzx b ## B, %edi;\ | ||
202 | xor s1(%r11,%rdi,4),%r8d;\ | ||
203 | movzx a ## B, %edi;\ | ||
204 | xor s2(%r11,%rdi,4),%r9d;\ | ||
205 | movzx b ## H, %edi;\ | ||
206 | xor s2(%r11,%rdi,4),%r8d;\ | ||
207 | movzx a ## H, %edi;\ | ||
208 | xor s3(%r11,%rdi,4),%r9d;\ | ||
209 | add %r8d, %r9d;\ | ||
210 | add %r9d, %r8d;\ | ||
211 | add k+round(%r11), %r9d;\ | ||
212 | xor %r9d, c ## D;\ | ||
213 | add k+4+round(%r11),%r8d;\ | ||
214 | xor %r8d, d ## D;\ | ||
215 | ror $1, d ## D; | ||
216 | |||
217 | .align 8 | ||
218 | .global twofish_enc_blk | ||
219 | .global twofish_dec_blk | ||
220 | |||
221 | twofish_enc_blk: | ||
222 | pushq R1 | ||
223 | |||
224 | /* %rdi contains the crypto tfm adress */ | ||
225 | /* %rsi contains the output adress */ | ||
226 | /* %rdx contains the input adress */ | ||
227 | add $crypto_tfm_ctx_offset, %rdi /* set ctx adress */ | ||
228 | /* ctx adress is moved to free one non-rex register | ||
229 | as target for the 8bit high operations */ | ||
230 | mov %rdi, %r11 | ||
231 | |||
232 | movq (R3), R1 | ||
233 | movq 8(R3), R3 | ||
234 | input_whitening(R1,%r11,a_offset) | ||
235 | input_whitening(R3,%r11,c_offset) | ||
236 | mov R1D, R0D | ||
237 | rol $16, R0D | ||
238 | shr $32, R1 | ||
239 | mov R3D, R2D | ||
240 | shr $32, R3 | ||
241 | rol $1, R3D | ||
242 | |||
243 | encrypt_round(R0,R1,R2,R3,0); | ||
244 | encrypt_round(R2,R3,R0,R1,8); | ||
245 | encrypt_round(R0,R1,R2,R3,2*8); | ||
246 | encrypt_round(R2,R3,R0,R1,3*8); | ||
247 | encrypt_round(R0,R1,R2,R3,4*8); | ||
248 | encrypt_round(R2,R3,R0,R1,5*8); | ||
249 | encrypt_round(R0,R1,R2,R3,6*8); | ||
250 | encrypt_round(R2,R3,R0,R1,7*8); | ||
251 | encrypt_round(R0,R1,R2,R3,8*8); | ||
252 | encrypt_round(R2,R3,R0,R1,9*8); | ||
253 | encrypt_round(R0,R1,R2,R3,10*8); | ||
254 | encrypt_round(R2,R3,R0,R1,11*8); | ||
255 | encrypt_round(R0,R1,R2,R3,12*8); | ||
256 | encrypt_round(R2,R3,R0,R1,13*8); | ||
257 | encrypt_round(R0,R1,R2,R3,14*8); | ||
258 | encrypt_last_round(R2,R3,R0,R1,15*8); | ||
259 | |||
260 | |||
261 | output_whitening(%r10,%r11,a_offset) | ||
262 | movq %r10, (%rsi) | ||
263 | |||
264 | shl $32, R1 | ||
265 | xor R0, R1 | ||
266 | |||
267 | output_whitening(R1,%r11,c_offset) | ||
268 | movq R1, 8(%rsi) | ||
269 | |||
270 | popq R1 | ||
271 | movq $1,%rax | ||
272 | ret | ||
273 | |||
274 | twofish_dec_blk: | ||
275 | pushq R1 | ||
276 | |||
277 | /* %rdi contains the crypto tfm adress */ | ||
278 | /* %rsi contains the output adress */ | ||
279 | /* %rdx contains the input adress */ | ||
280 | add $crypto_tfm_ctx_offset, %rdi /* set ctx adress */ | ||
281 | /* ctx adress is moved to free one non-rex register | ||
282 | as target for the 8bit high operations */ | ||
283 | mov %rdi, %r11 | ||
284 | |||
285 | movq (R3), R1 | ||
286 | movq 8(R3), R3 | ||
287 | output_whitening(R1,%r11,a_offset) | ||
288 | output_whitening(R3,%r11,c_offset) | ||
289 | mov R1D, R0D | ||
290 | shr $32, R1 | ||
291 | rol $16, R1D | ||
292 | mov R3D, R2D | ||
293 | shr $32, R3 | ||
294 | rol $1, R2D | ||
295 | |||
296 | decrypt_round(R0,R1,R2,R3,15*8); | ||
297 | decrypt_round(R2,R3,R0,R1,14*8); | ||
298 | decrypt_round(R0,R1,R2,R3,13*8); | ||
299 | decrypt_round(R2,R3,R0,R1,12*8); | ||
300 | decrypt_round(R0,R1,R2,R3,11*8); | ||
301 | decrypt_round(R2,R3,R0,R1,10*8); | ||
302 | decrypt_round(R0,R1,R2,R3,9*8); | ||
303 | decrypt_round(R2,R3,R0,R1,8*8); | ||
304 | decrypt_round(R0,R1,R2,R3,7*8); | ||
305 | decrypt_round(R2,R3,R0,R1,6*8); | ||
306 | decrypt_round(R0,R1,R2,R3,5*8); | ||
307 | decrypt_round(R2,R3,R0,R1,4*8); | ||
308 | decrypt_round(R0,R1,R2,R3,3*8); | ||
309 | decrypt_round(R2,R3,R0,R1,2*8); | ||
310 | decrypt_round(R0,R1,R2,R3,1*8); | ||
311 | decrypt_last_round(R2,R3,R0,R1,0); | ||
312 | |||
313 | input_whitening(%r10,%r11,a_offset) | ||
314 | movq %r10, (%rsi) | ||
315 | |||
316 | shl $32, R1 | ||
317 | xor R0, R1 | ||
318 | |||
319 | input_whitening(R1,%r11,c_offset) | ||
320 | movq R1, 8(%rsi) | ||
321 | |||
322 | popq R1 | ||
323 | movq $1,%rax | ||
324 | ret | ||
diff --git a/arch/x86_64/crypto/twofish.c b/arch/x86_64/crypto/twofish.c new file mode 100644 index 000000000000..182d91d5cfb9 --- /dev/null +++ b/arch/x86_64/crypto/twofish.c | |||
@@ -0,0 +1,97 @@ | |||
1 | /* | ||
2 | * Glue Code for optimized x86_64 assembler version of TWOFISH | ||
3 | * | ||
4 | * Originally Twofish for GPG | ||
5 | * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998 | ||
6 | * 256-bit key length added March 20, 1999 | ||
7 | * Some modifications to reduce the text size by Werner Koch, April, 1998 | ||
8 | * Ported to the kerneli patch by Marc Mutz <Marc@Mutz.com> | ||
9 | * Ported to CryptoAPI by Colin Slater <hoho@tacomeat.net> | ||
10 | * | ||
11 | * The original author has disclaimed all copyright interest in this | ||
12 | * code and thus put it in the public domain. The subsequent authors | ||
13 | * have put this under the GNU General Public License. | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, write to the Free Software | ||
27 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 | ||
28 | * USA | ||
29 | * | ||
30 | * This code is a "clean room" implementation, written from the paper | ||
31 | * _Twofish: A 128-Bit Block Cipher_ by Bruce Schneier, John Kelsey, | ||
32 | * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson, available | ||
33 | * through http://www.counterpane.com/twofish.html | ||
34 | * | ||
35 | * For background information on multiplication in finite fields, used for | ||
36 | * the matrix operations in the key schedule, see the book _Contemporary | ||
37 | * Abstract Algebra_ by Joseph A. Gallian, especially chapter 22 in the | ||
38 | * Third Edition. | ||
39 | */ | ||
40 | |||
41 | #include <crypto/twofish.h> | ||
42 | #include <linux/crypto.h> | ||
43 | #include <linux/init.h> | ||
44 | #include <linux/kernel.h> | ||
45 | #include <linux/module.h> | ||
46 | #include <linux/types.h> | ||
47 | |||
48 | asmlinkage void twofish_enc_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
49 | asmlinkage void twofish_dec_blk(struct crypto_tfm *tfm, u8 *dst, const u8 *src); | ||
50 | |||
51 | static void twofish_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
52 | { | ||
53 | twofish_enc_blk(tfm, dst, src); | ||
54 | } | ||
55 | |||
56 | static void twofish_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) | ||
57 | { | ||
58 | twofish_dec_blk(tfm, dst, src); | ||
59 | } | ||
60 | |||
61 | static struct crypto_alg alg = { | ||
62 | .cra_name = "twofish", | ||
63 | .cra_driver_name = "twofish-x86_64", | ||
64 | .cra_priority = 200, | ||
65 | .cra_flags = CRYPTO_ALG_TYPE_CIPHER, | ||
66 | .cra_blocksize = TF_BLOCK_SIZE, | ||
67 | .cra_ctxsize = sizeof(struct twofish_ctx), | ||
68 | .cra_alignmask = 3, | ||
69 | .cra_module = THIS_MODULE, | ||
70 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | ||
71 | .cra_u = { | ||
72 | .cipher = { | ||
73 | .cia_min_keysize = TF_MIN_KEY_SIZE, | ||
74 | .cia_max_keysize = TF_MAX_KEY_SIZE, | ||
75 | .cia_setkey = twofish_setkey, | ||
76 | .cia_encrypt = twofish_encrypt, | ||
77 | .cia_decrypt = twofish_decrypt | ||
78 | } | ||
79 | } | ||
80 | }; | ||
81 | |||
82 | static int __init init(void) | ||
83 | { | ||
84 | return crypto_register_alg(&alg); | ||
85 | } | ||
86 | |||
87 | static void __exit fini(void) | ||
88 | { | ||
89 | crypto_unregister_alg(&alg); | ||
90 | } | ||
91 | |||
92 | module_init(init); | ||
93 | module_exit(fini); | ||
94 | |||
95 | MODULE_LICENSE("GPL"); | ||
96 | MODULE_DESCRIPTION ("Twofish Cipher Algorithm, x86_64 asm optimized"); | ||
97 | MODULE_ALIAS("twofish"); | ||
diff --git a/arch/x86_64/kernel/e820.c b/arch/x86_64/kernel/e820.c index 764bf23c7103..d6d7f731f6f0 100644 --- a/arch/x86_64/kernel/e820.c +++ b/arch/x86_64/kernel/e820.c | |||
@@ -108,6 +108,35 @@ e820_any_mapped(unsigned long start, unsigned long end, unsigned type) | |||
108 | return 0; | 108 | return 0; |
109 | } | 109 | } |
110 | 110 | ||
111 | /* | ||
112 | * This function checks if the entire range <start,end> is mapped with type. | ||
113 | * | ||
114 | * Note: this function only works correct if the e820 table is sorted and | ||
115 | * not-overlapping, which is the case | ||
116 | */ | ||
117 | int __init e820_all_mapped(unsigned long start, unsigned long end, unsigned type) | ||
118 | { | ||
119 | int i; | ||
120 | for (i = 0; i < e820.nr_map; i++) { | ||
121 | struct e820entry *ei = &e820.map[i]; | ||
122 | if (type && ei->type != type) | ||
123 | continue; | ||
124 | /* is the region (part) in overlap with the current region ?*/ | ||
125 | if (ei->addr >= end || ei->addr + ei->size <= start) | ||
126 | continue; | ||
127 | |||
128 | /* if the region is at the beginning of <start,end> we move | ||
129 | * start to the end of the region since it's ok until there | ||
130 | */ | ||
131 | if (ei->addr <= start) | ||
132 | start = ei->addr + ei->size; | ||
133 | /* if start is now at or beyond end, we're done, full coverage */ | ||
134 | if (start >= end) | ||
135 | return 1; /* we're done */ | ||
136 | } | ||
137 | return 0; | ||
138 | } | ||
139 | |||
111 | /* | 140 | /* |
112 | * Find a free area in a specific range. | 141 | * Find a free area in a specific range. |
113 | */ | 142 | */ |
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c index 2d48a7941d48..3c55c76c6fd5 100644 --- a/arch/x86_64/pci/mmconfig.c +++ b/arch/x86_64/pci/mmconfig.c | |||
@@ -9,7 +9,6 @@ | |||
9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
10 | #include <linux/acpi.h> | 10 | #include <linux/acpi.h> |
11 | #include <linux/bitmap.h> | 11 | #include <linux/bitmap.h> |
12 | #include <linux/dmi.h> | ||
13 | #include <asm/e820.h> | 12 | #include <asm/e820.h> |
14 | 13 | ||
15 | #include "pci.h" | 14 | #include "pci.h" |
@@ -165,33 +164,11 @@ static __init void unreachable_devices(void) | |||
165 | } | 164 | } |
166 | } | 165 | } |
167 | 166 | ||
168 | static int disable_mcfg(struct dmi_system_id *d) | ||
169 | { | ||
170 | printk("PCI: %s detected. Disabling MCFG.\n", d->ident); | ||
171 | pci_probe &= ~PCI_PROBE_MMCONF; | ||
172 | return 0; | ||
173 | } | ||
174 | |||
175 | static struct dmi_system_id __initdata dmi_bad_mcfg[] = { | ||
176 | /* Has broken MCFG table that makes the system hang when used */ | ||
177 | { | ||
178 | .callback = disable_mcfg, | ||
179 | .ident = "Intel D3C5105 SDV", | ||
180 | .matches = { | ||
181 | DMI_MATCH(DMI_BIOS_VENDOR, "Intel"), | ||
182 | DMI_MATCH(DMI_BOARD_NAME, "D26928"), | ||
183 | }, | ||
184 | }, | ||
185 | {} | ||
186 | }; | ||
187 | |||
188 | void __init pci_mmcfg_init(void) | 167 | void __init pci_mmcfg_init(void) |
189 | { | 168 | { |
190 | int i; | 169 | int i; |
191 | 170 | ||
192 | dmi_check_system(dmi_bad_mcfg); | 171 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) |
193 | |||
194 | if ((pci_probe & (PCI_PROBE_MMCONF|PCI_PROBE_MMCONF_FORCE)) == 0) | ||
195 | return; | 172 | return; |
196 | 173 | ||
197 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); | 174 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); |
@@ -200,6 +177,15 @@ void __init pci_mmcfg_init(void) | |||
200 | (pci_mmcfg_config[0].base_address == 0)) | 177 | (pci_mmcfg_config[0].base_address == 0)) |
201 | return; | 178 | return; |
202 | 179 | ||
180 | if (!e820_all_mapped(pci_mmcfg_config[0].base_address, | ||
181 | pci_mmcfg_config[0].base_address + MMCONFIG_APER_MIN, | ||
182 | E820_RESERVED)) { | ||
183 | printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %x is not E820-reserved\n", | ||
184 | pci_mmcfg_config[0].base_address); | ||
185 | printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); | ||
186 | return; | ||
187 | } | ||
188 | |||
203 | /* RED-PEN i386 doesn't do _nocache right now */ | 189 | /* RED-PEN i386 doesn't do _nocache right now */ |
204 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); | 190 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); |
205 | if (pci_mmcfg_virt == NULL) { | 191 | if (pci_mmcfg_virt == NULL) { |