diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2005-08-17 00:51:31 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-08-17 00:51:31 -0400 |
commit | a2e30e529a48ef4e106e405f91cf4ae525bb01c4 (patch) | |
tree | 2def96ef17c0672c30f1a10287552978bf1d0b1c /arch/s390 | |
parent | edb3366703224d5d8df573ae698ccd6b488dc743 (diff) | |
parent | 2ad56496627630ebc99f06af5f81ca23e17e014e (diff) |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/appldata/appldata_base.c | 6 | ||||
-rw-r--r-- | arch/s390/defconfig | 253 | ||||
-rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 26 | ||||
-rw-r--r-- | arch/s390/kernel/entry.S | 6 | ||||
-rw-r--r-- | arch/s390/kernel/entry64.S | 6 | ||||
-rw-r--r-- | arch/s390/kernel/head.S | 16 | ||||
-rw-r--r-- | arch/s390/kernel/head64.S | 12 | ||||
-rw-r--r-- | arch/s390/kernel/machine_kexec.c | 7 | ||||
-rw-r--r-- | arch/s390/kernel/relocate_kernel.S | 41 | ||||
-rw-r--r-- | arch/s390/kernel/relocate_kernel64.S | 45 | ||||
-rw-r--r-- | arch/s390/kernel/s390_ext.c | 16 | ||||
-rw-r--r-- | arch/s390/kernel/setup.c | 12 | ||||
-rw-r--r-- | arch/s390/kernel/smp.c | 16 | ||||
-rw-r--r-- | arch/s390/kernel/syscalls.S | 5 | ||||
-rw-r--r-- | arch/s390/kernel/traps.c | 15 | ||||
-rw-r--r-- | arch/s390/lib/Makefile | 4 | ||||
-rw-r--r-- | arch/s390/lib/spinlock.c | 133 |
17 files changed, 465 insertions, 154 deletions
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index c067435bae45..c9f2f60cfa58 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -232,7 +232,11 @@ static int appldata_diag(char record_nr, u16 function, unsigned long buffer, | |||
232 | ry = -1; | 232 | ry = -1; |
233 | asm volatile( | 233 | asm volatile( |
234 | "diag %1,%0,0xDC\n\t" | 234 | "diag %1,%0,0xDC\n\t" |
235 | : "=d" (ry) : "d" (&(appldata_parameter_list)) : "cc"); | 235 | : "=d" (ry) |
236 | : "d" (&appldata_parameter_list), | ||
237 | "m" (appldata_parameter_list), | ||
238 | "m" (appldata_product_id) | ||
239 | : "cc"); | ||
236 | return (int) ry; | 240 | return (int) ry; |
237 | } | 241 | } |
238 | /************************ timer, work, DIAG <END> ****************************/ | 242 | /************************ timer, work, DIAG <END> ****************************/ |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 89850b2c27ea..0865251a3f44 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.12-rc3 | 3 | # Linux kernel version: 2.6.13-rc4 |
4 | # Fri Apr 22 15:30:58 2005 | 4 | # Fri Jul 29 14:49:30 2005 |
5 | # | 5 | # |
6 | CONFIG_MMU=y | 6 | CONFIG_MMU=y |
7 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 7 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
@@ -23,10 +23,11 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 | |||
23 | CONFIG_LOCALVERSION="" | 23 | CONFIG_LOCALVERSION="" |
24 | CONFIG_SWAP=y | 24 | CONFIG_SWAP=y |
25 | CONFIG_SYSVIPC=y | 25 | CONFIG_SYSVIPC=y |
26 | # CONFIG_POSIX_MQUEUE is not set | 26 | CONFIG_POSIX_MQUEUE=y |
27 | # CONFIG_BSD_PROCESS_ACCT is not set | 27 | # CONFIG_BSD_PROCESS_ACCT is not set |
28 | CONFIG_SYSCTL=y | 28 | CONFIG_SYSCTL=y |
29 | # CONFIG_AUDIT is not set | 29 | CONFIG_AUDIT=y |
30 | # CONFIG_AUDITSYSCALL is not set | ||
30 | CONFIG_HOTPLUG=y | 31 | CONFIG_HOTPLUG=y |
31 | CONFIG_KOBJECT_UEVENT=y | 32 | CONFIG_KOBJECT_UEVENT=y |
32 | CONFIG_IKCONFIG=y | 33 | CONFIG_IKCONFIG=y |
@@ -36,6 +37,8 @@ CONFIG_IKCONFIG_PROC=y | |||
36 | CONFIG_KALLSYMS=y | 37 | CONFIG_KALLSYMS=y |
37 | # CONFIG_KALLSYMS_ALL is not set | 38 | # CONFIG_KALLSYMS_ALL is not set |
38 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 39 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
40 | CONFIG_PRINTK=y | ||
41 | CONFIG_BUG=y | ||
39 | CONFIG_BASE_FULL=y | 42 | CONFIG_BASE_FULL=y |
40 | CONFIG_FUTEX=y | 43 | CONFIG_FUTEX=y |
41 | CONFIG_EPOLL=y | 44 | CONFIG_EPOLL=y |
@@ -51,9 +54,10 @@ CONFIG_BASE_SMALL=0 | |||
51 | # Loadable module support | 54 | # Loadable module support |
52 | # | 55 | # |
53 | CONFIG_MODULES=y | 56 | CONFIG_MODULES=y |
54 | # CONFIG_MODULE_UNLOAD is not set | 57 | CONFIG_MODULE_UNLOAD=y |
58 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
55 | CONFIG_OBSOLETE_MODPARM=y | 59 | CONFIG_OBSOLETE_MODPARM=y |
56 | # CONFIG_MODVERSIONS is not set | 60 | CONFIG_MODVERSIONS=y |
57 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 61 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
58 | CONFIG_KMOD=y | 62 | CONFIG_KMOD=y |
59 | CONFIG_STOP_MACHINE=y | 63 | CONFIG_STOP_MACHINE=y |
@@ -81,8 +85,15 @@ CONFIG_MARCH_G5=y | |||
81 | # CONFIG_MARCH_Z990 is not set | 85 | # CONFIG_MARCH_Z990 is not set |
82 | CONFIG_PACK_STACK=y | 86 | CONFIG_PACK_STACK=y |
83 | # CONFIG_SMALL_STACK is not set | 87 | # CONFIG_SMALL_STACK is not set |
84 | # CONFIG_CHECK_STACK is not set | 88 | CONFIG_CHECK_STACK=y |
89 | CONFIG_STACK_GUARD=256 | ||
85 | # CONFIG_WARN_STACK is not set | 90 | # CONFIG_WARN_STACK is not set |
91 | CONFIG_SELECT_MEMORY_MODEL=y | ||
92 | CONFIG_FLATMEM_MANUAL=y | ||
93 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
94 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
95 | CONFIG_FLATMEM=y | ||
96 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
86 | 97 | ||
87 | # | 98 | # |
88 | # I/O subsystem configuration | 99 | # I/O subsystem configuration |
@@ -95,7 +106,7 @@ CONFIG_QDIO=y | |||
95 | # | 106 | # |
96 | # Misc | 107 | # Misc |
97 | # | 108 | # |
98 | # CONFIG_PREEMPT is not set | 109 | CONFIG_PREEMPT=y |
99 | CONFIG_IPL=y | 110 | CONFIG_IPL=y |
100 | # CONFIG_IPL_TAPE is not set | 111 | # CONFIG_IPL_TAPE is not set |
101 | CONFIG_IPL_VM=y | 112 | CONFIG_IPL_VM=y |
@@ -105,9 +116,110 @@ CONFIG_BINFMT_MISC=m | |||
105 | CONFIG_PFAULT=y | 116 | CONFIG_PFAULT=y |
106 | # CONFIG_SHARED_KERNEL is not set | 117 | # CONFIG_SHARED_KERNEL is not set |
107 | # CONFIG_CMM is not set | 118 | # CONFIG_CMM is not set |
108 | # CONFIG_VIRT_TIMER is not set | 119 | CONFIG_VIRT_TIMER=y |
120 | CONFIG_VIRT_CPU_ACCOUNTING=y | ||
121 | # CONFIG_APPLDATA_BASE is not set | ||
109 | CONFIG_NO_IDLE_HZ=y | 122 | CONFIG_NO_IDLE_HZ=y |
110 | CONFIG_NO_IDLE_HZ_INIT=y | 123 | CONFIG_NO_IDLE_HZ_INIT=y |
124 | # CONFIG_KEXEC is not set | ||
125 | |||
126 | # | ||
127 | # Networking | ||
128 | # | ||
129 | CONFIG_NET=y | ||
130 | |||
131 | # | ||
132 | # Networking options | ||
133 | # | ||
134 | CONFIG_PACKET=y | ||
135 | # CONFIG_PACKET_MMAP is not set | ||
136 | CONFIG_UNIX=y | ||
137 | CONFIG_XFRM=y | ||
138 | # CONFIG_XFRM_USER is not set | ||
139 | CONFIG_NET_KEY=y | ||
140 | CONFIG_INET=y | ||
141 | CONFIG_IP_MULTICAST=y | ||
142 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
143 | CONFIG_IP_FIB_HASH=y | ||
144 | # CONFIG_IP_PNP is not set | ||
145 | # CONFIG_NET_IPIP is not set | ||
146 | # CONFIG_NET_IPGRE is not set | ||
147 | # CONFIG_IP_MROUTE is not set | ||
148 | # CONFIG_ARPD is not set | ||
149 | # CONFIG_SYN_COOKIES is not set | ||
150 | # CONFIG_INET_AH is not set | ||
151 | # CONFIG_INET_ESP is not set | ||
152 | # CONFIG_INET_IPCOMP is not set | ||
153 | # CONFIG_INET_TUNNEL is not set | ||
154 | CONFIG_IP_TCPDIAG=y | ||
155 | CONFIG_IP_TCPDIAG_IPV6=y | ||
156 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
157 | CONFIG_TCP_CONG_BIC=y | ||
158 | CONFIG_IPV6=y | ||
159 | # CONFIG_IPV6_PRIVACY is not set | ||
160 | # CONFIG_INET6_AH is not set | ||
161 | # CONFIG_INET6_ESP is not set | ||
162 | # CONFIG_INET6_IPCOMP is not set | ||
163 | # CONFIG_INET6_TUNNEL is not set | ||
164 | # CONFIG_IPV6_TUNNEL is not set | ||
165 | # CONFIG_NETFILTER is not set | ||
166 | |||
167 | # | ||
168 | # SCTP Configuration (EXPERIMENTAL) | ||
169 | # | ||
170 | # CONFIG_IP_SCTP is not set | ||
171 | # CONFIG_ATM is not set | ||
172 | # CONFIG_BRIDGE is not set | ||
173 | # CONFIG_VLAN_8021Q is not set | ||
174 | # CONFIG_DECNET is not set | ||
175 | # CONFIG_LLC2 is not set | ||
176 | # CONFIG_IPX is not set | ||
177 | # CONFIG_ATALK is not set | ||
178 | # CONFIG_X25 is not set | ||
179 | # CONFIG_LAPB is not set | ||
180 | # CONFIG_NET_DIVERT is not set | ||
181 | # CONFIG_ECONET is not set | ||
182 | # CONFIG_WAN_ROUTER is not set | ||
183 | CONFIG_NET_SCHED=y | ||
184 | CONFIG_NET_SCH_CLK_JIFFIES=y | ||
185 | # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set | ||
186 | # CONFIG_NET_SCH_CLK_CPU is not set | ||
187 | CONFIG_NET_SCH_CBQ=m | ||
188 | # CONFIG_NET_SCH_HTB is not set | ||
189 | # CONFIG_NET_SCH_HFSC is not set | ||
190 | CONFIG_NET_SCH_PRIO=m | ||
191 | CONFIG_NET_SCH_RED=m | ||
192 | CONFIG_NET_SCH_SFQ=m | ||
193 | CONFIG_NET_SCH_TEQL=m | ||
194 | CONFIG_NET_SCH_TBF=m | ||
195 | CONFIG_NET_SCH_GRED=m | ||
196 | CONFIG_NET_SCH_DSMARK=m | ||
197 | # CONFIG_NET_SCH_NETEM is not set | ||
198 | # CONFIG_NET_SCH_INGRESS is not set | ||
199 | CONFIG_NET_QOS=y | ||
200 | CONFIG_NET_ESTIMATOR=y | ||
201 | CONFIG_NET_CLS=y | ||
202 | # CONFIG_NET_CLS_BASIC is not set | ||
203 | CONFIG_NET_CLS_TCINDEX=m | ||
204 | CONFIG_NET_CLS_ROUTE4=m | ||
205 | CONFIG_NET_CLS_ROUTE=y | ||
206 | CONFIG_NET_CLS_FW=m | ||
207 | CONFIG_NET_CLS_U32=m | ||
208 | # CONFIG_CLS_U32_PERF is not set | ||
209 | # CONFIG_NET_CLS_IND is not set | ||
210 | CONFIG_NET_CLS_RSVP=m | ||
211 | CONFIG_NET_CLS_RSVP6=m | ||
212 | # CONFIG_NET_EMATCH is not set | ||
213 | # CONFIG_NET_CLS_ACT is not set | ||
214 | CONFIG_NET_CLS_POLICE=y | ||
215 | |||
216 | # | ||
217 | # Network testing | ||
218 | # | ||
219 | # CONFIG_NET_PKTGEN is not set | ||
220 | # CONFIG_HAMRADIO is not set | ||
221 | # CONFIG_IRDA is not set | ||
222 | # CONFIG_BT is not set | ||
111 | # CONFIG_PCMCIA is not set | 223 | # CONFIG_PCMCIA is not set |
112 | 224 | ||
113 | # | 225 | # |
@@ -133,6 +245,7 @@ CONFIG_CHR_DEV_ST=y | |||
133 | CONFIG_BLK_DEV_SR=y | 245 | CONFIG_BLK_DEV_SR=y |
134 | CONFIG_BLK_DEV_SR_VENDOR=y | 246 | CONFIG_BLK_DEV_SR_VENDOR=y |
135 | CONFIG_CHR_DEV_SG=y | 247 | CONFIG_CHR_DEV_SG=y |
248 | # CONFIG_CHR_DEV_SCH is not set | ||
136 | 249 | ||
137 | # | 250 | # |
138 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | 251 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs |
@@ -205,7 +318,13 @@ CONFIG_MD_RAID5=m | |||
205 | # CONFIG_MD_RAID6 is not set | 318 | # CONFIG_MD_RAID6 is not set |
206 | CONFIG_MD_MULTIPATH=m | 319 | CONFIG_MD_MULTIPATH=m |
207 | # CONFIG_MD_FAULTY is not set | 320 | # CONFIG_MD_FAULTY is not set |
208 | # CONFIG_BLK_DEV_DM is not set | 321 | CONFIG_BLK_DEV_DM=y |
322 | CONFIG_DM_CRYPT=y | ||
323 | CONFIG_DM_SNAPSHOT=y | ||
324 | CONFIG_DM_MIRROR=y | ||
325 | CONFIG_DM_ZERO=y | ||
326 | CONFIG_DM_MULTIPATH=y | ||
327 | # CONFIG_DM_MULTIPATH_EMC is not set | ||
209 | 328 | ||
210 | # | 329 | # |
211 | # Character device drivers | 330 | # Character device drivers |
@@ -231,7 +350,8 @@ CONFIG_CCW_CONSOLE=y | |||
231 | CONFIG_SCLP=y | 350 | CONFIG_SCLP=y |
232 | CONFIG_SCLP_TTY=y | 351 | CONFIG_SCLP_TTY=y |
233 | CONFIG_SCLP_CONSOLE=y | 352 | CONFIG_SCLP_CONSOLE=y |
234 | # CONFIG_SCLP_VT220_TTY is not set | 353 | CONFIG_SCLP_VT220_TTY=y |
354 | CONFIG_SCLP_VT220_CONSOLE=y | ||
235 | CONFIG_SCLP_CPI=m | 355 | CONFIG_SCLP_CPI=m |
236 | CONFIG_S390_TAPE=m | 356 | CONFIG_S390_TAPE=m |
237 | 357 | ||
@@ -255,105 +375,8 @@ CONFIG_S390_TAPE_34XX=m | |||
255 | CONFIG_Z90CRYPT=m | 375 | CONFIG_Z90CRYPT=m |
256 | 376 | ||
257 | # | 377 | # |
258 | # Networking support | 378 | # Network device support |
259 | # | ||
260 | CONFIG_NET=y | ||
261 | |||
262 | # | ||
263 | # Networking options | ||
264 | # | ||
265 | CONFIG_PACKET=y | ||
266 | # CONFIG_PACKET_MMAP is not set | ||
267 | CONFIG_UNIX=y | ||
268 | CONFIG_NET_KEY=y | ||
269 | CONFIG_INET=y | ||
270 | CONFIG_IP_MULTICAST=y | ||
271 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
272 | # CONFIG_IP_PNP is not set | ||
273 | # CONFIG_NET_IPIP is not set | ||
274 | # CONFIG_NET_IPGRE is not set | ||
275 | # CONFIG_IP_MROUTE is not set | ||
276 | # CONFIG_ARPD is not set | ||
277 | # CONFIG_SYN_COOKIES is not set | ||
278 | # CONFIG_INET_AH is not set | ||
279 | # CONFIG_INET_ESP is not set | ||
280 | # CONFIG_INET_IPCOMP is not set | ||
281 | # CONFIG_INET_TUNNEL is not set | ||
282 | CONFIG_IP_TCPDIAG=y | ||
283 | CONFIG_IP_TCPDIAG_IPV6=y | ||
284 | CONFIG_IPV6=y | ||
285 | # CONFIG_IPV6_PRIVACY is not set | ||
286 | # CONFIG_INET6_AH is not set | ||
287 | # CONFIG_INET6_ESP is not set | ||
288 | # CONFIG_INET6_IPCOMP is not set | ||
289 | # CONFIG_INET6_TUNNEL is not set | ||
290 | # CONFIG_IPV6_TUNNEL is not set | ||
291 | # CONFIG_NETFILTER is not set | ||
292 | CONFIG_XFRM=y | ||
293 | # CONFIG_XFRM_USER is not set | ||
294 | |||
295 | # | ||
296 | # SCTP Configuration (EXPERIMENTAL) | ||
297 | # | ||
298 | # CONFIG_IP_SCTP is not set | ||
299 | # CONFIG_ATM is not set | ||
300 | # CONFIG_BRIDGE is not set | ||
301 | # CONFIG_VLAN_8021Q is not set | ||
302 | # CONFIG_DECNET is not set | ||
303 | # CONFIG_LLC2 is not set | ||
304 | # CONFIG_IPX is not set | ||
305 | # CONFIG_ATALK is not set | ||
306 | # CONFIG_X25 is not set | ||
307 | # CONFIG_LAPB is not set | ||
308 | # CONFIG_NET_DIVERT is not set | ||
309 | # CONFIG_ECONET is not set | ||
310 | # CONFIG_WAN_ROUTER is not set | ||
311 | |||
312 | # | ||
313 | # QoS and/or fair queueing | ||
314 | # | ||
315 | CONFIG_NET_SCHED=y | ||
316 | CONFIG_NET_SCH_CLK_JIFFIES=y | ||
317 | # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set | ||
318 | # CONFIG_NET_SCH_CLK_CPU is not set | ||
319 | CONFIG_NET_SCH_CBQ=m | ||
320 | # CONFIG_NET_SCH_HTB is not set | ||
321 | # CONFIG_NET_SCH_HFSC is not set | ||
322 | CONFIG_NET_SCH_PRIO=m | ||
323 | CONFIG_NET_SCH_RED=m | ||
324 | CONFIG_NET_SCH_SFQ=m | ||
325 | CONFIG_NET_SCH_TEQL=m | ||
326 | CONFIG_NET_SCH_TBF=m | ||
327 | CONFIG_NET_SCH_GRED=m | ||
328 | CONFIG_NET_SCH_DSMARK=m | ||
329 | # CONFIG_NET_SCH_NETEM is not set | ||
330 | # CONFIG_NET_SCH_INGRESS is not set | ||
331 | CONFIG_NET_QOS=y | ||
332 | CONFIG_NET_ESTIMATOR=y | ||
333 | CONFIG_NET_CLS=y | ||
334 | # CONFIG_NET_CLS_BASIC is not set | ||
335 | CONFIG_NET_CLS_TCINDEX=m | ||
336 | CONFIG_NET_CLS_ROUTE4=m | ||
337 | CONFIG_NET_CLS_ROUTE=y | ||
338 | CONFIG_NET_CLS_FW=m | ||
339 | CONFIG_NET_CLS_U32=m | ||
340 | # CONFIG_CLS_U32_PERF is not set | ||
341 | # CONFIG_NET_CLS_IND is not set | ||
342 | CONFIG_NET_CLS_RSVP=m | ||
343 | CONFIG_NET_CLS_RSVP6=m | ||
344 | # CONFIG_NET_EMATCH is not set | ||
345 | # CONFIG_NET_CLS_ACT is not set | ||
346 | CONFIG_NET_CLS_POLICE=y | ||
347 | |||
348 | # | ||
349 | # Network testing | ||
350 | # | 379 | # |
351 | # CONFIG_NET_PKTGEN is not set | ||
352 | # CONFIG_NETPOLL is not set | ||
353 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
354 | # CONFIG_HAMRADIO is not set | ||
355 | # CONFIG_IRDA is not set | ||
356 | # CONFIG_BT is not set | ||
357 | CONFIG_NETDEVICES=y | 380 | CONFIG_NETDEVICES=y |
358 | CONFIG_DUMMY=m | 381 | CONFIG_DUMMY=m |
359 | CONFIG_BONDING=m | 382 | CONFIG_BONDING=m |
@@ -411,12 +434,15 @@ CONFIG_CCWGROUP=y | |||
411 | # CONFIG_SLIP is not set | 434 | # CONFIG_SLIP is not set |
412 | # CONFIG_SHAPER is not set | 435 | # CONFIG_SHAPER is not set |
413 | # CONFIG_NETCONSOLE is not set | 436 | # CONFIG_NETCONSOLE is not set |
437 | # CONFIG_NETPOLL is not set | ||
438 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
414 | 439 | ||
415 | # | 440 | # |
416 | # File systems | 441 | # File systems |
417 | # | 442 | # |
418 | CONFIG_EXT2_FS=y | 443 | CONFIG_EXT2_FS=y |
419 | # CONFIG_EXT2_FS_XATTR is not set | 444 | # CONFIG_EXT2_FS_XATTR is not set |
445 | # CONFIG_EXT2_FS_XIP is not set | ||
420 | CONFIG_EXT3_FS=y | 446 | CONFIG_EXT3_FS=y |
421 | CONFIG_EXT3_FS_XATTR=y | 447 | CONFIG_EXT3_FS_XATTR=y |
422 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 448 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
@@ -426,6 +452,7 @@ CONFIG_JBD=y | |||
426 | CONFIG_FS_MBCACHE=y | 452 | CONFIG_FS_MBCACHE=y |
427 | # CONFIG_REISERFS_FS is not set | 453 | # CONFIG_REISERFS_FS is not set |
428 | # CONFIG_JFS_FS is not set | 454 | # CONFIG_JFS_FS is not set |
455 | # CONFIG_FS_POSIX_ACL is not set | ||
429 | 456 | ||
430 | # | 457 | # |
431 | # XFS support | 458 | # XFS support |
@@ -433,6 +460,7 @@ CONFIG_FS_MBCACHE=y | |||
433 | # CONFIG_XFS_FS is not set | 460 | # CONFIG_XFS_FS is not set |
434 | # CONFIG_MINIX_FS is not set | 461 | # CONFIG_MINIX_FS is not set |
435 | # CONFIG_ROMFS_FS is not set | 462 | # CONFIG_ROMFS_FS is not set |
463 | CONFIG_INOTIFY=y | ||
436 | # CONFIG_QUOTA is not set | 464 | # CONFIG_QUOTA is not set |
437 | CONFIG_DNOTIFY=y | 465 | CONFIG_DNOTIFY=y |
438 | # CONFIG_AUTOFS_FS is not set | 466 | # CONFIG_AUTOFS_FS is not set |
@@ -457,7 +485,6 @@ CONFIG_DNOTIFY=y | |||
457 | CONFIG_PROC_FS=y | 485 | CONFIG_PROC_FS=y |
458 | CONFIG_PROC_KCORE=y | 486 | CONFIG_PROC_KCORE=y |
459 | CONFIG_SYSFS=y | 487 | CONFIG_SYSFS=y |
460 | # CONFIG_DEVFS_FS is not set | ||
461 | # CONFIG_DEVPTS_FS_XATTR is not set | 488 | # CONFIG_DEVPTS_FS_XATTR is not set |
462 | CONFIG_TMPFS=y | 489 | CONFIG_TMPFS=y |
463 | # CONFIG_TMPFS_XATTR is not set | 490 | # CONFIG_TMPFS_XATTR is not set |
@@ -486,15 +513,18 @@ CONFIG_RAMFS=y | |||
486 | # | 513 | # |
487 | CONFIG_NFS_FS=y | 514 | CONFIG_NFS_FS=y |
488 | CONFIG_NFS_V3=y | 515 | CONFIG_NFS_V3=y |
516 | # CONFIG_NFS_V3_ACL is not set | ||
489 | # CONFIG_NFS_V4 is not set | 517 | # CONFIG_NFS_V4 is not set |
490 | # CONFIG_NFS_DIRECTIO is not set | 518 | # CONFIG_NFS_DIRECTIO is not set |
491 | CONFIG_NFSD=y | 519 | CONFIG_NFSD=y |
492 | CONFIG_NFSD_V3=y | 520 | CONFIG_NFSD_V3=y |
521 | # CONFIG_NFSD_V3_ACL is not set | ||
493 | # CONFIG_NFSD_V4 is not set | 522 | # CONFIG_NFSD_V4 is not set |
494 | CONFIG_NFSD_TCP=y | 523 | CONFIG_NFSD_TCP=y |
495 | CONFIG_LOCKD=y | 524 | CONFIG_LOCKD=y |
496 | CONFIG_LOCKD_V4=y | 525 | CONFIG_LOCKD_V4=y |
497 | CONFIG_EXPORTFS=y | 526 | CONFIG_EXPORTFS=y |
527 | CONFIG_NFS_COMMON=y | ||
498 | CONFIG_SUNRPC=y | 528 | CONFIG_SUNRPC=y |
499 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 529 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
500 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 530 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
@@ -544,11 +574,12 @@ CONFIG_MAGIC_SYSRQ=y | |||
544 | CONFIG_LOG_BUF_SHIFT=17 | 574 | CONFIG_LOG_BUF_SHIFT=17 |
545 | # CONFIG_SCHEDSTATS is not set | 575 | # CONFIG_SCHEDSTATS is not set |
546 | # CONFIG_DEBUG_SLAB is not set | 576 | # CONFIG_DEBUG_SLAB is not set |
577 | CONFIG_DEBUG_PREEMPT=y | ||
547 | # CONFIG_DEBUG_SPINLOCK is not set | 578 | # CONFIG_DEBUG_SPINLOCK is not set |
548 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 579 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
549 | # CONFIG_DEBUG_KOBJECT is not set | 580 | # CONFIG_DEBUG_KOBJECT is not set |
550 | # CONFIG_DEBUG_INFO is not set | 581 | # CONFIG_DEBUG_INFO is not set |
551 | # CONFIG_DEBUG_FS is not set | 582 | CONFIG_DEBUG_FS=y |
552 | 583 | ||
553 | # | 584 | # |
554 | # Security options | 585 | # Security options |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 799a98eac92d..23fe94e58688 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -1449,3 +1449,29 @@ compat_sys_kexec_load_wrapper: | |||
1449 | llgtr %r4,%r4 # struct kexec_segment * | 1449 | llgtr %r4,%r4 # struct kexec_segment * |
1450 | llgfr %r5,%r5 # unsigned long | 1450 | llgfr %r5,%r5 # unsigned long |
1451 | jg compat_sys_kexec_load | 1451 | jg compat_sys_kexec_load |
1452 | |||
1453 | .globl sys_ioprio_set_wrapper | ||
1454 | sys_ioprio_set_wrapper: | ||
1455 | lgfr %r2,%r2 # int | ||
1456 | lgfr %r3,%r3 # int | ||
1457 | lgfr %r4,%r4 # int | ||
1458 | jg sys_ioprio_set | ||
1459 | |||
1460 | .globl sys_ioprio_get_wrapper | ||
1461 | sys_ioprio_get_wrapper: | ||
1462 | lgfr %r2,%r2 # int | ||
1463 | lgfr %r3,%r3 # int | ||
1464 | jg sys_ioprio_get | ||
1465 | |||
1466 | .globl sys_inotify_add_watch_wrapper | ||
1467 | sys_inotify_add_watch_wrapper: | ||
1468 | lgfr %r2,%r2 # int | ||
1469 | llgtr %r3,%r3 # const char * | ||
1470 | llgfr %r4,%r4 # u32 | ||
1471 | jg sys_inotify_add_watch | ||
1472 | |||
1473 | .globl sys_inotify_rm_watch_wrapper | ||
1474 | sys_inotify_rm_watch_wrapper: | ||
1475 | lgfr %r2,%r2 # int | ||
1476 | llgfr %r3,%r3 # u32 | ||
1477 | jg sys_inotify_rm_watch | ||
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 5b262b5d869f..1a271b16cb5c 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -690,9 +690,9 @@ mcck_int_handler: | |||
690 | bo BASED(0f) | 690 | bo BASED(0f) |
691 | spt __LC_LAST_UPDATE_TIMER # revalidate cpu timer | 691 | spt __LC_LAST_UPDATE_TIMER # revalidate cpu timer |
692 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 692 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
693 | mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER | 693 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER |
694 | mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER | 694 | mvc __LC_SYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER |
695 | mvc __LC_LAST_UPDATE_TIMER(8),__LC_EXIT_TIMER | 695 | mvc __LC_EXIT_TIMER(8),__LC_LAST_UPDATE_TIMER |
696 | 0: tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? | 696 | 0: tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? |
697 | bno BASED(mcck_no_vtime) # no -> skip cleanup critical | 697 | bno BASED(mcck_no_vtime) # no -> skip cleanup critical |
698 | tm __LC_MCK_OLD_PSW+1,0x01 # interrupting from user ? | 698 | tm __LC_MCK_OLD_PSW+1,0x01 # interrupting from user ? |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 57ca75d0ad7f..d9f22915008c 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -727,9 +727,9 @@ mcck_int_handler: | |||
727 | jo 0f | 727 | jo 0f |
728 | spt __LC_LAST_UPDATE_TIMER | 728 | spt __LC_LAST_UPDATE_TIMER |
729 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 729 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING |
730 | mvc __LC_LAST_UPDATE_TIMER(8),__LC_ASYNC_ENTER_TIMER | 730 | mvc __LC_ASYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER |
731 | mvc __LC_LAST_UPDATE_TIMER(8),__LC_SYNC_ENTER_TIMER | 731 | mvc __LC_SYNC_ENTER_TIMER(8),__LC_LAST_UPDATE_TIMER |
732 | mvc __LC_LAST_UPDATE_TIMER(8),__LC_EXIT_TIMER | 732 | mvc __LC_EXIT_TIMER(8),__LC_LAST_UPDATE_TIMER |
733 | 0: tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? | 733 | 0: tm __LC_MCCK_CODE+2,0x08 # mwp of old psw valid? |
734 | jno mcck_no_vtime # no -> no timer update | 734 | jno mcck_no_vtime # no -> no timer update |
735 | tm __LC_MCK_OLD_PSW+1,0x01 # interrupting from user ? | 735 | tm __LC_MCK_OLD_PSW+1,0x01 # interrupting from user ? |
diff --git a/arch/s390/kernel/head.S b/arch/s390/kernel/head.S index fc8bf5e285f6..2710e66fefba 100644 --- a/arch/s390/kernel/head.S +++ b/arch/s390/kernel/head.S | |||
@@ -346,6 +346,13 @@ iplstart: | |||
346 | la %r2,.Lreset | 346 | la %r2,.Lreset |
347 | lhi %r3,26 | 347 | lhi %r3,26 |
348 | diag %r2,%r3,8 | 348 | diag %r2,%r3,8 |
349 | la %r5,.Lirb | ||
350 | stsch 0(%r5) # check if irq is pending | ||
351 | tm 30(%r5),0x0f # by verifying if any of the | ||
352 | bnz .Lwaitforirq # activity or status control | ||
353 | tm 31(%r5),0xff # bits is set in the schib | ||
354 | bz .Lnoreset | ||
355 | .Lwaitforirq: | ||
349 | mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw | 356 | mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw |
350 | .Lwaitrdrirq: | 357 | .Lwaitrdrirq: |
351 | lpsw .Lrdrwaitpsw | 358 | lpsw .Lrdrwaitpsw |
@@ -535,8 +542,13 @@ startup:basr %r13,0 # get base | |||
535 | lhi %r1,0 | 542 | lhi %r1,0 |
536 | icm %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0 | 543 | icm %r1,3,.Lscpincr1-PARMAREA(%r4) # use this one if != 0 |
537 | jnz .Lscnd | 544 | jnz .Lscnd |
538 | l %r1,.Lscpincr2-PARMAREA+4(%r4) # otherwise use this one | 545 | lhi %r1,0x800 # otherwise report 2GB |
539 | .Lscnd: | 546 | .Lscnd: |
547 | lhi %r3,0x800 # limit reported memory size to 2GB | ||
548 | cr %r1,%r3 | ||
549 | jl .Lno2gb | ||
550 | lr %r1,%r3 | ||
551 | .Lno2gb: | ||
540 | xr %r3,%r3 # same logic | 552 | xr %r3,%r3 # same logic |
541 | ic %r3,.Lscpa1-PARMAREA(%r4) | 553 | ic %r3,.Lscpa1-PARMAREA(%r4) |
542 | chi %r3,0x00 | 554 | chi %r3,0x00 |
@@ -765,7 +777,7 @@ _stext: basr %r13,0 # get base | |||
765 | 777 | ||
766 | # check control registers | 778 | # check control registers |
767 | stctl %c0,%c15,0(%r15) | 779 | stctl %c0,%c15,0(%r15) |
768 | oi 2(%r15),0x20 # enable sigp external interrupts | 780 | oi 2(%r15),0x40 # enable sigp emergency signal |
769 | oi 0(%r15),0x10 # switch on low address protection | 781 | oi 0(%r15),0x10 # switch on low address protection |
770 | lctl %c0,%c15,0(%r15) | 782 | lctl %c0,%c15,0(%r15) |
771 | 783 | ||
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index f525c0c21250..9a8263a153cb 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
@@ -345,6 +345,13 @@ iplstart: | |||
345 | la %r2,.Lreset | 345 | la %r2,.Lreset |
346 | lhi %r3,26 | 346 | lhi %r3,26 |
347 | diag %r2,%r3,8 | 347 | diag %r2,%r3,8 |
348 | la %r5,.Lirb | ||
349 | stsch 0(%r5) # check if irq is pending | ||
350 | tm 30(%r5),0x0f # by verifying if any of the | ||
351 | bnz .Lwaitforirq # activity or status control | ||
352 | tm 31(%r5),0xff # bits is set in the schib | ||
353 | bz .Lnoreset | ||
354 | .Lwaitforirq: | ||
348 | mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw | 355 | mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw |
349 | .Lwaitrdrirq: | 356 | .Lwaitrdrirq: |
350 | lpsw .Lrdrwaitpsw | 357 | lpsw .Lrdrwaitpsw |
@@ -658,10 +665,8 @@ startup:basr %r13,0 # get base | |||
658 | # | 665 | # |
659 | la %r1,0f-.LPG1(%r13) # set program check address | 666 | la %r1,0f-.LPG1(%r13) # set program check address |
660 | stg %r1,__LC_PGM_NEW_PSW+8 | 667 | stg %r1,__LC_PGM_NEW_PSW+8 |
661 | mvc __LC_DIAG44_OPCODE(8),.Lnop-.LPG1(%r13) | ||
662 | diag 0,0,0x44 # test diag 0x44 | 668 | diag 0,0,0x44 # test diag 0x44 |
663 | oi 7(%r12),32 # set diag44 flag | 669 | oi 7(%r12),32 # set diag44 flag |
664 | mvc __LC_DIAG44_OPCODE(8),.Ldiag44-.LPG1(%r13) | ||
665 | 0: | 670 | 0: |
666 | 671 | ||
667 | # | 672 | # |
@@ -702,7 +707,6 @@ startup:basr %r13,0 # get base | |||
702 | .L4malign:.quad 0xffffffffffc00000 | 707 | .L4malign:.quad 0xffffffffffc00000 |
703 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 | 708 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 |
704 | .Lnop: .long 0x07000700 | 709 | .Lnop: .long 0x07000700 |
705 | .Ldiag44:.long 0x83000044 | ||
706 | 710 | ||
707 | .org PARMAREA-64 | 711 | .org PARMAREA-64 |
708 | .Lduct: .long 0,0,0,0,0,0,0,0 | 712 | .Lduct: .long 0,0,0,0,0,0,0,0 |
@@ -765,7 +769,7 @@ _stext: basr %r13,0 # get base | |||
765 | 769 | ||
766 | # check control registers | 770 | # check control registers |
767 | stctg %c0,%c15,0(%r15) | 771 | stctg %c0,%c15,0(%r15) |
768 | oi 6(%r15),0x20 # enable sigp external interrupts | 772 | oi 6(%r15),0x40 # enable sigp emergency signal |
769 | oi 4(%r15),0x10 # switch on low address proctection | 773 | oi 4(%r15),0x10 # switch on low address proctection |
770 | lctlg %c0,%c15,0(%r15) | 774 | lctlg %c0,%c15,0(%r15) |
771 | 775 | ||
diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c index 2721c3a32b84..5aa71b05b8ae 100644 --- a/arch/s390/kernel/machine_kexec.c +++ b/arch/s390/kernel/machine_kexec.c | |||
@@ -70,6 +70,8 @@ machine_kexec(struct kimage *image) | |||
70 | for (;;); | 70 | for (;;); |
71 | } | 71 | } |
72 | 72 | ||
73 | extern void pfault_fini(void); | ||
74 | |||
73 | static void | 75 | static void |
74 | kexec_halt_all_cpus(void *kernel_image) | 76 | kexec_halt_all_cpus(void *kernel_image) |
75 | { | 77 | { |
@@ -78,6 +80,11 @@ kexec_halt_all_cpus(void *kernel_image) | |||
78 | struct kimage *image; | 80 | struct kimage *image; |
79 | relocate_kernel_t data_mover; | 81 | relocate_kernel_t data_mover; |
80 | 82 | ||
83 | #ifdef CONFIG_PFAULT | ||
84 | if (MACHINE_IS_VM) | ||
85 | pfault_fini(); | ||
86 | #endif | ||
87 | |||
81 | if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid)) | 88 | if (atomic_compare_and_swap(-1, smp_processor_id(), &cpuid)) |
82 | signal_processor(smp_processor_id(), sigp_stop); | 89 | signal_processor(smp_processor_id(), sigp_stop); |
83 | 90 | ||
diff --git a/arch/s390/kernel/relocate_kernel.S b/arch/s390/kernel/relocate_kernel.S index d5e4a62fbb79..2a25ec7147ff 100644 --- a/arch/s390/kernel/relocate_kernel.S +++ b/arch/s390/kernel/relocate_kernel.S | |||
@@ -4,6 +4,7 @@ | |||
4 | * (C) Copyright IBM Corp. 2005 | 4 | * (C) Copyright IBM Corp. 2005 |
5 | * | 5 | * |
6 | * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com> | 6 | * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com> |
7 | * Heiko Carstens <heiko.carstens@de.ibm.com> | ||
7 | * | 8 | * |
8 | */ | 9 | */ |
9 | 10 | ||
@@ -25,8 +26,31 @@ | |||
25 | relocate_kernel: | 26 | relocate_kernel: |
26 | basr %r13,0 #base address | 27 | basr %r13,0 #base address |
27 | .base: | 28 | .base: |
28 | spx zero64-.base(%r13) #absolute addressing mode | ||
29 | stnsm sys_msk-.base(%r13),0xf8 #disable DAT and IRQ (external) | 29 | stnsm sys_msk-.base(%r13),0xf8 #disable DAT and IRQ (external) |
30 | spx zero64-.base(%r13) #absolute addressing mode | ||
31 | stctl %c0,%c15,ctlregs-.base(%r13) | ||
32 | stm %r0,%r15,gprregs-.base(%r13) | ||
33 | la %r1,load_psw-.base(%r13) | ||
34 | mvc 0(8,%r0),0(%r1) | ||
35 | la %r0,.back-.base(%r13) | ||
36 | st %r0,4(%r0) | ||
37 | oi 4(%r0),0x80 | ||
38 | mvc 0x68(8,%r0),0(%r1) | ||
39 | la %r0,.back_pgm-.base(%r13) | ||
40 | st %r0,0x6c(%r0) | ||
41 | oi 0x6c(%r0),0x80 | ||
42 | lhi %r0,0 | ||
43 | diag %r0,%r0,0x308 | ||
44 | .back: | ||
45 | basr %r13,0 | ||
46 | .back_base: | ||
47 | oi have_diag308-.back_base(%r13),0x01 | ||
48 | lctl %c0,%c15,ctlregs-.back_base(%r13) | ||
49 | lm %r0,%r15,gprregs-.back_base(%r13) | ||
50 | j .start_reloc | ||
51 | .back_pgm: | ||
52 | lm %r0,%r15,gprregs-.base(%r13) | ||
53 | .start_reloc: | ||
30 | lhi %r10,-1 #preparing the mask | 54 | lhi %r10,-1 #preparing the mask |
31 | sll %r10,12 #shift it such that it becomes 0xf000 | 55 | sll %r10,12 #shift it such that it becomes 0xf000 |
32 | .top: | 56 | .top: |
@@ -63,6 +87,10 @@ | |||
63 | o %r3,4(%r4) #or load address into psw | 87 | o %r3,4(%r4) #or load address into psw |
64 | st %r3,4(%r4) | 88 | st %r3,4(%r4) |
65 | mvc 0(8,%r0),0(%r4) #copy psw to absolute address 0 | 89 | mvc 0(8,%r0),0(%r4) #copy psw to absolute address 0 |
90 | tm have_diag308-.base(%r13),0x01 | ||
91 | jno .no_diag308 | ||
92 | diag %r0,%r0,0x308 | ||
93 | .no_diag308: | ||
66 | sr %r1,%r1 #clear %r1 | 94 | sr %r1,%r1 #clear %r1 |
67 | sr %r2,%r2 #clear %r2 | 95 | sr %r2,%r2 #clear %r2 |
68 | sigp %r1,%r2,0x12 #set cpuid to zero | 96 | sigp %r1,%r2,0x12 #set cpuid to zero |
@@ -75,6 +103,17 @@ | |||
75 | .long 0x00080000,0x80000000 | 103 | .long 0x00080000,0x80000000 |
76 | sys_msk: | 104 | sys_msk: |
77 | .quad 0 | 105 | .quad 0 |
106 | ctlregs: | ||
107 | .rept 16 | ||
108 | .long 0 | ||
109 | .endr | ||
110 | gprregs: | ||
111 | .rept 16 | ||
112 | .long 0 | ||
113 | .endr | ||
114 | have_diag308: | ||
115 | .byte 0 | ||
116 | .align 8 | ||
78 | relocate_kernel_end: | 117 | relocate_kernel_end: |
79 | .globl relocate_kernel_len | 118 | .globl relocate_kernel_len |
80 | relocate_kernel_len: | 119 | relocate_kernel_len: |
diff --git a/arch/s390/kernel/relocate_kernel64.S b/arch/s390/kernel/relocate_kernel64.S index 96290cc4eb3c..8cdb86e8911f 100644 --- a/arch/s390/kernel/relocate_kernel64.S +++ b/arch/s390/kernel/relocate_kernel64.S | |||
@@ -4,6 +4,7 @@ | |||
4 | * (C) Copyright IBM Corp. 2005 | 4 | * (C) Copyright IBM Corp. 2005 |
5 | * | 5 | * |
6 | * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com> | 6 | * Author(s): Rolf Adelsberger <adelsberger@de.ibm.com> |
7 | * Heiko Carstens <heiko.carstens@de.ibm.com> | ||
7 | * | 8 | * |
8 | */ | 9 | */ |
9 | 10 | ||
@@ -26,8 +27,34 @@ | |||
26 | relocate_kernel: | 27 | relocate_kernel: |
27 | basr %r13,0 #base address | 28 | basr %r13,0 #base address |
28 | .base: | 29 | .base: |
30 | stnsm sys_msk-.base(%r13),0xf8 #disable DAT and IRQs | ||
29 | spx zero64-.base(%r13) #absolute addressing mode | 31 | spx zero64-.base(%r13) #absolute addressing mode |
30 | stnsm sys_msk-.base(%r13),0xf8 #disable DAT and IRQ (external) | 32 | stctg %c0,%c15,ctlregs-.base(%r13) |
33 | stmg %r0,%r15,gprregs-.base(%r13) | ||
34 | lghi %r0,3 | ||
35 | sllg %r0,%r0,31 | ||
36 | stg %r0,0x1d0(%r0) | ||
37 | la %r0,.back_pgm-.base(%r13) | ||
38 | stg %r0,0x1d8(%r0) | ||
39 | la %r1,load_psw-.base(%r13) | ||
40 | mvc 0(8,%r0),0(%r1) | ||
41 | la %r0,.back-.base(%r13) | ||
42 | st %r0,4(%r0) | ||
43 | oi 4(%r0),0x80 | ||
44 | lghi %r0,0 | ||
45 | diag %r0,%r0,0x308 | ||
46 | .back: | ||
47 | lhi %r1,1 #mode 1 = esame | ||
48 | sigp %r1,%r0,0x12 #switch to esame mode | ||
49 | sam64 #switch to 64 bit addressing mode | ||
50 | basr %r13,0 | ||
51 | .back_base: | ||
52 | oi have_diag308-.back_base(%r13),0x01 | ||
53 | lctlg %c0,%c15,ctlregs-.back_base(%r13) | ||
54 | lmg %r0,%r15,gprregs-.back_base(%r13) | ||
55 | j .top | ||
56 | .back_pgm: | ||
57 | lmg %r0,%r15,gprregs-.base(%r13) | ||
31 | .top: | 58 | .top: |
32 | lghi %r7,4096 #load PAGE_SIZE in r7 | 59 | lghi %r7,4096 #load PAGE_SIZE in r7 |
33 | lghi %r9,4096 #load PAGE_SIZE in r9 | 60 | lghi %r9,4096 #load PAGE_SIZE in r9 |
@@ -62,6 +89,10 @@ | |||
62 | o %r3,4(%r4) #or load address into psw | 89 | o %r3,4(%r4) #or load address into psw |
63 | st %r3,4(%r4) | 90 | st %r3,4(%r4) |
64 | mvc 0(8,%r0),0(%r4) #copy psw to absolute address 0 | 91 | mvc 0(8,%r0),0(%r4) #copy psw to absolute address 0 |
92 | tm have_diag308-.base(%r13),0x01 | ||
93 | jno .no_diag308 | ||
94 | diag %r0,%r0,0x308 | ||
95 | .no_diag308: | ||
65 | sam31 #31 bit mode | 96 | sam31 #31 bit mode |
66 | sr %r1,%r1 #erase register r1 | 97 | sr %r1,%r1 #erase register r1 |
67 | sr %r2,%r2 #erase register r2 | 98 | sr %r2,%r2 #erase register r2 |
@@ -75,8 +106,18 @@ | |||
75 | .long 0x00080000,0x80000000 | 106 | .long 0x00080000,0x80000000 |
76 | sys_msk: | 107 | sys_msk: |
77 | .quad 0 | 108 | .quad 0 |
109 | ctlregs: | ||
110 | .rept 16 | ||
111 | .quad 0 | ||
112 | .endr | ||
113 | gprregs: | ||
114 | .rept 16 | ||
115 | .quad 0 | ||
116 | .endr | ||
117 | have_diag308: | ||
118 | .byte 0 | ||
119 | .align 8 | ||
78 | relocate_kernel_end: | 120 | relocate_kernel_end: |
79 | .globl relocate_kernel_len | 121 | .globl relocate_kernel_len |
80 | relocate_kernel_len: | 122 | relocate_kernel_len: |
81 | .quad relocate_kernel_end - relocate_kernel | 123 | .quad relocate_kernel_end - relocate_kernel |
82 | |||
diff --git a/arch/s390/kernel/s390_ext.c b/arch/s390/kernel/s390_ext.c index 3bdd38ec71da..207bc511a6e3 100644 --- a/arch/s390/kernel/s390_ext.c +++ b/arch/s390/kernel/s390_ext.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
20 | 20 | ||
21 | /* | 21 | /* |
22 | * Simple hash strategy: index = code & 0xff; | ||
23 | * ext_int_hash[index] is the start of the list for all external interrupts | 22 | * ext_int_hash[index] is the start of the list for all external interrupts |
24 | * that hash to this index. With the current set of external interrupts | 23 | * that hash to this index. With the current set of external interrupts |
25 | * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console, 0x4000 | 24 | * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console, 0x4000 |
@@ -27,6 +26,11 @@ | |||
27 | */ | 26 | */ |
28 | ext_int_info_t *ext_int_hash[256] = { 0, }; | 27 | ext_int_info_t *ext_int_hash[256] = { 0, }; |
29 | 28 | ||
29 | static inline int ext_hash(__u16 code) | ||
30 | { | ||
31 | return (code + (code >> 9)) & 0xff; | ||
32 | } | ||
33 | |||
30 | int register_external_interrupt(__u16 code, ext_int_handler_t handler) | 34 | int register_external_interrupt(__u16 code, ext_int_handler_t handler) |
31 | { | 35 | { |
32 | ext_int_info_t *p; | 36 | ext_int_info_t *p; |
@@ -37,7 +41,7 @@ int register_external_interrupt(__u16 code, ext_int_handler_t handler) | |||
37 | return -ENOMEM; | 41 | return -ENOMEM; |
38 | p->code = code; | 42 | p->code = code; |
39 | p->handler = handler; | 43 | p->handler = handler; |
40 | index = code & 0xff; | 44 | index = ext_hash(code); |
41 | p->next = ext_int_hash[index]; | 45 | p->next = ext_int_hash[index]; |
42 | ext_int_hash[index] = p; | 46 | ext_int_hash[index] = p; |
43 | return 0; | 47 | return 0; |
@@ -52,7 +56,7 @@ int register_early_external_interrupt(__u16 code, ext_int_handler_t handler, | |||
52 | return -EINVAL; | 56 | return -EINVAL; |
53 | p->code = code; | 57 | p->code = code; |
54 | p->handler = handler; | 58 | p->handler = handler; |
55 | index = code & 0xff; | 59 | index = ext_hash(code); |
56 | p->next = ext_int_hash[index]; | 60 | p->next = ext_int_hash[index]; |
57 | ext_int_hash[index] = p; | 61 | ext_int_hash[index] = p; |
58 | return 0; | 62 | return 0; |
@@ -63,7 +67,7 @@ int unregister_external_interrupt(__u16 code, ext_int_handler_t handler) | |||
63 | ext_int_info_t *p, *q; | 67 | ext_int_info_t *p, *q; |
64 | int index; | 68 | int index; |
65 | 69 | ||
66 | index = code & 0xff; | 70 | index = ext_hash(code); |
67 | q = NULL; | 71 | q = NULL; |
68 | p = ext_int_hash[index]; | 72 | p = ext_int_hash[index]; |
69 | while (p != NULL) { | 73 | while (p != NULL) { |
@@ -90,7 +94,7 @@ int unregister_early_external_interrupt(__u16 code, ext_int_handler_t handler, | |||
90 | 94 | ||
91 | if (p == NULL || p->code != code || p->handler != handler) | 95 | if (p == NULL || p->code != code || p->handler != handler) |
92 | return -EINVAL; | 96 | return -EINVAL; |
93 | index = code & 0xff; | 97 | index = ext_hash(code); |
94 | q = ext_int_hash[index]; | 98 | q = ext_int_hash[index]; |
95 | if (p != q) { | 99 | if (p != q) { |
96 | while (q != NULL) { | 100 | while (q != NULL) { |
@@ -120,7 +124,7 @@ void do_extint(struct pt_regs *regs, unsigned short code) | |||
120 | */ | 124 | */ |
121 | account_ticks(regs); | 125 | account_ticks(regs); |
122 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; | 126 | kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; |
123 | index = code & 0xff; | 127 | index = ext_hash(code); |
124 | for (p = ext_int_hash[index]; p; p = p->next) { | 128 | for (p = ext_int_hash[index]; p; p = p->next) { |
125 | if (likely(p->code == code)) { | 129 | if (likely(p->code == code)) { |
126 | if (likely(p->handler)) | 130 | if (likely(p->handler)) |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index b6d740ac0e6e..5ba5a5485da9 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -299,24 +299,18 @@ void machine_restart(char *command) | |||
299 | _machine_restart(command); | 299 | _machine_restart(command); |
300 | } | 300 | } |
301 | 301 | ||
302 | EXPORT_SYMBOL(machine_restart); | ||
303 | |||
304 | void machine_halt(void) | 302 | void machine_halt(void) |
305 | { | 303 | { |
306 | console_unblank(); | 304 | console_unblank(); |
307 | _machine_halt(); | 305 | _machine_halt(); |
308 | } | 306 | } |
309 | 307 | ||
310 | EXPORT_SYMBOL(machine_halt); | ||
311 | |||
312 | void machine_power_off(void) | 308 | void machine_power_off(void) |
313 | { | 309 | { |
314 | console_unblank(); | 310 | console_unblank(); |
315 | _machine_power_off(); | 311 | _machine_power_off(); |
316 | } | 312 | } |
317 | 313 | ||
318 | EXPORT_SYMBOL(machine_power_off); | ||
319 | |||
320 | static void __init | 314 | static void __init |
321 | add_memory_hole(unsigned long start, unsigned long end) | 315 | add_memory_hole(unsigned long start, unsigned long end) |
322 | { | 316 | { |
@@ -437,12 +431,6 @@ setup_lowcore(void) | |||
437 | ctl_set_bit(14, 29); | 431 | ctl_set_bit(14, 29); |
438 | } | 432 | } |
439 | #endif | 433 | #endif |
440 | #ifdef CONFIG_ARCH_S390X | ||
441 | if (MACHINE_HAS_DIAG44) | ||
442 | lc->diag44_opcode = 0x83000044; | ||
443 | else | ||
444 | lc->diag44_opcode = 0x07000700; | ||
445 | #endif /* CONFIG_ARCH_S390X */ | ||
446 | set_prefix((u32)(unsigned long) lc); | 434 | set_prefix((u32)(unsigned long) lc); |
447 | } | 435 | } |
448 | 436 | ||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 642572a8e334..85222fee4361 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -375,7 +375,7 @@ static void smp_ext_bitcall(int cpu, ec_bit_sig sig) | |||
375 | * Set signaling bit in lowcore of target cpu and kick it | 375 | * Set signaling bit in lowcore of target cpu and kick it |
376 | */ | 376 | */ |
377 | set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast); | 377 | set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast); |
378 | while(signal_processor(cpu, sigp_external_call) == sigp_busy) | 378 | while(signal_processor(cpu, sigp_emergency_signal) == sigp_busy) |
379 | udelay(10); | 379 | udelay(10); |
380 | } | 380 | } |
381 | 381 | ||
@@ -394,7 +394,7 @@ static void smp_ext_bitcall_others(ec_bit_sig sig) | |||
394 | * Set signaling bit in lowcore of target cpu and kick it | 394 | * Set signaling bit in lowcore of target cpu and kick it |
395 | */ | 395 | */ |
396 | set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast); | 396 | set_bit(sig, (unsigned long *) &lowcore_ptr[cpu]->ext_call_fast); |
397 | while (signal_processor(cpu, sigp_external_call) == sigp_busy) | 397 | while (signal_processor(cpu, sigp_emergency_signal) == sigp_busy) |
398 | udelay(10); | 398 | udelay(10); |
399 | } | 399 | } |
400 | } | 400 | } |
@@ -537,7 +537,8 @@ int __devinit start_secondary(void *cpuvoid) | |||
537 | #endif | 537 | #endif |
538 | #ifdef CONFIG_PFAULT | 538 | #ifdef CONFIG_PFAULT |
539 | /* Enable pfault pseudo page faults on this cpu. */ | 539 | /* Enable pfault pseudo page faults on this cpu. */ |
540 | pfault_init(); | 540 | if (MACHINE_IS_VM) |
541 | pfault_init(); | ||
541 | #endif | 542 | #endif |
542 | /* Mark this cpu as online */ | 543 | /* Mark this cpu as online */ |
543 | cpu_set(smp_processor_id(), cpu_online_map); | 544 | cpu_set(smp_processor_id(), cpu_online_map); |
@@ -690,7 +691,8 @@ __cpu_disable(void) | |||
690 | 691 | ||
691 | #ifdef CONFIG_PFAULT | 692 | #ifdef CONFIG_PFAULT |
692 | /* Disable pfault pseudo page faults on this cpu. */ | 693 | /* Disable pfault pseudo page faults on this cpu. */ |
693 | pfault_fini(); | 694 | if (MACHINE_IS_VM) |
695 | pfault_fini(); | ||
694 | #endif | 696 | #endif |
695 | 697 | ||
696 | /* disable all external interrupts */ | 698 | /* disable all external interrupts */ |
@@ -751,9 +753,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
751 | unsigned int cpu; | 753 | unsigned int cpu; |
752 | int i; | 754 | int i; |
753 | 755 | ||
754 | /* request the 0x1202 external interrupt */ | 756 | /* request the 0x1201 emergency signal external interrupt */ |
755 | if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0) | 757 | if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0) |
756 | panic("Couldn't request external interrupt 0x1202"); | 758 | panic("Couldn't request external interrupt 0x1201"); |
757 | smp_check_cpus(max_cpus); | 759 | smp_check_cpus(max_cpus); |
758 | memset(lowcore_ptr,0,sizeof(lowcore_ptr)); | 760 | memset(lowcore_ptr,0,sizeof(lowcore_ptr)); |
759 | /* | 761 | /* |
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index a8668afb5f87..426d7cafdab3 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
@@ -290,3 +290,8 @@ SYSCALL(sys_add_key,sys_add_key,compat_sys_add_key_wrapper) | |||
290 | SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key_wrapper) | 290 | SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key_wrapper) |
291 | SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl) /* 280 */ | 291 | SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl) /* 280 */ |
292 | SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid_wrapper) | 292 | SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid_wrapper) |
293 | SYSCALL(sys_ioprio_set,sys_ioprio_set,sys_ioprio_set_wrapper) | ||
294 | SYSCALL(sys_ioprio_get,sys_ioprio_get,sys_ioprio_get_wrapper) | ||
295 | SYSCALL(sys_inotify_init,sys_inotify_init,sys_inotify_init) | ||
296 | SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,sys_inotify_add_watch_wrapper) | ||
297 | SYSCALL(sys_inotify_rm_watch,sys_inotify_rm_watch,sys_inotify_rm_watch_wrapper) | ||
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index bc7b7be7acbe..6b8703ec2ae6 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/kallsyms.h> | 31 | #include <linux/kallsyms.h> |
32 | #include <linux/reboot.h> | ||
32 | 33 | ||
33 | #include <asm/system.h> | 34 | #include <asm/system.h> |
34 | #include <asm/uaccess.h> | 35 | #include <asm/uaccess.h> |
@@ -675,6 +676,19 @@ asmlinkage void kernel_stack_overflow(struct pt_regs * regs) | |||
675 | panic("Corrupt kernel stack, can't continue."); | 676 | panic("Corrupt kernel stack, can't continue."); |
676 | } | 677 | } |
677 | 678 | ||
679 | #ifndef CONFIG_ARCH_S390X | ||
680 | static int | ||
681 | pagex_reboot_event(struct notifier_block *this, unsigned long event, void *ptr) | ||
682 | { | ||
683 | if (MACHINE_IS_VM) | ||
684 | cpcmd("SET PAGEX OFF", NULL, 0, NULL); | ||
685 | return NOTIFY_DONE; | ||
686 | } | ||
687 | |||
688 | static struct notifier_block pagex_reboot_notifier = { | ||
689 | .notifier_call = &pagex_reboot_event, | ||
690 | }; | ||
691 | #endif | ||
678 | 692 | ||
679 | /* init is done in lowcore.S and head.S */ | 693 | /* init is done in lowcore.S and head.S */ |
680 | 694 | ||
@@ -735,6 +749,7 @@ void __init trap_init(void) | |||
735 | &ext_int_pfault); | 749 | &ext_int_pfault); |
736 | #endif | 750 | #endif |
737 | #ifndef CONFIG_ARCH_S390X | 751 | #ifndef CONFIG_ARCH_S390X |
752 | register_reboot_notifier(&pagex_reboot_notifier); | ||
738 | cpcmd("SET PAGEX ON", NULL, 0, NULL); | 753 | cpcmd("SET PAGEX ON", NULL, 0, NULL); |
739 | #endif | 754 | #endif |
740 | } | 755 | } |
diff --git a/arch/s390/lib/Makefile b/arch/s390/lib/Makefile index a8758b1d20a9..b701efa1f00e 100644 --- a/arch/s390/lib/Makefile +++ b/arch/s390/lib/Makefile | |||
@@ -5,5 +5,5 @@ | |||
5 | EXTRA_AFLAGS := -traditional | 5 | EXTRA_AFLAGS := -traditional |
6 | 6 | ||
7 | lib-y += delay.o string.o | 7 | lib-y += delay.o string.o |
8 | lib-$(CONFIG_ARCH_S390_31) += uaccess.o | 8 | lib-$(CONFIG_ARCH_S390_31) += uaccess.o spinlock.o |
9 | lib-$(CONFIG_ARCH_S390X) += uaccess64.o | 9 | lib-$(CONFIG_ARCH_S390X) += uaccess64.o spinlock.o |
diff --git a/arch/s390/lib/spinlock.c b/arch/s390/lib/spinlock.c new file mode 100644 index 000000000000..888b5596c195 --- /dev/null +++ b/arch/s390/lib/spinlock.c | |||
@@ -0,0 +1,133 @@ | |||
1 | /* | ||
2 | * arch/s390/lib/spinlock.c | ||
3 | * Out of line spinlock code. | ||
4 | * | ||
5 | * S390 version | ||
6 | * Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
7 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | ||
8 | */ | ||
9 | |||
10 | #include <linux/types.h> | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/spinlock.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <asm/io.h> | ||
15 | |||
16 | atomic_t spin_retry_counter; | ||
17 | int spin_retry = 1000; | ||
18 | |||
19 | /** | ||
20 | * spin_retry= parameter | ||
21 | */ | ||
22 | static int __init spin_retry_setup(char *str) | ||
23 | { | ||
24 | spin_retry = simple_strtoul(str, &str, 0); | ||
25 | return 1; | ||
26 | } | ||
27 | __setup("spin_retry=", spin_retry_setup); | ||
28 | |||
29 | static inline void | ||
30 | _diag44(void) | ||
31 | { | ||
32 | #ifdef __s390x__ | ||
33 | if (MACHINE_HAS_DIAG44) | ||
34 | #endif | ||
35 | asm volatile("diag 0,0,0x44"); | ||
36 | } | ||
37 | |||
38 | void | ||
39 | _raw_spin_lock_wait(spinlock_t *lp, unsigned int pc) | ||
40 | { | ||
41 | int count = spin_retry; | ||
42 | |||
43 | while (1) { | ||
44 | if (count-- <= 0) { | ||
45 | _diag44(); | ||
46 | count = spin_retry; | ||
47 | } | ||
48 | atomic_inc(&spin_retry_counter); | ||
49 | if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0) | ||
50 | return; | ||
51 | } | ||
52 | } | ||
53 | EXPORT_SYMBOL(_raw_spin_lock_wait); | ||
54 | |||
55 | int | ||
56 | _raw_spin_trylock_retry(spinlock_t *lp, unsigned int pc) | ||
57 | { | ||
58 | int count = spin_retry; | ||
59 | |||
60 | while (count-- > 0) { | ||
61 | atomic_inc(&spin_retry_counter); | ||
62 | if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0) | ||
63 | return 1; | ||
64 | } | ||
65 | return 0; | ||
66 | } | ||
67 | EXPORT_SYMBOL(_raw_spin_trylock_retry); | ||
68 | |||
69 | void | ||
70 | _raw_read_lock_wait(rwlock_t *rw) | ||
71 | { | ||
72 | unsigned int old; | ||
73 | int count = spin_retry; | ||
74 | |||
75 | while (1) { | ||
76 | if (count-- <= 0) { | ||
77 | _diag44(); | ||
78 | count = spin_retry; | ||
79 | } | ||
80 | atomic_inc(&spin_retry_counter); | ||
81 | old = rw->lock & 0x7fffffffU; | ||
82 | if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old) | ||
83 | return; | ||
84 | } | ||
85 | } | ||
86 | EXPORT_SYMBOL(_raw_read_lock_wait); | ||
87 | |||
88 | int | ||
89 | _raw_read_trylock_retry(rwlock_t *rw) | ||
90 | { | ||
91 | unsigned int old; | ||
92 | int count = spin_retry; | ||
93 | |||
94 | while (count-- > 0) { | ||
95 | atomic_inc(&spin_retry_counter); | ||
96 | old = rw->lock & 0x7fffffffU; | ||
97 | if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old) | ||
98 | return 1; | ||
99 | } | ||
100 | return 0; | ||
101 | } | ||
102 | EXPORT_SYMBOL(_raw_read_trylock_retry); | ||
103 | |||
104 | void | ||
105 | _raw_write_lock_wait(rwlock_t *rw) | ||
106 | { | ||
107 | int count = spin_retry; | ||
108 | |||
109 | while (1) { | ||
110 | if (count-- <= 0) { | ||
111 | _diag44(); | ||
112 | count = spin_retry; | ||
113 | } | ||
114 | atomic_inc(&spin_retry_counter); | ||
115 | if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0) | ||
116 | return; | ||
117 | } | ||
118 | } | ||
119 | EXPORT_SYMBOL(_raw_write_lock_wait); | ||
120 | |||
121 | int | ||
122 | _raw_write_trylock_retry(rwlock_t *rw) | ||
123 | { | ||
124 | int count = spin_retry; | ||
125 | |||
126 | while (count-- > 0) { | ||
127 | atomic_inc(&spin_retry_counter); | ||
128 | if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0) | ||
129 | return 1; | ||
130 | } | ||
131 | return 0; | ||
132 | } | ||
133 | EXPORT_SYMBOL(_raw_write_trylock_retry); | ||