diff options
author | Tony Luck <tony.luck@intel.com> | 2005-07-08 11:52:42 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-07-08 11:52:42 -0400 |
commit | 88c3cdfdde3cf87e1831265ea4246430bef34fc9 (patch) | |
tree | caea510ffb2f81a5ea13b00ecb8a4146ad462048 /arch | |
parent | 2b2c3750330325ae5071582b5c4dbdf1c8bc1e51 (diff) | |
parent | a92b7b80579fe68fe229892815c750f6652eb6a9 (diff) |
Auto merge with /home/aegl/GIT/linus
Diffstat (limited to 'arch')
81 files changed, 2593 insertions, 1055 deletions
diff --git a/arch/frv/defconfig b/arch/frv/defconfig new file mode 100644 index 000000000000..b6e4ca5efb59 --- /dev/null +++ b/arch/frv/defconfig | |||
@@ -0,0 +1,627 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.11.8 | ||
4 | # Fri May 13 17:16:03 2005 | ||
5 | # | ||
6 | CONFIG_FRV=y | ||
7 | CONFIG_UID16=y | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
9 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
10 | # CONFIG_GENERIC_CALIBRATE_DELAY is not set | ||
11 | # CONFIG_GENERIC_HARDIRQS is not set | ||
12 | |||
13 | # | ||
14 | # Code maturity level options | ||
15 | # | ||
16 | CONFIG_EXPERIMENTAL=y | ||
17 | CONFIG_CLEAN_COMPILE=y | ||
18 | CONFIG_BROKEN_ON_SMP=y | ||
19 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
20 | |||
21 | # | ||
22 | # General setup | ||
23 | # | ||
24 | CONFIG_LOCALVERSION="" | ||
25 | CONFIG_SWAP=y | ||
26 | CONFIG_SYSVIPC=y | ||
27 | CONFIG_POSIX_MQUEUE=y | ||
28 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
29 | CONFIG_SYSCTL=y | ||
30 | # CONFIG_AUDIT is not set | ||
31 | # CONFIG_HOTPLUG is not set | ||
32 | # CONFIG_KOBJECT_UEVENT is not set | ||
33 | # CONFIG_IKCONFIG is not set | ||
34 | CONFIG_EMBEDDED=y | ||
35 | CONFIG_KALLSYMS=y | ||
36 | # CONFIG_KALLSYMS_ALL is not set | ||
37 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
38 | CONFIG_PRINTK=y | ||
39 | CONFIG_BUG=y | ||
40 | CONFIG_BASE_FULL=y | ||
41 | CONFIG_FUTEX=y | ||
42 | CONFIG_EPOLL=y | ||
43 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
44 | CONFIG_SHMEM=y | ||
45 | CONFIG_CC_ALIGN_FUNCTIONS=0 | ||
46 | CONFIG_CC_ALIGN_LABELS=0 | ||
47 | CONFIG_CC_ALIGN_LOOPS=0 | ||
48 | CONFIG_CC_ALIGN_JUMPS=0 | ||
49 | # CONFIG_TINY_SHMEM is not set | ||
50 | CONFIG_BASE_SMALL=0 | ||
51 | |||
52 | # | ||
53 | # Loadable module support | ||
54 | # | ||
55 | # CONFIG_MODULES is not set | ||
56 | |||
57 | # | ||
58 | # Fujitsu FR-V system setup | ||
59 | # | ||
60 | CONFIG_MMU=y | ||
61 | CONFIG_FRV_OUTOFLINE_ATOMIC_OPS=y | ||
62 | CONFIG_HIGHMEM=y | ||
63 | CONFIG_HIGHPTE=y | ||
64 | CONFIG_SELECT_MEMORY_MODEL=y | ||
65 | CONFIG_FLATMEM_MANUAL=y | ||
66 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
67 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
68 | CONFIG_FLATMEM=y | ||
69 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
70 | # CONFIG_FRV_DEFL_CACHE_WBACK is not set | ||
71 | # CONFIG_FRV_DEFL_CACHE_WBEHIND is not set | ||
72 | CONFIG_FRV_DEFL_CACHE_WTHRU=y | ||
73 | # CONFIG_FRV_DEFL_CACHE_DISABLED is not set | ||
74 | |||
75 | # | ||
76 | # CPU core support | ||
77 | # | ||
78 | CONFIG_CPU_FR451=y | ||
79 | CONFIG_CPU_FR451_COMPILE=y | ||
80 | CONFIG_FRV_L1_CACHE_SHIFT=5 | ||
81 | CONFIG_MB93091_VDK=y | ||
82 | # CONFIG_MB93093_PDK is not set | ||
83 | CONFIG_MB93090_MB00=y | ||
84 | # CONFIG_MB93091_NO_MB is not set | ||
85 | # CONFIG_GPREL_DATA_8 is not set | ||
86 | CONFIG_GPREL_DATA_4=y | ||
87 | # CONFIG_GPREL_DATA_NONE is not set | ||
88 | CONFIG_PCI=y | ||
89 | # CONFIG_PCI_LEGACY_PROC is not set | ||
90 | # CONFIG_PCI_NAMES is not set | ||
91 | # CONFIG_PCI_DEBUG is not set | ||
92 | # CONFIG_PCMCIA is not set | ||
93 | |||
94 | # | ||
95 | # Power management options | ||
96 | # | ||
97 | # CONFIG_PM is not set | ||
98 | |||
99 | # | ||
100 | # Executable formats | ||
101 | # | ||
102 | # CONFIG_BINFMT_ELF is not set | ||
103 | CONFIG_BINFMT_ELF_FDPIC=y | ||
104 | # CONFIG_BINFMT_MISC is not set | ||
105 | |||
106 | # | ||
107 | # Device Drivers | ||
108 | # | ||
109 | |||
110 | # | ||
111 | # Generic Driver Options | ||
112 | # | ||
113 | # CONFIG_STANDALONE is not set | ||
114 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | ||
115 | # CONFIG_FW_LOADER is not set | ||
116 | # CONFIG_DEBUG_DRIVER is not set | ||
117 | |||
118 | # | ||
119 | # Connector - unified userspace <-> kernelspace linker | ||
120 | # | ||
121 | # CONFIG_CONNECTOR is not set | ||
122 | # CONFIG_FORK_CONNECTOR is not set | ||
123 | |||
124 | # | ||
125 | # Memory Technology Devices (MTD) | ||
126 | # | ||
127 | # CONFIG_MTD is not set | ||
128 | |||
129 | # | ||
130 | # Parallel port support | ||
131 | # | ||
132 | # CONFIG_PARPORT is not set | ||
133 | |||
134 | # | ||
135 | # Plug and Play support | ||
136 | # | ||
137 | |||
138 | # | ||
139 | # Block devices | ||
140 | # | ||
141 | # CONFIG_BLK_DEV_FD is not set | ||
142 | # CONFIG_BLK_CPQ_DA is not set | ||
143 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
144 | # CONFIG_BLK_DEV_DAC960 is not set | ||
145 | # CONFIG_BLK_DEV_UMEM is not set | ||
146 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
147 | # CONFIG_BLK_DEV_LOOP is not set | ||
148 | # CONFIG_BLK_DEV_NBD is not set | ||
149 | # CONFIG_BLK_DEV_SX8 is not set | ||
150 | # CONFIG_BLK_DEV_RAM is not set | ||
151 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
152 | CONFIG_INITRAMFS_SOURCE="" | ||
153 | # CONFIG_CDROM_PKTCDVD is not set | ||
154 | |||
155 | # | ||
156 | # IO Schedulers | ||
157 | # | ||
158 | CONFIG_IOSCHED_NOOP=y | ||
159 | CONFIG_IOSCHED_AS=y | ||
160 | CONFIG_IOSCHED_DEADLINE=y | ||
161 | CONFIG_IOSCHED_CFQ=y | ||
162 | # CONFIG_ATA_OVER_ETH is not set | ||
163 | |||
164 | # | ||
165 | # ATA/ATAPI/MFM/RLL support | ||
166 | # | ||
167 | # CONFIG_IDE is not set | ||
168 | |||
169 | # | ||
170 | # SCSI device support | ||
171 | # | ||
172 | # CONFIG_SCSI is not set | ||
173 | |||
174 | # | ||
175 | # Multi-device support (RAID and LVM) | ||
176 | # | ||
177 | # CONFIG_MD is not set | ||
178 | |||
179 | # | ||
180 | # Fusion MPT device support | ||
181 | # | ||
182 | # CONFIG_FUSION is not set | ||
183 | |||
184 | # | ||
185 | # IEEE 1394 (FireWire) support | ||
186 | # | ||
187 | # CONFIG_IEEE1394 is not set | ||
188 | |||
189 | # | ||
190 | # I2O device support | ||
191 | # | ||
192 | # CONFIG_I2O is not set | ||
193 | |||
194 | # | ||
195 | # Networking support | ||
196 | # | ||
197 | CONFIG_NET=y | ||
198 | |||
199 | # | ||
200 | # Networking options | ||
201 | # | ||
202 | CONFIG_PACKET=y | ||
203 | # CONFIG_PACKET_MMAP is not set | ||
204 | CONFIG_UNIX=y | ||
205 | # CONFIG_NET_KEY is not set | ||
206 | CONFIG_INET=y | ||
207 | # CONFIG_IP_MULTICAST is not set | ||
208 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
209 | CONFIG_IP_PNP=y | ||
210 | # CONFIG_IP_PNP_DHCP is not set | ||
211 | # CONFIG_IP_PNP_BOOTP is not set | ||
212 | # CONFIG_IP_PNP_RARP is not set | ||
213 | # CONFIG_NET_IPIP is not set | ||
214 | # CONFIG_NET_IPGRE is not set | ||
215 | # CONFIG_ARPD is not set | ||
216 | # CONFIG_SYN_COOKIES is not set | ||
217 | # CONFIG_INET_AH is not set | ||
218 | # CONFIG_INET_ESP is not set | ||
219 | # CONFIG_INET_IPCOMP is not set | ||
220 | # CONFIG_INET_TUNNEL is not set | ||
221 | # CONFIG_IP_TCPDIAG is not set | ||
222 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
223 | # CONFIG_IPV6 is not set | ||
224 | # CONFIG_NETFILTER is not set | ||
225 | |||
226 | # | ||
227 | # SCTP Configuration (EXPERIMENTAL) | ||
228 | # | ||
229 | # CONFIG_IP_SCTP is not set | ||
230 | # CONFIG_ATM is not set | ||
231 | # CONFIG_BRIDGE is not set | ||
232 | # CONFIG_VLAN_8021Q is not set | ||
233 | # CONFIG_DECNET is not set | ||
234 | # CONFIG_LLC2 is not set | ||
235 | # CONFIG_IPX is not set | ||
236 | # CONFIG_ATALK is not set | ||
237 | # CONFIG_X25 is not set | ||
238 | # CONFIG_LAPB is not set | ||
239 | # CONFIG_NET_DIVERT is not set | ||
240 | # CONFIG_ECONET is not set | ||
241 | # CONFIG_WAN_ROUTER is not set | ||
242 | |||
243 | # | ||
244 | # QoS and/or fair queueing | ||
245 | # | ||
246 | # CONFIG_NET_SCHED is not set | ||
247 | # CONFIG_NET_CLS_ROUTE is not set | ||
248 | |||
249 | # | ||
250 | # Network testing | ||
251 | # | ||
252 | # CONFIG_NET_PKTGEN is not set | ||
253 | # CONFIG_KGDBOE is not set | ||
254 | # CONFIG_NETPOLL is not set | ||
255 | # CONFIG_NETPOLL_RX is not set | ||
256 | # CONFIG_NETPOLL_TRAP is not set | ||
257 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
258 | # CONFIG_HAMRADIO is not set | ||
259 | # CONFIG_IRDA is not set | ||
260 | # CONFIG_BT is not set | ||
261 | # CONFIG_IEEE80211 is not set | ||
262 | CONFIG_NETDEVICES=y | ||
263 | # CONFIG_DUMMY is not set | ||
264 | # CONFIG_BONDING is not set | ||
265 | # CONFIG_EQUALIZER is not set | ||
266 | # CONFIG_TUN is not set | ||
267 | |||
268 | # | ||
269 | # ARCnet devices | ||
270 | # | ||
271 | # CONFIG_ARCNET is not set | ||
272 | |||
273 | # | ||
274 | # Ethernet (10 or 100Mbit) | ||
275 | # | ||
276 | CONFIG_NET_ETHERNET=y | ||
277 | CONFIG_MII=y | ||
278 | # CONFIG_HAPPYMEAL is not set | ||
279 | # CONFIG_SUNGEM is not set | ||
280 | # CONFIG_NET_VENDOR_3COM is not set | ||
281 | |||
282 | # | ||
283 | # Tulip family network device support | ||
284 | # | ||
285 | # CONFIG_NET_TULIP is not set | ||
286 | # CONFIG_HP100 is not set | ||
287 | CONFIG_NET_PCI=y | ||
288 | # CONFIG_PCNET32 is not set | ||
289 | # CONFIG_AMD8111_ETH is not set | ||
290 | # CONFIG_ADAPTEC_STARFIRE is not set | ||
291 | # CONFIG_B44 is not set | ||
292 | # CONFIG_FORCEDETH is not set | ||
293 | # CONFIG_DGRS is not set | ||
294 | # CONFIG_EEPRO100 is not set | ||
295 | # CONFIG_E100 is not set | ||
296 | # CONFIG_FEALNX is not set | ||
297 | # CONFIG_NATSEMI is not set | ||
298 | CONFIG_NE2K_PCI=y | ||
299 | # CONFIG_8139CP is not set | ||
300 | # CONFIG_8139TOO is not set | ||
301 | # CONFIG_SIS900 is not set | ||
302 | # CONFIG_EPIC100 is not set | ||
303 | # CONFIG_SUNDANCE is not set | ||
304 | # CONFIG_TLAN is not set | ||
305 | # CONFIG_VIA_RHINE is not set | ||
306 | |||
307 | # | ||
308 | # Ethernet (1000 Mbit) | ||
309 | # | ||
310 | # CONFIG_ACENIC is not set | ||
311 | # CONFIG_DL2K is not set | ||
312 | # CONFIG_E1000 is not set | ||
313 | # CONFIG_NS83820 is not set | ||
314 | # CONFIG_HAMACHI is not set | ||
315 | # CONFIG_YELLOWFIN is not set | ||
316 | # CONFIG_R8169 is not set | ||
317 | # CONFIG_SKGE is not set | ||
318 | # CONFIG_SK98LIN is not set | ||
319 | # CONFIG_VIA_VELOCITY is not set | ||
320 | # CONFIG_TIGON3 is not set | ||
321 | |||
322 | # | ||
323 | # Ethernet (10000 Mbit) | ||
324 | # | ||
325 | # CONFIG_CHELSIO_T1 is not set | ||
326 | # CONFIG_IXGB is not set | ||
327 | # CONFIG_S2IO is not set | ||
328 | |||
329 | # | ||
330 | # Token Ring devices | ||
331 | # | ||
332 | # CONFIG_TR is not set | ||
333 | |||
334 | # | ||
335 | # Wireless LAN (non-hamradio) | ||
336 | # | ||
337 | # CONFIG_NET_RADIO is not set | ||
338 | |||
339 | # | ||
340 | # Wan interfaces | ||
341 | # | ||
342 | # CONFIG_WAN is not set | ||
343 | # CONFIG_FDDI is not set | ||
344 | # CONFIG_HIPPI is not set | ||
345 | # CONFIG_PPP is not set | ||
346 | # CONFIG_SLIP is not set | ||
347 | # CONFIG_SHAPER is not set | ||
348 | # CONFIG_NETCONSOLE is not set | ||
349 | |||
350 | # | ||
351 | # ISDN subsystem | ||
352 | # | ||
353 | # CONFIG_ISDN is not set | ||
354 | |||
355 | # | ||
356 | # Telephony Support | ||
357 | # | ||
358 | # CONFIG_PHONE is not set | ||
359 | |||
360 | # | ||
361 | # Input device support | ||
362 | # | ||
363 | # CONFIG_INPUT is not set | ||
364 | |||
365 | # | ||
366 | # Hardware I/O ports | ||
367 | # | ||
368 | # CONFIG_SERIO is not set | ||
369 | # CONFIG_GAMEPORT is not set | ||
370 | |||
371 | # | ||
372 | # Character devices | ||
373 | # | ||
374 | # CONFIG_VT is not set | ||
375 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
376 | |||
377 | # | ||
378 | # Serial drivers | ||
379 | # | ||
380 | CONFIG_SERIAL_8250=y | ||
381 | CONFIG_SERIAL_8250_CONSOLE=y | ||
382 | CONFIG_SERIAL_8250_NR_UARTS=1 | ||
383 | CONFIG_SERIAL_8250_EXTENDED=y | ||
384 | # CONFIG_SERIAL_8250_MANY_PORTS is not set | ||
385 | CONFIG_SERIAL_8250_SHARE_IRQ=y | ||
386 | # CONFIG_SERIAL_8250_DETECT_IRQ is not set | ||
387 | # CONFIG_SERIAL_8250_MULTIPORT is not set | ||
388 | # CONFIG_SERIAL_8250_RSA is not set | ||
389 | |||
390 | # | ||
391 | # Non-8250 serial port support | ||
392 | # | ||
393 | CONFIG_SERIAL_CORE=y | ||
394 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
395 | # CONFIG_SERIAL_JSM is not set | ||
396 | CONFIG_UNIX98_PTYS=y | ||
397 | # CONFIG_LEGACY_PTYS is not set | ||
398 | |||
399 | # | ||
400 | # IPMI | ||
401 | # | ||
402 | # CONFIG_IPMI_HANDLER is not set | ||
403 | |||
404 | # | ||
405 | # Watchdog Cards | ||
406 | # | ||
407 | # CONFIG_WATCHDOG is not set | ||
408 | # CONFIG_RTC is not set | ||
409 | # CONFIG_GEN_RTC is not set | ||
410 | # CONFIG_DTLK is not set | ||
411 | # CONFIG_R3964 is not set | ||
412 | # CONFIG_APPLICOM is not set | ||
413 | |||
414 | # | ||
415 | # Ftape, the floppy tape device driver | ||
416 | # | ||
417 | # CONFIG_DRM is not set | ||
418 | # CONFIG_RAW_DRIVER is not set | ||
419 | |||
420 | # | ||
421 | # TPM devices | ||
422 | # | ||
423 | # CONFIG_TCG_TPM is not set | ||
424 | |||
425 | # | ||
426 | # I2C support | ||
427 | # | ||
428 | # CONFIG_I2C is not set | ||
429 | |||
430 | # | ||
431 | # Dallas's 1-wire bus | ||
432 | # | ||
433 | # CONFIG_W1 is not set | ||
434 | |||
435 | # | ||
436 | # Misc devices | ||
437 | # | ||
438 | |||
439 | # | ||
440 | # Multimedia devices | ||
441 | # | ||
442 | # CONFIG_VIDEO_DEV is not set | ||
443 | |||
444 | # | ||
445 | # Digital Video Broadcasting Devices | ||
446 | # | ||
447 | # CONFIG_DVB is not set | ||
448 | |||
449 | # | ||
450 | # Graphics support | ||
451 | # | ||
452 | # CONFIG_FB is not set | ||
453 | |||
454 | # | ||
455 | # Sound | ||
456 | # | ||
457 | # CONFIG_SOUND is not set | ||
458 | |||
459 | # | ||
460 | # USB support | ||
461 | # | ||
462 | CONFIG_USB_ARCH_HAS_HCD=y | ||
463 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
464 | # CONFIG_USB is not set | ||
465 | |||
466 | # | ||
467 | # USB Gadget Support | ||
468 | # | ||
469 | # CONFIG_USB_GADGET is not set | ||
470 | |||
471 | # | ||
472 | # MMC/SD Card support | ||
473 | # | ||
474 | # CONFIG_MMC is not set | ||
475 | |||
476 | # | ||
477 | # InfiniBand support | ||
478 | # | ||
479 | # CONFIG_INFINIBAND is not set | ||
480 | |||
481 | # | ||
482 | # File systems | ||
483 | # | ||
484 | # CONFIG_EXT2_FS is not set | ||
485 | # CONFIG_EXT3_FS is not set | ||
486 | # CONFIG_JBD is not set | ||
487 | # CONFIG_REISER4_FS is not set | ||
488 | # CONFIG_REISERFS_FS is not set | ||
489 | # CONFIG_JFS_FS is not set | ||
490 | |||
491 | # | ||
492 | # XFS support | ||
493 | # | ||
494 | # CONFIG_XFS_FS is not set | ||
495 | # CONFIG_MINIX_FS is not set | ||
496 | # CONFIG_ROMFS_FS is not set | ||
497 | CONFIG_INOTIFY=y | ||
498 | # CONFIG_QUOTA is not set | ||
499 | CONFIG_DNOTIFY=y | ||
500 | # CONFIG_AUTOFS_FS is not set | ||
501 | # CONFIG_AUTOFS4_FS is not set | ||
502 | |||
503 | # | ||
504 | # Caches | ||
505 | # | ||
506 | # CONFIG_FSCACHE is not set | ||
507 | # CONFIG_FUSE_FS is not set | ||
508 | |||
509 | # | ||
510 | # CD-ROM/DVD Filesystems | ||
511 | # | ||
512 | # CONFIG_ISO9660_FS is not set | ||
513 | # CONFIG_UDF_FS is not set | ||
514 | |||
515 | # | ||
516 | # DOS/FAT/NT Filesystems | ||
517 | # | ||
518 | # CONFIG_MSDOS_FS is not set | ||
519 | # CONFIG_VFAT_FS is not set | ||
520 | # CONFIG_NTFS_FS is not set | ||
521 | |||
522 | # | ||
523 | # Pseudo filesystems | ||
524 | # | ||
525 | CONFIG_PROC_FS=y | ||
526 | # CONFIG_PROC_KCORE is not set | ||
527 | CONFIG_SYSFS=y | ||
528 | # CONFIG_DEVFS_FS is not set | ||
529 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
530 | CONFIG_TMPFS=y | ||
531 | # CONFIG_TMPFS_XATTR is not set | ||
532 | # CONFIG_HUGETLB_PAGE is not set | ||
533 | CONFIG_RAMFS=y | ||
534 | # CONFIG_RELAYFS_FS is not set | ||
535 | |||
536 | # | ||
537 | # Miscellaneous filesystems | ||
538 | # | ||
539 | # CONFIG_ADFS_FS is not set | ||
540 | # CONFIG_AFFS_FS is not set | ||
541 | # CONFIG_HFS_FS is not set | ||
542 | # CONFIG_HFSPLUS_FS is not set | ||
543 | # CONFIG_BEFS_FS is not set | ||
544 | # CONFIG_BFS_FS is not set | ||
545 | # CONFIG_EFS_FS is not set | ||
546 | # CONFIG_CRAMFS is not set | ||
547 | # CONFIG_VXFS_FS is not set | ||
548 | # CONFIG_HPFS_FS is not set | ||
549 | # CONFIG_QNX4FS_FS is not set | ||
550 | # CONFIG_SYSV_FS is not set | ||
551 | # CONFIG_UFS_FS is not set | ||
552 | |||
553 | # | ||
554 | # Network File Systems | ||
555 | # | ||
556 | CONFIG_NFS_FS=y | ||
557 | # CONFIG_NFS_V3 is not set | ||
558 | # CONFIG_NFS_V4 is not set | ||
559 | # CONFIG_NFS_DIRECTIO is not set | ||
560 | # CONFIG_NFSD is not set | ||
561 | CONFIG_ROOT_NFS=y | ||
562 | CONFIG_LOCKD=y | ||
563 | CONFIG_NFS_COMMON=y | ||
564 | CONFIG_SUNRPC=y | ||
565 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
566 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
567 | # CONFIG_SMB_FS is not set | ||
568 | # CONFIG_CIFS is not set | ||
569 | # CONFIG_NCP_FS is not set | ||
570 | # CONFIG_CODA_FS is not set | ||
571 | # CONFIG_AFS_FS is not set | ||
572 | |||
573 | # | ||
574 | # Partition Types | ||
575 | # | ||
576 | # CONFIG_PARTITION_ADVANCED is not set | ||
577 | CONFIG_MSDOS_PARTITION=y | ||
578 | |||
579 | # | ||
580 | # Native Language Support | ||
581 | # | ||
582 | # CONFIG_NLS is not set | ||
583 | |||
584 | # | ||
585 | # Kernel hacking | ||
586 | # | ||
587 | # CONFIG_PRINTK_TIME is not set | ||
588 | CONFIG_DEBUG_KERNEL=y | ||
589 | # CONFIG_MAGIC_SYSRQ is not set | ||
590 | CONFIG_LOG_BUF_SHIFT=14 | ||
591 | CONFIG_DETECT_SOFTLOCKUP=y | ||
592 | # CONFIG_SCHEDSTATS is not set | ||
593 | # CONFIG_DEBUG_SLAB is not set | ||
594 | # CONFIG_DEBUG_SPINLOCK is not set | ||
595 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
596 | # CONFIG_DEBUG_KOBJECT is not set | ||
597 | # CONFIG_DEBUG_HIGHMEM is not set | ||
598 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
599 | # CONFIG_DEBUG_INFO is not set | ||
600 | # CONFIG_DEBUG_FS is not set | ||
601 | # CONFIG_FRAME_POINTER is not set | ||
602 | # CONFIG_EARLY_PRINTK is not set | ||
603 | CONFIG_DEBUG_STACKOVERFLOW=y | ||
604 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
605 | # CONFIG_GDBSTUB is not set | ||
606 | |||
607 | # | ||
608 | # Security options | ||
609 | # | ||
610 | # CONFIG_KEYS is not set | ||
611 | # CONFIG_SECURITY is not set | ||
612 | |||
613 | # | ||
614 | # Cryptographic options | ||
615 | # | ||
616 | # CONFIG_CRYPTO is not set | ||
617 | |||
618 | # | ||
619 | # Hardware crypto devices | ||
620 | # | ||
621 | |||
622 | # | ||
623 | # Library routines | ||
624 | # | ||
625 | # CONFIG_CRC_CCITT is not set | ||
626 | CONFIG_CRC32=y | ||
627 | # CONFIG_LIBCRC32C is not set | ||
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c index 2203a9d20212..4553ffd94b1f 100644 --- a/arch/i386/kernel/cpu/common.c +++ b/arch/i386/kernel/cpu/common.c | |||
@@ -435,6 +435,11 @@ void __devinit identify_cpu(struct cpuinfo_x86 *c) | |||
435 | if (c == &boot_cpu_data) | 435 | if (c == &boot_cpu_data) |
436 | sysenter_setup(); | 436 | sysenter_setup(); |
437 | enable_sep_cpu(); | 437 | enable_sep_cpu(); |
438 | |||
439 | if (c == &boot_cpu_data) | ||
440 | mtrr_bp_init(); | ||
441 | else | ||
442 | mtrr_ap_init(); | ||
438 | } | 443 | } |
439 | 444 | ||
440 | #ifdef CONFIG_X86_HT | 445 | #ifdef CONFIG_X86_HT |
diff --git a/arch/i386/kernel/cpu/intel.c b/arch/i386/kernel/cpu/intel.c index 96a75d045835..a2c33c1a46c5 100644 --- a/arch/i386/kernel/cpu/intel.c +++ b/arch/i386/kernel/cpu/intel.c | |||
@@ -25,7 +25,7 @@ extern int trap_init_f00f_bug(void); | |||
25 | /* | 25 | /* |
26 | * Alignment at which movsl is preferred for bulk memory copies. | 26 | * Alignment at which movsl is preferred for bulk memory copies. |
27 | */ | 27 | */ |
28 | struct movsl_mask movsl_mask; | 28 | struct movsl_mask movsl_mask __read_mostly; |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | void __devinit early_intel_workaround(struct cpuinfo_x86 *c) | 31 | void __devinit early_intel_workaround(struct cpuinfo_x86 *c) |
diff --git a/arch/i386/kernel/cpu/mtrr/generic.c b/arch/i386/kernel/cpu/mtrr/generic.c index 64d91f73a0a4..169ac8e0db68 100644 --- a/arch/i386/kernel/cpu/mtrr/generic.c +++ b/arch/i386/kernel/cpu/mtrr/generic.c | |||
@@ -67,13 +67,6 @@ void __init get_mtrr_state(void) | |||
67 | mtrr_state.enabled = (lo & 0xc00) >> 10; | 67 | mtrr_state.enabled = (lo & 0xc00) >> 10; |
68 | } | 68 | } |
69 | 69 | ||
70 | /* Free resources associated with a struct mtrr_state */ | ||
71 | void __init finalize_mtrr_state(void) | ||
72 | { | ||
73 | kfree(mtrr_state.var_ranges); | ||
74 | mtrr_state.var_ranges = NULL; | ||
75 | } | ||
76 | |||
77 | /* Some BIOS's are fucked and don't set all MTRRs the same! */ | 70 | /* Some BIOS's are fucked and don't set all MTRRs the same! */ |
78 | void __init mtrr_state_warn(void) | 71 | void __init mtrr_state_warn(void) |
79 | { | 72 | { |
@@ -334,6 +327,9 @@ static void generic_set_mtrr(unsigned int reg, unsigned long base, | |||
334 | */ | 327 | */ |
335 | { | 328 | { |
336 | unsigned long flags; | 329 | unsigned long flags; |
330 | struct mtrr_var_range *vr; | ||
331 | |||
332 | vr = &mtrr_state.var_ranges[reg]; | ||
337 | 333 | ||
338 | local_irq_save(flags); | 334 | local_irq_save(flags); |
339 | prepare_set(); | 335 | prepare_set(); |
@@ -342,11 +338,15 @@ static void generic_set_mtrr(unsigned int reg, unsigned long base, | |||
342 | /* The invalid bit is kept in the mask, so we simply clear the | 338 | /* The invalid bit is kept in the mask, so we simply clear the |
343 | relevant mask register to disable a range. */ | 339 | relevant mask register to disable a range. */ |
344 | mtrr_wrmsr(MTRRphysMask_MSR(reg), 0, 0); | 340 | mtrr_wrmsr(MTRRphysMask_MSR(reg), 0, 0); |
341 | memset(vr, 0, sizeof(struct mtrr_var_range)); | ||
345 | } else { | 342 | } else { |
346 | mtrr_wrmsr(MTRRphysBase_MSR(reg), base << PAGE_SHIFT | type, | 343 | vr->base_lo = base << PAGE_SHIFT | type; |
347 | (base & size_and_mask) >> (32 - PAGE_SHIFT)); | 344 | vr->base_hi = (base & size_and_mask) >> (32 - PAGE_SHIFT); |
348 | mtrr_wrmsr(MTRRphysMask_MSR(reg), -size << PAGE_SHIFT | 0x800, | 345 | vr->mask_lo = -size << PAGE_SHIFT | 0x800; |
349 | (-size & size_and_mask) >> (32 - PAGE_SHIFT)); | 346 | vr->mask_hi = (-size & size_and_mask) >> (32 - PAGE_SHIFT); |
347 | |||
348 | mtrr_wrmsr(MTRRphysBase_MSR(reg), vr->base_lo, vr->base_hi); | ||
349 | mtrr_wrmsr(MTRRphysMask_MSR(reg), vr->mask_lo, vr->mask_hi); | ||
350 | } | 350 | } |
351 | 351 | ||
352 | post_set(); | 352 | post_set(); |
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index d66b09e0c820..764cac64e211 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
@@ -332,6 +332,8 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
332 | 332 | ||
333 | error = -EINVAL; | 333 | error = -EINVAL; |
334 | 334 | ||
335 | /* No CPU hotplug when we change MTRR entries */ | ||
336 | lock_cpu_hotplug(); | ||
335 | /* Search for existing MTRR */ | 337 | /* Search for existing MTRR */ |
336 | down(&main_lock); | 338 | down(&main_lock); |
337 | for (i = 0; i < num_var_ranges; ++i) { | 339 | for (i = 0; i < num_var_ranges; ++i) { |
@@ -372,6 +374,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
372 | error = i; | 374 | error = i; |
373 | out: | 375 | out: |
374 | up(&main_lock); | 376 | up(&main_lock); |
377 | unlock_cpu_hotplug(); | ||
375 | return error; | 378 | return error; |
376 | } | 379 | } |
377 | 380 | ||
@@ -461,6 +464,8 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
461 | return -ENXIO; | 464 | return -ENXIO; |
462 | 465 | ||
463 | max = num_var_ranges; | 466 | max = num_var_ranges; |
467 | /* No CPU hotplug when we change MTRR entries */ | ||
468 | lock_cpu_hotplug(); | ||
464 | down(&main_lock); | 469 | down(&main_lock); |
465 | if (reg < 0) { | 470 | if (reg < 0) { |
466 | /* Search for existing MTRR */ | 471 | /* Search for existing MTRR */ |
@@ -501,6 +506,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
501 | error = reg; | 506 | error = reg; |
502 | out: | 507 | out: |
503 | up(&main_lock); | 508 | up(&main_lock); |
509 | unlock_cpu_hotplug(); | ||
504 | return error; | 510 | return error; |
505 | } | 511 | } |
506 | /** | 512 | /** |
@@ -544,21 +550,9 @@ static void __init init_ifs(void) | |||
544 | centaur_init_mtrr(); | 550 | centaur_init_mtrr(); |
545 | } | 551 | } |
546 | 552 | ||
547 | static void __init init_other_cpus(void) | 553 | /* The suspend/resume methods are only for CPU without MTRR. CPU using generic |
548 | { | 554 | * MTRR driver doesn't require this |
549 | if (use_intel()) | 555 | */ |
550 | get_mtrr_state(); | ||
551 | |||
552 | /* bring up the other processors */ | ||
553 | set_mtrr(~0U,0,0,0); | ||
554 | |||
555 | if (use_intel()) { | ||
556 | finalize_mtrr_state(); | ||
557 | mtrr_state_warn(); | ||
558 | } | ||
559 | } | ||
560 | |||
561 | |||
562 | struct mtrr_value { | 556 | struct mtrr_value { |
563 | mtrr_type ltype; | 557 | mtrr_type ltype; |
564 | unsigned long lbase; | 558 | unsigned long lbase; |
@@ -611,13 +605,13 @@ static struct sysdev_driver mtrr_sysdev_driver = { | |||
611 | 605 | ||
612 | 606 | ||
613 | /** | 607 | /** |
614 | * mtrr_init - initialize mtrrs on the boot CPU | 608 | * mtrr_bp_init - initialize mtrrs on the boot CPU |
615 | * | 609 | * |
616 | * This needs to be called early; before any of the other CPUs are | 610 | * This needs to be called early; before any of the other CPUs are |
617 | * initialized (i.e. before smp_init()). | 611 | * initialized (i.e. before smp_init()). |
618 | * | 612 | * |
619 | */ | 613 | */ |
620 | static int __init mtrr_init(void) | 614 | void __init mtrr_bp_init(void) |
621 | { | 615 | { |
622 | init_ifs(); | 616 | init_ifs(); |
623 | 617 | ||
@@ -674,12 +668,48 @@ static int __init mtrr_init(void) | |||
674 | if (mtrr_if) { | 668 | if (mtrr_if) { |
675 | set_num_var_ranges(); | 669 | set_num_var_ranges(); |
676 | init_table(); | 670 | init_table(); |
677 | init_other_cpus(); | 671 | if (use_intel()) |
678 | 672 | get_mtrr_state(); | |
679 | return sysdev_driver_register(&cpu_sysdev_class, | ||
680 | &mtrr_sysdev_driver); | ||
681 | } | 673 | } |
682 | return -ENXIO; | ||
683 | } | 674 | } |
684 | 675 | ||
685 | subsys_initcall(mtrr_init); | 676 | void mtrr_ap_init(void) |
677 | { | ||
678 | unsigned long flags; | ||
679 | |||
680 | if (!mtrr_if || !use_intel()) | ||
681 | return; | ||
682 | /* | ||
683 | * Ideally we should hold main_lock here to avoid mtrr entries changed, | ||
684 | * but this routine will be called in cpu boot time, holding the lock | ||
685 | * breaks it. This routine is called in two cases: 1.very earily time | ||
686 | * of software resume, when there absolutely isn't mtrr entry changes; | ||
687 | * 2.cpu hotadd time. We let mtrr_add/del_page hold cpuhotplug lock to | ||
688 | * prevent mtrr entry changes | ||
689 | */ | ||
690 | local_irq_save(flags); | ||
691 | |||
692 | mtrr_if->set_all(); | ||
693 | |||
694 | local_irq_restore(flags); | ||
695 | } | ||
696 | |||
697 | static int __init mtrr_init_finialize(void) | ||
698 | { | ||
699 | if (!mtrr_if) | ||
700 | return 0; | ||
701 | if (use_intel()) | ||
702 | mtrr_state_warn(); | ||
703 | else { | ||
704 | /* The CPUs haven't MTRR and seemes not support SMP. They have | ||
705 | * specific drivers, we use a tricky method to support | ||
706 | * suspend/resume for them. | ||
707 | * TBD: is there any system with such CPU which supports | ||
708 | * suspend/resume? if no, we should remove the code. | ||
709 | */ | ||
710 | sysdev_driver_register(&cpu_sysdev_class, | ||
711 | &mtrr_sysdev_driver); | ||
712 | } | ||
713 | return 0; | ||
714 | } | ||
715 | subsys_initcall(mtrr_init_finialize); | ||
diff --git a/arch/i386/kernel/cpu/mtrr/mtrr.h b/arch/i386/kernel/cpu/mtrr/mtrr.h index de1351245599..99c9f2682041 100644 --- a/arch/i386/kernel/cpu/mtrr/mtrr.h +++ b/arch/i386/kernel/cpu/mtrr/mtrr.h | |||
@@ -91,7 +91,6 @@ extern struct mtrr_ops * mtrr_if; | |||
91 | 91 | ||
92 | extern unsigned int num_var_ranges; | 92 | extern unsigned int num_var_ranges; |
93 | 93 | ||
94 | void finalize_mtrr_state(void); | ||
95 | void mtrr_state_warn(void); | 94 | void mtrr_state_warn(void); |
96 | char *mtrr_attrib_to_str(int x); | 95 | char *mtrr_attrib_to_str(int x); |
97 | void mtrr_wrmsr(unsigned, unsigned, unsigned); | 96 | void mtrr_wrmsr(unsigned, unsigned, unsigned); |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index d66bf489a2e9..8ac8e9fd5614 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -68,21 +68,21 @@ EXPORT_SYMBOL(smp_num_siblings); | |||
68 | #endif | 68 | #endif |
69 | 69 | ||
70 | /* Package ID of each logical CPU */ | 70 | /* Package ID of each logical CPU */ |
71 | int phys_proc_id[NR_CPUS] = {[0 ... NR_CPUS-1] = BAD_APICID}; | 71 | int phys_proc_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID}; |
72 | EXPORT_SYMBOL(phys_proc_id); | 72 | EXPORT_SYMBOL(phys_proc_id); |
73 | 73 | ||
74 | /* Core ID of each logical CPU */ | 74 | /* Core ID of each logical CPU */ |
75 | int cpu_core_id[NR_CPUS] = {[0 ... NR_CPUS-1] = BAD_APICID}; | 75 | int cpu_core_id[NR_CPUS] __read_mostly = {[0 ... NR_CPUS-1] = BAD_APICID}; |
76 | EXPORT_SYMBOL(cpu_core_id); | 76 | EXPORT_SYMBOL(cpu_core_id); |
77 | 77 | ||
78 | cpumask_t cpu_sibling_map[NR_CPUS]; | 78 | cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly; |
79 | EXPORT_SYMBOL(cpu_sibling_map); | 79 | EXPORT_SYMBOL(cpu_sibling_map); |
80 | 80 | ||
81 | cpumask_t cpu_core_map[NR_CPUS]; | 81 | cpumask_t cpu_core_map[NR_CPUS] __read_mostly; |
82 | EXPORT_SYMBOL(cpu_core_map); | 82 | EXPORT_SYMBOL(cpu_core_map); |
83 | 83 | ||
84 | /* bitmap of online cpus */ | 84 | /* bitmap of online cpus */ |
85 | cpumask_t cpu_online_map; | 85 | cpumask_t cpu_online_map __read_mostly; |
86 | EXPORT_SYMBOL(cpu_online_map); | 86 | EXPORT_SYMBOL(cpu_online_map); |
87 | 87 | ||
88 | cpumask_t cpu_callin_map; | 88 | cpumask_t cpu_callin_map; |
@@ -100,7 +100,7 @@ static int __devinitdata tsc_sync_disabled; | |||
100 | struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; | 100 | struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; |
101 | EXPORT_SYMBOL(cpu_data); | 101 | EXPORT_SYMBOL(cpu_data); |
102 | 102 | ||
103 | u8 x86_cpu_to_apicid[NR_CPUS] = | 103 | u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly = |
104 | { [0 ... NR_CPUS-1] = 0xff }; | 104 | { [0 ... NR_CPUS-1] = 0xff }; |
105 | EXPORT_SYMBOL(x86_cpu_to_apicid); | 105 | EXPORT_SYMBOL(x86_cpu_to_apicid); |
106 | 106 | ||
@@ -550,10 +550,10 @@ extern struct { | |||
550 | #ifdef CONFIG_NUMA | 550 | #ifdef CONFIG_NUMA |
551 | 551 | ||
552 | /* which logical CPUs are on which nodes */ | 552 | /* which logical CPUs are on which nodes */ |
553 | cpumask_t node_2_cpu_mask[MAX_NUMNODES] = | 553 | cpumask_t node_2_cpu_mask[MAX_NUMNODES] __read_mostly = |
554 | { [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE }; | 554 | { [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE }; |
555 | /* which node each logical CPU is on */ | 555 | /* which node each logical CPU is on */ |
556 | int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 }; | 556 | int cpu_2_node[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = 0 }; |
557 | EXPORT_SYMBOL(cpu_2_node); | 557 | EXPORT_SYMBOL(cpu_2_node); |
558 | 558 | ||
559 | /* set up a mapping between cpu and node. */ | 559 | /* set up a mapping between cpu and node. */ |
@@ -581,7 +581,7 @@ static inline void unmap_cpu_to_node(int cpu) | |||
581 | 581 | ||
582 | #endif /* CONFIG_NUMA */ | 582 | #endif /* CONFIG_NUMA */ |
583 | 583 | ||
584 | u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID }; | 584 | u8 cpu_2_logical_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID }; |
585 | 585 | ||
586 | static void map_cpu_to_logical_apicid(void) | 586 | static void map_cpu_to_logical_apicid(void) |
587 | { | 587 | { |
diff --git a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c index 2854c357377f..0ee9dee8af06 100644 --- a/arch/i386/kernel/time.c +++ b/arch/i386/kernel/time.c | |||
@@ -91,7 +91,7 @@ EXPORT_SYMBOL(rtc_lock); | |||
91 | DEFINE_SPINLOCK(i8253_lock); | 91 | DEFINE_SPINLOCK(i8253_lock); |
92 | EXPORT_SYMBOL(i8253_lock); | 92 | EXPORT_SYMBOL(i8253_lock); |
93 | 93 | ||
94 | struct timer_opts *cur_timer = &timer_none; | 94 | struct timer_opts *cur_timer __read_mostly = &timer_none; |
95 | 95 | ||
96 | /* | 96 | /* |
97 | * This is a special lock that is owned by the CPU and holds the index | 97 | * This is a special lock that is owned by the CPU and holds the index |
diff --git a/arch/i386/kernel/timers/timer_hpet.c b/arch/i386/kernel/timers/timer_hpet.c index d766e0963ac1..ef8dac5dd33b 100644 --- a/arch/i386/kernel/timers/timer_hpet.c +++ b/arch/i386/kernel/timers/timer_hpet.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include "mach_timer.h" | 18 | #include "mach_timer.h" |
19 | #include <asm/hpet.h> | 19 | #include <asm/hpet.h> |
20 | 20 | ||
21 | static unsigned long hpet_usec_quotient; /* convert hpet clks to usec */ | 21 | static unsigned long __read_mostly hpet_usec_quotient; /* convert hpet clks to usec */ |
22 | static unsigned long tsc_hpet_quotient; /* convert tsc to hpet clks */ | 22 | static unsigned long tsc_hpet_quotient; /* convert tsc to hpet clks */ |
23 | static unsigned long hpet_last; /* hpet counter value at last tick*/ | 23 | static unsigned long hpet_last; /* hpet counter value at last tick*/ |
24 | static unsigned long last_tsc_low; /* lsb 32 bits of Time Stamp Counter */ | 24 | static unsigned long last_tsc_low; /* lsb 32 bits of Time Stamp Counter */ |
@@ -180,7 +180,7 @@ static int __init init_hpet(char* override) | |||
180 | /************************************************************/ | 180 | /************************************************************/ |
181 | 181 | ||
182 | /* tsc timer_opts struct */ | 182 | /* tsc timer_opts struct */ |
183 | static struct timer_opts timer_hpet = { | 183 | static struct timer_opts timer_hpet __read_mostly = { |
184 | .name = "hpet", | 184 | .name = "hpet", |
185 | .mark_offset = mark_offset_hpet, | 185 | .mark_offset = mark_offset_hpet, |
186 | .get_offset = get_offset_hpet, | 186 | .get_offset = get_offset_hpet, |
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S index 7e01a528a83a..761972f8cb6c 100644 --- a/arch/i386/kernel/vmlinux.lds.S +++ b/arch/i386/kernel/vmlinux.lds.S | |||
@@ -57,6 +57,9 @@ SECTIONS | |||
57 | *(.data.cacheline_aligned) | 57 | *(.data.cacheline_aligned) |
58 | } | 58 | } |
59 | 59 | ||
60 | /* rarely changed data like cpu maps */ | ||
61 | . = ALIGN(32); | ||
62 | .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { *(.data.read_mostly) } | ||
60 | _edata = .; /* End of data section */ | 63 | _edata = .; /* End of data section */ |
61 | 64 | ||
62 | . = ALIGN(THREAD_SIZE); /* init_task */ | 65 | . = ALIGN(THREAD_SIZE); /* init_task */ |
diff --git a/arch/i386/mm/ioremap.c b/arch/i386/mm/ioremap.c index 6b25afc933b6..f379b8d67558 100644 --- a/arch/i386/mm/ioremap.c +++ b/arch/i386/mm/ioremap.c | |||
@@ -228,7 +228,8 @@ EXPORT_SYMBOL(ioremap_nocache); | |||
228 | void iounmap(volatile void __iomem *addr) | 228 | void iounmap(volatile void __iomem *addr) |
229 | { | 229 | { |
230 | struct vm_struct *p; | 230 | struct vm_struct *p; |
231 | if ((void __force *) addr <= high_memory) | 231 | |
232 | if ((void __force *)addr <= high_memory) | ||
232 | return; | 233 | return; |
233 | 234 | ||
234 | /* | 235 | /* |
@@ -241,9 +242,10 @@ void iounmap(volatile void __iomem *addr) | |||
241 | return; | 242 | return; |
242 | 243 | ||
243 | write_lock(&vmlist_lock); | 244 | write_lock(&vmlist_lock); |
244 | p = __remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr)); | 245 | p = __remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr)); |
245 | if (!p) { | 246 | if (!p) { |
246 | printk(KERN_WARNING "iounmap: bad address %p\n", addr); | 247 | printk(KERN_WARNING "iounmap: bad address %p\n", addr); |
248 | dump_stack(); | ||
247 | goto out_unlock; | 249 | goto out_unlock; |
248 | } | 250 | } |
249 | 251 | ||
diff --git a/arch/i386/power/cpu.c b/arch/i386/power/cpu.c index 0e6b45b61251..c547c1af6fa1 100644 --- a/arch/i386/power/cpu.c +++ b/arch/i386/power/cpu.c | |||
@@ -137,6 +137,7 @@ void __restore_processor_state(struct saved_context *ctxt) | |||
137 | 137 | ||
138 | fix_processor_context(); | 138 | fix_processor_context(); |
139 | do_fpu_end(); | 139 | do_fpu_end(); |
140 | mtrr_ap_init(); | ||
140 | } | 141 | } |
141 | 142 | ||
142 | void restore_processor_state(void) | 143 | void restore_processor_state(void) |
diff --git a/arch/m32r/kernel/setup_m32700ut.c b/arch/m32r/kernel/setup_m32700ut.c index b014e2c1e524..a146b24a556b 100644 --- a/arch/m32r/kernel/setup_m32700ut.c +++ b/arch/m32r/kernel/setup_m32700ut.c | |||
@@ -3,8 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Setup routines for Renesas M32700UT Board | 4 | * Setup routines for Renesas M32700UT Board |
5 | * | 5 | * |
6 | * Copyright (c) 2002 Hiroyuki Kondo, Hirokazu Takata, | 6 | * Copyright (c) 2002-2005 Hiroyuki Kondo, Hirokazu Takata, |
7 | * Hitoshi Yamamoto, Takeo Takahashi | 7 | * Hitoshi Yamamoto, Takeo Takahashi |
8 | * | 8 | * |
9 | * This file is subject to the terms and conditions of the GNU General | 9 | * This file is subject to the terms and conditions of the GNU General |
10 | * Public License. See the file "COPYING" in the main directory of this | 10 | * Public License. See the file "COPYING" in the main directory of this |
@@ -435,7 +435,7 @@ void __init init_IRQ(void) | |||
435 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | 435 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; |
436 | enable_m32700ut_irq(M32R_IRQ_INT2); | 436 | enable_m32700ut_irq(M32R_IRQ_INT2); |
437 | 437 | ||
438 | //#if defined(CONFIG_VIDEO_M32R_AR) | 438 | #if defined(CONFIG_VIDEO_M32R_AR) |
439 | /* | 439 | /* |
440 | * INT3# is used for AR | 440 | * INT3# is used for AR |
441 | */ | 441 | */ |
@@ -445,9 +445,11 @@ void __init init_IRQ(void) | |||
445 | irq_desc[M32R_IRQ_INT3].depth = 1; | 445 | irq_desc[M32R_IRQ_INT3].depth = 1; |
446 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 446 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
447 | disable_m32700ut_irq(M32R_IRQ_INT3); | 447 | disable_m32700ut_irq(M32R_IRQ_INT3); |
448 | //#endif /* CONFIG_VIDEO_M32R_AR */ | 448 | #endif /* CONFIG_VIDEO_M32R_AR */ |
449 | } | 449 | } |
450 | 450 | ||
451 | #if defined(CONFIG_SMC91X) | ||
452 | |||
451 | #define LAN_IOSTART 0x300 | 453 | #define LAN_IOSTART 0x300 |
452 | #define LAN_IOEND 0x320 | 454 | #define LAN_IOEND 0x320 |
453 | static struct resource smc91x_resources[] = { | 455 | static struct resource smc91x_resources[] = { |
@@ -469,10 +471,55 @@ static struct platform_device smc91x_device = { | |||
469 | .num_resources = ARRAY_SIZE(smc91x_resources), | 471 | .num_resources = ARRAY_SIZE(smc91x_resources), |
470 | .resource = smc91x_resources, | 472 | .resource = smc91x_resources, |
471 | }; | 473 | }; |
474 | #endif | ||
475 | |||
476 | #if defined(CONFIG_FB_S1D13XXX) | ||
477 | |||
478 | #include <video/s1d13xxxfb.h> | ||
479 | #include <asm/s1d13806.h> | ||
480 | |||
481 | static struct s1d13xxxfb_pdata s1d13xxxfb_data = { | ||
482 | .initregs = s1d13xxxfb_initregs, | ||
483 | .initregssize = ARRAY_SIZE(s1d13xxxfb_initregs), | ||
484 | .platform_init_video = NULL, | ||
485 | #ifdef CONFIG_PM | ||
486 | .platform_suspend_video = NULL, | ||
487 | .platform_resume_video = NULL, | ||
488 | #endif | ||
489 | }; | ||
490 | |||
491 | static struct resource s1d13xxxfb_resources[] = { | ||
492 | [0] = { | ||
493 | .start = 0x10600000UL, | ||
494 | .end = 0x1073FFFFUL, | ||
495 | .flags = IORESOURCE_MEM, | ||
496 | }, | ||
497 | [1] = { | ||
498 | .start = 0x10400000UL, | ||
499 | .end = 0x104001FFUL, | ||
500 | .flags = IORESOURCE_MEM, | ||
501 | } | ||
502 | }; | ||
503 | |||
504 | static struct platform_device s1d13xxxfb_device = { | ||
505 | .name = S1D_DEVICENAME, | ||
506 | .id = 0, | ||
507 | .dev = { | ||
508 | .platform_data = &s1d13xxxfb_data, | ||
509 | }, | ||
510 | .num_resources = ARRAY_SIZE(s1d13xxxfb_resources), | ||
511 | .resource = s1d13xxxfb_resources, | ||
512 | }; | ||
513 | #endif | ||
472 | 514 | ||
473 | static int __init platform_init(void) | 515 | static int __init platform_init(void) |
474 | { | 516 | { |
517 | #if defined(CONFIG_SMC91X) | ||
475 | platform_device_register(&smc91x_device); | 518 | platform_device_register(&smc91x_device); |
519 | #endif | ||
520 | #if defined(CONFIG_FB_S1D13XXX) | ||
521 | platform_device_register(&s1d13xxxfb_device); | ||
522 | #endif | ||
476 | return 0; | 523 | return 0; |
477 | } | 524 | } |
478 | arch_initcall(platform_init); | 525 | arch_initcall(platform_init); |
diff --git a/arch/m32r/kernel/setup_mappi.c b/arch/m32r/kernel/setup_mappi.c index aaf8e569b930..4e709809efc5 100644 --- a/arch/m32r/kernel/setup_mappi.c +++ b/arch/m32r/kernel/setup_mappi.c | |||
@@ -3,14 +3,15 @@ | |||
3 | * | 3 | * |
4 | * Setup routines for Renesas MAPPI Board | 4 | * Setup routines for Renesas MAPPI Board |
5 | * | 5 | * |
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | 6 | * Copyright (c) 2001-2005 Hiroyuki Kondo, Hirokazu Takata, |
7 | * Hitoshi Yamamoto | 7 | * Hitoshi Yamamoto |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
11 | #include <linux/irq.h> | 11 | #include <linux/irq.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/device.h> | ||
14 | 15 | ||
15 | #include <asm/system.h> | 16 | #include <asm/system.h> |
16 | #include <asm/m32r.h> | 17 | #include <asm/m32r.h> |
@@ -158,3 +159,49 @@ void __init init_IRQ(void) | |||
158 | disable_mappi_irq(M32R_IRQ_INT2); | 159 | disable_mappi_irq(M32R_IRQ_INT2); |
159 | #endif /* CONFIG_M32RPCC */ | 160 | #endif /* CONFIG_M32RPCC */ |
160 | } | 161 | } |
162 | |||
163 | #if defined(CONFIG_FB_S1D13XXX) | ||
164 | |||
165 | #include <video/s1d13xxxfb.h> | ||
166 | #include <asm/s1d13806.h> | ||
167 | |||
168 | static struct s1d13xxxfb_pdata s1d13xxxfb_data = { | ||
169 | .initregs = s1d13xxxfb_initregs, | ||
170 | .initregssize = ARRAY_SIZE(s1d13xxxfb_initregs), | ||
171 | .platform_init_video = NULL, | ||
172 | #ifdef CONFIG_PM | ||
173 | .platform_suspend_video = NULL, | ||
174 | .platform_resume_video = NULL, | ||
175 | #endif | ||
176 | }; | ||
177 | |||
178 | static struct resource s1d13xxxfb_resources[] = { | ||
179 | [0] = { | ||
180 | .start = 0x10200000UL, | ||
181 | .end = 0x1033FFFFUL, | ||
182 | .flags = IORESOURCE_MEM, | ||
183 | }, | ||
184 | [1] = { | ||
185 | .start = 0x10000000UL, | ||
186 | .end = 0x100001FFUL, | ||
187 | .flags = IORESOURCE_MEM, | ||
188 | } | ||
189 | }; | ||
190 | |||
191 | static struct platform_device s1d13xxxfb_device = { | ||
192 | .name = S1D_DEVICENAME, | ||
193 | .id = 0, | ||
194 | .dev = { | ||
195 | .platform_data = &s1d13xxxfb_data, | ||
196 | }, | ||
197 | .num_resources = ARRAY_SIZE(s1d13xxxfb_resources), | ||
198 | .resource = s1d13xxxfb_resources, | ||
199 | }; | ||
200 | |||
201 | static int __init platform_init(void) | ||
202 | { | ||
203 | platform_device_register(&s1d13xxxfb_device); | ||
204 | return 0; | ||
205 | } | ||
206 | arch_initcall(platform_init); | ||
207 | #endif | ||
diff --git a/arch/m32r/kernel/setup_mappi2.c b/arch/m32r/kernel/setup_mappi2.c index 38d5e9a41427..a1d801598aa4 100644 --- a/arch/m32r/kernel/setup_mappi2.c +++ b/arch/m32r/kernel/setup_mappi2.c | |||
@@ -3,8 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Setup routines for Renesas MAPPI-II(M3A-ZA36) Board | 4 | * Setup routines for Renesas MAPPI-II(M3A-ZA36) Board |
5 | * | 5 | * |
6 | * Copyright (c) 2001, 2002 Hiroyuki Kondo, Hirokazu Takata, | 6 | * Copyright (c) 2001-2005 Hiroyuki Kondo, Hirokazu Takata, |
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | 7 | * Hitoshi Yamamoto, Mamoru Sakugawa |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
diff --git a/arch/m32r/kernel/setup_mappi3.c b/arch/m32r/kernel/setup_mappi3.c index 3d60a85aaec5..a76412e883e8 100644 --- a/arch/m32r/kernel/setup_mappi3.c +++ b/arch/m32r/kernel/setup_mappi3.c | |||
@@ -3,8 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Setup routines for Renesas MAPPI-III(M3A-2170) Board | 4 | * Setup routines for Renesas MAPPI-III(M3A-2170) Board |
5 | * | 5 | * |
6 | * Copyright (c) 2001-2005 Hiroyuki Kondo, Hirokazu Takata, | 6 | * Copyright (c) 2001-2005 Hiroyuki Kondo, Hirokazu Takata, |
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | 7 | * Hitoshi Yamamoto, Mamoru Sakugawa |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
@@ -178,6 +178,8 @@ void __init init_IRQ(void) | |||
178 | #endif /* CONFIG_M32R_CFC */ | 178 | #endif /* CONFIG_M32R_CFC */ |
179 | } | 179 | } |
180 | 180 | ||
181 | #if defined(CONFIG_SMC91X) | ||
182 | |||
181 | #define LAN_IOSTART 0x300 | 183 | #define LAN_IOSTART 0x300 |
182 | #define LAN_IOEND 0x320 | 184 | #define LAN_IOEND 0x320 |
183 | static struct resource smc91x_resources[] = { | 185 | static struct resource smc91x_resources[] = { |
@@ -200,9 +202,55 @@ static struct platform_device smc91x_device = { | |||
200 | .resource = smc91x_resources, | 202 | .resource = smc91x_resources, |
201 | }; | 203 | }; |
202 | 204 | ||
205 | #endif | ||
206 | |||
207 | #if defined(CONFIG_FB_S1D13XXX) | ||
208 | |||
209 | #include <video/s1d13xxxfb.h> | ||
210 | #include <asm/s1d13806.h> | ||
211 | |||
212 | static struct s1d13xxxfb_pdata s1d13xxxfb_data = { | ||
213 | .initregs = s1d13xxxfb_initregs, | ||
214 | .initregssize = ARRAY_SIZE(s1d13xxxfb_initregs), | ||
215 | .platform_init_video = NULL, | ||
216 | #ifdef CONFIG_PM | ||
217 | .platform_suspend_video = NULL, | ||
218 | .platform_resume_video = NULL, | ||
219 | #endif | ||
220 | }; | ||
221 | |||
222 | static struct resource s1d13xxxfb_resources[] = { | ||
223 | [0] = { | ||
224 | .start = 0x1d600000UL, | ||
225 | .end = 0x1d73FFFFUL, | ||
226 | .flags = IORESOURCE_MEM, | ||
227 | }, | ||
228 | [1] = { | ||
229 | .start = 0x1d400000UL, | ||
230 | .end = 0x1d4001FFUL, | ||
231 | .flags = IORESOURCE_MEM, | ||
232 | } | ||
233 | }; | ||
234 | |||
235 | static struct platform_device s1d13xxxfb_device = { | ||
236 | .name = S1D_DEVICENAME, | ||
237 | .id = 0, | ||
238 | .dev = { | ||
239 | .platform_data = &s1d13xxxfb_data, | ||
240 | }, | ||
241 | .num_resources = ARRAY_SIZE(s1d13xxxfb_resources), | ||
242 | .resource = s1d13xxxfb_resources, | ||
243 | }; | ||
244 | #endif | ||
245 | |||
203 | static int __init platform_init(void) | 246 | static int __init platform_init(void) |
204 | { | 247 | { |
248 | #if defined(CONFIG_SMC91X) | ||
205 | platform_device_register(&smc91x_device); | 249 | platform_device_register(&smc91x_device); |
250 | #endif | ||
251 | #if defined(CONFIG_FB_S1D13XXX) | ||
252 | platform_device_register(&s1d13xxxfb_device); | ||
253 | #endif | ||
206 | return 0; | 254 | return 0; |
207 | } | 255 | } |
208 | arch_initcall(platform_init); | 256 | arch_initcall(platform_init); |
diff --git a/arch/m32r/kernel/setup_oaks32r.c b/arch/m32r/kernel/setup_oaks32r.c index d656640badc9..45add5b76f19 100644 --- a/arch/m32r/kernel/setup_oaks32r.c +++ b/arch/m32r/kernel/setup_oaks32r.c | |||
@@ -3,8 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Setup routines for OAKS32R Board | 4 | * Setup routines for OAKS32R Board |
5 | * | 5 | * |
6 | * Copyright (c) 2002-2004 Hiroyuki Kondo, Hirokazu Takata, | 6 | * Copyright (c) 2002-2005 Hiroyuki Kondo, Hirokazu Takata, |
7 | * Hitoshi Yamamoto, Mamoru Sakugawa | 7 | * Hitoshi Yamamoto, Mamoru Sakugawa |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
@@ -139,5 +139,4 @@ void __init init_IRQ(void) | |||
139 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; | 139 | icu_data[M32R_IRQ_SIO1_S].icucr = 0; |
140 | disable_oaks32r_irq(M32R_IRQ_SIO1_S); | 140 | disable_oaks32r_irq(M32R_IRQ_SIO1_S); |
141 | #endif /* CONFIG_SERIAL_M32R_SIO */ | 141 | #endif /* CONFIG_SERIAL_M32R_SIO */ |
142 | |||
143 | } | 142 | } |
diff --git a/arch/m32r/kernel/setup_opsput.c b/arch/m32r/kernel/setup_opsput.c index 86f4cf2a86c3..f0301f58bcce 100644 --- a/arch/m32r/kernel/setup_opsput.c +++ b/arch/m32r/kernel/setup_opsput.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Setup routines for Renesas OPSPUT Board | 4 | * Setup routines for Renesas OPSPUT Board |
5 | * | 5 | * |
6 | * Copyright (c) 2002-2004 | 6 | * Copyright (c) 2002-2005 |
7 | * Hiroyuki Kondo, Hirokazu Takata, | 7 | * Hiroyuki Kondo, Hirokazu Takata, |
8 | * Hitoshi Yamamoto, Takeo Takahashi, Mamoru Sakugawa | 8 | * Hitoshi Yamamoto, Takeo Takahashi, Mamoru Sakugawa |
9 | * | 9 | * |
@@ -439,7 +439,7 @@ void __init init_IRQ(void) | |||
439 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; | 439 | icu_data[M32R_IRQ_INT2].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; |
440 | enable_opsput_irq(M32R_IRQ_INT2); | 440 | enable_opsput_irq(M32R_IRQ_INT2); |
441 | 441 | ||
442 | //#if defined(CONFIG_VIDEO_M32R_AR) | 442 | #if defined(CONFIG_VIDEO_M32R_AR) |
443 | /* | 443 | /* |
444 | * INT3# is used for AR | 444 | * INT3# is used for AR |
445 | */ | 445 | */ |
@@ -449,9 +449,11 @@ void __init init_IRQ(void) | |||
449 | irq_desc[M32R_IRQ_INT3].depth = 1; | 449 | irq_desc[M32R_IRQ_INT3].depth = 1; |
450 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; | 450 | icu_data[M32R_IRQ_INT3].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD10; |
451 | disable_opsput_irq(M32R_IRQ_INT3); | 451 | disable_opsput_irq(M32R_IRQ_INT3); |
452 | //#endif /* CONFIG_VIDEO_M32R_AR */ | 452 | #endif /* CONFIG_VIDEO_M32R_AR */ |
453 | } | 453 | } |
454 | 454 | ||
455 | #if defined(CONFIG_SMC91X) | ||
456 | |||
455 | #define LAN_IOSTART 0x300 | 457 | #define LAN_IOSTART 0x300 |
456 | #define LAN_IOEND 0x320 | 458 | #define LAN_IOEND 0x320 |
457 | static struct resource smc91x_resources[] = { | 459 | static struct resource smc91x_resources[] = { |
@@ -473,10 +475,55 @@ static struct platform_device smc91x_device = { | |||
473 | .num_resources = ARRAY_SIZE(smc91x_resources), | 475 | .num_resources = ARRAY_SIZE(smc91x_resources), |
474 | .resource = smc91x_resources, | 476 | .resource = smc91x_resources, |
475 | }; | 477 | }; |
478 | #endif | ||
479 | |||
480 | #if defined(CONFIG_FB_S1D13XXX) | ||
481 | |||
482 | #include <video/s1d13xxxfb.h> | ||
483 | #include <asm/s1d13806.h> | ||
484 | |||
485 | static struct s1d13xxxfb_pdata s1d13xxxfb_data = { | ||
486 | .initregs = s1d13xxxfb_initregs, | ||
487 | .initregssize = ARRAY_SIZE(s1d13xxxfb_initregs), | ||
488 | .platform_init_video = NULL, | ||
489 | #ifdef CONFIG_PM | ||
490 | .platform_suspend_video = NULL, | ||
491 | .platform_resume_video = NULL, | ||
492 | #endif | ||
493 | }; | ||
494 | |||
495 | static struct resource s1d13xxxfb_resources[] = { | ||
496 | [0] = { | ||
497 | .start = 0x10600000UL, | ||
498 | .end = 0x1073FFFFUL, | ||
499 | .flags = IORESOURCE_MEM, | ||
500 | }, | ||
501 | [1] = { | ||
502 | .start = 0x10400000UL, | ||
503 | .end = 0x104001FFUL, | ||
504 | .flags = IORESOURCE_MEM, | ||
505 | } | ||
506 | }; | ||
507 | |||
508 | static struct platform_device s1d13xxxfb_device = { | ||
509 | .name = S1D_DEVICENAME, | ||
510 | .id = 0, | ||
511 | .dev = { | ||
512 | .platform_data = &s1d13xxxfb_data, | ||
513 | }, | ||
514 | .num_resources = ARRAY_SIZE(s1d13xxxfb_resources), | ||
515 | .resource = s1d13xxxfb_resources, | ||
516 | }; | ||
517 | #endif | ||
476 | 518 | ||
477 | static int __init platform_init(void) | 519 | static int __init platform_init(void) |
478 | { | 520 | { |
521 | #if defined(CONFIG_SMC91X) | ||
479 | platform_device_register(&smc91x_device); | 522 | platform_device_register(&smc91x_device); |
523 | #endif | ||
524 | #if defined(CONFIG_FB_S1D13XXX) | ||
525 | platform_device_register(&s1d13xxxfb_device); | ||
526 | #endif | ||
480 | return 0; | 527 | return 0; |
481 | } | 528 | } |
482 | arch_initcall(platform_init); | 529 | arch_initcall(platform_init); |
diff --git a/arch/ppc/platforms/pmac_cpufreq.c b/arch/ppc/platforms/pmac_cpufreq.c index 5fdd4f607a40..c0605244edda 100644 --- a/arch/ppc/platforms/pmac_cpufreq.c +++ b/arch/ppc/platforms/pmac_cpufreq.c | |||
@@ -452,7 +452,7 @@ static u32 __pmac read_gpio(struct device_node *np) | |||
452 | return offset; | 452 | return offset; |
453 | } | 453 | } |
454 | 454 | ||
455 | static int __pmac pmac_cpufreq_suspend(struct cpufreq_policy *policy, u32 state) | 455 | static int __pmac pmac_cpufreq_suspend(struct cpufreq_policy *policy, pm_message_t pmsg) |
456 | { | 456 | { |
457 | /* Ok, this could be made a bit smarter, but let's be robust for now. We | 457 | /* Ok, this could be made a bit smarter, but let's be robust for now. We |
458 | * always force a speed change to high speed before sleep, to make sure | 458 | * always force a speed change to high speed before sleep, to make sure |
diff --git a/arch/ppc64/kernel/cputable.c b/arch/ppc64/kernel/cputable.c index 1d162c7c59df..8d4c46f6f0b6 100644 --- a/arch/ppc64/kernel/cputable.c +++ b/arch/ppc64/kernel/cputable.c | |||
@@ -49,160 +49,219 @@ extern void __setup_cpu_be(unsigned long offset, struct cpu_spec* spec); | |||
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | struct cpu_spec cpu_specs[] = { | 51 | struct cpu_spec cpu_specs[] = { |
52 | { /* Power3 */ | 52 | { /* Power3 */ |
53 | 0xffff0000, 0x00400000, "POWER3 (630)", | 53 | .pvr_mask = 0xffff0000, |
54 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 54 | .pvr_value = 0x00400000, |
55 | CPU_FTR_IABR | CPU_FTR_PMC8, | 55 | .cpu_name = "POWER3 (630)", |
56 | COMMON_USER_PPC64, | 56 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
57 | 128, 128, | 57 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | |
58 | __setup_cpu_power3, | 58 | CPU_FTR_PMC8, |
59 | COMMON_PPC64_FW | 59 | .cpu_user_features = COMMON_USER_PPC64, |
60 | }, | 60 | .icache_bsize = 128, |
61 | { /* Power3+ */ | 61 | .dcache_bsize = 128, |
62 | 0xffff0000, 0x00410000, "POWER3 (630+)", | 62 | .cpu_setup = __setup_cpu_power3, |
63 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 63 | .firmware_features = COMMON_PPC64_FW, |
64 | CPU_FTR_IABR | CPU_FTR_PMC8, | 64 | }, |
65 | COMMON_USER_PPC64, | 65 | { /* Power3+ */ |
66 | 128, 128, | 66 | .pvr_mask = 0xffff0000, |
67 | __setup_cpu_power3, | 67 | .pvr_value = 0x00410000, |
68 | COMMON_PPC64_FW | 68 | .cpu_name = "POWER3 (630+)", |
69 | }, | 69 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
70 | { /* Northstar */ | 70 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | |
71 | 0xffff0000, 0x00330000, "RS64-II (northstar)", | 71 | CPU_FTR_PMC8, |
72 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 72 | .cpu_user_features = COMMON_USER_PPC64, |
73 | CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 73 | .icache_bsize = 128, |
74 | COMMON_USER_PPC64, | 74 | .dcache_bsize = 128, |
75 | 128, 128, | 75 | .cpu_setup = __setup_cpu_power3, |
76 | __setup_cpu_power3, | 76 | .firmware_features = COMMON_PPC64_FW, |
77 | COMMON_PPC64_FW | 77 | }, |
78 | }, | 78 | { /* Northstar */ |
79 | { /* Pulsar */ | 79 | .pvr_mask = 0xffff0000, |
80 | 0xffff0000, 0x00340000, "RS64-III (pulsar)", | 80 | .pvr_value = 0x00330000, |
81 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 81 | .cpu_name = "RS64-II (northstar)", |
82 | CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 82 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
83 | COMMON_USER_PPC64, | 83 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | |
84 | 128, 128, | 84 | CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL, |
85 | __setup_cpu_power3, | 85 | .cpu_user_features = COMMON_USER_PPC64, |
86 | COMMON_PPC64_FW | 86 | .icache_bsize = 128, |
87 | }, | 87 | .dcache_bsize = 128, |
88 | { /* I-star */ | 88 | .cpu_setup = __setup_cpu_power3, |
89 | 0xffff0000, 0x00360000, "RS64-III (icestar)", | 89 | .firmware_features = COMMON_PPC64_FW, |
90 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 90 | }, |
91 | CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 91 | { /* Pulsar */ |
92 | COMMON_USER_PPC64, | 92 | .pvr_mask = 0xffff0000, |
93 | 128, 128, | 93 | .pvr_value = 0x00340000, |
94 | __setup_cpu_power3, | 94 | .cpu_name = "RS64-III (pulsar)", |
95 | COMMON_PPC64_FW | 95 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
96 | }, | 96 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | |
97 | { /* S-star */ | 97 | CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL, |
98 | 0xffff0000, 0x00370000, "RS64-IV (sstar)", | 98 | .cpu_user_features = COMMON_USER_PPC64, |
99 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 99 | .icache_bsize = 128, |
100 | CPU_FTR_IABR | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 100 | .dcache_bsize = 128, |
101 | COMMON_USER_PPC64, | 101 | .cpu_setup = __setup_cpu_power3, |
102 | 128, 128, | 102 | .firmware_features = COMMON_PPC64_FW, |
103 | __setup_cpu_power3, | 103 | }, |
104 | COMMON_PPC64_FW | 104 | { /* I-star */ |
105 | }, | 105 | .pvr_mask = 0xffff0000, |
106 | { /* Power4 */ | 106 | .pvr_value = 0x00360000, |
107 | 0xffff0000, 0x00350000, "POWER4 (gp)", | 107 | .cpu_name = "RS64-III (icestar)", |
108 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 108 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
109 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 109 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | |
110 | COMMON_USER_PPC64, | 110 | CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL, |
111 | 128, 128, | 111 | .cpu_user_features = COMMON_USER_PPC64, |
112 | __setup_cpu_power4, | 112 | .icache_bsize = 128, |
113 | COMMON_PPC64_FW | 113 | .dcache_bsize = 128, |
114 | }, | 114 | .cpu_setup = __setup_cpu_power3, |
115 | { /* Power4+ */ | 115 | .firmware_features = COMMON_PPC64_FW, |
116 | 0xffff0000, 0x00380000, "POWER4+ (gq)", | 116 | }, |
117 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 117 | { /* S-star */ |
118 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 118 | .pvr_mask = 0xffff0000, |
119 | COMMON_USER_PPC64, | 119 | .pvr_value = 0x00370000, |
120 | 128, 128, | 120 | .cpu_name = "RS64-IV (sstar)", |
121 | __setup_cpu_power4, | 121 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
122 | COMMON_PPC64_FW | 122 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR | |
123 | }, | 123 | CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL, |
124 | { /* PPC970 */ | 124 | .cpu_user_features = COMMON_USER_PPC64, |
125 | 0xffff0000, 0x00390000, "PPC970", | 125 | .icache_bsize = 128, |
126 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 126 | .dcache_bsize = 128, |
127 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | | 127 | .cpu_setup = __setup_cpu_power3, |
128 | CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 128 | .firmware_features = COMMON_PPC64_FW, |
129 | COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP, | 129 | }, |
130 | 128, 128, | 130 | { /* Power4 */ |
131 | __setup_cpu_ppc970, | 131 | .pvr_mask = 0xffff0000, |
132 | COMMON_PPC64_FW | 132 | .pvr_value = 0x00350000, |
133 | }, | 133 | .cpu_name = "POWER4 (gp)", |
134 | { /* PPC970FX */ | 134 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
135 | 0xffff0000, 0x003c0000, "PPC970FX", | 135 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | |
136 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 136 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA, |
137 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | | 137 | .cpu_user_features = COMMON_USER_PPC64, |
138 | CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA, | 138 | .icache_bsize = 128, |
139 | COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP, | 139 | .dcache_bsize = 128, |
140 | 128, 128, | 140 | .cpu_setup = __setup_cpu_power4, |
141 | __setup_cpu_ppc970, | 141 | .firmware_features = COMMON_PPC64_FW, |
142 | COMMON_PPC64_FW | 142 | }, |
143 | }, | 143 | { /* Power4+ */ |
144 | { /* Power5 */ | 144 | .pvr_mask = 0xffff0000, |
145 | 0xffff0000, 0x003a0000, "POWER5 (gr)", | 145 | .pvr_value = 0x00380000, |
146 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 146 | .cpu_name = "POWER4+ (gq)", |
147 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT | | 147 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
148 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | | 148 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | |
149 | CPU_FTR_MMCRA_SIHV, | 149 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA, |
150 | COMMON_USER_PPC64, | 150 | .cpu_user_features = COMMON_USER_PPC64, |
151 | 128, 128, | 151 | .icache_bsize = 128, |
152 | __setup_cpu_power4, | 152 | .dcache_bsize = 128, |
153 | COMMON_PPC64_FW | 153 | .cpu_setup = __setup_cpu_power4, |
154 | }, | 154 | .firmware_features = COMMON_PPC64_FW, |
155 | { /* Power5 */ | 155 | }, |
156 | 0xffff0000, 0x003b0000, "POWER5 (gs)", | 156 | { /* PPC970 */ |
157 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 157 | .pvr_mask = 0xffff0000, |
158 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT | | 158 | .pvr_value = 0x00390000, |
159 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | | 159 | .cpu_name = "PPC970", |
160 | CPU_FTR_MMCRA_SIHV, | 160 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
161 | COMMON_USER_PPC64, | 161 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | |
162 | 128, 128, | 162 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | |
163 | __setup_cpu_power4, | 163 | CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA, |
164 | COMMON_PPC64_FW | 164 | .cpu_user_features = COMMON_USER_PPC64 | |
165 | }, | 165 | PPC_FEATURE_HAS_ALTIVEC_COMP, |
166 | { /* BE DD1.x */ | 166 | .icache_bsize = 128, |
167 | 0xffff0000, 0x00700000, "Broadband Engine", | 167 | .dcache_bsize = 128, |
168 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 168 | .cpu_setup = __setup_cpu_ppc970, |
169 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | | 169 | .firmware_features = COMMON_PPC64_FW, |
170 | CPU_FTR_SMT, | 170 | }, |
171 | COMMON_USER_PPC64 | PPC_FEATURE_HAS_ALTIVEC_COMP, | 171 | { /* PPC970FX */ |
172 | 128, 128, | 172 | .pvr_mask = 0xffff0000, |
173 | __setup_cpu_be, | 173 | .pvr_value = 0x003c0000, |
174 | COMMON_PPC64_FW | 174 | .cpu_name = "PPC970FX", |
175 | }, | 175 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | |
176 | { /* default match */ | 176 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | |
177 | 0x00000000, 0x00000000, "POWER4 (compatible)", | 177 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | |
178 | CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | 178 | CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA, |
179 | CPU_FTR_PPCAS_ARCH_V2, | 179 | .cpu_user_features = COMMON_USER_PPC64 | |
180 | COMMON_USER_PPC64, | 180 | PPC_FEATURE_HAS_ALTIVEC_COMP, |
181 | 128, 128, | 181 | .icache_bsize = 128, |
182 | __setup_cpu_power4, | 182 | .dcache_bsize = 128, |
183 | COMMON_PPC64_FW | 183 | .cpu_setup = __setup_cpu_ppc970, |
184 | } | 184 | .firmware_features = COMMON_PPC64_FW, |
185 | }, | ||
186 | { /* Power5 */ | ||
187 | .pvr_mask = 0xffff0000, | ||
188 | .pvr_value = 0x003a0000, | ||
189 | .cpu_name = "POWER5 (gr)", | ||
190 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | | ||
191 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | ||
192 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT | | ||
193 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | | ||
194 | CPU_FTR_MMCRA_SIHV, | ||
195 | .cpu_user_features = COMMON_USER_PPC64, | ||
196 | .icache_bsize = 128, | ||
197 | .dcache_bsize = 128, | ||
198 | .cpu_setup = __setup_cpu_power4, | ||
199 | .firmware_features = COMMON_PPC64_FW, | ||
200 | }, | ||
201 | { /* Power5 */ | ||
202 | .pvr_mask = 0xffff0000, | ||
203 | .pvr_value = 0x003b0000, | ||
204 | .cpu_name = "POWER5 (gs)", | ||
205 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | | ||
206 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | ||
207 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT | | ||
208 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | | ||
209 | CPU_FTR_MMCRA_SIHV, | ||
210 | .cpu_user_features = COMMON_USER_PPC64, | ||
211 | .icache_bsize = 128, | ||
212 | .dcache_bsize = 128, | ||
213 | .cpu_setup = __setup_cpu_power4, | ||
214 | .firmware_features = COMMON_PPC64_FW, | ||
215 | }, | ||
216 | { /* BE DD1.x */ | ||
217 | .pvr_mask = 0xffff0000, | ||
218 | .pvr_value = 0x00700000, | ||
219 | .cpu_name = "Broadband Engine", | ||
220 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | | ||
221 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | ||
222 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | | ||
223 | CPU_FTR_SMT, | ||
224 | .cpu_user_features = COMMON_USER_PPC64 | | ||
225 | PPC_FEATURE_HAS_ALTIVEC_COMP, | ||
226 | .icache_bsize = 128, | ||
227 | .dcache_bsize = 128, | ||
228 | .cpu_setup = __setup_cpu_be, | ||
229 | .firmware_features = COMMON_PPC64_FW, | ||
230 | }, | ||
231 | { /* default match */ | ||
232 | .pvr_mask = 0x00000000, | ||
233 | .pvr_value = 0x00000000, | ||
234 | .cpu_name = "POWER4 (compatible)", | ||
235 | .cpu_features = CPU_FTR_SPLIT_ID_CACHE | | ||
236 | CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | | ||
237 | CPU_FTR_PPCAS_ARCH_V2, | ||
238 | .cpu_user_features = COMMON_USER_PPC64, | ||
239 | .icache_bsize = 128, | ||
240 | .dcache_bsize = 128, | ||
241 | .cpu_setup = __setup_cpu_power4, | ||
242 | .firmware_features = COMMON_PPC64_FW, | ||
243 | } | ||
185 | }; | 244 | }; |
186 | 245 | ||
187 | firmware_feature_t firmware_features_table[FIRMWARE_MAX_FEATURES] = { | 246 | firmware_feature_t firmware_features_table[FIRMWARE_MAX_FEATURES] = { |
188 | {FW_FEATURE_PFT, "hcall-pft"}, | 247 | {FW_FEATURE_PFT, "hcall-pft"}, |
189 | {FW_FEATURE_TCE, "hcall-tce"}, | 248 | {FW_FEATURE_TCE, "hcall-tce"}, |
190 | {FW_FEATURE_SPRG0, "hcall-sprg0"}, | 249 | {FW_FEATURE_SPRG0, "hcall-sprg0"}, |
191 | {FW_FEATURE_DABR, "hcall-dabr"}, | 250 | {FW_FEATURE_DABR, "hcall-dabr"}, |
192 | {FW_FEATURE_COPY, "hcall-copy"}, | 251 | {FW_FEATURE_COPY, "hcall-copy"}, |
193 | {FW_FEATURE_ASR, "hcall-asr"}, | 252 | {FW_FEATURE_ASR, "hcall-asr"}, |
194 | {FW_FEATURE_DEBUG, "hcall-debug"}, | 253 | {FW_FEATURE_DEBUG, "hcall-debug"}, |
195 | {FW_FEATURE_PERF, "hcall-perf"}, | 254 | {FW_FEATURE_PERF, "hcall-perf"}, |
196 | {FW_FEATURE_DUMP, "hcall-dump"}, | 255 | {FW_FEATURE_DUMP, "hcall-dump"}, |
197 | {FW_FEATURE_INTERRUPT, "hcall-interrupt"}, | 256 | {FW_FEATURE_INTERRUPT, "hcall-interrupt"}, |
198 | {FW_FEATURE_MIGRATE, "hcall-migrate"}, | 257 | {FW_FEATURE_MIGRATE, "hcall-migrate"}, |
199 | {FW_FEATURE_PERFMON, "hcall-perfmon"}, | 258 | {FW_FEATURE_PERFMON, "hcall-perfmon"}, |
200 | {FW_FEATURE_CRQ, "hcall-crq"}, | 259 | {FW_FEATURE_CRQ, "hcall-crq"}, |
201 | {FW_FEATURE_VIO, "hcall-vio"}, | 260 | {FW_FEATURE_VIO, "hcall-vio"}, |
202 | {FW_FEATURE_RDMA, "hcall-rdma"}, | 261 | {FW_FEATURE_RDMA, "hcall-rdma"}, |
203 | {FW_FEATURE_LLAN, "hcall-lLAN"}, | 262 | {FW_FEATURE_LLAN, "hcall-lLAN"}, |
204 | {FW_FEATURE_BULK, "hcall-bulk"}, | 263 | {FW_FEATURE_BULK, "hcall-bulk"}, |
205 | {FW_FEATURE_XDABR, "hcall-xdabr"}, | 264 | {FW_FEATURE_XDABR, "hcall-xdabr"}, |
206 | {FW_FEATURE_MULTITCE, "hcall-multi-tce"}, | 265 | {FW_FEATURE_MULTITCE, "hcall-multi-tce"}, |
207 | {FW_FEATURE_SPLPAR, "hcall-splpar"}, | 266 | {FW_FEATURE_SPLPAR, "hcall-splpar"}, |
208 | }; | 267 | }; |
diff --git a/arch/ppc64/kernel/head.S b/arch/ppc64/kernel/head.S index 675c2708588f..93ebcac0d5a2 100644 --- a/arch/ppc64/kernel/head.S +++ b/arch/ppc64/kernel/head.S | |||
@@ -308,6 +308,7 @@ exception_marker: | |||
308 | label##_pSeries: \ | 308 | label##_pSeries: \ |
309 | HMT_MEDIUM; \ | 309 | HMT_MEDIUM; \ |
310 | mtspr SPRG1,r13; /* save r13 */ \ | 310 | mtspr SPRG1,r13; /* save r13 */ \ |
311 | RUNLATCH_ON(r13); \ | ||
311 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) | 312 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common) |
312 | 313 | ||
313 | #define STD_EXCEPTION_ISERIES(n, label, area) \ | 314 | #define STD_EXCEPTION_ISERIES(n, label, area) \ |
@@ -315,6 +316,7 @@ label##_pSeries: \ | |||
315 | label##_iSeries: \ | 316 | label##_iSeries: \ |
316 | HMT_MEDIUM; \ | 317 | HMT_MEDIUM; \ |
317 | mtspr SPRG1,r13; /* save r13 */ \ | 318 | mtspr SPRG1,r13; /* save r13 */ \ |
319 | RUNLATCH_ON(r13); \ | ||
318 | EXCEPTION_PROLOG_ISERIES_1(area); \ | 320 | EXCEPTION_PROLOG_ISERIES_1(area); \ |
319 | EXCEPTION_PROLOG_ISERIES_2; \ | 321 | EXCEPTION_PROLOG_ISERIES_2; \ |
320 | b label##_common | 322 | b label##_common |
@@ -324,6 +326,7 @@ label##_iSeries: \ | |||
324 | label##_iSeries: \ | 326 | label##_iSeries: \ |
325 | HMT_MEDIUM; \ | 327 | HMT_MEDIUM; \ |
326 | mtspr SPRG1,r13; /* save r13 */ \ | 328 | mtspr SPRG1,r13; /* save r13 */ \ |
329 | RUNLATCH_ON(r13); \ | ||
327 | EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN); \ | 330 | EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN); \ |
328 | lbz r10,PACAPROCENABLED(r13); \ | 331 | lbz r10,PACAPROCENABLED(r13); \ |
329 | cmpwi 0,r10,0; \ | 332 | cmpwi 0,r10,0; \ |
@@ -393,6 +396,7 @@ __start_interrupts: | |||
393 | _machine_check_pSeries: | 396 | _machine_check_pSeries: |
394 | HMT_MEDIUM | 397 | HMT_MEDIUM |
395 | mtspr SPRG1,r13 /* save r13 */ | 398 | mtspr SPRG1,r13 /* save r13 */ |
399 | RUNLATCH_ON(r13) | ||
396 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 400 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) |
397 | 401 | ||
398 | . = 0x300 | 402 | . = 0x300 |
@@ -419,6 +423,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_SLB) | |||
419 | data_access_slb_pSeries: | 423 | data_access_slb_pSeries: |
420 | HMT_MEDIUM | 424 | HMT_MEDIUM |
421 | mtspr SPRG1,r13 | 425 | mtspr SPRG1,r13 |
426 | RUNLATCH_ON(r13) | ||
422 | mfspr r13,SPRG3 /* get paca address into r13 */ | 427 | mfspr r13,SPRG3 /* get paca address into r13 */ |
423 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ | 428 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ |
424 | std r10,PACA_EXSLB+EX_R10(r13) | 429 | std r10,PACA_EXSLB+EX_R10(r13) |
@@ -439,6 +444,7 @@ data_access_slb_pSeries: | |||
439 | instruction_access_slb_pSeries: | 444 | instruction_access_slb_pSeries: |
440 | HMT_MEDIUM | 445 | HMT_MEDIUM |
441 | mtspr SPRG1,r13 | 446 | mtspr SPRG1,r13 |
447 | RUNLATCH_ON(r13) | ||
442 | mfspr r13,SPRG3 /* get paca address into r13 */ | 448 | mfspr r13,SPRG3 /* get paca address into r13 */ |
443 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ | 449 | std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ |
444 | std r10,PACA_EXSLB+EX_R10(r13) | 450 | std r10,PACA_EXSLB+EX_R10(r13) |
@@ -464,6 +470,7 @@ instruction_access_slb_pSeries: | |||
464 | .globl system_call_pSeries | 470 | .globl system_call_pSeries |
465 | system_call_pSeries: | 471 | system_call_pSeries: |
466 | HMT_MEDIUM | 472 | HMT_MEDIUM |
473 | RUNLATCH_ON(r9) | ||
467 | mr r9,r13 | 474 | mr r9,r13 |
468 | mfmsr r10 | 475 | mfmsr r10 |
469 | mfspr r13,SPRG3 | 476 | mfspr r13,SPRG3 |
@@ -707,11 +714,13 @@ fwnmi_data_area: | |||
707 | system_reset_fwnmi: | 714 | system_reset_fwnmi: |
708 | HMT_MEDIUM | 715 | HMT_MEDIUM |
709 | mtspr SPRG1,r13 /* save r13 */ | 716 | mtspr SPRG1,r13 /* save r13 */ |
717 | RUNLATCH_ON(r13) | ||
710 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common) | 718 | EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common) |
711 | .globl machine_check_fwnmi | 719 | .globl machine_check_fwnmi |
712 | machine_check_fwnmi: | 720 | machine_check_fwnmi: |
713 | HMT_MEDIUM | 721 | HMT_MEDIUM |
714 | mtspr SPRG1,r13 /* save r13 */ | 722 | mtspr SPRG1,r13 /* save r13 */ |
723 | RUNLATCH_ON(r13) | ||
715 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) | 724 | EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common) |
716 | 725 | ||
717 | /* | 726 | /* |
@@ -848,6 +857,7 @@ unrecov_fer: | |||
848 | .align 7 | 857 | .align 7 |
849 | .globl data_access_common | 858 | .globl data_access_common |
850 | data_access_common: | 859 | data_access_common: |
860 | RUNLATCH_ON(r10) /* It wont fit in the 0x300 handler */ | ||
851 | mfspr r10,DAR | 861 | mfspr r10,DAR |
852 | std r10,PACA_EXGEN+EX_DAR(r13) | 862 | std r10,PACA_EXGEN+EX_DAR(r13) |
853 | mfspr r10,DSISR | 863 | mfspr r10,DSISR |
diff --git a/arch/ppc64/kernel/hvconsole.c b/arch/ppc64/kernel/hvconsole.c index c72fb8ffe974..138e128a3886 100644 --- a/arch/ppc64/kernel/hvconsole.c +++ b/arch/ppc64/kernel/hvconsole.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <asm/hvcall.h> | 28 | #include <asm/hvcall.h> |
29 | #include <asm/hvconsole.h> | 29 | #include <asm/hvconsole.h> |
30 | #include <asm/prom.h> | ||
31 | 30 | ||
32 | /** | 31 | /** |
33 | * hvc_get_chars - retrieve characters from firmware for denoted vterm adatper | 32 | * hvc_get_chars - retrieve characters from firmware for denoted vterm adatper |
@@ -42,29 +41,14 @@ int hvc_get_chars(uint32_t vtermno, char *buf, int count) | |||
42 | unsigned long got; | 41 | unsigned long got; |
43 | 42 | ||
44 | if (plpar_hcall(H_GET_TERM_CHAR, vtermno, 0, 0, 0, &got, | 43 | if (plpar_hcall(H_GET_TERM_CHAR, vtermno, 0, 0, 0, &got, |
45 | (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) { | 44 | (unsigned long *)buf, (unsigned long *)buf+1) == H_Success) |
46 | /* | ||
47 | * Work around a HV bug where it gives us a null | ||
48 | * after every \r. -- paulus | ||
49 | */ | ||
50 | if (got > 0) { | ||
51 | int i; | ||
52 | for (i = 1; i < got; ++i) { | ||
53 | if (buf[i] == 0 && buf[i-1] == '\r') { | ||
54 | --got; | ||
55 | if (i < got) | ||
56 | memmove(&buf[i], &buf[i+1], | ||
57 | got - i); | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | return got; | 45 | return got; |
62 | } | ||
63 | return 0; | 46 | return 0; |
64 | } | 47 | } |
65 | 48 | ||
66 | EXPORT_SYMBOL(hvc_get_chars); | 49 | EXPORT_SYMBOL(hvc_get_chars); |
67 | 50 | ||
51 | |||
68 | /** | 52 | /** |
69 | * hvc_put_chars: send characters to firmware for denoted vterm adapter | 53 | * hvc_put_chars: send characters to firmware for denoted vterm adapter |
70 | * @vtermno: The vtermno or unit_address of the adapter from which the data | 54 | * @vtermno: The vtermno or unit_address of the adapter from which the data |
@@ -88,34 +72,3 @@ int hvc_put_chars(uint32_t vtermno, const char *buf, int count) | |||
88 | } | 72 | } |
89 | 73 | ||
90 | EXPORT_SYMBOL(hvc_put_chars); | 74 | EXPORT_SYMBOL(hvc_put_chars); |
91 | |||
92 | /* | ||
93 | * We hope/assume that the first vty found corresponds to the first console | ||
94 | * device. | ||
95 | */ | ||
96 | int hvc_find_vtys(void) | ||
97 | { | ||
98 | struct device_node *vty; | ||
99 | int num_found = 0; | ||
100 | |||
101 | for (vty = of_find_node_by_name(NULL, "vty"); vty != NULL; | ||
102 | vty = of_find_node_by_name(vty, "vty")) { | ||
103 | uint32_t *vtermno; | ||
104 | |||
105 | /* We have statically defined space for only a certain number of | ||
106 | * console adapters. */ | ||
107 | if (num_found >= MAX_NR_HVC_CONSOLES) | ||
108 | break; | ||
109 | |||
110 | vtermno = (uint32_t *)get_property(vty, "reg", NULL); | ||
111 | if (!vtermno) | ||
112 | continue; | ||
113 | |||
114 | if (device_is_compatible(vty, "hvterm1")) { | ||
115 | hvc_instantiate(*vtermno, num_found); | ||
116 | ++num_found; | ||
117 | } | ||
118 | } | ||
119 | |||
120 | return num_found; | ||
121 | } | ||
diff --git a/arch/ppc64/kernel/iSeries_setup.c b/arch/ppc64/kernel/iSeries_setup.c index b3f770f6d402..077c82fc9f3a 100644 --- a/arch/ppc64/kernel/iSeries_setup.c +++ b/arch/ppc64/kernel/iSeries_setup.c | |||
@@ -834,6 +834,92 @@ static int __init iSeries_src_init(void) | |||
834 | 834 | ||
835 | late_initcall(iSeries_src_init); | 835 | late_initcall(iSeries_src_init); |
836 | 836 | ||
837 | static inline void process_iSeries_events(void) | ||
838 | { | ||
839 | asm volatile ("li 0,0x5555; sc" : : : "r0", "r3"); | ||
840 | } | ||
841 | |||
842 | static void yield_shared_processor(void) | ||
843 | { | ||
844 | unsigned long tb; | ||
845 | |||
846 | HvCall_setEnabledInterrupts(HvCall_MaskIPI | | ||
847 | HvCall_MaskLpEvent | | ||
848 | HvCall_MaskLpProd | | ||
849 | HvCall_MaskTimeout); | ||
850 | |||
851 | tb = get_tb(); | ||
852 | /* Compute future tb value when yield should expire */ | ||
853 | HvCall_yieldProcessor(HvCall_YieldTimed, tb+tb_ticks_per_jiffy); | ||
854 | |||
855 | /* | ||
856 | * The decrementer stops during the yield. Force a fake decrementer | ||
857 | * here and let the timer_interrupt code sort out the actual time. | ||
858 | */ | ||
859 | get_paca()->lppaca.int_dword.fields.decr_int = 1; | ||
860 | process_iSeries_events(); | ||
861 | } | ||
862 | |||
863 | static int iseries_shared_idle(void) | ||
864 | { | ||
865 | while (1) { | ||
866 | while (!need_resched() && !hvlpevent_is_pending()) { | ||
867 | local_irq_disable(); | ||
868 | ppc64_runlatch_off(); | ||
869 | |||
870 | /* Recheck with irqs off */ | ||
871 | if (!need_resched() && !hvlpevent_is_pending()) | ||
872 | yield_shared_processor(); | ||
873 | |||
874 | HMT_medium(); | ||
875 | local_irq_enable(); | ||
876 | } | ||
877 | |||
878 | ppc64_runlatch_on(); | ||
879 | |||
880 | if (hvlpevent_is_pending()) | ||
881 | process_iSeries_events(); | ||
882 | |||
883 | schedule(); | ||
884 | } | ||
885 | |||
886 | return 0; | ||
887 | } | ||
888 | |||
889 | static int iseries_dedicated_idle(void) | ||
890 | { | ||
891 | long oldval; | ||
892 | |||
893 | while (1) { | ||
894 | oldval = test_and_clear_thread_flag(TIF_NEED_RESCHED); | ||
895 | |||
896 | if (!oldval) { | ||
897 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
898 | |||
899 | while (!need_resched()) { | ||
900 | ppc64_runlatch_off(); | ||
901 | HMT_low(); | ||
902 | |||
903 | if (hvlpevent_is_pending()) { | ||
904 | HMT_medium(); | ||
905 | ppc64_runlatch_on(); | ||
906 | process_iSeries_events(); | ||
907 | } | ||
908 | } | ||
909 | |||
910 | HMT_medium(); | ||
911 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
912 | } else { | ||
913 | set_need_resched(); | ||
914 | } | ||
915 | |||
916 | ppc64_runlatch_on(); | ||
917 | schedule(); | ||
918 | } | ||
919 | |||
920 | return 0; | ||
921 | } | ||
922 | |||
837 | #ifndef CONFIG_PCI | 923 | #ifndef CONFIG_PCI |
838 | void __init iSeries_init_IRQ(void) { } | 924 | void __init iSeries_init_IRQ(void) { } |
839 | #endif | 925 | #endif |
@@ -859,5 +945,13 @@ void __init iSeries_early_setup(void) | |||
859 | ppc_md.get_rtc_time = iSeries_get_rtc_time; | 945 | ppc_md.get_rtc_time = iSeries_get_rtc_time; |
860 | ppc_md.calibrate_decr = iSeries_calibrate_decr; | 946 | ppc_md.calibrate_decr = iSeries_calibrate_decr; |
861 | ppc_md.progress = iSeries_progress; | 947 | ppc_md.progress = iSeries_progress; |
948 | |||
949 | if (get_paca()->lppaca.shared_proc) { | ||
950 | ppc_md.idle_loop = iseries_shared_idle; | ||
951 | printk(KERN_INFO "Using shared processor idle loop\n"); | ||
952 | } else { | ||
953 | ppc_md.idle_loop = iseries_dedicated_idle; | ||
954 | printk(KERN_INFO "Using dedicated idle loop\n"); | ||
955 | } | ||
862 | } | 956 | } |
863 | 957 | ||
diff --git a/arch/ppc64/kernel/idle.c b/arch/ppc64/kernel/idle.c index 08952c7e6216..954395d42636 100644 --- a/arch/ppc64/kernel/idle.c +++ b/arch/ppc64/kernel/idle.c | |||
@@ -20,109 +20,18 @@ | |||
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/smp.h> | 21 | #include <linux/smp.h> |
22 | #include <linux/cpu.h> | 22 | #include <linux/cpu.h> |
23 | #include <linux/module.h> | ||
24 | #include <linux/sysctl.h> | 23 | #include <linux/sysctl.h> |
25 | #include <linux/smp.h> | ||
26 | 24 | ||
27 | #include <asm/system.h> | 25 | #include <asm/system.h> |
28 | #include <asm/processor.h> | 26 | #include <asm/processor.h> |
29 | #include <asm/mmu.h> | ||
30 | #include <asm/cputable.h> | 27 | #include <asm/cputable.h> |
31 | #include <asm/time.h> | 28 | #include <asm/time.h> |
32 | #include <asm/iSeries/HvCall.h> | ||
33 | #include <asm/iSeries/ItLpQueue.h> | ||
34 | #include <asm/plpar_wrappers.h> | ||
35 | #include <asm/systemcfg.h> | 29 | #include <asm/systemcfg.h> |
30 | #include <asm/machdep.h> | ||
36 | 31 | ||
37 | extern void power4_idle(void); | 32 | extern void power4_idle(void); |
38 | 33 | ||
39 | static int (*idle_loop)(void); | 34 | int default_idle(void) |
40 | |||
41 | #ifdef CONFIG_PPC_ISERIES | ||
42 | static unsigned long maxYieldTime = 0; | ||
43 | static unsigned long minYieldTime = 0xffffffffffffffffUL; | ||
44 | |||
45 | static inline void process_iSeries_events(void) | ||
46 | { | ||
47 | asm volatile ("li 0,0x5555; sc" : : : "r0", "r3"); | ||
48 | } | ||
49 | |||
50 | static void yield_shared_processor(void) | ||
51 | { | ||
52 | unsigned long tb; | ||
53 | unsigned long yieldTime; | ||
54 | |||
55 | HvCall_setEnabledInterrupts(HvCall_MaskIPI | | ||
56 | HvCall_MaskLpEvent | | ||
57 | HvCall_MaskLpProd | | ||
58 | HvCall_MaskTimeout); | ||
59 | |||
60 | tb = get_tb(); | ||
61 | /* Compute future tb value when yield should expire */ | ||
62 | HvCall_yieldProcessor(HvCall_YieldTimed, tb+tb_ticks_per_jiffy); | ||
63 | |||
64 | yieldTime = get_tb() - tb; | ||
65 | if (yieldTime > maxYieldTime) | ||
66 | maxYieldTime = yieldTime; | ||
67 | |||
68 | if (yieldTime < minYieldTime) | ||
69 | minYieldTime = yieldTime; | ||
70 | |||
71 | /* | ||
72 | * The decrementer stops during the yield. Force a fake decrementer | ||
73 | * here and let the timer_interrupt code sort out the actual time. | ||
74 | */ | ||
75 | get_paca()->lppaca.int_dword.fields.decr_int = 1; | ||
76 | process_iSeries_events(); | ||
77 | } | ||
78 | |||
79 | static int iSeries_idle(void) | ||
80 | { | ||
81 | struct paca_struct *lpaca; | ||
82 | long oldval; | ||
83 | |||
84 | /* ensure iSeries run light will be out when idle */ | ||
85 | ppc64_runlatch_off(); | ||
86 | |||
87 | lpaca = get_paca(); | ||
88 | |||
89 | while (1) { | ||
90 | if (lpaca->lppaca.shared_proc) { | ||
91 | if (hvlpevent_is_pending()) | ||
92 | process_iSeries_events(); | ||
93 | if (!need_resched()) | ||
94 | yield_shared_processor(); | ||
95 | } else { | ||
96 | oldval = test_and_clear_thread_flag(TIF_NEED_RESCHED); | ||
97 | |||
98 | if (!oldval) { | ||
99 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
100 | |||
101 | while (!need_resched()) { | ||
102 | HMT_medium(); | ||
103 | if (hvlpevent_is_pending()) | ||
104 | process_iSeries_events(); | ||
105 | HMT_low(); | ||
106 | } | ||
107 | |||
108 | HMT_medium(); | ||
109 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
110 | } else { | ||
111 | set_need_resched(); | ||
112 | } | ||
113 | } | ||
114 | |||
115 | ppc64_runlatch_on(); | ||
116 | schedule(); | ||
117 | ppc64_runlatch_off(); | ||
118 | } | ||
119 | |||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | #else | ||
124 | |||
125 | static int default_idle(void) | ||
126 | { | 35 | { |
127 | long oldval; | 36 | long oldval; |
128 | unsigned int cpu = smp_processor_id(); | 37 | unsigned int cpu = smp_processor_id(); |
@@ -134,7 +43,8 @@ static int default_idle(void) | |||
134 | set_thread_flag(TIF_POLLING_NRFLAG); | 43 | set_thread_flag(TIF_POLLING_NRFLAG); |
135 | 44 | ||
136 | while (!need_resched() && !cpu_is_offline(cpu)) { | 45 | while (!need_resched() && !cpu_is_offline(cpu)) { |
137 | barrier(); | 46 | ppc64_runlatch_off(); |
47 | |||
138 | /* | 48 | /* |
139 | * Go into low thread priority and possibly | 49 | * Go into low thread priority and possibly |
140 | * low power mode. | 50 | * low power mode. |
@@ -149,6 +59,7 @@ static int default_idle(void) | |||
149 | set_need_resched(); | 59 | set_need_resched(); |
150 | } | 60 | } |
151 | 61 | ||
62 | ppc64_runlatch_on(); | ||
152 | schedule(); | 63 | schedule(); |
153 | if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING) | 64 | if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING) |
154 | cpu_die(); | 65 | cpu_die(); |
@@ -157,127 +68,19 @@ static int default_idle(void) | |||
157 | return 0; | 68 | return 0; |
158 | } | 69 | } |
159 | 70 | ||
160 | #ifdef CONFIG_PPC_PSERIES | 71 | int native_idle(void) |
161 | |||
162 | DECLARE_PER_CPU(unsigned long, smt_snooze_delay); | ||
163 | |||
164 | int dedicated_idle(void) | ||
165 | { | 72 | { |
166 | long oldval; | ||
167 | struct paca_struct *lpaca = get_paca(), *ppaca; | ||
168 | unsigned long start_snooze; | ||
169 | unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay); | ||
170 | unsigned int cpu = smp_processor_id(); | ||
171 | |||
172 | ppaca = &paca[cpu ^ 1]; | ||
173 | |||
174 | while (1) { | 73 | while (1) { |
175 | /* | 74 | ppc64_runlatch_off(); |
176 | * Indicate to the HV that we are idle. Now would be | ||
177 | * a good time to find other work to dispatch. | ||
178 | */ | ||
179 | lpaca->lppaca.idle = 1; | ||
180 | |||
181 | oldval = test_and_clear_thread_flag(TIF_NEED_RESCHED); | ||
182 | if (!oldval) { | ||
183 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
184 | start_snooze = __get_tb() + | ||
185 | *smt_snooze_delay * tb_ticks_per_usec; | ||
186 | while (!need_resched() && !cpu_is_offline(cpu)) { | ||
187 | /* | ||
188 | * Go into low thread priority and possibly | ||
189 | * low power mode. | ||
190 | */ | ||
191 | HMT_low(); | ||
192 | HMT_very_low(); | ||
193 | |||
194 | if (*smt_snooze_delay == 0 || | ||
195 | __get_tb() < start_snooze) | ||
196 | continue; | ||
197 | |||
198 | HMT_medium(); | ||
199 | |||
200 | if (!(ppaca->lppaca.idle)) { | ||
201 | local_irq_disable(); | ||
202 | |||
203 | /* | ||
204 | * We are about to sleep the thread | ||
205 | * and so wont be polling any | ||
206 | * more. | ||
207 | */ | ||
208 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
209 | |||
210 | /* | ||
211 | * SMT dynamic mode. Cede will result | ||
212 | * in this thread going dormant, if the | ||
213 | * partner thread is still doing work. | ||
214 | * Thread wakes up if partner goes idle, | ||
215 | * an interrupt is presented, or a prod | ||
216 | * occurs. Returning from the cede | ||
217 | * enables external interrupts. | ||
218 | */ | ||
219 | if (!need_resched()) | ||
220 | cede_processor(); | ||
221 | else | ||
222 | local_irq_enable(); | ||
223 | } else { | ||
224 | /* | ||
225 | * Give the HV an opportunity at the | ||
226 | * processor, since we are not doing | ||
227 | * any work. | ||
228 | */ | ||
229 | poll_pending(); | ||
230 | } | ||
231 | } | ||
232 | |||
233 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
234 | } else { | ||
235 | set_need_resched(); | ||
236 | } | ||
237 | |||
238 | HMT_medium(); | ||
239 | lpaca->lppaca.idle = 0; | ||
240 | schedule(); | ||
241 | if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING) | ||
242 | cpu_die(); | ||
243 | } | ||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static int shared_idle(void) | ||
248 | { | ||
249 | struct paca_struct *lpaca = get_paca(); | ||
250 | unsigned int cpu = smp_processor_id(); | ||
251 | |||
252 | while (1) { | ||
253 | /* | ||
254 | * Indicate to the HV that we are idle. Now would be | ||
255 | * a good time to find other work to dispatch. | ||
256 | */ | ||
257 | lpaca->lppaca.idle = 1; | ||
258 | 75 | ||
259 | while (!need_resched() && !cpu_is_offline(cpu)) { | 76 | if (!need_resched()) |
260 | local_irq_disable(); | 77 | power4_idle(); |
261 | 78 | ||
262 | /* | 79 | if (need_resched()) { |
263 | * Yield the processor to the hypervisor. We return if | 80 | ppc64_runlatch_on(); |
264 | * an external interrupt occurs (which are driven prior | 81 | schedule(); |
265 | * to returning here) or if a prod occurs from another | ||
266 | * processor. When returning here, external interrupts | ||
267 | * are enabled. | ||
268 | * | ||
269 | * Check need_resched() again with interrupts disabled | ||
270 | * to avoid a race. | ||
271 | */ | ||
272 | if (!need_resched()) | ||
273 | cede_processor(); | ||
274 | else | ||
275 | local_irq_enable(); | ||
276 | } | 82 | } |
277 | 83 | ||
278 | HMT_medium(); | ||
279 | lpaca->lppaca.idle = 0; | ||
280 | schedule(); | ||
281 | if (cpu_is_offline(smp_processor_id()) && | 84 | if (cpu_is_offline(smp_processor_id()) && |
282 | system_state == SYSTEM_RUNNING) | 85 | system_state == SYSTEM_RUNNING) |
283 | cpu_die(); | 86 | cpu_die(); |
@@ -286,29 +89,10 @@ static int shared_idle(void) | |||
286 | return 0; | 89 | return 0; |
287 | } | 90 | } |
288 | 91 | ||
289 | #endif /* CONFIG_PPC_PSERIES */ | ||
290 | |||
291 | static int native_idle(void) | ||
292 | { | ||
293 | while(1) { | ||
294 | /* check CPU type here */ | ||
295 | if (!need_resched()) | ||
296 | power4_idle(); | ||
297 | if (need_resched()) | ||
298 | schedule(); | ||
299 | |||
300 | if (cpu_is_offline(raw_smp_processor_id()) && | ||
301 | system_state == SYSTEM_RUNNING) | ||
302 | cpu_die(); | ||
303 | } | ||
304 | return 0; | ||
305 | } | ||
306 | |||
307 | #endif /* CONFIG_PPC_ISERIES */ | ||
308 | |||
309 | void cpu_idle(void) | 92 | void cpu_idle(void) |
310 | { | 93 | { |
311 | idle_loop(); | 94 | BUG_ON(NULL == ppc_md.idle_loop); |
95 | ppc_md.idle_loop(); | ||
312 | } | 96 | } |
313 | 97 | ||
314 | int powersave_nap; | 98 | int powersave_nap; |
@@ -342,42 +126,3 @@ register_powersave_nap_sysctl(void) | |||
342 | } | 126 | } |
343 | __initcall(register_powersave_nap_sysctl); | 127 | __initcall(register_powersave_nap_sysctl); |
344 | #endif | 128 | #endif |
345 | |||
346 | int idle_setup(void) | ||
347 | { | ||
348 | /* | ||
349 | * Move that junk to each platform specific file, eventually define | ||
350 | * a pSeries_idle for shared processor stuff | ||
351 | */ | ||
352 | #ifdef CONFIG_PPC_ISERIES | ||
353 | idle_loop = iSeries_idle; | ||
354 | return 1; | ||
355 | #else | ||
356 | idle_loop = default_idle; | ||
357 | #endif | ||
358 | #ifdef CONFIG_PPC_PSERIES | ||
359 | if (systemcfg->platform & PLATFORM_PSERIES) { | ||
360 | if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) { | ||
361 | if (get_paca()->lppaca.shared_proc) { | ||
362 | printk(KERN_INFO "Using shared processor idle loop\n"); | ||
363 | idle_loop = shared_idle; | ||
364 | } else { | ||
365 | printk(KERN_INFO "Using dedicated idle loop\n"); | ||
366 | idle_loop = dedicated_idle; | ||
367 | } | ||
368 | } else { | ||
369 | printk(KERN_INFO "Using default idle loop\n"); | ||
370 | idle_loop = default_idle; | ||
371 | } | ||
372 | } | ||
373 | #endif /* CONFIG_PPC_PSERIES */ | ||
374 | #ifndef CONFIG_PPC_ISERIES | ||
375 | if (systemcfg->platform == PLATFORM_POWERMAC || | ||
376 | systemcfg->platform == PLATFORM_MAPLE) { | ||
377 | printk(KERN_INFO "Using native/NAP idle loop\n"); | ||
378 | idle_loop = native_idle; | ||
379 | } | ||
380 | #endif /* CONFIG_PPC_ISERIES */ | ||
381 | |||
382 | return 1; | ||
383 | } | ||
diff --git a/arch/ppc64/kernel/maple_setup.c b/arch/ppc64/kernel/maple_setup.c index da8900b51f40..bb55b5a56910 100644 --- a/arch/ppc64/kernel/maple_setup.c +++ b/arch/ppc64/kernel/maple_setup.c | |||
@@ -177,6 +177,8 @@ void __init maple_setup_arch(void) | |||
177 | #ifdef CONFIG_DUMMY_CONSOLE | 177 | #ifdef CONFIG_DUMMY_CONSOLE |
178 | conswitchp = &dummy_con; | 178 | conswitchp = &dummy_con; |
179 | #endif | 179 | #endif |
180 | |||
181 | printk(KERN_INFO "Using native/NAP idle loop\n"); | ||
180 | } | 182 | } |
181 | 183 | ||
182 | /* | 184 | /* |
@@ -297,4 +299,5 @@ struct machdep_calls __initdata maple_md = { | |||
297 | .get_rtc_time = maple_get_rtc_time, | 299 | .get_rtc_time = maple_get_rtc_time, |
298 | .calibrate_decr = generic_calibrate_decr, | 300 | .calibrate_decr = generic_calibrate_decr, |
299 | .progress = maple_progress, | 301 | .progress = maple_progress, |
302 | .idle_loop = native_idle, | ||
300 | }; | 303 | }; |
diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S index f3dea0c5a88c..59f4f9973818 100644 --- a/arch/ppc64/kernel/misc.S +++ b/arch/ppc64/kernel/misc.S | |||
@@ -1124,9 +1124,11 @@ _GLOBAL(sys_call_table32) | |||
1124 | .llong .compat_sys_mq_getsetattr | 1124 | .llong .compat_sys_mq_getsetattr |
1125 | .llong .compat_sys_kexec_load | 1125 | .llong .compat_sys_kexec_load |
1126 | .llong .sys32_add_key | 1126 | .llong .sys32_add_key |
1127 | .llong .sys32_request_key | 1127 | .llong .sys32_request_key /* 270 */ |
1128 | .llong .compat_sys_keyctl | 1128 | .llong .compat_sys_keyctl |
1129 | .llong .compat_sys_waitid | 1129 | .llong .compat_sys_waitid |
1130 | .llong .sys32_ioprio_set | ||
1131 | .llong .sys32_ioprio_get | ||
1130 | 1132 | ||
1131 | .balign 8 | 1133 | .balign 8 |
1132 | _GLOBAL(sys_call_table) | 1134 | _GLOBAL(sys_call_table) |
@@ -1403,3 +1405,5 @@ _GLOBAL(sys_call_table) | |||
1403 | .llong .sys_request_key /* 270 */ | 1405 | .llong .sys_request_key /* 270 */ |
1404 | .llong .sys_keyctl | 1406 | .llong .sys_keyctl |
1405 | .llong .sys_waitid | 1407 | .llong .sys_waitid |
1408 | .llong .sys_ioprio_set | ||
1409 | .llong .sys_ioprio_get | ||
diff --git a/arch/ppc64/kernel/pSeries_setup.c b/arch/ppc64/kernel/pSeries_setup.c index 44d9af72d225..5bec956e44a0 100644 --- a/arch/ppc64/kernel/pSeries_setup.c +++ b/arch/ppc64/kernel/pSeries_setup.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #undef DEBUG | 19 | #undef DEBUG |
20 | 20 | ||
21 | #include <linux/config.h> | 21 | #include <linux/config.h> |
22 | #include <linux/cpu.h> | ||
22 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
23 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
24 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
@@ -82,6 +83,9 @@ int fwnmi_active; /* TRUE if an FWNMI handler is present */ | |||
82 | extern void pSeries_system_reset_exception(struct pt_regs *regs); | 83 | extern void pSeries_system_reset_exception(struct pt_regs *regs); |
83 | extern int pSeries_machine_check_exception(struct pt_regs *regs); | 84 | extern int pSeries_machine_check_exception(struct pt_regs *regs); |
84 | 85 | ||
86 | static int pseries_shared_idle(void); | ||
87 | static int pseries_dedicated_idle(void); | ||
88 | |||
85 | static volatile void __iomem * chrp_int_ack_special; | 89 | static volatile void __iomem * chrp_int_ack_special; |
86 | struct mpic *pSeries_mpic; | 90 | struct mpic *pSeries_mpic; |
87 | 91 | ||
@@ -229,6 +233,20 @@ static void __init pSeries_setup_arch(void) | |||
229 | 233 | ||
230 | if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) | 234 | if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) |
231 | vpa_init(boot_cpuid); | 235 | vpa_init(boot_cpuid); |
236 | |||
237 | /* Choose an idle loop */ | ||
238 | if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) { | ||
239 | if (get_paca()->lppaca.shared_proc) { | ||
240 | printk(KERN_INFO "Using shared processor idle loop\n"); | ||
241 | ppc_md.idle_loop = pseries_shared_idle; | ||
242 | } else { | ||
243 | printk(KERN_INFO "Using dedicated idle loop\n"); | ||
244 | ppc_md.idle_loop = pseries_dedicated_idle; | ||
245 | } | ||
246 | } else { | ||
247 | printk(KERN_INFO "Using default idle loop\n"); | ||
248 | ppc_md.idle_loop = default_idle; | ||
249 | } | ||
232 | } | 250 | } |
233 | 251 | ||
234 | static int __init pSeries_init_panel(void) | 252 | static int __init pSeries_init_panel(void) |
@@ -418,6 +436,144 @@ static int __init pSeries_probe(int platform) | |||
418 | return 1; | 436 | return 1; |
419 | } | 437 | } |
420 | 438 | ||
439 | DECLARE_PER_CPU(unsigned long, smt_snooze_delay); | ||
440 | |||
441 | static inline void dedicated_idle_sleep(unsigned int cpu) | ||
442 | { | ||
443 | struct paca_struct *ppaca = &paca[cpu ^ 1]; | ||
444 | |||
445 | /* Only sleep if the other thread is not idle */ | ||
446 | if (!(ppaca->lppaca.idle)) { | ||
447 | local_irq_disable(); | ||
448 | |||
449 | /* | ||
450 | * We are about to sleep the thread and so wont be polling any | ||
451 | * more. | ||
452 | */ | ||
453 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
454 | |||
455 | /* | ||
456 | * SMT dynamic mode. Cede will result in this thread going | ||
457 | * dormant, if the partner thread is still doing work. Thread | ||
458 | * wakes up if partner goes idle, an interrupt is presented, or | ||
459 | * a prod occurs. Returning from the cede enables external | ||
460 | * interrupts. | ||
461 | */ | ||
462 | if (!need_resched()) | ||
463 | cede_processor(); | ||
464 | else | ||
465 | local_irq_enable(); | ||
466 | } else { | ||
467 | /* | ||
468 | * Give the HV an opportunity at the processor, since we are | ||
469 | * not doing any work. | ||
470 | */ | ||
471 | poll_pending(); | ||
472 | } | ||
473 | } | ||
474 | |||
475 | static int pseries_dedicated_idle(void) | ||
476 | { | ||
477 | long oldval; | ||
478 | struct paca_struct *lpaca = get_paca(); | ||
479 | unsigned int cpu = smp_processor_id(); | ||
480 | unsigned long start_snooze; | ||
481 | unsigned long *smt_snooze_delay = &__get_cpu_var(smt_snooze_delay); | ||
482 | |||
483 | while (1) { | ||
484 | /* | ||
485 | * Indicate to the HV that we are idle. Now would be | ||
486 | * a good time to find other work to dispatch. | ||
487 | */ | ||
488 | lpaca->lppaca.idle = 1; | ||
489 | |||
490 | oldval = test_and_clear_thread_flag(TIF_NEED_RESCHED); | ||
491 | if (!oldval) { | ||
492 | set_thread_flag(TIF_POLLING_NRFLAG); | ||
493 | |||
494 | start_snooze = __get_tb() + | ||
495 | *smt_snooze_delay * tb_ticks_per_usec; | ||
496 | |||
497 | while (!need_resched() && !cpu_is_offline(cpu)) { | ||
498 | ppc64_runlatch_off(); | ||
499 | |||
500 | /* | ||
501 | * Go into low thread priority and possibly | ||
502 | * low power mode. | ||
503 | */ | ||
504 | HMT_low(); | ||
505 | HMT_very_low(); | ||
506 | |||
507 | if (*smt_snooze_delay != 0 && | ||
508 | __get_tb() > start_snooze) { | ||
509 | HMT_medium(); | ||
510 | dedicated_idle_sleep(cpu); | ||
511 | } | ||
512 | |||
513 | } | ||
514 | |||
515 | HMT_medium(); | ||
516 | clear_thread_flag(TIF_POLLING_NRFLAG); | ||
517 | } else { | ||
518 | set_need_resched(); | ||
519 | } | ||
520 | |||
521 | lpaca->lppaca.idle = 0; | ||
522 | ppc64_runlatch_on(); | ||
523 | |||
524 | schedule(); | ||
525 | |||
526 | if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING) | ||
527 | cpu_die(); | ||
528 | } | ||
529 | } | ||
530 | |||
531 | static int pseries_shared_idle(void) | ||
532 | { | ||
533 | struct paca_struct *lpaca = get_paca(); | ||
534 | unsigned int cpu = smp_processor_id(); | ||
535 | |||
536 | while (1) { | ||
537 | /* | ||
538 | * Indicate to the HV that we are idle. Now would be | ||
539 | * a good time to find other work to dispatch. | ||
540 | */ | ||
541 | lpaca->lppaca.idle = 1; | ||
542 | |||
543 | while (!need_resched() && !cpu_is_offline(cpu)) { | ||
544 | local_irq_disable(); | ||
545 | ppc64_runlatch_off(); | ||
546 | |||
547 | /* | ||
548 | * Yield the processor to the hypervisor. We return if | ||
549 | * an external interrupt occurs (which are driven prior | ||
550 | * to returning here) or if a prod occurs from another | ||
551 | * processor. When returning here, external interrupts | ||
552 | * are enabled. | ||
553 | * | ||
554 | * Check need_resched() again with interrupts disabled | ||
555 | * to avoid a race. | ||
556 | */ | ||
557 | if (!need_resched()) | ||
558 | cede_processor(); | ||
559 | else | ||
560 | local_irq_enable(); | ||
561 | |||
562 | HMT_medium(); | ||
563 | } | ||
564 | |||
565 | lpaca->lppaca.idle = 0; | ||
566 | ppc64_runlatch_on(); | ||
567 | |||
568 | schedule(); | ||
569 | |||
570 | if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING) | ||
571 | cpu_die(); | ||
572 | } | ||
573 | |||
574 | return 0; | ||
575 | } | ||
576 | |||
421 | struct machdep_calls __initdata pSeries_md = { | 577 | struct machdep_calls __initdata pSeries_md = { |
422 | .probe = pSeries_probe, | 578 | .probe = pSeries_probe, |
423 | .setup_arch = pSeries_setup_arch, | 579 | .setup_arch = pSeries_setup_arch, |
diff --git a/arch/ppc64/kernel/pmac_setup.c b/arch/ppc64/kernel/pmac_setup.c index 6cf03d387b91..3013cdb5f933 100644 --- a/arch/ppc64/kernel/pmac_setup.c +++ b/arch/ppc64/kernel/pmac_setup.c | |||
@@ -186,6 +186,8 @@ void __init pmac_setup_arch(void) | |||
186 | #ifdef CONFIG_DUMMY_CONSOLE | 186 | #ifdef CONFIG_DUMMY_CONSOLE |
187 | conswitchp = &dummy_con; | 187 | conswitchp = &dummy_con; |
188 | #endif | 188 | #endif |
189 | |||
190 | printk(KERN_INFO "Using native/NAP idle loop\n"); | ||
189 | } | 191 | } |
190 | 192 | ||
191 | #ifdef CONFIG_SCSI | 193 | #ifdef CONFIG_SCSI |
@@ -507,5 +509,6 @@ struct machdep_calls __initdata pmac_md = { | |||
507 | .calibrate_decr = pmac_calibrate_decr, | 509 | .calibrate_decr = pmac_calibrate_decr, |
508 | .feature_call = pmac_do_feature_call, | 510 | .feature_call = pmac_do_feature_call, |
509 | .progress = pmac_progress, | 511 | .progress = pmac_progress, |
510 | .check_legacy_ioport = pmac_check_legacy_ioport | 512 | .check_legacy_ioport = pmac_check_legacy_ioport, |
513 | .idle_loop = native_idle, | ||
511 | }; | 514 | }; |
diff --git a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c index d5e4866e9ac2..d1b33f0b26cb 100644 --- a/arch/ppc64/kernel/setup.c +++ b/arch/ppc64/kernel/setup.c | |||
@@ -96,7 +96,6 @@ extern void udbg_init_maple_realmode(void); | |||
96 | extern unsigned long klimit; | 96 | extern unsigned long klimit; |
97 | 97 | ||
98 | extern void mm_init_ppc64(void); | 98 | extern void mm_init_ppc64(void); |
99 | extern int idle_setup(void); | ||
100 | extern void stab_initialize(unsigned long stab); | 99 | extern void stab_initialize(unsigned long stab); |
101 | extern void htab_initialize(void); | 100 | extern void htab_initialize(void); |
102 | extern void early_init_devtree(void *flat_dt); | 101 | extern void early_init_devtree(void *flat_dt); |
@@ -1081,8 +1080,11 @@ void __init setup_arch(char **cmdline_p) | |||
1081 | 1080 | ||
1082 | ppc_md.setup_arch(); | 1081 | ppc_md.setup_arch(); |
1083 | 1082 | ||
1084 | /* Select the correct idle loop for the platform. */ | 1083 | /* Use the default idle loop if the platform hasn't provided one. */ |
1085 | idle_setup(); | 1084 | if (NULL == ppc_md.idle_loop) { |
1085 | ppc_md.idle_loop = default_idle; | ||
1086 | printk(KERN_INFO "Using default idle loop\n"); | ||
1087 | } | ||
1086 | 1088 | ||
1087 | paging_init(); | 1089 | paging_init(); |
1088 | ppc64_boot_msg(0x15, "Setup Done"); | 1090 | ppc64_boot_msg(0x15, "Setup Done"); |
diff --git a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c index 118436e8085a..206619080e66 100644 --- a/arch/ppc64/kernel/sys_ppc32.c +++ b/arch/ppc64/kernel/sys_ppc32.c | |||
@@ -30,47 +30,26 @@ | |||
30 | #include <linux/sem.h> | 30 | #include <linux/sem.h> |
31 | #include <linux/msg.h> | 31 | #include <linux/msg.h> |
32 | #include <linux/shm.h> | 32 | #include <linux/shm.h> |
33 | #include <linux/slab.h> | ||
34 | #include <linux/uio.h> | ||
35 | #include <linux/aio.h> | ||
36 | #include <linux/nfs_fs.h> | ||
37 | #include <linux/module.h> | ||
38 | #include <linux/sunrpc/svc.h> | ||
39 | #include <linux/nfsd/nfsd.h> | ||
40 | #include <linux/nfsd/cache.h> | ||
41 | #include <linux/nfsd/xdr.h> | ||
42 | #include <linux/nfsd/syscall.h> | ||
43 | #include <linux/poll.h> | 33 | #include <linux/poll.h> |
44 | #include <linux/personality.h> | 34 | #include <linux/personality.h> |
45 | #include <linux/stat.h> | 35 | #include <linux/stat.h> |
46 | #include <linux/filter.h> | ||
47 | #include <linux/highmem.h> | ||
48 | #include <linux/highuid.h> | ||
49 | #include <linux/mman.h> | 36 | #include <linux/mman.h> |
50 | #include <linux/ipv6.h> | ||
51 | #include <linux/in.h> | 37 | #include <linux/in.h> |
52 | #include <linux/icmpv6.h> | ||
53 | #include <linux/syscalls.h> | 38 | #include <linux/syscalls.h> |
54 | #include <linux/unistd.h> | 39 | #include <linux/unistd.h> |
55 | #include <linux/sysctl.h> | 40 | #include <linux/sysctl.h> |
56 | #include <linux/binfmts.h> | 41 | #include <linux/binfmts.h> |
57 | #include <linux/dnotify.h> | ||
58 | #include <linux/security.h> | 42 | #include <linux/security.h> |
59 | #include <linux/compat.h> | 43 | #include <linux/compat.h> |
60 | #include <linux/ptrace.h> | 44 | #include <linux/ptrace.h> |
61 | #include <linux/aio_abi.h> | ||
62 | #include <linux/elf.h> | 45 | #include <linux/elf.h> |
63 | 46 | ||
64 | #include <net/scm.h> | ||
65 | #include <net/sock.h> | ||
66 | |||
67 | #include <asm/ptrace.h> | 47 | #include <asm/ptrace.h> |
68 | #include <asm/types.h> | 48 | #include <asm/types.h> |
69 | #include <asm/ipc.h> | 49 | #include <asm/ipc.h> |
70 | #include <asm/uaccess.h> | 50 | #include <asm/uaccess.h> |
71 | #include <asm/unistd.h> | 51 | #include <asm/unistd.h> |
72 | #include <asm/semaphore.h> | 52 | #include <asm/semaphore.h> |
73 | #include <asm/ppcdebug.h> | ||
74 | #include <asm/time.h> | 53 | #include <asm/time.h> |
75 | #include <asm/mmu_context.h> | 54 | #include <asm/mmu_context.h> |
76 | #include <asm/systemcfg.h> | 55 | #include <asm/systemcfg.h> |
@@ -350,8 +329,6 @@ asmlinkage long sys32_adjtimex(struct timex32 __user *utp) | |||
350 | return ret; | 329 | return ret; |
351 | } | 330 | } |
352 | 331 | ||
353 | |||
354 | /* These are here just in case some old sparc32 binary calls it. */ | ||
355 | asmlinkage long sys32_pause(void) | 332 | asmlinkage long sys32_pause(void) |
356 | { | 333 | { |
357 | current->state = TASK_INTERRUPTIBLE; | 334 | current->state = TASK_INTERRUPTIBLE; |
@@ -360,8 +337,6 @@ asmlinkage long sys32_pause(void) | |||
360 | return -ERESTARTNOHAND; | 337 | return -ERESTARTNOHAND; |
361 | } | 338 | } |
362 | 339 | ||
363 | |||
364 | |||
365 | static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i) | 340 | static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i) |
366 | { | 341 | { |
367 | long usec; | 342 | long usec; |
@@ -847,16 +822,6 @@ asmlinkage long sys32_getpgid(u32 pid) | |||
847 | } | 822 | } |
848 | 823 | ||
849 | 824 | ||
850 | /* Note: it is necessary to treat which and who as unsigned ints, | ||
851 | * with the corresponding cast to a signed int to insure that the | ||
852 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
853 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
854 | */ | ||
855 | asmlinkage long sys32_getpriority(u32 which, u32 who) | ||
856 | { | ||
857 | return sys_getpriority((int)which, (int)who); | ||
858 | } | ||
859 | |||
860 | 825 | ||
861 | /* Note: it is necessary to treat pid as an unsigned int, | 826 | /* Note: it is necessary to treat pid as an unsigned int, |
862 | * with the corresponding cast to a signed int to insure that the | 827 | * with the corresponding cast to a signed int to insure that the |
@@ -1048,6 +1013,11 @@ asmlinkage long sys32_setpgid(u32 pid, u32 pgid) | |||
1048 | return sys_setpgid((int)pid, (int)pgid); | 1013 | return sys_setpgid((int)pid, (int)pgid); |
1049 | } | 1014 | } |
1050 | 1015 | ||
1016 | long sys32_getpriority(u32 which, u32 who) | ||
1017 | { | ||
1018 | /* sign extend which and who */ | ||
1019 | return sys_getpriority((int)which, (int)who); | ||
1020 | } | ||
1051 | 1021 | ||
1052 | long sys32_setpriority(u32 which, u32 who, u32 niceval) | 1022 | long sys32_setpriority(u32 which, u32 who, u32 niceval) |
1053 | { | 1023 | { |
@@ -1055,6 +1025,18 @@ long sys32_setpriority(u32 which, u32 who, u32 niceval) | |||
1055 | return sys_setpriority((int)which, (int)who, (int)niceval); | 1025 | return sys_setpriority((int)which, (int)who, (int)niceval); |
1056 | } | 1026 | } |
1057 | 1027 | ||
1028 | long sys32_ioprio_get(u32 which, u32 who) | ||
1029 | { | ||
1030 | /* sign extend which and who */ | ||
1031 | return sys_ioprio_get((int)which, (int)who); | ||
1032 | } | ||
1033 | |||
1034 | long sys32_ioprio_set(u32 which, u32 who, u32 ioprio) | ||
1035 | { | ||
1036 | /* sign extend which, who and ioprio */ | ||
1037 | return sys_ioprio_set((int)which, (int)who, (int)ioprio); | ||
1038 | } | ||
1039 | |||
1058 | /* Note: it is necessary to treat newmask as an unsigned int, | 1040 | /* Note: it is necessary to treat newmask as an unsigned int, |
1059 | * with the corresponding cast to a signed int to insure that the | 1041 | * with the corresponding cast to a signed int to insure that the |
1060 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | 1042 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) |
@@ -1273,8 +1255,6 @@ long ppc32_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low, | |||
1273 | (u64)len_high << 32 | len_low, advice); | 1255 | (u64)len_high << 32 | len_low, advice); |
1274 | } | 1256 | } |
1275 | 1257 | ||
1276 | extern asmlinkage long sys_timer_create(clockid_t, sigevent_t __user *, timer_t __user *); | ||
1277 | |||
1278 | long ppc32_timer_create(clockid_t clock, | 1258 | long ppc32_timer_create(clockid_t clock, |
1279 | struct compat_sigevent __user *ev32, | 1259 | struct compat_sigevent __user *ev32, |
1280 | timer_t __user *timer_id) | 1260 | timer_t __user *timer_id) |
diff --git a/arch/ppc64/kernel/sysfs.c b/arch/ppc64/kernel/sysfs.c index 2f704a2cafb1..02b8ac4e0168 100644 --- a/arch/ppc64/kernel/sysfs.c +++ b/arch/ppc64/kernel/sysfs.c | |||
@@ -112,7 +112,6 @@ void ppc64_enable_pmcs(void) | |||
112 | unsigned long hid0; | 112 | unsigned long hid0; |
113 | #ifdef CONFIG_PPC_PSERIES | 113 | #ifdef CONFIG_PPC_PSERIES |
114 | unsigned long set, reset; | 114 | unsigned long set, reset; |
115 | int ret; | ||
116 | #endif /* CONFIG_PPC_PSERIES */ | 115 | #endif /* CONFIG_PPC_PSERIES */ |
117 | 116 | ||
118 | /* Only need to enable them once */ | 117 | /* Only need to enable them once */ |
@@ -145,11 +144,7 @@ void ppc64_enable_pmcs(void) | |||
145 | case PLATFORM_PSERIES_LPAR: | 144 | case PLATFORM_PSERIES_LPAR: |
146 | set = 1UL << 63; | 145 | set = 1UL << 63; |
147 | reset = 0; | 146 | reset = 0; |
148 | ret = plpar_hcall_norets(H_PERFMON, set, reset); | 147 | plpar_hcall_norets(H_PERFMON, set, reset); |
149 | if (ret) | ||
150 | printk(KERN_ERR "H_PERFMON call on cpu %u " | ||
151 | "returned %d\n", | ||
152 | smp_processor_id(), ret); | ||
153 | break; | 148 | break; |
154 | #endif /* CONFIG_PPC_PSERIES */ | 149 | #endif /* CONFIG_PPC_PSERIES */ |
155 | 150 | ||
@@ -161,13 +156,6 @@ void ppc64_enable_pmcs(void) | |||
161 | /* instruct hypervisor to maintain PMCs */ | 156 | /* instruct hypervisor to maintain PMCs */ |
162 | if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) | 157 | if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR) |
163 | get_paca()->lppaca.pmcregs_in_use = 1; | 158 | get_paca()->lppaca.pmcregs_in_use = 1; |
164 | |||
165 | /* | ||
166 | * On SMT machines we have to set the run latch in the ctrl register | ||
167 | * in order to make PMC6 spin. | ||
168 | */ | ||
169 | if (cpu_has_feature(CPU_FTR_SMT)) | ||
170 | ppc64_runlatch_on(); | ||
171 | #endif /* CONFIG_PPC_PSERIES */ | 159 | #endif /* CONFIG_PPC_PSERIES */ |
172 | } | 160 | } |
173 | 161 | ||
diff --git a/arch/ppc64/kernel/vdso32/vdso32.lds.S b/arch/ppc64/kernel/vdso32/vdso32.lds.S index 11290c902ba3..6f87a916a394 100644 --- a/arch/ppc64/kernel/vdso32/vdso32.lds.S +++ b/arch/ppc64/kernel/vdso32/vdso32.lds.S | |||
@@ -40,9 +40,9 @@ SECTIONS | |||
40 | .gcc_except_table : { *(.gcc_except_table) } | 40 | .gcc_except_table : { *(.gcc_except_table) } |
41 | .fixup : { *(.fixup) } | 41 | .fixup : { *(.fixup) } |
42 | 42 | ||
43 | .got ALIGN(4) : { *(.got.plt) *(.got) } | ||
44 | |||
45 | .dynamic : { *(.dynamic) } :text :dynamic | 43 | .dynamic : { *(.dynamic) } :text :dynamic |
44 | .got : { *(.got) } | ||
45 | .plt : { *(.plt) } | ||
46 | 46 | ||
47 | _end = .; | 47 | _end = .; |
48 | __end = .; | 48 | __end = .; |
diff --git a/arch/um/Kconfig b/arch/um/Kconfig index 9469e77303e6..6682c7883647 100644 --- a/arch/um/Kconfig +++ b/arch/um/Kconfig | |||
@@ -128,7 +128,6 @@ config HOSTFS | |||
128 | 128 | ||
129 | config HPPFS | 129 | config HPPFS |
130 | tristate "HoneyPot ProcFS (EXPERIMENTAL)" | 130 | tristate "HoneyPot ProcFS (EXPERIMENTAL)" |
131 | depends on BROKEN | ||
132 | help | 131 | help |
133 | hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc | 132 | hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc |
134 | entries to be overridden, removed, or fabricated from the host. | 133 | entries to be overridden, removed, or fabricated from the host. |
@@ -141,8 +140,9 @@ config HPPFS | |||
141 | You only need this if you are setting up a UML honeypot. Otherwise, | 140 | You only need this if you are setting up a UML honeypot. Otherwise, |
142 | it is safe to say 'N' here. | 141 | it is safe to say 'N' here. |
143 | 142 | ||
144 | If you are actively using it, please ask for it to be fixed. In this | 143 | If you are actively using it, please report any problems, since it's |
145 | moment, it does not work on 2.6 (it works somehow on 2.4). | 144 | getting fixed. In this moment, it is experimental on 2.6 (it works on |
145 | 2.4). | ||
146 | 146 | ||
147 | config MCONSOLE | 147 | config MCONSOLE |
148 | bool "Management console" | 148 | bool "Management console" |
diff --git a/arch/um/Kconfig_i386 b/arch/um/Kconfig_i386 index e41f3748d30f..27c18a8d9d17 100644 --- a/arch/um/Kconfig_i386 +++ b/arch/um/Kconfig_i386 | |||
@@ -19,6 +19,18 @@ config 3_LEVEL_PGTABLES | |||
19 | memory. All the memory that can't be mapped directly will be treated | 19 | memory. All the memory that can't be mapped directly will be treated |
20 | as high memory. | 20 | as high memory. |
21 | 21 | ||
22 | config STUB_CODE | ||
23 | hex | ||
24 | default 0xbfffe000 | ||
25 | |||
26 | config STUB_DATA | ||
27 | hex | ||
28 | default 0xbffff000 | ||
29 | |||
30 | config STUB_START | ||
31 | hex | ||
32 | default STUB_CODE | ||
33 | |||
22 | config ARCH_HAS_SC_SIGNALS | 34 | config ARCH_HAS_SC_SIGNALS |
23 | bool | 35 | bool |
24 | default y | 36 | default y |
diff --git a/arch/um/Kconfig_x86_64 b/arch/um/Kconfig_x86_64 index f162f50f0b17..735a047c890c 100644 --- a/arch/um/Kconfig_x86_64 +++ b/arch/um/Kconfig_x86_64 | |||
@@ -14,6 +14,18 @@ config 3_LEVEL_PGTABLES | |||
14 | bool | 14 | bool |
15 | default y | 15 | default y |
16 | 16 | ||
17 | config STUB_CODE | ||
18 | hex | ||
19 | default 0x7fbfffe000 | ||
20 | |||
21 | config STUB_DATA | ||
22 | hex | ||
23 | default 0x7fbffff000 | ||
24 | |||
25 | config STUB_START | ||
26 | hex | ||
27 | default STUB_CODE | ||
28 | |||
17 | config ARCH_HAS_SC_SIGNALS | 29 | config ARCH_HAS_SC_SIGNALS |
18 | bool | 30 | bool |
19 | default n | 31 | default n |
diff --git a/arch/um/Makefile-i386 b/arch/um/Makefile-i386 index 29e182d5a83a..301059062a3e 100644 --- a/arch/um/Makefile-i386 +++ b/arch/um/Makefile-i386 | |||
@@ -8,7 +8,7 @@ ifeq ($(CONFIG_MODE_SKAS),y) | |||
8 | endif | 8 | endif |
9 | endif | 9 | endif |
10 | 10 | ||
11 | CFLAGS += -U__$(SUBARCH)__ -U$(SUBARCH) | 11 | CFLAGS += -U__$(SUBARCH)__ -U$(SUBARCH) $(STUB_CFLAGS) |
12 | ARCH_USER_CFLAGS := | 12 | ARCH_USER_CFLAGS := |
13 | 13 | ||
14 | ifneq ($(CONFIG_GPROF),y) | 14 | ifneq ($(CONFIG_GPROF),y) |
diff --git a/arch/um/Makefile-x86_64 b/arch/um/Makefile-x86_64 index 32144562c279..d80bd0052e6b 100644 --- a/arch/um/Makefile-x86_64 +++ b/arch/um/Makefile-x86_64 | |||
@@ -4,7 +4,7 @@ | |||
4 | SUBARCH_LIBS := arch/um/sys-x86_64/ | 4 | SUBARCH_LIBS := arch/um/sys-x86_64/ |
5 | START := 0x60000000 | 5 | START := 0x60000000 |
6 | 6 | ||
7 | CFLAGS += -U__$(SUBARCH)__ -fno-builtin | 7 | CFLAGS += -U__$(SUBARCH)__ -fno-builtin $(STUB_CFLAGS) |
8 | ARCH_USER_CFLAGS := -D__x86_64__ | 8 | ARCH_USER_CFLAGS := -D__x86_64__ |
9 | 9 | ||
10 | ELF_ARCH := i386:x86-64 | 10 | ELF_ARCH := i386:x86-64 |
diff --git a/arch/um/defconfig b/arch/um/defconfig index 4067c3aa5b60..80d30d19d750 100644 --- a/arch/um/defconfig +++ b/arch/um/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-skas3-v9-pre2 | 3 | # Linux kernel version: 2.6.12-rc6-mm1 |
4 | # Sun Apr 24 19:46:10 2005 | 4 | # Tue Jun 14 18:22:21 2005 |
5 | # | 5 | # |
6 | CONFIG_GENERIC_HARDIRQS=y | 6 | CONFIG_GENERIC_HARDIRQS=y |
7 | CONFIG_UML=y | 7 | CONFIG_UML=y |
@@ -13,23 +13,32 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y | |||
13 | # | 13 | # |
14 | # UML-specific options | 14 | # UML-specific options |
15 | # | 15 | # |
16 | CONFIG_MODE_TT=y | 16 | # CONFIG_MODE_TT is not set |
17 | # CONFIG_STATIC_LINK is not set | ||
17 | CONFIG_MODE_SKAS=y | 18 | CONFIG_MODE_SKAS=y |
18 | CONFIG_UML_X86=y | 19 | CONFIG_UML_X86=y |
19 | # CONFIG_64BIT is not set | 20 | # CONFIG_64BIT is not set |
20 | CONFIG_TOP_ADDR=0xc0000000 | 21 | CONFIG_TOP_ADDR=0xc0000000 |
21 | # CONFIG_3_LEVEL_PGTABLES is not set | 22 | # CONFIG_3_LEVEL_PGTABLES is not set |
23 | CONFIG_STUB_CODE=0xbfffe000 | ||
24 | CONFIG_STUB_DATA=0xbffff000 | ||
25 | CONFIG_STUB_START=0xbfffe000 | ||
22 | CONFIG_ARCH_HAS_SC_SIGNALS=y | 26 | CONFIG_ARCH_HAS_SC_SIGNALS=y |
23 | CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y | 27 | CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y |
24 | CONFIG_LD_SCRIPT_STATIC=y | 28 | CONFIG_SELECT_MEMORY_MODEL=y |
29 | CONFIG_FLATMEM_MANUAL=y | ||
30 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
31 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
32 | CONFIG_FLATMEM=y | ||
33 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
34 | CONFIG_LD_SCRIPT_DYN=y | ||
25 | CONFIG_NET=y | 35 | CONFIG_NET=y |
26 | CONFIG_BINFMT_ELF=y | 36 | CONFIG_BINFMT_ELF=y |
27 | CONFIG_BINFMT_MISC=m | 37 | CONFIG_BINFMT_MISC=m |
28 | CONFIG_HOSTFS=y | 38 | # CONFIG_HOSTFS is not set |
29 | CONFIG_MCONSOLE=y | 39 | CONFIG_MCONSOLE=y |
30 | # CONFIG_MAGIC_SYSRQ is not set | 40 | # CONFIG_MAGIC_SYSRQ is not set |
31 | # CONFIG_HOST_2G_2G is not set | 41 | # CONFIG_HOST_2G_2G is not set |
32 | # CONFIG_SMP is not set | ||
33 | CONFIG_NEST_LEVEL=0 | 42 | CONFIG_NEST_LEVEL=0 |
34 | CONFIG_KERNEL_HALF_GIGS=1 | 43 | CONFIG_KERNEL_HALF_GIGS=1 |
35 | # CONFIG_HIGHMEM is not set | 44 | # CONFIG_HIGHMEM is not set |
@@ -63,6 +72,8 @@ CONFIG_IKCONFIG_PROC=y | |||
63 | CONFIG_KALLSYMS=y | 72 | CONFIG_KALLSYMS=y |
64 | # CONFIG_KALLSYMS_ALL is not set | 73 | # CONFIG_KALLSYMS_ALL is not set |
65 | CONFIG_KALLSYMS_EXTRA_PASS=y | 74 | CONFIG_KALLSYMS_EXTRA_PASS=y |
75 | CONFIG_PRINTK=y | ||
76 | CONFIG_BUG=y | ||
66 | CONFIG_BASE_FULL=y | 77 | CONFIG_BASE_FULL=y |
67 | CONFIG_FUTEX=y | 78 | CONFIG_FUTEX=y |
68 | CONFIG_EPOLL=y | 79 | CONFIG_EPOLL=y |
@@ -81,6 +92,7 @@ CONFIG_MODULES=y | |||
81 | CONFIG_MODULE_UNLOAD=y | 92 | CONFIG_MODULE_UNLOAD=y |
82 | # CONFIG_MODULE_FORCE_UNLOAD is not set | 93 | # CONFIG_MODULE_FORCE_UNLOAD is not set |
83 | CONFIG_OBSOLETE_MODPARM=y | 94 | CONFIG_OBSOLETE_MODPARM=y |
95 | # CONFIG_MODVERSIONS is not set | ||
84 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 96 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
85 | CONFIG_KMOD=y | 97 | CONFIG_KMOD=y |
86 | 98 | ||
@@ -115,6 +127,7 @@ CONFIG_UML_SOUND=m | |||
115 | CONFIG_SOUND=m | 127 | CONFIG_SOUND=m |
116 | CONFIG_HOSTAUDIO=m | 128 | CONFIG_HOSTAUDIO=m |
117 | CONFIG_UML_RANDOM=y | 129 | CONFIG_UML_RANDOM=y |
130 | # CONFIG_MMAPPER is not set | ||
118 | 131 | ||
119 | # | 132 | # |
120 | # Block devices | 133 | # Block devices |
@@ -176,6 +189,17 @@ CONFIG_INET=y | |||
176 | # CONFIG_INET_TUNNEL is not set | 189 | # CONFIG_INET_TUNNEL is not set |
177 | CONFIG_IP_TCPDIAG=y | 190 | CONFIG_IP_TCPDIAG=y |
178 | # CONFIG_IP_TCPDIAG_IPV6 is not set | 191 | # CONFIG_IP_TCPDIAG_IPV6 is not set |
192 | |||
193 | # | ||
194 | # TCP congestion control | ||
195 | # | ||
196 | CONFIG_TCP_CONG_BIC=y | ||
197 | CONFIG_TCP_CONG_WESTWOOD=y | ||
198 | CONFIG_TCP_CONG_HTCP=y | ||
199 | # CONFIG_TCP_CONG_HSTCP is not set | ||
200 | # CONFIG_TCP_CONG_HYBLA is not set | ||
201 | # CONFIG_TCP_CONG_VEGAS is not set | ||
202 | # CONFIG_TCP_CONG_SCALABLE is not set | ||
179 | # CONFIG_IPV6 is not set | 203 | # CONFIG_IPV6 is not set |
180 | # CONFIG_NETFILTER is not set | 204 | # CONFIG_NETFILTER is not set |
181 | 205 | ||
@@ -206,11 +230,15 @@ CONFIG_IP_TCPDIAG=y | |||
206 | # Network testing | 230 | # Network testing |
207 | # | 231 | # |
208 | # CONFIG_NET_PKTGEN is not set | 232 | # CONFIG_NET_PKTGEN is not set |
233 | # CONFIG_KGDBOE is not set | ||
209 | # CONFIG_NETPOLL is not set | 234 | # CONFIG_NETPOLL is not set |
235 | # CONFIG_NETPOLL_RX is not set | ||
236 | # CONFIG_NETPOLL_TRAP is not set | ||
210 | # CONFIG_NET_POLL_CONTROLLER is not set | 237 | # CONFIG_NET_POLL_CONTROLLER is not set |
211 | # CONFIG_HAMRADIO is not set | 238 | # CONFIG_HAMRADIO is not set |
212 | # CONFIG_IRDA is not set | 239 | # CONFIG_IRDA is not set |
213 | # CONFIG_BT is not set | 240 | # CONFIG_BT is not set |
241 | # CONFIG_IEEE80211 is not set | ||
214 | CONFIG_DUMMY=m | 242 | CONFIG_DUMMY=m |
215 | # CONFIG_BONDING is not set | 243 | # CONFIG_BONDING is not set |
216 | # CONFIG_EQUALIZER is not set | 244 | # CONFIG_EQUALIZER is not set |
@@ -227,6 +255,7 @@ CONFIG_PPP=m | |||
227 | # CONFIG_PPP_SYNC_TTY is not set | 255 | # CONFIG_PPP_SYNC_TTY is not set |
228 | # CONFIG_PPP_DEFLATE is not set | 256 | # CONFIG_PPP_DEFLATE is not set |
229 | # CONFIG_PPP_BSDCOMP is not set | 257 | # CONFIG_PPP_BSDCOMP is not set |
258 | # CONFIG_PPP_MPPE is not set | ||
230 | # CONFIG_PPPOE is not set | 259 | # CONFIG_PPPOE is not set |
231 | CONFIG_SLIP=m | 260 | CONFIG_SLIP=m |
232 | # CONFIG_SLIP_COMPRESSED is not set | 261 | # CONFIG_SLIP_COMPRESSED is not set |
@@ -240,10 +269,12 @@ CONFIG_SLIP=m | |||
240 | # | 269 | # |
241 | CONFIG_EXT2_FS=y | 270 | CONFIG_EXT2_FS=y |
242 | # CONFIG_EXT2_FS_XATTR is not set | 271 | # CONFIG_EXT2_FS_XATTR is not set |
272 | # CONFIG_EXT2_FS_XIP is not set | ||
243 | CONFIG_EXT3_FS=y | 273 | CONFIG_EXT3_FS=y |
244 | # CONFIG_EXT3_FS_XATTR is not set | 274 | # CONFIG_EXT3_FS_XATTR is not set |
245 | CONFIG_JBD=y | 275 | CONFIG_JBD=y |
246 | # CONFIG_JBD_DEBUG is not set | 276 | # CONFIG_JBD_DEBUG is not set |
277 | # CONFIG_REISER4_FS is not set | ||
247 | CONFIG_REISERFS_FS=y | 278 | CONFIG_REISERFS_FS=y |
248 | # CONFIG_REISERFS_CHECK is not set | 279 | # CONFIG_REISERFS_CHECK is not set |
249 | # CONFIG_REISERFS_PROC_INFO is not set | 280 | # CONFIG_REISERFS_PROC_INFO is not set |
@@ -256,6 +287,7 @@ CONFIG_REISERFS_FS=y | |||
256 | # CONFIG_XFS_FS is not set | 287 | # CONFIG_XFS_FS is not set |
257 | # CONFIG_MINIX_FS is not set | 288 | # CONFIG_MINIX_FS is not set |
258 | # CONFIG_ROMFS_FS is not set | 289 | # CONFIG_ROMFS_FS is not set |
290 | CONFIG_INOTIFY=y | ||
259 | CONFIG_QUOTA=y | 291 | CONFIG_QUOTA=y |
260 | # CONFIG_QFMT_V1 is not set | 292 | # CONFIG_QFMT_V1 is not set |
261 | # CONFIG_QFMT_V2 is not set | 293 | # CONFIG_QFMT_V2 is not set |
@@ -265,6 +297,12 @@ CONFIG_AUTOFS_FS=m | |||
265 | CONFIG_AUTOFS4_FS=m | 297 | CONFIG_AUTOFS4_FS=m |
266 | 298 | ||
267 | # | 299 | # |
300 | # Caches | ||
301 | # | ||
302 | # CONFIG_FSCACHE is not set | ||
303 | # CONFIG_FUSE_FS is not set | ||
304 | |||
305 | # | ||
268 | # CD-ROM/DVD Filesystems | 306 | # CD-ROM/DVD Filesystems |
269 | # | 307 | # |
270 | CONFIG_ISO9660_FS=m | 308 | CONFIG_ISO9660_FS=m |
@@ -291,6 +329,8 @@ CONFIG_TMPFS=y | |||
291 | # CONFIG_TMPFS_XATTR is not set | 329 | # CONFIG_TMPFS_XATTR is not set |
292 | # CONFIG_HUGETLB_PAGE is not set | 330 | # CONFIG_HUGETLB_PAGE is not set |
293 | CONFIG_RAMFS=y | 331 | CONFIG_RAMFS=y |
332 | # CONFIG_CONFIGFS_FS is not set | ||
333 | # CONFIG_RELAYFS_FS is not set | ||
294 | 334 | ||
295 | # | 335 | # |
296 | # Miscellaneous filesystems | 336 | # Miscellaneous filesystems |
@@ -319,6 +359,7 @@ CONFIG_RAMFS=y | |||
319 | # CONFIG_NCP_FS is not set | 359 | # CONFIG_NCP_FS is not set |
320 | # CONFIG_CODA_FS is not set | 360 | # CONFIG_CODA_FS is not set |
321 | # CONFIG_AFS_FS is not set | 361 | # CONFIG_AFS_FS is not set |
362 | # CONFIG_9P_FS is not set | ||
322 | 363 | ||
323 | # | 364 | # |
324 | # Partition Types | 365 | # Partition Types |
@@ -404,14 +445,15 @@ CONFIG_CRC32=m | |||
404 | # CONFIG_PRINTK_TIME is not set | 445 | # CONFIG_PRINTK_TIME is not set |
405 | CONFIG_DEBUG_KERNEL=y | 446 | CONFIG_DEBUG_KERNEL=y |
406 | CONFIG_LOG_BUF_SHIFT=14 | 447 | CONFIG_LOG_BUF_SHIFT=14 |
448 | CONFIG_DETECT_SOFTLOCKUP=y | ||
407 | # CONFIG_SCHEDSTATS is not set | 449 | # CONFIG_SCHEDSTATS is not set |
408 | # CONFIG_DEBUG_SLAB is not set | 450 | CONFIG_DEBUG_SLAB=y |
409 | # CONFIG_DEBUG_SPINLOCK is not set | 451 | # CONFIG_DEBUG_SPINLOCK is not set |
410 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 452 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
411 | # CONFIG_DEBUG_KOBJECT is not set | 453 | # CONFIG_DEBUG_KOBJECT is not set |
412 | CONFIG_DEBUG_INFO=y | 454 | CONFIG_DEBUG_INFO=y |
413 | # CONFIG_DEBUG_FS is not set | 455 | # CONFIG_DEBUG_FS is not set |
414 | CONFIG_FRAME_POINTER=y | 456 | CONFIG_FRAME_POINTER=y |
415 | CONFIG_PT_PROXY=y | 457 | # CONFIG_GPROF is not set |
416 | # CONFIG_GCOV is not set | 458 | # CONFIG_GCOV is not set |
417 | # CONFIG_SYSCALL_DEBUG is not set | 459 | # CONFIG_SYSCALL_DEBUG is not set |
diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c index 2bb4c4f5dec4..e0fdffa2d542 100644 --- a/arch/um/drivers/line.c +++ b/arch/um/drivers/line.c | |||
@@ -663,11 +663,15 @@ struct tty_driver *line_register_devfs(struct lines *set, | |||
663 | return driver; | 663 | return driver; |
664 | } | 664 | } |
665 | 665 | ||
666 | static spinlock_t winch_handler_lock; | ||
667 | LIST_HEAD(winch_handlers); | ||
668 | |||
666 | void lines_init(struct line *lines, int nlines) | 669 | void lines_init(struct line *lines, int nlines) |
667 | { | 670 | { |
668 | struct line *line; | 671 | struct line *line; |
669 | int i; | 672 | int i; |
670 | 673 | ||
674 | spin_lock_init(&winch_handler_lock); | ||
671 | for(i = 0; i < nlines; i++){ | 675 | for(i = 0; i < nlines; i++){ |
672 | line = &lines[i]; | 676 | line = &lines[i]; |
673 | INIT_LIST_HEAD(&line->chan_list); | 677 | INIT_LIST_HEAD(&line->chan_list); |
@@ -724,31 +728,30 @@ irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused) | |||
724 | return IRQ_HANDLED; | 728 | return IRQ_HANDLED; |
725 | } | 729 | } |
726 | 730 | ||
727 | DECLARE_MUTEX(winch_handler_sem); | ||
728 | LIST_HEAD(winch_handlers); | ||
729 | |||
730 | void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty) | 731 | void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty) |
731 | { | 732 | { |
732 | struct winch *winch; | 733 | struct winch *winch; |
733 | 734 | ||
734 | down(&winch_handler_sem); | ||
735 | winch = kmalloc(sizeof(*winch), GFP_KERNEL); | 735 | winch = kmalloc(sizeof(*winch), GFP_KERNEL); |
736 | if (winch == NULL) { | 736 | if (winch == NULL) { |
737 | printk("register_winch_irq - kmalloc failed\n"); | 737 | printk("register_winch_irq - kmalloc failed\n"); |
738 | goto out; | 738 | return; |
739 | } | 739 | } |
740 | |||
740 | *winch = ((struct winch) { .list = LIST_HEAD_INIT(winch->list), | 741 | *winch = ((struct winch) { .list = LIST_HEAD_INIT(winch->list), |
741 | .fd = fd, | 742 | .fd = fd, |
742 | .tty_fd = tty_fd, | 743 | .tty_fd = tty_fd, |
743 | .pid = pid, | 744 | .pid = pid, |
744 | .tty = tty }); | 745 | .tty = tty }); |
746 | |||
747 | spin_lock(&winch_handler_lock); | ||
745 | list_add(&winch->list, &winch_handlers); | 748 | list_add(&winch->list, &winch_handlers); |
749 | spin_unlock(&winch_handler_lock); | ||
750 | |||
746 | if(um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, | 751 | if(um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, |
747 | SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, | 752 | SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, |
748 | "winch", winch) < 0) | 753 | "winch", winch) < 0) |
749 | printk("register_winch_irq - failed to register IRQ\n"); | 754 | printk("register_winch_irq - failed to register IRQ\n"); |
750 | out: | ||
751 | up(&winch_handler_sem); | ||
752 | } | 755 | } |
753 | 756 | ||
754 | static void unregister_winch(struct tty_struct *tty) | 757 | static void unregister_winch(struct tty_struct *tty) |
@@ -756,7 +759,7 @@ static void unregister_winch(struct tty_struct *tty) | |||
756 | struct list_head *ele; | 759 | struct list_head *ele; |
757 | struct winch *winch, *found = NULL; | 760 | struct winch *winch, *found = NULL; |
758 | 761 | ||
759 | down(&winch_handler_sem); | 762 | spin_lock(&winch_handler_lock); |
760 | list_for_each(ele, &winch_handlers){ | 763 | list_for_each(ele, &winch_handlers){ |
761 | winch = list_entry(ele, struct winch, list); | 764 | winch = list_entry(ele, struct winch, list); |
762 | if(winch->tty == tty){ | 765 | if(winch->tty == tty){ |
@@ -764,20 +767,25 @@ static void unregister_winch(struct tty_struct *tty) | |||
764 | break; | 767 | break; |
765 | } | 768 | } |
766 | } | 769 | } |
767 | |||
768 | if(found == NULL) | 770 | if(found == NULL) |
769 | goto out; | 771 | goto err; |
772 | |||
773 | list_del(&winch->list); | ||
774 | spin_unlock(&winch_handler_lock); | ||
770 | 775 | ||
771 | if(winch->pid != -1) | 776 | if(winch->pid != -1) |
772 | os_kill_process(winch->pid, 1); | 777 | os_kill_process(winch->pid, 1); |
773 | 778 | ||
774 | free_irq(WINCH_IRQ, winch); | 779 | free_irq(WINCH_IRQ, winch); |
775 | list_del(&winch->list); | ||
776 | kfree(winch); | 780 | kfree(winch); |
777 | out: | 781 | |
778 | up(&winch_handler_sem); | 782 | return; |
783 | err: | ||
784 | spin_unlock(&winch_handler_lock); | ||
779 | } | 785 | } |
780 | 786 | ||
787 | /* XXX: No lock as it's an exitcall... is this valid? Depending on cleanup | ||
788 | * order... are we sure that nothing else is done on the list? */ | ||
781 | static void winch_cleanup(void) | 789 | static void winch_cleanup(void) |
782 | { | 790 | { |
783 | struct list_head *ele; | 791 | struct list_head *ele; |
@@ -786,6 +794,9 @@ static void winch_cleanup(void) | |||
786 | list_for_each(ele, &winch_handlers){ | 794 | list_for_each(ele, &winch_handlers){ |
787 | winch = list_entry(ele, struct winch, list); | 795 | winch = list_entry(ele, struct winch, list); |
788 | if(winch->fd != -1){ | 796 | if(winch->fd != -1){ |
797 | /* Why is this different from the above free_irq(), | ||
798 | * which deactivates SIGIO? This searches the FD | ||
799 | * somewhere else and removes it from the list... */ | ||
789 | deactivate_fd(winch->fd, WINCH_IRQ); | 800 | deactivate_fd(winch->fd, WINCH_IRQ); |
790 | os_close_file(winch->fd); | 801 | os_close_file(winch->fd); |
791 | } | 802 | } |
diff --git a/arch/um/include/mem.h b/arch/um/include/mem.h index 10c46c38949a..99d3ad4a03e5 100644 --- a/arch/um/include/mem.h +++ b/arch/um/include/mem.h | |||
@@ -13,6 +13,7 @@ extern int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w); | |||
13 | extern int is_remapped(void *virt); | 13 | extern int is_remapped(void *virt); |
14 | extern int physmem_remove_mapping(void *virt); | 14 | extern int physmem_remove_mapping(void *virt); |
15 | extern void physmem_forget_descriptor(int fd); | 15 | extern void physmem_forget_descriptor(int fd); |
16 | extern unsigned long to_phys(void *virt); | ||
16 | 17 | ||
17 | #endif | 18 | #endif |
18 | 19 | ||
diff --git a/arch/um/include/registers.h b/arch/um/include/registers.h index 8744abb5224f..0a35e6d0baa0 100644 --- a/arch/um/include/registers.h +++ b/arch/um/include/registers.h | |||
@@ -14,6 +14,7 @@ extern int restore_fp_registers(int pid, unsigned long *fp_regs); | |||
14 | extern void save_registers(int pid, union uml_pt_regs *regs); | 14 | extern void save_registers(int pid, union uml_pt_regs *regs); |
15 | extern void restore_registers(int pid, union uml_pt_regs *regs); | 15 | extern void restore_registers(int pid, union uml_pt_regs *regs); |
16 | extern void init_registers(int pid); | 16 | extern void init_registers(int pid); |
17 | extern void get_safe_registers(unsigned long * regs); | ||
17 | 18 | ||
18 | #endif | 19 | #endif |
19 | 20 | ||
diff --git a/arch/um/include/sysdep-i386/ptrace_user.h b/arch/um/include/sysdep-i386/ptrace_user.h index eca8066e7a43..899aa4b2a78d 100644 --- a/arch/um/include/sysdep-i386/ptrace_user.h +++ b/arch/um/include/sysdep-i386/ptrace_user.h | |||
@@ -20,11 +20,24 @@ | |||
20 | #define PT_SYSCALL_ARG3_OFFSET PT_OFFSET(EDX) | 20 | #define PT_SYSCALL_ARG3_OFFSET PT_OFFSET(EDX) |
21 | #define PT_SYSCALL_ARG4_OFFSET PT_OFFSET(ESI) | 21 | #define PT_SYSCALL_ARG4_OFFSET PT_OFFSET(ESI) |
22 | #define PT_SYSCALL_ARG5_OFFSET PT_OFFSET(EDI) | 22 | #define PT_SYSCALL_ARG5_OFFSET PT_OFFSET(EDI) |
23 | #define PT_SYSCALL_ARG6_OFFSET PT_OFFSET(EBP) | ||
23 | 24 | ||
24 | #define PT_SYSCALL_RET_OFFSET PT_OFFSET(EAX) | 25 | #define PT_SYSCALL_RET_OFFSET PT_OFFSET(EAX) |
25 | 26 | ||
27 | #define REGS_SYSCALL_NR EAX /* This is used before a system call */ | ||
28 | #define REGS_SYSCALL_ARG1 EBX | ||
29 | #define REGS_SYSCALL_ARG2 ECX | ||
30 | #define REGS_SYSCALL_ARG3 EDX | ||
31 | #define REGS_SYSCALL_ARG4 ESI | ||
32 | #define REGS_SYSCALL_ARG5 EDI | ||
33 | #define REGS_SYSCALL_ARG6 EBP | ||
34 | |||
35 | #define REGS_IP_INDEX EIP | ||
36 | #define REGS_SP_INDEX UESP | ||
37 | |||
26 | #define PT_IP_OFFSET PT_OFFSET(EIP) | 38 | #define PT_IP_OFFSET PT_OFFSET(EIP) |
27 | #define PT_IP(regs) ((regs)[EIP]) | 39 | #define PT_IP(regs) ((regs)[EIP]) |
40 | #define PT_SP_OFFSET PT_OFFSET(UESP) | ||
28 | #define PT_SP(regs) ((regs)[UESP]) | 41 | #define PT_SP(regs) ((regs)[UESP]) |
29 | 42 | ||
30 | #ifndef FRAME_SIZE | 43 | #ifndef FRAME_SIZE |
diff --git a/arch/um/include/sysdep-i386/stub.h b/arch/um/include/sysdep-i386/stub.h new file mode 100644 index 000000000000..d3699fe1c613 --- /dev/null +++ b/arch/um/include/sysdep-i386/stub.h | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #ifndef __SYSDEP_STUB_H | ||
7 | #define __SYSDEP_STUB_H | ||
8 | |||
9 | #include <asm/ptrace.h> | ||
10 | #include <asm/unistd.h> | ||
11 | |||
12 | extern void stub_segv_handler(int sig); | ||
13 | extern void stub_clone_handler(void); | ||
14 | |||
15 | #define STUB_SYSCALL_RET EAX | ||
16 | #define STUB_MMAP_NR __NR_mmap2 | ||
17 | #define MMAP_OFFSET(o) ((o) >> PAGE_SHIFT) | ||
18 | |||
19 | static inline long stub_syscall2(long syscall, long arg1, long arg2) | ||
20 | { | ||
21 | long ret; | ||
22 | |||
23 | __asm__("movl %0, %%ecx; " : : "g" (arg2) : "%ecx"); | ||
24 | __asm__("movl %0, %%ebx; " : : "g" (arg1) : "%ebx"); | ||
25 | __asm__("movl %0, %%eax; " : : "g" (syscall) : "%eax"); | ||
26 | __asm__("int $0x80;" : : : "%eax"); | ||
27 | __asm__ __volatile__("movl %%eax, %0; " : "=g" (ret) :); | ||
28 | return(ret); | ||
29 | } | ||
30 | |||
31 | static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3) | ||
32 | { | ||
33 | __asm__("movl %0, %%edx; " : : "g" (arg3) : "%edx"); | ||
34 | return(stub_syscall2(syscall, arg1, arg2)); | ||
35 | } | ||
36 | |||
37 | static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3, | ||
38 | long arg4) | ||
39 | { | ||
40 | __asm__("movl %0, %%esi; " : : "g" (arg4) : "%esi"); | ||
41 | return(stub_syscall3(syscall, arg1, arg2, arg3)); | ||
42 | } | ||
43 | |||
44 | static inline long stub_syscall6(long syscall, long arg1, long arg2, long arg3, | ||
45 | long arg4, long arg5, long arg6) | ||
46 | { | ||
47 | long ret; | ||
48 | __asm__("movl %0, %%eax; " : : "g" (syscall) : "%eax"); | ||
49 | __asm__("movl %0, %%ebx; " : : "g" (arg1) : "%ebx"); | ||
50 | __asm__("movl %0, %%ecx; " : : "g" (arg2) : "%ecx"); | ||
51 | __asm__("movl %0, %%edx; " : : "g" (arg3) : "%edx"); | ||
52 | __asm__("movl %0, %%esi; " : : "g" (arg4) : "%esi"); | ||
53 | __asm__("movl %0, %%edi; " : : "g" (arg5) : "%edi"); | ||
54 | __asm__ __volatile__("pushl %%ebp ; movl %1, %%ebp; " | ||
55 | "int $0x80; popl %%ebp ; " | ||
56 | "movl %%eax, %0; " : "=g" (ret) : "g" (arg6) : "%eax"); | ||
57 | return(ret); | ||
58 | } | ||
59 | |||
60 | static inline void trap_myself(void) | ||
61 | { | ||
62 | __asm("int3"); | ||
63 | } | ||
64 | |||
65 | #endif | ||
diff --git a/arch/um/include/sysdep-x86_64/ptrace_user.h b/arch/um/include/sysdep-x86_64/ptrace_user.h index 31729973fb14..128faf027364 100644 --- a/arch/um/include/sysdep-x86_64/ptrace_user.h +++ b/arch/um/include/sysdep-x86_64/ptrace_user.h | |||
@@ -55,6 +55,20 @@ | |||
55 | #define PTRACE_OLDSETOPTIONS 21 | 55 | #define PTRACE_OLDSETOPTIONS 21 |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | /* These are before the system call, so the the system call number is RAX | ||
59 | * rather than ORIG_RAX, and arg4 is R10 rather than RCX | ||
60 | */ | ||
61 | #define REGS_SYSCALL_NR PT_INDEX(RAX) | ||
62 | #define REGS_SYSCALL_ARG1 PT_INDEX(RDI) | ||
63 | #define REGS_SYSCALL_ARG2 PT_INDEX(RSI) | ||
64 | #define REGS_SYSCALL_ARG3 PT_INDEX(RDX) | ||
65 | #define REGS_SYSCALL_ARG4 PT_INDEX(R10) | ||
66 | #define REGS_SYSCALL_ARG5 PT_INDEX(R8) | ||
67 | #define REGS_SYSCALL_ARG6 PT_INDEX(R9) | ||
68 | |||
69 | #define REGS_IP_INDEX PT_INDEX(RIP) | ||
70 | #define REGS_SP_INDEX PT_INDEX(RSP) | ||
71 | |||
58 | #endif | 72 | #endif |
59 | 73 | ||
60 | /* | 74 | /* |
diff --git a/arch/um/include/sysdep-x86_64/stub.h b/arch/um/include/sysdep-x86_64/stub.h new file mode 100644 index 000000000000..f599058d8263 --- /dev/null +++ b/arch/um/include/sysdep-x86_64/stub.h | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #ifndef __SYSDEP_STUB_H | ||
7 | #define __SYSDEP_STUB_H | ||
8 | |||
9 | #include <asm/ptrace.h> | ||
10 | #include <asm/unistd.h> | ||
11 | #include <sysdep/ptrace_user.h> | ||
12 | |||
13 | extern void stub_segv_handler(int sig); | ||
14 | extern void stub_clone_handler(void); | ||
15 | |||
16 | #define STUB_SYSCALL_RET PT_INDEX(RAX) | ||
17 | #define STUB_MMAP_NR __NR_mmap | ||
18 | #define MMAP_OFFSET(o) (o) | ||
19 | |||
20 | static inline long stub_syscall2(long syscall, long arg1, long arg2) | ||
21 | { | ||
22 | long ret; | ||
23 | |||
24 | __asm__("movq %0, %%rsi; " : : "g" (arg2) : "%rsi"); | ||
25 | __asm__("movq %0, %%rdi; " : : "g" (arg1) : "%rdi"); | ||
26 | __asm__("movq %0, %%rax; " : : "g" (syscall) : "%rax"); | ||
27 | __asm__("syscall;" : : : "%rax", "%r11", "%rcx"); | ||
28 | __asm__ __volatile__("movq %%rax, %0; " : "=g" (ret) :); | ||
29 | return(ret); | ||
30 | } | ||
31 | |||
32 | static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3) | ||
33 | { | ||
34 | __asm__("movq %0, %%rdx; " : : "g" (arg3) : "%rdx"); | ||
35 | return(stub_syscall2(syscall, arg1, arg2)); | ||
36 | } | ||
37 | |||
38 | static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3, | ||
39 | long arg4) | ||
40 | { | ||
41 | __asm__("movq %0, %%r10; " : : "g" (arg4) : "%r10"); | ||
42 | return(stub_syscall3(syscall, arg1, arg2, arg3)); | ||
43 | } | ||
44 | |||
45 | static inline long stub_syscall6(long syscall, long arg1, long arg2, long arg3, | ||
46 | long arg4, long arg5, long arg6) | ||
47 | { | ||
48 | __asm__("movq %0, %%r9; " : : "g" (arg6) : "%r9"); | ||
49 | __asm__("movq %0, %%r8; " : : "g" (arg5) : "%r8"); | ||
50 | return(stub_syscall4(syscall, arg1, arg2, arg3, arg4)); | ||
51 | } | ||
52 | |||
53 | static inline void trap_myself(void) | ||
54 | { | ||
55 | __asm("int3"); | ||
56 | } | ||
57 | |||
58 | #endif | ||
diff --git a/arch/um/include/time_user.h b/arch/um/include/time_user.h index f64ef77019a3..17d7ef2141f4 100644 --- a/arch/um/include/time_user.h +++ b/arch/um/include/time_user.h | |||
@@ -10,6 +10,7 @@ extern void timer(void); | |||
10 | extern void switch_timers(int to_real); | 10 | extern void switch_timers(int to_real); |
11 | extern void idle_sleep(int secs); | 11 | extern void idle_sleep(int secs); |
12 | extern void enable_timer(void); | 12 | extern void enable_timer(void); |
13 | extern void prepare_timer(void * ptr); | ||
13 | extern void disable_timer(void); | 14 | extern void disable_timer(void); |
14 | extern unsigned long time_lock(void); | 15 | extern unsigned long time_lock(void); |
15 | extern void time_unlock(unsigned long); | 16 | extern void time_unlock(unsigned long); |
diff --git a/arch/um/include/tlb.h b/arch/um/include/tlb.h index da1097285b8c..c6f9628f39bf 100644 --- a/arch/um/include/tlb.h +++ b/arch/um/include/tlb.h | |||
@@ -37,31 +37,25 @@ struct host_vm_op { | |||
37 | extern void mprotect_kernel_vm(int w); | 37 | extern void mprotect_kernel_vm(int w); |
38 | extern void force_flush_all(void); | 38 | extern void force_flush_all(void); |
39 | extern void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | 39 | extern void fix_range_common(struct mm_struct *mm, unsigned long start_addr, |
40 | unsigned long end_addr, int force, int data, | 40 | unsigned long end_addr, int force, |
41 | void (*do_ops)(int, struct host_vm_op *, int)); | 41 | void (*do_ops)(union mm_context *, |
42 | struct host_vm_op *, int)); | ||
42 | extern int flush_tlb_kernel_range_common(unsigned long start, | 43 | extern int flush_tlb_kernel_range_common(unsigned long start, |
43 | unsigned long end); | 44 | unsigned long end); |
44 | 45 | ||
45 | extern int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, | 46 | extern int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, |
46 | int r, int w, int x, struct host_vm_op *ops, int index, | 47 | int r, int w, int x, struct host_vm_op *ops, int index, |
47 | int last_filled, int data, | 48 | int last_filled, union mm_context *mmu, |
48 | void (*do_ops)(int, struct host_vm_op *, int)); | 49 | void (*do_ops)(union mm_context *, struct host_vm_op *, |
50 | int)); | ||
49 | extern int add_munmap(unsigned long addr, unsigned long len, | 51 | extern int add_munmap(unsigned long addr, unsigned long len, |
50 | struct host_vm_op *ops, int index, int last_filled, | 52 | struct host_vm_op *ops, int index, int last_filled, |
51 | int data, void (*do_ops)(int, struct host_vm_op *, int)); | 53 | union mm_context *mmu, |
54 | void (*do_ops)(union mm_context *, struct host_vm_op *, | ||
55 | int)); | ||
52 | extern int add_mprotect(unsigned long addr, unsigned long len, int r, int w, | 56 | extern int add_mprotect(unsigned long addr, unsigned long len, int r, int w, |
53 | int x, struct host_vm_op *ops, int index, | 57 | int x, struct host_vm_op *ops, int index, |
54 | int last_filled, int data, | 58 | int last_filled, union mm_context *mmu, |
55 | void (*do_ops)(int, struct host_vm_op *, int)); | 59 | void (*do_ops)(union mm_context *, struct host_vm_op *, |
60 | int)); | ||
56 | #endif | 61 | #endif |
57 | |||
58 | /* | ||
59 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
60 | * Emacs will notice this stuff at the end of the file and automatically | ||
61 | * adjust the settings for this buffer only. This must remain at the end | ||
62 | * of the file. | ||
63 | * --------------------------------------------------------------------------- | ||
64 | * Local variables: | ||
65 | * c-file-style: "linux" | ||
66 | * End: | ||
67 | */ | ||
diff --git a/arch/um/kernel/dyn.lds.S b/arch/um/kernel/dyn.lds.S index 715b0838a68c..3942a5f245de 100644 --- a/arch/um/kernel/dyn.lds.S +++ b/arch/um/kernel/dyn.lds.S | |||
@@ -67,6 +67,12 @@ SECTIONS | |||
67 | *(.stub .text.* .gnu.linkonce.t.*) | 67 | *(.stub .text.* .gnu.linkonce.t.*) |
68 | /* .gnu.warning sections are handled specially by elf32.em. */ | 68 | /* .gnu.warning sections are handled specially by elf32.em. */ |
69 | *(.gnu.warning) | 69 | *(.gnu.warning) |
70 | |||
71 | . = ALIGN(4096); | ||
72 | __syscall_stub_start = .; | ||
73 | *(.__syscall_stub*) | ||
74 | __syscall_stub_end = .; | ||
75 | . = ALIGN(4096); | ||
70 | } =0x90909090 | 76 | } =0x90909090 |
71 | .fini : { | 77 | .fini : { |
72 | KEEP (*(.fini)) | 78 | KEEP (*(.fini)) |
diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c index 420e6d51fa0f..a24e3b7f4bf0 100644 --- a/arch/um/kernel/physmem.c +++ b/arch/um/kernel/physmem.c | |||
@@ -353,6 +353,8 @@ void map_memory(unsigned long virt, unsigned long phys, unsigned long len, | |||
353 | 353 | ||
354 | #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) | 354 | #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) |
355 | 355 | ||
356 | extern int __syscall_stub_start, __binary_start; | ||
357 | |||
356 | void setup_physmem(unsigned long start, unsigned long reserve_end, | 358 | void setup_physmem(unsigned long start, unsigned long reserve_end, |
357 | unsigned long len, unsigned long highmem) | 359 | unsigned long len, unsigned long highmem) |
358 | { | 360 | { |
@@ -371,6 +373,12 @@ void setup_physmem(unsigned long start, unsigned long reserve_end, | |||
371 | exit(1); | 373 | exit(1); |
372 | } | 374 | } |
373 | 375 | ||
376 | /* Special kludge - This page will be mapped in to userspace processes | ||
377 | * from physmem_fd, so it needs to be written out there. | ||
378 | */ | ||
379 | os_seek_file(physmem_fd, __pa(&__syscall_stub_start)); | ||
380 | os_write_file(physmem_fd, &__syscall_stub_start, PAGE_SIZE); | ||
381 | |||
374 | bootmap_size = init_bootmem(pfn, pfn + delta); | 382 | bootmap_size = init_bootmem(pfn, pfn + delta); |
375 | free_bootmem(__pa(reserve_end) + bootmap_size, | 383 | free_bootmem(__pa(reserve_end) + bootmap_size, |
376 | len - bootmap_size - reserve); | 384 | len - bootmap_size - reserve); |
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 1b5ef3e96c71..c45a60e9c92d 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "uml-config.h" | 32 | #include "uml-config.h" |
33 | #include "choose-mode.h" | 33 | #include "choose-mode.h" |
34 | #include "mode.h" | 34 | #include "mode.h" |
35 | #include "tempfile.h" | ||
35 | #ifdef UML_CONFIG_MODE_SKAS | 36 | #ifdef UML_CONFIG_MODE_SKAS |
36 | #include "skas.h" | 37 | #include "skas.h" |
37 | #include "skas_ptrace.h" | 38 | #include "skas_ptrace.h" |
@@ -358,11 +359,16 @@ void forward_pending_sigio(int target) | |||
358 | kill(target, SIGIO); | 359 | kill(target, SIGIO); |
359 | } | 360 | } |
360 | 361 | ||
362 | int ptrace_faultinfo = 0; | ||
363 | int proc_mm = 1; | ||
364 | |||
365 | extern void *__syscall_stub_start, __syscall_stub_end; | ||
366 | |||
361 | #ifdef UML_CONFIG_MODE_SKAS | 367 | #ifdef UML_CONFIG_MODE_SKAS |
362 | static inline int check_skas3_ptrace_support(void) | 368 | static inline void check_skas3_ptrace_support(void) |
363 | { | 369 | { |
364 | struct ptrace_faultinfo fi; | 370 | struct ptrace_faultinfo fi; |
365 | int pid, n, ret = 1; | 371 | int pid, n; |
366 | 372 | ||
367 | printf("Checking for the skas3 patch in the host..."); | 373 | printf("Checking for the skas3 patch in the host..."); |
368 | pid = start_ptraced_child(); | 374 | pid = start_ptraced_child(); |
@@ -374,33 +380,31 @@ static inline int check_skas3_ptrace_support(void) | |||
374 | else { | 380 | else { |
375 | perror("not found"); | 381 | perror("not found"); |
376 | } | 382 | } |
377 | ret = 0; | 383 | } |
378 | } else { | 384 | else { |
385 | ptrace_faultinfo = 1; | ||
379 | printf("found\n"); | 386 | printf("found\n"); |
380 | } | 387 | } |
381 | 388 | ||
382 | init_registers(pid); | 389 | init_registers(pid); |
383 | stop_ptraced_child(pid, 1, 1); | 390 | stop_ptraced_child(pid, 1, 1); |
384 | |||
385 | return(ret); | ||
386 | } | 391 | } |
387 | 392 | ||
388 | int can_do_skas(void) | 393 | int can_do_skas(void) |
389 | { | 394 | { |
390 | int ret = 1; | ||
391 | |||
392 | printf("Checking for /proc/mm..."); | 395 | printf("Checking for /proc/mm..."); |
393 | if (os_access("/proc/mm", OS_ACC_W_OK) < 0) { | 396 | if (os_access("/proc/mm", OS_ACC_W_OK) < 0) { |
397 | proc_mm = 0; | ||
394 | printf("not found\n"); | 398 | printf("not found\n"); |
395 | ret = 0; | ||
396 | goto out; | 399 | goto out; |
397 | } else { | 400 | } |
401 | else { | ||
398 | printf("found\n"); | 402 | printf("found\n"); |
399 | } | 403 | } |
400 | 404 | ||
401 | ret = check_skas3_ptrace_support(); | ||
402 | out: | 405 | out: |
403 | return ret; | 406 | check_skas3_ptrace_support(); |
407 | return 1; | ||
404 | } | 408 | } |
405 | #else | 409 | #else |
406 | int can_do_skas(void) | 410 | int can_do_skas(void) |
diff --git a/arch/um/kernel/skas/Makefile b/arch/um/kernel/skas/Makefile index ff69c4b312c0..d296d55ade4b 100644 --- a/arch/um/kernel/skas/Makefile +++ b/arch/um/kernel/skas/Makefile | |||
@@ -3,11 +3,14 @@ | |||
3 | # Licensed under the GPL | 3 | # Licensed under the GPL |
4 | # | 4 | # |
5 | 5 | ||
6 | obj-y := exec_kern.o mem.o mem_user.o mmu.o process.o process_kern.o \ | 6 | obj-y := clone.o exec_kern.o mem.o mem_user.o mmu.o process.o process_kern.o \ |
7 | syscall_kern.o syscall_user.o tlb.o trap_user.o uaccess.o \ | 7 | syscall_kern.o syscall_user.o tlb.o trap_user.o uaccess.o \ |
8 | 8 | ||
9 | subdir- := util | 9 | subdir- := util |
10 | 10 | ||
11 | USER_OBJS := process.o | 11 | USER_OBJS := process.o clone.o |
12 | 12 | ||
13 | include arch/um/scripts/Makefile.rules | 13 | include arch/um/scripts/Makefile.rules |
14 | |||
15 | # clone.o is in the stub, so it can't be built with profiling | ||
16 | $(obj)/clone.o : c_flags = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) | ||
diff --git a/arch/um/kernel/skas/clone.c b/arch/um/kernel/skas/clone.c new file mode 100644 index 000000000000..4dc55f10cd18 --- /dev/null +++ b/arch/um/kernel/skas/clone.c | |||
@@ -0,0 +1,44 @@ | |||
1 | #include <sched.h> | ||
2 | #include <signal.h> | ||
3 | #include <sys/mman.h> | ||
4 | #include <sys/time.h> | ||
5 | #include <asm/unistd.h> | ||
6 | #include <asm/page.h> | ||
7 | #include "ptrace_user.h" | ||
8 | #include "skas.h" | ||
9 | #include "stub-data.h" | ||
10 | #include "uml-config.h" | ||
11 | #include "sysdep/stub.h" | ||
12 | |||
13 | /* This is in a separate file because it needs to be compiled with any | ||
14 | * extraneous gcc flags (-pg, -fprofile-arcs, -ftest-coverage) disabled | ||
15 | */ | ||
16 | void __attribute__ ((__section__ (".__syscall_stub"))) | ||
17 | stub_clone_handler(void) | ||
18 | { | ||
19 | long err; | ||
20 | struct stub_data *from = (struct stub_data *) UML_CONFIG_STUB_DATA; | ||
21 | |||
22 | err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD, | ||
23 | UML_CONFIG_STUB_DATA + PAGE_SIZE / 2 - | ||
24 | sizeof(void *)); | ||
25 | if(err != 0) | ||
26 | goto out; | ||
27 | |||
28 | err = stub_syscall4(__NR_ptrace, PTRACE_TRACEME, 0, 0, 0); | ||
29 | if(err) | ||
30 | goto out; | ||
31 | |||
32 | err = stub_syscall3(__NR_setitimer, ITIMER_VIRTUAL, | ||
33 | (long) &from->timer, 0); | ||
34 | if(err) | ||
35 | goto out; | ||
36 | |||
37 | err = stub_syscall6(STUB_MMAP_NR, UML_CONFIG_STUB_DATA, PAGE_SIZE, | ||
38 | PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, | ||
39 | from->fd, from->offset); | ||
40 | out: | ||
41 | /* save current result. Parent: pid; child: retcode of mmap */ | ||
42 | from->err = err; | ||
43 | trap_myself(); | ||
44 | } | ||
diff --git a/arch/um/kernel/skas/exec_kern.c b/arch/um/kernel/skas/exec_kern.c index c6b4d5dba789..77ed7bbab219 100644 --- a/arch/um/kernel/skas/exec_kern.c +++ b/arch/um/kernel/skas/exec_kern.c | |||
@@ -18,7 +18,7 @@ | |||
18 | void flush_thread_skas(void) | 18 | void flush_thread_skas(void) |
19 | { | 19 | { |
20 | force_flush_all(); | 20 | force_flush_all(); |
21 | switch_mm_skas(current->mm->context.skas.mm_fd); | 21 | switch_mm_skas(¤t->mm->context.skas.id); |
22 | } | 22 | } |
23 | 23 | ||
24 | void start_thread_skas(struct pt_regs *regs, unsigned long eip, | 24 | void start_thread_skas(struct pt_regs *regs, unsigned long eip, |
diff --git a/arch/um/kernel/skas/include/mm_id.h b/arch/um/kernel/skas/include/mm_id.h new file mode 100644 index 000000000000..48dd0989ddaa --- /dev/null +++ b/arch/um/kernel/skas/include/mm_id.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 Jeff Dike (jdike@karaya.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #ifndef __MM_ID_H | ||
7 | #define __MM_ID_H | ||
8 | |||
9 | struct mm_id { | ||
10 | union { | ||
11 | int mm_fd; | ||
12 | int pid; | ||
13 | } u; | ||
14 | unsigned long stack; | ||
15 | }; | ||
16 | |||
17 | #endif | ||
diff --git a/arch/um/kernel/skas/include/mmu-skas.h b/arch/um/kernel/skas/include/mmu-skas.h index 4cd60d7213f3..278b72f1d9ad 100644 --- a/arch/um/kernel/skas/include/mmu-skas.h +++ b/arch/um/kernel/skas/include/mmu-skas.h | |||
@@ -6,10 +6,15 @@ | |||
6 | #ifndef __SKAS_MMU_H | 6 | #ifndef __SKAS_MMU_H |
7 | #define __SKAS_MMU_H | 7 | #define __SKAS_MMU_H |
8 | 8 | ||
9 | #include "mm_id.h" | ||
10 | |||
9 | struct mmu_context_skas { | 11 | struct mmu_context_skas { |
10 | int mm_fd; | 12 | struct mm_id id; |
13 | unsigned long last_page_table; | ||
11 | }; | 14 | }; |
12 | 15 | ||
16 | extern void switch_mm_skas(struct mm_id * mm_idp); | ||
17 | |||
13 | #endif | 18 | #endif |
14 | 19 | ||
15 | /* | 20 | /* |
diff --git a/arch/um/kernel/skas/include/skas.h b/arch/um/kernel/skas/include/skas.h index 96b51dba3471..d983ea842547 100644 --- a/arch/um/kernel/skas/include/skas.h +++ b/arch/um/kernel/skas/include/skas.h | |||
@@ -6,9 +6,11 @@ | |||
6 | #ifndef __SKAS_H | 6 | #ifndef __SKAS_H |
7 | #define __SKAS_H | 7 | #define __SKAS_H |
8 | 8 | ||
9 | #include "mm_id.h" | ||
9 | #include "sysdep/ptrace.h" | 10 | #include "sysdep/ptrace.h" |
10 | 11 | ||
11 | extern int userspace_pid[]; | 12 | extern int userspace_pid[]; |
13 | extern int proc_mm, ptrace_faultinfo; | ||
12 | 14 | ||
13 | extern void switch_threads(void *me, void *next); | 15 | extern void switch_threads(void *me, void *next); |
14 | extern void thread_wait(void *sw, void *fb); | 16 | extern void thread_wait(void *sw, void *fb); |
@@ -22,16 +24,18 @@ extern void new_thread_proc(void *stack, void (*handler)(int sig)); | |||
22 | extern void remove_sigstack(void); | 24 | extern void remove_sigstack(void); |
23 | extern void new_thread_handler(int sig); | 25 | extern void new_thread_handler(int sig); |
24 | extern void handle_syscall(union uml_pt_regs *regs); | 26 | extern void handle_syscall(union uml_pt_regs *regs); |
25 | extern void map(int fd, unsigned long virt, unsigned long len, int r, int w, | 27 | extern int map(struct mm_id * mm_idp, unsigned long virt, unsigned long len, |
26 | int x, int phys_fd, unsigned long long offset); | 28 | int r, int w, int x, int phys_fd, unsigned long long offset); |
27 | extern int unmap(int fd, void *addr, unsigned long len); | 29 | extern int unmap(struct mm_id * mm_idp, void *addr, unsigned long len); |
28 | extern int protect(int fd, unsigned long addr, unsigned long len, | 30 | extern int protect(struct mm_id * mm_idp, unsigned long addr, |
29 | int r, int w, int x); | 31 | unsigned long len, int r, int w, int x); |
30 | extern void user_signal(int sig, union uml_pt_regs *regs, int pid); | 32 | extern void user_signal(int sig, union uml_pt_regs *regs, int pid); |
31 | extern int new_mm(int from); | 33 | extern int new_mm(int from); |
32 | extern void start_userspace(int cpu); | 34 | extern int start_userspace(unsigned long stub_stack); |
35 | extern int copy_context_skas0(unsigned long stack, int pid); | ||
33 | extern void get_skas_faultinfo(int pid, struct faultinfo * fi); | 36 | extern void get_skas_faultinfo(int pid, struct faultinfo * fi); |
34 | extern long execute_syscall_skas(void *r); | 37 | extern long execute_syscall_skas(void *r); |
38 | extern unsigned long current_stub_stack(void); | ||
35 | 39 | ||
36 | #endif | 40 | #endif |
37 | 41 | ||
diff --git a/arch/um/kernel/skas/include/stub-data.h b/arch/um/kernel/skas/include/stub-data.h new file mode 100644 index 000000000000..f6ed92c3727d --- /dev/null +++ b/arch/um/kernel/skas/include/stub-data.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 Jeff Dike (jdike@karaya.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #ifndef __STUB_DATA_H | ||
7 | #define __STUB_DATA_H | ||
8 | |||
9 | #include <sys/time.h> | ||
10 | |||
11 | struct stub_data { | ||
12 | long offset; | ||
13 | int fd; | ||
14 | struct itimerval timer; | ||
15 | long err; | ||
16 | }; | ||
17 | |||
18 | #endif | ||
diff --git a/arch/um/kernel/skas/mem.c b/arch/um/kernel/skas/mem.c index 438db2f43456..147466d7ff4f 100644 --- a/arch/um/kernel/skas/mem.c +++ b/arch/um/kernel/skas/mem.c | |||
@@ -5,7 +5,9 @@ | |||
5 | 5 | ||
6 | #include "linux/config.h" | 6 | #include "linux/config.h" |
7 | #include "linux/mm.h" | 7 | #include "linux/mm.h" |
8 | #include "asm/pgtable.h" | ||
8 | #include "mem_user.h" | 9 | #include "mem_user.h" |
10 | #include "skas.h" | ||
9 | 11 | ||
10 | unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, | 12 | unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, |
11 | unsigned long *task_size_out) | 13 | unsigned long *task_size_out) |
@@ -18,7 +20,9 @@ unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, | |||
18 | *task_size_out = CONFIG_HOST_TASK_SIZE; | 20 | *task_size_out = CONFIG_HOST_TASK_SIZE; |
19 | #else | 21 | #else |
20 | *host_size_out = top; | 22 | *host_size_out = top; |
21 | *task_size_out = top; | 23 | if (proc_mm && ptrace_faultinfo) |
24 | *task_size_out = top; | ||
25 | else *task_size_out = CONFIG_STUB_START & PGDIR_MASK; | ||
22 | #endif | 26 | #endif |
23 | return(((unsigned long) set_task_sizes_skas) & ~0xffffff); | 27 | return(((unsigned long) set_task_sizes_skas) & ~0xffffff); |
24 | } | 28 | } |
diff --git a/arch/um/kernel/skas/mem_user.c b/arch/um/kernel/skas/mem_user.c index 1310bf1e88d1..b0980ff3bd95 100644 --- a/arch/um/kernel/skas/mem_user.c +++ b/arch/um/kernel/skas/mem_user.c | |||
@@ -3,100 +3,171 @@ | |||
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <signal.h> | ||
6 | #include <errno.h> | 7 | #include <errno.h> |
7 | #include <sys/mman.h> | 8 | #include <sys/mman.h> |
9 | #include <sys/wait.h> | ||
10 | #include <asm/page.h> | ||
11 | #include <asm/unistd.h> | ||
8 | #include "mem_user.h" | 12 | #include "mem_user.h" |
9 | #include "mem.h" | 13 | #include "mem.h" |
14 | #include "mm_id.h" | ||
10 | #include "user.h" | 15 | #include "user.h" |
11 | #include "os.h" | 16 | #include "os.h" |
12 | #include "proc_mm.h" | 17 | #include "proc_mm.h" |
13 | 18 | #include "ptrace_user.h" | |
14 | void map(int fd, unsigned long virt, unsigned long len, int r, int w, | 19 | #include "user_util.h" |
15 | int x, int phys_fd, unsigned long long offset) | 20 | #include "kern_util.h" |
21 | #include "task.h" | ||
22 | #include "registers.h" | ||
23 | #include "uml-config.h" | ||
24 | #include "sysdep/ptrace.h" | ||
25 | #include "sysdep/stub.h" | ||
26 | #include "skas.h" | ||
27 | |||
28 | extern unsigned long syscall_stub, __syscall_stub_start; | ||
29 | |||
30 | extern void wait_stub_done(int pid, int sig, char * fname); | ||
31 | |||
32 | static long run_syscall_stub(struct mm_id * mm_idp, int syscall, | ||
33 | unsigned long *args) | ||
16 | { | 34 | { |
17 | struct proc_mm_op map; | 35 | int n, pid = mm_idp->u.pid; |
18 | int prot, n; | 36 | unsigned long regs[MAX_REG_NR]; |
19 | 37 | ||
20 | prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | | 38 | get_safe_registers(regs); |
21 | (x ? PROT_EXEC : 0); | 39 | regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + |
22 | 40 | ((unsigned long) &syscall_stub - | |
23 | map = ((struct proc_mm_op) { .op = MM_MMAP, | 41 | (unsigned long) &__syscall_stub_start); |
24 | .u = | 42 | /* XXX Don't have a define for starting a syscall */ |
25 | { .mmap = | 43 | regs[REGS_SYSCALL_NR] = syscall; |
26 | { .addr = virt, | 44 | regs[REGS_SYSCALL_ARG1] = args[0]; |
27 | .len = len, | 45 | regs[REGS_SYSCALL_ARG2] = args[1]; |
28 | .prot = prot, | 46 | regs[REGS_SYSCALL_ARG3] = args[2]; |
29 | .flags = MAP_SHARED | | 47 | regs[REGS_SYSCALL_ARG4] = args[3]; |
30 | MAP_FIXED, | 48 | regs[REGS_SYSCALL_ARG5] = args[4]; |
31 | .fd = phys_fd, | 49 | regs[REGS_SYSCALL_ARG6] = args[5]; |
32 | .offset = offset | 50 | n = ptrace_setregs(pid, regs); |
33 | } } } ); | 51 | if(n < 0){ |
34 | n = os_write_file(fd, &map, sizeof(map)); | 52 | printk("run_syscall_stub : PTRACE_SETREGS failed, " |
35 | if(n != sizeof(map)) | 53 | "errno = %d\n", n); |
36 | printk("map : /proc/mm map failed, err = %d\n", -n); | 54 | return(n); |
55 | } | ||
56 | |||
57 | wait_stub_done(pid, 0, "run_syscall_stub"); | ||
58 | |||
59 | return(*((unsigned long *) mm_idp->stack)); | ||
37 | } | 60 | } |
38 | 61 | ||
39 | int unmap(int fd, void *addr, unsigned long len) | 62 | int map(struct mm_id *mm_idp, unsigned long virt, unsigned long len, |
63 | int r, int w, int x, int phys_fd, unsigned long long offset) | ||
40 | { | 64 | { |
41 | struct proc_mm_op unmap; | 65 | int prot, n; |
42 | int n; | 66 | |
43 | 67 | prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | | |
44 | unmap = ((struct proc_mm_op) { .op = MM_MUNMAP, | 68 | (x ? PROT_EXEC : 0); |
45 | .u = | 69 | |
46 | { .munmap = | 70 | if(proc_mm){ |
47 | { .addr = (unsigned long) addr, | 71 | struct proc_mm_op map; |
48 | .len = len } } } ); | 72 | int fd = mm_idp->u.mm_fd; |
49 | n = os_write_file(fd, &unmap, sizeof(unmap)); | 73 | map = ((struct proc_mm_op) { .op = MM_MMAP, |
50 | if(n != sizeof(unmap)) { | 74 | .u = |
51 | if(n < 0) | 75 | { .mmap = |
52 | return(n); | 76 | { .addr = virt, |
53 | else if(n > 0) | 77 | .len = len, |
54 | return(-EIO); | 78 | .prot = prot, |
55 | } | 79 | .flags = MAP_SHARED | |
56 | 80 | MAP_FIXED, | |
57 | return(0); | 81 | .fd = phys_fd, |
82 | .offset= offset | ||
83 | } } } ); | ||
84 | n = os_write_file(fd, &map, sizeof(map)); | ||
85 | if(n != sizeof(map)) | ||
86 | printk("map : /proc/mm map failed, err = %d\n", -n); | ||
87 | } | ||
88 | else { | ||
89 | long res; | ||
90 | unsigned long args[] = { virt, len, prot, | ||
91 | MAP_SHARED | MAP_FIXED, phys_fd, | ||
92 | MMAP_OFFSET(offset) }; | ||
93 | |||
94 | res = run_syscall_stub(mm_idp, STUB_MMAP_NR, args); | ||
95 | if((void *) res == MAP_FAILED) | ||
96 | printk("mmap stub failed, errno = %d\n", res); | ||
97 | } | ||
98 | |||
99 | return 0; | ||
58 | } | 100 | } |
59 | 101 | ||
60 | int protect(int fd, unsigned long addr, unsigned long len, int r, int w, | 102 | int unmap(struct mm_id *mm_idp, void *addr, unsigned long len) |
61 | int x, int must_succeed) | ||
62 | { | 103 | { |
63 | struct proc_mm_op protect; | 104 | int n; |
64 | int prot, n; | 105 | |
65 | 106 | if(proc_mm){ | |
66 | prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | | 107 | struct proc_mm_op unmap; |
67 | (x ? PROT_EXEC : 0); | 108 | int fd = mm_idp->u.mm_fd; |
68 | 109 | unmap = ((struct proc_mm_op) { .op = MM_MUNMAP, | |
69 | protect = ((struct proc_mm_op) { .op = MM_MPROTECT, | 110 | .u = |
70 | .u = | 111 | { .munmap = |
71 | { .mprotect = | 112 | { .addr = |
72 | { .addr = (unsigned long) addr, | 113 | (unsigned long) addr, |
73 | .len = len, | 114 | .len = len } } } ); |
74 | .prot = prot } } } ); | 115 | n = os_write_file(fd, &unmap, sizeof(unmap)); |
75 | 116 | if(n != sizeof(unmap)) { | |
76 | n = os_write_file(fd, &protect, sizeof(protect)); | 117 | if(n < 0) |
77 | if(n != sizeof(protect)) { | 118 | return(n); |
78 | if(n == 0) return(0); | 119 | else if(n > 0) |
79 | 120 | return(-EIO); | |
80 | if(must_succeed) | 121 | } |
81 | panic("protect failed, err = %d", -n); | 122 | } |
82 | 123 | else { | |
83 | return(-EIO); | 124 | int res; |
84 | } | 125 | unsigned long args[] = { (unsigned long) addr, len, 0, 0, 0, |
126 | 0 }; | ||
127 | |||
128 | res = run_syscall_stub(mm_idp, __NR_munmap, args); | ||
129 | if(res < 0) | ||
130 | printk("munmap stub failed, errno = %d\n", res); | ||
131 | } | ||
132 | |||
133 | return(0); | ||
134 | } | ||
85 | 135 | ||
86 | return(0); | 136 | int protect(struct mm_id *mm_idp, unsigned long addr, unsigned long len, |
137 | int r, int w, int x) | ||
138 | { | ||
139 | struct proc_mm_op protect; | ||
140 | int prot, n; | ||
141 | |||
142 | prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | | ||
143 | (x ? PROT_EXEC : 0); | ||
144 | |||
145 | if(proc_mm){ | ||
146 | int fd = mm_idp->u.mm_fd; | ||
147 | protect = ((struct proc_mm_op) { .op = MM_MPROTECT, | ||
148 | .u = | ||
149 | { .mprotect = | ||
150 | { .addr = | ||
151 | (unsigned long) addr, | ||
152 | .len = len, | ||
153 | .prot = prot } } } ); | ||
154 | |||
155 | n = os_write_file(fd, &protect, sizeof(protect)); | ||
156 | if(n != sizeof(protect)) | ||
157 | panic("protect failed, err = %d", -n); | ||
158 | } | ||
159 | else { | ||
160 | int res; | ||
161 | unsigned long args[] = { addr, len, prot, 0, 0, 0 }; | ||
162 | |||
163 | res = run_syscall_stub(mm_idp, __NR_mprotect, args); | ||
164 | if(res < 0) | ||
165 | panic("mprotect stub failed, errno = %d\n", res); | ||
166 | } | ||
167 | |||
168 | return(0); | ||
87 | } | 169 | } |
88 | 170 | ||
89 | void before_mem_skas(unsigned long unused) | 171 | void before_mem_skas(unsigned long unused) |
90 | { | 172 | { |
91 | } | 173 | } |
92 | |||
93 | /* | ||
94 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
95 | * Emacs will notice this stuff at the end of the file and automatically | ||
96 | * adjust the settings for this buffer only. This must remain at the end | ||
97 | * of the file. | ||
98 | * --------------------------------------------------------------------------- | ||
99 | * Local variables: | ||
100 | * c-file-style: "linux" | ||
101 | * End: | ||
102 | */ | ||
diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index 6cb9a6d028a9..d232daa42c31 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c | |||
@@ -3,46 +3,143 @@ | |||
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include "linux/config.h" | ||
6 | #include "linux/sched.h" | 7 | #include "linux/sched.h" |
7 | #include "linux/list.h" | 8 | #include "linux/list.h" |
8 | #include "linux/spinlock.h" | 9 | #include "linux/spinlock.h" |
9 | #include "linux/slab.h" | 10 | #include "linux/slab.h" |
11 | #include "linux/errno.h" | ||
12 | #include "linux/mm.h" | ||
10 | #include "asm/current.h" | 13 | #include "asm/current.h" |
11 | #include "asm/segment.h" | 14 | #include "asm/segment.h" |
12 | #include "asm/mmu.h" | 15 | #include "asm/mmu.h" |
16 | #include "asm/pgalloc.h" | ||
17 | #include "asm/pgtable.h" | ||
13 | #include "os.h" | 18 | #include "os.h" |
14 | #include "skas.h" | 19 | #include "skas.h" |
15 | 20 | ||
21 | extern int __syscall_stub_start; | ||
22 | |||
23 | static int init_stub_pte(struct mm_struct *mm, unsigned long proc, | ||
24 | unsigned long kernel) | ||
25 | { | ||
26 | pgd_t *pgd; | ||
27 | pud_t *pud; | ||
28 | pmd_t *pmd; | ||
29 | pte_t *pte; | ||
30 | |||
31 | spin_lock(&mm->page_table_lock); | ||
32 | pgd = pgd_offset(mm, proc); | ||
33 | pud = pud_alloc(mm, pgd, proc); | ||
34 | if (!pud) | ||
35 | goto out; | ||
36 | |||
37 | pmd = pmd_alloc(mm, pud, proc); | ||
38 | if (!pmd) | ||
39 | goto out_pmd; | ||
40 | |||
41 | pte = pte_alloc_map(mm, pmd, proc); | ||
42 | if (!pte) | ||
43 | goto out_pte; | ||
44 | |||
45 | /* There's an interaction between the skas0 stub pages, stack | ||
46 | * randomization, and the BUG at the end of exit_mmap. exit_mmap | ||
47 | * checks that the number of page tables freed is the same as had | ||
48 | * been allocated. If the stack is on the last page table page, | ||
49 | * then the stack pte page will be freed, and if not, it won't. To | ||
50 | * avoid having to know where the stack is, or if the process mapped | ||
51 | * something at the top of its address space for some other reason, | ||
52 | * we set TASK_SIZE to end at the start of the last page table. | ||
53 | * This keeps exit_mmap off the last page, but introduces a leak | ||
54 | * of that page. So, we hang onto it here and free it in | ||
55 | * destroy_context_skas. | ||
56 | */ | ||
57 | |||
58 | mm->context.skas.last_page_table = pmd_page_kernel(*pmd); | ||
59 | |||
60 | *pte = mk_pte(virt_to_page(kernel), __pgprot(_PAGE_PRESENT)); | ||
61 | *pte = pte_mkexec(*pte); | ||
62 | *pte = pte_wrprotect(*pte); | ||
63 | spin_unlock(&mm->page_table_lock); | ||
64 | return(0); | ||
65 | |||
66 | out_pmd: | ||
67 | pud_free(pud); | ||
68 | out_pte: | ||
69 | pmd_free(pmd); | ||
70 | out: | ||
71 | spin_unlock(&mm->page_table_lock); | ||
72 | return(-ENOMEM); | ||
73 | } | ||
74 | |||
16 | int init_new_context_skas(struct task_struct *task, struct mm_struct *mm) | 75 | int init_new_context_skas(struct task_struct *task, struct mm_struct *mm) |
17 | { | 76 | { |
18 | int from; | 77 | struct mm_struct *cur_mm = current->mm; |
78 | struct mm_id *cur_mm_id = &cur_mm->context.skas.id; | ||
79 | struct mm_id *mm_id = &mm->context.skas.id; | ||
80 | unsigned long stack; | ||
81 | int from, ret; | ||
19 | 82 | ||
20 | if((current->mm != NULL) && (current->mm != &init_mm)) | 83 | if(proc_mm){ |
21 | from = current->mm->context.skas.mm_fd; | 84 | if((cur_mm != NULL) && (cur_mm != &init_mm)) |
22 | else from = -1; | 85 | from = cur_mm->context.skas.id.u.mm_fd; |
86 | else from = -1; | ||
23 | 87 | ||
24 | mm->context.skas.mm_fd = new_mm(from); | 88 | ret = new_mm(from); |
25 | if(mm->context.skas.mm_fd < 0){ | 89 | if(ret < 0){ |
26 | printk("init_new_context_skas - new_mm failed, errno = %d\n", | 90 | printk("init_new_context_skas - new_mm failed, " |
27 | mm->context.skas.mm_fd); | 91 | "errno = %d\n", ret); |
28 | return(mm->context.skas.mm_fd); | 92 | return ret; |
93 | } | ||
94 | mm_id->u.mm_fd = ret; | ||
29 | } | 95 | } |
96 | else { | ||
97 | /* This zeros the entry that pgd_alloc didn't, needed since | ||
98 | * we are about to reinitialize it, and want mm.nr_ptes to | ||
99 | * be accurate. | ||
100 | */ | ||
101 | mm->pgd[USER_PTRS_PER_PGD] = __pgd(0); | ||
30 | 102 | ||
31 | return(0); | 103 | ret = init_stub_pte(mm, CONFIG_STUB_CODE, |
104 | (unsigned long) &__syscall_stub_start); | ||
105 | if(ret) | ||
106 | goto out; | ||
107 | |||
108 | ret = -ENOMEM; | ||
109 | stack = get_zeroed_page(GFP_KERNEL); | ||
110 | if(stack == 0) | ||
111 | goto out; | ||
112 | mm_id->stack = stack; | ||
113 | |||
114 | ret = init_stub_pte(mm, CONFIG_STUB_DATA, stack); | ||
115 | if(ret) | ||
116 | goto out_free; | ||
117 | |||
118 | mm->nr_ptes--; | ||
119 | |||
120 | if((cur_mm != NULL) && (cur_mm != &init_mm)) | ||
121 | mm_id->u.pid = copy_context_skas0(stack, | ||
122 | cur_mm_id->u.pid); | ||
123 | else mm_id->u.pid = start_userspace(stack); | ||
124 | } | ||
125 | |||
126 | return 0; | ||
127 | |||
128 | out_free: | ||
129 | free_page(mm_id->stack); | ||
130 | out: | ||
131 | return ret; | ||
32 | } | 132 | } |
33 | 133 | ||
34 | void destroy_context_skas(struct mm_struct *mm) | 134 | void destroy_context_skas(struct mm_struct *mm) |
35 | { | 135 | { |
36 | os_close_file(mm->context.skas.mm_fd); | 136 | struct mmu_context_skas *mmu = &mm->context.skas; |
37 | } | ||
38 | 137 | ||
39 | /* | 138 | if(proc_mm) |
40 | * Overrides for Emacs so that we follow Linus's tabbing style. | 139 | os_close_file(mmu->id.u.mm_fd); |
41 | * Emacs will notice this stuff at the end of the file and automatically | 140 | else { |
42 | * adjust the settings for this buffer only. This must remain at the end | 141 | os_kill_ptraced_process(mmu->id.u.pid, 1); |
43 | * of the file. | 142 | free_page(mmu->id.stack); |
44 | * --------------------------------------------------------------------------- | 143 | free_page(mmu->last_page_table); |
45 | * Local variables: | 144 | } |
46 | * c-file-style: "linux" | 145 | } |
47 | * End: | ||
48 | */ | ||
diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c index 773cd2b525fc..ba671dab8878 100644 --- a/arch/um/kernel/skas/process.c +++ b/arch/um/kernel/skas/process.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | 2 | * Copyright (C) 2002- 2004 Jeff Dike (jdike@addtoit.com) |
3 | * Licensed under the GPL | 3 | * Licensed under the GPL |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -13,7 +13,9 @@ | |||
13 | #include <sys/wait.h> | 13 | #include <sys/wait.h> |
14 | #include <sys/mman.h> | 14 | #include <sys/mman.h> |
15 | #include <sys/user.h> | 15 | #include <sys/user.h> |
16 | #include <sys/time.h> | ||
16 | #include <asm/unistd.h> | 17 | #include <asm/unistd.h> |
18 | #include <asm/types.h> | ||
17 | #include "user.h" | 19 | #include "user.h" |
18 | #include "ptrace_user.h" | 20 | #include "ptrace_user.h" |
19 | #include "time_user.h" | 21 | #include "time_user.h" |
@@ -21,13 +23,18 @@ | |||
21 | #include "user_util.h" | 23 | #include "user_util.h" |
22 | #include "kern_util.h" | 24 | #include "kern_util.h" |
23 | #include "skas.h" | 25 | #include "skas.h" |
26 | #include "stub-data.h" | ||
27 | #include "mm_id.h" | ||
24 | #include "sysdep/sigcontext.h" | 28 | #include "sysdep/sigcontext.h" |
29 | #include "sysdep/stub.h" | ||
25 | #include "os.h" | 30 | #include "os.h" |
26 | #include "proc_mm.h" | 31 | #include "proc_mm.h" |
27 | #include "skas_ptrace.h" | 32 | #include "skas_ptrace.h" |
28 | #include "chan_user.h" | 33 | #include "chan_user.h" |
29 | #include "signal_user.h" | 34 | #include "signal_user.h" |
30 | #include "registers.h" | 35 | #include "registers.h" |
36 | #include "mem.h" | ||
37 | #include "uml-config.h" | ||
31 | #include "process.h" | 38 | #include "process.h" |
32 | 39 | ||
33 | int is_skas_winch(int pid, int fd, void *data) | 40 | int is_skas_winch(int pid, int fd, void *data) |
@@ -39,20 +46,55 @@ int is_skas_winch(int pid, int fd, void *data) | |||
39 | return(1); | 46 | return(1); |
40 | } | 47 | } |
41 | 48 | ||
42 | void get_skas_faultinfo(int pid, struct faultinfo * fi) | 49 | void wait_stub_done(int pid, int sig, char * fname) |
43 | { | 50 | { |
44 | int err; | 51 | int n, status, err; |
45 | 52 | ||
46 | err = ptrace(PTRACE_FAULTINFO, pid, 0, fi); | 53 | do { |
47 | if(err) | 54 | if ( sig != -1 ) { |
48 | panic("get_skas_faultinfo - PTRACE_FAULTINFO failed, " | 55 | err = ptrace(PTRACE_CONT, pid, 0, sig); |
49 | "errno = %d\n", errno); | 56 | if(err) |
57 | panic("%s : continue failed, errno = %d\n", | ||
58 | fname, errno); | ||
59 | } | ||
60 | sig = 0; | ||
61 | |||
62 | CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); | ||
63 | } while((n >= 0) && WIFSTOPPED(status) && | ||
64 | (WSTOPSIG(status) == SIGVTALRM)); | ||
65 | |||
66 | if((n < 0) || !WIFSTOPPED(status) || | ||
67 | (WSTOPSIG(status) != SIGUSR1 && WSTOPSIG(status != SIGTRAP))){ | ||
68 | panic("%s : failed to wait for SIGUSR1/SIGTRAP, " | ||
69 | "pid = %d, n = %d, errno = %d, status = 0x%x\n", | ||
70 | fname, pid, n, errno, status); | ||
71 | } | ||
72 | } | ||
50 | 73 | ||
51 | /* Special handling for i386, which has different structs */ | 74 | void get_skas_faultinfo(int pid, struct faultinfo * fi) |
52 | if (sizeof(struct ptrace_faultinfo) < sizeof(struct faultinfo)) | 75 | { |
53 | memset((char *)fi + sizeof(struct ptrace_faultinfo), 0, | 76 | int err; |
54 | sizeof(struct faultinfo) - | 77 | |
55 | sizeof(struct ptrace_faultinfo)); | 78 | if(ptrace_faultinfo){ |
79 | err = ptrace(PTRACE_FAULTINFO, pid, 0, fi); | ||
80 | if(err) | ||
81 | panic("get_skas_faultinfo - PTRACE_FAULTINFO failed, " | ||
82 | "errno = %d\n", errno); | ||
83 | |||
84 | /* Special handling for i386, which has different structs */ | ||
85 | if (sizeof(struct ptrace_faultinfo) < sizeof(struct faultinfo)) | ||
86 | memset((char *)fi + sizeof(struct ptrace_faultinfo), 0, | ||
87 | sizeof(struct faultinfo) - | ||
88 | sizeof(struct ptrace_faultinfo)); | ||
89 | } | ||
90 | else { | ||
91 | wait_stub_done(pid, SIGSEGV, "get_skas_faultinfo"); | ||
92 | |||
93 | /* faultinfo is prepared by the stub-segv-handler at start of | ||
94 | * the stub stack page. We just have to copy it. | ||
95 | */ | ||
96 | memcpy(fi, (void *)current_stub_stack(), sizeof(*fi)); | ||
97 | } | ||
56 | } | 98 | } |
57 | 99 | ||
58 | static void handle_segv(int pid, union uml_pt_regs * regs) | 100 | static void handle_segv(int pid, union uml_pt_regs * regs) |
@@ -91,11 +133,56 @@ static void handle_trap(int pid, union uml_pt_regs *regs, int local_using_sysemu | |||
91 | handle_syscall(regs); | 133 | handle_syscall(regs); |
92 | } | 134 | } |
93 | 135 | ||
94 | static int userspace_tramp(void *arg) | 136 | extern int __syscall_stub_start; |
137 | |||
138 | static int userspace_tramp(void *stack) | ||
95 | { | 139 | { |
96 | init_new_thread_signals(0); | 140 | void *addr; |
97 | enable_timer(); | 141 | |
98 | ptrace(PTRACE_TRACEME, 0, 0, 0); | 142 | ptrace(PTRACE_TRACEME, 0, 0, 0); |
143 | |||
144 | init_new_thread_signals(1); | ||
145 | enable_timer(); | ||
146 | |||
147 | if(!proc_mm){ | ||
148 | /* This has a pte, but it can't be mapped in with the usual | ||
149 | * tlb_flush mechanism because this is part of that mechanism | ||
150 | */ | ||
151 | int fd; | ||
152 | __u64 offset; | ||
153 | |||
154 | fd = phys_mapping(to_phys(&__syscall_stub_start), &offset); | ||
155 | addr = mmap64((void *) UML_CONFIG_STUB_CODE, page_size(), | ||
156 | PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fd, offset); | ||
157 | if(addr == MAP_FAILED){ | ||
158 | printk("mapping mmap stub failed, errno = %d\n", | ||
159 | errno); | ||
160 | exit(1); | ||
161 | } | ||
162 | |||
163 | if(stack != NULL){ | ||
164 | fd = phys_mapping(to_phys(stack), &offset); | ||
165 | addr = mmap((void *) UML_CONFIG_STUB_DATA, page_size(), | ||
166 | PROT_READ | PROT_WRITE, | ||
167 | MAP_FIXED | MAP_SHARED, fd, offset); | ||
168 | if(addr == MAP_FAILED){ | ||
169 | printk("mapping segfault stack failed, " | ||
170 | "errno = %d\n", errno); | ||
171 | exit(1); | ||
172 | } | ||
173 | } | ||
174 | } | ||
175 | if(!ptrace_faultinfo && (stack != NULL)){ | ||
176 | unsigned long v = UML_CONFIG_STUB_CODE + | ||
177 | (unsigned long) stub_segv_handler - | ||
178 | (unsigned long) &__syscall_stub_start; | ||
179 | |||
180 | set_sigstack((void *) UML_CONFIG_STUB_DATA, page_size()); | ||
181 | set_handler(SIGSEGV, (void *) v, SA_ONSTACK, | ||
182 | SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, | ||
183 | SIGUSR1, -1); | ||
184 | } | ||
185 | |||
99 | os_stop_process(os_getpid()); | 186 | os_stop_process(os_getpid()); |
100 | return(0); | 187 | return(0); |
101 | } | 188 | } |
@@ -105,11 +192,11 @@ static int userspace_tramp(void *arg) | |||
105 | #define NR_CPUS 1 | 192 | #define NR_CPUS 1 |
106 | int userspace_pid[NR_CPUS]; | 193 | int userspace_pid[NR_CPUS]; |
107 | 194 | ||
108 | void start_userspace(int cpu) | 195 | int start_userspace(unsigned long stub_stack) |
109 | { | 196 | { |
110 | void *stack; | 197 | void *stack; |
111 | unsigned long sp; | 198 | unsigned long sp; |
112 | int pid, status, n; | 199 | int pid, status, n, flags; |
113 | 200 | ||
114 | stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, | 201 | stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, |
115 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | 202 | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
@@ -117,8 +204,9 @@ void start_userspace(int cpu) | |||
117 | panic("start_userspace : mmap failed, errno = %d", errno); | 204 | panic("start_userspace : mmap failed, errno = %d", errno); |
118 | sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); | 205 | sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); |
119 | 206 | ||
120 | pid = clone(userspace_tramp, (void *) sp, | 207 | flags = CLONE_FILES | SIGCHLD; |
121 | CLONE_FILES | CLONE_VM | SIGCHLD, NULL); | 208 | if(proc_mm) flags |= CLONE_VM; |
209 | pid = clone(userspace_tramp, (void *) sp, flags, (void *) stub_stack); | ||
122 | if(pid < 0) | 210 | if(pid < 0) |
123 | panic("start_userspace : clone failed, errno = %d", errno); | 211 | panic("start_userspace : clone failed, errno = %d", errno); |
124 | 212 | ||
@@ -140,7 +228,7 @@ void start_userspace(int cpu) | |||
140 | if(munmap(stack, PAGE_SIZE) < 0) | 228 | if(munmap(stack, PAGE_SIZE) < 0) |
141 | panic("start_userspace : munmap failed, errno = %d\n", errno); | 229 | panic("start_userspace : munmap failed, errno = %d\n", errno); |
142 | 230 | ||
143 | userspace_pid[cpu] = pid; | 231 | return(pid); |
144 | } | 232 | } |
145 | 233 | ||
146 | void userspace(union uml_pt_regs *regs) | 234 | void userspace(union uml_pt_regs *regs) |
@@ -174,7 +262,9 @@ void userspace(union uml_pt_regs *regs) | |||
174 | if(WIFSTOPPED(status)){ | 262 | if(WIFSTOPPED(status)){ |
175 | switch(WSTOPSIG(status)){ | 263 | switch(WSTOPSIG(status)){ |
176 | case SIGSEGV: | 264 | case SIGSEGV: |
177 | handle_segv(pid, regs); | 265 | if(PTRACE_FULL_FAULTINFO || !ptrace_faultinfo) |
266 | user_signal(SIGSEGV, regs, pid); | ||
267 | else handle_segv(pid, regs); | ||
178 | break; | 268 | break; |
179 | case SIGTRAP + 0x80: | 269 | case SIGTRAP + 0x80: |
180 | handle_trap(pid, regs, local_using_sysemu); | 270 | handle_trap(pid, regs, local_using_sysemu); |
@@ -194,6 +284,7 @@ void userspace(union uml_pt_regs *regs) | |||
194 | printk("userspace - child stopped with signal " | 284 | printk("userspace - child stopped with signal " |
195 | "%d\n", WSTOPSIG(status)); | 285 | "%d\n", WSTOPSIG(status)); |
196 | } | 286 | } |
287 | pid = userspace_pid[0]; | ||
197 | interrupt_end(); | 288 | interrupt_end(); |
198 | 289 | ||
199 | /* Avoid -ERESTARTSYS handling in host */ | 290 | /* Avoid -ERESTARTSYS handling in host */ |
@@ -207,6 +298,67 @@ void userspace(union uml_pt_regs *regs) | |||
207 | #define INIT_JMP_HALT 3 | 298 | #define INIT_JMP_HALT 3 |
208 | #define INIT_JMP_REBOOT 4 | 299 | #define INIT_JMP_REBOOT 4 |
209 | 300 | ||
301 | |||
302 | int copy_context_skas0(unsigned long new_stack, int pid) | ||
303 | { | ||
304 | int err; | ||
305 | unsigned long regs[MAX_REG_NR]; | ||
306 | unsigned long current_stack = current_stub_stack(); | ||
307 | struct stub_data *data = (struct stub_data *) current_stack; | ||
308 | struct stub_data *child_data = (struct stub_data *) new_stack; | ||
309 | __u64 new_offset; | ||
310 | int new_fd = phys_mapping(to_phys((void *)new_stack), &new_offset); | ||
311 | |||
312 | /* prepare offset and fd of child's stack as argument for parent's | ||
313 | * and child's mmap2 calls | ||
314 | */ | ||
315 | *data = ((struct stub_data) { .offset = MMAP_OFFSET(new_offset), | ||
316 | .fd = new_fd, | ||
317 | .timer = ((struct itimerval) | ||
318 | { { 0, 1000000 / hz() }, | ||
319 | { 0, 1000000 / hz() }})}); | ||
320 | get_safe_registers(regs); | ||
321 | |||
322 | /* Set parent's instruction pointer to start of clone-stub */ | ||
323 | regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + | ||
324 | (unsigned long) stub_clone_handler - | ||
325 | (unsigned long) &__syscall_stub_start; | ||
326 | regs[REGS_SP_INDEX] = UML_CONFIG_STUB_DATA + PAGE_SIZE - | ||
327 | sizeof(void *); | ||
328 | err = ptrace_setregs(pid, regs); | ||
329 | if(err < 0) | ||
330 | panic("copy_context_skas0 : PTRACE_SETREGS failed, " | ||
331 | "pid = %d, errno = %d\n", pid, errno); | ||
332 | |||
333 | /* set a well known return code for detection of child write failure */ | ||
334 | child_data->err = 12345678; | ||
335 | |||
336 | /* Wait, until parent has finished its work: read child's pid from | ||
337 | * parent's stack, and check, if bad result. | ||
338 | */ | ||
339 | wait_stub_done(pid, 0, "copy_context_skas0"); | ||
340 | |||
341 | pid = data->err; | ||
342 | if(pid < 0) | ||
343 | panic("copy_context_skas0 - stub-parent reports error %d\n", | ||
344 | pid); | ||
345 | |||
346 | /* Wait, until child has finished too: read child's result from | ||
347 | * child's stack and check it. | ||
348 | */ | ||
349 | wait_stub_done(pid, -1, "copy_context_skas0"); | ||
350 | if (child_data->err != UML_CONFIG_STUB_DATA) | ||
351 | panic("copy_context_skas0 - stub-child reports error %d\n", | ||
352 | child_data->err); | ||
353 | |||
354 | if (ptrace(PTRACE_OLDSETOPTIONS, pid, NULL, | ||
355 | (void *)PTRACE_O_TRACESYSGOOD) < 0) | ||
356 | panic("copy_context_skas0 : PTRACE_SETOPTIONS failed, " | ||
357 | "errno = %d\n", errno); | ||
358 | |||
359 | return pid; | ||
360 | } | ||
361 | |||
210 | void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, | 362 | void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, |
211 | void (*handler)(int)) | 363 | void (*handler)(int)) |
212 | { | 364 | { |
@@ -334,21 +486,19 @@ void reboot_skas(void) | |||
334 | siglongjmp(initial_jmpbuf, INIT_JMP_REBOOT); | 486 | siglongjmp(initial_jmpbuf, INIT_JMP_REBOOT); |
335 | } | 487 | } |
336 | 488 | ||
337 | void switch_mm_skas(int mm_fd) | 489 | void switch_mm_skas(struct mm_id *mm_idp) |
338 | { | 490 | { |
339 | int err; | 491 | int err; |
340 | 492 | ||
341 | #warning need cpu pid in switch_mm_skas | 493 | #warning need cpu pid in switch_mm_skas |
342 | err = ptrace(PTRACE_SWITCH_MM, userspace_pid[0], 0, mm_fd); | 494 | if(proc_mm){ |
343 | if(err) | 495 | err = ptrace(PTRACE_SWITCH_MM, userspace_pid[0], 0, |
344 | panic("switch_mm_skas - PTRACE_SWITCH_MM failed, errno = %d\n", | 496 | mm_idp->u.mm_fd); |
345 | errno); | 497 | if(err) |
346 | } | 498 | panic("switch_mm_skas - PTRACE_SWITCH_MM failed, " |
347 | 499 | "errno = %d\n", errno); | |
348 | void kill_off_processes_skas(void) | 500 | } |
349 | { | 501 | else userspace_pid[0] = mm_idp->u.pid; |
350 | #warning need to loop over userspace_pids in kill_off_processes_skas | ||
351 | os_kill_ptraced_process(userspace_pid[0], 1); | ||
352 | } | 502 | } |
353 | 503 | ||
354 | /* | 504 | /* |
diff --git a/arch/um/kernel/skas/process_kern.c b/arch/um/kernel/skas/process_kern.c index 0a7b8aa55db8..cbabab104ac3 100644 --- a/arch/um/kernel/skas/process_kern.c +++ b/arch/um/kernel/skas/process_kern.c | |||
@@ -175,9 +175,12 @@ static int start_kernel_proc(void *unused) | |||
175 | return(0); | 175 | return(0); |
176 | } | 176 | } |
177 | 177 | ||
178 | extern int userspace_pid[]; | ||
179 | |||
178 | int start_uml_skas(void) | 180 | int start_uml_skas(void) |
179 | { | 181 | { |
180 | start_userspace(0); | 182 | if(proc_mm) |
183 | userspace_pid[0] = start_userspace(0); | ||
181 | 184 | ||
182 | init_new_thread_signals(1); | 185 | init_new_thread_signals(1); |
183 | 186 | ||
@@ -199,3 +202,31 @@ int thread_pid_skas(struct task_struct *task) | |||
199 | #warning Need to look up userspace_pid by cpu | 202 | #warning Need to look up userspace_pid by cpu |
200 | return(userspace_pid[0]); | 203 | return(userspace_pid[0]); |
201 | } | 204 | } |
205 | |||
206 | void kill_off_processes_skas(void) | ||
207 | { | ||
208 | if(proc_mm) | ||
209 | #warning need to loop over userspace_pids in kill_off_processes_skas | ||
210 | os_kill_ptraced_process(userspace_pid[0], 1); | ||
211 | else { | ||
212 | struct task_struct *p; | ||
213 | int pid, me; | ||
214 | |||
215 | me = os_getpid(); | ||
216 | for_each_process(p){ | ||
217 | if(p->mm == NULL) | ||
218 | continue; | ||
219 | |||
220 | pid = p->mm->context.skas.id.u.pid; | ||
221 | os_kill_ptraced_process(pid, 1); | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | |||
226 | unsigned long current_stub_stack(void) | ||
227 | { | ||
228 | if(current->mm == NULL) | ||
229 | return(0); | ||
230 | |||
231 | return(current->mm->context.skas.id.stack); | ||
232 | } | ||
diff --git a/arch/um/kernel/skas/tlb.c b/arch/um/kernel/skas/tlb.c index b8c5e71763d1..6230999c672c 100644 --- a/arch/um/kernel/skas/tlb.c +++ b/arch/um/kernel/skas/tlb.c | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | #include "linux/stddef.h" | 7 | #include "linux/stddef.h" |
8 | #include "linux/sched.h" | 8 | #include "linux/sched.h" |
9 | #include "linux/config.h" | ||
9 | #include "linux/mm.h" | 10 | #include "linux/mm.h" |
10 | #include "asm/page.h" | 11 | #include "asm/page.h" |
11 | #include "asm/pgtable.h" | 12 | #include "asm/pgtable.h" |
@@ -17,7 +18,7 @@ | |||
17 | #include "os.h" | 18 | #include "os.h" |
18 | #include "tlb.h" | 19 | #include "tlb.h" |
19 | 20 | ||
20 | static void do_ops(int fd, struct host_vm_op *ops, int last) | 21 | static void do_ops(union mm_context *mmu, struct host_vm_op *ops, int last) |
21 | { | 22 | { |
22 | struct host_vm_op *op; | 23 | struct host_vm_op *op; |
23 | int i; | 24 | int i; |
@@ -26,18 +27,18 @@ static void do_ops(int fd, struct host_vm_op *ops, int last) | |||
26 | op = &ops[i]; | 27 | op = &ops[i]; |
27 | switch(op->type){ | 28 | switch(op->type){ |
28 | case MMAP: | 29 | case MMAP: |
29 | map(fd, op->u.mmap.addr, op->u.mmap.len, | 30 | map(&mmu->skas.id, op->u.mmap.addr, op->u.mmap.len, |
30 | op->u.mmap.r, op->u.mmap.w, op->u.mmap.x, | 31 | op->u.mmap.r, op->u.mmap.w, op->u.mmap.x, |
31 | op->u.mmap.fd, op->u.mmap.offset); | 32 | op->u.mmap.fd, op->u.mmap.offset); |
32 | break; | 33 | break; |
33 | case MUNMAP: | 34 | case MUNMAP: |
34 | unmap(fd, (void *) op->u.munmap.addr, | 35 | unmap(&mmu->skas.id, (void *) op->u.munmap.addr, |
35 | op->u.munmap.len); | 36 | op->u.munmap.len); |
36 | break; | 37 | break; |
37 | case MPROTECT: | 38 | case MPROTECT: |
38 | protect(fd, op->u.mprotect.addr, op->u.mprotect.len, | 39 | protect(&mmu->skas.id, op->u.mprotect.addr, |
39 | op->u.mprotect.r, op->u.mprotect.w, | 40 | op->u.mprotect.len, op->u.mprotect.r, |
40 | op->u.mprotect.x); | 41 | op->u.mprotect.w, op->u.mprotect.x); |
41 | break; | 42 | break; |
42 | default: | 43 | default: |
43 | printk("Unknown op type %d in do_ops\n", op->type); | 44 | printk("Unknown op type %d in do_ops\n", op->type); |
@@ -46,12 +47,15 @@ static void do_ops(int fd, struct host_vm_op *ops, int last) | |||
46 | } | 47 | } |
47 | } | 48 | } |
48 | 49 | ||
50 | extern int proc_mm; | ||
51 | |||
49 | static void fix_range(struct mm_struct *mm, unsigned long start_addr, | 52 | static void fix_range(struct mm_struct *mm, unsigned long start_addr, |
50 | unsigned long end_addr, int force) | 53 | unsigned long end_addr, int force) |
51 | { | 54 | { |
52 | int fd = mm->context.skas.mm_fd; | 55 | if(!proc_mm && (end_addr > CONFIG_STUB_START)) |
56 | end_addr = CONFIG_STUB_START; | ||
53 | 57 | ||
54 | fix_range_common(mm, start_addr, end_addr, force, fd, do_ops); | 58 | fix_range_common(mm, start_addr, end_addr, force, do_ops); |
55 | } | 59 | } |
56 | 60 | ||
57 | void __flush_tlb_one_skas(unsigned long addr) | 61 | void __flush_tlb_one_skas(unsigned long addr) |
@@ -69,17 +73,20 @@ void flush_tlb_range_skas(struct vm_area_struct *vma, unsigned long start, | |||
69 | 73 | ||
70 | void flush_tlb_mm_skas(struct mm_struct *mm) | 74 | void flush_tlb_mm_skas(struct mm_struct *mm) |
71 | { | 75 | { |
76 | unsigned long end; | ||
77 | |||
72 | /* Don't bother flushing if this address space is about to be | 78 | /* Don't bother flushing if this address space is about to be |
73 | * destroyed. | 79 | * destroyed. |
74 | */ | 80 | */ |
75 | if(atomic_read(&mm->mm_users) == 0) | 81 | if(atomic_read(&mm->mm_users) == 0) |
76 | return; | 82 | return; |
77 | 83 | ||
78 | fix_range(mm, 0, host_task_size, 0); | 84 | end = proc_mm ? task_size : CONFIG_STUB_START; |
79 | flush_tlb_kernel_range_common(start_vm, end_vm); | 85 | fix_range(mm, 0, end, 0); |
80 | } | 86 | } |
81 | 87 | ||
82 | void force_flush_all_skas(void) | 88 | void force_flush_all_skas(void) |
83 | { | 89 | { |
84 | fix_range(current->mm, 0, host_task_size, 1); | 90 | unsigned long end = proc_mm ? task_size : CONFIG_STUB_START; |
91 | fix_range(current->mm, 0, end, 1); | ||
85 | } | 92 | } |
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c index f829b309b63c..c40b611e3d93 100644 --- a/arch/um/kernel/time.c +++ b/arch/um/kernel/time.c | |||
@@ -48,6 +48,13 @@ void enable_timer(void) | |||
48 | set_interval(ITIMER_VIRTUAL); | 48 | set_interval(ITIMER_VIRTUAL); |
49 | } | 49 | } |
50 | 50 | ||
51 | void prepare_timer(void * ptr) | ||
52 | { | ||
53 | int usec = 1000000/hz(); | ||
54 | *(struct itimerval *)ptr = ((struct itimerval) { { 0, usec }, | ||
55 | { 0, usec }}); | ||
56 | } | ||
57 | |||
51 | void disable_timer(void) | 58 | void disable_timer(void) |
52 | { | 59 | { |
53 | struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }}); | 60 | struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }}); |
diff --git a/arch/um/kernel/tlb.c b/arch/um/kernel/tlb.c index eda477edfdf5..83ec8d4747fd 100644 --- a/arch/um/kernel/tlb.c +++ b/arch/um/kernel/tlb.c | |||
@@ -18,13 +18,15 @@ | |||
18 | #define ADD_ROUND(n, inc) (((n) + (inc)) & ~((inc) - 1)) | 18 | #define ADD_ROUND(n, inc) (((n) + (inc)) & ~((inc) - 1)) |
19 | 19 | ||
20 | void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | 20 | void fix_range_common(struct mm_struct *mm, unsigned long start_addr, |
21 | unsigned long end_addr, int force, int data, | 21 | unsigned long end_addr, int force, |
22 | void (*do_ops)(int, struct host_vm_op *, int)) | 22 | void (*do_ops)(union mm_context *, struct host_vm_op *, |
23 | int)) | ||
23 | { | 24 | { |
24 | pgd_t *npgd; | 25 | pgd_t *npgd; |
25 | pud_t *npud; | 26 | pud_t *npud; |
26 | pmd_t *npmd; | 27 | pmd_t *npmd; |
27 | pte_t *npte; | 28 | pte_t *npte; |
29 | union mm_context *mmu = &mm->context; | ||
28 | unsigned long addr, end; | 30 | unsigned long addr, end; |
29 | int r, w, x; | 31 | int r, w, x; |
30 | struct host_vm_op ops[16]; | 32 | struct host_vm_op ops[16]; |
@@ -40,7 +42,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | |||
40 | end = end_addr; | 42 | end = end_addr; |
41 | if(force || pgd_newpage(*npgd)){ | 43 | if(force || pgd_newpage(*npgd)){ |
42 | op_index = add_munmap(addr, end - addr, ops, | 44 | op_index = add_munmap(addr, end - addr, ops, |
43 | op_index, last_op, data, | 45 | op_index, last_op, mmu, |
44 | do_ops); | 46 | do_ops); |
45 | pgd_mkuptodate(*npgd); | 47 | pgd_mkuptodate(*npgd); |
46 | } | 48 | } |
@@ -55,7 +57,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | |||
55 | end = end_addr; | 57 | end = end_addr; |
56 | if(force || pud_newpage(*npud)){ | 58 | if(force || pud_newpage(*npud)){ |
57 | op_index = add_munmap(addr, end - addr, ops, | 59 | op_index = add_munmap(addr, end - addr, ops, |
58 | op_index, last_op, data, | 60 | op_index, last_op, mmu, |
59 | do_ops); | 61 | do_ops); |
60 | pud_mkuptodate(*npud); | 62 | pud_mkuptodate(*npud); |
61 | } | 63 | } |
@@ -70,7 +72,7 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | |||
70 | end = end_addr; | 72 | end = end_addr; |
71 | if(force || pmd_newpage(*npmd)){ | 73 | if(force || pmd_newpage(*npmd)){ |
72 | op_index = add_munmap(addr, end - addr, ops, | 74 | op_index = add_munmap(addr, end - addr, ops, |
73 | op_index, last_op, data, | 75 | op_index, last_op, mmu, |
74 | do_ops); | 76 | do_ops); |
75 | pmd_mkuptodate(*npmd); | 77 | pmd_mkuptodate(*npmd); |
76 | } | 78 | } |
@@ -93,21 +95,21 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | |||
93 | op_index = add_mmap(addr, | 95 | op_index = add_mmap(addr, |
94 | pte_val(*npte) & PAGE_MASK, | 96 | pte_val(*npte) & PAGE_MASK, |
95 | PAGE_SIZE, r, w, x, ops, | 97 | PAGE_SIZE, r, w, x, ops, |
96 | op_index, last_op, data, | 98 | op_index, last_op, mmu, |
97 | do_ops); | 99 | do_ops); |
98 | else op_index = add_munmap(addr, PAGE_SIZE, ops, | 100 | else op_index = add_munmap(addr, PAGE_SIZE, ops, |
99 | op_index, last_op, data, | 101 | op_index, last_op, mmu, |
100 | do_ops); | 102 | do_ops); |
101 | } | 103 | } |
102 | else if(pte_newprot(*npte)) | 104 | else if(pte_newprot(*npte)) |
103 | op_index = add_mprotect(addr, PAGE_SIZE, r, w, x, ops, | 105 | op_index = add_mprotect(addr, PAGE_SIZE, r, w, x, ops, |
104 | op_index, last_op, data, | 106 | op_index, last_op, mmu, |
105 | do_ops); | 107 | do_ops); |
106 | 108 | ||
107 | *npte = pte_mkuptodate(*npte); | 109 | *npte = pte_mkuptodate(*npte); |
108 | addr += PAGE_SIZE; | 110 | addr += PAGE_SIZE; |
109 | } | 111 | } |
110 | (*do_ops)(data, ops, op_index); | 112 | (*do_ops)(mmu, ops, op_index); |
111 | } | 113 | } |
112 | 114 | ||
113 | int flush_tlb_kernel_range_common(unsigned long start, unsigned long end) | 115 | int flush_tlb_kernel_range_common(unsigned long start, unsigned long end) |
@@ -195,51 +197,6 @@ int flush_tlb_kernel_range_common(unsigned long start, unsigned long end) | |||
195 | return(updated); | 197 | return(updated); |
196 | } | 198 | } |
197 | 199 | ||
198 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long address) | ||
199 | { | ||
200 | address &= PAGE_MASK; | ||
201 | flush_tlb_range(vma, address, address + PAGE_SIZE); | ||
202 | } | ||
203 | |||
204 | void flush_tlb_all(void) | ||
205 | { | ||
206 | flush_tlb_mm(current->mm); | ||
207 | } | ||
208 | |||
209 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
210 | { | ||
211 | CHOOSE_MODE_PROC(flush_tlb_kernel_range_tt, | ||
212 | flush_tlb_kernel_range_common, start, end); | ||
213 | } | ||
214 | |||
215 | void flush_tlb_kernel_vm(void) | ||
216 | { | ||
217 | CHOOSE_MODE(flush_tlb_kernel_vm_tt(), | ||
218 | flush_tlb_kernel_range_common(start_vm, end_vm)); | ||
219 | } | ||
220 | |||
221 | void __flush_tlb_one(unsigned long addr) | ||
222 | { | ||
223 | CHOOSE_MODE_PROC(__flush_tlb_one_tt, __flush_tlb_one_skas, addr); | ||
224 | } | ||
225 | |||
226 | void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
227 | unsigned long end) | ||
228 | { | ||
229 | CHOOSE_MODE_PROC(flush_tlb_range_tt, flush_tlb_range_skas, vma, start, | ||
230 | end); | ||
231 | } | ||
232 | |||
233 | void flush_tlb_mm(struct mm_struct *mm) | ||
234 | { | ||
235 | CHOOSE_MODE_PROC(flush_tlb_mm_tt, flush_tlb_mm_skas, mm); | ||
236 | } | ||
237 | |||
238 | void force_flush_all(void) | ||
239 | { | ||
240 | CHOOSE_MODE(force_flush_all_tt(), force_flush_all_skas()); | ||
241 | } | ||
242 | |||
243 | pgd_t *pgd_offset_proc(struct mm_struct *mm, unsigned long address) | 200 | pgd_t *pgd_offset_proc(struct mm_struct *mm, unsigned long address) |
244 | { | 201 | { |
245 | return(pgd_offset(mm, address)); | 202 | return(pgd_offset(mm, address)); |
@@ -270,9 +227,9 @@ pte_t *addr_pte(struct task_struct *task, unsigned long addr) | |||
270 | } | 227 | } |
271 | 228 | ||
272 | int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, | 229 | int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, |
273 | int r, int w, int x, struct host_vm_op *ops, int index, | 230 | int r, int w, int x, struct host_vm_op *ops, int index, |
274 | int last_filled, int data, | 231 | int last_filled, union mm_context *mmu, |
275 | void (*do_ops)(int, struct host_vm_op *, int)) | 232 | void (*do_ops)(union mm_context *, struct host_vm_op *, int)) |
276 | { | 233 | { |
277 | __u64 offset; | 234 | __u64 offset; |
278 | struct host_vm_op *last; | 235 | struct host_vm_op *last; |
@@ -292,7 +249,7 @@ int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, | |||
292 | } | 249 | } |
293 | 250 | ||
294 | if(index == last_filled){ | 251 | if(index == last_filled){ |
295 | (*do_ops)(data, ops, last_filled); | 252 | (*do_ops)(mmu, ops, last_filled); |
296 | index = -1; | 253 | index = -1; |
297 | } | 254 | } |
298 | 255 | ||
@@ -310,8 +267,8 @@ int add_mmap(unsigned long virt, unsigned long phys, unsigned long len, | |||
310 | } | 267 | } |
311 | 268 | ||
312 | int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops, | 269 | int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops, |
313 | int index, int last_filled, int data, | 270 | int index, int last_filled, union mm_context *mmu, |
314 | void (*do_ops)(int, struct host_vm_op *, int)) | 271 | void (*do_ops)(union mm_context *, struct host_vm_op *, int)) |
315 | { | 272 | { |
316 | struct host_vm_op *last; | 273 | struct host_vm_op *last; |
317 | 274 | ||
@@ -325,7 +282,7 @@ int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops, | |||
325 | } | 282 | } |
326 | 283 | ||
327 | if(index == last_filled){ | 284 | if(index == last_filled){ |
328 | (*do_ops)(data, ops, last_filled); | 285 | (*do_ops)(mmu, ops, last_filled); |
329 | index = -1; | 286 | index = -1; |
330 | } | 287 | } |
331 | 288 | ||
@@ -337,8 +294,9 @@ int add_munmap(unsigned long addr, unsigned long len, struct host_vm_op *ops, | |||
337 | } | 294 | } |
338 | 295 | ||
339 | int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x, | 296 | int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x, |
340 | struct host_vm_op *ops, int index, int last_filled, int data, | 297 | struct host_vm_op *ops, int index, int last_filled, |
341 | void (*do_ops)(int, struct host_vm_op *, int)) | 298 | union mm_context *mmu, |
299 | void (*do_ops)(union mm_context *, struct host_vm_op *, int)) | ||
342 | { | 300 | { |
343 | struct host_vm_op *last; | 301 | struct host_vm_op *last; |
344 | 302 | ||
@@ -354,7 +312,7 @@ int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x, | |||
354 | } | 312 | } |
355 | 313 | ||
356 | if(index == last_filled){ | 314 | if(index == last_filled){ |
357 | (*do_ops)(data, ops, last_filled); | 315 | (*do_ops)(mmu, ops, last_filled); |
358 | index = -1; | 316 | index = -1; |
359 | } | 317 | } |
360 | 318 | ||
@@ -367,3 +325,49 @@ int add_mprotect(unsigned long addr, unsigned long len, int r, int w, int x, | |||
367 | .x = x } } }); | 325 | .x = x } } }); |
368 | return(index); | 326 | return(index); |
369 | } | 327 | } |
328 | |||
329 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long address) | ||
330 | { | ||
331 | address &= PAGE_MASK; | ||
332 | flush_tlb_range(vma, address, address + PAGE_SIZE); | ||
333 | } | ||
334 | |||
335 | void flush_tlb_all(void) | ||
336 | { | ||
337 | flush_tlb_mm(current->mm); | ||
338 | } | ||
339 | |||
340 | void flush_tlb_kernel_range(unsigned long start, unsigned long end) | ||
341 | { | ||
342 | CHOOSE_MODE_PROC(flush_tlb_kernel_range_tt, | ||
343 | flush_tlb_kernel_range_common, start, end); | ||
344 | } | ||
345 | |||
346 | void flush_tlb_kernel_vm(void) | ||
347 | { | ||
348 | CHOOSE_MODE(flush_tlb_kernel_vm_tt(), | ||
349 | flush_tlb_kernel_range_common(start_vm, end_vm)); | ||
350 | } | ||
351 | |||
352 | void __flush_tlb_one(unsigned long addr) | ||
353 | { | ||
354 | CHOOSE_MODE_PROC(__flush_tlb_one_tt, __flush_tlb_one_skas, addr); | ||
355 | } | ||
356 | |||
357 | void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | ||
358 | unsigned long end) | ||
359 | { | ||
360 | CHOOSE_MODE_PROC(flush_tlb_range_tt, flush_tlb_range_skas, vma, start, | ||
361 | end); | ||
362 | } | ||
363 | |||
364 | void flush_tlb_mm(struct mm_struct *mm) | ||
365 | { | ||
366 | CHOOSE_MODE_PROC(flush_tlb_mm_tt, flush_tlb_mm_skas, mm); | ||
367 | } | ||
368 | |||
369 | void force_flush_all(void) | ||
370 | { | ||
371 | CHOOSE_MODE(force_flush_all_tt(), force_flush_all_skas()); | ||
372 | } | ||
373 | |||
diff --git a/arch/um/kernel/tt/tlb.c b/arch/um/kernel/tt/tlb.c index 203216ad86f1..2eefb43bc9c2 100644 --- a/arch/um/kernel/tt/tlb.c +++ b/arch/um/kernel/tt/tlb.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include "os.h" | 17 | #include "os.h" |
18 | #include "tlb.h" | 18 | #include "tlb.h" |
19 | 19 | ||
20 | static void do_ops(int unused, struct host_vm_op *ops, int last) | 20 | static void do_ops(union mm_context *mmu, struct host_vm_op *ops, int last) |
21 | { | 21 | { |
22 | struct host_vm_op *op; | 22 | struct host_vm_op *op; |
23 | int i; | 23 | int i; |
@@ -55,7 +55,7 @@ static void fix_range(struct mm_struct *mm, unsigned long start_addr, | |||
55 | panic("fix_range fixing wrong address space, current = 0x%p", | 55 | panic("fix_range fixing wrong address space, current = 0x%p", |
56 | current); | 56 | current); |
57 | 57 | ||
58 | fix_range_common(mm, start_addr, end_addr, force, 0, do_ops); | 58 | fix_range_common(mm, start_addr, end_addr, force, do_ops); |
59 | } | 59 | } |
60 | 60 | ||
61 | atomic_t vmchange_seq = ATOMIC_INIT(1); | 61 | atomic_t vmchange_seq = ATOMIC_INIT(1); |
diff --git a/arch/um/kernel/uml.lds.S b/arch/um/kernel/uml.lds.S index 61dfd4fef752..163476a8cb1b 100644 --- a/arch/um/kernel/uml.lds.S +++ b/arch/um/kernel/uml.lds.S | |||
@@ -30,6 +30,7 @@ SECTIONS | |||
30 | _einittext = .; | 30 | _einittext = .; |
31 | } | 31 | } |
32 | . = ALIGN(4096); | 32 | . = ALIGN(4096); |
33 | |||
33 | .text : | 34 | .text : |
34 | { | 35 | { |
35 | *(.text) | 36 | *(.text) |
@@ -39,6 +40,12 @@ SECTIONS | |||
39 | /* .gnu.warning sections are handled specially by elf32.em. */ | 40 | /* .gnu.warning sections are handled specially by elf32.em. */ |
40 | *(.gnu.warning) | 41 | *(.gnu.warning) |
41 | *(.gnu.linkonce.t*) | 42 | *(.gnu.linkonce.t*) |
43 | |||
44 | . = ALIGN(4096); | ||
45 | __syscall_stub_start = .; | ||
46 | *(.__syscall_stub*) | ||
47 | __syscall_stub_end = .; | ||
48 | . = ALIGN(4096); | ||
42 | } | 49 | } |
43 | 50 | ||
44 | #include "asm/common.lds.S" | 51 | #include "asm/common.lds.S" |
diff --git a/arch/um/os-Linux/sys-i386/registers.c b/arch/um/os-Linux/sys-i386/registers.c index 9a0ad094d926..3125d320722c 100644 --- a/arch/um/os-Linux/sys-i386/registers.c +++ b/arch/um/os-Linux/sys-i386/registers.c | |||
@@ -121,6 +121,11 @@ void init_registers(int pid) | |||
121 | err); | 121 | err); |
122 | } | 122 | } |
123 | 123 | ||
124 | void get_safe_registers(unsigned long *regs) | ||
125 | { | ||
126 | memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); | ||
127 | } | ||
128 | |||
124 | /* | 129 | /* |
125 | * Overrides for Emacs so that we follow Linus's tabbing style. | 130 | * Overrides for Emacs so that we follow Linus's tabbing style. |
126 | * Emacs will notice this stuff at the end of the file and automatically | 131 | * Emacs will notice this stuff at the end of the file and automatically |
diff --git a/arch/um/os-Linux/sys-x86_64/registers.c b/arch/um/os-Linux/sys-x86_64/registers.c index 6286c974bbeb..44438d15c3d6 100644 --- a/arch/um/os-Linux/sys-x86_64/registers.c +++ b/arch/um/os-Linux/sys-x86_64/registers.c | |||
@@ -69,6 +69,11 @@ void init_registers(int pid) | |||
69 | err); | 69 | err); |
70 | } | 70 | } |
71 | 71 | ||
72 | void get_safe_registers(unsigned long *regs) | ||
73 | { | ||
74 | memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long)); | ||
75 | } | ||
76 | |||
72 | /* | 77 | /* |
73 | * Overrides for Emacs so that we follow Linus's tabbing style. | 78 | * Overrides for Emacs so that we follow Linus's tabbing style. |
74 | * Emacs will notice this stuff at the end of the file and automatically | 79 | * Emacs will notice this stuff at the end of the file and automatically |
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules index 7459d09c233e..17f305b6bade 100644 --- a/arch/um/scripts/Makefile.rules +++ b/arch/um/scripts/Makefile.rules | |||
@@ -16,6 +16,11 @@ define unprofile | |||
16 | endef | 16 | endef |
17 | 17 | ||
18 | 18 | ||
19 | # The stubs and unmap.o can't try to call mcount or update basic block data | ||
20 | define unprofile | ||
21 | $(patsubst -pg,,$(patsubst -fprofile-arcs -ftest-coverage,,$(1))) | ||
22 | endef | ||
23 | |||
19 | quiet_cmd_make_link = SYMLINK $@ | 24 | quiet_cmd_make_link = SYMLINK $@ |
20 | cmd_make_link = ln -sf $(srctree)/arch/$(SUBARCH)/$($(notdir $@)-dir)/$(notdir $@) $@ | 25 | cmd_make_link = ln -sf $(srctree)/arch/$(SUBARCH)/$($(notdir $@)-dir)/$(notdir $@) $@ |
21 | 26 | ||
diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile index 095bcdb0b9cc..77c3c4d29f55 100644 --- a/arch/um/sys-i386/Makefile +++ b/arch/um/sys-i386/Makefile | |||
@@ -1,6 +1,6 @@ | |||
1 | obj-y = bitops.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \ | 1 | obj-y = bitops.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \ |
2 | ptrace_user.o semaphore.o signal.o sigcontext.o syscalls.o sysrq.o \ | 2 | ptrace_user.o semaphore.o signal.o sigcontext.o stub.o stub_segv.o \ |
3 | sys_call_table.o | 3 | syscalls.o sysrq.o sys_call_table.o |
4 | 4 | ||
5 | obj-$(CONFIG_HIGHMEM) += highmem.o | 5 | obj-$(CONFIG_HIGHMEM) += highmem.o |
6 | obj-$(CONFIG_MODULES) += module.o | 6 | obj-$(CONFIG_MODULES) += module.o |
@@ -16,6 +16,14 @@ semaphore.c-dir = kernel | |||
16 | highmem.c-dir = mm | 16 | highmem.c-dir = mm |
17 | module.c-dir = kernel | 17 | module.c-dir = kernel |
18 | 18 | ||
19 | STUB_CFLAGS = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) | ||
20 | |||
21 | # _cflags works with kernel files, not with userspace ones, but c_flags does, | ||
22 | # why ask why? | ||
23 | $(obj)/stub_segv.o : c_flags = $(STUB_CFLAGS) | ||
24 | |||
25 | $(obj)/stub.o : a_flags = $(STUB_CFLAGS) | ||
26 | |||
19 | subdir- := util | 27 | subdir- := util |
20 | 28 | ||
21 | include arch/um/scripts/Makefile.unmap | 29 | include arch/um/scripts/Makefile.unmap |
diff --git a/arch/um/sys-i386/stub.S b/arch/um/sys-i386/stub.S new file mode 100644 index 000000000000..2f2c70a8f043 --- /dev/null +++ b/arch/um/sys-i386/stub.S | |||
@@ -0,0 +1,8 @@ | |||
1 | #include "uml-config.h" | ||
2 | |||
3 | .globl syscall_stub | ||
4 | .section .__syscall_stub, "x" | ||
5 | syscall_stub: | ||
6 | int $0x80 | ||
7 | mov %eax, UML_CONFIG_STUB_DATA | ||
8 | int3 | ||
diff --git a/arch/um/sys-i386/stub_segv.c b/arch/um/sys-i386/stub_segv.c new file mode 100644 index 000000000000..b251442ad0b1 --- /dev/null +++ b/arch/um/sys-i386/stub_segv.c | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #include <signal.h> | ||
7 | #include <asm/sigcontext.h> | ||
8 | #include <asm/unistd.h> | ||
9 | #include "uml-config.h" | ||
10 | #include "sysdep/sigcontext.h" | ||
11 | #include "sysdep/faultinfo.h" | ||
12 | |||
13 | void __attribute__ ((__section__ (".__syscall_stub"))) | ||
14 | stub_segv_handler(int sig) | ||
15 | { | ||
16 | struct sigcontext *sc = (struct sigcontext *) (&sig + 1); | ||
17 | |||
18 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), | ||
19 | sc); | ||
20 | |||
21 | __asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid)); | ||
22 | __asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;" | ||
23 | "int $0x80": : "g" (__NR_kill), "g" (SIGUSR1)); | ||
24 | /* Pop the frame pointer and return address since we need to leave | ||
25 | * the stack in its original form when we do the sigreturn here, by | ||
26 | * hand. | ||
27 | */ | ||
28 | __asm__("popl %%eax ; popl %%eax ; popl %%eax ; movl %0, %%eax ; " | ||
29 | "int $0x80" : : "g" (__NR_sigreturn)); | ||
30 | } | ||
diff --git a/arch/um/sys-x86_64/Makefile b/arch/um/sys-x86_64/Makefile index 2bc6f6849010..7488206ce6f4 100644 --- a/arch/um/sys-x86_64/Makefile +++ b/arch/um/sys-x86_64/Makefile | |||
@@ -6,8 +6,8 @@ | |||
6 | 6 | ||
7 | #XXX: why into lib-y? | 7 | #XXX: why into lib-y? |
8 | lib-y = bitops.o bugs.o csum-partial.o delay.o fault.o mem.o memcpy.o \ | 8 | lib-y = bitops.o bugs.o csum-partial.o delay.o fault.o mem.o memcpy.o \ |
9 | ptrace.o ptrace_user.o semaphore.o sigcontext.o signal.o \ | 9 | ptrace.o ptrace_user.o semaphore.o sigcontext.o signal.o stub.o \ |
10 | syscalls.o sysrq.o thunk.o syscall_table.o | 10 | stub_segv.o syscalls.o syscall_table.o sysrq.o thunk.o |
11 | 11 | ||
12 | obj-y := ksyms.o | 12 | obj-y := ksyms.o |
13 | obj-$(CONFIG_MODULES) += module.o um_module.o | 13 | obj-$(CONFIG_MODULES) += module.o um_module.o |
@@ -28,6 +28,14 @@ semaphore.c-dir = kernel | |||
28 | thunk.S-dir = lib | 28 | thunk.S-dir = lib |
29 | module.c-dir = kernel | 29 | module.c-dir = kernel |
30 | 30 | ||
31 | STUB_CFLAGS = -Wp,-MD,$(depfile) $(call unprofile,$(USER_CFLAGS)) | ||
32 | |||
33 | # _cflags works with kernel files, not with userspace ones, but c_flags does, | ||
34 | # why ask why? | ||
35 | $(obj)/stub_segv.o : c_flags = $(STUB_CFLAGS) | ||
36 | |||
37 | $(obj)/stub.o : a_flags = $(STUB_CFLAGS) | ||
38 | |||
31 | subdir- := util | 39 | subdir- := util |
32 | 40 | ||
33 | include arch/um/scripts/Makefile.unmap | 41 | include arch/um/scripts/Makefile.unmap |
diff --git a/arch/um/sys-x86_64/stub.S b/arch/um/sys-x86_64/stub.S new file mode 100644 index 000000000000..31c14925716b --- /dev/null +++ b/arch/um/sys-x86_64/stub.S | |||
@@ -0,0 +1,15 @@ | |||
1 | #include "uml-config.h" | ||
2 | |||
3 | .globl syscall_stub | ||
4 | .section .__syscall_stub, "x" | ||
5 | syscall_stub: | ||
6 | syscall | ||
7 | /* We don't have 64-bit constants, so this constructs the address | ||
8 | * we need. | ||
9 | */ | ||
10 | movq $(UML_CONFIG_STUB_DATA >> 32), %rbx | ||
11 | salq $32, %rbx | ||
12 | movq $(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx | ||
13 | or %rcx, %rbx | ||
14 | movq %rax, (%rbx) | ||
15 | int3 | ||
diff --git a/arch/um/sys-x86_64/stub_segv.c b/arch/um/sys-x86_64/stub_segv.c new file mode 100644 index 000000000000..161d1fe9c034 --- /dev/null +++ b/arch/um/sys-x86_64/stub_segv.c | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #include <signal.h> | ||
7 | #include <linux/compiler.h> | ||
8 | #include <asm/unistd.h> | ||
9 | #include "uml-config.h" | ||
10 | #include "sysdep/sigcontext.h" | ||
11 | #include "sysdep/faultinfo.h" | ||
12 | |||
13 | void __attribute__ ((__section__ (".__syscall_stub"))) | ||
14 | stub_segv_handler(int sig) | ||
15 | { | ||
16 | struct ucontext *uc; | ||
17 | |||
18 | __asm__("movq %%rdx, %0" : "=g" (uc) :); | ||
19 | GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), | ||
20 | &uc->uc_mcontext); | ||
21 | |||
22 | __asm__("movq %0, %%rax ; syscall": : "g" (__NR_getpid)); | ||
23 | __asm__("movq %%rax, %%rdi ; movq %0, %%rax ; movq %1, %%rsi ;" | ||
24 | "syscall": : "g" (__NR_kill), "g" (SIGUSR1)); | ||
25 | /* Two popqs to restore the stack to the state just before entering | ||
26 | * the handler, one pops the return address, the other pops the frame | ||
27 | * pointer. | ||
28 | */ | ||
29 | __asm__("popq %%rax ; popq %%rax ; movq %0, %%rax ; syscall" : : "g" | ||
30 | (__NR_rt_sigreturn)); | ||
31 | } | ||
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index b02d921da4f7..5fd03225058a 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
@@ -1076,6 +1076,10 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
1076 | #ifdef CONFIG_X86_MCE | 1076 | #ifdef CONFIG_X86_MCE |
1077 | mcheck_init(c); | 1077 | mcheck_init(c); |
1078 | #endif | 1078 | #endif |
1079 | if (c == &boot_cpu_data) | ||
1080 | mtrr_bp_init(); | ||
1081 | else | ||
1082 | mtrr_ap_init(); | ||
1079 | #ifdef CONFIG_NUMA | 1083 | #ifdef CONFIG_NUMA |
1080 | if (c != &boot_cpu_data) | 1084 | if (c != &boot_cpu_data) |
1081 | numa_add_cpu(c - cpu_data); | 1085 | numa_add_cpu(c - cpu_data); |
diff --git a/arch/x86_64/kernel/suspend.c b/arch/x86_64/kernel/suspend.c index 6c0f402e3a88..0612640d91b1 100644 --- a/arch/x86_64/kernel/suspend.c +++ b/arch/x86_64/kernel/suspend.c | |||
@@ -119,6 +119,7 @@ void __restore_processor_state(struct saved_context *ctxt) | |||
119 | fix_processor_context(); | 119 | fix_processor_context(); |
120 | 120 | ||
121 | do_fpu_end(); | 121 | do_fpu_end(); |
122 | mtrr_ap_init(); | ||
122 | } | 123 | } |
123 | 124 | ||
124 | void restore_processor_state(void) | 125 | void restore_processor_state(void) |
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S index 73389f51c4e5..61c12758ca70 100644 --- a/arch/x86_64/kernel/vmlinux.lds.S +++ b/arch/x86_64/kernel/vmlinux.lds.S | |||
@@ -56,6 +56,10 @@ SECTIONS | |||
56 | .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { | 56 | .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) { |
57 | *(.data.cacheline_aligned) | 57 | *(.data.cacheline_aligned) |
58 | } | 58 | } |
59 | . = ALIGN(CONFIG_X86_L1_CACHE_BYTES); | ||
60 | .data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) { | ||
61 | *(.data.read_mostly) | ||
62 | } | ||
59 | 63 | ||
60 | #define VSYSCALL_ADDR (-10*1024*1024) | 64 | #define VSYSCALL_ADDR (-10*1024*1024) |
61 | #define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.cacheline_aligned) + SIZEOF(.data.cacheline_aligned) + 4095) & ~(4095)) | 65 | #define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.cacheline_aligned) + SIZEOF(.data.cacheline_aligned) + 4095) & ~(4095)) |
diff --git a/arch/xtensa/kernel/syscalls.c b/arch/xtensa/kernel/syscalls.c index abc8ed6c7026..3540d8b119f3 100644 --- a/arch/xtensa/kernel/syscalls.c +++ b/arch/xtensa/kernel/syscalls.c | |||
@@ -46,8 +46,6 @@ | |||
46 | 46 | ||
47 | extern void do_syscall_trace(void); | 47 | extern void do_syscall_trace(void); |
48 | typedef int (*syscall_t)(void *a0,...); | 48 | typedef int (*syscall_t)(void *a0,...); |
49 | extern int (*do_syscalls)(struct pt_regs *regs, syscall_t fun, | ||
50 | int narg); | ||
51 | extern syscall_t sys_call_table[]; | 49 | extern syscall_t sys_call_table[]; |
52 | extern unsigned char sys_narg_table[]; | 50 | extern unsigned char sys_narg_table[]; |
53 | 51 | ||
@@ -72,10 +70,8 @@ int sys_pipe(int __user *userfds) | |||
72 | /* | 70 | /* |
73 | * Common code for old and new mmaps. | 71 | * Common code for old and new mmaps. |
74 | */ | 72 | */ |
75 | 73 | long sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | |
76 | static inline long do_mmap2(unsigned long addr, unsigned long len, | 74 | unsigned long flags, unsigned long fd, unsigned long pgoff) |
77 | unsigned long prot, unsigned long flags, | ||
78 | unsigned long fd, unsigned long pgoff) | ||
79 | { | 75 | { |
80 | int error = -EBADF; | 76 | int error = -EBADF; |
81 | struct file * file = NULL; | 77 | struct file * file = NULL; |
@@ -97,29 +93,6 @@ out: | |||
97 | return error; | 93 | return error; |
98 | } | 94 | } |
99 | 95 | ||
100 | unsigned long old_mmap(unsigned long addr, size_t len, int prot, | ||
101 | int flags, int fd, off_t offset) | ||
102 | { | ||
103 | return do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); | ||
104 | } | ||
105 | |||
106 | long sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, | ||
107 | unsigned long flags, unsigned long fd, unsigned long pgoff) | ||
108 | { | ||
109 | return do_mmap2(addr, len, prot, flags, fd, pgoff); | ||
110 | } | ||
111 | |||
112 | int sys_fork(struct pt_regs *regs) | ||
113 | { | ||
114 | return do_fork(SIGCHLD, regs->areg[1], regs, 0, NULL, NULL); | ||
115 | } | ||
116 | |||
117 | int sys_vfork(struct pt_regs *regs) | ||
118 | { | ||
119 | return do_fork(CLONE_VFORK|CLONE_VM|SIGCHLD, regs->areg[1], | ||
120 | regs, 0, NULL, NULL); | ||
121 | } | ||
122 | |||
123 | int sys_clone(struct pt_regs *regs) | 96 | int sys_clone(struct pt_regs *regs) |
124 | { | 97 | { |
125 | unsigned long clone_flags; | 98 | unsigned long clone_flags; |
@@ -162,30 +135,6 @@ int sys_uname(struct old_utsname * name) | |||
162 | return -EFAULT; | 135 | return -EFAULT; |
163 | } | 136 | } |
164 | 137 | ||
165 | int sys_olduname(struct oldold_utsname * name) | ||
166 | { | ||
167 | int error; | ||
168 | |||
169 | if (!name) | ||
170 | return -EFAULT; | ||
171 | if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) | ||
172 | return -EFAULT; | ||
173 | |||
174 | error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN); | ||
175 | error -= __put_user(0,name->sysname+__OLD_UTS_LEN); | ||
176 | error -= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN); | ||
177 | error -= __put_user(0,name->nodename+__OLD_UTS_LEN); | ||
178 | error -= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN); | ||
179 | error -= __put_user(0,name->release+__OLD_UTS_LEN); | ||
180 | error -= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); | ||
181 | error -= __put_user(0,name->version+__OLD_UTS_LEN); | ||
182 | error -= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN); | ||
183 | error -= __put_user(0,name->machine+__OLD_UTS_LEN); | ||
184 | |||
185 | return error ? -EFAULT : 0; | ||
186 | } | ||
187 | |||
188 | |||
189 | /* | 138 | /* |
190 | * Build the string table for the builtin "poor man's strace". | 139 | * Build the string table for the builtin "poor man's strace". |
191 | */ | 140 | */ |
@@ -319,100 +268,3 @@ void system_call (struct pt_regs *regs) | |||
319 | regs->areg[2] = res; | 268 | regs->areg[2] = res; |
320 | do_syscall_trace(); | 269 | do_syscall_trace(); |
321 | } | 270 | } |
322 | |||
323 | /* | ||
324 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | ||
325 | * | ||
326 | * This is really horribly ugly. | ||
327 | */ | ||
328 | |||
329 | int sys_ipc (uint call, int first, int second, | ||
330 | int third, void __user *ptr, long fifth) | ||
331 | { | ||
332 | int version, ret; | ||
333 | |||
334 | version = call >> 16; /* hack for backward compatibility */ | ||
335 | call &= 0xffff; | ||
336 | ret = -ENOSYS; | ||
337 | |||
338 | switch (call) { | ||
339 | case SEMOP: | ||
340 | ret = sys_semtimedop (first, (struct sembuf __user *)ptr, | ||
341 | second, NULL); | ||
342 | break; | ||
343 | |||
344 | case SEMTIMEDOP: | ||
345 | ret = sys_semtimedop (first, (struct sembuf __user *)ptr, | ||
346 | second, (const struct timespec *) fifth); | ||
347 | break; | ||
348 | |||
349 | case SEMGET: | ||
350 | ret = sys_semget (first, second, third); | ||
351 | break; | ||
352 | |||
353 | case SEMCTL: { | ||
354 | union semun fourth; | ||
355 | |||
356 | if (ptr && !get_user(fourth.__pad, (void *__user *) ptr)) | ||
357 | ret = sys_semctl (first, second, third, fourth); | ||
358 | break; | ||
359 | } | ||
360 | |||
361 | case MSGSND: | ||
362 | ret = sys_msgsnd (first, (struct msgbuf __user*) ptr, | ||
363 | second, third); | ||
364 | break; | ||
365 | |||
366 | case MSGRCV: | ||
367 | switch (version) { | ||
368 | case 0: { | ||
369 | struct ipc_kludge tmp; | ||
370 | |||
371 | if (ptr && !copy_from_user(&tmp, | ||
372 | (struct ipc_kludge *) ptr, | ||
373 | sizeof (tmp))) | ||
374 | ret = sys_msgrcv (first, tmp.msgp, second, | ||
375 | tmp.msgtyp, third); | ||
376 | break; | ||
377 | } | ||
378 | |||
379 | default: | ||
380 | ret = sys_msgrcv (first, (struct msgbuf __user *) ptr, | ||
381 | second, 0, third); | ||
382 | break; | ||
383 | } | ||
384 | break; | ||
385 | |||
386 | case MSGGET: | ||
387 | ret = sys_msgget ((key_t) first, second); | ||
388 | break; | ||
389 | |||
390 | case MSGCTL: | ||
391 | ret = sys_msgctl (first, second, (struct msqid_ds __user*) ptr); | ||
392 | break; | ||
393 | |||
394 | case SHMAT: { | ||
395 | ulong raddr; | ||
396 | ret = do_shmat (first, (char __user *) ptr, second, &raddr); | ||
397 | |||
398 | if (!ret) | ||
399 | ret = put_user (raddr, (ulong __user *) third); | ||
400 | |||
401 | break; | ||
402 | } | ||
403 | |||
404 | case SHMDT: | ||
405 | ret = sys_shmdt ((char __user *)ptr); | ||
406 | break; | ||
407 | |||
408 | case SHMGET: | ||
409 | ret = sys_shmget (first, second, third); | ||
410 | break; | ||
411 | |||
412 | case SHMCTL: | ||
413 | ret = sys_shmctl (first, second, (struct shmid_ds __user*) ptr); | ||
414 | break; | ||
415 | } | ||
416 | return ret; | ||
417 | } | ||
418 | |||
diff --git a/arch/xtensa/kernel/syscalls.h b/arch/xtensa/kernel/syscalls.h index 5b3f75f50feb..07580696b602 100644 --- a/arch/xtensa/kernel/syscalls.h +++ b/arch/xtensa/kernel/syscalls.h | |||
@@ -25,20 +25,19 @@ | |||
25 | */ | 25 | */ |
26 | 26 | ||
27 | SYSCALL(0, 0) /* 00 */ | 27 | SYSCALL(0, 0) /* 00 */ |
28 | |||
29 | SYSCALL(sys_exit, 1) | 28 | SYSCALL(sys_exit, 1) |
30 | SYSCALL(sys_fork, 0) | 29 | SYSCALL(sys_ni_syscall, 0) |
31 | SYSCALL(sys_read, 3) | 30 | SYSCALL(sys_read, 3) |
32 | SYSCALL(sys_write, 3) | 31 | SYSCALL(sys_write, 3) |
33 | SYSCALL(sys_open, 3) /* 05 */ | 32 | SYSCALL(sys_open, 3) /* 05 */ |
34 | SYSCALL(sys_close, 1) | 33 | SYSCALL(sys_close, 1) |
35 | SYSCALL(sys_waitpid, 3) | 34 | SYSCALL(sys_ni_syscall, 3) |
36 | SYSCALL(sys_creat, 2) | 35 | SYSCALL(sys_creat, 2) |
37 | SYSCALL(sys_link, 2) | 36 | SYSCALL(sys_link, 2) |
38 | SYSCALL(sys_unlink, 1) /* 10 */ | 37 | SYSCALL(sys_unlink, 1) /* 10 */ |
39 | SYSCALL(sys_execve, 0) | 38 | SYSCALL(sys_execve, 0) |
40 | SYSCALL(sys_chdir, 1) | 39 | SYSCALL(sys_chdir, 1) |
41 | SYSCALL(sys_time, 1) | 40 | SYSCALL(sys_ni_syscall, 1) |
42 | SYSCALL(sys_mknod, 3) | 41 | SYSCALL(sys_mknod, 3) |
43 | SYSCALL(sys_chmod, 2) /* 15 */ | 42 | SYSCALL(sys_chmod, 2) /* 15 */ |
44 | SYSCALL(sys_lchown, 3) | 43 | SYSCALL(sys_lchown, 3) |
@@ -47,19 +46,19 @@ SYSCALL(sys_stat, 2) | |||
47 | SYSCALL(sys_lseek, 3) | 46 | SYSCALL(sys_lseek, 3) |
48 | SYSCALL(sys_getpid, 0) /* 20 */ | 47 | SYSCALL(sys_getpid, 0) /* 20 */ |
49 | SYSCALL(sys_mount, 5) | 48 | SYSCALL(sys_mount, 5) |
50 | SYSCALL(sys_oldumount, 1) | 49 | SYSCALL(sys_ni_syscall, 1) |
51 | SYSCALL(sys_setuid, 1) | 50 | SYSCALL(sys_setuid, 1) |
52 | SYSCALL(sys_getuid, 0) | 51 | SYSCALL(sys_getuid, 0) |
53 | SYSCALL(sys_stime, 1) /* 25 */ | 52 | SYSCALL(sys_ni_syscall, 1) /* 25 */ |
54 | SYSCALL(sys_ptrace, 4) | 53 | SYSCALL(sys_ptrace, 4) |
55 | SYSCALL(sys_alarm, 1) | 54 | SYSCALL(sys_ni_syscall, 1) |
56 | SYSCALL(sys_fstat, 2) | 55 | SYSCALL(sys_fstat, 2) |
57 | SYSCALL(sys_pause, 0) | 56 | SYSCALL(sys_ni_syscall, 0) |
58 | SYSCALL(sys_utime, 2) /* 30 */ | 57 | SYSCALL(sys_utime, 2) /* 30 */ |
59 | SYSCALL(sys_ni_syscall, 0) | 58 | SYSCALL(sys_ni_syscall, 0) |
60 | SYSCALL(sys_ni_syscall, 0) | 59 | SYSCALL(sys_ni_syscall, 0) |
61 | SYSCALL(sys_access, 2) | 60 | SYSCALL(sys_access, 2) |
62 | SYSCALL(sys_nice, 1) | 61 | SYSCALL(sys_ni_syscall, 1) |
63 | SYSCALL(sys_ni_syscall, 0) /* 35 */ | 62 | SYSCALL(sys_ni_syscall, 0) /* 35 */ |
64 | SYSCALL(sys_sync, 0) | 63 | SYSCALL(sys_sync, 0) |
65 | SYSCALL(sys_kill, 2) | 64 | SYSCALL(sys_kill, 2) |
@@ -73,7 +72,7 @@ SYSCALL(sys_ni_syscall, 0) | |||
73 | SYSCALL(sys_brk, 1) /* 45 */ | 72 | SYSCALL(sys_brk, 1) /* 45 */ |
74 | SYSCALL(sys_setgid, 1) | 73 | SYSCALL(sys_setgid, 1) |
75 | SYSCALL(sys_getgid, 0) | 74 | SYSCALL(sys_getgid, 0) |
76 | SYSCALL(sys_ni_syscall, 0) /* was signal(2) */ | 75 | SYSCALL(sys_ni_syscall, 0) |
77 | SYSCALL(sys_geteuid, 0) | 76 | SYSCALL(sys_geteuid, 0) |
78 | SYSCALL(sys_getegid, 0) /* 50 */ | 77 | SYSCALL(sys_getegid, 0) /* 50 */ |
79 | SYSCALL(sys_acct, 1) | 78 | SYSCALL(sys_acct, 1) |
@@ -84,21 +83,21 @@ SYSCALL(sys_fcntl, 3) /* 55 */ | |||
84 | SYSCALL(sys_ni_syscall, 2) | 83 | SYSCALL(sys_ni_syscall, 2) |
85 | SYSCALL(sys_setpgid, 2) | 84 | SYSCALL(sys_setpgid, 2) |
86 | SYSCALL(sys_ni_syscall, 0) | 85 | SYSCALL(sys_ni_syscall, 0) |
87 | SYSCALL(sys_olduname, 1) | 86 | SYSCALL(sys_ni_syscall, 0) |
88 | SYSCALL(sys_umask, 1) /* 60 */ | 87 | SYSCALL(sys_umask, 1) /* 60 */ |
89 | SYSCALL(sys_chroot, 1) | 88 | SYSCALL(sys_chroot, 1) |
90 | SYSCALL(sys_ustat, 2) | 89 | SYSCALL(sys_ustat, 2) |
91 | SYSCALL(sys_dup2, 2) | 90 | SYSCALL(sys_dup2, 2) |
92 | SYSCALL(sys_getppid, 0) | 91 | SYSCALL(sys_getppid, 0) |
93 | SYSCALL(sys_getpgrp, 0) /* 65 */ | 92 | SYSCALL(sys_ni_syscall, 0) /* 65 */ |
94 | SYSCALL(sys_setsid, 0) | 93 | SYSCALL(sys_setsid, 0) |
95 | SYSCALL(sys_sigaction, 3) | 94 | SYSCALL(sys_sigaction, 3) |
96 | SYSCALL(sys_sgetmask, 0) | 95 | SYSCALL(sys_ni_syscall, 0) |
97 | SYSCALL(sys_ssetmask, 1) | 96 | SYSCALL(sys_ni_syscall, 1) |
98 | SYSCALL(sys_setreuid, 2) /* 70 */ | 97 | SYSCALL(sys_setreuid, 2) /* 70 */ |
99 | SYSCALL(sys_setregid, 2) | 98 | SYSCALL(sys_setregid, 2) |
100 | SYSCALL(sys_sigsuspend, 0) | 99 | SYSCALL(sys_sigsuspend, 0) |
101 | SYSCALL(sys_sigpending, 1) | 100 | SYSCALL(sys_ni_syscall, 1) |
102 | SYSCALL(sys_sethostname, 2) | 101 | SYSCALL(sys_sethostname, 2) |
103 | SYSCALL(sys_setrlimit, 2) /* 75 */ | 102 | SYSCALL(sys_setrlimit, 2) /* 75 */ |
104 | SYSCALL(sys_getrlimit, 2) | 103 | SYSCALL(sys_getrlimit, 2) |
@@ -107,15 +106,15 @@ SYSCALL(sys_gettimeofday, 2) | |||
107 | SYSCALL(sys_settimeofday, 2) | 106 | SYSCALL(sys_settimeofday, 2) |
108 | SYSCALL(sys_getgroups, 2) /* 80 */ | 107 | SYSCALL(sys_getgroups, 2) /* 80 */ |
109 | SYSCALL(sys_setgroups, 2) | 108 | SYSCALL(sys_setgroups, 2) |
110 | SYSCALL(sys_ni_syscall, 0) /* old_select */ | 109 | SYSCALL(sys_ni_syscall, 0) |
111 | SYSCALL(sys_symlink, 2) | 110 | SYSCALL(sys_symlink, 2) |
112 | SYSCALL(sys_lstat, 2) | 111 | SYSCALL(sys_lstat, 2) |
113 | SYSCALL(sys_readlink, 3) /* 85 */ | 112 | SYSCALL(sys_readlink, 3) /* 85 */ |
114 | SYSCALL(sys_uselib, 1) | 113 | SYSCALL(sys_uselib, 1) |
115 | SYSCALL(sys_swapon, 2) | 114 | SYSCALL(sys_swapon, 2) |
116 | SYSCALL(sys_reboot, 3) | 115 | SYSCALL(sys_reboot, 3) |
117 | SYSCALL(old_readdir, 3) | 116 | SYSCALL(sys_ni_syscall, 3) |
118 | SYSCALL(old_mmap, 6) /* 90 */ | 117 | SYSCALL(sys_ni_syscall, 6) /* 90 */ |
119 | SYSCALL(sys_munmap, 2) | 118 | SYSCALL(sys_munmap, 2) |
120 | SYSCALL(sys_truncate, 2) | 119 | SYSCALL(sys_truncate, 2) |
121 | SYSCALL(sys_ftruncate, 2) | 120 | SYSCALL(sys_ftruncate, 2) |
@@ -127,7 +126,7 @@ SYSCALL(sys_ni_syscall, 0) | |||
127 | SYSCALL(sys_statfs, 2) | 126 | SYSCALL(sys_statfs, 2) |
128 | SYSCALL(sys_fstatfs, 2) /* 100 */ | 127 | SYSCALL(sys_fstatfs, 2) /* 100 */ |
129 | SYSCALL(sys_ni_syscall, 3) | 128 | SYSCALL(sys_ni_syscall, 3) |
130 | SYSCALL(sys_socketcall, 2) | 129 | SYSCALL(sys_ni_syscall, 2) |
131 | SYSCALL(sys_syslog, 3) | 130 | SYSCALL(sys_syslog, 3) |
132 | SYSCALL(sys_setitimer, 3) | 131 | SYSCALL(sys_setitimer, 3) |
133 | SYSCALL(sys_getitimer, 2) /* 105 */ | 132 | SYSCALL(sys_getitimer, 2) /* 105 */ |
@@ -137,32 +136,32 @@ SYSCALL(sys_newfstat, 2) | |||
137 | SYSCALL(sys_uname, 1) | 136 | SYSCALL(sys_uname, 1) |
138 | SYSCALL(sys_ni_syscall, 0) /* 110 */ | 137 | SYSCALL(sys_ni_syscall, 0) /* 110 */ |
139 | SYSCALL(sys_vhangup, 0) | 138 | SYSCALL(sys_vhangup, 0) |
140 | SYSCALL(sys_ni_syscall, 0) /* was sys_idle() */ | 139 | SYSCALL(sys_ni_syscall, 0) |
141 | SYSCALL(sys_ni_syscall, 0) | 140 | SYSCALL(sys_ni_syscall, 0) |
142 | SYSCALL(sys_wait4, 4) | 141 | SYSCALL(sys_wait4, 4) |
143 | SYSCALL(sys_swapoff, 1) /* 115 */ | 142 | SYSCALL(sys_swapoff, 1) /* 115 */ |
144 | SYSCALL(sys_sysinfo, 1) | 143 | SYSCALL(sys_sysinfo, 1) |
145 | SYSCALL(sys_ipc, 5) /* 6 really, but glibc uses only 5) */ | 144 | SYSCALL(sys_ni_syscall, 0) |
146 | SYSCALL(sys_fsync, 1) | 145 | SYSCALL(sys_fsync, 1) |
147 | SYSCALL(sys_sigreturn, 0) | 146 | SYSCALL(sys_sigreturn, 0) |
148 | SYSCALL(sys_clone, 0) /* 120 */ | 147 | SYSCALL(sys_clone, 0) /* 120 */ |
149 | SYSCALL(sys_setdomainname, 2) | 148 | SYSCALL(sys_setdomainname, 2) |
150 | SYSCALL(sys_newuname, 1) | 149 | SYSCALL(sys_newuname, 1) |
151 | SYSCALL(sys_ni_syscall, 0) /* sys_modify_ldt */ | 150 | SYSCALL(sys_ni_syscall, 0) |
152 | SYSCALL(sys_adjtimex, 1) | 151 | SYSCALL(sys_adjtimex, 1) |
153 | SYSCALL(sys_mprotect, 3) /* 125 */ | 152 | SYSCALL(sys_mprotect, 3) /* 125 */ |
154 | SYSCALL(sys_sigprocmask, 3) | 153 | SYSCALL(sys_ni_syscall, 3) |
155 | SYSCALL(sys_ni_syscall, 2) /* old sys_create_module */ | 154 | SYSCALL(sys_ni_syscall, 2) |
156 | SYSCALL(sys_init_module, 2) | 155 | SYSCALL(sys_init_module, 2) |
157 | SYSCALL(sys_delete_module, 1) | 156 | SYSCALL(sys_delete_module, 1) |
158 | SYSCALL(sys_ni_syscall, 1) /* old sys_get_kernel_sysm */ /* 130 */ | 157 | SYSCALL(sys_ni_syscall, 1) /* 130 */ |
159 | SYSCALL(sys_quotactl, 0) | 158 | SYSCALL(sys_quotactl, 0) |
160 | SYSCALL(sys_getpgid, 1) | 159 | SYSCALL(sys_getpgid, 1) |
161 | SYSCALL(sys_fchdir, 1) | 160 | SYSCALL(sys_fchdir, 1) |
162 | SYSCALL(sys_bdflush, 2) | 161 | SYSCALL(sys_bdflush, 2) |
163 | SYSCALL(sys_sysfs, 3) /* 135 */ | 162 | SYSCALL(sys_sysfs, 3) /* 135 */ |
164 | SYSCALL(sys_personality, 1) | 163 | SYSCALL(sys_personality, 1) |
165 | SYSCALL(sys_ni_syscall, 0) /* for afs_syscall */ | 164 | SYSCALL(sys_ni_syscall, 0) |
166 | SYSCALL(sys_setfsuid, 1) | 165 | SYSCALL(sys_setfsuid, 1) |
167 | SYSCALL(sys_setfsgid, 1) | 166 | SYSCALL(sys_setfsgid, 1) |
168 | SYSCALL(sys_llseek, 5) /* 140 */ | 167 | SYSCALL(sys_llseek, 5) /* 140 */ |
@@ -212,7 +211,7 @@ SYSCALL(sys_socket, 3) | |||
212 | SYSCALL(sys_socketpair, 4) | 211 | SYSCALL(sys_socketpair, 4) |
213 | SYSCALL(sys_setresuid, 3) /* 185 */ | 212 | SYSCALL(sys_setresuid, 3) /* 185 */ |
214 | SYSCALL(sys_getresuid, 3) | 213 | SYSCALL(sys_getresuid, 3) |
215 | SYSCALL(sys_ni_syscall, 5) /* old sys_query_module */ | 214 | SYSCALL(sys_ni_syscall, 5) |
216 | SYSCALL(sys_poll, 3) | 215 | SYSCALL(sys_poll, 3) |
217 | SYSCALL(sys_nfsservctl, 3) | 216 | SYSCALL(sys_nfsservctl, 3) |
218 | SYSCALL(sys_setresgid, 3) /* 190 */ | 217 | SYSCALL(sys_setresgid, 3) /* 190 */ |
@@ -235,7 +234,7 @@ SYSCALL(sys_sigaltstack, 0) | |||
235 | SYSCALL(sys_sendfile, 4) | 234 | SYSCALL(sys_sendfile, 4) |
236 | SYSCALL(sys_ni_syscall, 0) | 235 | SYSCALL(sys_ni_syscall, 0) |
237 | SYSCALL(sys_ni_syscall, 0) | 236 | SYSCALL(sys_ni_syscall, 0) |
238 | SYSCALL(sys_mmap2, 6) /* 210 */ | 237 | SYSCALL(sys_mmap, 6) /* 210 */ |
239 | SYSCALL(sys_truncate64, 2) | 238 | SYSCALL(sys_truncate64, 2) |
240 | SYSCALL(sys_ftruncate64, 2) | 239 | SYSCALL(sys_ftruncate64, 2) |
241 | SYSCALL(sys_stat64, 2) | 240 | SYSCALL(sys_stat64, 2) |
@@ -245,4 +244,4 @@ SYSCALL(sys_pivot_root, 2) | |||
245 | SYSCALL(sys_mincore, 3) | 244 | SYSCALL(sys_mincore, 3) |
246 | SYSCALL(sys_madvise, 3) | 245 | SYSCALL(sys_madvise, 3) |
247 | SYSCALL(sys_getdents64, 3) | 246 | SYSCALL(sys_getdents64, 3) |
248 | SYSCALL(sys_vfork, 0) /* 220 */ | 247 | SYSCALL(sys_ni_syscall, 0) /* 220 */ |